ZGlmZiAtLWdpdCBhL3RydW5rL0NSRURJVFMudHh0IGIvdHJ1bmsvQ1JFRElUUy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Zjg1ZDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvQ1JFRElUUy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyBSIEUgRCBJIFQgUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1UaGlzIGlzIHRoZSBmaWxlIHdoZXJlIG1ham9yIGRvbmF0aW9ucyB0byB0aGUgTGVueWEgcHJvamVjdCBhcmUgbGlzdGVkIGFuZCBpdAotc2hvdWxkIGJlIHVzZWQgdG8gZ2l2ZSBhcHByb3ByaWF0ZSB2aXNpYmlsaXR5IHRvIHRob3NlIGludmlkdWFscywgb3JnYW5pemF0aW9ucwotb3IgY29tcGFuaWVzIHRoYXQgZG9uYXRlZCByZXNvdXJjZXMgdG8gdGhlIGVmZm9ydC4gVGhpcyBmaWxlIHdhbnRzIHRvIGJlIG9uZSBvZgotdGhlIHdheXMgdGhlIExlbnlhIGNvbW11bml0eSBwYXlzIGJhY2suCi0KLQotIENvbW11bml0eSBDcmVkaXRzCi0gPT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gQWN0aXZlIENvbW1pdHRlcnM6Ci0gLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogRG91ZyBDaGVzdG51dAotKiBFZGl0aCBDaGV2cmllcgotKiBEYWxlIENocmlzdAotKiBDaHJpc3RpYW4gRWdsaQotKiBKYW5uIEZvcnJlcgotKiBBbnRvbmlvIEdhbGxhcmRvCi0qIEFuZHJlYXMgSGFydG1hbm4gICBBbmRyZWFzIHJ1bnMgdGhlIGNvY29vbmNlbnRlci5vcmcgc2l0ZS4KLSogQW5kcmVhcyBLdWNrYXJ0eiAgIFRlc3RlciwgQnVnemlsbGEgcmVwb3J0ZXIKLSogUm9sZiBLdWxlbWFubgotKiBHcmVnb3IgSi4gUm90aGZ1c3MgCi0qIFRob3JzdGVuIFNjaGVybGVyCi0qIFRvcnN0ZW4gU2NobGFiYWNoCi0qIEouIFdvbGZnYW5nIEthbHR6Ci0qIE1pY2hhZWwgV2VjaG5lciAgICAKLQotIEluYWN0aXZlIENvbW1pdHRlcnM6Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKiBKdWVyZ2VuIEJpZ2Fsa2UgICAgICB3cm90ZSBzb21lIGNyZWF0b3JzLgotKiBNZW1vIEJpcmdpCi0qIE1hcmMgTGl5YW5hZ2UgICAgICAgd3JvdGUgdGhlIGZpcnN0IExlbnlhIGJ1aWxkIHN5c3RlbSB3YXkgYmFjay4KLSogRmVsaXggTWFlZGVyCi0qIFJlbmUgTmllZGVybW93ZQotKiBHaWFjb21vIFBhdGkgICAgICAgIGhlbHBlZCB0byBwb3J0IHRoZSBwcmVkZWNlc3NvciBvZiBMZW55YSB0byBDb2Nvb24uCi0KLSBPdGhlciBDb250cmlidXRvcnM6Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIExvbiBCb29uZW4gICAgICAgICAgIExvbiBpcyB0aGUgb3JpZ2luYWwgY3JlYXRvciBvZiBYb3B1cyBhbmQgaGVscGVkIGEgCi0gICAgICAgICAgICAgICAgICAgICAgIGxvdCB0byBpbnRlZ3JhdGUgaXQgaW50byBMZW55YS4gUmVjZW50bHkgaGUgCi0gICAgICAgICAgICAgICAgICAgICAgIHJld3JvdGUgdGhlIEphdmFTY3JpcHQgb2YgdGhlIExlbnlhIG1lbnViYXIuCi0qIEpvc2UgQ2hhc28gICAgICAgICAgIFNwYW5pc2ggdHJhbnNsYXRpb24uCi0qIFBhdWwgRXJjb2xpbm8gKHNvbHByb3ZpZGVyKSAgUmVmYWN0b3JlZCBzZWFyY2gsIHZhcmlvdXMgc21hbGwgZml4ZXMKLSogU3RlcGhlbiBFbmdsYW5kICAgICAgRGVzaWduIG9mIHRoZSBMZW55YSBsb2dvLCBkZXNpZ24gb2YgdGhlIExlbnlhIFVJLgotKiBKb3JnZSBHdXRpZXJyZXogICAgICBTcGFuaXNoIHRyYW5zbGF0aW9uLgotKiBNYXJ0aW4gSGl0egotKiBNYXJncml0IEpvaG4KLSogT2xpdmllciBMYW5nZSAgICAgICAgRnJlbmNoIHRyYW5zbGF0aW9uLgotKiBKZWFuIFBpZXJyZSBMZUphY3EgICBCdWlsZCBzeXN0ZW0gaW1wcm92ZW1lbnRzLgotKiBNYXJ0aW4gTMO8dGhpICAgICAgICAgTWFpbCBjbGFzcy4KLSogQ2hyaXN0aWFuIFN0b2NrZXIgICAgQ2hyaXN0aWFuIGlzIHRoZSBvcmlnaW5hbCBjcmVhdG9yIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgQml0Zmx1eCBFZGl0b3IgYW5kIGhlbHBlZCBhIGxvdCB0byBpbnRlZ3JhdGUgCi0gICAgICAgICAgICAgICAgICAgICAgIGl0IGludG8gTGVueWEuCi0qIFVycyBTdMO2Y2tsaQotKiBHaWFtcGFvbG8gVHJhcGFzc28gICBJdGFsaWFuIHRyYW5zbGF0aW9uLCBlbnRlcnRhaW5lciBvbiAjbGVueWEKLSogTWFya3VzIFZhdGVybGF1cwotKiBLYXJzIFZlaWxpbmcKLSogTWFyYyB2b24gV2F0dGVud3lsCi0qIFRob21hcyBXZXJzY2hsZWluCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBBcGFjaGUgTGVueWEgQ29tbXVuaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2xlbnlhLmFwYWNoZS5vcmcKZGlmZiAtLWdpdCBhL3RydW5rL0lOU1RBTEwtQklOLnR4dCBiL3RydW5rL0lOU1RBTEwtQklOLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0OTA2OS4uMDAwMDAwMAotLS0gYS90cnVuay9JTlNUQUxMLUJJTi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoZXJlIGlzIG5vIGJpbmFyeSByZWxlYXNlIG9mIExlbnlhIDIuMCBhdCB0aGlzIHBvaW50LgotV2UgcmVjb21tZW5kIGNoZWNraW5nIG91dCB0aGUgU1ZOIHJlcG9zaXRvcnkgaW5zdGVhZCAoc2VlIElOU1RBTEwtU1JDLnR4dCkuCmRpZmYgLS1naXQgYS90cnVuay9JTlNUQUxMLVNSQy50eHQgYi90cnVuay9JTlNUQUxMLVNSQy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmM3NWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvSU5TVEFMTC1TUkMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLSMgRklYTUU6IHRoaXMgZmlsZSBkdXBsaWNhdGVzIHRoZSBjb250ZW50cyBvZgotIyBkb2N1L3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvZG9jcy8yXzBfeC9pbnN0YWxsYXRpb24vICh3aGljaCBpcwotIyBjdXJyZW50bHkgb3V0IG9mIGRhdGUpCi0jIEl0IHdvdWxkIG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgdG8gb25seSBtYWludGFpbiB0aGUgeGRvY3MgYW5kIGdlbmVyYXRlIHRoaXMKLSMgZmlsZSB3aXRoIGFuIHhzbHQuCi0KLUluc3RhbGxhdGlvbiBvZiB0aGUgU291cmNlIFZlcnNpb24KLQotICAgICogUHJlcmVxdWlzaXRlcwotICAgICogU3RhbmRhbG9uZSBJbnN0YWxsYXRpb24gKHVzaW5nIHRoZSBidWlsdC1pbiBKZXR0eSkKLSAgICAqIEluc3RhbGxhdGlvbiB3aXRoIEFwYWNoZSBUb21jYXQKLSAgICAqIFNlY3VyaXR5IGNvbnNpZGVyYXRpb25zCi0KLVByZXJlcXVpc2l0ZXMKLQotCi0gICAgVGhlIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgc2V0dXAgdGhhdCBpcyB0ZXN0ZWQgYW5kIHJlY29tbWVuZGVkLiAKLSAgICBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBjYW4gdXNlIG90aGVyIHNlcnZsZXQgY29udGFpbmVycyBhcyB3ZWxsLCBidXQgSmV0dHkgYW5kIFRvbWNhdCBhcmUgdGhlIHRlc3RlZCBvbmVzLgotCi0KLSAgICAqIEphdmEgMiBQbGF0Zm9ybSwgU3RhbmRhcmQgRWRpdGlvbgotICAgICAgUmVjb21tZW5kZWQgdmVyc2lvbjogSkRLIDEuNSAodXNlZCBieSBtb3N0IGRldmVsb3BlcnMpLiBKYXZhIDEuNC4yIG9yIGxhdGVyIHNob3VsZCBhbHNvCi0gICAgICB3b3JrLCBhbmQgcGVvcGxlIGFyZSB1c2luZyBKYXZhIDEuNiBzdWNjZXNzZnVsbHkgaW4gZGF5LXRvLWRheSBvcGVyYXRpb24uCi0gICAgICBHZXQgdGhlIEpESyBhdCBodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS9kb3dubG9hZHMvaW5kZXhfamRrNS5qc3AuCi0KLSAgICAgIFdBUk5JTkc6IFRoZXJlIGhhdmUgYmVlbiBudW1lcm91cyByZXBvcnRzIG9mIHNwdXJpb3VzIFZNIGNyYXNoZXMgd2l0aCBKYXZhIHZlcnNpb25zIGZyb20gCi0gICAgICAxLjUuMC0wNyB0byAxLjUuMC0xMSBib3RoIG9uIFdpbmRvd3MgYW5kIExpbnV4LiBNYWtlIHN1cmUgeW91IGFyZSB1c2luZyB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBKYXZhCi0gICAgICA1IHBhY2thZ2UgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSAoLTEzIGFzIG9mIHRoaXMgd3JpdGluZykuIAotICAgICAgSWYgeW91IGVuY291bnRlciBzdWNoIGNyYXNoZXMgd2l0aCBtb3JlIGN1cnJlbnQgcmV2aXNpb25zLCBwbGVhc2UgcmUtb3BlbiAKLSAgICAgIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDI0OTMgLgotCi0gICAgKiBBcGFjaGUgQ29jb29uCi0gICAgICBSZWNvbW1lbmRlZCB2ZXJzaW9uOiBCUkFOQ0hfMl8xX1ggKGh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2NvY29vbi9icmFuY2hlcy9CUkFOQ0hfMl8xX1gpCi0gICAgICBXaGVuIHlvdSBjaGVjayBvdXQgdGhlIGxhdGVzdCBMZW55YSBzb3VyY2UgZnJvbSBzdm4sIENvY29vbiB3aWxsIGJlIGluY2x1ZGVkIGFzIGFuIHN2biBleHRlcm5hbCAKLSAgICAgIGFuZCB5b3UgZG9uJ3QgbmVlZCB0byBkb3dubG9hZCBpdCBzZXBhcmF0ZWx5LgotICAgICAgTm90ZSB0aGF0IENvY29vbiBpcyBuZWVkZWQgd2hlbiBidWlsZGluZyB0aGUgc291cmNlIHZlcnNpb24gb2YgTGVueWEsIGJ1dCB0aGUgCi0gICAgICByZXN1bHRpbmcgTGVueWEgd2ViYXBwIGlzIGNvbXBsZXRlbHkgc2VsZiBjb250YWluZWQgYW5kIHRoZXJlZm9yZSBpdCBkb2VzIG5vdCBuZWVkIAotICAgICAgdGhlIENvY29vbiB3ZWJhcHAgdG8gYmUgaW5zdGFsbGVkLiBTZWUgdGhlIEZBUSBmb3IgZGV0YWlscyBvZiBjb25maWd1cmF0aW9uIGNoYW5nZXMgCi0gICAgICByZXF1aXJlZCB3aGVuIHJ1bm5pbmcgbXVsdGlwbGUgQ29jb29uIGJhc2VkIGFwcGxpY2F0aW9ucy4KLQotICAgICogQSBTVk4gY2xpZW50Ci0gICAgICBTVk4gKG9yIHN1YnZlcnNpb24pIGlzIGEgc29mdHdhcmUgcmV2aXNpb24gY29udHJvbCBzeXN0ZW0gdGhhdCBpcyB1c2VkIGJ5IHRoZSBMZW55YSBjb21tdW5pdHkgdG8gCi0gICAgICBtYW5hZ2UgdGhlIGRldmVsb3BtZW50IHRyZWUuIFlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCBhIGNsaWVudCBpbiBvcmRlciB0byBjaGVjayBvdXQgeW91ciBsb2NhbAotICAgICAgY29weSBvZiBMZW55YS4KLSAgICAgIEFsbCBMaW51eCBkaXN0cmlidXRpb25zIGNvbWUgd2l0aCBzdm4gKG9yIHN1YnZlcnNpb24pIHBhY2thZ2VzLiBVbmRlciBXaW5kb3dzLCB5b3UgY2FuIGVpdGhlciB1c2UgCi0gICAgICBUb3J0b2lzZVNWTiAoc2VlIGh0dHA6Ly90b3J0b2lzZXN2bi50aWdyaXMub3JnKSBvciB0aGUgc3ZuIHBhY2thZ2UgaW5jbHVkZWQgaW4gQ3lnd2luIChodHRwOi8vY3lnd2luLmNvbSkuCi0KLSAgICAqIChvcHRpb25hbCkgQXBhY2hlIFRvbWNhdCBmb3IgSkRLIDEuNSwgdmVyc2lvbjogNS41LjIwIG9yIGxhdGVyIChlYXJsaWVyIHZlcnNpb25zIG1heSB3b3JrIGFzIHdlbGwsIAotICAgICAgYnV0IHRoZXkgYXJlIG5vdCB0ZXN0ZWQpLgotICAgICAgR2V0IHRoZSBzb3VyY2UgYXQgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL2JpbmluZGV4LmNnaQotICAgICAgTm90ZSB0aGF0IExlbnlhIHNoaXBzIHdpdGggSmV0dHkgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBuZWVkIGEgc2VydmxldCBjb250YWluZXIgdG8gYmUgaW5zdGFsbGVkLgotCi0KLQotU3RhbmRhbG9uZSBJbnN0YWxsYXRpb24gKHVzaW5nIHRoZSBidWlsdC1pbiBKZXR0eSkKLQotCi0gICBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBtb2RlIG9mIGluc3RhbGxhdGlvbiB0aGF0IGlzIHVzZWQgYnkgbW9zdCBkZXZlbG9wZXJzLgotCi0gICAxLiBHZXQgdGhlIEphdmEgU0RLIChzZWUgUHJlcmVxdWlzaXRlcyk6IGUuZy4gSjJTREtfMS41LjAtMTEKLSAgICAgIGFuZCBzZXQgSkFWQV9IT01FCi0gICAgICAoV2luZG93czogc3RhcnQgLT4gQ29udHJvbCBQYW5lbCAtPiBTeXN0ZW0gLT4gQWR2YW5jZWQgLT4gRW52aXJvbm1lbnQgVmFyaWFibGVzIC0+IFVzZXIgdmFyaWFibGVzCi0gICAgICAuLi4pCi0KLSAgIDIuIENoZWNrIG91dCBBcGFjaGUgTGVueWEgZnJvbSBTVk46Ci0gICAgICBDaGFuZ2UgaW50byB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHlvdXIgTGVueWEgc291cmNlcyB0byBiZSwgYW5kIGRvCi0gIAotICAgICAgICBzdm4gY2hlY2tvdXQgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9sZW55YS90cnVuayBsZW55YS0yLjAueAotCi0gICAzLiBDb25maWd1cmUgTGVueWE6Ci0KLSAgICAgIEluIHRoZSBuZXdseSBjcmVhdGVkIGxlbnlhLTIuMC54IGRpcmVjdG9yeSwgY29weSBidWlsZC5wcm9wZXJ0aWVzIHRvIGxvY2FsLmJ1aWxkLnByb3BlcnRpZXMKLSAgICAgIGFuZCBlZGl0IGl0IHRvIHRhc3RlIG9yIHVzZSB0aGUgY29uZmlndXJlIHNjcmlwdDoKLQotICAgICAgICAgICogTGludXg6IGNvbmZpZ3VyZS5zaCAod29ya3MgYWxzbyBvbiBXaW5kb3dzIHdpdGggQ3lnd2luKQotICAgICAgICAgICogV2luZG93czogY29uZmlndXJlLmJhdAotCi0KLSAgIDQuIEJ1aWxkIExlbnlhOgotCi0gICAgICBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSkFWQV9IT01FIGRlZmluZWQgdG8gcG9pbnQgCi0gICAgICB0byB0aGUgbG9jYXRpb24gb2YgdGhlIEphdmEgU0RLIHlvdSBpbnN0YWxsZWQgKHNlZSBQcmVyZXF1aXNpdGVzKS4KLQotICAgICAgTVMgV2luZG93czogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9kZWZhdWx0LmFzcHg/c2NpZD1rYjtlbi11czszMTA1MTkmc2Q9dGVjaAotICAgICAgTGludXgvVW5peDogZXhwb3J0IEpBVkFfSE9NRT0vdXNyL2xvY2FsL2pkay0xLjUuMCAob3Igd2hlcmV2ZXIgeW91ciBKREsgaXMpCi0KLSAgICAgIFN0YXJ0IHRoZSBidWlsZCBwcm9jZXNzOgotCi0gICAgICAgICAgKiBMaW51eDogLi9idWlsZC5zaCAod29ya3MgYWxzbyBvbiBXaW5kb3dzIHdpdGggQ3lnd2luKQotICAgICAgICAgICogV2luZG93czogIGJ1aWxkLmJhdAotICAgICAgICAgIAotICAgNS4gU3RhcnQgTGVueWE6Ci0KLSAgICAgICAgICAqIExpbnV4OiAuL2xlbnlhLnNoCi0gICAgICAgICAgKiBXaW5kb3dzOiBsZW55YS5iYXQKLQotICAgNi4gVGVzdCB0aGUgaW5zdGFsbGF0aW9uIGJ5IHBvaW50aW5nIHlvdXIgYnJvd3NlciB0bwotICAgICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC8KLQotCi0KLUluc3RhbGxhdGlvbiB3aXRoIEFwYWNoZSBUb21jYXQKLQotCi0gICBXYXRjaCBvdXQ6IFRvbWNhdCBpbnRlZ3JhdGlvbiBoYXMgbm90IGJlZW4gdGVzdGVkIG11Y2ggeWV0LiBZb3UgYXJlIHdlbGNvbWUKLSAgIHRvIGRpcmVjdCBxdWVzdGlvbnMgYXQgb3IgcG9pbnQgb3V0IHByb2JsZW1zIHRvIHRoZSBsZW55YSBkZXZlbG9wZXIgbWFpbGluZwotICAgbGlzdC4KLQotICAgSW5zdGFsbGluZyBMZW55YSB3aXRoIFRvbWNhdCBpcyBzaW1pbGFyIHRvIHN0YW5kLWFsb25lIG1vZGUuIEZvbGxvdyBTdGVwcyAxLTMKLSAgIGFib3ZlLCB0aGVuIGRvIHRoZSBzdGVwcyBiZWxvdy4KLQotICAgMS4gR2V0IEFwYWNoZSBUb21jYXQgKHNlZSBQcmVyZXF1aXNpdGVzKQotCi0gICAyLiBJbnN0YWxsIEFwYWNoZSBUb21jYXQgYXMgcGVyIHRoZSBUb21jYXQgZG9jcy4KLQotICAgICAgSW1wb3J0YW50OiBNYWtlIHN1cmUgeW91IGRvIG5vdCBpbnN0YWxsIGF0IGEgbG9jYXRpb24gd2l0aCBzcGFjZXMgaW4gdGhlIHBhdGgsIHN1Y2ggYXMKLSAgICAgIEM6XFRvbWNhdCBXZWJhcHBzXExlbnlhIC0gc29tZSBjb21wb25lbnRzIGluIExlbnlhL0NvY29vbiBkb24ndCBwbGF5IHdlbGwgd2l0aCBzdWNoIHBhdGhzLgotCi0gICAzLiBDb25maWd1cmUgTGVueWEgZm9yIFRvbWNhdAotCi0gICAgICBFZGl0IGxvY2FsLmJ1aWxkLnByb3BlcnRpZXMuIEZvciB0aGUgZGVzY3JpYmVkIGNvbmZpZ3VyYXRpb24gdGhlIGZvbGxvd2luZyBzZXR0aW5ncyAKLSAgICAgIHdpbGwgd29yayAoTVMgV2luZG93czogRG9uJ3QgdXNlIGJhY2tzbGFzaGVzICJcIiBmb3IgZGlyZWN0b3J5IHNlcGFyYXRpb24uKSBJdCBpcyAKLSAgICAgIGltcG9ydGFudCB0aGF0IHRvbWNhdC5ob21lLmRpciBpcyBhbiBhYnNvbHV0ZSBwYXRoLiBSZXBsYWNlICRUT01DQVRfSE9NRSBieSB5b3VyIFRvbWNhdCAKLSAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIElmIHlvdXIgQ29jb29uIHNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IGF0IC4uL2NvY29vbiAKLSAgICAgIHJlbGF0aXZlIHRvIExlbnlhLCB0aGVuIGNoYW5nZSB0aGUgY29jb29uLndlYmFwcC5kaXIgYW5kIGNvY29vbi5zcmMuZGlyIHByb3BlcnRpZXMuCi0gICAgICAgICAgKiBjb2Nvb24uc3JjLmRpcj0kQ09DT09OX0hPTUUKLSAgICAgICAgICAqIHRvbWNhdC5ob21lLmRpcj0kVE9NQ0FUX0hPTUUKLSAgCi0gICA0LiBCdWlsZCBMZW55YSAoc2VlICJTdGFuZGFsb25lIEluc3RhbGxhdGlvbiIgYWJvdmUpCi0KLSAgIDUuIENoZWNrIHZlcnNpb25zIG9mIGVuZG9yc2VkIGxpYnJhcmllcwotCi0gICAgICBMZW55YSBhbmQgVG9tY2F0IHdpbGwgaW50ZXItb3BlcmF0ZSBjb3JyZWN0bHkgb25seSBpZiB0aGUgcHJvcGVyIHZlcnNpb25zIG9mIHRoZSBYYWxhbiAKLSAgICAgIGFuZCBYZXJjZXMgbGlicmFyaWVzIGFyZSB1c2VkIGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IHRoZSBkZXBsb3ltZW50LiBVbmZvcnR1bmF0ZWx5IAotICAgICAgdGhpcyBjYW4gYmUgZGlmZmljdWx0IHRvIGdldCB0byB3b3JrIGNvcnJlY3RseSBzaW5jZSBib3RoIG9mIHRoZXNlIGxpYnJhcmllcyBhcmUgc2hpcHBlZCAKLSAgICAgIHdpdGggSmF2YSAyIFNESywgVG9tY2F0LCBDb2Nvb24gYW5kIExlbnlhLgotCi0gICAgICBUaGUgZm9sbG93aW5nIGxpYnJhcmllcyBtdXN0IGJlIHBsYWNlZCBpbiB0aGUgZW5kb3JzZWQgbGlicmFyeSBkaXJlY3RvcnkgZm9yIHlvdXIgZGVwbG95bWVudC4KLSAgICAgICAgICAqIHhhbGFuLTIuNy4wLmphcgotICAgICAgICAgICogeGFsYW4tMi43LjAtc2VyaWFsaXplci5qYXIKLSAgICAgICAgICAqIHhlcmNlcy0yLjkuMC14ZXJjZXNJbXBsLmphcgotICAgICAgICAgICogeGVyY2VzLTIuOS4wLXhtbC1hcGlzLmphcgotCi0gICAgICBUaGV5IGFyZSBwbGFjZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MgaW4gdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdG9tY2F0LmVuZG9yc2VkLmRpciBpbiAKLSAgICAgIGJ1aWxkLnByb3BlcnRpZXMuIFlvdSBzaG91bGQgdmFsaWRhdGUgdGhhdCB0aGVzZSBmaWxlcyBhcmUgaW5kZWVkIGluIHRoZSBwcm9wZXIgbG9jYXRpb24gCi0gICAgICBmb3IgeW91ciBkZXBsb3ltZW50LiBZb3UgbXVzdCB0aGVuIHZhbGlkYXRlIHRoYXQgbm8gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZXNlIGxpYnJhcmllcyAKLSAgICAgIGV4aXN0IGluIGFueSBvZiB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzOgotICAgICAgICAgICogVGhlIEphdmEgMiBTREsgZW5kb3JzZWQgc3RhbmRhcmRzIGRpcmVjdG9yaWVzLiBUaGlzIGlzIHVzdWFsbHkgJHtKQVZBX0hPTUV9L2xpYi9lbmRvcnNlZC8uCi0gICAgICAgICAgKiBBbnkgb3RoZXIgbG9jYXRpb24gaW4geW91ciBUb21jYXQgZGVwbG95bWVudC4gU3BlY2lmaWNhbGx5LCBjaGVjayBzaGFyZWQvbGliLywgY29tbW9uL2xpYi8gYW5kIHNlcnZlci9saWIvLgotICAgICAgICAgICogQW55IG90aGVyIGxvY2F0aW9uIGluIHlvdXIgTGVueWEgZGVwbG95bWVudC4gU3BlY2lmaWNhbGx5LCBjaGVjayB3ZWJhcHBzL2xlbnlhL1dFQi1JTkYvbGliLy4KLQotICAgICAgQSBjb21tb24gc3ltcHRvbSBvZiBpbmNvcnJlY3QgbGlicmFyeSB2ZXJzaW9uIGFyZSBibGFuayBwYWdlcyBhZnRlciBzdGFydGluZyBMZW55YS4gCi0gICAgICBUcnkgY2FyZWZ1bGx5IGNoZWNraW5nIHRoZSBsb2NhdGlvbiBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIGVhY2ggb2YgdGhlIGxpYnJhcmllcy4KLQotICAgICAgUmVmZXJlbmNlczoKLSAgICAgICAgICAqIFRvbWNhdCBDbGFzcyBMb2FkZXIgSE9XVE8gCi0gICAgICAgICAgICAgIChodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC90b21jYXQtNS4wLWRvYy9jbGFzcy1sb2FkZXItaG93dG8uaHRtbCkKLSAgICAgICAgICAqIEphdmEgMiBFbmRvcnNlZCBTdGFuZGFyZHMgT3ZlcnJpZGUgTWVjaGFuaXNtIAotICAgICAgICAgICAgICAoaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvZ3VpZGUvc3RhbmRhcmRzL2luZGV4Lmh0bWwpCi0gCi0gICA2LiBSZXN0YXJ0IFRvbWNhdAotCi0gICA3LiBUZXN0IHRoZSBpbnN0YWxsYXRpb24gYnkgcG9pbnRpbmcgeW91ciBicm93c2VyIHRvCi0gICAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xlbnlhLwotCi0KLVNlY3VyaXR5IENvbnNpZGVyYXRpb25zCi0KLSAgIEl0IGlzIGFkdmlzYWJsZSB0byBydW4gTGVueWEncyBzZXJ2bGV0IGNvbnRhaW5lciB3aXRoIGxpbWl0ZWQgcHJpdmlsZWdlcywKLSAgIHRvIHJlZHVjZSB0aGUgaW1wYWN0IG9mIGEgcG9zc2libGUgZXhwbG9pdC4KLSAgIFlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhIHVzZXIgImxlbnlhIiB3aXRoIGRlZmF1bHQgZ3JvdXAgImxlbnlhIiBmb3IKLSAgIHRoaXMsIGNoYW5nZSB0aGUgcmlnaHRzIG9mIHRoZSBidWlsZC8gdHJlZSBhY2NvcmRpbmdseSwgYW5kIHN0YXJ0IHRoZQotICAgc2VydmVyIGFzIHRoYXQgdXNlci4KLSAgIAotICAgQWRkaXRpb25hbGx5LCB5b3UgbWlnaHQgd2FudCB0byBjb25zaWRlciB0aWdodGVuaW5nIHRoZSB3cml0ZSBwcml2aWxlZ2VzIAotICAgb2YgdGhlIHNlcnZsZXQgY29udGFpbmVyLiBBdCBydW4tdGltZSwgaXQgb25seSBuZWVkcyB3cml0ZSBhY2Nlc3MgdG8KLSAgIFdFQi1JTkYvKiBhbmQgdGhlIHB1YmxpY2F0aW9uJ3MgY29udGVudCBhbmQgYWNjZXNzLWNvbnRyb2wgc3RvcmUuCi0gICBXaGlsZSBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBkaXNhbGxvd2luZyB3cml0ZSBhY2Nlc3MgdG8gb3RoZXIgcGFydHMKLSAgIG1ha2VzIGl0IGhhcmRlciBmb3IgYW4gYXR0YWNrZXIgdG8gbWFuaXB1bGF0ZSB0aGUgc3lzdGVtLgotICAgRklYTUU6IHRoaXMgbmVlZHMgbW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLgotCi0KLVBlcmZvcm1pbmcgYXV0b21hdGVkIHRlc3RzCi0KLSAgSWYgeW91IGFyZSBoYWNraW5nIExlbnlhIChvciB5b3UgaGF2ZSBoZWFsdGh5IHBhcmFub2lhIGxldmVscyksIHlvdSBtaWdodCB3YW50IHRvIHJ1biBhdXRvbWF0ZWQgdW5pdAotICBhbmQgd2ViIHRlc3RzIG9uIHlvdXIgTGVueWEgY2hlY2tvdXQsIGVzcGVjaWFsbHkgYWZ0ZXIgbW9kaWZpY2F0aW9ucy4gCi0gIEluIHRoZSBsZW55YS0yLjAueCBkaXJlY3RvcnksIGRvCi0gIC4vYnVpbGQuc2ggdGVzdCAgICAodG8gcnVuIHRoZSBqdW5pdCB0ZXN0cywgcmVxdWlyZXMgYSBzdWNjZXNzZnVsIGJ1aWxkKSwgYW5kCi0gIC4vYnVpbGQuc2ggbW9kdWxlcy50ZXN0LmNhbm9vICAodG8gcnVuIHRoZSBjYW5vbyB3ZWIgdGVzdHMsIHJlcXVpcmVzIGEgcnVubmluZyBzZXJ2bGV0IGVuZ2luZSkuCi0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL0tFWVMgYi90cnVuay9LRVlTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ4OTM2Li4wMDAwMDAwCi0tLSBhL3RydW5rL0tFWVMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0oaW5zdHJ1Y3Rpb25zIGNvcGllZCBmcm9tIGNvY29vbnMncyBLRVlTIGZpbGUpCi0KLVRoaXMgZmlsZSBjb250YWlucyB0aGUgUEdQIGtleXMgb2YgdmFyaW91cyBkZXZlbG9wZXJzLgotUGxlYXNlIGRvbid0IHVzZSB0aGVtIGZvciBlbWFpbCB1bmxlc3MgeW91IGhhdmUgdG8uIFRoZWlyIG1haW4KLXB1cnBvc2UgaXMgY29kZSBzaWduaW5nLgotCi1Vc2VyczogcGdwIDwgS0VZUwotRGV2ZWxvcGVyczoKLSAgICAgICAgcGdwIC1reGEgPHlvdXIgbmFtZT4gYW5kIGFwcGVuZCBpdCB0byB0aGlzIGZpbGUuCi0gICAgICAgIChwZ3BrIC1sbCA8eW91ciBuYW1lPiAmJiBwZ3BrIC14YSA8eW91ciBuYW1lPikgPj4gdGhpcyBmaWxlLgotICAgICAgICAoZ3BnIC0tbGlzdC1zaWdzIDx5b3VyIG5hbWU+Ci0gICAgICAgICAgICAgJiYgZ3BnIC0tYXJtb3IgLS1leHBvcnQgPHlvdXIgbmFtZT4pID4+IHRoaXMgZmlsZS4KLSAgICAgICAgICAgICAKLXB1YiAgMTAyNEQvMDg1ODZGODEgMjAwNC0xMi0yOSBSb2xmIEt1bGVtYW5uIChDb21taXRlciBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24pIDxyb2t1QGFwYWNoZS5vcmc+Ci1zaWcgMyAgICAgICAwODU4NkY4MSAyMDA0LTEyLTI5ICAgUm9sZiBLdWxlbWFubiAoQ29tbWl0ZXIgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKSA8cm9rdUBhcGFjaGUub3JnPgotc3ViICAyMDQ4Zy9BNTdBRDU5MiAyMDA0LTEyLTI5Ci1zaWcgICAgICAgICAwODU4NkY4MSAyMDA0LTEyLTI5ICAgUm9sZiBLdWxlbWFubiAoQ29tbWl0ZXIgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKSA8cm9rdUBhcGFjaGUub3JnPgotIAotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiBHbnVQRyB2MS4yLjQgKEdOVS9MaW51eCkKLSAKLW1RR2lCRUhUTWM4UkJBQ3JzUW1EU0tSYWh5R2huYjI3NDR0bzhlamdQcE5TbloyWnhyNEQ3WUZHM2g1WWZiWEoKLUdPR2J0cWVsU0NIVVVoVXhtT1VPVW1haXVoU04wbDNhMUQremdpZXN1WnhReUNWVVZ1S1BxS2tteG0zK3E1SXIKLWRnNi9CWFRWUUorb0xKTmE0L2svUDNWNHVuY3E2N05YdndlSlN6c20xNVo5YjkySzB1Rm5lK204RndDZ3A4NWcKLUxocStLU0h4V1RiZVpma1VPaGhUbTdVRC8zYmNYZ09zMk5XbXF2b09qTlZ2R3UxRnA4bVV2cER0NWs0bVhMcWMKLVN4QVdIbTg0TWI0SzRqcnV0b2MreldVdlhJK1p0b0VsWUdCbTNWUEJtcVN4TWd0VXJubFBQcFFDcVo2dzJkVTkKLVRnSlJ6Smd6d3FKRndUKytpdlBNSW9rd0w1T1JuOW9LTVpVak5qandDREdGdWhVR05UWjJod2lGODU2OENQczIKLVZESVFBLzl2UWxINXF5SnJTOWlIdnBXS1NrRTJJZExmMUt6cGlMeC93aU1kUlUzVVBSTjQrWmxPYmZZd09PZHAKLUhHMC8xbmpGcXVlUVQ0TjM4RHNJemJrWHJQZDlRUFlGaVZnYkg3ZGZYS01sM0RkYy81V2liZnZBV0FCQzZwMnUKLUptNi9OQU5URzkvM2FIemcyQnNZaStMWWdiS0pQOStEQkl1ck01MTFQbklobFc0NnpMUk1VbTlzWmlCTGRXeGwKLWJXRnViaUFvUTI5dGJXbDBaWElnYjJZZ2RHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXUKLUtTQThjbTlyZFVCaGNHRmphR1V1YjNKblBvaGVCQk1SQWdBZUJRSkIwekhQQWhzREJnc0pDQWNEQWdNVkFnTUQKLUZnSUJBaDRCQWhlQUFBb0pFQUZwYmF3SVdHK0JHN2dBb0o1ZlJ3TUozdUg0NDU4UGx1dDVsbUt1M2JnZ0FLQ2YKLVRBbjVMM3hrak91SWVManNITTNlSThuWUpia0NEUVJCMHpIZ0VBZ0Fyc3k5QURyRG11ZVZBUHlZQkNEd1IybkwKLUlla2FSUm5ncm9jalBQaXk0ZGJFQXl3a3c5QTBpeHBXS09zVGVXSHU4LytmS3U3K2diSW53SDNZUEx2cEoyK04KLTNzSGROcEdsR1lFVjJ2NTBFb0puamVSelJpOUhaelBsTXR5ZGUveDZCdWVkei9VdHVBM1AzSVJ4U0g2NE96SkUKLURRbU1FRVRrZ2JJQysvL09pTkJseFpOelhEaHd4b0NYalpNVEFpWG9HSVRQZzZQdkRmemdGSVRXbnU2a2JMeTAKLTM3YWFXQWxPUzFPTENQOWVtaERDNkk2ZkUrSmFISnlmWGZOWWxOSXkzSU1FSFZKUHNuOXVNUGNJMmpzZmlhRjIKLUhjSEpYV0Z4d1dYTEhBd1JJeFh5S1BEdUtwWTZlV1UyU0lYTU5SUHNZQmlFZGdqbjhoQld3d0ZBZlQ4UDB3QUQKLUJnZjlIU3dPamw2TUlFcE0vL0pQUlY0V01XamU3b3JtZSt1TlZJdjVQVW10RWV2MlZFOG5TSkU1empnY1RZanMKLXNjU3FSRkt4SG9qQ0RFTWJON0d0SVhGK0FVZ29COEJOWVQweDBmR2YydW9oV1N0ZUtqR0xWMjNBWUcxVCtFTnIKLXYvVnFFRVAwS25SU3dpMjE0cktPc2w5bXN2VXRLc1gzVnFuRmlXZlNzZnY3QXpudHYxZ25ISUFJRXRsTDJBdisKLTVhSWxiRFE4NU1HUUlUT01ETzhqR0ZiK0lULzh1ZjZKbnl5eHpRenhuS2xwcDE5a2V3NmpuckNDVG9ycmFsOHIKLWU3UlY0YitLQWtIVTE5WXNKV3liKzlib0N5ekEvc2dacGpFQTlCVEF4UU9HL1RnblIzbnFlTHlDNm1wQ1ZjeloKLUpRN25CZGtwMmNQRXl1VEpvRTdnMUpJaEtvaEpCQmdSQWdBSkJRSkIwekhnQWhzTUFBb0pFQUZwYmF3SVdHK0IKLWNNSUFtd1lwS3kvbS9MVlk3T1ZaRmc3Wm94VVUwTTE0QUo5S3JGaG9MVWJla2RLV1ZZNllOTUthck8wNTV3PT0KLT1uZGpXCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0gICAgICAgICAgICAgcHViICAxMDI0RC82QTZEQzlGNyAyMDA1LTA1LTAxIEdyZWdvciBKLiBSb3RoZnVzcyA8Z3JlZ29yQGFwYWNoZS5vcmc+DQotc2lnIDMgICAgICAgNkE2REM5RjcgMjAwNS0wNS0wMSAgIEdyZWdvciBKLiBSb3RoZnVzcyA8Z3JlZ29yQGFwYWNoZS5vcmc+DQotc3ViICAxMDI0Zy9FMjQ1QTJCMCAyMDA1LTA1LTAxDQotc2lnICAgICAgICAgNkE2REM5RjcgMjAwNS0wNS0wMSAgIEdyZWdvciBKLiBSb3RoZnVzcyA8Z3JlZ29yQGFwYWNoZS5vcmc+DQotDQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQotVmVyc2lvbjogR251UEcgdjEuMi4zLW5yMSAoV2luZG93cyBYUCkNCi0NCi1tUUdpQkVKMVNvUVJCQUM5OVRhaWxvTUxWMGVlT2trdCtqMnFjU2lNSUZrSGRqdmg0SG9xUjZJRndVMjVnQlRCDQotMGtjNm9xeDZEemVISStrOE9ZaDBvRzZkN044MmtnZUdBWXN4dFlmU3JIR3FXVHI3enovWWpZMU4vMHhIUytpVw0KLUFFcHJON3M4WmYza0tRSDUzYktTNk9PVk1mZGpUa3Jqd1RPdzl6MEVFNmFXelYweTlTSXlqM1FpS3dDZ20xZHQNCi1aMUVkSEhXR1EwRC9pT3VQSnk0ZWpDa0QvM01MSnFqQmljeDVMYmhtNDQ0QzI4TmE3RzRRTXE4NFFxaEMrcU5mDQotVlkyTmNudU14bmk3QWJjcmJHeEI1Q3ZvOHVudGd0L2ZsVHZNbUsrbzBvWVovenV2dks0c0o1dVhEYXdXbkZMSA0KLW5GY3ZSeUxkekhnbEtlcXBFaDRMaXJ4UjBub2laeXJCeTBKaUhnOU5lQi9VdmlGRDNiTVBSSFpvcllOb2VBQ0sNCi1XckFIQS93Tm9IOHcvbHlZanljVkpYZ1lDVzFhNEtYcGtZcVBCcEpLS2pxUHZnOWRqdVdOT2FBbVdvSGNLQkkzDQotZHh5eVNpaGk1blE3WnNaaFBYQTFRcy9NcDhGZUY3eFh2cjljMmorcjVMV0RtNGZ5M2tJcFVFY1F0M0RQdWJwbQ0KLU4ranNiN3EzelljeDlqREU1L2dFM0c0b2lTMldxelovNStLVnJVOGR5Y3hBTzJ0Vm1iUW1SM0psWjI5eUlFb3UNCi1JRkp2ZEdobWRYTnpJRHhuY21WbmIzSkFZWEJoWTJobExtOXlaejZJWHdRVEVRSUFId1VDUW5WS2hBSWJBd2NMDQotQ1FnSEF3SUJBeFVDQXdNV0FnRUNIZ0VDRjRBQUNna1E4WGZqUEdwdHlmZTFVd0NmYVo4ZCtwVmpnYjJ5TU1hLw0KLXE5K0hZenNGOUtJQW5pY1BrZU5idXAwSldaL0F4NWVqTlMvMXMxR0F1UUVOQkVKMVNvY1FCQUNOK3ZVNmxPWXcNCi1UQis0cy83eGR6U21HV29MdjVaTlVOVXJYVlV3TllBZFNDcHdmSVVjQ09rRTdtRDJRQ1k3bGtldWt5WVV6eTZuDQoteTdDMnpZQ0l4Y2Y1QjEybUVYODJqVWN2SHllemdDTHppVENLS0tuTzZrZm41ckcxOE1hUHdxTkVweUkrUEcraA0KLUZGWEdPNDIrYWFuc1ZMSU1wdkh4d2tWRjBWL2ZxRHRtRXdBREJRUC9jRno3SnV1RXUwS2dBeHY4UTJvR3NmYm0NCi1xWnpyUEVyQ2hsczdtU1lCTjJuN2ZXaXFiMXFjbTJyZkdxN3ZVdFdHTStJMjZwK1VLWmhjRi9BbkRiZnA5bFQ5DQoteGRwM3JTZzN0NjQvL2k4VmJPdjNZNURDRmJjZlNWalJDdkx6Rk1uUUlUME53THhraEdoOHVncmhhckNWS2dyMg0KLWRFbVJOVjVqUDdkSEVwUXgzNTZJU1FRWUVRSUFDUVVDUW5WS2h3SWJEQUFLQ1JEeGQrTThhbTNKOTdvQ0FKMGQNCi1JZmlocExBQ3ZTZFNpVDJmQ201VUVGckkzQUNmWE9QTVlIQ3RHNHdESTdocnBqRmNJanVUekVvPQ0KLT1DOXNjDQotLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ0KZGlmZiAtLWdpdCBhL3RydW5rL0xJQ0VOU0UudHh0IGIvdHJ1bmsvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MWVlYjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS90cnVuay9OT1RJQ0UudHh0IGIvdHJ1bmsvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3ZmI3OS4uMDAwMDAwMAotLS0gYS90cnVuay9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotQXBhY2hlIExlbnlhCi1Db3B5cmlnaHQgMTk5OS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBET000SiBQcm9qZWN0Ci0oaHR0cDovL3d3dy5kb200ai5vcmcvKS4KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgWE1MOkRCIEluaXRpYXRpdmUgCi0oaHR0cDovL3d3dy54bWxkYi5vcmcvKS4KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQlhFIFByb2plY3QKLShodHRwOi8vYnhlLm9zY29tLm9yZy8pLgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBLdXB1IFByb2plY3QKLShodHRwOi8va3VwdS5vc2NvbS5vcmcvKS4KLQotUG9ydGlvbnMgYXJlIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gCi0oTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuCi1JbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBvcnRpb25zIGFyZSBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KZGlmZiAtLWdpdCBhL3RydW5rL1JFQURNRS50eHQgYi90cnVuay9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWVhMmY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgQSAgUCAgQSAgQyAgSCAgRSAgICAgICAgTCAgRSAgTiAgWSAgQQotCi0gIEFib3V0IEFwYWNoZSBMZW55YQotICAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICBBcGFjaGUgTGVueWEgaXMgYSBKYXZhLWJhc2VkIE9wZW4tU291cmNlIENvbnRlbnQgTWFuYWdlbWVudCBTeXN0ZW0uCi0gIEl0IGlzIGJhc2VkIG9uIG9wZW4gc3RhbmRhcmRzIHN1Y2ggYXMgWE1MIGFuZCBYU0xULiBPbmUgb2YgaXRzIGNvcmUKLSAgY29tcG9uZW50cyBpcyBDb2Nvb24gZnJvbSB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgQXBhY2hlIExlbnlhIHN1cHBvcnRzIGlubGluZSBXWVNJV1lHIGVkaXRvcnMuIFlvdXIgc2l0ZSBlZGl0b3JzIGRvIG5vdAotICBoYXZlIHRvIGxlYXJuIFhNTC4gVGhpcyBpcyBwb3NzaWJsZSB0aGFua3MgdG8gdGhlIHN1cHBvcnQgb2YgWE1MLAotICBYU0xUIGFuZCBYTUwgU2NoZW1hIG9uIHRoZSBjbGllbnQgc2lkZS4gQW4gYWRtaW5pc3RyYXRpb24gaW50ZXJmYWNlCi0gIGFsbG93cyBhZHZhbmNlZCB1c2VycyB0byBtb25pdG9yIHRoZSBDTVMsIGFuZCBwZXJmb3JtIGNvbmZpZ3VyYXRpb24KLSAgdGFza3MuCi0KLQotICBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zIGFuZCBEb2N1bWVudGF0aW9uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBGb3IgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gcmVhZCBJTlNUQUxMLUJJTi50eHQuCi0KLSAgRm9yIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIHJlYWQgSU5TVEFMTC1TUkMudHh0LgotCi0gIFRoZSBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhcyBvZiB0aGUgZGF0ZSBvZiB0aGlzIHJlbGVhc2UgaXMgaW5jbHVkZWQKLSAgaW4gdGhpcyBkaXJlY3RvcnkuCi0KLSAgSWYgeW91IGFyZSB1cGRhdGluZyBmcm9tIGEgcHJldmlvdXMgcmVsZWFzZSBvZiBMZW55YSwgbWFrZSBzdXJlCi0gIHRoYXQgeW91IHJlYWQgdGhlIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgb24gdXBkYXRpbmcgZmlyc3QuCi0KLSAgTG9vayBmb3IgdGhlIG1vc3QgdXBkYXRlZCBkb2N1bWVudGF0aW9uIG9uIHRoZSBBcGFjaGUgTGVueWEgd2ViIHNpdGUKLSAgKGh0dHA6Ly9sZW55YS5hcGFjaGUub3JnLykuCi0KLQotCi0gIExpY2Vuc2luZyBhbmQgbGVnYWwgaXNzdWVzCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgQXBhY2hlIExlbnlhIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgYSBsaWNlbnNlIG9mIHRoZSBCU0QKLSAgZmFtaWx5LCBhbmQgY29udGFpbnMgc29mdHdhcmUgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgbGljZW5zaW5nCi0gIHN0eWxlLgotCi0gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCB0aGUgTElDRU5TRSBmaWxlcyBpbiB0aGUgL2xlZ2FsIGRpcmVjdG9yeS4KLQotCi0KLSAgQ3JlZGl0cwotICAtLS0tLS0tCi0KLSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY3JlZGl0cyBhbmQgZHVlIHJlZmVyZW5jZSB0byBpbmNsdWRlZCBzb2Z0d2FyZSwKLSAgcGxlYXNlIHJlYWQgdGhlIENSRURJVFMudHh0IGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuCi0KLQotICBLbm93biBpc3N1ZXMKLSAgLS0tLS0tLS0tLS0tCi0KLSAgVGhlIEFwYWNoZSBpc3N1ZSB0cmFja2VyIGlzIGF2YWlsYWJsZSBhdAotICBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvIC4KLQotCi0KLSAgVGhhbmtzIGZvciB5b3VyIGludGVyZXN0IGluIEFwYWNoZSBMZW55YS4KLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIEFwYWNoZSBMZW55YSBQcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vbGVueWEuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhL3RydW5rL2J1aWxkLmJhdCBiL3RydW5rL2J1aWxkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxMzczYy4uMDAwMDAwMAotLS0gYS90cnVuay9idWlsZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1AZWNobyBvZmYKLXJlbSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi1yZW0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotcmVtICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1yZW0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi1yZW0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi1yZW0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1yZW0KLXJlbSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotcmVtCi1yZW0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLXJlbSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLXJlbSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1yZW0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLXJlbSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1yZW0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZW0gYnVpbGQuYmF0IC0gV2luMzIgQnVpbGQgU2NyaXB0IGZvciBBcGFjaGUgTGVueWEKLXJlbQotcmVtICRJZDogYnVpbGQuYmF0IDU0NTI1IDIwMDQtMTAtMTEgMDk6Mzk6MDRaIGN6aWVnZWxlciAkCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXNldCBDT0NPT05fSE9NRT1leHRlcm5hbHNcY29jb29uXzJfMV94Ci1zZXQgQ09DT09OX0VORE9SU0VEX0RJUj0lQ09DT09OX0hPTUUlXGxpYlxlbmRvcnNlZAotCi1yZW0gLS0tLS0gSWdub3JlIHN5c3RlbSBDTEFTU1BBVEggdmFyaWFibGUKLXNldCBPTERfQ0xBU1NQQVRIPSVDTEFTU1BBVEglCi1zZXQgQ0xBU1NQQVRIPQotZm9yICUlaSBpbiAobGliXCouamFyKSBkbyBjYWxsIHRvb2xzXGJpblxhcHBlbmRjcC5iYXQgJSVpCi1mb3IgJSVpIGluICglQ09DT09OX0VORE9SU0VEX0RJUiVcKi5qYXIpIGRvIGNhbGwgdG9vbHNcYmluXGFwcGVuZGNwLmJhdCAlJWkKLQotcmVtIC0tLS0tIFVzZSBBbnQgc2hpcHBlZCB3aXRoIENvY29vbi4gSWdub3JlIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtIEFudAotc2V0IE9MRF9BTlRfSE9NRT0lQU5UX0hPTUUlCi1zZXQgQU5UX0hPTUU9dG9vbHMKLQotY2FsbCAlQU5UX0hPTUUlXGJpblxhbnQgLURqYXZhLmVuZG9yc2VkLmRpcnM9JUNPQ09PTl9FTkRPUlNFRF9ESVIlIC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQuTm9CYW5uZXJMb2dnZXIgLWVtYWNzICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5Ci0gCi1yZW0gLS0tLS0gUmVzdG9yZSBBTlRfSE9NRSBhbmQgQU5UX09QVFMKLXNldCBBTlRfSE9NRT0lT0xEX0FOVF9IT01FJQotc2V0IE9MRF9BTlRfSE9NRT0KLQotcmVtIC0tLS0tIFJlc3RvcmUgQ0xBU1NQQVRICi1zZXQgQ0xBU1NQQVRIPSVPTERfQ0xBU1NQQVRIJQotc2V0IE9MRF9DTEFTU1BBVEg9CmRpZmYgLS1naXQgYS90cnVuay9idWlsZC5wcm9wZXJ0aWVzIGIvdHJ1bmsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwNWFiNS4uMDAwMDAwMAotLS0gYS90cnVuay9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0jIFByb3BlcnRpZXMgY29udHJvbGxpbmcgdGhlIGJ1aWxkIHByb2Nlc3MKLQotIyBOT1RFOiAKLSMgRG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZSBkaXJlY3RseSBidXQgY3JlYXRlIGEgZmlsZSBuYW1lZAotIyAnbG9jYWwuYnVpbGQucHJvcGVydGllcycgYW5kIGltcGxlbWVudCBPTkxZCi0jIHRoZSBwcm9wZXJ0aWVzIHlvdSBuZWVkLgotIAotIyBZb3UgZG8gTk9UIGhhdmUgdG8gY29weSB0aGUgd2hvbGUgJ2J1aWxkLnByb3BlcnRpZXMnIGZpbGUuCi0gCi0jIFRoZSBidWlsZCBzeXN0ZW0gd2lsbCBmaXJzdCByZWFkIGFsbCBwcm9wZXJ0aWVzIGRlZmluZWQgCi0jIGluIHRoZSAnbG9jYWwuYnVpbGQucHJvcGVydGllcycgZmlsZSBhbmQgdGhlbiB3aWxsIHJlYWQgb3V0IHRoZSAKLSMgb25lcyBpbiAnYnVpbGQucHJvcGVydGllcycuIEFudCB3aWxsIHVzZSB0aGUgZmlyc3QgZm91bmQuCi0jIFlvdSBjYW4gYXMgd2VsbCBleGVjdXRlIC4vY29uZmlndXJlLnNoIChMaW51eCkgb3IgY29uZmlndXJlIChXaW5kb3dzKQotIyB0byBnZW5lcmF0ZSB0aGUgJ2xvY2FsLmJ1aWxkLnByb3BlcnRpZXMnLgotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEJ1aWxkIHByb3BlcnRpZXMgdmVyc2lvbiB0byBtYWtlIHN1cmUgdGhhdCBsb2NhbC5idWlsZC5wcm9wZXJ0aWVzIGlzIGtlcHQgaW4gc3luYwotIyBOT1RFOiBEbyBOT1QgbW9kaWZ5IHRoaXMgbnVtYmVyIHVubGVzcyB5b3UgYXJlIGEgRGV2IGFuZCB3YW50IHRvIG1vZGlmeSB0aGlzIGZpbGUKLSMgTk9URSBmb3IgRGV2czogVXBkYXRlIHRoaXMgbnVtYmVyIGlmIHRoaXMgZmlsZSBpcyBiZWluZyB1cGRhdGVkLgotIyAgICAgICAgICAgICAgICBBbHNvIHVwZGF0ZSB0aGUgdmVyc2lvbiBudW1iZXIgd2l0aGluIHNyYy90YXJnZXRzL3Byb3BlcnRpZXMtYnVpbGQueG1sCi0KLWJ1aWxkLnByb3BlcnRpZXMudmVyc2lvbj01OTQ2NDQKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUaGUgcm9vdCBvZiB0aGUgQ29jb29uIHNvdXJjZSB0cmVlCi0KLWNvY29vbi5zcmMuZGlyPWV4dGVybmFscy9jb2Nvb25fMl8xX3gKLSNjb2Nvb24uc3JjLmRpcj0uLi8uLi9jb2Nvb24vYnJhbmNoZXMvQlJBTkNIXzJfMV9YCi0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUaGUgY29jb29uIHdlYmFwcCBkaXJlY3RvcnkKLSMgWW91IGRvIG5vdCBoYXZlIHRvIGNoYW5nZSB0aGlzIHNpbmNlIExlbnlhIHdpbGwgYnVpbGQgQ29jb29uIGZvciB5b3UKLQotY29jb29uLndlYmFwcC5kaXI9JHtjb2Nvb24uc3JjLmRpcn0vYnVpbGQvd2ViYXBwCi0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBSb290IGRpcmVjdG9yaWVzIHdoZXJlIHB1YmxpY2F0aW9ucyBhcmUgbG9jYXRlZAotCi1wdWJzLnJvb3QuZGlycz1zcmMvcHVicwotI3B1YnMucm9vdC5kaXJzPXNyYy9wdWJzOi4uL2Fub3RoZXJwcm9qZWN0L3B1YnM6L2hvbWUvdXNlci9teS1wdWIKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFJvb3QgZGlyZWN0b3JpZXMgd2hlcmUgbW9kdWxlcyBhcmUgbG9jYXRlZAotbW9kdWxlcy5yb290LmRpcnM9c3JjL21vZHVsZXM6c3JjL21vZHVsZXMtY29yZTpzcmMvcHVicy9kZWZhdWx0L21vZHVsZXMKLSNtb2R1bGVzLnJvb3QuZGlycz1zcmMvbW9kdWxlczpzcmMvcHVicy9kZWZhdWx0L21vZHVsZXM6c3JjL21vZHVsZXMtb3B0aW9uYWwKLQotIyBjb3B5IG1vZHVsZXMgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbj8KLW1vZHVsZXMuY29weT10cnVlCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgV2ViIEFwcGxpY2F0aW9uIFNlcnZlcgotIyBOT1RFOiBUaGVyZSBhcmUgc2xpZ2h0IGRpZmZlcmVuY2VzIHJlIGRlcGxveW1lbnQgb24gdGhlIHZhcmlvdXMgc2VydmxldCBjb250YWluZXJzLCBlLmcuIGVuZG9yc2VkIGxpYnJhcmllcyAuLi4KLQotd2ViLmFwcC5zZXJ2ZXI9SmV0dHkKLSMgTk9URTogVGhpcyBvbmx5IHdvcmtzIGZvciBsZW55YS5zaCAoTGludXgpLiBUT0RPOiBNYWtlIGl0IGFsc28gd29yayBmb3IgbGVueWEuYmF0IChXaW5kb3dzKQotd2ViLmFwcC5zZXJ2ZXIuamV0dHkucG9ydD04ODg4Ci13ZWIuYXBwLnNlcnZlci5qZXR0eS5hZG1pbi5wb3J0PTg4ODkKLSN3ZWIuYXBwLnNlcnZlcj1Ub21jYXQKLSN3ZWIuYXBwLnNlcnZlcj1XTFMKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFdoZXJlIHRoZSAnaW5zdGFsbCcgYnVpbGQgdGFyZ2V0IHNob3VsZCBwdXQgdGhlIHdlYmFwcCBjb250ZXh0Ci0jIFdBUk5JTkc6IFRoaXMgaGFzIHRvIGJlIGFuIGFic29sdXRlIHBhdGghIChGSVhNRTogY29jb29uLnhjb25mIG5lZWRzIGFic29sdXRlIHBhdGggKHNjci90YXJnZXRzL2luaXQtYnVpbGQueG1sKSkKLSMgTk9URTogRG8gbm90IHVzZSB3aGl0ZSBzcGFjZXMgd2l0aGluIHRoZSBwYXRoCi0KLXRvbWNhdC5ob21lLmRpcj0vdXNyL2xvY2FsL3RvbWNhdAotI3RvbWNhdC5ob21lLmRpcj1DOi9idWlsZC90b21jYXQKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFdoZXJlIHRoZSAnaW5zdGFsbCcgYnVpbGQgdGFyZ2V0IHNob3VsZCBwdXQgdGhlIHdlYmFwcCBjb250ZXh0Ci0jIE5PVEU6IFRoaXMgcGF0aCBpcyBub3QgbmVjZXNzYXJpbHkgcmVsYXRpdmUgdG8gdG9tY2F0LmhvbWUuZGlyCi0KLXRvbWNhdC53ZWJhcHBzLmRpcj0ke3RvbWNhdC5ob21lLmRpcn0vd2ViYXBwcy9sZW55YQotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhlIHNlcnZlciBjYWNoZSBkaXJlY3RvcnkgdG8gYmUgY2xlYW5lZCBieSB0aGUgJ3Jlc2V0JyB0YXJnZXQKLSMgTk9URTogVGhpcyBwYXRoIGlzIG5vdCBuZWNlc3NhcmlseSByZWxhdGl2ZSB0byB0b21jYXQuaG9tZS5kaXIKLQotIyBUb21jYXQgNS54Ci10b21jYXQuY2FjaGUuZGlyPSR7dG9tY2F0LmhvbWUuZGlyfS93b3JrL0NhdGFsaW5hL2xvY2FsaG9zdC9sZW55YQotIyBUb21jYXQgNC54Ci0jdG9tY2F0LmNhY2hlLmRpcj0ke3RvbWNhdC5ob21lLmRpcn0vd29yay9TdGFuZGFsb25lL2xvY2FsaG9zdC9sZW55YQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFdoZXJlIHRoZSAnaW5zdGFsbCcgYnVpbGQgdGFyZ2V0IHNob3VsZCBjb3B5IHRoZSBlbmRvcnNlZCBsaWJyYXJpZXMKLSMgTk9URTogVGhpcyBwYXRoIGlzIG5vdCBuZWNlc3NhcmlseSByZWxhdGl2ZSB0byB0b21jYXQuaG9tZS5kaXIKLQotdG9tY2F0LmVuZG9yc2VkLmRpcj0ke3RvbWNhdC5ob21lLmRpcn0vY29tbW9uL2VuZG9yc2VkCi0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBGaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggc2hvdWxkIGJlIGV4Y2x1ZGVkIGR1cmluZyAnaW5zdGFsbCcsICdjbGVhbicgYW5kICdyZXNldCcKLSMgQ29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zCi0jIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBjb21tZW50ZWQKLSMgVGhpcyBpcyB1c2VmdWwgZm9yIHByZXNlcnZpbmcgY29udGVudCB3aGlsZSB5b3UgYXJlIGRldmVsb3BpbmcgYSBwdWJsaWNhdGlvbgotCi0jdGFyZ2V0Lmluc3RhbGwuZXhjbHVkZXM9KiovcHVicy9kZWZhdWx0L2NvbnRlbnQvKiosKiovcHVicy9kZWZhdWx0L3Jlc291cmNlcy9hdXRob3JpbmcvKiosKiovcHVicy9kZWZhdWx0L3Jlc291cmNlcy9saXZlLyoqLCoqL3B1YnMvZGVmYXVsdC9jb25maWcvYWMvcGFzc3dkLyouaW1sCi0jdGFyZ2V0LnJlc2V0LmV4Y2x1ZGVzPSR7dGFyZ2V0Lmluc3RhbGwuZXhjbHVkZXN9Ci0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUT0RPOiBUaGlzIHNlZW1zIHRvIGhhdmUgbW92ZWQgdG8gc3JjL2NvbmZwYXRjaC9lbmFibGUtdXBsb2Fkcy54d2ViIHdoZXJlYXMgaXQKLSMgICAgICAgZG9lcyBOT1Qgc2VlbSB0byB3b3JrIHByb3Blcmx5IQotIyBFbmFibGUgZmlsZSB1cGxvYWRzIGluIExlbnlhCi0jIElmIHlvdSBsZWF2ZSB0aGlzIHNldCB0byBmYWxzZSwgYXNzZXQgYW5kIGltYWdlIHVwbG9hZCB3aWxsIG5vdCB3b3JrLgotIyBJdCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGZvciBzZWN1cml0eSByZWFzb25zCi0jIE5PVEU6IE9uZSBjYW4gY2hhbmdlIHRoaXMgYWZ0ZXIgdGhlIGJ1aWxkIHdpdGhpbiBidWlsZC9sZW55YS93ZWJhcHAvV0VCLUlORi93ZWIueG1sCi0jICAgICAgIHdoZXJlIGFsc28gdGhlIG1heCB1cGxvYWQgc2l6ZSBjYW4gYmUgY29uZmlndXJlZCAodXBsb2FkLW1heC1zaXplIHBhcmFtZXRlcikKLQotZW5hYmxlLnVwbG9hZHM9ZmFsc2UKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFudGVhdGVyIGhvbWUgZGlyZWN0b3J5Ci0KLSNhbnRlYXRlci5ob21lPS91c3IvbG9jYWwvYW50ZWF0ZXIKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENhbm9vIFdlYnRlc3QgY29uZmlndXJhdGlvbgotCi0jIFdlYnRlc3QgaG9tZSBkaXJlY3RvcnkKLSN3ZWJ0ZXN0LmhvbWU9L3Vzci9sb2NhbC9jYW5vby13ZWJ0ZXN0LTIuMQotCi0jIFdlYnRlc3QgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi13ZWJ0ZXN0LmNvbmZpZy5ob3N0PWxvY2FsaG9zdAotd2VidGVzdC5jb25maWcucG9ydD04ODg4Ci13ZWJ0ZXN0LmNvbmZpZy5iYXNlcGF0aD1kZWZhdWx0L2F1dGhvcmluZwotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRWNsaXBzZSBQcm9wZXJ0aWVzIGZvciB1c2Ugd2l0aCB0aGUgZWNsaXBzZS1wcm9qZWN0IHRhcmdldAotCi1pZGUuZWNsaXBzZS5vdXRwdXRkaXI9YnVpbGQvZWNsaXBzZS9jbGFzc2VzCi1pZGUuZWNsaXBzZS5leHBvcnQubGlicz1mYWxzZQotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGhlIEphdmEgdmVyc2lvbi4KLQotIyBDaGFuZ2UgdG8gMS41IGlmIHlvdSBuZWVkIHRoZSBmZWF0dXJlcyBvZiAxLjUuCi1zcmMuamF2YS52ZXJzaW9uPTEuNAotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgWG9wdXMgY29udGV4dCBuYW1lCi0KLXhvcHVzLmNvbnRleHQ9WG9wdXMyLjEuNjQKLXhvcHVzLnBhdGg9Li4vLi4vUk9PVAotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSkNSIHJlcG9zaXRvcnkgZmFjdG9yeQotCi1yZXBvc2l0b3J5LmZhY3Rvcnk9b3JnLmFwYWNoZS5sZW55YS5jbXMuamNyLmphY2tyYWJiaXQuSmFja3JhYmJpdFJlcG9zaXRvcnlGYWN0b3J5Ci0jIE5PVEU6IEplY2VpcmFSZXBvc2l0b3J5RmFjdG9yeSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0Ci0jcmVwb3NpdG9yeS5mYWN0b3J5PW9yZy5hcGFjaGUubGVueWEuY21zLmpjci5qZWNlaXJhLkplY2VpcmFSZXBvc2l0b3J5RmFjdG9yeQotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTk9URTogVGhlIG5vZGUgZmFjdG9yeSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHdpdGhpbiAiYnVpbGQvbGVueWEvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2xlbnlhL2xlbnlhLnJvbGVzIiBhZnRlciBoYXZpbmcgYnVpbGQgTGVueWEKLQotI25vZGUuZmFjdG9yeT1vcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNvdXJjZU5vZGVGYWN0b3J5Ci0jbm9kZS5mYWN0b3J5PW9yZy5hcGFjaGUubGVueWEuY21zLnJlcG8uYWRhcHRlci5SZXBvTm9kZUZhY3RvcnkKLSNub2RlLmZhY3Rvcnk9b3JnLmFwYWNoZS5sZW55YS5jbXMuamNyLkpDUk5vZGVGYWN0b3J5Ci0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTVk4gUmV2aXNpb24gbnVtYmVyCi0KLWxlbnlhLnJldmlzaW9uPXh4eApkaWZmIC0tZ2l0IGEvdHJ1bmsvYnVpbGQuc2ggYi90cnVuay9idWlsZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRlYTI5Yy4uMDAwMDAwMAotLS0gYS90cnVuay9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1jaG1vZCB1K3ggLi90b29scy9iaW4vYW50UnVuCi1jaG1vZCB1K3ggLi90b29scy9iaW4vYW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jIC0tLS0tIFZlcmlmeSBhbmQgU2V0IFJlcXVpcmVkIEVudmlyb25tZW50IFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pZiBbICIkVEVSTSIgPSAiY3lnd2luIiBdIDsgdGhlbgotICBTPSc7JwotZWxzZQotICBTPSc6JwotZmkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSMgLS0tLS0gSWdub3JlIHN5c3RlbSBDTEFTU1BBVEggdmFyaWFibGUKLU9MRF9DTEFTU1BBVEg9IiRDTEFTU1BBVEgiCi11bnNldCBDTEFTU1BBVEgKLUNMQVNTUEFUSD0iYGVjaG8gbGliLyouamFyIHwgdHIgJyAnICRTYCIKLUVORE9SU0VEX0RJUj0iZXh0ZXJuYWxzL2NvY29vbl8yXzFfeC9saWIvZW5kb3JzZWQiCi0jIEFkZCBjb2Nvb24gZW5kb3JzZWQgbGlicwotQ0xBU1NQQVRIPSIkQ0xBU1NQQVRIIGBlY2hvICRFTkRPUlNFRF9ESVIvKi5qYXIgfCB0ciAnICcgJFNgIgotZXhwb3J0IENMQVNTUEFUSAotCi0jIC0tLS0tIFVzZSBBbnQgc2hpcHBlZCB3aXRoIExlbnlhLiBJZ25vcmUgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0gQW50Ci1PTERfQU5UX0hPTUU9IiRBTlRfSE9NRSIKLUFOVF9IT01FPXRvb2xzCi1PTERfQU5UX09QVFM9IiRBTlRfT1BUUyIKLUFOVF9PUFRTPSItWG1zMzJNIC1YbXg1MTJNIC1EamF2YS5lbmRvcnNlZC5kaXJzPSRFTkRPUlNFRF9ESVIiCi1leHBvcnQgQU5UX0hPTUUgQU5UX09QVFMKLQotIiRBTlRfSE9NRS9iaW4vYW50IiAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lk5vQmFubmVyTG9nZ2VyIC1lbWFjcyAgJEAKLUVSUj0kPwotCi0jIC0tLS0tIFJlc3RvcmUgQU5UX0hPTUUgYW5kIEFOVF9PUFRTCi1BTlRfSE9NRT0iJE9MRF9BTlRfSE9NRSIKLUFOVF9PUFRTPSIkT0xEX0FOVF9PUFRTIgotZXhwb3J0IEFOVF9IT01FIEFOVF9PUFRTCi11bnNldCBPTERfQU5UX0hPTUUKLXVuc2V0IE9MRF9BTlRfT1BUUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotIyAtLS0tLSBSZXN0b3JlIENMQVNTUEFUSAotQ0xBU1NQQVRIPSIkT0xEX0NMQVNTUEFUSCIKLWV4cG9ydCBDTEFTU1BBVEgKLXVuc2V0IE9MRF9DTEFTU1BBVEgKLQotIyBCdWlsZCBzdGF0dXMgcmV0dXJuCi0jIFVzYWdlOiBlLmcuIGJhc2g6IC4vYnVpbGQuc2g7IGlmIFsgJD8gLW5lIDAgXTsgdGhlbiBlY2hvICJCdWlsZCBGQUlMRUQiOyBmaQotZXhpdCAkRVJSCmRpZmYgLS1naXQgYS90cnVuay9idWlsZC54bWwgYi90cnVuay9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZmM1NTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPCFET0NUWVBFIHByb2plY3QgWwotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqCi0gICAgICAgICAgICAgICAgICAgICAgIHwgIEFwYWNoZSBMZW55YSBCdWlsZCBTeXN0ZW0gfAotICAgICAgICAgICAgICAgICAgICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqCi0KLSAgICAgICBDVlMgJElkJDoKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotXT4KLQotPHByb2plY3QgZGVmYXVsdD0id2ViYXBwIiBiYXNlZGlyPSIuIiBuYW1lPSJsZW55YSI+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT0gIEFwYWNoZSBMZW55YSB0YXJnZXRzICA9PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIEdsb2JhbCBwcm9wZXJ0aWVzICAtLT4KLSAgPGltcG9ydCBmaWxlPSJzcmMvdGFyZ2V0cy9wcm9wZXJ0aWVzLWJ1aWxkLnhtbCIgLz4KLSAgPCEtLSBJbml0aWFsaXphdGlvbiB0YXJnZXRzICAtLT4KLSAgPGltcG9ydCBmaWxlPSJzcmMvdGFyZ2V0cy9pbml0LWJ1aWxkLnhtbCIgLz4KLSAgPCEtLSBJREUgdGFyZ2V0cyAgICAgICAgICAgICAtLT4gCi0gIDxpbXBvcnQgZmlsZT0ic3JjL3RhcmdldHMvaWRlLWJ1aWxkLnhtbCIgLz4KLSAgPCEtLSBDb21waWxlIHRhcmdldHMgICAgICAgICAtLT4gCi0gIDxpbXBvcnQgZmlsZT0ic3JjL3RhcmdldHMvY29tcGlsZS1idWlsZC54bWwiIC8+Ci0gIDwhLS0gRG9jdW1lbnRhdGlvbiB0YXJnZXRzICAgLS0+IAotICA8aW1wb3J0IGZpbGU9InNyYy90YXJnZXRzL2RvY3MtYnVpbGQueG1sIiAvPgotICA8IS0tIFdlYiBhcHBsaWNhdGlvbiB0YXJnZXRzIC0tPgotICA8aW1wb3J0IGZpbGU9InNyYy90YXJnZXRzL3dlYmFwcC1idWlsZC54bWwiIC8+Ci0gIDwhLS0gVGVzdGNhc2VzIHRhcmdldHMgICAgICAgLS0+Ci0gIDxpbXBvcnQgZmlsZT0ic3JjL3RhcmdldHMvdGVzdC1idWlsZC54bWwiIC8+Ci0gIDwhLS0gRGlzdHJpYnV0aW9uIHRhcmdldHMgICAgLS0+Ci0gIDxpbXBvcnQgZmlsZT0ic3JjL3RhcmdldHMvZGlzdC1idWlsZC54bWwiIC8+Ci0gIDwhLS0gS3VwdSB0YXJnZXRzICAgICAgICAgICAgLS0+Ci0gIDxpbXBvcnQgZmlsZT0ic3JjL3RhcmdldHMva3VwdS1idWlsZC54bWwiIC8+Ci0gIDwhLS0gRXhwb3J0IHRhcmdldHMgICAgICAgICAgLS0+Ci0gIDxpbXBvcnQgZmlsZT0ic3JjL3RhcmdldHMvZXhwb3J0LWJ1aWxkLnhtbCIgLz4KLSAgPCEtLSBtb2R1bGUgdGFyZ2V0cyAgICAgICAgICAtLT4KLSAgPGltcG9ydCBmaWxlPSJzcmMvdGFyZ2V0cy9tb2R1bGVzLWJ1aWxkLnhtbCIgLz4KLSAgPCEtLSBtaWdyYXRpb24gdGFyZ2V0cyAgICAgICAgICAtLT4KLSAgPGltcG9ydCBmaWxlPSJzcmMvdGFyZ2V0cy9taWdyYXRpb24tYnVpbGQueG1sIiAvPgotICA8IS0tIFB1YmxpY2F0aW9uIHRlc3RzICAgICAgIC0tPgotICA8aW1wb3J0IGZpbGU9InNyYy90YXJnZXRzL3B1YmxpY2F0aW9uLXRlc3QtYnVpbGQueG1sIiAvPgotICA8IS0tIFN1Y2Nlc3NmdWxseSBCdWlsdCBNZXNzYWdlICAgICAgIC0tPgotICA8aW1wb3J0IGZpbGU9InNyYy90YXJnZXRzL21lc3NhZ2UtYnVpbGQueG1sIiAvPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NvbmZpZ3VyZS5iYXQgYi90cnVuay9jb25maWd1cmUuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmZkYWI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NvbmZpZ3VyZS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi06OiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLTo6IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotOjogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotOjogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLTo6ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi06OiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOjoKLTo6ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi06OgotOjogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTo6ICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOjogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOjogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTo6ICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTo6Ci06OgotQGVjaG8gb2ZmCi0KLTo6IGRlZmluZSB2YXJpYWJsZXMgZm9yIHBhdGhzCi1zZXQgTEVOWUFfSE9NRT0lQ0QlCi1zZXQgQ1A9JUxFTllBX0hPTUUlXHRvb2xzXGNvbmZpZ3VyZVxsaWJcYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1jb3JlLTEuNC1kZXYtcjQxNDU3OS5qYXI7JUxFTllBX0hPTUUlXHRvb2xzXGNvbmZpZ3VyZVxsaWJcYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1pbXBsLTEuNC1kZXYtcjQxNDU3OS5qYXIKLWVjaG8gVGhlIGNsYXNzcGF0aCBpcyBzZXQgdG86ICVDUCUKLQotOjogY2hlY2sgaWYgSkFWQV9IT01FIGlzIHNldCBvciBnb3RvIGVuZAotaWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBnb3RKYXZhSG9tZQotZWNobyBZb3UgbXVzdCBzZXQgSkFWQV9IT01FIHRvIHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uCi1nb3RvIGVuZAotCi06Z290SmF2YUhvbWUKLTo6IElmIGNvbW1hbmRsaW5lIGFyZ3VtZW50IGNtZCBpcyBnaXZlbiBnb3RvIGphdmFDbWQuIERlZmF1bHQgd2l0aG91dCBhbnkgYXJndW1lbnQKLTo6IGl0IHdpbGwgc3RhcnQgdGhlIEdVSS4KLWlmICIlMSIgPT0gImd1aSIgZ290byBqYXZhR3VpCi1nb3RvIGphdmFDbWQKLQotOmphdmFHdWkKLWphdmEgLWNsYXNzcGF0aCAlQ1AlIG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmltcGwuQ29uZmlndXJlR1VJICVMRU5ZQV9IT01FJQotZ290byBlbmQKLQotOmphdmFDbWQKLWphdmEgLWNsYXNzcGF0aCAlQ1AlIG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmltcGwuQ29uZmlndXJlQ29tbWFuZExpbmUgJUxFTllBX0hPTUUlCi1nb3RvIGVuZAotCi06aGVscAotZWNobyBVc2FnZTogJTAgZ3VpIG9yIGNtZAotZ290byBlbmQKLQotCi06ZW5kCi06OiB1bnNldCB1c2VkIHZhcmlhYmxlcwotc2V0IExFTllBX0hPTUU9Ci1zZXQgQ1A9CmRpZmYgLS1naXQgYS90cnVuay9jb25maWd1cmUuc2ggYi90cnVuay9jb25maWd1cmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzNTBiY2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY29uZmlndXJlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSMgLS0tLS0gVmVyaWZ5IGFuZCBTZXQgUmVxdWlyZWQgRW52aXJvbm1lbnQgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWlmIFsgIiRURVJNIiA9ICJjeWd3aW4iIF0gOyB0aGVuCi0gIFM9JzsnCi1lbHNlCi0gIFM9JzonCi1maQotCi0jIC0tLS0tIENoZWNrIEpBVkFfSE9NRQotSkFWQV9IT01FPSIkSkFWQV9IT01FIgotaWYgWyAiJEpBVkFfSE9NRSIgPSAiIiBdO3RoZW4KLSAgZWNobyAiRVJST1I6IE5vIEpBVkFfSE9NRSBzZXQgeWV0ISIKLSAgZWNobyAiICAgICAgIEhhdmUgeW91IGluc3RhbGxlZCBKREsgMS40LjIgb3IgaGlnaGVyPyIKLSAgZWNobyAiIgotICBlY2hvICJOT1RFOiAgQXBhY2hlIExlbnlhIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgd2l0aCBKREsgMS41ISIKLSAgZXhpdCAxCi1maQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotIyAtLS0tLSBJZ25vcmUgc3lzdGVtIENMQVNTUEFUSCB2YXJpYWJsZQotT0xEX0NMQVNTUEFUSD0iJENMQVNTUEFUSCIKLXVuc2V0IENMQVNTUEFUSAotI0NMQVNTUEFUSD0iYGVjaG8gdG9vbHMvY29uZmlndXJlL2J1aWxkL2NsYXNzZXMgfCB0ciAnICcgJFNgIgotQ0xBU1NQQVRIPSJ0b29scy9jb25maWd1cmUvbGliL2FwYWNoZS1sZW55YS1jb25maWd1cmUtY29yZS0xLjQtZGV2LXI0MTQ1NzkuamFyOnRvb2xzL2NvbmZpZ3VyZS9saWIvYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1pbXBsLTEuNC1kZXYtcjQxNDU3OS5qYXIiCi1leHBvcnQgQ0xBU1NQQVRICi0jZWNobyAiREVCVUc6ICRDTEFTU1BBVEgiCi0KLURFRkFVTFRfVUlfVFlQRT1jbWQKLVVJX1RZUEU9JDEKLWlmIFsgIiRVSV9UWVBFIiA9ICIiIF07dGhlbgotICBVSV9UWVBFPSRERUZBVUxUX1VJX1RZUEUKLWZpCi0jZWNobyAiREVCVUc6ICRVSV9UWVBFIgotCi0KLVBXRD1gcHdkYAotaWYgWyAiJFVJX1RZUEUiID0gImNtZCIgXTt0aGVuCi0gIGphdmEgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuaW1wbC5Db25maWd1cmVDb21tYW5kTGluZSAkUFdECi1lbGlmIFsgIiRVSV9UWVBFIiA9ICJndWkiIF07IHRoZW4KLSAgamF2YSBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5pbXBsLkNvbmZpZ3VyZUdVSSAkUFdECi1lbHNlCi0gIGVjaG8gIkVSUk9SOiBObyBzdWNoIFVzZXIgSW50ZXJmYWNlOiAkVUlfVFlQRSIKLSAgZXhpdCAxCi1maQotRVJSPSQ/Ci0KLWVjaG8gIiIKLWVjaG8gIk5PVEUgKGZvciB0aGUgYWR2YW5jZWQgdXNlcik6IFlvdSBtaWdodCB3YW50IHRvIGVkaXQgdGhlIGxvY2FsLiogZmlsZXMgbWFudWFsbHksIGJlY2F1c2UgdGhlcmUgYXJlIG9mdGVuIGV2ZW4gbW9yZSBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIHRoYW4gdGhlIG9uZXMgd2hpY2ggd2VyZSBwcmVzZW50ZWQgZHVyaW5nIHRoaXMgY29uZmlndXJhdGlvbiBzZXR1cCEiCi0KLWVjaG8gIiIKLWVjaG8gIk5PVEU6IEJ1aWxkIExlbnlhIG5vdyBieSBydW5uaW5nIC4vYnVpbGQuc2ghIgotCi0jIC0tLS0tIFJlc3RvcmUgQ0xBU1NQQVRICi1DTEFTU1BBVEg9IiRPTERfQ0xBU1NQQVRIIgotZXhwb3J0IENMQVNTUEFUSAotdW5zZXQgT0xEX0NMQVNTUEFUSAotCi0jIEJ1aWxkIHN0YXR1cyByZXR1cm4KLSMgVXNhZ2U6IGUuZy4gYmFzaDogLi9idWlsZC5zaDsgaWYgWyAkPyAtbmUgMCBdOyB0aGVuIGVjaG8gIkJ1aWxkIEZBSUxFRCI7IGZpCi1leGl0ICRFUlIKZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL0xJQ0VOU0UuYXBhY2hlIGIvdHJ1bmsvbGVnYWwvTElDRU5TRS5hcGFjaGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYzRjM2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvTElDRU5TRS5hcGFjaGUKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gCi0gQ29weXJpZ2h0IChDKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2EtCi0gdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiAgc291cmNlIGNvZGUgbXVzdCAgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgIG5vdGljZSwKLSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIAotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gCi0gMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmIGFueSwgbXVzdAotICAgIGluY2x1ZGUgIHRoZSBmb2xsb3dpbmcgIGFja25vd2xlZGdtZW50OiAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyAgc29mdHdhcmUKLSAgICBkZXZlbG9wZWQgIGJ5IHRoZSAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gICAgQWx0ZXJuYXRlbHksIHRoaXMgIGFja25vd2xlZGdtZW50IG1heSAgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsICBpZgotICAgIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gCi0gNC4gVGhlIG5hbWVzICJBcGFjaGUgQ29jb29uIiBhbmQgICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAgbm90ICBiZQotICAgIHVzZWQgdG8gIGVuZG9yc2Ugb3IgcHJvbW90ZSAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gCi0gNS4gUHJvZHVjdHMgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgIGJlIGNhbGxlZCAiQXBhY2hlIiwgbm9yIG1heQotICAgICJBcGFjaGUiIGFwcGVhciAgaW4gdGhlaXIgbmFtZSwgIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uICBvZiB0aGUKLSAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAKLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgIEZPUiBBIFBBUlRJQ1VMQVIgIFBVUlBPU0UgQVJFICBESVNDTEFJTUVELiAgSU4gTk8gIEVWRU5UIFNIQUxMICBUSEUKLSBBUEFDSEUgU09GVFdBUkUgIEZPVU5EQVRJT04gIE9SIElUUyBDT05UUklCVVRPUlMgIEJFIExJQUJMRSBGT1IgIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgIERBTUFHRVMgKElOQ0xVLQotIERJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKLSBPRiBVU0UsIERBVEEsIE9SICBQUk9GSVRTOyBPUiBCVVNJTkVTUyAgSU5URVJSVVBUSU9OKSAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gQU5ZICBUSEVPUlkgT0YgTElBQklMSVRZLCAgV0hFVEhFUiAgSU4gQ09OVFJBQ1QsICBTVFJJQ1QgTElBQklMSVRZLCAgT1IgVE9SVAotIChJTkNMVURJTkcgIE5FR0xJR0VOQ0UgT1IgIE9USEVSV0lTRSkgQVJJU0lORyBJTiAgQU5ZIFdBWSBPVVQgT0YgVEhFICBVU0UgT0YKLSBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIAotIFRoaXMgc29mdHdhcmUgIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgIGJ5IG1hbnkgaW5kaXZpZHVhbHMKLSBvbiAgYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgIEZvdW5kYXRpb24gYW5kIHdhcyAgb3JpZ2luYWxseSBjcmVhdGVkIGJ5Ci0gU3RlZmFubyBNYXp6b2NjaGkgIDxzdGVmYW5vQGFwYWNoZS5vcmc+LiBGb3IgbW9yZSAgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSAKLSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAKLSovCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLmF2YWxvbiBiL3RydW5rL2xlZ2FsL0xJQ0VOU0UuYXZhbG9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmYzYzhhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xlZ2FsL0xJQ0VOU0UuYXZhbG9uCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotCi0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAKLSBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhLQotIHRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2YgIHNvdXJjZSBjb2RlIG11c3QgIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UsCi0gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIAotIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZiBhbnksIG11c3QKLSAgICBpbmNsdWRlICB0aGUgZm9sbG93aW5nICBhY2tub3dsZWRnbWVudDogICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgIHNvZnR3YXJlCi0gICAgZGV2ZWxvcGVkICBieSB0aGUgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICAgIEFsdGVybmF0ZWx5LCB0aGlzICBhY2tub3dsZWRnbWVudCBtYXkgIGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLCAgaWYKLSAgICBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotIAotIDQuIFRoZSBuYW1lcyAiSmFrYXJ0YSIsICJBdmFsb24iLCAiRXhjYWxpYnVyIiwgIkF2YWxvbiBGcmFtZXdvcmsiIGFuZCAKLSAgICAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iICBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSAKLSAgICBwcm9kdWN0cyBkZXJpdmVkICBmcm9tIHRoaXMgIHNvZnR3YXJlIHdpdGhvdXQgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCi0gICAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gCi0gNS4gUHJvZHVjdHMgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgIGJlIGNhbGxlZCAiQXBhY2hlIiwgbm9yIG1heQotICAgICJBcGFjaGUiIGFwcGVhciAgaW4gdGhlaXIgbmFtZSwgIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uICBvZiB0aGUKLSAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAKLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgIEZPUiBBIFBBUlRJQ1VMQVIgIFBVUlBPU0UgQVJFICBESVNDTEFJTUVELiAgSU4gTk8gIEVWRU5UIFNIQUxMICBUSEUKLSBBUEFDSEUgU09GVFdBUkUgIEZPVU5EQVRJT04gIE9SIElUUyBDT05UUklCVVRPUlMgIEJFIExJQUJMRSBGT1IgIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgIERBTUFHRVMgKElOQ0xVLQotIERJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKLSBPRiBVU0UsIERBVEEsIE9SICBQUk9GSVRTOyBPUiBCVVNJTkVTUyAgSU5URVJSVVBUSU9OKSAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gQU5ZICBUSEVPUlkgT0YgTElBQklMSVRZLCAgV0hFVEhFUiAgSU4gQ09OVFJBQ1QsICBTVFJJQ1QgTElBQklMSVRZLCAgT1IgVE9SVAotIChJTkNMVURJTkcgIE5FR0xJR0VOQ0UgT1IgIE9USEVSV0lTRSkgQVJJU0lORyBJTiAgQU5ZIFdBWSBPVVQgT0YgVEhFICBVU0UgT0YKLSBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIAotIFRoaXMgc29mdHdhcmUgIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgIGJ5IG1hbnkgaW5kaXZpZHVhbHMKLSBvbiAgYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgIEZvdW5kYXRpb24uIEZvciBtb3JlICBpbmZvcm1hdGlvbiBvbiB0aGUgCi0gQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICAgICAKLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGVnYWwvTElDRU5TRS5iYXRpayBiL3RydW5rL2xlZ2FsL0xJQ0VOU0UuYmF0aWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODBmMmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvTElDRU5TRS5iYXRpaworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAKLSBDb3B5cmlnaHQgKEMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYS0KLSB0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mICBzb3VyY2UgY29kZSBtdXN0ICByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgbm90aWNlLAotICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAKLSAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYgYW55LCBtdXN0Ci0gICAgaW5jbHVkZSAgdGhlIGZvbGxvd2luZyAgYWNrbm93bGVkZ21lbnQ6ICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzICBzb2Z0d2FyZQotICAgIGRldmVsb3BlZCAgYnkgdGhlICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAgICBBbHRlcm5hdGVseSwgdGhpcyAgYWNrbm93bGVkZ21lbnQgbWF5ICBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgIGlmCi0gICAgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAKLSA0LiBUaGUgbmFtZXMgIkJhdGlrIiBhbmQgICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgIG11c3Qgbm90IGJlICB1c2VkIHRvCi0gICAgZW5kb3JzZSAgb3IgcHJvbW90ZSAgcHJvZHVjdHMgZGVyaXZlZCAgZnJvbSB0aGlzICBzb2Z0d2FyZSB3aXRob3V0ICBwcmlvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAKLSA1LiBQcm9kdWN0cyAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCAgYmUgY2FsbGVkICJBcGFjaGUiLCBub3IgbWF5Ci0gICAgIkFwYWNoZSIgYXBwZWFyICBpbiB0aGVpciBuYW1lLCAgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gIG9mIHRoZQotICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIAotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyAgRk9SIEEgUEFSVElDVUxBUiAgUFVSUE9TRSBBUkUgIERJU0NMQUlNRUQuICBJTiBOTyAgRVZFTlQgU0hBTEwgIFRIRQotIEFQQUNIRSBTT0ZUV0FSRSAgRk9VTkRBVElPTiAgT1IgSVRTIENPTlRSSUJVVE9SUyAgQkUgTElBQkxFIEZPUiAgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgREFNQUdFUyAoSU5DTFUtCi0gRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUwotIE9GIFVTRSwgREFUQSwgT1IgIFBST0ZJVFM7IE9SIEJVU0lORVNTICBJTlRFUlJVUFRJT04pICBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSBBTlkgIFRIRU9SWSBPRiBMSUFCSUxJVFksICBXSEVUSEVSICBJTiBDT05UUkFDVCwgIFNUUklDVCBMSUFCSUxJVFksICBPUiBUT1JUCi0gKElOQ0xVRElORyAgTkVHTElHRU5DRSBPUiAgT1RIRVJXSVNFKSBBUklTSU5HIElOICBBTlkgV0FZIE9VVCBPRiBUSEUgIFVTRSBPRgotIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gCi0gVGhpcyBzb2Z0d2FyZSAgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSAgYnkgbWFueSBpbmRpdmlkdWFscwotIG9uICBiZWhhbGYgIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgIEZvdW5kYXRpb24uIEZvciBtb3JlICBpbmZvcm1hdGlvbiBvbiB0aGUKLSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLmJ4ZW5nIGIvdHJ1bmsvbGVnYWwvTElDRU5TRS5ieGVuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMjkxNi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9MSUNFTlNFLmJ4ZW5nCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotVGhlIEJpdGZsdXggRWRpdG9yIFNvZnR3YXJlIExpY2Vuc2UKLQotQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIEJpdGZsdXggR21iSC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKLXdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLXRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUKLWFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZAotdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi1hYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQKLXRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3IKLW90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLTMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvcgotdXNlIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcKLWFja25vd2xlZGdtZW50OiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi1kZXZlbG9wZWQgYnkgQml0Zmx1eCBHbWJIIChodHRwOi8vd3d3LmJpdGZsdXguY2gpIgotCi00LiBUaGUgbmFtZSAiQml0Zmx1eCBFZGl0b3IiIGFuZCAiQml0Zmx1eCIgbXVzdCBub3QgYmUKLXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi1zb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLXBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGVkaXRvckBiaXRmbHV4LmNoCi0KLTUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUKLWNhbGxlZCAiQml0Zmx1eCIgb3IgIkJpdGZsdXggRWRpdG9yIiBub3IgbWF5ICJCaXRmbHV4Igotb3IgIkJpdGZsdXggRWRpdG9yIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIEJpdGZsdXguCi0KLTYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluCi10aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzCi1zb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQml0Zmx1eCBHbWJIIAotKGh0dHA6Ly93d3cuYml0Zmx1eC5jaCkiCi0KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBCaXRmbHV4ICJBUyBJUyIgV0lUSE9VVAotQU5ZIFdBUlJBTlRZIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFRIRQotV0FSUkFOVFkgT0YgTk9OLUlORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQKLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCi1QQVJUSUNVTEFSIFBVUlBPU0UuIEJpdGZsdXggV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkKLURBTUFHRVMgU1VGRkVSRUQgQlkgWU9VIEFTIEEgUkVTVUxUIE9GIFVTSU5HIFRISVMKLVNPRlRXQVJFLiBJTiBOTyBFVkVOVCBXSUxMIEJpdGZsdXggQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBMT1NUCi1QUk9GSVRTIEVWRU4gSUYgQml0Zmx1eCBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgVEhFSVIgT0NDVVJSRU5DRS4gQml0Zmx1eCBXSUxMIE5PVCBCRQotTElBQkxFIEZPUiBBTlkgVEhJUkQgUEFSVFkgQ0xBSU1TIEFHQUlOU1QgWU9VLgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGVnYWwvTElDRU5TRS5mb3JyZXN0IGIvdHJ1bmsvbGVnYWwvTElDRU5TRS5mb3JyZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzc2ZTliLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xlZ2FsL0xJQ0VOU0UuZm9ycmVzdAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAKLSBDb3B5cmlnaHQgKEMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYS0KLSB0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mICBzb3VyY2UgY29kZSBtdXN0ICByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgbm90aWNlLAotICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAKLSAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYgYW55LCBtdXN0Ci0gICAgaW5jbHVkZSAgdGhlIGZvbGxvd2luZyAgYWNrbm93bGVkZ21lbnQ6ICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzICBzb2Z0d2FyZQotICAgIGRldmVsb3BlZCAgYnkgdGhlICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAgICBBbHRlcm5hdGVseSwgdGhpcyAgYWNrbm93bGVkZ21lbnQgbWF5ICBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgIGlmCi0gICAgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAKLSA0LiBUaGUgbmFtZXMgIkFwYWNoZSBGb3JyZXN0IiBhbmQgICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAgbm90IGJlCi0gICAgdXNlZCB0byAgZW5kb3JzZSBvciBwcm9tb3RlICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAKLSA1LiBQcm9kdWN0cyAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCAgYmUgY2FsbGVkICJBcGFjaGUiLCBub3IgbWF5Ci0gICAgIkFwYWNoZSIgYXBwZWFyICBpbiB0aGVpciBuYW1lLCAgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gIG9mIHRoZQotICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIAotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyAgRk9SIEEgUEFSVElDVUxBUiAgUFVSUE9TRSBBUkUgIERJU0NMQUlNRUQuICBJTiBOTyAgRVZFTlQgU0hBTEwgIFRIRQotIEFQQUNIRSBTT0ZUV0FSRSAgRk9VTkRBVElPTiAgT1IgSVRTIENPTlRSSUJVVE9SUyAgQkUgTElBQkxFIEZPUiAgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgREFNQUdFUyAoSU5DTFUtCi0gRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUwotIE9GIFVTRSwgREFUQSwgT1IgIFBST0ZJVFM7IE9SIEJVU0lORVNTICBJTlRFUlJVUFRJT04pICBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSBBTlkgIFRIRU9SWSBPRiBMSUFCSUxJVFksICBXSEVUSEVSICBJTiBDT05UUkFDVCwgIFNUUklDVCBMSUFCSUxJVFksICBPUiBUT1JUCi0gKElOQ0xVRElORyAgTkVHTElHRU5DRSBPUiAgT1RIRVJXSVNFKSBBUklTSU5HIElOICBBTlkgV0FZIE9VVCBPRiBUSEUgIFVTRSBPRgotIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gCi0gVGhpcyBzb2Z0d2FyZSAgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSAgYnkgbWFueSBpbmRpdmlkdWFscwotIG9uIGJlaGFsZiAgb2YgdGhlIEFwYWNoZSAgU29mdHdhcmUgRm91bmRhdGlvbi4gRm9yICBtb3JlIGluZm9ybWF0aW9uICBvbiB0aGUgCi0gQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIAotKi8KZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL0xJQ0VOU0UuamFrYXJ0YS1jb21tb25zIGIvdHJ1bmsvbGVnYWwvTElDRU5TRS5qYWthcnRhLWNvbW1vbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjllYzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvTElDRU5TRS5qYWthcnRhLWNvbW1vbnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIAotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgCi0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIsICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkNvbW1vbnMiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lIHdpdGhvdXQgcHJpb3IgCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLyAKLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLmpha2FydGEtcmVnZXhwIGIvdHJ1bmsvbGVnYWwvTElDRU5TRS5qYWthcnRhLXJlZ2V4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlYTA3NC4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9MSUNFTlNFLmpha2FydGEtcmVnZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiSmFrYXJ0YS1SZWdleHAiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8gCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLmppbmcgYi90cnVuay9sZWdhbC9MSUNFTlNFLmppbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTdkY2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvTElDRU5TRS5qaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjx0aXRsZT5KaW5nIENvcHlpbmcgQ29uZGl0aW9uczwvdGl0bGU+PC9oZWFkPgotPGJvZHk+Ci08aDE+SmluZyBDb3B5aW5nIENvbmRpdGlvbnM8L2gxPgotCi08cD5Db3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQ8YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KLQotPHA+UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6PC9wPgotCi08dWw+Ci0gICAgPGxpPlJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLjwvbGk+Ci0KLSAgICA8bGk+UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICAgZGlzdHJpYnV0aW9uLjwvbGk+Ci0KLSAgICA8bGk+TmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkIG5vcgotICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24uPC9saT4KLTwvdWw+Ci0KLTxwPlRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLVBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLjwvcD4KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLmp0aWR5IGIvdHJ1bmsvbGVnYWwvTElDRU5TRS5qdGlkeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlMzY2Yi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9MSUNFTlNFLmp0aWR5CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotICBKYXZhIEhUTUwgVGlkeSAtIEpUaWR5Ci0gIEhUTUwgcGFyc2VyIGFuZCBwcmV0dHkgcHJpbnRlcgotCi0gIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gKE1hc3NhY2h1c2V0dHMKLSAgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbgotICBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMKLSAgUmVzZXJ2ZWQuCi0KLSAgQ29udHJpYnV0aW5nIEF1dGhvcihzKToKLQotICAgICBEYXZlIFJhZ2dldHQgPGRzckB3My5vcmc+Ci0gICAgIEFuZHkgUXVpY2sgPGFjLnF1aWNrQHN5bXBhdGljby5jYT4gKHRyYW5zbGF0aW9uIHRvIEphdmEpCi0gICAgIEdhcnkgTCBQZXNraW4gPGdhcnlwQGZpcnN0ZWNoLmNvbT4gKEphdmEgZGV2ZWxvcG1lbnQpCi0gICAgIFNhbWkgTGVtcGluZW4gPHNhbWlAbGVtcGluZW4ubmV0PiAgKHJlbGVhc2UgbWFuYWdlbWVudCkKLQotICBUaGUgY29udHJpYnV0aW5nIGF1dGhvcihzKSB3b3VsZCBsaWtlIHRvIHRoYW5rIGFsbCB0aG9zZSB3aG8KLSAgaGVscGVkIHdpdGggdGVzdGluZywgYnVnIGZpeGVzLCBhbmQgcGF0aWVuY2UuICBUaGlzIHdvdWxkbid0Ci0gIGhhdmUgYmVlbiBwb3NzaWJsZSB3aXRob3V0IGFsbCBvZiB5b3UuCi0KLSAgQ09QWVJJR0hUIE5PVElDRToKLSAKLSAgVGhpcyBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBpcyBwcm92aWRlZCAiYXMgaXMsIiBhbmQKLSAgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRpbmcgYXV0aG9yKHMpIG1ha2Ugbm8KLSAgcmVwcmVzZW50YXRpb25zIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nCi0gIGJ1dCBub3QgbGltaXRlZCB0bywgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcwotICBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZSBvciB0aGF0IHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIG9yCi0gIGRvY3VtZW50YXRpb24gd2lsbCBub3QgaW5mcmluZ2UgYW55IHRoaXJkIHBhcnR5IHBhdGVudHMsCi0gIGNvcHlyaWdodHMsIHRyYWRlbWFya3Mgb3Igb3RoZXIgcmlnaHRzLiAKLQotICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dGluZyBhdXRob3Iocykgd2lsbCBub3QgYmUKLSAgbGlhYmxlIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKLSAgYXJpc2luZyBvdXQgb2YgYW55IHVzZSBvZiB0aGUgc29mdHdhcmUgb3IgZG9jdW1lbnRhdGlvbiwgZXZlbiBpZgotICBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZQotICB0aGlzIHNvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGRvY3VtZW50YXRpb24gYW5kIGV4ZWN1dGFibGVzLAotICBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KLSAgMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kIG11c3QKLSAgICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UuCi0gIDMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueQotICAgICBzb3VyY2Ugb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9uLgotIAotICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dGluZyBhdXRob3Iocykgc3BlY2lmaWNhbGx5Ci0gIHBlcm1pdCwgd2l0aG91dCBmZWUsIGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlCi0gIGFzIGEgY29tcG9uZW50IGZvciBzdXBwb3J0aW5nIHRoZSBIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIGluCi0gIGNvbW1lcmNpYWwgcHJvZHVjdHMuIElmIHlvdSB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbiBhIHByb2R1Y3QsCi0gIGFja25vd2xlZGdtZW50IGlzIG5vdCByZXF1aXJlZCBidXQgd291bGQgYmUgYXBwcmVjaWF0ZWQuCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLmp1bml0IGIvdHJ1bmsvbGVnYWwvTElDRU5TRS5qdW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmODg3YS4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9MSUNFTlNFLmp1bml0CisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLQ0KLUlCTSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCANCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgSUJNIFBVQkxJQyANCi1MSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIA0KLVBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4gDQotMS4gREVGSU5JVElPTlMgDQotDQotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6IA0KLSAgYSkgaW4gdGhlIGNhc2Ugb2YgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAoIklCTSIpLCANCi0gIHRoZSBPcmlnaW5hbCBQcm9ncmFtLCBhbmQgDQotICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIENvbnRyaWJ1dG9yLCANCi0gIGkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZA0KLSAgaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsNCi0gIHdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCANCi0gIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uIA0KLSAgJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCANCi0gIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIA0KLSAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgDQotICBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gDQotICB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiANCi0gIHRoZSBQcm9ncmFtLg0KLSJDb250cmlidXRvciIgbWVhbnMgSUJNIGFuZCBhbnkgb3RoZXIgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uIA0KLQ0KLSJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCANCi1hcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIA0KLXdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gDQotIk9yaWdpbmFsIFByb2dyYW0iIG1lYW5zIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSBhY2NvbXBhbnlpbmcgDQotdGhpcyBBZ3JlZW1lbnQgYXMgcmVsZWFzZWQgYnkgSUJNLCBpbmNsdWRpbmcgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlIGFuZCANCi1kb2N1bWVudGF0aW9uLCBpZiBhbnkuIA0KLSJQcm9ncmFtIiBtZWFucyB0aGUgT3JpZ2luYWwgUHJvZ3JhbSBhbmQgQ29udHJpYnV0aW9ucy4gDQotIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgDQotaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuIA0KLTIuIEdSQU5UIE9GIFJJR0hUUyANCi0gIGEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSANCi0gIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgDQotICBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCANCi0gIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIA0KLSAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIA0KLSAgb2JqZWN0IGNvZGUgZm9ybS4NCi0gIGIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSANCi0gIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSANCi0gIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIA0KLSAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiANCi0gIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSANCi0gIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgDQotICBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSANCi0gIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCANCi0gIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyANCi0gIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIA0KLSAgaGVyZXVuZGVyLiANCi0gIGMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSANCi0gIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIA0KLSAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIA0KLSAgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCANCi0gIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgDQotICBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIA0KLSAgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIA0KLSAgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gDQotICBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciANCi0gIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IA0KLSAgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSANCi0gIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLg0KLSAgZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCANCi0gIGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IA0KLSAgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIA0KLTMuIFJFUVVJUkVNRU5UUyANCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIA0KLXVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6IA0KLSAgYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZA0KLSAgYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50Og0KLSAgaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIA0KLSAgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgDQotICBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIA0KLSAgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgDQotICBpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgDQotICBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgDQotICBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyANCi0gIGlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIA0KLSAgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQNCi0gIGl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCANCi0gIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgDQotICBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4NCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06IA0KLSAgYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIA0KLSAgYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIA0KLSAgUHJvZ3JhbS4gDQotRWFjaCBDb250cmlidXRvciBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbiBhIGNvbnNwaWN1b3VzIGxvY2F0aW9uIGluIA0KLXRoZSBQcm9ncmFtOiANCi0gIENvcHlyaWdodCCpIHtkYXRlIGhlcmV9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCANCi0gIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gDQotSW4gYWRkaXRpb24sIGVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgDQotaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgDQotUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiANCi00LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTiANCi1Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyANCi13aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgDQotbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIA0KLUNvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyANCi1zaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIA0KLW90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgDQotY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIA0KLWhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgDQotKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgDQotKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIA0KLWFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIA0KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgDQotaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QgDQotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgDQotTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgDQotaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSANCi1wcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgDQotYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSANCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCANCi1uZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggDQotY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLiANCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCANCi1wcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgDQotQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgDQotb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgDQotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIA0KLXRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIA0KLWFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgDQotd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgDQotZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4gDQotNS4gTk8gV0FSUkFOVFkgDQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIA0KLU9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgDQotRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiANCi1DT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSANCi1QQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgDQotdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCANCi1yaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgDQotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCANCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciANCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gDQotNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkgDQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgDQotQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIA0KLUlOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgDQotV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIA0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIA0KLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIA0KLU9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIA0KLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gDQotNy4gR0VORVJBTCANCi1JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciANCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIA0KLXJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IA0KLXRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IA0KLW5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4gDQotSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggDQotcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciANCi1jb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCANCi1Db250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgDQotdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbiBhZGRpdGlvbiwgSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgDQotcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciANCi1jb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIA0KLWNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgDQotc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciANCi1TZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gDQotQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gDQotY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCANCi1kb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgDQotYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgDQotQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgDQotUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIA0KLW9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgDQotcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIA0KLUlCTSBtYXkgcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gDQotdGltZSB0byB0aW1lLiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIA0KLWRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSANCi1hbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIA0KLWl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyANCi1wdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIA0KLUNvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gTm8gb25lIG90aGVyIHRoYW4gSUJNIGhhcyB0aGUgcmlnaHQgDQotdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCANCi0yKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgDQotcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgDQotaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgDQotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiANCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSANCi1pbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byANCi10aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiANCi1vbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIA0KLWEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uIA0KZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL0xJQ0VOU0UubG9na2l0IGIvdHJ1bmsvbGVnYWwvTElDRU5TRS5sb2draXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjA1NjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvTElDRU5TRS5sb2draXQKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gCi0gQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYS0KLSB0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mICBzb3VyY2UgY29kZSBtdXN0ICByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgbm90aWNlLAotICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAKLSAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYgYW55LCBtdXN0Ci0gICAgaW5jbHVkZSAgdGhlIGZvbGxvd2luZyAgYWNrbm93bGVkZ21lbnQ6ICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzICBzb2Z0d2FyZQotICAgIGRldmVsb3BlZCAgYnkgdGhlICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAgICBBbHRlcm5hdGVseSwgdGhpcyAgYWNrbm93bGVkZ21lbnQgbWF5ICBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgIGlmCi0gICAgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAKLSA0LiBUaGUgbmFtZXMgIkxvZ0tpdCIsICJKYWthcnRhIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiAgbXVzdCBub3QgCi0gICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gCi0gNS4gUHJvZHVjdHMgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgIGJlIGNhbGxlZCAiQXBhY2hlIiwgbm9yIG1heQotICAgICJBcGFjaGUiIGFwcGVhciAgaW4gdGhlaXIgbmFtZSwgIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uICBvZiB0aGUKLSAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAKLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgIEZPUiBBIFBBUlRJQ1VMQVIgIFBVUlBPU0UgQVJFICBESVNDTEFJTUVELiAgSU4gTk8gIEVWRU5UIFNIQUxMICBUSEUKLSBBUEFDSEUgU09GVFdBUkUgIEZPVU5EQVRJT04gIE9SIElUUyBDT05UUklCVVRPUlMgIEJFIExJQUJMRSBGT1IgIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgIERBTUFHRVMgKElOQ0xVLQotIERJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKLSBPRiBVU0UsIERBVEEsIE9SICBQUk9GSVRTOyBPUiBCVVNJTkVTUyAgSU5URVJSVVBUSU9OKSAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gQU5ZICBUSEVPUlkgT0YgTElBQklMSVRZLCAgV0hFVEhFUiAgSU4gQ09OVFJBQ1QsICBTVFJJQ1QgTElBQklMSVRZLCAgT1IgVE9SVAotIChJTkNMVURJTkcgIE5FR0xJR0VOQ0UgT1IgIE9USEVSV0lTRSkgQVJJU0lORyBJTiAgQU5ZIFdBWSBPVVQgT0YgVEhFICBVU0UgT0YKLSBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIAotIFRoaXMgc29mdHdhcmUgIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgIGJ5IG1hbnkgaW5kaXZpZHVhbHMKLSBvbiAgYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgIEZvdW5kYXRpb24gYW5kIHdhcyAgb3JpZ2luYWxseSBjcmVhdGVkIGJ5Ci0gU3RlZmFubyBNYXp6b2NjaGkgIDxzdGVmYW5vQGFwYWNoZS5vcmc+LiBGb3IgbW9yZSAgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSAKLSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAKLSovCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLnF1YXJ0eiBiL3RydW5rL2xlZ2FsL0xJQ0VOU0UucXVhcnR6CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzhkYjgwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xlZ2FsL0xJQ0VOU0UucXVhcnR6CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIEFsbCBzb3VyY2UgY29kZSwgYmluYXJpZXMsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIGRpc3RyaWJ1dGVkCi0gKiB3aXRoIFF1YXJ0eiBFbnRlcnByaXNlIEpvYiBTY2hlZHVsZXIgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyAKLSAqIGxpY2Vuc2UgdGVybXMsIGFuZCBhcmUgaGVsZCB1bmRlciB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2UsIAotICogdW5sZXNzIG90aGVyd2lzZSBub3RlZCB3aXRoaW4gdGhlIGluZGl2aWR1YWwgZmlsZXMuCi0gKgotICovCi0KLQotLyoKLSAqICBDb3B5cmlnaHQgSmFtZXMgSG91c2UgKGMpIDIwMDEtMjAwMwotICoKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCi0gKiBUaGlzIHByb2R1Y3QgdXNlcyBhbmQgaW5jbHVkZXMgd2l0aGluIGl0cyBkaXN0cmlidXRpb24sIAotICogc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAKLSAqICAgICAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykKLSAqCi0gKi8KZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL0xJQ0VOU0UucmVzb2x2ZXIgYi90cnVuay9sZWdhbC9MSUNFTlNFLnJlc29sdmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWY2MDMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xlZ2FsL0xJQ0VOU0UucmVzb2x2ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLnNlcnZsZXQgYi90cnVuay9sZWdhbC9MSUNFTlNFLnNlcnZsZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYWNlODMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvTElDRU5TRS5zZXJ2bGV0CisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvdXJjZSBjb2RlIGltcGxlbWVudHMgc3BlY2lmaWNhdGlvbnMgZGVmaW5lZCBieSB0aGUgSmF2YQotICogQ29tbXVuaXR5IFByb2Nlc3MuIEluIG9yZGVyIHRvIHJlbWFpbiBjb21wbGlhbnQgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbgotICogRE8gTk9UIGFkZCAvIGNoYW5nZSAvIG9yIGRlbGV0ZSBtZXRob2Qgc2lnbmF0dXJlcyEKLSAqLyAKZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL0xJQ0VOU0Uud2Vic3BoaW54IGIvdHJ1bmsvbGVnYWwvTElDRU5TRS53ZWJzcGhpbngKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmMyODkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvTElDRU5TRS53ZWJzcGhpbngKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogV2ViU3BoaW54IHdlYi1jcmF3bGluZyB0b29sa2l0Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWQotICogTk9SIElUUyBFTVBMT1lFRVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLnhhbGFuIGIvdHJ1bmsvbGVnYWwvTElDRU5TRS54YWxhbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExNTZhNi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9MSUNFTlNFLnhhbGFuCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGVnYWwvTElDRU5TRS54ZXJjZXMgYi90cnVuay9sZWdhbC9MSUNFTlNFLnhlcmNlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM3MDg3Yy4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9MSUNFTlNFLnhlcmNlcworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYZXJjZXMiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBJbnRlcm5hdGlvbmFsCi0gKiBCdXNpbmVzcyBNYWNoaW5lcywgSW5jLiwgaHR0cDovL3d3dy5pYm0uY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9MSUNFTlNFLnhtbC1hcGlzIGIvdHJ1bmsvbGVnYWwvTElDRU5TRS54bWwtYXBpcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMTQ1Zi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9MSUNFTlNFLnhtbC1hcGlzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0KLXhtbC1hcGlzIGlzIGNvdmVyZWQgYnkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotCi1GSVhNRTogUHV0IGxpY2Vuc2UgdGV4dCBpbiBoZXJlIG9uY2UgaXQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgICAgaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL3htbC1jb21tb25zLwpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGVnYWwvYW50LWNvbnRyaWItMC42Lmphci5saWNlbnNlLnR4dCBiL3RydW5rL2xlZ2FsL2FudC1jb250cmliLTAuNi5qYXIubGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOGMyZmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvYW50LWNvbnRyaWItMC42Lmphci5saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgQW50LUNvbnRyaWIgcHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgotICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIAotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAotICogICAgICAgIEFudC1Db250cmliIHByb2plY3QgKGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYW50LWNvbnRyaWIpLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWUgQW50LUNvbnRyaWIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgCi0gKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhbnQtY29udHJpYi1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldC4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQW50LUNvbnRyaWIiCi0gKiAgICBub3IgbWF5ICJBbnQtQ29udHJpYiIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQW50LUNvbnRyaWIgcHJvamVjdC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQU5ULUNPTlRSSUIgUFJPSkVDVCBPUiBJVFMKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9hbnQtanVuaXQuamFyLmxpY2Vuc2UudHh0IGIvdHJ1bmsvbGVnYWwvYW50LWp1bml0Lmphci5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyMGQ0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9hbnQtanVuaXQuamFyLmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotICoKLSAqICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0gKgotICogICAxLiBEZWZpbml0aW9ucy4KLSAqCi0gKiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gKiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotICoKLSAqICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotICoKLSAqICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gKiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gKiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAqICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLSAqCi0gKiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAqICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gKiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0gKgotICogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gKiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAqICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotICoKLSAqICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAqICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAqICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLSAqCi0gKiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAqICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gKiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gKiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gKiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0gKgotICogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gKiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gKiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAqICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAqICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAqICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0gKgotICogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAqICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0gKgotICogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAqICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gKiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0gKgotICogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAqICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gKiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gKiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gKiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAqICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAqICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAqICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gKiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0gKgotICogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAqICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAqICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLSAqCi0gKiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAqICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotICoKLSAqICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gKiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gKiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotICoKLSAqICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gKiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gKiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAqICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gKiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gKiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gKiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAqICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAqICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gKiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gKiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAqICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLSAqCi0gKiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gKiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAqICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gKiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotICoKLSAqICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAqICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gKiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAqICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAqICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotICoKLSAqICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gKiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLSAqCi0gKiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gKiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAqICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAqICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAqICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gKiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAqICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAqICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAqICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAqICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gKiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gKiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAqICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICoKLSAqICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gKiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gKiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotICoKLSAqICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0gKgotICogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0gKgotICogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gKiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gKiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gKiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0gKgotICogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGVnYWwvYW50LWxhdW5jaGVyLmphci5saWNlbnNlLnR4dCBiL3RydW5rL2xlZ2FsL2FudC1sYXVuY2hlci5qYXIubGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MjBkNGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvYW50LWxhdW5jaGVyLmphci5saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLSAqCi0gKiAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotICoKLSAqICAgMS4gRGVmaW5pdGlvbnMuCi0gKgotICogICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICogICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLSAqCi0gKiAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gKiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLSAqCi0gKiAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAqICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICogICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICogICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAqICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAqICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gKiAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0gKgotICogICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gKiAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0gKgotICogICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAqICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICogICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotICoKLSAqICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAqICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICogICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gKiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLSAqCi0gKiAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gKiAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAqICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gKiAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0gKgotICogICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gKiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAqICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICogICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICogICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAqICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICogICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotICoKLSAqICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAqICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICogICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAqICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICogICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gKiAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAqICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAqICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAqICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAqICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gKiAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gKiAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotICoKLSAqICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAqICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gKiAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotICoKLSAqICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gKiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAqICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAqICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gKiAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICogICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotICoKLSAqICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gKiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAqICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAqICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gKiAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICogICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICogICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICogICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gKiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gKiAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gKiAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAqICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAqICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICogICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAqICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotICoKLSAqICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAqICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gKiAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gKiAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAqICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0gKgotICogICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gKiAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLSAqCi0gKiAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICogICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICogICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAqICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAqICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLSAqCi0gKiAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICogICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICogICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gKiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAqICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICogICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAqICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAqICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICogICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICogICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gKiAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gKiAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICogICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAqICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICogICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gKiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0gKgotICogICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAqICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICogICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gKiAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICogICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAqICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAqICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gKiAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gKiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICogICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gKiAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gKiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLSAqCi0gKiAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAqICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICogICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAqICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0gKgotICogICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAqICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICogICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gKiAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gKiAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAqICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gKiAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICogICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0gKgotICogICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAqICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gKiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gKiAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gKiAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAqICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gKiAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAqICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICogICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICogICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gKiAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqCi0gKiAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAqICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAqICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAqICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAqICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAqICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAqICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICogICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAqICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICogICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLSAqCi0gKiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotICoKLSAqICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotICoKLSAqICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICogICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICogICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICogICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAqICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICogICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAqICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotICoKLSAqICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL2FudC10cmF4Lmphci5saWNlbnNlLnR4dCBiL3RydW5rL2xlZ2FsL2FudC10cmF4Lmphci5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyMGQ0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9hbnQtdHJheC5qYXIubGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICogICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0gKgotICogICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLSAqCi0gKiAgIDEuIERlZmluaXRpb25zLgotICoKLSAqICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAqICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0gKgotICogICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0gKgotICogICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gKiAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAqICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAqICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gKiAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gKiAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICogICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotICoKLSAqICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICogICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotICoKLSAqICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gKiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAqICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLSAqCi0gKiAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gKiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAqICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICogICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0gKgotICogICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICogICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gKiAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICogICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotICoKLSAqICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICogICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gKiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAqICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAqICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gKiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAqICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLSAqCi0gKiAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gKiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAqICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gKiAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAqICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gKiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICogICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gKiAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gKiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gKiAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gKiAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICogICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICogICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLSAqCi0gKiAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gKiAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICogICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLSAqCi0gKiAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICogICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gKiAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gKiAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICogICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAqICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLSAqCi0gKiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICogICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gKiAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gKiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICogICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAqICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAqICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAqICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICogICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICogICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICogICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gKiAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gKiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAqICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gKiAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLSAqCi0gKiAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gKiAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICogICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICogICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gKiAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotICoKLSAqICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICogICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0gKgotICogICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAqICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAqICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gKiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gKiAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0gKgotICogICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAqICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAqICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICogICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gKiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAqICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gKiAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gKiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAqICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAqICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICogICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICogICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAqICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gKiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAqICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICogICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotICoKLSAqICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gKiAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAqICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICogICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAqICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gKiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0gKgotICogICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gKiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICogICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICogICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAqICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICogICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICogICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0gKgotICogICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gKiAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAqICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gKiAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotICoKLSAqICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gKiAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAqICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICogICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICogICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gKiAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICogICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAqICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotICoKLSAqICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gKiAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICogICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICogICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICogICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gKiAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICogICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gKiAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAqICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAqICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICogICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKgotICogICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gKiAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gKiAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gKiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gKiAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gKiAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gKiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAqICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gKiAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAqICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0gKgotICogICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLSAqCi0gKiAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLSAqCi0gKiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gKiAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAqICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAqICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gKiAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAqICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gKiAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLSAqCi0gKiAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9hbnQuamFyLmxpY2Vuc2UudHh0IGIvdHJ1bmsvbGVnYWwvYW50Lmphci5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyMGQ0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9hbnQuamFyLmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotICoKLSAqICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0gKgotICogICAxLiBEZWZpbml0aW9ucy4KLSAqCi0gKiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gKiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotICoKLSAqICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotICoKLSAqICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gKiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gKiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAqICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLSAqCi0gKiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAqICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gKiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0gKgotICogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gKiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAqICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotICoKLSAqICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAqICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAqICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLSAqCi0gKiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAqICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gKiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gKiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gKiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0gKgotICogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gKiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gKiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAqICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAqICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAqICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0gKgotICogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAqICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0gKgotICogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAqICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gKiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0gKgotICogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAqICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gKiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gKiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gKiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAqICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAqICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAqICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gKiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0gKgotICogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAqICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAqICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLSAqCi0gKiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAqICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotICoKLSAqICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gKiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gKiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotICoKLSAqICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gKiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gKiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAqICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gKiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gKiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gKiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAqICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAqICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gKiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gKiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAqICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLSAqCi0gKiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gKiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAqICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gKiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotICoKLSAqICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAqICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gKiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAqICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAqICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotICoKLSAqICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gKiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLSAqCi0gKiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gKiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAqICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAqICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAqICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gKiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAqICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAqICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAqICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAqICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gKiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gKiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAqICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICoKLSAqICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gKiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gKiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotICoKLSAqICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0gKgotICogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0gKgotICogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gKiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gKiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gKiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0gKgotICogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGVnYWwvY29tbW9ucy1jbGktMS4wLmphci5saWNlbnNlLnR4dCBiL3RydW5rL2xlZ2FsL2NvbW1vbnMtY2xpLTEuMC5qYXIubGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODhhOTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvY29tbW9ucy1jbGktMS4wLmphci5saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9jb21tb25zLWxvZ2dpbmcuamFyLmxpY2Vuc2UudHh0IGIvdHJ1bmsvbGVnYWwvY29tbW9ucy1sb2dnaW5nLmphci5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4OGE5Mi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9jb21tb25zLWxvZ2dpbmcuamFyLmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL2hvd2wuamFyLmxpY2Vuc2UuaHRtbCBiL3RydW5rL2xlZ2FsL2hvd2wuamFyLmxpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZTI1My4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9ob3dsLmphci5saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSIKLUhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxc3QgSnVseSAyMDAzKSwgc2VlIHd3dy53My5vcmciPgotPHRpdGxlPkJTRC1zdHlsZSBMaWNlbnNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMxRjAwRkYiIGFsaW5rPSIKLSNGRjAwMDAiIHZsaW5rPSIjOTkwMEREIj4KLTxoMT5CU0Qtc3R5bGUgTGljZW5zZTwvaDE+Ci08aHI+Ci08cD5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi13aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLWNvbmRpdGlvbnMgYXJlIG1ldDo8L3A+Ci08cD4tUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci48L3A+Ci08cD4tUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLWRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotd2l0aCB0aGUgZGlzdHJpYnV0aW9uLjwvcD4KLQotPHA+VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi1DT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi1ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAotT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQotVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFLjwvcD4KLTxocj4KLTxwPlVwZGF0ZWQ6IDwhLS0gaGhtdHMgc3RhcnQgLS0+Ci0gOSBEZWMgMjAwMyBqb3RtIDwhLS0gaGhtdHMgZW5kIC0tPjwvcD4KLTxocj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9qYWFzLTUuMS40Lmphci5saWNlbnNlLnR4dCBiL3RydW5rL2xlZ2FsL2phYXMtNS4xLjQuamFyLmxpY2Vuc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjFlZWI5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2xlZ2FsL2phYXMtNS4xLjQuamFyLmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGVnYWwvamV0dHkucGx1cy01LjEuNC5qYXIubGljZW5zZS50eHQgYi90cnVuay9sZWdhbC9qZXR0eS5wbHVzLTUuMS40Lmphci5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxZWViOS4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9qZXR0eS5wbHVzLTUuMS40Lmphci5saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL2pvdG0uamFyLmxpY2Vuc2UuaHRtbCBiL3RydW5rL2xlZ2FsL2pvdG0uamFyLmxpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZTI1My4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9qb3RtLmphci5saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSIKLUhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxc3QgSnVseSAyMDAzKSwgc2VlIHd3dy53My5vcmciPgotPHRpdGxlPkJTRC1zdHlsZSBMaWNlbnNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMxRjAwRkYiIGFsaW5rPSIKLSNGRjAwMDAiIHZsaW5rPSIjOTkwMEREIj4KLTxoMT5CU0Qtc3R5bGUgTGljZW5zZTwvaDE+Ci08aHI+Ci08cD5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi13aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLWNvbmRpdGlvbnMgYXJlIG1ldDo8L3A+Ci08cD4tUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci48L3A+Ci08cD4tUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLWRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotd2l0aCB0aGUgZGlzdHJpYnV0aW9uLjwvcD4KLQotPHA+VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi1DT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi1ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAotT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQotVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFLjwvcD4KLTxocj4KLTxwPlVwZGF0ZWQ6IDwhLS0gaGhtdHMgc3RhcnQgLS0+Ci0gOSBEZWMgMjAwMyBqb3RtIDwhLS0gaGhtdHMgZW5kIC0tPjwvcD4KLTxocj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9rdXB1LmxpY2Vuc2UudHh0IGIvdHJ1bmsvbGVnYWwva3VwdS5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0Njk1Zi4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9rdXB1LmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIEt1cHUgQ29udHJpYnV0b3JzCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLQotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgS3VwdSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5Ci0gICAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICAgICAgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1PV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9sb2c0ai5qYXIubGljZW5zZS50eHQgYi90cnVuay9sZWdhbC9sb2c0ai5qYXIubGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTI2MzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwvbG9nNGouamFyLmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC9uZWtvLmxpY2Vuc2UudHh0IGIvdHJ1bmsvbGVnYWwvbmVrby5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwZjYyOS4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC9uZWtvLmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotVGhlIEN5YmVyTmVrbyBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMAotCi0gCi0oQykgQ29weXJpZ2h0IDIwMDIsIEFuZHkgQ2xhcmsuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBBbmR5IENsYXJrLiIKLSAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0KLTQuIFRoZSBuYW1lcyAiQ3liZXJOZWtvIiBhbmQgIk5la29IVE1MIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2UKLSAgIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciAKLSAgIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gICBhbmR5QGN5YmVybmVrby5uZXQuCi0KLTUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJOZWtvSFRNTCIsCi0gICBub3IgbWF5ICJOZWtvSFRNTCIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbiBvZiB0aGUgYXV0aG9yLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi1XQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLURJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIE9USEVSIENPTlRSSUJVVE9SUwotQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCAKLU9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAotT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIAotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCAKLUVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgbGljZW5zZSBpcyBiYXNlZCBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIHZlcnNpb24gMS4xLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL3hpbmRpY2UtMS4xLmphci5saWNlbnNlLnR4dCBiL3RydW5rL2xlZ2FsL3hpbmRpY2UtMS4xLmphci5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxZWViOS4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC94aW5kaWNlLTEuMS5qYXIubGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS90cnVuay9sZWdhbC94bWxkYi1jb21tb24tMjAwMzA3MDEuamFyLmxpY2Vuc2UudHh0IGIvdHJ1bmsvbGVnYWwveG1sZGItY29tbW9uLTIwMDMwNzAxLmphci5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmNWI3OC4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC94bWxkYi1jb21tb24tMjAwMzA3MDEuamFyLmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotCi0gICBUaGUgWE1MOkRCIEluaXRpYXRpdmUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAKLSAKLSAKLSAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIFhNTDpEQiBJbml0aWF0aXZlLiAgQWxsIHJpZ2h0cwotICByZXNlcnZlZC4KLSAKLSAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICBhcmUgbWV0OgotIAotICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICAgIGRpc3RyaWJ1dGlvbi4KLSAKLSAgMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgICAgWE1MOkRCIEluaXRpYXRpdmUgKGh0dHA6Ly93d3cueG1sZGIub3JnLykuIgotICAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gCi0gIDQuIFRoZSBuYW1lICJYTUw6REIgSW5pdGlhdGl2ZSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yCi0gICAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AeG1sZGIub3JnLgotIAotICA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiWE1MOkRCIiwKLSAgICAgbm9yIG1heSAiWE1MOkRCIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgIHBlcm1pc3Npb24gb2YgdGhlIFhNTDpEQiBJbml0aWF0aXZlLgotIAotICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICBTVUNIIERBTUFHRS4KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAKLSAgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBYTUw6REIgSW5pdGlhdGl2ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLSAgb24gdGhlIFhNTDpEQiBJbml0aWF0aXZlLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LnhtbGRiLm9yZy8+LgotIApkaWZmIC0tZ2l0IGEvdHJ1bmsvbGVnYWwveG1sZGIteHVwZGF0ZS0yMDA0MDIwNS5qYXIubGljZW5zZS50eHQgYi90cnVuay9sZWdhbC94bWxkYi14dXBkYXRlLTIwMDQwMjA1Lmphci5saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmNWI3OC4uMDAwMDAwMAotLS0gYS90cnVuay9sZWdhbC94bWxkYi14dXBkYXRlLTIwMDQwMjA1Lmphci5saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQotICAgVGhlIFhNTDpEQiBJbml0aWF0aXZlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wCi0gCi0gCi0gIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBYTUw6REIgSW5pdGlhdGl2ZS4gIEFsbCByaWdodHMKLSAgcmVzZXJ2ZWQuCi0gCi0gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAgYXJlIG1ldDoKLSAKLSAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIAotICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgICBkaXN0cmlidXRpb24uCi0gCi0gIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgICAgIFhNTDpEQiBJbml0aWF0aXZlIChodHRwOi8vd3d3LnhtbGRiLm9yZy8pLiIKLSAgICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotIAotICA0LiBUaGUgbmFtZSAiWE1MOkRCIEluaXRpYXRpdmUiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvcgotICAgICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHhtbGRiLm9yZy4KLSAKLSAgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIlhNTDpEQiIsCi0gICAgIG5vciBtYXkgIlhNTDpEQiIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgICBwZXJtaXNzaW9uIG9mIHRoZSBYTUw6REIgSW5pdGlhdGl2ZS4KLSAKLSAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAgU1VDSCBEQU1BR0UuCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gCi0gIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgWE1MOkRCIEluaXRpYXRpdmUuIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gIG9uIHRoZSBYTUw6REIgSW5pdGlhdGl2ZSwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy54bWxkYi5vcmcvPi4KLSAKZGlmZiAtLWdpdCBhL3RydW5rL2xlZ2FsL3htbHVuaXQxLjAuamFyLmxpY2Vuc2UudHh0IGIvdHJ1bmsvbGVnYWwveG1sdW5pdDEuMC5qYXIubGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTQzOWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVnYWwveG1sdW5pdDEuMC5qYXIubGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Db3B5cmlnaHQgKGMpIDIwMDEsIEplZmYgTWFydGluLCBUaW0gQmFjb24KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgeG1sdW5pdC5zb3VyY2Vmb3JnZS5uZXQgbm9yIHRoZSBuYW1lcwotICAgICAgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi1GT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKLUJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLUxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLUNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KLUFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KZGlmZiAtLWdpdCBhL3RydW5rL2xlbnlhLmJhdCBiL3RydW5rL2xlbnlhLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5OGUxNS4uMDAwMDAwMAotLS0gYS90cnVuay9sZW55YS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotOjogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi06OiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLTo6IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLTo6IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi06OiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotOjogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTo6Ci06OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi06OgotOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUBlY2hvIG9mZgotOjogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTo6IExlbnlhIFdpbjMyIFNoZWxsIFNjcmlwdAotOjoKLTo6ICRJZCQKLTo6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTo6IENvbmZpZ3VyYXRpb24gdmFyaWFibGVzCi06OgotOjogTEVOWUFfSE9NRQotOjogICBGb2xkZXIgdGhhdCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIExlbnlhIGRpc3RyaWJ1dGlvbgotOjoKLTo6IExFTllBX0xJQgotOjogICBGb2xkZXIgY29udGFpbmluZyBhbGwgdGhlIGxpYnJhcnkgZmlsZXMgbmVlZGVkIGJ5IHRoZSBMZW55YSBDTEkKLTo6Ci06OiBKQVZBX0hPTUUKLTo6ICAgSG9tZSBvZiBKYXZhIGluc3RhbGxhdGlvbi4KLTo6Ci06OiBKQVZBX09QVElPTlMKLTo6ICAgRXh0cmEgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBKVk0KLTo6Ci06OiBKQVZBX0RFQlVHX1BPUlQKLTo6ICAgVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBKVk0gZGVidWcgc2VydmVyIHNob3VsZCBsaXN0ZW4gdG8KLTo6Ci06OiBKRVRUWV9QT1JUCi06OiAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHBvcnQgZm9yIEpldHR5Ci06OgotOjogSkVUVFlfQURNSU5fUE9SVAotOjogICBUaGUgcG9ydCB3aGVyZSB0aGUgamV0dHkgd2ViIGFkbWluaXN0cmF0aW9uIHNob3VsZCBiaW5kCi06OgotOjogSkVUVFlfV0VCQVBQCi06OiAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHdlYmFwcCB0aGF0IGpldHR5IGhhcyB0byBleGVjdXRlIGlzIGxvY2F0ZWQKLTo6Ci0KLTo6IC0tLS0tIFZlcmlmeSBhbmQgU2V0IFJlcXVpcmVkIEVudmlyb25tZW50IFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gZ290SmF2YUhvbWUKLWVjaG8gWW91IG11c3Qgc2V0IEpBVkFfSE9NRSB0byBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbgotZ290byBlbmQKLTpnb3RKYXZhSG9tZQotCi06OiAtLS0tLSBDaGVjayBTeXN0ZW0gUHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pZiBub3QgIiVFWEVDJSIgPT0gIiIgZ290byBnb3RFeGVjCi1pZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIG5vRXhlY05UCi1zZXQgRVhFQz1zdGFydCAiQXBhY2hlIExlbnlhIiAvRC4gL01BWAotZ290byBnb3RFeGVjCi06bm9FeGVjTlQKLXNldCBFWEVDPQotOmdvdEV4ZWMKLQotc2V0IExFTllBX0hPTUU9LgotOjogZWNobyBsZW55YS5iYXQ6IHVzaW5nICVMRU5ZQV9IT01FJSBhcyBob21lCi0KLXNldCBMRU5ZQV9MSUI9JUxFTllBX0hPTUUlXGJ1aWxkXGxlbnlhXHdlYmFwcFxXRUItSU5GXGxpYgotOjogZWNobyBsZW55YS5iYXQ6IHVzaW5nICVMRU5ZQV9MSUIlIGFzIGxpYgotCi1zZXQgSkVUVFlfUE9SVD04ODg4Ci0KLXNldCBKRVRUWV9BRE1JTl9QT1JUPTg4ODkKLXNldCBKRVRUWV9VUklfQ0hBUlNFVD1JU08tODg1OS0xCi1zZXQgSkVUVFlfV0VCQVBQPSVMRU5ZQV9IT01FJVxidWlsZFxsZW55YVx3ZWJhcHAKLTo6IGVjaG8gbGVueWEuYmF0OiB1c2luZyAlSkVUVFlfV0VCQVBQJSBhcyB0aGUgd2ViYXBwIGRpcmVjdG9yeQotCi1zZXQgSkFWQV9ERUJVR19QT1JUPTgwMDAKLQotOjogLS0tLS0gU2V0IFVwIFRoZSBDbGFzc3BhdGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc2V0IENQPSVMRU5ZQV9IT01FJVx0b29sc1xsb2FkZXIKLQotOjogLS0tLS0gVW5wYWNrIFdBUiBmaWxlIGlmIG5lZWRlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pZiBleGlzdCBidWlsZFxsZW55YVx3ZWJhcHAgZ290byBhY3Rpb24KLQotZWNobyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVjaG8gICAgICAgICMgICBGaXJzdCBzdGFydCBvZiBMZW55YS4gVW5wYWNraW5nIG5vdy4uLiAgICAjCi1lY2hvICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1ta2RpciBidWlsZFxsZW55YVx3ZWJhcHAKLWNkIGJ1aWxkXGxlbnlhXHdlYmFwcAotIiVKQVZBX0hPTUUlXGJpblxqYXIuZXhlIiAteGYgLi5cLi5cLi5cbGVueWEud2FyCi1jZCAuLlwuLlwuLgotbWtkaXIgYnVpbGRcbGVueWFcd2ViYXBwXFdFQi1JTkZcbG9ncwotCi06OiAtLS0tLSBDaGVjayBhY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOmFjdGlvbgotaWYgIiIlMSIiID09ICIiY2xpIiIgZ290byBkb0NsaQotaWYgIiIlMSIiID09ICIic2VydmxldCIiIGdvdG8gZG9TZXJ2bGV0Ci1pZiAiIiUxIiIgPT0gIiJzZXJ2bGV0LWFkbWluIiIgZ290byBkb0FkbWluCi1pZiAiIiUxIiIgPT0gIiJzZXJ2bGV0LWRlYnVnIiIgZ290byBkb0RlYnVnCi1JRiAiIiUxIiIgPT0gIiJzZXJ2bGV0LXByb2ZpbGUiIiBnb3RvIGRvUHJvZmlsZQotZ290byBkb1NlcnZsZXQKLQotZWNobyBVc2FnZTogbGVueWEgKGFjdGlvbikKLWVjaG8gYWN0aW9uczoKLWVjaG8gICBjbGkgICAgICAgICAgICAgUnVuIExlbnlhIGZyb20gY29tbWFuZCBsaW5lCi1lY2hvICAgc2VydmxldCAgICAgICAgIFJ1biBMZW55YSBpbiBhIHNlcnZsZXQgY29udGFpbmVyCi1lY2hvICAgc2VydmxldC1hZG1pbiAgIFJ1biBMZW55YSBpbiBhIHNlcnZsZXQgY29udGFpbmVyIGFuZCB0dXJuIGNvbnRhaW5lciB3ZWIgYWRtaW5pc3RyYXRpb24gb24KLWVjaG8gICBzZXJ2bGV0LWRlYnVnICAgUnVuIExlbnlhIGluIGEgc2VydmxldCBjb250YWluZXIgYW5kIHR1cm4gb24gcmVtb3RlIEpWTSBkZWJ1ZwotZWNobyAgIHNlcnZsZXQtcHJvZmlsZSBSdW4gTGVueWEgaW4gYSBzZXJ2bGV0IGNvbnRhaW5lciBhbmQgdHVybiBvbiBKVk0gcHJvZmlsaW5nCi1nb3RvIGVuZAotCi06OiAtLS0tLSBDbGkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi06ZG9DbGkKLXNldCBwYXJhbT0KLXNoaWZ0Ci06Y2xpTG9vcAotaWYgIiUxIj09IiIgZ290byBjbGlMb29wRW5kCi1pZiBub3QgIiUxIj09IiIgc2V0IHBhcmFtPSVwYXJhbSUgJTEKLXNoaWZ0Ci1nb3RvIGNsaUxvb3AKLQotOmNsaUxvb3BFbmQKLQotIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgJUpBVkFfT1BUSU9OUyUgLWNsYXNzcGF0aCAlQ1AlIC1EamF2YS5lbmRvcnNlZC5kaXJzPSVMRU5ZQV9MSUIlXGVuZG9yc2VkIC1EbG9hZGVyLmphci5yZXBvc2l0b3JpZXM9JUxFTllBX0xJQiUgLURsb2FkZXIubWFpbi5jbGFzcz1vcmcuYXBhY2hlLmNvY29vbi5NYWluIExvYWRlciAlcGFyYW0lCi1nb3RvIGVuZAotCi06OiAtLS0tLSBTZXJ2bGV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi06ZG9TZXJ2bGV0Ci0lRVhFQyUgIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgJUpBVkFfT1BUSU9OUyUgLWNsYXNzcGF0aCAlQ1AlIC1EamF2YS5lbmRvcnNlZC5kaXJzPSVMRU5ZQV9MSUIlXGVuZG9yc2VkIC1Ed2ViYXBwPSVKRVRUWV9XRUJBUFAlIC1Eb3JnLnhtbC5zYXgucGFyc2VyPW9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIC1EamV0dHkucG9ydD0lSkVUVFlfUE9SVCUgLURqZXR0eS5hZG1pbi5wb3J0PSVKRVRUWV9BRE1JTl9QT1JUJSAtRGhvbWU9JUxFTllBX0hPTUUlICItRGxvYWRlci5qYXIucmVwb3NpdG9yaWVzPSVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxsaWI7JUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGV4dHJhXGxpYjslTEVOWUFfSE9NRSVcdG9vbHNcamV0dHlcZXh0cmFcZXh0OyVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxleHQ7JUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGV4dHJhXHJlc291cmNlczslTEVOWUFfTElCJVxlbmRvcnNlZCIgLURsb2FkZXIubWFpbi5jbGFzcz1vcmcubW9ydGJheS5qZXR0eS5wbHVzLlNlcnZlciAtRG9yZy5tb3J0YmF5LnV0aWwuVVJJLmNoYXJzZXQ9JUpFVFRZX1VSSV9DSEFSU0VUJSBMb2FkZXIgJUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGNvbmZcbWFpbi54bWwKLWdvdG8gZW5kCi0KLTo6IC0tLS0tIFNlcnZsZXQgd2l0aCBBZG1pbmlzdHJhdGlvbiBXZWIgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTpkb0FkbWluCi0lRVhFQyUgIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgJUpBVkFfT1BUSU9OUyUgLWNsYXNzcGF0aCAlQ1AlIC1EamF2YS5lbmRvcnNlZC5kaXJzPSVMRU5ZQV9MSUIlXGVuZG9yc2VkIC1Ed2ViYXBwPSVKRVRUWV9XRUJBUFAlIC1Eb3JnLnhtbC5zYXgucGFyc2VyPW9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIC1EamV0dHkucG9ydD0lSkVUVFlfUE9SVCUgLURqZXR0eS5hZG1pbi5wb3J0PSVKRVRUWV9BRE1JTl9QT1JUJSAtRGhvbWU9JUxFTllBX0hPTUUlICItRGxvYWRlci5qYXIucmVwb3NpdG9yaWVzPSVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxsaWI7JUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGV4dHJhXGxpYjslTEVOWUFfSE9NRSVcdG9vbHNcamV0dHlcZXh0cmFcZXh0OyVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxleHQ7JUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGV4dHJhXHJlc291cmNlczslTEVOWUFfTElCJVxlbmRvcnNlZCIgLURsb2FkZXIubWFpbi5jbGFzcz1vcmcubW9ydGJheS5qZXR0eS5wbHVzLlNlcnZlciAtRG9yZy5tb3J0YmF5LnV0aWwuVVJJLmNoYXJzZXQ9JUpFVFRZX1VSSV9DSEFSU0VUJSBMb2FkZXIgJUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGNvbmZcbWFpbi54bWwgJUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGNvbmZcYWRtaW4ueG1sCi1nb3RvIGVuZAotCi06OiAtLS0tLSBTZXJ2bGV0IERlYnVnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi06ZG9EZWJ1ZwotJUVYRUMlICIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiICVKQVZBX09QVElPTlMlIC1YZGVidWcgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsYWRkcmVzcz0lSkFWQV9ERUJVR19QT1JUJSxzZXJ2ZXI9eSxzdXNwZW5kPW4gIC1jbGFzc3BhdGggJUNQJSAtRGphdmEuZW5kb3JzZWQuZGlycz0lTEVOWUFfTElCJVxlbmRvcnNlZCAtRHdlYmFwcD0lSkVUVFlfV0VCQVBQJSAtRGhvbWU9JUxFTllBX0hPTUUlIC1Eb3JnLnhtbC5zYXgucGFyc2VyPW9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIC1EamV0dHkucG9ydD0lSkVUVFlfUE9SVCUgLURqZXR0eS5hZG1pbi5wb3J0PSVKRVRUWV9BRE1JTl9QT1JUJSAiLURsb2FkZXIuamFyLnJlcG9zaXRvcmllcz0lTEVOWUFfSE9NRSVcdG9vbHNcamV0dHlcbGliOyVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxleHRyYVxsaWI7JUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGV4dHJhXGV4dDslTEVOWUFfSE9NRSVcdG9vbHNcamV0dHlcZXh0OyVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxleHRyYVxyZXNvdXJjZXM7JUxFTllBX0xJQiVcZW5kb3JzZWQiIC1EbG9hZGVyLm1haW4uY2xhc3M9b3JnLm1vcnRiYXkuamV0dHkucGx1cy5TZXJ2ZXIgLURvcmcubW9ydGJheS51dGlsLlVSSS5jaGFyc2V0PSVKRVRUWV9VUklfQ0hBUlNFVCUgTG9hZGVyICVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxjb25mXG1haW4ueG1sCi1nb3RvIGVuZAotCi06OiAtLS0tLSBTZXJ2bGV0IFByb2ZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTpkb1Byb2ZpbGUKLSVFWEVDJSAiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiAlSkFWQV9PUFRJT05TJSAtWHJ1bmhwcm9mOmhlYXA9YWxsLGNwdT1zYW1wbGVzLHRocmVhZD15LGRlcHRoPTMgLWNsYXNzcGF0aCAlQ1AlIC1EamF2YS5lbmRvcnNlZC5kaXJzPSVMRU5ZQV9MSUIlXGVuZG9yc2VkIC1Ed2ViYXBwPSVKRVRUWV9XRUJBUFAlIC1EaG9tZT0lTEVOWUFfSE9NRSUgLURvcmcueG1sLnNheC5wYXJzZXI9b3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIgLURqZXR0eS5wb3J0PSVKRVRUWV9QT1JUJSAtRGpldHR5LmFkbWluLnBvcnQ9JUpFVFRZX0FETUlOX1BPUlQlICItRGxvYWRlci5qYXIucmVwb3NpdG9yaWVzPSVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxsaWI7JUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGV4dHJhXGxpYjslTEVOWUFfSE9NRSVcdG9vbHNcamV0dHlcZXh0cmFcZXh0OyVMRU5ZQV9IT01FJVx0b29sc1xqZXR0eVxleHQ7JUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGV4dHJhXHJlc291cmNlczslTEVOWUFfTElCJVxlbmRvcnNlZCIgLURsb2FkZXIubWFpbi5jbGFzcz1vcmcubW9ydGJheS5qZXR0eS5wbHVzLlNlcnZlciAtRG9yZy5tb3J0YmF5LnV0aWwuVVJJLmNoYXJzZXQ9JUpFVFRZX1VSSV9DSEFSU0VUJSBMb2FkZXIgJUxFTllBX0hPTUUlXHRvb2xzXGpldHR5XGNvbmZcbWFpbi54bWwKLQotOjogLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOmVuZAotc2V0IENQPQotc2V0IEVYRUM9Ci0KZGlmZiAtLWdpdCBhL3RydW5rL2xlbnlhLm5zaSBiL3RydW5rL2xlbnlhLm5zaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxZDcyZi4uMDAwMDAwMAotLS0gYS90cnVuay9sZW55YS5uc2kKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotO05TSVMgTGVueWEgSW5zdGFsbGVyIHNjcmlwdAotCi07IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotOyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLTsgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotOyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotOyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotOyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTsgJElkJAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTtJbmNsdWRlIE1vZGVybiBVSQotCi0gICFpbmNsdWRlICJNVUkubnNoIgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTtDb25maWd1cmF0aW9uCi0KLSAgO0dlbmVyYWwKLSAgVmFyIHByb2R1Y3RfbmFtZQotICBOYW1lICJBcGFjaGUgTGVueWEgMi4wLWRldiIKLSAgT3V0RmlsZSAiYXBhY2hlLWxlbnlhLTIuMC1kZXYtYmluLmV4ZSIKLSAgCi0gIENSQ0NoZWNrIG9uCi0gIFNldENvbXByZXNzIGZvcmNlCi0gIFNldERhdGFibG9ja09wdGltaXplIG9uCi0KLSAgO0ZvbGRlciBzZWxlY3Rpb24gcGFnZQotICBJbnN0YWxsRGlyICJDOlxhcGFjaGUtbGVueWEtMi4wLWRldiIKLSAgCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTtJbnRlcmZhY2UgU2V0dGluZ3MKLQotICAhZGVmaW5lIE1VSV9BQk9SVFdBUk5JTkcKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07UGFnZXMKLQotICAhaW5zZXJ0bWFjcm8gTVVJX1BBR0VfTElDRU5TRSAiTElDRU5TRS50eHQiCi0gICFpbnNlcnRtYWNybyBNVUlfUEFHRV9DT01QT05FTlRTCi0gICFpbnNlcnRtYWNybyBNVUlfUEFHRV9ESVJFQ1RPUlkKLSAgIWluc2VydG1hY3JvIE1VSV9QQUdFX0lOU1RGSUxFUwotICAKLSAgIWluc2VydG1hY3JvIE1VSV9VTlBBR0VfQ09ORklSTQotICAhaW5zZXJ0bWFjcm8gTVVJX1VOUEFHRV9JTlNURklMRVMKLSAgCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTtMYW5ndWFnZXMKLSAKLSAgIWluc2VydG1hY3JvIE1VSV9MQU5HVUFHRSAiRW5nbGlzaCIKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07SW5zdGFsbGVyIFNlY3Rpb25zCi0KLVNlY3Rpb24gIkFwYWNoZSBMZW55YSAyLjAtZGV2IiBTZWNEdW1teQotCi0gIENhbGwgZmluZEphdmFQYXRoCi0gIFN0ckNweSAkcHJvZHVjdF9uYW1lICJBcGFjaGUgTGVueWEgMi4wLWRldiIKLSAgU2V0T3V0UGF0aCAkSU5TVERJUgotICAKLSAgU2V0T3V0UGF0aCAkSU5TVERJUlxidWlsZFxsZW55YVx3ZWJhcHAKLSAgRmlsZSBidWlsZFxsZW55YVx3ZWJhcHBcZ2xvYmFsLXNpdGVtYXAueG1hcAotICBGaWxlIGJ1aWxkXGxlbnlhXHdlYmFwcFxzaXRlbWFwLnhtYXAKLSAgRmlsZSAvciBidWlsZFxsZW55YVx3ZWJhcHBcbGVueWEKLSAgRmlsZSAvciBidWlsZFxsZW55YVx3ZWJhcHBcV0VCLUlORgotICAKLSAgU2V0T3V0UGF0aCAkSU5TVERJUgotICBGaWxlIGxlbnlhLmJhdAotICBGaWxlIGJ1aWxkLnByb3BlcnRpZXMKLSAgRmlsZSBidWlsZC54bWwKLSAgRmlsZSBOT1RJQ0UudHh0Ci0gIEZpbGUgTElDRU5TRS50eHQKLSAgRmlsZSBSRUFETUUudHh0Ci0gIEZpbGUgQ1JFRElUUy50eHQKLSAgRmlsZSAvciB0b29scwotICBGaWxlIC9yIGxlZ2FsCi0KLSAgQ3JlYXRlRGlyZWN0b3J5ICIkU01QUk9HUkFNU1wkcHJvZHVjdF9uYW1lIgotICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcJHByb2R1Y3RfbmFtZVxBcGFjaGUgTGVueWEgSG9tZSBQYWdlLmxuayIgXAotICAgICAgICAgICAgICAgICAiaHR0cDovL2xlbnlhLmFwYWNoZS5vcmcvIgotCi0gIENyZWF0ZVNob3J0Q3V0ICIkU01QUk9HUkFNU1wkcHJvZHVjdF9uYW1lXFdlbGNvbWUgdG8gJHByb2R1Y3RfbmFtZS5sbmsiIFwKLSAgICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6ODg4OCIKLQotICBDcmVhdGVTaG9ydEN1dCAiJFNNUFJPR1JBTVNcJHByb2R1Y3RfbmFtZVxVbmluc3RhbGwgJHByb2R1Y3RfbmFtZS5sbmsiIFwKLSAgICAgICAgICAgICAgICAgIiRJTlNURElSXFVuaW5zdGFsbC5leGUiCi0KLSAgQ3JlYXRlU2hvcnRDdXQgIiRTTVBST0dSQU1TXCRwcm9kdWN0X25hbWVcU3RhcnQgJHByb2R1Y3RfbmFtZS5sbmsiIFwKLSAgICAgICAgICAgICAgICAgIiRJTlNURElSXGxlbnlhLmJhdCIgXAotICAgICAgICAgICAgICAgICAnc2VydmxldCcgXAotICAgICAgICAgICAgICAgICAiJElOU1RESVJcbGVueWEuYmF0IiAxIFNXX1NIT1dOT1JNQUwKLQotICBDbGVhckVycm9ycwotCi0gIDtTdGFydCBBcGFjaGUgTGVueWEsIHdhaXQgMTIgc2Vjb25kcyB0byBnaXZlIGl0IHRpbWUgdG8gc3RhcnQsIHRoZW4gbGF1bmNoIHN0YXJ0IHBhZ2UKLSAgRXhlY1NoZWxsICJvcGVuIiAnIiRJTlNURElSXGxlbnlhLmJhdCInIDAgU1dfU0hPV01JTklNSVpFRAotICA7Q3JlYXRlIHVuaW5zdGFsbGVyCi0gIFdyaXRlVW5pbnN0YWxsZXIgIiRJTlNURElSXFVuaW5zdGFsbC5leGUiCi0gIFNsZWVwIDEyMDAwCi0gIEV4ZWNTaGVsbCAib3BlbiIgJyJodHRwOi8vMTI3LjAuMC4xOjg4ODgiJyAwIFNXX1NIT1dOT1JNQUwKLSAgUXVpdAotU2VjdGlvbkVuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTtEZXNjcmlwdGlvbnMKLQotICBMYW5nU3RyaW5nIERFU0NfU2VjRHVtbXkgJHtMQU5HX0VOR0xJU0h9ICJJbnN0YWxscyB0aGUgQXBhY2hlIExlbnlhIDIuMC1kZXYgQ29udGVudCBNYW5hZ2VtZW50IFN5c3RlbS4iCi0KLSAgIWluc2VydG1hY3JvIE1VSV9GVU5DVElPTl9ERVNDUklQVElPTl9CRUdJTgotICAhaW5zZXJ0bWFjcm8gTVVJX0RFU0NSSVBUSU9OX1RFWFQgJHtTZWNEdW1teX0gJChERVNDX1NlY0R1bW15KQotICAhaW5zZXJ0bWFjcm8gTVVJX0ZVTkNUSU9OX0RFU0NSSVBUSU9OX0VORAotIAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07VW5pbnN0YWxsZXIgU2VjdGlvbgotCi1TZWN0aW9uICJVbmluc3RhbGwiCi0gIFJNRGlyIC9yICIkU01QUk9HUkFNU1xBcGFjaGUgTGVueWEgMi4wLWRldiIKLSAgUk1EaXIgL3IgIiRJTlNURElSIgotU2VjdGlvbkVuZAotCi07ID09PT09PT09PT09PT09PT09PT09PQotOyBGaW5kSmF2YVBhdGggRnVuY3Rpb24KLTsgPT09PT09PT09PT09PT09PT09PT09Ci07Ci07IEZpbmQgdGhlIEpBVkFfSE9NRSB1c2VkIG9uIHRoZSBzeXN0ZW0sIGFuZCBwdXQgdGhlIHJlc3VsdCBvbiB0aGUgdG9wIG9mIHRoZQotOyBzdGFjawotOyBXaWxsIGV4aXQgaWYgdGhlIHBhdGggY2Fubm90IGJlIGRldGVybWluZWQKLTsKLUZ1bmN0aW9uIGZpbmRKYXZhUGF0aAotCi0gIENsZWFyRXJyb3JzCi0KLSAgUmVhZEVudlN0ciAkMSBKQVZBX0hPTUUKLQotICBJZkVycm9ycyAwIEZvdW5kSkRLCi0KLSAgQ2xlYXJFcnJvcnMKLQotICBSZWFkUmVnU3RyICQyIEhLTE0gIlNPRlRXQVJFXEphdmFTb2Z0XEphdmEgRGV2ZWxvcG1lbnQgS2l0IiAiQ3VycmVudFZlcnNpb24iCi0gIFJlYWRSZWdTdHIgJDEgSEtMTSAiU09GVFdBUkVcSmF2YVNvZnRcSmF2YSBEZXZlbG9wbWVudCBLaXRcJDIiICJKYXZhSG9tZSIKLSAgUmVhZFJlZ1N0ciAkMyBIS0xNICJTT0ZUV0FSRVxKYXZhU29mdFxKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQiICJDdXJyZW50VmVyc2lvbiIKLSAgUmVhZFJlZ1N0ciAkNCBIS0xNICJTT0ZUV0FSRVxKYXZhU29mdFxKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnRcJDMiICJSdW50aW1lTGliIgotCi0gIEZvdW5kSkRLOgotCi0gIElmRXJyb3JzIDAgTm9BYm9ydAotICAgIE1lc3NhZ2VCb3ggTUJfT0sgIkNvdWxkbid0IGZpbmQgYSBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsZWQgb24gdGhpcyBcCi1jb21wdXRlci4gUGxlYXNlIGRvd25sb2FkIG9uZSBmcm9tIGh0dHA6Ly9qYXZhLnN1bi5jb20uIElmIHRoZXJlIGlzIGFscmVhZHkgXCBhIEpESyBpbnN0YWxsZWQgb24gdGhpcyBjb21wdXRlciwgc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIEpBVkFfSE9NRSB0byB0aGUgXCBwYXRobmFtZSBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIGl0IGlzIGluc3RhbGxlZC4iCi0gICAgQWJvcnQKLQotICBOb0Fib3J0OgotCi0gIDsgUHV0IHRoZSByZXN1bHQgaW4gdGhlIHN0YWNrCi0gIFB1c2ggJDEKLQotRnVuY3Rpb25FbmQKZGlmZiAtLWdpdCBhL3RydW5rL2xlbnlhLnNoIGIvdHJ1bmsvbGVueWEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxOWQyYjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGVueWEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBMZW55YSBVbml4IFNoZWxsIFNjcmlwdAotIwotIyAkSWQkCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgQ29uZmlndXJhdGlvbiB2YXJpYWJsZXMKLSMKLSMgTEVOWUFfSE9NRQotIyAgIFRoZSByb290IG9mIHRoZSBMZW55YSBkaXN0cmlidXRpb24KLSMKLSMgTEVOWUFfV0VCQVBQX0hPTUUKLSMgICBUaGUgcm9vdCBvZiB0aGUgTGVueWEgd2ViIGFwcGxpY2F0aW9uCi0jCi0jIExFTllBX0xJQgotIyAgIEZvbGRlciBjb250YWluaW5nIGFsbCB0aGUgbGlicmFyeSBmaWxlcyBuZWVkZWQgYnkgdGhlIExlbnlhIENMSQotIwotIyBKQVZBX0hPTUUKLSMgICBIb21lIG9mIEphdmEgaW5zdGFsbGF0aW9uLgotIwotIyBKQVZBX09QVElPTlMKLSMgICBFeHRyYSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIEpWTQotIwotIyBKQVZBX0RFQlVHX0FSR1MKLSMgICBUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIGludGVybmFsIEpWTSBkZWJ1Z2dlcgotIwotIyBKQVZBX1BST0ZJTEVfQVJHUwotIyAgIFRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgaW50ZXJuYWwgSlZNIHByb2ZpbGVyCi0jCi0jIEpFVFRZX1BPUlQKLSMgICBPdmVycmlkZSB0aGUgZGVmYXVsdCBwb3J0IGZvciBKZXR0eQotIwotIyBKRVRUWV9BRE1JTl9QT1JUCi0jICAgVGhlIHBvcnQgd2hlcmUgdGhlIGpldHR5IHdlYiBhZG1pbmlzdHJhdGlvbiBzaG91bGQgYmluZAotIwotCi0KLXVzYWdlKCkKLXsKLSAgICBlY2hvICJVc2FnZTogJDAgKGFjdGlvbikiCi0gICAgZWNobyAiYWN0aW9uczoiCi0gICAgZWNobyAiICBjbGkgICAgICAgICAgICAgICBSdW4gTGVueWEgZnJvbSB0aGUgY29tbWFuZCBsaW5lIgotICAgIGVjaG8gIiAgc2VydmxldCAgICAgICAgICAgUnVuIExlbnlhIGluIGEgc2VydmxldCBjb250YWluZXIiCi0gICAgZWNobyAiICBzZXJ2bGV0LWFkbWluICAgICBSdW4gTGVueWEgaW4gYSBzZXJ2bGV0IGNvbnRhaW5lciBhbmQgdHVybiBvbiBjb250YWluZXIgd2ViIGFkbWluaXN0cmF0aW9uIgotICAgIGVjaG8gIiAgc2VydmxldC1kZWJ1ZyAgICAgUnVuIExlbnlhIGluIGEgc2VydmxldCBjb250YWluZXIgYW5kIHR1cm4gb24gSlZNIHJlbW90ZSBkZWJ1ZyIKLSAgICBlY2hvICIgIHNlcnZsZXQtcHJvZmlsZSAgIFJ1biBMZW55YSBpbiBhIHNlcnZsZXQgY29udGFpbmVyIGFuZCB0dXJuIG9uIEpWTSBwcm9maWxpbmciCi0gICAgZXhpdCAxCi19Ci0KLSNbICQjIC1ndCAwIF0gfHwgdXNhZ2UKLQotREVGQVVMVF9BQ1RJT049InNlcnZsZXQiCi1BQ1RJT049JDEKLWlmIFsgLW4gIiRBQ1RJT04iIF0KLXRoZW4KLSAgc2hpZnQKLWVsc2UKLSAgQUNUSU9OPSRERUZBVUxUX0FDVElPTgotICBlY2hvICIkMDogZXhlY3V0aW5nIGRlZmF1bHQgYWN0aW9uICckQUNUSU9OJywgdXNlIC1oIHRvIHNlZSBvdGhlciBhY3Rpb25zIgotZmkKLUFSR1M9IiQqIgotCi0jIC0tLS0tIFZlcmlmeSBhbmQgU2V0IFJlcXVpcmVkIEVudmlyb25tZW50IFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlmIFsgIiRKQVZBX0hPTUUiID0gIiIgXSA7IHRoZW4KLSAgZWNobyBZb3UgbXVzdCBzZXQgSkFWQV9IT01FIHRvIHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uCi0gIGV4aXQgMQotZmkKLQotaWYgWyAiJEpBVkFfT1BUSU9OUyIgPSAiIiBdIDsgdGhlbgotICBKQVZBX09QVElPTlM9Jy1YbXMzMk0gLVhteDUxMk0gLURqYXZhLmF3dC5oZWFkbGVzcz10cnVlJwotZmkKLQotaWYgWyAiJExFTllBX0hPTUUiID0gIiIgXSA7IHRoZW4KLSAgTEVOWUFfSE9NRT0nLicKLSAgIyBUT0RPOiBNYWtlIGl0IHN0YXJ0YWJsZSBmcm9tIGFueSBkaXJlY3RvcnkKLSAgI0xFTllBX0hPTUU9YGRpcm5hbWUgJDBgCi0gICNlY2hvICJMRU5ZQV9IT01FOiAkTEVOWUFfSE9NRSIKLWZpCi0KLWlmIFsgIiRMRU5ZQV9XRUJBUFBfSE9NRSIgPSAiIiBdIDsgdGhlbgotICBTVEFOREFMT05FX1dFQkFQUD0uLi93ZWJhcHAKLSAgaWYgWyAtZCAkU1RBTkRBTE9ORV9XRUJBUFAgXSA7IHRoZW4KLSAgICAjIGZvciBzdGFuZGFsb25lLXdlYmFwcCBzZXR1cAotICAgIExFTllBX1dFQkFQUF9IT01FPSRTVEFOREFMT05FX1dFQkFQUAotICBlbHNlCi0gICAgIyB3aGVuIGluIHRoZSBidWlsZCBlbnZpcm9ubWVudAotICAgIExFTllBX1dFQkFQUF9IT01FPSIkTEVOWUFfSE9NRS9idWlsZC9sZW55YS93ZWJhcHAiCi0gIGZpCi1maQotZWNobyAiJDA6IHVzaW5nICRMRU5ZQV9XRUJBUFBfSE9NRSBhcyB0aGUgd2ViYXBwIGRpcmVjdG9yeSIKLQotaWYgWyAiJExFTllBX0xJQiIgPSAiIiBdIDsgdGhlbgotICBMRU5ZQV9MSUI9IiRMRU5ZQV9XRUJBUFBfSE9NRS9XRUItSU5GL2xpYiIKLWZpCi0KLQotIyBTZXQgSmV0dHkgUG9ydAotaWYgWyAtZiBsb2NhbC5idWlsZC5wcm9wZXJ0aWVzIF0gOyB0aGVuCi0gIEpFVFRZX1BPUlQ9YGdyZXAgd2ViLmFwcC5zZXJ2ZXIuamV0dHkucG9ydCAkTEVOWUFfSE9NRS9sb2NhbC5idWlsZC5wcm9wZXJ0aWVzIHwgZ3JlcCAtdiAiIyIgfCBzZWQgLWUgJ3Mvd2ViXC5hcHBcLnNlcnZlclwuamV0dHlcLnBvcnQ9Ly8nYAotZmkKLWlmIFsgIiRKRVRUWV9QT1JUIiA9ICIiIF0gOyB0aGVuCi0gIEpFVFRZX1BPUlQ9YGdyZXAgd2ViLmFwcC5zZXJ2ZXIuamV0dHkucG9ydCAkTEVOWUFfSE9NRS9idWlsZC5wcm9wZXJ0aWVzIHwgZ3JlcCAtdiAiIyIgfCBzZWQgLWUgJ3Mvd2ViXC5hcHBcLnNlcnZlclwuamV0dHlcLnBvcnQ9Ly8nYAotZmkKLWVjaG8gIklORk86IEpldHR5IFBvcnQgaXMgJEpFVFRZX1BPUlQiCi0KLSMgU2V0IEpldHR5IEFkbWluIFBvcnQKLWlmIFsgLWYgbG9jYWwuYnVpbGQucHJvcGVydGllcyBdIDsgdGhlbgotICBKRVRUWV9BRE1JTl9QT1JUPWBncmVwIHdlYi5hcHAuc2VydmVyLmpldHR5LmFkbWluLnBvcnQgJExFTllBX0hPTUUvbG9jYWwuYnVpbGQucHJvcGVydGllcyB8IGdyZXAgLXYgIiMiIHwgc2VkIC1lICdzL3dlYlwuYXBwXC5zZXJ2ZXJcLmpldHR5XC5hZG1pblwucG9ydD0vLydgCi1maQotaWYgWyAiJEpFVFRZX0FETUlOX1BPUlQiID0gIiIgXSA7IHRoZW4KLSAgSkVUVFlfQURNSU5fUE9SVD1gZ3JlcCB3ZWIuYXBwLnNlcnZlci5qZXR0eS5hZG1pbi5wb3J0ICRMRU5ZQV9IT01FL2J1aWxkLnByb3BlcnRpZXMgfCBncmVwIC12ICIjIiB8IHNlZCAtZSAncy93ZWJcLmFwcFwuc2VydmVyXC5qZXR0eVwuYWRtaW5cLnBvcnQ9Ly8nYAotZmkKLWVjaG8gIklORk86IEpldHR5IEFkbWluIFBvcnQgaXMgJEpFVFRZX0FETUlOX1BPUlQiCi0KLWlmIFsgIiRKQVZBX0RFQlVHX0FSR1MiID0gIiIgXSA7IHRoZW4KLSAgSkFWQV9ERUJVR19BUkdTPSctWGRlYnVnIC1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LGFkZHJlc3M9ODAwMCxzZXJ2ZXI9eSxzdXNwZW5kPW4nCi1maQotCi1pZiBbICIkSkFWQV9QUk9GSUxFX0FSR1MiID0gIiIgXSA7IHRoZW4KLSAgSkFWQV9QUk9GSUxFX0FSR1M9Jy1YcnVuaHByb2Y6aGVhcD1hbGwsY3B1PXNhbXBsZXMsdGhyZWFkPXksZGVwdGg9MycKLWZpCi0KLQotIyAtLS0tLSBTZXQgcGxhdGZvcm0gc3BlY2lmaWMgdmFyaWFibGVzCi0KLVBBVEhTRVA9IjoiOwotY2FzZSAiYHVuYW1lYCIgaW4KLSAgIENZR1dJTiopIFBBVEhTRVA9IjsiIDs7Ci1lc2FjCi0KLSMgLS0tLS0gU2V0IExvY2FsIFZhcmlhYmxlcyAoIHVzZWQgdG8gbWluaW1pemUgY3V0L3Bhc3RlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSkFWQT0iJEpBVkFfSE9NRS9iaW4vamF2YSIKLUVORE9SU0VEX0xJQlM9IiR7TEVOWUFfSE9NRX0vZXh0ZXJuYWxzL2NvY29vbl8yXzFfeC9saWIvZW5kb3JzZWQiCi1FTkRPUlNFRD0iLURqYXZhLmVuZG9yc2VkLmRpcnM9JEVORE9SU0VEX0xJQlMiCi1QQVJTRVI9LURvcmcueG1sLnNheC5wYXJzZXI9b3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIKLUxPQURFUj1Mb2FkZXIKLUxPQURFUl9MSUI9IiR7TEVOWUFfSE9NRX0vdG9vbHMvbG9hZGVyIgotCi1DTEk9LURsb2FkZXIubWFpbi5jbGFzcz1vcmcuYXBhY2hlLmxlbnlhLk1haW4KLUNMSV9MSUJSQVJJRVM9Ii1EbG9hZGVyLmphci5yZXBvc2l0b3JpZXM9JExFTllBX0xJQiIKLQotSkVUVFk9LURsb2FkZXIubWFpbi5jbGFzcz1vcmcubW9ydGJheS5qZXR0eS5wbHVzLlNlcnZlcgotSkVUVFlfQ09ORj0iJExFTllBX0hPTUUvdG9vbHMvamV0dHkvY29uZiIKLUpFVFRZX01BSU49IiRKRVRUWV9DT05GL21haW4ueG1sIgotSkVUVFlfQURNSU49IiRKRVRUWV9DT05GL2FkbWluLnhtbCIKLUpFVFRZX1dFQkFQUD0iLUR3ZWJhcHA9JExFTllBX1dFQkFQUF9IT01FIgotSkVUVFlfSE9NRT0iLURob21lPSRMRU5ZQV9IT01FIgotSkVUVFlfUE9SVF9BUkdTPSItRGpldHR5LnBvcnQ9JEpFVFRZX1BPUlQiCi1KRVRUWV9BRE1JTl9BUkdTPSItRGpldHR5LmFkbWluLnBvcnQ9JEpFVFRZX0FETUlOX1BPUlQiCi1KRVRUWV9MSUJSQVJJRVM9Ii1EbG9hZGVyLmphci5yZXBvc2l0b3JpZXM9JExFTllBX0hPTUUvdG9vbHMvamV0dHkvbGliJHtQQVRIU0VQfSRMRU5ZQV9IT01FL3Rvb2xzL2pldHR5L2V4dHJhL2xpYiR7UEFUSFNFUH0kTEVOWUFfSE9NRS90b29scy9qZXR0eS9leHRyYS9leHQke1BBVEhTRVB9JExFTllBX0hPTUUvdG9vbHMvamV0dHkvZXh0JHtQQVRIU0VQfSRMRU5ZQV9IT01FL3Rvb2xzL2pldHR5L2V4dHJhL3Jlc291cmNlcyR7UEFUSFNFUH0ke0VORE9SU0VEX0xJQlN9IgotSkVUVFlfVVJJX0NIQVJTRVQ9Ii1Eb3JnLm1vcnRiYXkudXRpbC5VUkkuY2hhcnNldD1JU08tODg1OS0xIgotCi0jIC0tLS0tIERvIHRoZSBhY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pZiBbIC1kIGJ1aWxkIF07IHRoZW4KLSAgICBlY2hvICJJTkZPOiBidWlsZC9sZW55YS93ZWJhcHAgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLiIKLWVsc2UKLSAgICBpZiBbIC1mIGxlbnlhLndhciBdOyB0aGVuCi0gICAgICAgIGVjaG8gIklORk86IGxlbnlhLndhciB3aWxsIGJlIHVucGFja2VkIC4uLiIKLSAgICAgICAgbWtkaXIgLXAgYnVpbGQvbGVueWEvd2ViYXBwCi0gICAgICAgIGNwIGxlbnlhLndhciBidWlsZC9sZW55YS93ZWJhcHAvLgotICAgICAgICBjZCBidWlsZC9sZW55YS93ZWJhcHAKLSAgICAgICAgJEpBVkFfSE9NRS9iaW4vamFyIC14ZiBsZW55YS53YXIKLSAgICAgICAgY2QgLi4vLi4vLi4KLSAgICAgICAgbWtkaXIgLXAgYnVpbGQvbGVueWEvd2ViYXBwL1dFQi1JTkYvbG9ncwotICAgICAgICBybSBidWlsZC9sZW55YS93ZWJhcHAvbGVueWEud2FyCi0gICAgZWxzZQotICAgICAgICBlY2hvICJJTkZPOiBObyBzdWNoIHdhciBmaWxlIGxlbnlhLndhciBvciBidWlsZCBkaXJlY3RvcnkhIgotICAgICAgICBleGl0IDEKLSAgICBmaQotZmkKLQotY2FzZSAiJEFDVElPTiIgaW4KLSAgY2xpKQotICAgICAgICAkSkFWQSAkSkFWQV9PUFRJT05TIC1jcCAkTE9BREVSX0xJQiAkRU5ET1JTRUQgJENMSV9MSUJSQVJJRVMgJENMSSAkTE9BREVSICRBUkdTCi0gICAgICAgIDs7Ci0KLSAgc2VydmxldCkKLSAgICAgICAgJEpBVkEgJEpBVkFfT1BUSU9OUyAtY3AgJExPQURFUl9MSUIgJEVORE9SU0VEICRQQVJTRVIgJEpFVFRZX1BPUlRfQVJHUyAkSkVUVFlfTElCUkFSSUVTICRKRVRUWV9XRUJBUFAgJEpFVFRZX0hPTUUgJEpFVFRZX1VSSV9DSEFSU0VUICRKRVRUWSAkTE9BREVSICRKRVRUWV9NQUlOCi0gICAgICAgIDs7Ci0KLSAgc2VydmxldC1hZG1pbikKLSAgICAgICAgJEpBVkEgJEpBVkFfT1BUSU9OUyAtY3AgJExPQURFUl9MSUIgJEVORE9SU0VEICRQQVJTRVIgJEpFVFRZX1BPUlRfQVJHUyAkSkVUVFlfQURNSU5fQVJHUyAkSkVUVFlfTElCUkFSSUVTICRKRVRUWV9XRUJBUFAgJEpFVFRZX0hPTUUgJEpFVFRZX1VSSV9DSEFSU0VUICRKRVRUWSAkTE9BREVSICRKRVRUWV9NQUlOICRKRVRUWV9BRE1JTgotICAgICAgICA7OwotCi0gIHNlcnZsZXQtZGVidWcpCi0gICAgICAgICRKQVZBICRKQVZBX09QVElPTlMgJEpBVkFfREVCVUdfQVJHUyAtY3AgJExPQURFUl9MSUIgJEVORE9SU0VEICRQQVJTRVIgJEpFVFRZX1BPUlRfQVJHUyAkSkVUVFlfTElCUkFSSUVTICRKRVRUWV9XRUJBUFAgJEpFVFRZX0hPTUUgICRKRVRUWV9VUklfQ0hBUlNFVCAkSkVUVFkgJExPQURFUiAkSkVUVFlfTUFJTgotICAgICAgICA7OwotCi0gIHNlcnZsZXQtcHJvZmlsZSkKLSAgICAgICAgJEpBVkEgJEpBVkFfT1BUSU9OUyAkSkFWQV9QUk9GSUxFX0FSR1MgLWNwICRMT0FERVJfTElCICRFTkRPUlNFRCAkUEFSU0VSICRKRVRUWV9BUkdTICRKRVRUWV9MSUJSQVJJRVMgJEpFVFRZX1dFQkFQUCAkSkVUVFlfSE9NRSAkSkVUVFlfVVJJX0NIQVJTRVQgJEpFVFRZICRMT0FERVIgJEpFVFRZX01BSU4KLSAgICAgICAgOzsKLQotICAqKQotICAgICAgICB1c2FnZQotICAgICAgICA7OwotZXNhYwotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi9jb21tb25zLWNvZGVjLTEuMy5qYXIgYi90cnVuay9saWIvY29tbW9ucy1jb2RlYy0xLjMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdiNjc1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2xpYi9jb21tb25zLWNvZGVjLTEuMy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9saWIvY29tbW9ucy12YWxpZGF0b3ItMS4zLjEuamFyIGIvdHJ1bmsvbGliL2NvbW1vbnMtdmFsaWRhdG9yLTEuMy4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViMTJiMS4uMDAwMDAwMAotLS0gYS90cnVuay9saWIvY29tbW9ucy12YWxpZGF0b3ItMS4zLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGliL2V4Y2FsaWJ1ci10ZXN0Y2FzZS0xLjAuamFyIGIvdHJ1bmsvbGliL2V4Y2FsaWJ1ci10ZXN0Y2FzZS0xLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGY2NTFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xpYi9leGNhbGlidXItdGVzdGNhc2UtMS4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi9qYWNrcmFiYml0LTEuMC1MQ1IzMzAyNDQuamFyIGIvdHJ1bmsvbGliL2phY2tyYWJiaXQtMS4wLUxDUjMzMDI0NC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2IzNTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGliL2phY2tyYWJiaXQtMS4wLUxDUjMzMDI0NC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9saWIvamFja3JhYmJpdC1jb21tb25zLTEuMC1MQ1IzMzAyNDQuamFyIGIvdHJ1bmsvbGliL2phY2tyYWJiaXQtY29tbW9ucy0xLjAtTENSMzMwMjQ0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAzZTA0YS4uMDAwMDAwMAotLS0gYS90cnVuay9saWIvamFja3JhYmJpdC1jb21tb25zLTEuMC1MQ1IzMzAyNDQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGliL2pjaWZzLW1vY2suamFyIGIvdHJ1bmsvbGliL2pjaWZzLW1vY2suamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVmZGQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xpYi9qY2lmcy1tb2NrLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi9qY3ItMS4wLmphciBiL3RydW5rL2xpYi9qY3ItMS4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiNzFjZi4uMDAwMDAwMAotLS0gYS90cnVuay9saWIvamNyLTEuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9saWIvamluZy0yMDAzMDYxOS5qYXIgYi90cnVuay9saWIvamluZy0yMDAzMDYxOS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhY2JmYjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGliL2ppbmctMjAwMzA2MTkuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGliL2p1bml0LTMuOC4xLmphciBiL3RydW5rL2xpYi9qdW5pdC0zLjguMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NGQ3MWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbGliL2p1bml0LTMuOC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi9uZWtvZHRkLTAuMS4xMS5qYXIgYi90cnVuay9saWIvbmVrb2R0ZC0wLjEuMTEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmUwYzMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xpYi9uZWtvZHRkLTAuMS4xMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9saWIvbmVrb3B1bGwtMC4yLjQuamFyIGIvdHJ1bmsvbGliL25la29wdWxsLTAuMi40LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDliN2MyOC4uMDAwMDAwMAotLS0gYS90cnVuay9saWIvbmVrb3B1bGwtMC4yLjQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGliL3dlYnNwaGlueC0wLjUuamFyIGIvdHJ1bmsvbGliL3dlYnNwaGlueC0wLjUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmVmZDk0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2xpYi93ZWJzcGhpbngtMC41LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi94ZXJjZXNJbXBsLTIuOS4wLmphciBiL3RydW5rL2xpYi94ZXJjZXNJbXBsLTIuOS4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkZjkzMC4uMDAwMDAwMAotLS0gYS90cnVuay9saWIveGVyY2VzSW1wbC0yLjkuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9saWIveG1sLWFwaXMtMS4zLjA0LmphciBiL3RydW5rL2xpYi94bWwtYXBpcy0xLjMuMDQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJjMGVhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xpYi94bWwtYXBpcy0xLjMuMDQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGliL3htbC1mb3JyZXN0LXI0Mjg2NTIuamFyIGIvdHJ1bmsvbGliL3htbC1mb3JyZXN0LXI0Mjg2NTIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGVmMDlkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2xpYi94bWwtZm9ycmVzdC1yNDI4NjUyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi94bWx1bml0MS4wLmphciBiL3RydW5rL2xpYi94bWx1bml0MS4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4ZWQ1OC4uMDAwMDAwMAotLS0gYS90cnVuay9saWIveG1sdW5pdDEuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvUkVBRE1FX0FDLnR4dCBiL3RydW5rL3NyYy9SRUFETUVfQUMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2IwZmVjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9SRUFETUVfQUMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotQWNjZXNzIENvbnRyb2wgU3BlY2lmaWNhdGlvbgotCi0gICAgKiBQb3NzaWJpbGl0eSB0byBkZW55IHBlcm1pc3Npb25zCi0KLVRlcm1pbm9sb2d5Ci0KLSAgICAqIEFuIGFjY3JlZGl0YWJsZSBpcyBlaXRoZXIgYSB1c2VyLCBhIGdyb3VwLCBhbiBJUCByYW5nZSwgb3IgdGhlIHdvcmxkLgotICAgICogQSBjcmVkZW50aWFsIGlzIGFuIGFzc2lnbm1lbnQgb2YgYSByb2xlIHRvIGFuIGFjY3JlZGl0YWJsZS4KLQotTmFtZXMKLQotICAgICogV2UgdXNlIHRoZSBmb2xsb3dpbmcgbmFtZXM6Ci0gICAgICAgICAgbyBuIC0gYSBub2RlCi0gICAgICAgICAgbyBwYXJlbnQobikgLSB0aGUgcGFyZW50IG5vZGUgb2YgbgotICAgICAgICAgIG8gbi5jMSwgLi4uLCBuLmNpIC0gdGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBub2RlIG4KLSAgICAgICAgICBvIGFjYyhjKSAtIHRoZSBhY2NyZWRpdGFibGUgd2hpY2ggdGhlIGNyZWRlbnRpYWwgcmVmZXJzIHRvCi0gICAgICAgICAgbyByb2xlKGMpIC0gdGhlIHJvbGUgd2hpY2ggdGhlIGNyZWRlbnRpYWwgYXNzaWduZXMgdG8gdGhlIGFjY3JlZGl0YWJsZQotICAgICAgICAgIG8gbWV0aG9kKGMpIC0gdGhlIG1ldGhvZCBvZiB0aGUgY3JlZGVudGlhbAotCi1Db25jZXB0Ci0KLSAgICAqIENyZWRlbnRpYWwgbWV0aG9kcyBjYW4gYmUgZ3JhbnQgb3IgZGVueS4KLSAgICAqIFRoZSBvcmRlciBvZiBjcmVkZW50aWFscyBhdCBhIG5vZGUgaXMgaW1wb3J0YW50LgotICAgICogVG8gZmluZCBvdXQgaWYgYSBjZXJ0YWluIGFjY3JlZGl0YWJsZSBhIGhhcyBhIHJvbGUgciBmb3IgdGhlIG5vZGUgbiwgdXNlIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgotICAgICAgICAgIG8gU2VhcmNoIGZvciB0aGUgZmlyc3QgbWF0Y2hpbmcgY3JlZGVudGlhbCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgY3JlZGVudGlhbCBvZiB0aGUgbm9kZSBuLgotICAgICAgICAgIG8gSWYgbm8gY3JlZGVudGlhbCBvZiBuIG1hdGNoZXMgdGhlIGFjY3JlZGl0YWJsZSwgY29udGludWUgd2l0aCB0aGUgcGFyZW50IG5vZGUuCi0gICAgICAgICAgbyBXaGVuIGEgY3JlZGVudGlhbCBpcyBmb3VuZCB3aGljaCBhc3NpZ25zIHRoZSByb2xlIHIgdG8gdGhlIGFjY3JlZGl0YWJsZSBhLCByZXR1cm4gdGhlIG1ldGhvZCBvZiB0aGUgY3JlZGVudGlhbC4KLSAgICAgICAgICBvIElmIG5vIGNyZWRlbnRpYWwgaXMgZm91bmQgdXAgdG8gdGhlIHRvcCwgcmV0dXJuIGRlbnkuCi0KLVJvbGUgcmVzb2x2aW5nIGFsZ29yaXRobQotCi0gICAgKiB3aGlsZSBub3QgbWF0Y2hlZDoKLSAgICAgICAgICBvIGZvciBjIDogbi5jaSB0byBuLmMxOgotICAgICAgICAgICAgICAgICsgaWYgYWNjKGMpID0gYSBhbmQgcm9sZShjKSA9IHIsIHJldHVybiBtZXRob2QoYykKLSAgICAgICAgICBvIG4gOj0gcGFyZW50KG4pCi0gICAgKiByZXR1cm4gZGVueQotCi1Vc2VyIGludGVyZmFjZQotCi1UaGUgdXNlciBpbnRlcmZhY2UgaGFzIHRvIGFsbG93IHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczoKLQotICAgICogYWRkL3JlbW92ZSBjcmVkZW50aWFscyBmb3IgdXNlcnMsIGdyb3Vwcywgd29ybGQKLSAgICAqIHNldCB0aGUgY3JlZGVudGlhbCBtZXRob2QKLSAgICAqIGNoYW5nZSBjcmVkZW50aWFsIG9yZGVyIChtb3ZlIHVwL2Rvd24pCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FeGFtcGxlczoKLSoqKioqKioqKgotTGlrZSBzdGF0ZWQgYWJvdmUgdGhlIG9yZGVyIG9mIHRoZSBjcmVkZW50aWFsIGlzIGltcG9ydGFudC4gCi1DcmVkZW50aWFscyBhcmUgYnVpbGRlZCBmcm9tIHBvbGljaWVzLgotSW1hZ2luZ2UgeW91IGFyZSB0cnlpbmcgdG8gYWNjZXNzIGh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC9kZWZhdWx0L2ludHJvZHVjdGlvbi5odG1sCi0KLVRoZSBkZWZpbmVkIHBvbGljeSAod2l0aCBoaWdoZXN0IHByaW9yaXR5KSB3b3VsZCBiZToKLWNvbmZpZy9hYy9wb2xpY2llcy9pbnRyb2R1Y3Rpb24uaHRtbC9zdWJ0cmVlLXBvbGljeS5hY21sCi0KLUltYWdpbmdlIHlvdSBoYXZlIGRlZmluZWQ6Ci08cG9saWN5IHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvYWMvMS4wIj4KLSAgPHdvcmxkPgotICAgIDxyb2xlIGlkPSJ2aXNpdCIgbWV0aG9kPSJkZW55Ii8+Ci0gIDwvd29ybGQ+Ci0gIDxncm91cCBpZD0iZWRpdG9yIj4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L2dyb3VwPgotPC9wb2xpY3k+Ci0KLVRoZW4geW91IHRyeSB0byBsb2dpbiBpbiB3aXRoIHVzZXIgImxlbnlhIiB3aG8gaXMgaW4gdGhlIGVkaXRvciBncm91cC4gCi1Ib3dldmVyIHlvdSB3aWxsIG5vdCBiZSBzdWNjZXNzZnVsLCBiZWNhdXNlIGV2ZXJ5Ym9keSBhbHdheXMgaXMgd29ybGQuIAotU2luY2UgdGhlIERFTlkgb2Ygd29ybGQgaXMgY29taW5nIGZpcnN0IG5vYm9keSB3aWxsIG5vdyBiZSBhYmxlIHRvIHNlZSAKLXRoZSBwYWdlLgotCi1DaGFuZ2luZyBhYm92ZSBwb2xpY3kgdG8gCi08cG9saWN5IHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvYWMvMS4wIj4KLSAgPGdyb3VwIGlkPSJlZGl0b3IiPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvZ3JvdXA+Ci0gIDx3b3JsZD4KLSAgICA8cm9sZSBpZD0idmlzaXQiIG1ldGhvZD0iZGVueSIvPgotICA8L3dvcmxkPgotPC9wb2xpY3k+Ci0KLUxldCBhbGwgdXNlciBvZiB0aGUgZ3JvdXAgZWRpdG9yIGFjY2VzcyB0aGUgcGFnZS4KLQotQmVzdCBwcmFjdGlzZSBpcyB0byBkZW55IGFjY2VzcyBlYXJseSBpbiBhIG5vZGUgdHJlZSBvZiBwb2xpY2llcyBmb3IgZS5nLiBXT1JMRC4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL1JFQURNRV9NT0RVTEVTLnR4dCBiL3RydW5rL3NyYy9SRUFETUVfTU9EVUxFUy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNmMxNTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL1JFQURNRV9NT0RVTEVTLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLU1vZHVsZSBjYXRlZ29yaWVzOgotPT09PT09PT09PT09PT09PT09Ci0KLVRoZSBtb2R1bGVzIGluIExlbnlhIGFyZSBjdXJyZW50bHkgc3BsaXQgdXAgaW50byB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXM6Ci0KLSogbW9kdWxlcy1jb3JlCi0gIFRoaXMgc2V0IG9mIG1vZHVsZXMgaW1wbGVtZW50cyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IG9mIExlbnlhLgotICBNb2R1bGVzIGluIHRoZSBjb3JlIHdpbGwgbm90IGhhdmUgYW55IGRlcGVuZGVuY2llcyBvdXRzaWRlIG9mIHRoZSBjb3JlLgotCi0KLSogbW9kdWxlcwotICBUaGlzIGlzIHdoZXJlIG1vc3Qgb2YgdGhlIGFkZC1vbiBmdW5jdGlvbmFsaXR5IGdvZXM6IHN1cHBvcnQgZm9yIHNwZWNpZmljIAotICBlZGl0b3JzLCBkb2N1bWVudCB0eXBlcywgdGhlIG5pZnR5IG5ldyBmZWF0dXJlIG9mIHRoZSBkYXksIGV0Yy4KLQotCi0qIG1vZHVsZXMtb3B0aW9uYWwKLSAgVGhlIHNjcmF0Y2hwYWQuIE1vZHVsZXMgaW4gaGVyZSBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byB3b3JrIG9yIGV2ZW4KLSAgY29tcGlsZSwgbm9yIGhhdmUgYSBzdGFibGUgQVBJLiAoRklYTUU6IHNob3VsZCBtb2R1bGVzIHRoYXQgcmVxdWlyZSAKLSAgZXh0ZXJuYWwgY29kZSB0byBiZSB1c2VmdWwgYWxzbyBiZSBtb3ZlZCBoZXJlLCBzdWNoIGFzIHRpbnltY2Ugb3IKLSAgZmNrZWRpdG9yPwotCi0KLSogbW9kdWxlcy1sZWdhY3kKLSAgVGhpcyBpcyB0aGUgcGxhY2UgZm9yIG1vZHVsZXMgdGhhdCBkbyBub3QgYWRoZXJlIHRvIHRoZSBwcm9ncmFtbWluZyAKLSAgY29udmVudGlvbnMgb2YgdGhlIHRydW5rLCBidXQgYXJlIHN0aWxsIG5lZWRlZCBhcyBubyB1cGRhdGVkIHZlcnNpb24gaXMKLSAgYXZhaWxhYmxlLiBGb3IgaW5zdGFuY2UsIG1vZHVsZXMgdGhhdCB1c2UgdGhlIDEuMiB3YXkgb2YgaGFuZGxpbmcgdXNlY2FzZXMKLSAgd2l0aG91dCB1c2luZyB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgc2hvdWxkIGdvIGhlcmUuIChGSVhNRTogZG9lcyB0aGF0IG1ha2UKLSAgdGhlIGt1cHUgbW9kdWxlIGEgY2FuZGlkYXRlPykKLQotRGlyZWN0b3J5IExheW91dDoKLT09PT09PT09PT09PT09PT09Ci0KLUVhY2ggbW9kdWxlIHNob3VsZCBhZGhlcmUgdG8gdGhlIGZvbGxvd2luZyBkaXJlY3RvcnkgbGF5b3V0IChzdWJkaXJlY3RvcmllcwotaWYgYXBwcm9wcmlhdGUsIHRha2UgYSBsb29rIGF0IHRoZSBjb3JlIG1vZHVsZXMgaWYgaW4gZG91YnQpOgotCi1teW1vZHVsZS8KLSAgY29uZmlnLyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlcwotICAgIG1vZHVsZS54bWwgICAgICAgICAgICAgICBtb2R1bGUgZGVzY3JpcHRvcgotICAgIGNvY29vbi14Y29uZi8gICAgICAgICAgICBwYXRjaGVzIGZvciBjb2Nvb24ueGNvbmY6Ci0gICAgICBjb21wb25lbnQtbXljb21wb25lbnQueGNvbmYKLSAgICAgIHVzZWNhc2UtbXl1c2VjYXNlLnhjb25mICAgICAKLSAgdXNlY2FzZXMvCi0gICAgbXl1c2VjYXNlLmp4ICAgICAgICAgICAgIHVzZWNhc2UgdmlldwotICBqYXZhLwotICAgIHNyYy8gICAgICAgICAgICAgICAgICAgICBKYXZhIHNvdXJjZSBmaWxlcwotICAgIGxpYi8gICAgICAgICAgICAgICAgICAgICBKYXZhIGxpYnJhcmllcwotICB4c2x0LyAgICAgICAgICAgICAgICAgICAgICBYU0xUIHN0eWxlc2hlZXRzCi0gIHNpdGVtYXAueG1hcCAgICAgICAgICAgICAgIG1haW4gbW9kdWxlIHNpdGVtYXAKLQotCi1tb2R1bGUueG1sCi09PT09PT09PT09Ci0KLUVhY2ggbW9kdWxlIG11c3QgY29udGFpbiBhIGRlc2NyaXB0aW9uIGZpbGUgY29uZmlnL21vZHVsZS54bWw6Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8IS0tIHRoZSBJRCAqbXVzdCogc3RhcnQgd2l0aCB0aGUgcGFja2FnZSBuYW1lIG9mIAotICAgICAgIHlvdXIgY3VzdG9tIEphdmEgY29kZSAtLT4KLSAgPGlkPm9yZy5teXByb2plY3QubGVueWEubW9kdWxlcy5teWVkaXRvcjwvaWQ+Ci0gIDwhLS0gYnVpbGQgZGVwZW5kZW5jaWVzOyBzZWUgbm90ZSBiZWxvdyAtLT4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy53ZWJkYXYiLz4KLSAgPCEtLSB0aGUgSmF2YSBwYWNrYWdlIHlvdXIgbW9kdWxlIGJlbG9uZ3MgdG8gLS0+Ci1GSVhNRTogd2h5IGlzIHRoaXMgbmVlZGVkPyBhZmFpdSBpdCBjb3VsZCBiZSBnbGVhbmVkIGZyb20gdGhlIGlkLi4uCi0gIDxwYWNrYWdlPm9yZy5teXByb2plY3QubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPCEtLSBhIHZlcnNpb24gc3RyaW5nIC0tPgotRklYTUU6IHdoYXQgZG9lcyB0aGlzIGRvPyBqdXN0IGZvciBpbmZvcm1hdGlvbiwgb3IgaXMgdGhlcmUgdmVyc2lvbgotbWFuYWdlbWVudD8KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPCEtLSBhIHNob3J0IG5hbWUgZm9yIHlvdXIgbW9kdWxlIC0tPgotICA8bmFtZT5NeSBPd24gRWRpdG9yPC9uYW1lPgotICA8IS0tIHRoZSByZXF1aXJlZCBsZW55YSB2ZXJzaW9uIC0tPgotRklYTUU6IGlzIHRoaXMgYWN0dWFsbHkgdXNlZD8KLSAgPGxlbnlhLXZlcnNpb24+Mi4wLWRldjwvbGVueWEtdmVyc2lvbj4KLSAgPCEtLSBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHlvdXIgbW9kdWxlIC0tPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBteSBvd24gZWRpdG9yLgotICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCB2aXNpdCBodHRwOi8vbXlwcm9qZWN0Lm9yZy9lZGl0b3IuCi0gIDwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KLQotTk9URTogYmUgY2FyZWZ1bCB0byBzcGVjaWZ5IHRoZSBkZXBlbmNpZXMgY29ycmVjdGx5LiBUaGUgPGRlcGVuZHMvPiBlbGVtZW50Ci1pcyBtZWFudCBmb3IgamF2YSBjb2RlIGRlcGVuZGVuY2llcyBvbmx5LCBpLmUuIGlzc3VlcyB0aGF0IGFmZmVjdAotY29tcGlsYXRpb24uIElmIGEgbW9kdWxlIG1lcmVseSBsaW5rcyB0byBhbm90aGVyIG1vZHVsZSdzIHVzZWNhc2VzIGluIGl0cwotdmlld3MsIHRoYXQgZG9lcyBub3QgcXVhbGlmeSBhcyBhIGRlcGVuZGVuY3kgKGFsdGhvdWdoIG1heWJlIGl0IHNob3VsZCBhdAotc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlKS4KLQotCi1zZWUgYWxzbzoKLT09PT09PT09PQotCi1QbGVhc2UgcmVmZXIgdG8gdGhlIG9ubGluZSBkb2NzIGF0Ci1odHRwOi8vbGVueWEuYXBhY2hlLm9yZy9kb2NzLzFfNC9yZWZlcmVuY2UvbW9kdWxlcy9pbmRleC5odG1sLgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2NvY29vbi9sb2NhbC5ibG9ja3MucHJvcGVydGllcyBiL3RydW5rL3NyYy9jb2Nvb24vbG9jYWwuYmxvY2tzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Y2UxMDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2NvY29vbi9sb2NhbC5ibG9ja3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBCbG9ja3MgcHJvcGVydGllcyB2ZXJzaW9uIHRvIG1ha2Ugc3VyZSB0aGF0IGxvY2FsLmJsb2Nrcy5wcm9wZXJ0aWVzIGlzIGtlcHQgaW4gc3luYwotIyBOT1RFOiBEbyBOT1QgbW9kaWZ5IHRoaXMgbnVtYmVyIHVubGVzcyB5b3UgYXJlIGEgRGV2IGFuZCB3YW50IHRvIG1vZGlmeSB0aGlzIGZpbGUKLSMgTk9URSBmb3IgRGV2czogVXBkYXRlIHRoaXMgbnVtYmVyIGlmIHRoaXMgZmlsZSBpcyBiZWluZyB1cGRhdGVkLgotIyAgICAgICAgICAgICAgICBBbHNvIHVwZGF0ZSB0aGUgdmVyc2lvbiBudW1iZXIgd2l0aGluIHNyYy90YXJnZXRzL2luaXQtYnVpbGQueG1sCi0KLWxlbnlhLmJsb2Nrcy5wcm9wZXJ0aWVzLnZlcnNpb249NDI2NjAzCi1sZW55YS52ZXJzaW9uPTIuMC1kZXYKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvY29vbiBCbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwotCi0jIFJlbW92ZSBibG9ja3MgZnJvbSB5b3VyIGNvY29vbiBkaXN0cmlidXRpb24gYnkgc2V0dGluZyB0aGUgY29ycmVzcG9uZGluZwotIyBpbmNsdWRlIHByb3BlcnR5IHRvIHRydWUgb3IgZmFsc2UuIFRoZSBibG9ja3MgYXJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQsIGkuZS4gaWYKLSMgbm8gcHJvcGVydHkgd2FzIHNldC4KLQotIyBOT1RFOiBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIGRpcmVjdGx5IGJ1dCBtYWtlIGEgY29weSBuYW1lZAotIyAnbG9jYWwuYmxvY2tzLnByb3BlcnRpZXMnIGFuZCBtb2RpZnkgdGhhdC4gVGhlIGJ1aWxkIHN5c3RlbSB3aWxsIGZpcnN0IGxvYWQKLSMgJ2xvY2FsLmJsb2Nrcy5wcm9wZXJ0aWVzJyBhbmQgcHJvcGVydGllcyBhcmUgaW1tdXRhYmxlIGluIEFudC4KLQotIyBOT1RFOiAiW2RlcGVuZGVuY3ldIiBpbmRpY2F0ZXMgYmxvY2tzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IG90aGVyIGJsb2Nrcy4KLSMgRGlzYWJsaW5nIGJhdGlrLCBmb3IgZXhhbXBsZSwgd2lsbCByZXN1bHQgaW4gYSBSdW50aW1lRXhjZXB0aW9uIHdoZW4gdXNpbmcKLSMgZm9wLiBEZXBlbmRlbmNpZXMgb25seSBuZWVkZWQgZm9yIHRoZSBibG9jaydzIHNhbXBsZXMgYXJlIG1hcmtlZCBleHBsaWNpdGVseS4KLSMgVGhpcyBsYXR0ZXIgaW5mb3JtYXRpb24gd2FzIGludHJvZHVjZWQgb25seSBzaG9ydCB0aW1lIGFnbywgc28gZG8gbm90IGV4cGVjdAotIyBpdCB0byBiZSBjb21wbGV0ZS4KLQotIyBOT1RFOiAodG8gQ29jb29uIGNvbW1pdHRlcnMpOiBibG9ja3MucHJvcGVydGllcyBpcyBnZW5lcmF0ZWQgZnJvbSBndW1wLnhtbAotIyB1c2luZyAiYnVpbGQgZ2VuZXJhdGUtYmxvY2tzLnByb3BlcnRpZXMiLiBBbnkgY2hhbmdlcyB0byBibG9ja3MgZGVmaW5pdGlvbnMKLSMgbXVzdCBiZSBtYWRlIGluIGd1bXAueG1sLCBub3QgaGVyZS4KLQotIyBBbGwgYmxvY2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBVc2UgdGhpcyBwcm9wZXJ0eSB0byBleGNsdWRlIGFsbCBibG9ja3MgYXQgb25jZQotIyBleGNsdWRlLmFsbC5ibG9ja3M9dHJ1ZQotCi0jIFVzZSB0aGlzIHByb3BlcnR5IHRvIGluY2x1ZGUgYWxsIGJsb2NrcyBhdCBvbmNlCi0jIGluY2x1ZGUuYWxsLmJsb2Nrcz10cnVlCi0KLQotIyBTdGFibGUgYmxvY2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBTdGFibGUgYmxvY2tzIGFyZSB0aG9zZSB0aGF0IGNhbiBiZSBjb25zaWRlcmVkIHJlYWR5IGZvciBwcm9kdWN0aW9uIGFuZAotIyB3aWxsIGNvbnRhaW4gY29tcG9uZW50cyBhbmQgQVBJIHRoYXQgd2lsbCByZW1haW4gc3RhYmxlIGFuZCB3aGVyZQotIyBkZXZlbG9wZXJzIGFyZSBjb21taXR0ZWQgdG8gYmFjayBjb21wYXRpYmlsaXR5LiBJbiBzaG9ydCwgc3R1ZmYgdGhhdCB5b3UKLSMgY2FuIGRlcGVuZCBvbi4KLQotIy0tLS0tW2RlcGVuZGVuY3ldOiAiYXV0aGVudGljYXRpb24tZnciIGRlcGVuZHMgb24gInNlc3Npb24tZnciLgotIy0tLS0tW2RlcGVuZGVuY3ldOiAiYXV0aGVudGljYXRpb24tZnciIGlzIG5lZWRlZCBieSAicG9ydGFsIiwgInBvcnRhbC1mdyIuCi1pbmNsdWRlLmJsb2NrLmF1dGhlbnRpY2F0aW9uLWZ3PWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJiYXRpayIgaXMgbmVlZGVkIGJ5ICJmb3AiLCAidG91ciIuCi0jaW5jbHVkZS5ibG9jay5iYXRpaz1mYWxzZQotaW5jbHVkZS5ibG9jay5ic2Y9ZmFsc2UKLSNpbmNsdWRlLmJsb2NrLmNoYXBlcm9uPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJkYXRhYmFzZXMiIGRlcGVuZHMgb24gInhzcCIuCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJkYXRhYmFzZXMiIGlzIG5lZWRlZCBieSAiaHNxbGRiIiwgImptcyIsICJvamIiLCAicGV0c3RvcmUiLCAicmVwb3NpdG9yeSIsICJ4bWxkYiIuCi0jaW5jbHVkZS5ibG9jay5kYXRhYmFzZXM9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogImZvcCIgZGVwZW5kcyBvbiAiYmF0aWsiLgotIy0tLS0tW2RlcGVuZGVuY3ldOiAiZm9wIiBpcyBuZWVkZWQgYnkgInRvdXIiLgotI2luY2x1ZGUuYmxvY2suZm9wPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJoc3FsZGIiIGRlcGVuZHMgb24gImRhdGFiYXNlcyIuCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJoc3FsZGIiIGlzIG5lZWRlZCBieSAiam1zIiwgIm9qYiIsICJwZXRzdG9yZSIuCi0jaW5jbHVkZS5ibG9jay5oc3FsZGI9ZmFsc2UKLSNpbmNsdWRlLmJsb2NrLmh0bWw9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogIml0ZXh0IiBkZXBlbmRzIG9uICJ4c3AiIChmb3Igc2FtcGxlcykuCi1pbmNsdWRlLmJsb2NrLml0ZXh0PWZhbHNlCi1pbmNsdWRlLmJsb2NrLmpmb3I9ZmFsc2UKLWluY2x1ZGUuYmxvY2suanNwPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJsaW5rcmV3cml0ZXIiIGRlcGVuZHMgb24gInhzcCIuCi0jaW5jbHVkZS5ibG9jay5saW5rcmV3cml0ZXI9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogImx1Y2VuZSIgaXMgbmVlZGVkIGJ5ICJxdWVyeWJlYW4iLgotaW5jbHVkZS5ibG9jay5sdWNlbmU9dHJ1ZQotaW5jbHVkZS5ibG9jay5taWRpPWZhbHNlCi0jaW5jbHVkZS5ibG9jay5uYW1pbmc9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogIm9qYiIgZGVwZW5kcyBvbiAiZGF0YWJhc2VzIiAoZm9yIHNhbXBsZXMpLCAiZm9ybXMiIChmb3Igc2FtcGxlcyksICJoc3FsZGIiIChmb3Igc2FtcGxlcykuCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJvamIiIGlzIG5lZWRlZCBieSAiamF2YWZsb3ciLCAicG9ydGFsIiwgInF1ZXJ5YmVhbiIuCi1pbmNsdWRlLmJsb2NrLm9qYj1mYWxzZQotaW5jbHVkZS5ibG9jay5wYXJhbm9pZD1mYWxzZQotaW5jbHVkZS5ibG9jay5wb2k9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogInBvcnRhbCIgZGVwZW5kcyBvbiAiYXV0aGVudGljYXRpb24tZnciLCAiY3JvbiIsICJmb3JtcyIsICJvamIiLCAic2Vzc2lvbi1mdyIuCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJwb3J0YWwiIGlzIG5lZWRlZCBieSAiZmFjZXMiLgotaW5jbHVkZS5ibG9jay5wb3J0YWw9ZmFsc2UKLSNpbmNsdWRlLmJsb2NrLnByb2ZpbGVyPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJweXRob24iIGRlcGVuZHMgb24gInhzcCIuCi1pbmNsdWRlLmJsb2NrLnB5dGhvbj1mYWxzZQotIy0tLS0tW2RlcGVuZGVuY3ldOiAic2Vzc2lvbi1mdyIgZGVwZW5kcyBvbiAieHNwIi4KLSMtLS0tLVtkZXBlbmRlbmN5XTogInNlc3Npb24tZnciIGlzIG5lZWRlZCBieSAiYXV0aGVudGljYXRpb24tZnciLCAicG9ydGFsIiwgInBvcnRhbC1mdyIuCi0jaW5jbHVkZS5ibG9jay5zZXNzaW9uLWZ3PWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJ2ZWxvY2l0eSIgaXMgbmVlZGVkIGJ5ICJwZXRzdG9yZSIuCi1pbmNsdWRlLmJsb2NrLnZlbG9jaXR5PWZhbHNlCi1pbmNsdWRlLmJsb2NrLndlYjM9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogInhtbGRiIiBkZXBlbmRzIG9uICJkYXRhYmFzZXMiLgotIyBUT0RPOiBJbmNsdWRpbmcgdGhlIHhtbGRiIGJsb2NrIG1pZ2h0IGNhdXNlIGEgY29uZmxpY3Qgd2l0aCB0aGUgcGF0Y2hlZCB4bWxkYiBsaWJyYXJpZXMgbGliL3htbGRiLWNvbW1vbi0yMDAzLTA5LTAyLmphciBhbmQgbGliL3htbGRiLXh1cGRhdGUtMjAwMy0xMC0xNC5qYXIKLWluY2x1ZGUuYmxvY2sueG1sZGI9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogInhzcCIgaXMgbmVlZGVkIGJ5ICJkYXRhYmFzZXMiLCAiaXRleHQiLCAibGlua3Jld3JpdGVyIiwgInB5dGhvbiIsICJzZXNzaW9uLWZ3IiwgIndvb2R5Ii4KLSNpbmNsdWRlLmJsb2NrLnhzcD1mYWxzZQotCi0jIERlcHJlY2F0ZWQgYmxvY2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIEFsdGhvdWdoIHNvbWUgb2YgdGhlc2UgYmxvY2tzIG1heSBoYXZlIGJlZW4gc3RhYmxlLCB0aGV5IGFyZSBub3cgZGVwcmVjYXRlZAotIyBpbiBmYXZvdXIgb2Ygb3RoZXIgYmxvY2tzIGFuZCB0aGVyZWZvcmUgYXJlIGV4Y2x1ZGVkIGJ5IGRlZmF1bHQgZnJvbSB0aGUgYnVpbGQuCi0jIEZvciBpbmNsdWRpbmcgb25lIG9mIHRoZW0geW91IGhhdmUgdG8gc2V0IHRoZSBleGNsdWRlIHByb3BlcnR5IGludG8gY29tbWVudCBpbgotIyBibG9ja3MucHJvcGVydGllcy4KLQotaW5jbHVkZS5ibG9jay5waHA9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogInBvcnRhbC1mdyIgZGVwZW5kcyBvbiAiYXV0aGVudGljYXRpb24tZnciLCAic2Vzc2lvbi1mdyIuCi1pbmNsdWRlLmJsb2NrLnBvcnRhbC1mdz1mYWxzZQotaW5jbHVkZS5ibG9jay5zd2Y9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogIndvb2R5IiBkZXBlbmRzIG9uICJ4c3AiIChmb3Igc2FtcGxlcykuCi1pbmNsdWRlLmJsb2NrLndvb2R5PWZhbHNlCi0KLSMgVW5zdGFibGUgYmxvY2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgVW5zdGFibGUgYmxvY2tzIGFyZSBjdXJyZW50bHkgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGRvIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUKLSMgY29udHJhY3RzIHRoZXkgZXhwb3NlIChBUEksIHhtbCBzY2hlbWEsIHByb3BlcnRpZXMsIGJlaGF2aW9yKSB3aWxsIHJlbWFpbgotIyBjb25zdGFudCBpbiB0aW1lLiBEZXZlbG9wZXJzIGFyZSBub3QgY29tbWl0dGVkIHRvIGJhY2stY29tcGF0aWJpbGl0eSBqdXN0IHlldC4KLSMgVGhpcyBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIGJsb2NrcyBpbXBsZW1lbnRhdGlvbiBpcyB1bnN0YWJsZSBvcgotIyB0aGUgY29kZSBjYW4ndCBiZSB0cnVzdGVkIGZvciBwcm9kdWN0aW9uLCBidXQgdXNlIHdpdGggY2FyZSBhbmQgd2F0Y2gKLSMgaXRzIGRldmVsb3BtZW50IGFzIHRoaW5ncyBtaWdodCBjaGFuZ2Ugb3ZlciB0aW1lIGJlZm9yZSB0aGV5IGFyZSBtYXJrZWQKLSMgc3RhYmxlLgotCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJhamF4IiBpcyBuZWVkZWQgYnkgImZvcm1zIi4KLSNpbmNsdWRlLmJsb2NrLmFqYXg9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogImFwcGxlcyIgZGVwZW5kcyBvbiAiZm9ybXMiIChmb3Igc2FtcGxlcykuCi1pbmNsdWRlLmJsb2NrLmFwcGxlcz1mYWxzZQotIy0tLS0tW2RlcGVuZGVuY3ldOiAiYXNjaWlhcnQiIGlzIG5lZWRlZCBieSAibWFpbCIuCi1pbmNsdWRlLmJsb2NrLmFzY2lpYXJ0PXRydWUKLWluY2x1ZGUuYmxvY2suYXhpcz10cnVlCi0jaW5jbHVkZS5ibG9jay5jYXB0Y2hhPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJjcm9uIiBpcyBuZWVkZWQgYnkgImptcyIsICJwb3J0YWwiLgotaW5jbHVkZS5ibG9jay5jcm9uPXRydWUKLSNpbmNsdWRlLmJsb2NrLmRlbGk9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogImV2ZW50Y2FjaGUiIGRlcGVuZHMgb24gImptcyIuCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJldmVudGNhY2hlIiBpcyBuZWVkZWQgYnkgInJlcG9zaXRvcnkiLgotaW5jbHVkZS5ibG9jay5ldmVudGNhY2hlPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJmYWNlcyIgZGVwZW5kcyBvbiAicG9ydGFsIiwgInRhZ2xpYiIuCi1pbmNsdWRlLmJsb2NrLmZhY2VzPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJmb3JtcyIgZGVwZW5kcyBvbiAiYWpheCIuCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJmb3JtcyIgaXMgbmVlZGVkIGJ5ICJhcHBsZXMiLCAiamF2YWZsb3ciLCAib2piIiwgInBldHN0b3JlIiwgInBvcnRhbCIsICJxdWVyeWJlYW4iLCAidG91ciIuCi0jaW5jbHVkZS5ibG9jay5mb3Jtcz1mYWxzZQotI2luY2x1ZGUuYmxvY2suaW1hZ2VvcD1mYWxzZQotIy0tLS0tW2RlcGVuZGVuY3ldOiAiamF2YWZsb3ciIGRlcGVuZHMgb24gImZvcm1zIiwgIm9qYiIuCi1pbmNsdWRlLmJsb2NrLmphdmFmbG93PWZhbHNlCi0jaW5jbHVkZS5ibG9jay5qY3I9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogImptcyIgZGVwZW5kcyBvbiAiY3JvbiIsICJkYXRhYmFzZXMiIChmb3Igc2FtcGxlcyksICJoc3FsZGIiLgotIy0tLS0tW2RlcGVuZGVuY3ldOiAiam1zIiBpcyBuZWVkZWQgYnkgImV2ZW50Y2FjaGUiLCAic2xpZGUiLgotaW5jbHVkZS5ibG9jay5qbXM9ZmFsc2UKLWluY2x1ZGUuYmxvY2subGlub3R5cGU9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogIm1haWwiIGRlcGVuZHMgb24gImFzY2lpYXJ0Ii4KLWluY2x1ZGUuYmxvY2subWFpbD10cnVlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJwZXRzdG9yZSIgZGVwZW5kcyBvbiAiZGF0YWJhc2VzIiwgImZvcm1zIiwgImhzcWxkYiIsICJ2ZWxvY2l0eSIuCi1pbmNsdWRlLmJsb2NrLnBldHN0b3JlPWZhbHNlCi0jaW5jbHVkZS5ibG9jay5wcm94eT1mYWxzZQotaW5jbHVkZS5ibG9jay5xZG94PWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJxdWVyeWJlYW4iIGRlcGVuZHMgb24gImZvcm1zIiAoZm9yIHNhbXBsZXMpLCAibHVjZW5lIiwgIm9qYiIuCi0jaW5jbHVkZS5ibG9jay5xdWVyeWJlYW49ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogInJlcG9zaXRvcnkiIGRlcGVuZHMgb24gImRhdGFiYXNlcyIsICJldmVudGNhY2hlIi4KLSMtLS0tLVtkZXBlbmRlbmN5XTogInJlcG9zaXRvcnkiIGlzIG5lZWRlZCBieSAic2xpZGUiLCAid2ViZGF2Ii4KLWluY2x1ZGUuYmxvY2sucmVwb3NpdG9yeT1mYWxzZQotI2luY2x1ZGUuYmxvY2suc2VyaWFsaXplcnM9ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogInNsaWRlIiBkZXBlbmRzIG9uICJqbXMiLCAicmVwb3NpdG9yeSIuCi1pbmNsdWRlLmJsb2NrLnNsaWRlPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJzbG9wIiBpcyBuZWVkZWQgYnkgInRvdXIiLgotaW5jbHVkZS5ibG9jay5zbG9wPWZhbHNlCi1pbmNsdWRlLmJsb2NrLnN0eD1mYWxzZQotIy0tLS0tW2RlcGVuZGVuY3ldOiAidGFnbGliIiBpcyBuZWVkZWQgYnkgImZhY2VzIi4KLWluY2x1ZGUuYmxvY2sudGFnbGliPWZhbHNlCi0jLS0tLS1bZGVwZW5kZW5jeV06ICJ0b3VyIiBkZXBlbmRzIG9uICJiYXRpayIsICJmb3AiLCAiZm9ybXMiLCAic2xvcCIuCi1pbmNsdWRlLmJsb2NrLnRvdXI9ZmFsc2UKLSNpbmNsdWRlLmJsb2NrLnZhbGlkYXRpb249ZmFsc2UKLSMtLS0tLVtkZXBlbmRlbmN5XTogIndlYmRhdiIgZGVwZW5kcyBvbiAicmVwb3NpdG9yeSIuCi1pbmNsdWRlLmJsb2NrLndlYmRhdj1mYWxzZQotI2luY2x1ZGUuYmxvY2sueHNsdGFsPWZhbHNlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvY29jb29uL2xvY2FsLmJ1aWxkLnByb3BlcnRpZXMgYi90cnVuay9zcmMvY29jb29uL2xvY2FsLmJ1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTc0ZmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2NvY29vbi9sb2NhbC5idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBCdWlsZCBwcm9wZXJ0aWVzIHZlcnNpb24gdG8gbWFrZSBzdXJlIHRoYXQgbG9jYWwuYnVpbGQucHJvcGVydGllcyBpcyBrZXB0IGluIHN5bmMKLSMgTk9URTogRG8gTk9UIG1vZGlmeSB0aGlzIG51bWJlciB1bmxlc3MgeW91IGFyZSBhIERldiBhbmQgd2FudCB0byBtb2RpZnkgdGhpcyBmaWxlCi0jIE5PVEUgZm9yIERldnM6IFVwZGF0ZSB0aGlzIG51bWJlciBpZiB0aGlzIGZpbGUgaXMgYmVpbmcgdXBkYXRlZC4KLSMgICAgICAgICAgICAgICAgQWxzbyB1cGRhdGUgdGhlIHZlcnNpb24gbnVtYmVyIHdpdGhpbiBzcmMvdGFyZ2V0cy9pbml0LWJ1aWxkLnhtbAotCi1sZW55YS5idWlsZC5wcm9wZXJ0aWVzLnZlcnNpb249NTI5MTYxCi1sZW55YS52ZXJzaW9uPTIuMC1kZXYKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgIENvY29vbiBCdWlsZCBQcm9wZXJ0aWVzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIE5PVEU6IGRvbid0IG1vZGlmeSB0aGlzIGZpbGUgZGlyZWN0bHkgYnV0IGNvcHkgdGhlIHByb3BlcnRpZXMgeW91IG5lZWQKLSMgdG8gbW9kaWZ5IG92ZXIgdG8gYSBmaWxlIG5hbWVkICdsb2NhbC5idWlsZC5wcm9wZXJ0aWVzJyBhbmQgbW9kaWZ5IHRoYXQuCi0jIFRoZSBidWlsZCBzeXN0ZW0gd2lsbCBvdmVycmlkZSB0aGVzZSBwcm9wZXJ0aWVzIHdpdGggdGhlIG9uZXMgaW4gdGhlCi0jICdsb2NhbC5idWlsZC5wcm9wZXJ0aWVzJyBmaWxlLgotCi0jIC0tLS0gV2ViYXBwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1leGNsdWRlLndlYmFwcC5kb2N1bWVudGF0aW9uPXRydWUKLWV4Y2x1ZGUud2ViYXBwLmphdmFkb2NzPXRydWUKLWV4Y2x1ZGUud2ViYXBwLmlkbGRvY3M9dHJ1ZQotZXhjbHVkZS53ZWJhcHAuc2FtcGxlcz10cnVlCi0KLSMgLS0tLSBCdWlsZCBFeGNsdXNpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWV4Y2x1ZGUuZGVwcmVjYXRlZD10cnVlCi1leGNsdWRlLmRvY3VtZW50YXRpb249dHJ1ZQotZXhjbHVkZS5qYXZhZG9jcz10cnVlCi0jaW5jbHVkZS5zb3VyY2VzLWluLWphcnM9dHJ1ZQotCi0jIC0tLS0gQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaW5jbHVkZS5kcml2ZXIub3JhY2xlPXRydWUKLSNpbmNsdWRlLmRyaXZlci5wb3N0Z3JlPXRydWUKLSNpbmNsdWRlLmRyaXZlci5vZGJjPXRydWUKLWNvbmZpZy5hbGxvdy1yZWxvYWRzPWZhbHNlCi0KLSMgVE9ETzogU2luY2UgZXh0ZXJuYWxzL2NvY29vbl8yXzFfeC9zcmMvd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBpcyB0cnVlIGFscmVhZHkgdGhpcyB3b24ndCBoZWxwIC4uLgotY29uZmlnLmVuYWJsZS11cGxvYWRzPWZhbHNlCi0jY29uZmlnLmVuYWJsZS1pbnN0cnVtZW50YXRpb249dHJ1ZQotCi0jIC0tLS0gVmFsaWRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZXhjbHVkZS52YWxpZGF0ZS5jb25maWc9dHJ1ZQotZXhjbHVkZS52YWxpZGF0ZS54ZG9jcz10cnVlCi0jZXhjbHVkZS52YWxpZGF0ZS5qYXJzPXRydWUKLQotIyAtLS0tIEZvcnJlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBzZXQgJEZPUlJFU1RfSE9NRSBhbmQgJFBBVEggYXMgaW5zdHJ1Y3RlZCBieSBGb3JyZXN0Ci0KLSMgLS0tLSBBbnRlYXRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFudGVhdGVyLmhvbWUgPSAvZGVmYXVsdC1mcm9tLWJ1aWxkLnByb3BlcnRpZXMvYW50ZWF0ZXItMC45LjE2Ci1hbnRlYXRlci50YXJnZXQuaG9zdCA9IGxvY2FsaG9zdAotYW50ZWF0ZXIudGFyZ2V0LnBvcnQgPSA4ODg4Ci1hbnRlYXRlci50YXJnZXQuYmFzZS5wYXRoID0gLwotYW50ZWF0ZXIub3B0aW9uLmhhbHRvbmVycm9yID0gdHJ1ZQotCi0jIGRpc2FibGUgc29tZSBsb25nLXJ1bm5pbmcgdGVzdHMgYnkgZGVmYXVsdAotIyBhbnRlYXRlci50ZXN0LmJ1ZzI2MTg2SW50ZXJuYWxSZXF1ZXN0TWVtb3J5TGVhay5lbmFibGVkID0gdHJ1ZQotCi0jIC0tLS0gSlVuaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1qdW5pdC50ZXN0LmRlYnVncG9ydD04MDAwCi0janVuaXQudGVzdGNhc2U9b3JnLmFwYWNoZS5jb2Nvb24udXRpbC50ZXN0Lk5ldFV0aWxzVGVzdENhc2UKLQotIyAtLS0tIEJ1aWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYnVpbGQucm9vdD1idWlsZAotYnVpbGQ9JHtidWlsZC5yb290fS8ke25hbWV9LSR7dmVyc2lvbn0KLWJ1aWxkLmRlc3Q9JHtidWlsZH0vY2xhc3NlcwotYnVpbGQubW9ja3M9JHtidWlsZH0vbW9ja3MKLWJ1aWxkLnRlc3Q9JHtidWlsZH0vdGVzdAotYnVpbGQudGVzdC5vdXRwdXQ9JHtidWlsZC50ZXN0fS9vdXRwdXQKLWJ1aWxkLmRvY3M9JHtidWlsZH0vZG9jcwotYnVpbGQuZG9jcy5wcmludGVyPSR7YnVpbGR9L3ByaW50ZXItZG9jcwotYnVpbGQuc2l0ZT0ke2J1aWxkfS9zaXRlCi1idWlsZC54ZG9jcz0ke2J1aWxkfS94ZG9jcwotYnVpbGQuamF2YWRvY3M9JHtidWlsZH0vamF2YWRvY3MKLWJ1aWxkLmNvbnRleHQ9JHtidWlsZH0vZG9jdW1lbnRhdGlvbgotYnVpbGQuY29udGV4dC5wcmludGVyPSR7YnVpbGR9L3ByaW50ZXItZG9jdW1lbnRhdGlvbgotYnVpbGQuYmxvY2tzPSR7YnVpbGR9L2Jsb2NrcwotYnVpbGQuZGVwcmVjYXRlZD0ke2J1aWxkfS9kZXByZWNhdGVkCi1idWlsZC5zYW1wbGVzPSR7YnVpbGR9L3NhbXBsZXMKLWJ1aWxkLnRlbXA9JHtidWlsZH0vdGVtcAotYnVpbGQubW91bnR0YWJsZT0uLi8uLi9tb3VudC10YWJsZS54bWwKLQotYnVpbGQuZG9jcy5sb2dsZXZlbD1FUlJPUgotYnVpbGQuZG9jcy5wcmludGVyLmxvZ2xldmVsPUVSUk9SCi0KLSMgLS0tLS0tIFdlYmFwcCBCdWlsZCBQcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWJ1aWxkLndlYmFwcD0ke2J1aWxkLnJvb3R9L3dlYmFwcAotYnVpbGQud2ViYXBwLndlYmluZj0ke2J1aWxkLndlYmFwcH0vV0VCLUlORgotYnVpbGQud2ViYXBwLmNsYXNzZXM9JHtidWlsZC53ZWJhcHAud2ViaW5mfS9jbGFzc2VzCi1idWlsZC53ZWJhcHAubGliPSR7YnVpbGQud2ViYXBwLndlYmluZn0vbGliCi1idWlsZC53ZWJhcHAuc2FtcGxlcz0ke2J1aWxkLndlYmFwcH0vc2FtcGxlcwotYnVpbGQud2ViYXBwLnRlc3Qtc3VpdGU9JHtidWlsZC53ZWJhcHB9L3Rlc3Qtc3VpdGUKLWJ1aWxkLndlYmFwcC5kb2NzPSR7YnVpbGQud2ViYXBwfS9kb2NzCi1idWlsZC53ZWJhcHAuamF2YWRvY3M9JHtidWlsZC53ZWJhcHB9L2FwaS9qYXZhCi1idWlsZC53ZWJhcHAubG9nbGV2ZWw9SU5GTwotYnVpbGQud2FyPSR7YnVpbGR9LyR7bmFtZX0ud2FyCi0KLSMgLS0tLS0tIFN0YW5kYWxvbmUtZGVtbyBCdWlsZCBQcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1idWlsZC5zdGFuZGFsb25lLmRlbW89JHtidWlsZC5yb290fS9zdGFuZGFsb25lLWRlbW8KLQotIyAtLS0tIENvbXBpbGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29tcGlsZXI9bW9kZXJuCi1jb21waWxlci5kZWJ1Zz1vbgotY29tcGlsZXIub3B0aW1pemU9b24KLWNvbXBpbGVyLmRlcHJlY2F0aW9uPW9mZgotY29tcGlsZXIubm93YXJuPW9uCi1zb3VyY2Uudm09MS40Ci0KLQotIyAtLS0tLS0gU3lzdGVtIFByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBXQVJOSU5HOiB5b3Ugc2hvdWxkbid0IG5lZWQgdG8gbW9kaWZ5IGFueXRoaW5nIGJlbG93IGhlcmUgc2luY2UgdGhlcmUgaXMgYQotIyB2ZXJ5IGhpZ2ggY2hhbmdlIG9mIGJyZWFraW5nIHRoZSBidWlsZCBzeXN0ZW0uIERvIGl0IG9ubHkgaWYgeW91IGtub3cgd2hhdAotIyB5b3UncmUgZG9pbmcuCi0KLXBhY2thZ2VzPW9yZy5hcGFjaGUKLQotIyBQcm9qZWN0IGRlc2NyaXB0b3IKLWd1bXAuZGVzY3JpcHRvcj1ndW1wLnhtbAotCi0jIERpcmVjdG9yeSBMYXlvdXQKLXNyYz1zcmMKLWphdmE9JHtzcmN9L2phdmEKLW1vY2tzPSR7c3JjfS9tb2NrcwotdGVzdD0ke3NyY30vdGVzdAotcmVzb3VyY2VzPSR7c3JjfS9yZXNvdXJjZXMKLXJlc291cmNlcy5zdHlsZXM9JHtyZXNvdXJjZXN9L3N0eWxlcwotcmVzb3VyY2VzLmxvZ29zPSR7cmVzb3VyY2VzfS9sb2dvcwotcmVzb3VyY2VzLmphdmFkb2M9JHtyZXNvdXJjZXN9L2phdmFkb2MKLWRvY3VtZW50YXRpb249JHtzcmN9L2RvY3VtZW50YXRpb24KLWRvY3M9JHtkb2N1bWVudGF0aW9ufS94ZG9jcwotaW1hZ2VzPSR7ZG9jdW1lbnRhdGlvbn0vaW1hZ2VzCi1ibG9ja3M9JHtzcmN9JHtmaWxlLnNlcGFyYXRvcn1ibG9ja3MKLXNhbXBsZXM9JHtzcmN9L3NhbXBsZXMKLXdlYmFwcD0ke3NyY30vd2ViYXBwCi13ZWJhcHAuc2FtcGxlcz0ke3dlYmFwcH0vc2FtcGxlcwotd2ViYXBwLnRlc3Qtc3VpdGU9JHt3ZWJhcHB9L3Rlc3Qtc3VpdGUKLWN1c3RvbWNvbmY9JHtzcmN9L2NvbmZwYXRjaAotCi0jIERlcHJlY2F0ZWQgU3R1ZmYKLWRlcHJlY2F0ZWQ9JHtzcmN9L2RlcHJlY2F0ZWQKLWRlcHJlY2F0ZWQuc3JjPSR7ZGVwcmVjYXRlZH0vamF2YQotZGVwcmVjYXRlZC5jb25mPSR7ZGVwcmVjYXRlZH0vY29uZgotCi0jIFRvb2xzCi10b29scz10b29scwotdG9vbHMubGliPSR7dG9vbHN9L2xpYgotdG9vbHMuc3JjPSR7dG9vbHN9L3NyYwotdG9vbHMudGFza3Muc3JjPSR7dG9vbHMuc3JjfS9hbnR0YXNrcwotdG9vbHMudGFza3MuZGVzdD0ke3Rvb2xzfS9hbnR0YXNrcwotdG9vbHMubG9hZGVyLnNyYz0ke3Rvb2xzLnNyY30vbG9hZGVyCi10b29scy5sb2FkZXIuZGVzdD0ke3Rvb2xzfS9sb2FkZXIKLXRvb2xzLmpldHR5PSR7dG9vbHN9L2pldHR5Ci0KLSMgSURFCi1pZGUuZWNsaXBzZS5vdXRwdXRkaXI9JHtidWlsZC5yb290fS9lY2xpcHNlL2NsYXNzZXMKLWlkZS5lY2xpcHNlLmV4cG9ydC5saWJzPWZhbHNlCi0KLSMgTGlicmFyaWVzCi1saWI9bGliCi1saWIuY29yZT0ke2xpYn0vY29yZQotbGliLmVuZG9yc2VkPSR7bGlifS9lbmRvcnNlZAotbGliLm9wdGlvbmFsPSR7bGlifS9vcHRpb25hbAotbGliLmxvY2FsPSR7bGlifS9sb2NhbAotCi0jIERpc3RyaWJ1dGlvbiBEaXJlY3RvcmllcwotZGlzdC5yb290PWRpc3QKLWRpc3Q9JHtkaXN0LnJvb3R9LyR7bmFtZX0tJHt2ZXJzaW9ufQotZGlzdC5uYW1lPSR7bmFtZX0tJHt2ZXJzaW9ufQotZGlzdC50YXJnZXQ9JHtkaXN0LnJvb3R9Ci0KLSMgU2l0ZSBEaXJlY3RvcnkKLXNpdGU9Li4vY29jb29uLXNpdGUvc2l0ZS8yLjEKLQotIyBMZWdhbAotbGVnYWw9bGVnYWwKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9jb25mcGF0Y2gvZW5hYmxlLXVwbG9hZHMueHdlYiBiL3RydW5rL3NyYy9jb25mcGF0Y2gvZW5hYmxlLXVwbG9hZHMueHdlYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYjNiMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvY29uZnBhdGNoL2VuYWJsZS11cGxvYWRzLnh3ZWIKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBodHRwOi8vd2lraS5hcGFjaGUub3JnL2NvY29vbi9YUGF0Y2hUYXNrVXNhZ2UgLS0+Ci0KLTx4d2ViIHhwYXRoPSIvd2ViLWFwcC9zZXJ2bGV0L2luaXQtcGFyYW1bcGFyYW0tbmFtZT0nZW5hYmxlLXVwbG9hZHMnXS9wYXJhbS12YWx1ZSIKLSAgICAgIGlmLXByb3A9ImVuYWJsZS51cGxvYWRzIgotICAgICAgcmVtb3ZlPSIvd2ViLWFwcC9zZXJ2bGV0L2luaXQtcGFyYW1bcGFyYW0tbmFtZT0nZW5hYmxlLXVwbG9hZHMnXS9wYXJhbS12YWx1ZS90ZXh0KCkiCi0+dHJ1ZTwveHdlYj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9jb25mcGF0Y2gvZm9ybS1lbmNvZGluZy54d2ViIGIvdHJ1bmsvc3JjL2NvbmZwYXRjaC9mb3JtLWVuY29kaW5nLnh3ZWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjk0NDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2NvbmZwYXRjaC9mb3JtLWVuY29kaW5nLnh3ZWIKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4d2ViIHhwYXRoPSIvd2ViLWFwcC9zZXJ2bGV0L2luaXQtcGFyYW1bcGFyYW0tbmFtZT0nZm9ybS1lbmNvZGluZyddL3BhcmFtLXZhbHVlIgotCXJlbW92ZT0iL3dlYi1hcHAvc2VydmxldC9pbml0LXBhcmFtW3BhcmFtLW5hbWU9J2Zvcm0tZW5jb2RpbmcnXS9wYXJhbS12YWx1ZS90ZXh0KCkiCi0+VVRGLTg8L3h3ZWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2NvbmZwYXRjaC9sb2c0ai1hcHBlbmRlci54Y29uZiBiL3RydW5rL3NyYy9jb25mcGF0Y2gvbG9nNGotYXBwZW5kZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MjdhYjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2NvbmZwYXRjaC9sb2c0ai1hcHBlbmRlci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb25maWd1cmF0aW9uIiB1bmxlc3M9Ii9jb25maWd1cmF0aW9uL2FwcGVuZGVyW0BuYW1lPSdDaGFpbnNhdyddIiBpbnNlcnQtYWZ0ZXI9ImFwcGVuZGVyIj4KLQotICAgIDwhLS0rIAotICAgICAgICB8IFNlZSBodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqL2RvY3MvY2hhaW5zYXcuaHRtbAotICAgICAgICArLS0+Ci0gICAgPGFwcGVuZGVyIG5hbWU9IkNoYWluc2F3IiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0QXBwZW5kZXIiPgotICAgICAgICA8cGFyYW0gbmFtZT0icmVtb3RlSG9zdCIgdmFsdWU9ImxvY2FsaG9zdCIgLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9InBvcnQiIHZhbHVlPSI0NDQ1Ii8+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJsb2NhdGlvbkluZm8iIHZhbHVlPSJ0cnVlIiAvPgotICAgIDwvYXBwZW5kZXI+Ci0KLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvY29uZnBhdGNoL2xvZzRqLWFwcGVuZGVycmVmLnhjb25mIGIvdHJ1bmsvc3JjL2NvbmZwYXRjaC9sb2c0ai1hcHBlbmRlcnJlZi54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyYzljYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvY29uZnBhdGNoL2xvZzRqLWFwcGVuZGVycmVmLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvbmZpZ3VyYXRpb24vcm9vdCIgdW5sZXNzPSIvY29uZmlndXJhdGlvbi9yb290L2FwcGVuZGVyLXJlZltAcmVmPSdDaGFpbnNhdyddIG9yIC9jb25maWd1cmF0aW9uL3Jvb3Qvbm9kZSgpW3NlbGY6OmNvbW1lbnQoKSBhbmQgY29udGFpbnMoLiwgJ2FwcGVuZGVyLXJlZiByZWY9JnF1b3Q7Q2hhaW5zYXcmcXVvdDsnKV0iIGluc2VydC1hZnRlcj0iYXBwZW5kZXItcmVmIj4KLQotICAgICAgPCEtLSsKLSAgICAgICAgICB8IFVuY29tbWVudCB0byBlbmFibGUgbG9nZ2luZyB0byBDaGFpbnNhdy4KLSAgICAgICAgICB8IFNlZSBodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqL2RvY3MvY2hhaW5zYXcuaHRtbAotICAgICAgICAgICstLT4KLSAgICAgIDwhLS0KLSAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJDaGFpbnNhdyIgLz4KLSAgICAgICAgLS0+Ci08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2NvbmZwYXRjaC9sb2c0ai1sb2dnZXIueGNvbmYgYi90cnVuay9zcmMvY29uZnBhdGNoL2xvZzRqLWxvZ2dlci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2MWZjNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvY29uZnBhdGNoL2xvZzRqLWxvZ2dlci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb25maWd1cmF0aW9uIiB1bmxlc3M9Ii9jb25maWd1cmF0aW9uL2xvZ2dlcltAbmFtZT0nb3JnLm1vcnRiYXkuaHR0cC5Db250ZXh0TG9hZGVyJ10iIGluc2VydC1hZnRlcj0iYXBwZW5kZXIiPgotCi0gICAgPGxvZ2dlciBuYW1lPSJvcmcubW9ydGJheS5odHRwLkNvbnRleHRMb2FkZXIiPgotICAgICAgICA8bGV2ZWwgdmFsdWU9Indhcm4iLz4KLSAgICA8L2xvZ2dlcj4KLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvY29uZnBhdGNoL2xvZ2dlci1jbGFzcy54d2ViIGIvdHJ1bmsvc3JjL2NvbmZwYXRjaC9sb2dnZXItY2xhc3MueHdlYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhNWMxYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvY29uZnBhdGNoL2xvZ2dlci1jbGFzcy54d2ViCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08eHdlYiB4cGF0aD0iL3dlYi1hcHAvc2VydmxldFtzZXJ2bGV0LW5hbWUgPSAnQ29jb29uJ10iCi0gICAgICB1bmxlc3M9ImluaXQtcGFyYW1bcGFyYW0tbmFtZSA9ICdsb2dnZXItY2xhc3MnIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZS1zcGFjZShwYXJhbS12YWx1ZSkgPSAnb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmxvZ2dlci5Mb2c0SkxvZ2dlck1hbmFnZXInXSIKLSAgICAgIGluc2VydC1hZnRlcj0iaW5pdC1wYXJhbVtwb3NpdGlvbigpID0gbGFzdCgpXSI+Ci0gICAgPGluaXQtcGFyYW0+Ci0gICAgICA8cGFyYW0tbmFtZT5sb2dnZXItY2xhc3M8L3BhcmFtLW5hbWU+Ci0gICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmxvZ2dlci5Mb2c0SkxvZ2dlck1hbmFnZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8aW5pdC1wYXJhbT4KLSAgICAgIDxwYXJhbS1uYW1lPmxvZzRqLWNvbmZpZzwvcGFyYW0tbmFtZT4KLSAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9sb2c0ai54Y29uZjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9pbml0LXBhcmFtPgotPC94d2ViPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9jb25mcGF0Y2gvbG9na2l0LWNhdGVnb3JpZXMueGNvbmYgYi90cnVuay9zcmMvY29uZnBhdGNoL2xvZ2tpdC1jYXRlZ29yaWVzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGRhNTFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9jb25mcGF0Y2gvbG9na2l0LWNhdGVnb3JpZXMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhjb25mIHhwYXRoPSIvbG9na2l0L2NhdGVnb3JpZXMiIHVubGVzcz0iY2F0ZWdvcnlbQG5hbWU9J2xlbnlhJ10iPgotICAgIDxjYXRlZ29yeSBuYW1lPSJsZW55YSIgbG9nLWxldmVsPSJJTkZPIj4KLSAgICAgIDxsb2ctdGFyZ2V0IGlkLXJlZj0ibGVueWEiLz4KLSAgICAgIDxsb2ctdGFyZ2V0IGlkLXJlZj0iZXJyb3IiLz4KLSAgICA8L2NhdGVnb3J5PgotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9jb25mcGF0Y2gvbG9na2l0LXRhcmdldHMueGNvbmYgYi90cnVuay9zcmMvY29uZnBhdGNoL2xvZ2tpdC10YXJnZXRzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWYwODBmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9jb25mcGF0Y2gvbG9na2l0LXRhcmdldHMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhjb25mIHhwYXRoPSIvbG9na2l0L3RhcmdldHMiIHVubGVzcz0iY29jb29uW0BpZD0nbGVueWEnXSI+Ci0JPGNvY29vbiBpZD0ibGVueWEiPgotCSAgPGZpbGVuYW1lPiR7Y29udGV4dC1yb290fS9XRUItSU5GL2xvZ3MvbGVueWEubG9nPC9maWxlbmFtZT4KLQkgIDxmb3JtYXQgdHlwZT0iY29jb29uIj4KLQkgICAgJTcuN3twcmlvcml0eX0gJXt0aW1lfSAgIFsle2NhdGVnb3J5fV0gKCV7dXJpfSkgJXt0aHJlYWR9LyV7Y2xhc3M6c2hvcnR9OiAle21lc3NhZ2V9XG4le3Rocm93YWJsZX0KLQkgIDwvZm9ybWF0PgotCSAgPGFwcGVuZD5mYWxzZTwvYXBwZW5kPgotCTwvY29jb29uPgotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9jb25mcGF0Y2gvb3ZlcndyaXRlLXVwbG9hZHMueHdlYiBiL3RydW5rL3NyYy9jb25mcGF0Y2gvb3ZlcndyaXRlLXVwbG9hZHMueHdlYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MGVkYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvY29uZnBhdGNoL292ZXJ3cml0ZS11cGxvYWRzLnh3ZWIKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4d2ViIHhwYXRoPSIvd2ViLWFwcC9zZXJ2bGV0L2luaXQtcGFyYW1bcGFyYW0tbmFtZT0nb3ZlcndyaXRlLXVwbG9hZHMnXS9wYXJhbS12YWx1ZSIKLQlyZW1vdmU9Ii93ZWItYXBwL3NlcnZsZXQvaW5pdC1wYXJhbVtwYXJhbS1uYW1lPSdvdmVyd3JpdGUtdXBsb2FkcyddL3BhcmFtLXZhbHVlL3RleHQoKSIKLT5hbGxvdzwveHdlYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvY29uZnBhdGNoL3Nlc3Npb24tbGlzdGVuZXIueHdlYiBiL3RydW5rL3NyYy9jb25mcGF0Y2gvc2Vzc2lvbi1saXN0ZW5lci54d2ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZmNzg1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9jb25mcGF0Y2gvc2Vzc2lvbi1saXN0ZW5lci54d2ViCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHh3ZWIgeHBhdGg9Ii93ZWItYXBwIiB1bmxlc3M9Imxpc3RlbmVyIiBpbnNlcnQtYmVmb3JlPSJub2RlKClbMV0iPgotCi0gIDxsaXN0ZW5lcj4KLSAgICA8IS0tCi0gICAgICAtIExpc3RlbiBmb3IgbmV3IHNlc3Npb25zIGFuZCBzdG9yZSB0aGUgb2JqZWN0cyBpbiBhIEhhc2hNYXAgCi0gICAgICAtLT4KLSAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5sZW55YS51dGlsLlNlc3Npb25MaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gIDwvbGlzdGVuZXI+Ci0KLTwveHdlYj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9jb25mcGF0Y2gvdXBsb2FkLW1heC1zaXplLnh3ZWIgYi90cnVuay9zcmMvY29uZnBhdGNoL3VwbG9hZC1tYXgtc2l6ZS54d2ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGFkYTg2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9jb25mcGF0Y2gvdXBsb2FkLW1heC1zaXplLnh3ZWIKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHh3ZWIgeHBhdGg9Ii93ZWItYXBwL3NlcnZsZXQvaW5pdC1wYXJhbVtwYXJhbS1uYW1lPSd1cGxvYWQtbWF4LXNpemUnXS9wYXJhbS12YWx1ZSIKLSAgICAgIHJlbW92ZT0iL3dlYi1hcHAvc2VydmxldC9pbml0LXBhcmFtW3BhcmFtLW5hbWU9J3VwbG9hZC1tYXgtc2l6ZSddL3BhcmFtLXZhbHVlL3RleHQoKSIKLT4xMDAwMDAwMDwveHdlYj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvQ29uZmlndXJhYmxlRWxlbWVudFNldC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9Db25maWd1cmFibGVFbGVtZW50U2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Y2Q2N2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9Db25maWd1cmFibGVFbGVtZW50U2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5Jbml0aWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci0KLS8qKgotICogQXZhbG9uLWJhc2VkIGVsZW1lbnQgc2V0LgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlRWxlbWVudFNldCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIEVsZW1lbnRTZXQsIENvbmZpZ3VyYWJsZSwKLSAgICAgICAgVGhyZWFkU2FmZSwgSW5pdGlhbGl6YWJsZSwgU2VydmljZWFibGUgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVXJpOwotICAgIHByaXZhdGUgTWFwIGVsZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHRoaXMubmFtZXNwYWNlVXJpID0gY29uZmlnLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25bXSBhdHRyaWJ1dGVDb25maWdzID0gY29uZmlnLmdldENoaWxkcmVuKCJlbGVtZW50Iik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlQ29uZmlncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVDb25maWdzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgICAgICAgICAgYm9vbGVhbiBpc011bHRpcGxlID0gYXR0cmlidXRlQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGVBc0Jvb2xlYW4oIm11bHRpcGxlIiwgZmFsc2UpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0VkaXRhYmxlID0gYXR0cmlidXRlQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGVBc0Jvb2xlYW4oImVkaXRhYmxlIiwgZmFsc2UpOwotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbk9uQ29weSA9IGF0dHJpYnV0ZUNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKCJvbkNvcHkiLCAiY29weSIpOwotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IG5ldyBFbGVtZW50SW1wbChuYW1lLCBpc011bHRpcGxlLCBpc0VkaXRhYmxlKTsKLSAgICAgICAgICAgIGludCBhY3Rpb247Ci0gICAgICAgICAgICBpZiAoYWN0aW9uT25Db3B5LmVxdWFsc0lnbm9yZUNhc2UoImNvcHkiKSkgewotICAgICAgICAgICAgICAgIGFjdGlvbiA9IEVsZW1lbnQuT05DT1BZX0NPUFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb25PbkNvcHkuZXF1YWxzSWdub3JlQ2FzZSgiaWdub3JlIikpIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSBFbGVtZW50Lk9OQ09QWV9JR05PUkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb25PbkNvcHkuZXF1YWxzSWdub3JlQ2FzZSgiZGVsZXRlIikpIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSBFbGVtZW50Lk9OQ09QWV9ERUxFVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVGhlIGFjdGlvbiBbIiArIGFjdGlvbk9uQ29weSArICJdIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QWN0aW9uT25Db3B5KGFjdGlvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLnB1dChuYW1lLCBlbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnRbXSBnZXRFbGVtZW50cygpIHsKLSAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXMgPSB0aGlzLmVsZW1lbnRzLnZhbHVlcygpOwotICAgICAgICByZXR1cm4gKEVsZW1lbnRbXSkgdmFsdWVzLnRvQXJyYXkobmV3IEVsZW1lbnRbdmFsdWVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KSB0aGlzLmVsZW1lbnRzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlVXJpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRWxlbWVudChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5rZXlTZXQoKS5jb250YWlucyhuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGFEYXRhUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVnaXN0cnkgPSAoTWV0YURhdGFSZWdpc3RyeSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChNZXRhRGF0YVJlZ2lzdHJ5LlJPTEUpOwotICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoZ2V0TmFtZXNwYWNlVXJpKCksIHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZWdpc3RyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL0VsZW1lbnRJbXBsLmphdmEgYi90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiODE3MTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhOwotCi0vKioKLSAqIEVsZW1lbnQgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEVsZW1lbnQgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gIiI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVkaXRhYmxlOwotICAgIAotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUuCi0gICAgICogQHBhcmFtIGlzTXVsdGlwbGUgaWYgdGhlIGVsZW1lbnQgY2FuIGhhdmUgbXVsdGlwbGUgdmFsdWVzLgotICAgICAqIEBwYXJhbSBpc0VkaXRhYmxlIGlmIHRoZSBlbGVtZW50IGNhbiBiZSBlZGl0ZWQuCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnRJbXBsKFN0cmluZyBuYW1lLCBib29sZWFuIGlzTXVsdGlwbGUsIGJvb2xlYW4gaXNFZGl0YWJsZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLm11bHRpcGxlID0gaXNNdWx0aXBsZTsKLSAgICAgICAgdGhpcy5lZGl0YWJsZSA9IGlzRWRpdGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gaXNNdWx0aXBsZSBpZiB0aGUgZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSB2YWx1ZXMuCi0gICAgICogQHBhcmFtIGlzRWRpdGFibGUgIGlmIHRoZSBlbGVtZW50IGNhbiBiZSBlZGl0ZWQuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudEltcGwoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNNdWx0aXBsZSwgYm9vbGVhbiBpc0VkaXRhYmxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcyhuYW1lLCBpc011bHRpcGxlLCBpc0VkaXRhYmxlKTsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgYWN0aW9uT25Db3B5OwotCi0gICAgcHVibGljIGludCBnZXRBY3Rpb25PbkNvcHkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFjdGlvbk9uQ29weTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIG1ldGEgZGF0YSBhcmUgY29waWVkLgotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gaWYgdGhlIGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbk9uQ29weShpbnQgYWN0aW9uKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICB0aGlzLmFjdGlvbk9uQ29weSA9IGFjdGlvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvTWV0YURhdGFSZWdpc3RyeUltcGwuamF2YSBiL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvTWV0YURhdGFSZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhMWQ0MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhUmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci0KLS8qKgotICogTWV0YSBkYXRhIHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFSZWdpc3RyeUltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBNZXRhRGF0YVJlZ2lzdHJ5LAotICAgICAgICBUaHJlYWRTYWZlIHsKLQotICAgIHB1YmxpYyBFbGVtZW50U2V0IGdldEVsZW1lbnRTZXQoU3RyaW5nIG5hbWVzcGFjZVVyaSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc1JlZ2lzdGVyZWQobmFtZXNwYWNlVXJpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKCJUaGUgbmFtZXNwYWNlIFVSSSBbIiArIG5hbWVzcGFjZVVyaQotICAgICAgICAgICAgICAgICAgICArICJdIGlzIG5vdCByZWdpc3RlcmVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRWxlbWVudFNldCkgdGhpcy5uYW1lc3BhY2Uyc2V0LmdldChuYW1lc3BhY2VVcmkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChTdHJpbmcgbmFtZXNwYWNlVXJpKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2Uyc2V0LmNvbnRhaW5zS2V5KG5hbWVzcGFjZVVyaSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgbmFtZXNwYWNlMnNldCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihTdHJpbmcgbmFtZXNwYWNlVXJpLCBFbGVtZW50U2V0IGVsZW1lbnRTZXQpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZTJzZXQuY29udGFpbnNLZXkobmFtZXNwYWNlVXJpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKCJUaGUgbmFtZXNwYWNlIFsiICsgbmFtZXNwYWNlVXJpCi0gICAgICAgICAgICAgICAgICAgICsgIl0gaXMgYWxyZWFkeSByZWdpc3RlcmVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlMnNldC5wdXQobmFtZXNwYWNlVXJpLCBlbGVtZW50U2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZXNwYWNlVXJpcygpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNldCBrZXlzID0gdGhpcy5uYW1lc3BhY2Uyc2V0LmtleVNldCgpOwotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBrZXlzLnRvQXJyYXkobmV3IFN0cmluZ1trZXlzLnNpemUoKV0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tb2R1bGUvTW9kdWxlTWFuYWdlckltcGwuamF2YSBiL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbW9kdWxlL01vZHVsZU1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzODViMDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tb2R1bGUvTW9kdWxlTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tb2R1bGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci0KLS8qKgotICogTW9kdWxlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVNYW5hZ2VySW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIE1vZHVsZU1hbmFnZXIsIFRocmVhZFNhZmUsCi0gICAgICAgIENvbmZpZ3VyYWJsZSB7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VVUkkoU3RyaW5nIHNob3J0Y3V0KSB0aHJvd3MgTW9kdWxlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCF0aGlzLm1vZHVsZTJzcmMuY29udGFpbnNLZXkoc2hvcnRjdXQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9kdWxlRXhjZXB0aW9uKCJUaGUgbW9kdWxlIFsiICsgc2hvcnRjdXQgKyAiXSBpcyBub3QgcmVnaXN0ZXJlZCEiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGJhc2VVcmk7Ci0gICAgICAgIGlmICh0aGlzLm1vZHVsZXNDb3BpZWQpIHsKLSAgICAgICAgICAgIGJhc2VVcmkgPSAiY29udGV4dDovL2xlbnlhL21vZHVsZXMvIiArIHNob3J0Y3V0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHRoaXMubW9kdWxlMnNyYy5nZXQoc2hvcnRjdXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlVXJpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlSWRzKCl7Ci0gICAgICAgIFNldCBzZXQgPSBtb2R1bGUyc3JjLmtleVNldCgpOwotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBzZXQudG9BcnJheShuZXcgU3RyaW5nW3NldC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbW9kdWxlc0NvcGllZCA9IGZhbHNlOwotICAgIHByaXZhdGUgTWFwIG1vZHVsZTJzcmMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gbW9kdWxlc0NvbmZpZyA9IGNvbmZpZy5nZXRDaGlsZCgibW9kdWxlcyIpOwotICAgICAgICB0aGlzLm1vZHVsZXNDb3BpZWQgPSBtb2R1bGVzQ29uZmlnLmdldEF0dHJpYnV0ZUFzQm9vbGVhbigiY29weSIpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25bXSBtb2R1bGVzID0gbW9kdWxlc0NvbmZpZy5nZXRDaGlsZHJlbigibW9kdWxlIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHNob3J0Y3V0ID0gbW9kdWxlc1tpXS5nZXRBdHRyaWJ1dGUoInNob3J0Y3V0Iik7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjID0gbW9kdWxlc1tpXS5nZXRBdHRyaWJ1dGUoInNyYyIpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5ldyBGaWxlKHNyYykudG9VUkkoKS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhpcy5tb2R1bGUyc3JjLnB1dChzaG9ydGN1dCwgdXJpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0FyZWFJbXBsLmphdmEgYi90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0FyZWFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZjgwYzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9BcmVhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci0KLS8qKgotICogQXJlYSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEFyZWFJbXBsIGltcGxlbWVudHMgQXJlYSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgUHVibGljYXRpb24gcHViOwotICAgIHByaXZhdGUgRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBOb2RlRmFjdG9yeSBub2RlRmFjdG9yeTsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5LgotICAgICAqIEBwYXJhbSBwdWIgVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhcmVhIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIEFyZWFJbXBsKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIHRoaXMucHViID0gcHViOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgLy8gY2hlY2sgc2l0ZSBzdHJ1Y3R1cmUgZmlyc3QgKHBlcmZvcm1hbmNlKQotICAgICAgICBpZiAoZ2V0U2l0ZSgpLmNvbnRhaW5zQnlVdWlkKHV1aWQsIGxhbmd1YWdlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgc291cmNlVXJpID0gRG9jdW1lbnRJbXBsLmdldFNvdXJjZVVSSShwdWIsIG5hbWUsIHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGdldFB1YmxpY2F0aW9uKCkuZ2V0U2Vzc2lvbigpLmdldFJlcG9zaXRvcnlJdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9kZUZhY3RvcnkoKSwgc291cmNlVXJpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5leGlzdHMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE5vZGVGYWN0b3J5IGdldE5vZGVGYWN0b3J5KCkgewotICAgICAgICBpZiAodGhpcy5ub2RlRmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMubm9kZUZhY3RvcnkgPSAoTm9kZUZhY3RvcnkpIHRoaXMubWFuYWdlci5sb29rdXAoTm9kZUZhY3RvcnkuUk9MRSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5ub2RlRmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjdG9yeS5nZXQoZ2V0UHVibGljYXRpb24oKSwgZ2V0TmFtZSgpLCB1dWlkLCBsYW5ndWFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHViOwotICAgIH0KLQotICAgIHByaXZhdGUgU2l0ZVN0cnVjdHVyZSBzaXRlOwotCi0gICAgcHVibGljIFNpdGVTdHJ1Y3R1cmUgZ2V0U2l0ZSgpIHsKLSAgICAgICAgaWYgKHRoaXMuc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTaXRlTWFuYWdlciBzaXRlTWFuYWdlciA9IG51bGw7Ci0gICAgICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoU2l0ZU1hbmFnZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3QoZ2V0UHVibGljYXRpb24oKS5nZXRTaXRlTWFuYWdlckhpbnQoKSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zaXRlID0gc2l0ZU1hbmFnZXIuZ2V0U2l0ZVN0cnVjdHVyZSh0aGlzLmZhY3RvcnksIGdldFB1YmxpY2F0aW9uKCksIGdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShzaXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zaXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQdWJsaWNhdGlvbigpLmdldElkKCkgKyAiOiIgKyBnZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50W10gZ2V0RG9jdW1lbnRzKCkgewotICAgICAgICBTaXRlTm9kZVtdIG5vZGVzID0gZ2V0U2l0ZSgpLmdldE5vZGVzKCk7Ci0gICAgICAgIExpc3QgZG9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG5vZGVzW2ldLmdldFV1aWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGFuZ3MgPSBub2Rlc1tpXS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGxhbmdzLmxlbmd0aDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb2NzLmFkZChub2Rlc1tpXS5nZXRMaW5rKGxhbmdzW2xdKS5nZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2l0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKERvY3VtZW50W10pIGRvY3MudG9BcnJheShuZXcgRG9jdW1lbnRbZG9jcy5zaXplKCldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRGYWN0b3J5QnVpbGRlckltcGwuamF2YSBiL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRGYWN0b3J5QnVpbGRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlNTQzMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RmFjdG9yeUJ1aWxkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay50aHJlYWQuVGhyZWFkU2FmZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLS8qKgotICogRG9jdW1lbnQgZmFjdG9yeSBidWlsZGVyIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGYWN0b3J5QnVpbGRlckltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBUaHJlYWRTYWZlLAotICAgICAgICBEb2N1bWVudEZhY3RvcnlCdWlsZGVyLCBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRGYWN0b3J5IGNyZWF0ZURvY3VtZW50RmFjdG9yeShTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudEZhY3RvcnlJbXBsKHNlc3Npb24sIHRoaXMubWFuYWdlciwgZ2V0TG9nZ2VyKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEZhY3RvcnlJbXBsLmphdmEgYi90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiM2IyZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5SXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQSBEb2N1bWVudElkZW50aXR5TWFwIGF2b2lkcyB0aGUgbXVsdGlwbGUgaW5zdGFuY2lhdGlvbiBvZiBhIGRvY3VtZW50IG9iamVjdC4KLSAqIAotICogQHZlcnNpb24gJElkOiBEb2N1bWVudElkZW50aXR5TWFwLmphdmEgMjY0MTUzIDIwMDUtMDgtMjkgMTU6MTE6MTRaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGYWN0b3J5SW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIERvY3VtZW50RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsKLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlciB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50RmFjdG9yeUltcGwoU2Vzc2lvbiBzZXNzaW9uLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBkb2N1bWVudCBVVUlELgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXQocHVibGljYXRpb24sIGFyZWEsIHV1aWQsIGxhbmd1YWdlLCAtMSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGdldChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UsCi0gICAgICAgICAgICBpbnQgcmV2aXNpb24pIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50SWRlbnRpdHlNYXA6OmdldCgpIGNhbGxlZCBvbiBwdWJsaWNhdGlvbiBbIiArIHB1YmxpY2F0aW9uLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdLCBhcmVhIFsiICsgYXJlYSArICJdLCBVVUlEIFsiICsgdXVpZCArICJdLCBsYW5ndWFnZSBbIiArIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkocHVibGljYXRpb24sIGFyZWEsIHV1aWQsIGxhbmd1YWdlLCByZXZpc2lvbik7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50SWRlbnRpdHlNYXA6OmdldCgpIGdvdCBrZXkgWyIgKyBrZXkgKyAiXSBmcm9tIERvY3VtZW50RmFjdG9yeSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKERvY3VtZW50KSBnZXRTZXNzaW9uKCkuZ2V0UmVwb3NpdG9yeUl0ZW0odGhpcywga2V5KTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IGlkZW50aWZpZWQgYnkgYSBjZXJ0YWluIHdlYiBhcHBsaWNhdGlvbiBVUkwuCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgd2ViIGFwcGxpY2F0aW9uIFVSTC4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RnJvbVVSTChTdHJpbmcgd2ViYXBwVXJsKSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkod2ViYXBwVXJsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoRG9jdW1lbnQpIGdldFNlc3Npb24oKS5nZXRSZXBvc2l0b3J5SXRlbSh0aGlzLCBrZXkpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgY2xvbmUgb2YgYSBkb2N1bWVudCBmb3IgYW5vdGhlciBsYW5ndWFnZS4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIGNsb25lLgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIHRhcmdldCBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0TGFuZ3VhZ2VWZXJzaW9uKERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgbGFuZ3VhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXQoZG9jdW1lbnQuZ2V0UHVibGljYXRpb24oKSwgZG9jdW1lbnQuZ2V0QXJlYSgpLCBkb2N1bWVudC5nZXRVVUlEKCksIGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBjbG9uZSBvZiBhIGRvY3VtZW50IGZvciBhbm90aGVyIGFyZWEuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byBjbG9uZS4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYSBvZiB0aGUgdGFyZ2V0IGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBnZXRBcmVhVmVyc2lvbihEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGFyZWEpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldChkb2N1bWVudC5nZXRQdWJsaWNhdGlvbigpLCBhcmVhLCBkb2N1bWVudC5nZXRVVUlEKCksIGRvY3VtZW50LmdldExhbmd1YWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIGRvY3VtZW50IGZvciB0aGUgZGVmYXVsdCBsYW5ndWFnZS4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSBkb2N1bWVudElkIFRoZSBkb2N1bWVudCBJRC4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0KFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTdHJpbmcgYXJlYSwgU3RyaW5nIGRvY3VtZW50SWQpCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXQocHVibGljYXRpb24sIGFyZWEsIGRvY3VtZW50SWQsIHB1YmxpY2F0aW9uLmdldERlZmF1bHRMYW5ndWFnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBzdHJpbmcgcmVwcmVzZW50cyBhIHZhbGlkIGRvY3VtZW50IElELgotICAgICAqIEBwYXJhbSBpZCBUaGUgc3RyaW5nLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWREb2N1bWVudElkKFN0cmluZyBpZCkgewotCi0gICAgICAgIGlmICghaWQuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBzbmlwcGV0cyA9IGlkLnNwbGl0KCIvIik7Ci0KLSAgICAgICAgaWYgKHNuaXBwZXRzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc25pcHBldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghc25pcHBldHNbaV0ubWF0Y2hlcygiW2EtekEtWjAtOVxcLV0rIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSB3ZWJhcHAgVVJMIHJlcHJlc2VudHMgYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIEEgd2ViIGFwcGxpY2F0aW9uIFVSTC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnQoU3RyaW5nIHdlYmFwcFVybCkgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gewotICAgICAgICBBc3NlcnQubm90TnVsbCgid2ViYXBwIFVSTCIsIHdlYmFwcFVybCk7Ci0gICAgICAgIFB1YmxpY2F0aW9uTWFuYWdlciBwdWJNZ3IgPSBnZXRQdWJNYW5hZ2VyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKHdlYmFwcFVybCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHViSWQgPSBpbmZvLmdldFB1YmxpY2F0aW9uSWQoKTsKLSAgICAgICAgICAgIGlmIChwdWJJZCAhPSBudWxsICYmIEFycmF5cy5hc0xpc3QocHViTWdyLmdldFB1YmxpY2F0aW9uSWRzKCkpLmNvbnRhaW5zKHB1YklkKSkgewotICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IHB1Yk1nci5nZXRQdWJsaWNhdGlvbih0aGlzLCBwdWJJZCk7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBwdWIuZ2V0RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuaXNEb2N1bWVudCh0aGlzLCB3ZWJhcHBVcmwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgZG9jdW1lbnQga2V5LgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIHV1aWQgVGhlIGRvY3VtZW50IFVVSUQuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcGFyYW0gcmV2aXNpb24gCi0gICAgICogQHJldHVybiBBIGtleS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleShQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UsIGludCByZXZpc2lvbikgewotICAgICAgICBBc3NlcnQubm90TnVsbCgicHVibGljYXRpb24iLCBwdWJsaWNhdGlvbik7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJhcmVhIiwgYXJlYSk7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJ1dWlkIiwgdXVpZCk7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJsYW5ndWFnZSIsIGxhbmd1YWdlKTsKLSAgICAgICAgcmV0dXJuIHB1YmxpY2F0aW9uLmdldElkKCkgKyAiOiIgKyBhcmVhICsgIjoiICsgdXVpZCArICI6IiArIGxhbmd1YWdlICsgIjoiICsgcmV2aXNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgZG9jdW1lbnQga2V5LgotICAgICAqIEBwYXJhbSB3ZWJhcHBVcmwgVGhlIHdlYiBhcHBsaWNhdGlvbiBVUkwuCi0gICAgICogQHJldHVybiBBIGtleS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleShTdHJpbmcgd2ViYXBwVXJsKSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJ3ZWJhcHAgVVJMIiwgd2ViYXBwVXJsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghaXNEb2N1bWVudCh3ZWJhcHBVcmwpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIGRvY3VtZW50IGZvciBVUkwgWyIgKyB3ZWJhcHBVcmwgKyAiXSBmb3VuZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERvY3VtZW50TG9jYXRvciBsb2NhdG9yID0gZ2V0TG9jYXRvcih3ZWJhcHBVcmwpOwotICAgICAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBnZXRQdWJsaWNhdGlvbihsb2NhdG9yLmdldFB1YmxpY2F0aW9uSWQoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgYXJlYSA9IGxvY2F0b3IuZ2V0QXJlYSgpOwotICAgICAgICAgICAgU3RyaW5nIHV1aWQgPSBwdWJsaWNhdGlvbi5nZXRBcmVhKGFyZWEpLmdldFNpdGUoKS5nZXROb2RlKGxvY2F0b3IuZ2V0UGF0aCgpKS5nZXRVdWlkKCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0S2V5KHB1YmxpY2F0aW9uLCBhcmVhLCB1dWlkLCBsb2NhdG9yLmdldExhbmd1YWdlKCksIC0xKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50TG9jYXRvciBnZXRMb2NhdG9yKFN0cmluZyB3ZWJhcHBVcmwpIHsKLSAgICAgICAgRG9jdW1lbnRMb2NhdG9yIGxvY2F0b3I7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICB3ZWJhcHBVcmwpOwotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBwdWJsaWNhdGlvbi5nZXREb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGxvY2F0b3IgPSBidWlsZGVyLmdldExvY2F0b3IodGhpcywgd2ViYXBwVXJsKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvY2F0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLklkZW50aWZpYWJsZUZhY3RvcnkjYnVpbGQob3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5JZGVudGl0eU1hcCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlJdGVtIGJ1aWxkSXRlbShTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBrZXkpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiRG9jdW1lbnRGYWN0b3J5OjpidWlsZCgpIGNhbGxlZCB3aXRoIGtleSBbIiArIGtleSArICJdIik7Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoa2V5LCAiOiIpOwotICAgICAgICBTdHJpbmcgcHVibGljYXRpb25JZCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgU3RyaW5nIGFyZWEgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgIFN0cmluZyB1dWlkID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgIFN0cmluZyByZXZpc2lvblN0cmluZyA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgaW50IHJldmlzaW9uID0gSW50ZWdlci52YWx1ZU9mKHJldmlzaW9uU3RyaW5nKS5pbnRWYWx1ZSgpOwotCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBnZXRQdWJsaWNhdGlvbihwdWJsaWNhdGlvbklkKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gcHVibGljYXRpb24uZ2V0RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBEb2N1bWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IG5ldyBEb2N1bWVudElkZW50aWZpZXIocHVibGljYXRpb25JZCwgYXJlYSwgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UpOwotICAgICAgICAgICAgZG9jdW1lbnQgPSBidWlsZERvY3VtZW50KHRoaXMsIGlkZW50aWZpZXIsIHJldmlzaW9uLCBidWlsZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRvY3VtZW50RmFjdG9yeTo6YnVpbGQoKSBkb25lLiIpOwotCi0gICAgICAgIHJldHVybiBkb2N1bWVudDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgYnVpbGREb2N1bWVudChEb2N1bWVudEZhY3RvcnkgbWFwLCBEb2N1bWVudElkZW50aWZpZXIgaWRlbnRpZmllciwKLSAgICAgICAgICAgIGludCByZXZpc2lvbiwgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudChtYXAsIGlkZW50aWZpZXIsIHJldmlzaW9uLCBidWlsZGVyKTsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKGRvY3VtZW50LCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IG9iamVjdC4gT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHNwZWNpZmljIGRvY3VtZW50IG9iamVjdHMsCi0gICAgICogZS5nLiwgZm9yIGRpZmZlcmVudCBkb2N1bWVudCBJRHMuCi0gICAgICogQHBhcmFtIG1hcCBUaGUgaWRlbnRpdHkgbWFwLgotICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyLgotICAgICAqIEBwYXJhbSByZXZpc2lvbiBUaGUgcmV2aXNpb24gb3IgLTEgZm9yIHRoZSBsYXRlc3QgcmV2aXNpb24uCi0gICAgICogQHBhcmFtIGJ1aWxkZXIgVGhlIGRvY3VtZW50IGJ1aWxkZXIuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudEltcGwgY3JlYXRlRG9jdW1lbnQoRG9jdW1lbnRGYWN0b3J5IG1hcCwgRG9jdW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIsCi0gICAgICAgICAgICBpbnQgcmV2aXNpb24sIERvY3VtZW50QnVpbGRlciBidWlsZGVyKSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRJbXBsKHRoaXMubWFuYWdlciwgbWFwLCBpZGVudGlmaWVyLCByZXZpc2lvbiwgZ2V0TG9nZ2VyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXQoRG9jdW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKGlkZW50aWZpZXIuZ2V0UHVibGljYXRpb25JZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBnZXQocHViLCBpZGVudGlmaWVyLmdldEFyZWEoKSwgaWRlbnRpZmllci5nZXRVVUlEKCksIGlkZW50aWZpZXIuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJdGVtVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERvY3VtZW50LlRSQU5TQUNUSU9OQUJMRV9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXQoRG9jdW1lbnRMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKGxvY2F0b3IuZ2V0UHVibGljYXRpb25JZCgpKTsKLSAgICAgICAgICAgIFNpdGVTdHJ1Y3R1cmUgc2l0ZSA9IHB1Yi5nZXRBcmVhKGxvY2F0b3IuZ2V0QXJlYSgpKS5nZXRTaXRlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXVpZCA9IHNpdGUuZ2V0Tm9kZShsb2NhdG9yLmdldFBhdGgoKSkuZ2V0VXVpZCgpOwotICAgICAgICAgICAgcmV0dXJuIGdldChwdWIsIGxvY2F0b3IuZ2V0QXJlYSgpLCB1dWlkLCBsb2NhdG9yLmdldExhbmd1YWdlKCkpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbihTdHJpbmcgaWQpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQdWJNYW5hZ2VyKCkuZ2V0UHVibGljYXRpb24odGhpcywgaWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBQdWJsaWNhdGlvbltdIGdldFB1YmxpY2F0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGdldFB1Yk1hbmFnZXIoKS5nZXRQdWJsaWNhdGlvbnModGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQdWJsaWNhdGlvbk1hbmFnZXIgcHViTWFuYWdlcjsKLQotICAgIHByb3RlY3RlZCBQdWJsaWNhdGlvbk1hbmFnZXIgZ2V0UHViTWFuYWdlcigpIHsKLSAgICAgICAgaWYgKHRoaXMucHViTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMucHViTWFuYWdlciA9IChQdWJsaWNhdGlvbk1hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoUHVibGljYXRpb25NYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucHViTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHNQdWJsaWNhdGlvbihTdHJpbmcgaWQpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0UHViTWFuYWdlcigpLmdldFB1YmxpY2F0aW9uSWRzKCkpLmNvbnRhaW5zKGlkKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50SW1wbC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjMjVhOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250YWluZXIuQ29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRWaXNpdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuQ29udGVudEhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQSB0eXBpY2FsIENNUyBkb2N1bWVudC4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50SW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIERvY3VtZW50IHsKLQotICAgIHByaXZhdGUgRG9jdW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXI7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLSAgICBwcml2YXRlIGludCByZXZpc2lvbiA9IC0xOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgZGF0YSBuYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL2RvY3VtZW50LzEuMCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdHlwZSBhdHRyaWJ1dGUuIEEgcmVzb3VyY2UgaGFzIGEgcmVzb3VyY2UgdHlwZTsgdGhpcyBpbmZvcm1hdGlvbiBjYW4KLSAgICAgKiBiZSB1c2VkIGUuZy4gZm9yIGRpZmZlcmVudCByZW5kZXJpbmcgb2YgZGlmZmVyZW50IHR5cGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX1JFU09VUkNFX1RZUEUgPSAicmVzb3VyY2VUeXBlIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtaW1lIHR5cGUgYXR0cmlidXRlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX01JTUVfVFlQRSA9ICJtaW1lVHlwZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29udGVudCB0eXBlIGF0dHJpYnV0ZS4gQW55IGNvbnRlbnQgbWFuYWdlZCBieSBMZW55YSBoYXMgYSB0eXBlOyB0aGlzCi0gICAgICogaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgZS5nLiB0byBwcm92aWRlIGFuIGFwcHJvcHJpYXRlIG1hbmFnZW1lbnQgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0NPTlRFTlRfVFlQRSA9ICJjb250ZW50VHlwZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSB0aGUgcmVxdWVzdCB0aGF0IGEgZG9jdW1lbnQgY2FuIGJlIGNhY2hlZCBiZWZvcmUgaXQgZXhwaXJlcwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0VYUElSRVMgPSAiZXhwaXJlcyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZXh0ZW5zaW9uIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50IHNvdXJjZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9FWFRFTlNJT04gPSAiZXh0ZW5zaW9uIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgRGVmYXVsdERvY3VtZW50LgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIG1hcCBUaGUgaWRlbnRpdHkgbWFwIHRoZSBkb2N1bWVudCBiZWxvbmdzIHRvLgotICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyLgotICAgICAqIEBwYXJhbSByZXZpc2lvbiBUaGUgcmV2aXNpb24gbnVtYmVyIG9yIC0xIGlmIHRoZSBsYXRlc3QgcmV2aXNpb24gc2hvdWxkIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIF9sb2dnZXIgYSBsb2dnZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnRJbXBsKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIERvY3VtZW50RmFjdG9yeSBtYXAsCi0gICAgICAgICAgICBEb2N1bWVudElkZW50aWZpZXIgaWRlbnRpZmllciwgaW50IHJldmlzaW9uLCBMb2dnZXIgX2xvZ2dlcikgewotCi0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBfbG9nZ2VyKTsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdERvY3VtZW50KCkgY3JlYXRpbmcgbmV3IGluc3RhbmNlIHdpdGggaWQgWyIgKyBpZGVudGlmaWVyLmdldFVVSUQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0sIGxhbmd1YWdlIFsiICsgaWRlbnRpZmllci5nZXRMYW5ndWFnZSgpICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpZGVudGlmaWVyLmdldFVVSUQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgVVVJRCBtdXN0IG5vdCBiZSBudWxsISIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwotICAgICAgICB0aGlzLmZhY3RvcnkgPSBtYXA7Ci0gICAgICAgIHRoaXMucmV2aXNpb24gPSByZXZpc2lvbjsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJEZWZhdWx0RG9jdW1lbnQoKSBkb25lIGJ1aWxkaW5nIGluc3RhbmNlIHdpdGggX2lkIFsiICsgaWRlbnRpZmllci5nZXRVVUlEKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdLCBfbGFuZ3VhZ2UgWyIgKyBpZGVudGlmaWVyLmdldExhbmd1YWdlKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCNnZXRFeHBpcmVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0ZSBnZXRFeHBpcmVzKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgRGF0ZSBleHBpcmVzID0gbnVsbDsKLSAgICAgICAgbG9uZyBzZWNzID0gMDsKLQotICAgICAgICBNZXRhRGF0YSBtZXRhRGF0YSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBleHBpcmVzTWV0YSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXRhRGF0YSA9IHRoaXMuZ2V0TWV0YURhdGEoTUVUQURBVEFfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIGV4cGlyZXNNZXRhID0gbWV0YURhdGEuZ2V0Rmlyc3RWYWx1ZSgiZXhwaXJlcyIpOwotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4cGlyZXNNZXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlY3MgPSBMb25nLnBhcnNlTG9uZyhleHBpcmVzTWV0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZWNzID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VjcyAhPSAtMSkgewotICAgICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKLSAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIHNlY3MgKiAxMDAwbCk7Ci0gICAgICAgICAgICBleHBpcmVzID0gZGF0ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4cGlyZXMgPSB0aGlzLmdldFJlc291cmNlVHlwZSgpLmdldEV4cGlyZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBleHBpcmVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQjZ2V0TmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldExpbmsoKS5nZXROb2RlKCkuZ2V0TmFtZSgpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUHVibGljYXRpb24gcHVibGljYXRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCNnZXRQdWJsaWNhdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgewotICAgICAgICBpZiAodGhpcy5wdWJsaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMucHVibGljYXRpb24gPSBnZXRGYWN0b3J5KCkuZ2V0UHVibGljYXRpb24oZ2V0SWRlbnRpZmllcigpLmdldFB1YmxpY2F0aW9uSWQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucHVibGljYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCNnZXRMYXN0TW9kaWZpZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeU5vZGUoKS5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0UHVibGljYXRpb24oKS5nZXRQYXRoTWFwcGVyKCkuZ2V0RmlsZShnZXRQdWJsaWNhdGlvbigpLCBnZXRBcmVhKCksIGdldFVVSUQoKSwKLSAgICAgICAgICAgICAgICBnZXRMYW5ndWFnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50I2dldExhbmd1YWdlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pZGVudGlmaWVyLmdldExhbmd1YWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCNnZXRMYW5ndWFnZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMYW5ndWFnZXMoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotCi0gICAgICAgIExpc3QgZG9jdW1lbnRMYW5ndWFnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFN0cmluZ1tdIGFsbExhbmd1YWdlcyA9IGdldFB1YmxpY2F0aW9uKCkuZ2V0TGFuZ3VhZ2VzKCk7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJOdW1iZXIgb2YgbGFuZ3VhZ2VzIG9mIHRoaXMgcHVibGljYXRpb246ICIgKyBhbGxMYW5ndWFnZXMubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsTGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZXhpc3RzVHJhbnNsYXRpb24oYWxsTGFuZ3VhZ2VzW2ldKSkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50TGFuZ3VhZ2VzLmFkZChhbGxMYW5ndWFnZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgZG9jdW1lbnRMYW5ndWFnZXMudG9BcnJheShuZXcgU3RyaW5nW2RvY3VtZW50TGFuZ3VhZ2VzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQjZ2V0QXJlYSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmVhKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pZGVudGlmaWVyLmdldEFyZWEoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBleHRlbnNpb24gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRFeHRlbnNpb24gPSAiaHRtbCI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50I2dldEV4dGVuc2lvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0gICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUV4dGVuc2lvbiA9IGdldFNvdXJjZUV4dGVuc2lvbigpOwotICAgICAgICAgICAgaWYgKHNvdXJjZUV4dGVuc2lvbi5lcXVhbHMoInhtbCIpIHx8IHNvdXJjZUV4dGVuc2lvbi5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiRGVmYXVsdCBleHRlbnNpb24gd2lsbCBiZSB1c2VkOiAiICsgZGVmYXVsdEV4dGVuc2lvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRFeHRlbnNpb247Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VFeHRlbnNpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5leHRlbnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCNnZXRVVUlEKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJZGVudGlmaWVyKCkuZ2V0VVVJRCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRTb3VyY2VFeHRlbnNpb24gPSAieG1sIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQjZ2V0U291cmNlRXh0ZW5zaW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUV4dGVuc2lvbigpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4dGVuc2lvbjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvdXJjZUV4dGVuc2lvbiA9IGdldE1ldGFEYXRhKE1FVEFEQVRBX05BTUVTUEFDRSkuZ2V0Rmlyc3RWYWx1ZShNRVRBREFUQV9FWFRFTlNJT04pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvdXJjZUV4dGVuc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKAotICAgICAgICAgICAgICAgICAgICAiTm8gc291cmNlIGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQgWyIgKyB0aGlzICsgIl0uIFRoZSBleHRlbnNpb24gXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWZhdWx0U291cmNlRXh0ZW5zaW9uICsgIlwiIHdpbGwgYmUgdXNlZCBhcyBkZWZhdWx0ISIpOwotICAgICAgICAgICAgc291cmNlRXh0ZW5zaW9uID0gZGVmYXVsdFNvdXJjZUV4dGVuc2lvbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc291cmNlRXh0ZW5zaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZSBpbiB0aGUgVVJMLgotICAgICAqIEBwYXJhbSBfZXh0ZW5zaW9uIEEgc3RyaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgX2V4dGVuc2lvbikgewotICAgICAgICBjaGVja1dyaXRhYmlsaXR5KCk7Ci0gICAgICAgIGFzc2VydCBfZXh0ZW5zaW9uICE9IG51bGw7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoIkV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggYSBkb3QiLCAhX2V4dGVuc2lvbi5zdGFydHNXaXRoKCIuIikpOwotICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IF9leHRlbnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCNleGlzdHMoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeU5vZGUoKS5leGlzdHMoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50I2V4aXN0c0luQW55TGFuZ3VhZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4aXN0c0luQW55TGFuZ3VhZ2UoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBsYW5ndWFnZXMgPSBnZXRMYW5ndWFnZXMoKTsKLQotICAgICAgICBpZiAobGFuZ3VhZ2VzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgKCIgKyB0aGlzICsgIikgZXhpc3RzIGluIGF0IGxlYXN0IG9uZSBsYW5ndWFnZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhbmd1YWdlcy5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nW10gYWxsTGFuZ3VhZ2VzID0gZ2V0UHVibGljYXRpb24oKS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgICAgIGlmIChsYW5ndWFnZXMubGVuZ3RoID09IGFsbExhbmd1YWdlcy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBpcyBub3QgZW50aXJlbHkgdHJ1ZSwgYmVjYXVzZSB0aGUgcHVibGljYXRpb24KLSAgICAgICAgICAgICAgICAvLyBjb3VsZCBhc3N1bWUgdGhlCi0gICAgICAgICAgICAgICAgLy8gbGFuZ3VhZ2VzIEVOIGFuZCBERSwgYnV0IHRoZSBkb2N1bWVudCBjb3VsZCBleGlzdCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgLy8gbGFuZ3VhZ2VzIERFIGFuZCBGUiEKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgKCIgKyB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIGV4aXN0cyBldmVuIGluIGFsbCBsYW5ndWFnZXMgb2YgdGhpcyBwdWJsaWNhdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiRG9jdW1lbnQgKCIgKyB0aGlzICsgIikgZG9lcyBOT1QgZXhpc3QgaW4gYW55IGxhbmd1YWdlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudElkZW50aWZpZXIgZ2V0SWRlbnRpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpZmllcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKGdldENsYXNzKCkuaXNJbnN0YW5jZShvYmplY3QpKSB7Ci0gICAgICAgICAgICBEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBvYmplY3Q7Ci0gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhnZXRJZGVudGlmaWVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IGdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKSArICI6IiArIGdldFB1YmxpY2F0aW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSArICI6IgotICAgICAgICAgICAgICAgICsgZ2V0QXJlYSgpICsgIjoiICsgZ2V0VVVJRCgpICsgIjoiICsgZ2V0TGFuZ3VhZ2UoKTsKLQotICAgICAgICByZXR1cm4ga2V5Lmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCNnZXRGYWN0b3J5KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCNnZXRDYW5vbmljYWxXZWJhcHBVUkwoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCkgewotICAgICAgICByZXR1cm4gIi8iICsgZ2V0UHVibGljYXRpb24oKS5nZXRJZCgpICsgIi8iICsgZ2V0QXJlYSgpICsgZ2V0Q2Fub25pY2FsRG9jdW1lbnRVUkwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50I2dldENhbm9uaWNhbERvY3VtZW50VVJMKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhbm9uaWNhbERvY3VtZW50VVJMKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBnZXRQdWJsaWNhdGlvbigpLmdldERvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgU3RyaW5nIHdlYmFwcFVybCA9IGJ1aWxkZXIuYnVpbGRDYW5vbmljYWxVcmwoZ2V0RmFjdG9yeSgpLCBnZXRMb2NhdG9yKCkpOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIvIiArIGdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKSArICIvIiArIGdldEFyZWEoKTsKLSAgICAgICAgICAgIHJldHVybiB3ZWJhcHBVcmwuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQjYWNjZXB0KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRWaXNpdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjY2VwdChEb2N1bWVudFZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdmlzaXRvci52aXNpdERvY3VtZW50KHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQjZGVsZXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoaGFzTGluaygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oIkNhbid0IGRlbGV0ZSBkb2N1bWVudCBbIiArIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgKyAiXSwgaXQncyBzdGlsbCByZWZlcmVuY2VkIGluIHRoZSBzaXRlIHN0cnVjdHVyZS4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0UmVwb3NpdG9yeU5vZGUoKS5kZWxldGUoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJQUJMRV9UWVBFID0gImRvY3VtZW50IjsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZTsKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZWFkIHRoZSBkb2N1bWVudCdzIHJlc291cmNlIHR5cGUgZnJvbSB0aGUgbWV0YS1kYXRhLgotICAgICAqIEBzZWUgRG9jdW1lbnQjZ2V0UmVzb3VyY2VUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE1ldGFEYXRhKE1FVEFEQVRBX05BTUVTUEFDRSkuZ2V0Rmlyc3RWYWx1ZShNRVRBREFUQV9SRVNPVVJDRV9UWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEV4Y2VwdGlvbigiTm8gcmVzb3VyY2UgdHlwZSBkZWZpbmVkIGZvciBkb2N1bWVudCBbIiArIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoUmVzb3VyY2VUeXBlLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZSA9IChSZXNvdXJjZVR5cGUpIHNlbGVjdG9yLnNlbGVjdChuYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGEgZ2V0TWV0YURhdGEoU3RyaW5nIG5hbWVzcGFjZVVyaSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRIb2xkZXIoKS5nZXRNZXRhRGF0YShuYW1lc3BhY2VVcmkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNZXRhRGF0YU5hbWVzcGFjZVVyaXMoKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0Q29udGVudEhvbGRlcigpLmdldE1ldGFEYXRhTmFtZXNwYWNlVXJpcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZ2V0TWV0YURhdGEoTUVUQURBVEFfTkFNRVNQQUNFKS5nZXRGaXJzdFZhbHVlKE1FVEFEQVRBX01JTUVfVFlQRSk7Ci0gICAgICAgICAgICBpZiAobWltZVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWltZVR5cGU7Ci0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRlbnRIb2xkZXIoKS5nZXRDb250ZW50TGVuZ3RoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBjaGVja1dyaXRhYmlsaXR5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRNZXRhRGF0YShNRVRBREFUQV9OQU1FU1BBQ0UpLnNldFZhbHVlKE1FVEFEQVRBX01JTUVfVFlQRSwgbWltZVR5cGUpOwotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRMb2NhdG9yIGdldExvY2F0b3IoKSB7Ci0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgc3RydWN0dXJlID0gYXJlYSgpLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKCFzdHJ1Y3R1cmUuY29udGFpbnNCeVV1aWQoZ2V0VVVJRCgpLCBnZXRMYW5ndWFnZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBkb2N1bWVudCBbIiArIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgc2l0ZSBzdHJ1Y3R1cmUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBEb2N1bWVudExvY2F0b3IuZ2V0TG9jYXRvcihnZXRQdWJsaWNhdGlvbigpLmdldElkKCksIGdldEFyZWEoKSwgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgIC5nZXRCeVV1aWQoZ2V0VVVJRCgpLCBnZXRMYW5ndWFnZSgpKS5nZXROb2RlKCkuZ2V0UGF0aCgpLCBnZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoU2l0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5rKCkuZ2V0Tm9kZSgpLmdldFBhdGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHNBcmVhVmVyc2lvbihTdHJpbmcgYXJlYSkgewotICAgICAgICBTdHJpbmcgc291cmNlVXJpID0gZ2V0U291cmNlVVJJKGdldFB1YmxpY2F0aW9uKCksIGFyZWEsIGdldFVVSUQoKSwgZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gU291cmNlVXRpbC5leGlzdHMoc291cmNlVXJpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHNUcmFuc2xhdGlvbihTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGFyZWEoKS5jb250YWlucyhnZXRVVUlEKCksIGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0QXJlYVZlcnNpb24oU3RyaW5nIGFyZWEpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RmFjdG9yeSgpLmdldChnZXRQdWJsaWNhdGlvbigpLCBhcmVhLCBnZXRVVUlEKCksIGdldExhbmd1YWdlKCkpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXRUcmFuc2xhdGlvbihTdHJpbmcgbGFuZ3VhZ2UpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RmFjdG9yeSgpLmdldChnZXRQdWJsaWNhdGlvbigpLCBnZXRBcmVhKCksIGdldFVVSUQoKSwgbGFuZ3VhZ2UpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTm9kZSByZXBvc2l0b3J5Tm9kZTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQjZ2V0UmVwb3NpdG9yeU5vZGUoKQotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGdldFJlcG9zaXRvcnlOb2RlKCkgewotICAgICAgICBpZiAodGhpcy5yZXBvc2l0b3J5Tm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnJlcG9zaXRvcnlOb2RlID0gZ2V0UmVwb3NpdG9yeU5vZGUodGhpcy5tYW5hZ2VyLCBnZXRGYWN0b3J5KCksIGdldFNvdXJjZVVSSSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZXBvc2l0b3J5Tm9kZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udGVudEhvbGRlciBnZXRDb250ZW50SG9sZGVyKCkgewotICAgICAgICBOb2RlIG5vZGUgPSBnZXRSZXBvc2l0b3J5Tm9kZSgpOwotICAgICAgICBpZiAoaXNSZXZpc2lvblNwZWNpZmllZCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmdldEhpc3RvcnkoKS5nZXRSZXZpc2lvbihyZXZpc2lvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBOb2RlIGdldFJlcG9zaXRvcnlOb2RlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIERvY3VtZW50RmFjdG9yeSBkb2NGYWN0b3J5LAotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZVVyaSkgewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBkb2NGYWN0b3J5LmdldFNlc3Npb24oKTsKLSAgICAgICAgTm9kZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gKE5vZGVGYWN0b3J5KSBtYW5hZ2VyLmxvb2t1cChOb2RlRmFjdG9yeS5ST0xFKTsKLSAgICAgICAgICAgIHJldHVybiAoTm9kZSkgc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SXRlbShmYWN0b3J5LCBzb3VyY2VVcmkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNyZWF0aW5nIHJlcG9zaXRvcnkgbm9kZSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZShmYWN0b3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQjZ2V0U291cmNlVVJJKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvdXJjZVVSSShnZXRQdWJsaWNhdGlvbigpLCBnZXRBcmVhKCksIGdldFVVSUQoKSwgZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0U291cmNlVVJJKFB1YmxpY2F0aW9uIHB1YiwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBwdWIuZ2V0UGF0aE1hcHBlcigpLmdldFBhdGgodXVpZCwgbGFuZ3VhZ2UpOwotICAgICAgICByZXR1cm4gcHViLmdldFNvdXJjZVVSSSgpICsgIi9jb250ZW50LyIgKyBhcmVhICsgIi8iICsgcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHNWZXJzaW9uKFN0cmluZyBhcmVhLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZVVyaSA9IGdldFNvdXJjZVVSSShnZXRQdWJsaWNhdGlvbigpLCBhcmVhLCBnZXRVVUlEKCksIGxhbmd1YWdlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBTb3VyY2VVdGlsLmV4aXN0cyhzb3VyY2VVcmksIHRoaXMubWFuYWdlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXRWZXJzaW9uKFN0cmluZyBhcmVhLCBTdHJpbmcgbGFuZ3VhZ2UpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RmFjdG9yeSgpLmdldChnZXRQdWJsaWNhdGlvbigpLCBhcmVhLCBnZXRVVUlEKCksIGxhbmd1YWdlKTsKLSAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGluayBnZXRMaW5rKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSBhcmVhKCkuZ2V0U2l0ZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS5jb250YWluc0J5VXVpZChnZXRVVUlEKCksIGdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cnVjdHVyZS5nZXRCeVV1aWQoZ2V0VVVJRCgpLCBnZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RXhjZXB0aW9uKCJUaGUgZG9jdW1lbnQgWyIgKyB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIGlzIG5vdCByZWZlcmVuY2VkIGluIHRoZSBzaXRlIHN0cnVjdHVyZSBbIiArIHN0cnVjdHVyZSArICJdLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTGluaygpIHsKLSAgICAgICAgcmV0dXJuIGFyZWEoKS5nZXRTaXRlKCkuY29udGFpbnNCeVV1aWQoZ2V0VVVJRCgpLCBnZXRMYW5ndWFnZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJlYSBhcmVhKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFB1YmxpY2F0aW9uKCkuZ2V0QXJlYShnZXRBcmVhKCkpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0gICAgICAgIGNoZWNrV3JpdGFiaWxpdHkoKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInJlc291cmNlIHR5cGUiLCByZXNvdXJjZVR5cGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0YURhdGEgbWV0YSA9IGdldE1ldGFEYXRhKERvY3VtZW50SW1wbC5NRVRBREFUQV9OQU1FU1BBQ0UpOwotICAgICAgICAgICAgbWV0YS5zZXRWYWx1ZShEb2N1bWVudEltcGwuTUVUQURBVEFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tXcml0YWJpbGl0eSgpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgiZXh0ZW5zaW9uIiwgZXh0ZW5zaW9uKTsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZSgiZXh0ZW5zaW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIGRvdCIsICFleHRlbnNpb24uc3RhcnRzV2l0aCgiLiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGFEYXRhIG1ldGEgPSBnZXRNZXRhRGF0YShEb2N1bWVudEltcGwuTUVUQURBVEFfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIG1ldGEuc2V0VmFsdWUoRG9jdW1lbnRJbXBsLk1FVEFEQVRBX0VYVEVOU0lPTiwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgY2hlY2tXcml0YWJpbGl0eSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnlOb2RlKCkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1dyaXRhYmlsaXR5KCkgewotICAgICAgICBpZiAoaXNSZXZpc2lvblNwZWNpZmllZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmV2aXNpb25TcGVjaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJldmlzaW9uICE9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3J5Tm9kZSgpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0RmFjdG9yeSgpLmdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJldmlzaW9uTnVtYmVyKCkgewotICAgICAgICBpZiAoIWlzUmV2aXNpb25TcGVjaWZpZWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBub3QgYSBwYXJ0aWN1bGFyIHJldmlzaW9uIG9mIHRoZSBkb2N1bWVudCBbIiArIHRoaXMgKyAiXS4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZXZpc2lvbjsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50TWFuYWdlckltcGwuamF2YSBiL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWM4MTFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0LkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51dGlsLkRvY3VtZW50U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRWaXNpdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLk5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIERvY3VtZW50TWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRNYW5hZ2VySW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIERvY3VtZW50TWFuYWdlciwKLSAgICAgICAgU2VydmljZWFibGUsIENvbnRleHR1YWxpemFibGUgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXIjYWRkKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50LAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGFkZChEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgU3RyaW5nIGFyZWEsIFN0cmluZyBwYXRoLCBTdHJpbmcgbGFuZ3VhZ2UsCi0gICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uLCBTdHJpbmcgbmF2aWdhdGlvblRpdGxlLCBib29sZWFuIHZpc2libGVJbk5hdikKLSAgICAgICAgICAgIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBhZGQoc291cmNlRG9jdW1lbnQuZ2V0RmFjdG9yeSgpLCBzb3VyY2VEb2N1bWVudC5nZXRSZXNvdXJjZVR5cGUoKSwKLSAgICAgICAgICAgICAgICBzb3VyY2VEb2N1bWVudC5nZXRJbnB1dFN0cmVhbSgpLCBzb3VyY2VEb2N1bWVudC5nZXRQdWJsaWNhdGlvbigpLCBhcmVhLCBwYXRoLAotICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBleHRlbnNpb24sIG5hdmlnYXRpb25UaXRsZSwgdmlzaWJsZUluTmF2LCBzb3VyY2VEb2N1bWVudC5nZXRNaW1lVHlwZSgpKTsKLQotICAgICAgICBjb3B5TWV0YURhdGEoc291cmNlRG9jdW1lbnQsIGRvY3VtZW50KTsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyBtZXRhIGRhdGEgZnJvbSBvbmUgZG9jdW1lbnQgdG8gYW5vdGhlci4gSWYgdGhlIGRlc3RpbmF0aW9uCi0gICAgICogZG9jdW1lbnQgaXMgYSBkaWZmZXJlbnQgYXJlYSB2ZXJzaW9uLCB0aGUgbWV0YSBkYXRhIGFyZSBkdXBsaWNhdGVkIChpLmUuLAotICAgICAqIG9uQ29weSA9IGRlbGV0ZSBpcyBuZWdsZWN0ZWQpLgotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weU1ldGFEYXRhKERvY3VtZW50IHNvdXJjZSwgRG9jdW1lbnQgZGVzdGluYXRpb24pIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiBkdXBsaWNhdGUgPSBzb3VyY2UuZ2V0VVVJRCgpLmVxdWFscyhkZXN0aW5hdGlvbi5nZXRVVUlEKCkpCi0gICAgICAgICAgICAgICAgJiYgc291cmNlLmdldExhbmd1YWdlKCkuZXF1YWxzKGRlc3RpbmF0aW9uLmdldExhbmd1YWdlKCkpCi0gICAgICAgICAgICAgICAgJiYgIXNvdXJjZS5nZXRBcmVhKCkuZXF1YWxzKGRlc3RpbmF0aW9uLmdldEFyZWEoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHVyaXMgPSBzb3VyY2UuZ2V0TWV0YURhdGFOYW1lc3BhY2VVcmlzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmdldE1ldGFEYXRhKHVyaXNbaV0pLmZvcmNlZFJlcGxhY2VCeShzb3VyY2UuZ2V0TWV0YURhdGEodXJpc1tpXSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmdldE1ldGFEYXRhKHVyaXNbaV0pLnJlcGxhY2VCeShzb3VyY2UuZ2V0TWV0YURhdGEodXJpc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXIjYWRkKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeSwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZSwgamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGFkZChEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgUmVzb3VyY2VUeXBlIGRvY3VtZW50VHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBpbml0aWFsQ29udGVudHNVUkksIFB1YmxpY2F0aW9uIHB1YiwgU3RyaW5nIGFyZWEsIFN0cmluZyBwYXRoLCBTdHJpbmcgbGFuZ3VhZ2UsCi0gICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uLCBTdHJpbmcgbmF2aWdhdGlvblRpdGxlLCBib29sZWFuIHZpc2libGVJbk5hdikKLSAgICAgICAgICAgIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiwgUHVibGljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIEFyZWEgYXJlYU9iaiA9IHB1Yi5nZXRBcmVhKGFyZWEpOwotICAgICAgICBTaXRlU3RydWN0dXJlIHNpdGUgPSBhcmVhT2JqLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKHNpdGUuY29udGFpbnMocGF0aCkgJiYgc2l0ZS5nZXROb2RlKHBhdGgpLmhhc0xpbmsobGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oIlRoZSBsaW5rIFsiICsgcGF0aCArICI6IiArIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICsgIl0gaXMgYWxyZWFkeSBjb250YWluZWQgaW4gc2l0ZSBbIiArIHNpdGUgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBhZGQoZmFjdG9yeSwgZG9jdW1lbnRUeXBlLCBpbml0aWFsQ29udGVudHNVUkksIHB1YiwgYXJlYSwgbGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLQotICAgICAgICBhZGRUb1NpdGVNYW5hZ2VyKHBhdGgsIGRvY3VtZW50LCBuYXZpZ2F0aW9uVGl0bGUsIHZpc2libGVJbk5hdik7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgYWRkKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBSZXNvdXJjZVR5cGUgZG9jdW1lbnRUeXBlLAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5pdGlhbENvbnRlbnRzU3RyZWFtLCBQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBhcmVhLCBTdHJpbmcgcGF0aCwKLSAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIG5hdmlnYXRpb25UaXRsZSwgYm9vbGVhbiB2aXNpYmxlSW5OYXYsIFN0cmluZyBtaW1lVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiwgUHVibGljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIEFyZWEgYXJlYU9iaiA9IHB1Yi5nZXRBcmVhKGFyZWEpOwotICAgICAgICBTaXRlU3RydWN0dXJlIHNpdGUgPSBhcmVhT2JqLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKHNpdGUuY29udGFpbnMocGF0aCkgJiYgc2l0ZS5nZXROb2RlKHBhdGgpLmhhc0xpbmsobGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oIlRoZSBsaW5rIFsiICsgcGF0aCArICI6IiArIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICsgIl0gaXMgYWxyZWFkeSBjb250YWluZWQgaW4gc2l0ZSBbIiArIHNpdGUgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBhZGQoZmFjdG9yeSwgZG9jdW1lbnRUeXBlLCBpbml0aWFsQ29udGVudHNTdHJlYW0sIHB1YiwgYXJlYSwgbGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLCBtaW1lVHlwZSk7Ci0KLSAgICAgICAgYWRkVG9TaXRlTWFuYWdlcihwYXRoLCBkb2N1bWVudCwgbmF2aWdhdGlvblRpdGxlLCB2aXNpYmxlSW5OYXYpOwotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGFkZChEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgUmVzb3VyY2VUeXBlIGRvY3VtZW50VHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBpbml0aWFsQ29udGVudHNVUkksIFB1YmxpY2F0aW9uIHB1YiwgU3RyaW5nIGFyZWEsIFN0cmluZyBsYW5ndWFnZSwKLSAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24pIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdXVpZCA9IGdlbmVyYXRlVVVJRCgpOwotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKGluaXRpYWxDb250ZW50c1VSSSk7Ci0gICAgICAgICAgICByZXR1cm4gYWRkKGZhY3RvcnksIGRvY3VtZW50VHlwZSwgdXVpZCwgc291cmNlLmdldElucHV0U3RyZWFtKCksIHB1YiwgYXJlYSwgbGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwgZ2V0TWltZVR5cGUoc291cmNlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHVibGljYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWltZVR5cGUoU291cmNlIHNvdXJjZSkgewotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBzb3VyY2UuZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1pbWVUeXBlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1pbWVUeXBlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudCBhZGQoRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnksIFJlc291cmNlVHlwZSBkb2N1bWVudFR5cGUsCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbml0aWFsQ29udGVudHNTdHJlYW0sIFB1YmxpY2F0aW9uIHB1YiwgU3RyaW5nIGFyZWEsIFN0cmluZyBsYW5ndWFnZSwKLSAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24sIFN0cmluZyBtaW1lVHlwZSkgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24sIERvY3VtZW50RXhjZXB0aW9uLAotICAgICAgICAgICAgUHVibGljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB1dWlkID0gZ2VuZXJhdGVVVUlEKCk7Ci0gICAgICAgIHJldHVybiBhZGQoZmFjdG9yeSwgZG9jdW1lbnRUeXBlLCB1dWlkLCBpbml0aWFsQ29udGVudHNTdHJlYW0sIHB1YiwgYXJlYSwgbGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLCBtaW1lVHlwZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGFkZChEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgUmVzb3VyY2VUeXBlIGRvY3VtZW50VHlwZSwgU3RyaW5nIHV1aWQsCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0sIFB1YmxpY2F0aW9uIHB1YiwgU3RyaW5nIGFyZWEsIFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIG1pbWVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBpZiAoZXhpc3RzKGZhY3RvcnksIHB1YiwgYXJlYSwgdXVpZCwgbGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRFeGNlcHRpb24oIlRoZSBkb2N1bWVudCBbIiArIHB1Yi5nZXRJZCgpICsgIjoiICsgYXJlYSArICI6IgotICAgICAgICAgICAgICAgICAgICAgICAgKyB1dWlkICsgIjoiICsgbGFuZ3VhZ2UgKyAiXSBhbHJlYWR5IGV4aXN0cyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBmYWN0b3J5LmdldChwdWIsIGFyZWEsIHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGRvY3VtZW50LmdldFJlcG9zaXRvcnlOb2RlKCk7Ci0gICAgICAgICAgICBub2RlLmxvY2soKTsKLQotICAgICAgICAgICAgZG9jdW1lbnQuc2V0UmVzb3VyY2VUeXBlKGRvY3VtZW50VHlwZSk7Ci0gICAgICAgICAgICBkb2N1bWVudC5zZXRTb3VyY2VFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIGRvY3VtZW50LnNldE1pbWVUeXBlKG1pbWVUeXBlKTsKLQotICAgICAgICAgICAgLy8gV3JpdGUgTGVueWEtaW50ZXJuYWwgbWV0YS1kYXRhCi0gICAgICAgICAgICBNZXRhRGF0YSBsZW55YU1ldGFEYXRhID0gZG9jdW1lbnQuZ2V0TWV0YURhdGEoRG9jdW1lbnRJbXBsLk1FVEFEQVRBX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICBsZW55YU1ldGFEYXRhLnNldFZhbHVlKERvY3VtZW50SW1wbC5NRVRBREFUQV9DT05URU5UX1RZUEUsICJ4bWwiKTsKLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ3JlYXRlIik7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBkb2N1bWVudDogICAgIFsiICsgZG9jdW1lbnQgKyAiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcmVhdGUoc3RyZWFtLCBkb2N1bWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbigiY2FsbCB0byBjcmVhdG9yIGZvciBuZXcgZG9jdW1lbnQgZmFpbGVkIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlVVVJRCgpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHV1aWQ7Ci0gICAgICAgIFVVSURHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgZ2VuZXJhdG9yID0gKFVVSURHZW5lcmF0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoVVVJREdlbmVyYXRvci5ST0xFKTsKLSAgICAgICAgICAgIHV1aWQgPSBnZW5lcmF0b3IubmV4dFVVSUQoKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRFeGNlcHRpb24oImNhbGwgdG8gY3JlYXRvciBmb3IgbmV3IGRvY3VtZW50IGZhaWxlZCIsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGdlbmVyYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoZ2VuZXJhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXVpZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoSW5wdXRTdHJlYW0gc3RyZWFtLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gUmVhZCBpbml0aWFsIGNvbnRlbnRzIGFzIERPTQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdENyZWF0b3I6OmNyZWF0ZSgpLCByZWFkeSB0byByZWFkIGluaXRpYWwgY29udGVudHMgZnJvbSBVUkkgWyIgKyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0KLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBjb3B5KHJlc29sdmVyLCBzdHJlYW0sIGRvY3VtZW50KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weShTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgSW5wdXRTdHJlYW0gc291cmNlSW5wdXRTdHJlYW0sIERvY3VtZW50IGRlc3RpbmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIHVzZUJ1ZmZlciA9IHRydWU7Ci0KLSAgICAgICAgT3V0cHV0U3RyZWFtIGRlc3RPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVzdE91dHB1dFN0cmVhbSA9IGRlc3RpbmF0aW9uLmdldE91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBpZiAodXNlQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNvdXJjZUJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBJT1V0aWxzLmNvcHkoc291cmNlSW5wdXRTdHJlYW0sIHNvdXJjZUJvcyk7Ci0gICAgICAgICAgICAgICAgSU9VdGlscy53cml0ZShzb3VyY2VCb3MudG9CeXRlQXJyYXkoKSwgZGVzdE91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIElPVXRpbHMuY29weShzb3VyY2VJbnB1dFN0cmVhbSwgZGVzdE91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZGVzdE91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGVzdE91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGRlc3RPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzb3VyY2VJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvU2l0ZU1hbmFnZXIoU3RyaW5nIHBhdGgsIERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgbmF2aWdhdGlvblRpdGxlLAotICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlSW5OYXYpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGFkZFRvU2l0ZU1hbmFnZXIocGF0aCwgZG9jdW1lbnQsIG5hdmlnYXRpb25UaXRsZSwgdmlzaWJsZUluTmF2LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb1NpdGVNYW5hZ2VyKFN0cmluZyBwYXRoLCBEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIG5hdmlnYXRpb25UaXRsZSwKLSAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZUluTmF2LCBTdHJpbmcgZm9sbG93aW5nU2libGluZ1BhdGgpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgc2l0ZSA9IGRvY3VtZW50LmFyZWEoKS5nZXRTaXRlKCk7Ci0gICAgICAgIGlmICghc2l0ZS5jb250YWlucyhwYXRoKSAmJiBmb2xsb3dpbmdTaWJsaW5nUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzaXRlLmFkZChwYXRoLCBmb2xsb3dpbmdTaWJsaW5nUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l0ZS5hZGQocGF0aCwgZG9jdW1lbnQpOwotICAgICAgICBkb2N1bWVudC5nZXRMaW5rKCkuc2V0TGFiZWwobmF2aWdhdGlvblRpdGxlKTsKLSAgICAgICAgZG9jdW1lbnQuZ2V0TGluaygpLmdldE5vZGUoKS5zZXRWaXNpYmxlKHZpc2libGVJbk5hdik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVtcGxhdGUgbWV0aG9kIHRvIGNvcHkgYSBkb2N1bWVudC4gT3ZlcnJpZGUKLSAgICAgKiB7QGxpbmsgI2NvcHlEb2N1bWVudFNvdXJjZShEb2N1bWVudCwgRG9jdW1lbnQpfSB0byBpbXBsZW1lbnQgYWNjZXNzIHRvIGEKLSAgICAgKiBjdXN0b20gcmVwb3NpdG9yeS4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlciNjb3B5KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRMb2NhdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHkoRG9jdW1lbnQgc291cmNlRG9jLCBEb2N1bWVudExvY2F0b3IgZGVzdGluYXRpb24pIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCFkZXN0aW5hdGlvbi5nZXRQdWJsaWNhdGlvbklkKCkuZXF1YWxzKHNvdXJjZURvYy5nZXRQdWJsaWNhdGlvbigpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHVibGljYXRpb25FeGNlcHRpb24oIkNhbid0IGNvcHkgdG8gYSBkaWZmZXJlbnQgcHVibGljYXRpb24hIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTaXRlU3RydWN0dXJlIGRlc3RTaXRlID0gc291cmNlRG9jLmdldFB1YmxpY2F0aW9uKCkuZ2V0QXJlYShkZXN0aW5hdGlvbi5nZXRBcmVhKCkpCi0gICAgICAgICAgICAgICAgLmdldFNpdGUoKTsKLSAgICAgICAgU3RyaW5nIGRlc3RQYXRoID0gZGVzdGluYXRpb24uZ2V0UGF0aCgpOwotICAgICAgICBpZiAoZGVzdFNpdGUuY29udGFpbnMoZGVzdGluYXRpb24uZ2V0UGF0aCgpLCBkZXN0aW5hdGlvbi5nZXRMYW5ndWFnZSgpKSkgewotICAgICAgICAgICAgRG9jdW1lbnQgZGVzdERvYyA9IGRlc3RTaXRlLmdldE5vZGUoZGVzdFBhdGgpLmdldExpbmsoZGVzdGluYXRpb24uZ2V0TGFuZ3VhZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBjb3B5RG9jdW1lbnRTb3VyY2Uoc291cmNlRG9jLCBkZXN0RG9jKTsKLSAgICAgICAgICAgIGNvcHlJblNpdGVTdHJ1Y3R1cmUoc291cmNlRG9jLCBkZXN0RG9jLCBkZXN0UGF0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGQoc291cmNlRG9jLCBkZXN0aW5hdGlvbi5nZXRBcmVhKCksIGRlc3RQYXRoLCBkZXN0aW5hdGlvbi5nZXRMYW5ndWFnZSgpLCBzb3VyY2VEb2MKLSAgICAgICAgICAgICAgICAgICAgLmdldEV4dGVuc2lvbigpLCBzb3VyY2VEb2MuZ2V0TGluaygpLmdldExhYmVsKCksIHNvdXJjZURvYy5nZXRMaW5rKCkuZ2V0Tm9kZSgpCi0gICAgICAgICAgICAgICAgICAgIC5pc1Zpc2libGUoKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlJblNpdGVTdHJ1Y3R1cmUoRG9jdW1lbnQgc291cmNlRG9jLCBEb2N1bWVudCBkZXN0RG9jLCBTdHJpbmcgZGVzdFBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24sIERvY3VtZW50RXhjZXB0aW9uLCBTaXRlRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZGVzdEFyZWEgPSBkZXN0RG9jLmdldEFyZWEoKTsKLQotICAgICAgICBTaXRlU3RydWN0dXJlIGRlc3RTaXRlID0gc291cmNlRG9jLmdldFB1YmxpY2F0aW9uKCkuZ2V0QXJlYShkZXN0QXJlYSkuZ2V0U2l0ZSgpOwotCi0gICAgICAgIGlmIChzb3VyY2VEb2MuaGFzTGluaygpKSB7Ci0gICAgICAgICAgICBpZiAoZGVzdERvYy5oYXNMaW5rKCkpIHsKLSAgICAgICAgICAgICAgICBMaW5rIHNyY0xpbmsgPSBzb3VyY2VEb2MuZ2V0TGluaygpOwotICAgICAgICAgICAgICAgIExpbmsgZGVzdExpbmsgPSBkZXN0RG9jLmdldExpbmsoKTsKLSAgICAgICAgICAgICAgICBkZXN0TGluay5zZXRMYWJlbChzcmNMaW5rLmdldExhYmVsKCkpOwotICAgICAgICAgICAgICAgIGRlc3RMaW5rLmdldE5vZGUoKS5zZXRWaXNpYmxlKHNyY0xpbmsuZ2V0Tm9kZSgpLmlzVmlzaWJsZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gc291cmNlRG9jLmdldExpbmsoKS5nZXRMYWJlbCgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IHNvdXJjZURvYy5nZXRMaW5rKCkuZ2V0Tm9kZSgpLmlzVmlzaWJsZSgpOwotICAgICAgICAgICAgICAgIGlmIChkZXN0U2l0ZS5jb250YWlucyhzb3VyY2VEb2MuZ2V0TGluaygpLmdldE5vZGUoKS5nZXRQYXRoKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFRvU2l0ZU1hbmFnZXIoZGVzdFBhdGgsIGRlc3REb2MsIGxhYmVsLCB2aXNpYmxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmb2xsb3dpbmdTaWJsaW5nUGF0aCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZURvYy5nZXRQYXRoKCkuZXF1YWxzKGRlc3RQYXRoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzb3VyY2VTaXRlID0gc291cmNlRG9jLmFyZWEoKS5nZXRTaXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNpdGVOb2RlW10gc291cmNlU2libGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaXRlTm9kZSBzb3VyY2VOb2RlID0gc291cmNlRG9jLmdldExpbmsoKS5nZXROb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlTm9kZS5pc1RvcExldmVsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTaWJsaW5ncyA9IHNvdXJjZVNpdGUuZ2V0VG9wTGV2ZWxOb2RlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VOb2RlLmdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTaWJsaW5ncyA9IHNvdXJjZU5vZGUuZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlU2libGluZ3MgPSBuZXcgU2l0ZU5vZGVbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlU2libGluZ3NbMF0gPSBzb3VyY2VOb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc291cmNlUG9zID0gQXJyYXlzLmFzTGlzdChzb3VyY2VTaWJsaW5ncykuaW5kZXhPZihzb3VyY2VOb2RlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IHNvdXJjZVBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChmb2xsb3dpbmdTaWJsaW5nUGF0aCA9PSBudWxsICYmIHBvcyA8IHNvdXJjZVNpYmxpbmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaWJsaW5nUGF0aCA9IHNvdXJjZVNpYmxpbmdzW3Bvc10uZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXN0U2l0ZS5jb250YWlucyhzaWJsaW5nUGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nU2libGluZ1BhdGggPSBzaWJsaW5nUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZm9sbG93aW5nU2libGluZ1BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9TaXRlTWFuYWdlcihkZXN0UGF0aCwgZGVzdERvYywgbGFiZWwsIHZpc2libGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9TaXRlTWFuYWdlcihkZXN0UGF0aCwgZGVzdERvYywgbGFiZWwsIHZpc2libGUsIGZvbGxvd2luZ1NpYmxpbmdQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyI2RlbGV0ZShvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZG9jdW1lbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQdWJsaWNhdGlvbkV4Y2VwdGlvbigiRG9jdW1lbnQgWyIgKyBkb2N1bWVudCArICJdIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRvY3VtZW50Lmhhc0xpbmsoKSkgewotICAgICAgICAgICAgZG9jdW1lbnQuZ2V0TGluaygpLmRlbGV0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZG9jdW1lbnQuZGVsZXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXIjbW92ZShvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TG9jYXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb3ZlKERvY3VtZW50IHNvdXJjZURvY3VtZW50LCBEb2N1bWVudExvY2F0b3IgZGVzdGluYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGlmICghZGVzdGluYXRpb24uZ2V0QXJlYSgpLmVxdWFscyhzb3VyY2VEb2N1bWVudC5nZXRBcmVhKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHVibGljYXRpb25FeGNlcHRpb24oIkNhbid0IG1vdmUgdG8gYSBkaWZmZXJlbnQgYXJlYSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgc2l0ZSA9IHNvdXJjZURvY3VtZW50LmFyZWEoKS5nZXRTaXRlKCk7Ci0gICAgICAgIGlmIChzaXRlLmNvbnRhaW5zKGRlc3RpbmF0aW9uLmdldFBhdGgoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQdWJsaWNhdGlvbkV4Y2VwdGlvbigiVGhlIHBhdGggWyIgKyBkZXN0aW5hdGlvbgotICAgICAgICAgICAgICAgICAgICArICJdIGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoaXMgcHVibGljYXRpb24hIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBzb3VyY2VEb2N1bWVudC5nZXRMaW5rKCkuZ2V0TGFiZWwoKTsKLSAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gc291cmNlRG9jdW1lbnQuZ2V0TGluaygpLmdldE5vZGUoKS5pc1Zpc2libGUoKTsKLSAgICAgICAgc291cmNlRG9jdW1lbnQuZ2V0TGluaygpLmRlbGV0ZSgpOwotCi0gICAgICAgIHNpdGUuYWRkKGRlc3RpbmF0aW9uLmdldFBhdGgoKSwgc291cmNlRG9jdW1lbnQpOwotICAgICAgICBzb3VyY2VEb2N1bWVudC5nZXRMaW5rKCkuc2V0TGFiZWwobGFiZWwpOwotICAgICAgICBzb3VyY2VEb2N1bWVudC5nZXRMaW5rKCkuZ2V0Tm9kZSgpLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlciNjb3B5VG9BcmVhKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50LAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5VG9BcmVhKERvY3VtZW50IHNvdXJjZURvYywgU3RyaW5nIGRlc3RpbmF0aW9uQXJlYSkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gc291cmNlRG9jLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGNvcHlUb1ZlcnNpb24oc291cmNlRG9jLCBkZXN0aW5hdGlvbkFyZWEsIGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5VG9WZXJzaW9uKERvY3VtZW50IHNvdXJjZURvYywgU3RyaW5nIGRlc3RpbmF0aW9uQXJlYSwgU3RyaW5nIGxhbmd1YWdlKQotICAgICAgICAgICAgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uLCBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBQdWJsaWNhdGlvbkV4Y2VwdGlvbiwgU2l0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRG9jdW1lbnQgZGVzdERvYzsKLSAgICAgICAgaWYgKHNvdXJjZURvYy5leGlzdHNBcmVhVmVyc2lvbihkZXN0aW5hdGlvbkFyZWEpKSB7Ci0gICAgICAgICAgICBkZXN0RG9jID0gc291cmNlRG9jLmdldEFyZWFWZXJzaW9uKGRlc3RpbmF0aW9uQXJlYSk7Ci0gICAgICAgICAgICBjb3B5RG9jdW1lbnRTb3VyY2Uoc291cmNlRG9jLCBkZXN0RG9jKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3REb2MgPSBhZGRWZXJzaW9uKHNvdXJjZURvYywgZGVzdGluYXRpb25BcmVhLCBsYW5ndWFnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlRG9jLmhhc0xpbmsoKSkgewotICAgICAgICAgICAgY29weUluU2l0ZVN0cnVjdHVyZShzb3VyY2VEb2MsIGRlc3REb2MsIHNvdXJjZURvYy5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXIjY29weVRvQXJlYShvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51dGlsLkRvY3VtZW50U2V0LAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb3B5VG9BcmVhKERvY3VtZW50U2V0IGRvY3VtZW50U2V0LCBTdHJpbmcgZGVzdGluYXRpb25BcmVhKQotICAgICAgICAgICAgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBkb2N1bWVudFNldC5nZXREb2N1bWVudHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvcHlUb0FyZWEoZG9jdW1lbnRzW2ldLCBkZXN0aW5hdGlvbkFyZWEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBfbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBfbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbnRleHQgY29udGV4dDsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZSNjb250ZXh0dWFsaXplKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udGV4dHVhbGl6ZShDb250ZXh0IF9jb250ZXh0KSB0aHJvd3MgQ29udGV4dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IF9jb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIEF2YWxvbiBjb250ZXh0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZUFsbChBcmVhIHNvdXJjZUFyZWEsIFN0cmluZyBzb3VyY2VQYXRoLCBBcmVhIHRhcmdldEFyZWEsIFN0cmluZyB0YXJnZXRQYXRoKQotICAgICAgICAgICAgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZVN0cnVjdHVyZSBzaXRlID0gc291cmNlQXJlYS5nZXRTaXRlKCk7Ci0KLSAgICAgICAgU2l0ZU5vZGUgcm9vdCA9IHNpdGUuZ2V0Tm9kZShzb3VyY2VQYXRoKTsKLSAgICAgICAgTGlzdCBzdWJzaXRlID0gcHJlT3JkZXIocm9vdCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBuID0gc3Vic2l0ZS5pdGVyYXRvcigpOyBuLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFNpdGVOb2RlIG5vZGUgPSAoU2l0ZU5vZGUpIG4ubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHN1YlBhdGggPSBub2RlLmdldFBhdGgoKS5zdWJzdHJpbmcoc291cmNlUGF0aC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB0YXJnZXRBcmVhLmdldFNpdGUoKS5hZGQodGFyZ2V0UGF0aCArIHN1YlBhdGgpOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2Uoc3Vic2l0ZSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgbiA9IHN1YnNpdGUuaXRlcmF0b3IoKTsgbi5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTaXRlTm9kZSBub2RlID0gKFNpdGVOb2RlKSBuLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBzdWJQYXRoID0gbm9kZS5nZXRQYXRoKCkuc3Vic3RyaW5nKHNvdXJjZVBhdGgubGVuZ3RoKCkpOwotICAgICAgICAgICAgbW92ZUFsbExhbmd1YWdlVmVyc2lvbnMoc291cmNlQXJlYSwgc291cmNlUGF0aCArIHN1YlBhdGgsIHRhcmdldEFyZWEsIHRhcmdldFBhdGgKLSAgICAgICAgICAgICAgICAgICAgKyBzdWJQYXRoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBwcmVPcmRlcihTaXRlTm9kZSBub2RlKSB7Ci0gICAgCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJbGlzdC5hZGQobm9kZSk7Ci0gICAgCVNpdGVOb2RlW10gY2hpbGRyZW4gPSBub2RlLmdldENoaWxkcmVuKCk7Ci0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAJCWxpc3QuYWRkQWxsKHByZU9yZGVyKGNoaWxkcmVuW2ldKSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZUFsbExhbmd1YWdlVmVyc2lvbnMoQXJlYSBzb3VyY2VBcmVhLCBTdHJpbmcgc291cmNlUGF0aCwgQXJlYSB0YXJnZXRBcmVhLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhdGgpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2l0ZU5vZGUgc291cmNlTm9kZSA9IHNvdXJjZUFyZWEuZ2V0U2l0ZSgpLmdldE5vZGUoc291cmNlUGF0aCk7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IHNvdXJjZU5vZGUuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBMaW5rIHNvdXJjZUxpbmsgPSBzb3VyY2VOb2RlLmdldExpbmsobGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IHNvdXJjZUxpbmsuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIERvY3VtZW50IHNvdXJjZURvYyA9IHNvdXJjZUxpbmsuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHNvdXJjZUxpbmsuZGVsZXRlKCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IHRhcmdldERvYzsKLSAgICAgICAgICAgIGlmIChzb3VyY2VBcmVhLmdldE5hbWUoKS5lcXVhbHModGFyZ2V0QXJlYS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0RG9jID0gc291cmNlRG9jOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YXJnZXREb2MgPSBhZGRWZXJzaW9uKHNvdXJjZURvYywgdGFyZ2V0QXJlYS5nZXROYW1lKCksIHNvdXJjZURvYy5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgICAgICBjb3B5UmV2aXNpb25zKHNvdXJjZURvYywgdGFyZ2V0RG9jKTsKLSAgICAgICAgICAgICAgICBzb3VyY2VEb2MuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpbmsgbGluayA9IHRhcmdldEFyZWEuZ2V0U2l0ZSgpLmFkZCh0YXJnZXRQYXRoLCB0YXJnZXREb2MpOwotICAgICAgICAgICAgbGluay5zZXRMYWJlbChsYWJlbCk7Ci0gICAgICAgICAgICBBc3NlcnQuaXNUcnVlKCJsYWJlbCBzZXQiLCB0YXJnZXREb2MuZ2V0TGluaygpLmdldExhYmVsKCkuZXF1YWxzKGxhYmVsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU2l0ZU5vZGUgdGFyZ2V0Tm9kZSA9IHRhcmdldEFyZWEuZ2V0U2l0ZSgpLmdldE5vZGUodGFyZ2V0UGF0aCk7Ci0gICAgICAgIHRhcmdldE5vZGUuc2V0VmlzaWJsZShzb3VyY2VOb2RlLmlzVmlzaWJsZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5UmV2aXNpb25zKERvY3VtZW50IHNvdXJjZURvYywgRG9jdW1lbnQgdGFyZ2V0RG9jKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTm9kZSB0YXJnZXROb2RlID0gdGFyZ2V0RG9jLmdldFJlcG9zaXRvcnlOb2RlKCk7Ci0gICAgICAgICAgICB0YXJnZXROb2RlLmNvcHlSZXZpc2lvbnNGcm9tKHNvdXJjZURvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQdWJsaWNhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlBbGwoQXJlYSBzb3VyY2VBcmVhLCBTdHJpbmcgc291cmNlUGF0aCwgQXJlYSB0YXJnZXRBcmVhLCBTdHJpbmcgdGFyZ2V0UGF0aCkKLSAgICAgICAgICAgIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2l0ZVN0cnVjdHVyZSBzaXRlID0gc291cmNlQXJlYS5nZXRTaXRlKCk7Ci0gICAgICAgIFNpdGVOb2RlIHJvb3QgPSBzaXRlLmdldE5vZGUoc291cmNlUGF0aCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHByZU9yZGVyID0gcHJlT3JkZXIocm9vdCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByZU9yZGVyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFNpdGVOb2RlIG5vZGUgPSAoU2l0ZU5vZGUpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5vZGVTb3VyY2VQYXRoID0gbm9kZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbm9kZVRhcmdldFBhdGggPSB0YXJnZXRQYXRoICsgbm9kZVNvdXJjZVBhdGguc3Vic3RyaW5nKHNvdXJjZVBhdGgubGVuZ3RoKCkpOwotICAgICAgICAgICAgY29weUFsbExhbmd1YWdlVmVyc2lvbnMoc291cmNlQXJlYSwgbm9kZVNvdXJjZVBhdGgsIHRhcmdldEFyZWEsIG5vZGVUYXJnZXRQYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlBbGxMYW5ndWFnZVZlcnNpb25zKEFyZWEgc291cmNlQXJlYSwgU3RyaW5nIHNvdXJjZVBhdGgsIEFyZWEgdGFyZ2V0QXJlYSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQYXRoKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBzb3VyY2VBcmVhLmdldFB1YmxpY2F0aW9uKCk7Ci0KLSAgICAgICAgU2l0ZU5vZGUgc291cmNlTm9kZSA9IHNvdXJjZUFyZWEuZ2V0U2l0ZSgpLmdldE5vZGUoc291cmNlUGF0aCk7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IHNvdXJjZU5vZGUuZ2V0TGFuZ3VhZ2VzKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgdGFyZ2V0RG9jID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhbmd1YWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRG9jdW1lbnQgc291cmNlVmVyc2lvbiA9IHNvdXJjZU5vZGUuZ2V0TGluayhsYW5ndWFnZXNbaV0pLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBEb2N1bWVudExvY2F0b3IgdGFyZ2V0TG9jYXRvciA9IERvY3VtZW50TG9jYXRvci5nZXRMb2NhdG9yKHB1Yi5nZXRJZCgpLCB0YXJnZXRBcmVhCi0gICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHRhcmdldFBhdGgsIGxhbmd1YWdlc1tpXSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RG9jID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb3B5KHNvdXJjZVZlcnNpb24sIHRhcmdldExvY2F0b3IuZ2V0TGFuZ3VhZ2VWZXJzaW9uKGxhbmd1YWdlc1tpXSkpOwotICAgICAgICAgICAgICAgIHRhcmdldERvYyA9IHRhcmdldEFyZWEuZ2V0U2l0ZSgpLmdldE5vZGUodGFyZ2V0UGF0aCkuZ2V0TGluayhsYW5ndWFnZXNbaV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0RG9jID0gYWRkVmVyc2lvbih0YXJnZXREb2MsIHRhcmdldExvY2F0b3IuZ2V0QXJlYSgpLCBsYW5ndWFnZXNbaV0pOwotICAgICAgICAgICAgICAgIGFkZFRvU2l0ZU1hbmFnZXIodGFyZ2V0TG9jYXRvci5nZXRQYXRoKCksIHRhcmdldERvYywgc291cmNlVmVyc2lvbi5nZXRMaW5rKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMYWJlbCgpLCBzb3VyY2VWZXJzaW9uLmdldExpbmsoKS5nZXROb2RlKCkuaXNWaXNpYmxlKCkpOwotICAgICAgICAgICAgICAgIGNvcHlEb2N1bWVudFNvdXJjZShzb3VyY2VWZXJzaW9uLCB0YXJnZXREb2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgZG9jdW1lbnQgc291cmNlLgotICAgICAqIEBwYXJhbSBzb3VyY2VEb2N1bWVudCBUaGUgc291cmNlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkRvY3VtZW50IFRoZSBkZXN0aW5hdGlvbiBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weURvY3VtZW50U291cmNlKERvY3VtZW50IHNvdXJjZURvY3VtZW50LCBEb2N1bWVudCBkZXN0aW5hdGlvbkRvY3VtZW50KQotICAgICAgICAgICAgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgY29weUNvbnRlbnQoc291cmNlRG9jdW1lbnQsIGRlc3RpbmF0aW9uRG9jdW1lbnQpOwotICAgICAgICBjb3B5TWV0YURhdGEoc291cmNlRG9jdW1lbnQsIGRlc3RpbmF0aW9uRG9jdW1lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlDb250ZW50KERvY3VtZW50IHNvdXJjZURvY3VtZW50LCBEb2N1bWVudCBkZXN0aW5hdGlvbkRvY3VtZW50KQotICAgICAgICAgICAgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiB1c2VCdWZmZXIgPSB0cnVlOwotCi0gICAgICAgIE91dHB1dFN0cmVhbSBkZXN0T3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gc291cmNlSW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzb3VyY2VJbnB1dFN0cmVhbSA9IHNvdXJjZURvY3VtZW50LmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgZGVzdE91dHB1dFN0cmVhbSA9IGRlc3RpbmF0aW9uRG9jdW1lbnQuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodXNlQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzb3VyY2VCb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIElPVXRpbHMuY29weShzb3VyY2VJbnB1dFN0cmVhbSwgc291cmNlQm9zKTsKLSAgICAgICAgICAgICAgICAgICAgSU9VdGlscy53cml0ZShzb3VyY2VCb3MudG9CeXRlQXJyYXkoKSwgZGVzdE91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KHNvdXJjZUlucHV0U3RyZWFtLCBkZXN0T3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChkZXN0T3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdE91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBkZXN0T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgZG9jdW1lbnQgdmlzaXRvcnMgd2hpY2ggb3BlcmF0ZSBvbiBhIHNvdXJjZSBhbmQKLSAgICAgKiB0YXJnZXQgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZVRhcmdldFZpc2l0b3IgaW1wbGVtZW50cyBEb2N1bWVudFZpc2l0b3IgewotCi0gICAgICAgIHByaXZhdGUgRG9jdW1lbnRMb2NhdG9yIHJvb3RTb3VyY2U7Ci0gICAgICAgIHByaXZhdGUgRG9jdW1lbnRMb2NhdG9yIHJvb3RUYXJnZXQ7Ci0gICAgICAgIHByaXZhdGUgRG9jdW1lbnRNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEN0b3IuCi0gICAgICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBkb2N1bWVudCBtYW5hZ2VyLgotICAgICAgICAgKiBAcGFyYW0gc291cmNlIFRoZSByb290IHNvdXJjZS4KLSAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgcm9vdCB0YXJnZXQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU291cmNlVGFyZ2V0VmlzaXRvcihEb2N1bWVudE1hbmFnZXIgbWFuYWdlciwgRG9jdW1lbnQgc291cmNlLCBEb2N1bWVudExvY2F0b3IgdGFyZ2V0KSB7Ci0gICAgICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICAgICAgdGhpcy5yb290U291cmNlID0gc291cmNlLmdldExvY2F0b3IoKTsKLSAgICAgICAgICAgIHRoaXMucm9vdFRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSByb290IHNvdXJjZQotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIERvY3VtZW50TG9jYXRvciBnZXRSb290U291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIHJvb3RTb3VyY2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0aGUgcm9vdCB0YXJnZXQKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBEb2N1bWVudExvY2F0b3IgZ2V0Um9vdFRhcmdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiByb290VGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50IG1hbmFnZXIKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBEb2N1bWVudE1hbmFnZXIgZ2V0RG9jdW1lbnRNYW5hZ2VyKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgY29ycmVzcG9uZGluZyB0byBhIHNvdXJjZSByZWxhdGl2ZWx5IHRvIHRoZSByb290Ci0gICAgICAgICAqIHRhcmdldCBkb2N1bWVudC4KLSAgICAgICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlLgotICAgICAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGNvdWxkIG5vdCBiZSBidWlsdC4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBEb2N1bWVudExvY2F0b3IgZ2V0VGFyZ2V0KERvY3VtZW50IHNvdXJjZSkgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gewotICAgICAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHNvdXJjZUxvY2F0b3IgPSBzb3VyY2UuZ2V0TG9jYXRvcigpOwotICAgICAgICAgICAgU3RyaW5nIHJvb3RTb3VyY2VQYXRoID0gZ2V0Um9vdFNvdXJjZSgpLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VMb2NhdG9yLmdldFBhdGgoKS5lcXVhbHMocm9vdFNvdXJjZVBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3RUYXJnZXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSBzb3VyY2VMb2NhdG9yLmdldFBhdGgoKS5zdWJzdHJpbmcocm9vdFNvdXJjZVBhdGgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiByb290VGFyZ2V0LmdldERlc2NlbmRhbnQocmVsYXRpdmVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyI2RlbGV0ZUFsbChvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVBbGwoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2l0ZU1hbmFnZXIgc2l0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3QoZG9jdW1lbnQuZ2V0UHVibGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotCi0gICAgICAgICAgICBOb2RlU2V0IHN1YnNpdGUgPSBTaXRlVXRpbC5nZXRTdWJTaXRlKHRoaXMubWFuYWdlciwgZG9jdW1lbnQuZ2V0TGluaygpLmdldE5vZGUoKSk7Ci0gICAgICAgICAgICBmb3IgKE5vZGVJdGVyYXRvciBpID0gc3Vic2l0ZS5kZXNjZW5kaW5nKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFNpdGVOb2RlIG5vZGUgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBsYW5ndWFnZXMgPSBub2RlLmdldExhbmd1YWdlcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TGluayhsYW5ndWFnZXNbbF0pLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZShkb2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHVibGljYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzaXRlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2Uoc2l0ZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlciNkZWxldGVBbGxMYW5ndWFnZVZlcnNpb25zKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUFsbExhbmd1YWdlVmVyc2lvbnMoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBpZGVudGl0eU1hcCA9IGRvY3VtZW50LmdldEZhY3RvcnkoKTsKLSAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gZG9jdW1lbnQuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBEb2N1bWVudExvY2F0b3IgdmVyc2lvbiA9IGRvY3VtZW50LmdldExvY2F0b3IoKS5nZXRMYW5ndWFnZVZlcnNpb24obGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgIGRlbGV0ZShpZGVudGl0eU1hcC5nZXQodmVyc2lvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlzaXRvciB0byBkZWxldGUgZG9jdW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBEZWxldGVWaXNpdG9yIGltcGxlbWVudHMgRG9jdW1lbnRWaXNpdG9yIHsKLQotICAgICAgICBwcml2YXRlIERvY3VtZW50TWFuYWdlciBtYW5hZ2VyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDdG9yLgotICAgICAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgZG9jdW1lbnQgbWFuYWdlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEZWxldGVWaXNpdG9yKERvY3VtZW50TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIERvY3VtZW50TWFuYWdlciBnZXREb2N1bWVudE1hbmFnZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudFZpc2l0b3IjdmlzaXREb2N1bWVudChvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBnZXREb2N1bWVudE1hbmFnZXIoKS5kZWxldGVBbGxMYW5ndWFnZVZlcnNpb25zKGRvY3VtZW50KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXIjZGVsZXRlKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRTZXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKERvY3VtZW50U2V0IGRvY3VtZW50cykgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoZG9jdW1lbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2l0ZU1hbmFnZXIgc2l0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGRvY3VtZW50cy5nZXREb2N1bWVudHMoKVswXS5nZXRQdWJsaWNhdGlvbigpOwotICAgICAgICAgICAgc2l0ZU1hbmFnZXIgPSAoU2l0ZU1hbmFnZXIpIHNlbGVjdG9yLnNlbGVjdChwdWIuZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotCi0gICAgICAgICAgICBEb2N1bWVudFNldCBzZXQgPSBuZXcgRG9jdW1lbnRTZXQoZG9jdW1lbnRzLmdldERvY3VtZW50cygpKTsKLSAgICAgICAgICAgIHNvcnRBc2NlbmRpbmcoc2V0KTsKLSAgICAgICAgICAgIHNldC5yZXZlcnNlKCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50VmlzaXRvciB2aXNpdG9yID0gbmV3IERlbGV0ZVZpc2l0b3IodGhpcyk7Ci0gICAgICAgICAgICBzZXQudmlzaXQodmlzaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHNpdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlciNtb3ZlKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRTZXQsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51dGlsLkRvY3VtZW50U2V0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1vdmUoRG9jdW1lbnRTZXQgc291cmNlcywgRG9jdW1lbnRTZXQgZGVzdGluYXRpb25zKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBjb3B5KHNvdXJjZXMsIGRlc3RpbmF0aW9ucyk7Ci0gICAgICAgIGRlbGV0ZShzb3VyY2VzKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogRG9jdW1lbnRbXSBzb3VyY2VEb2NzID0gc291cmNlcy5nZXREb2N1bWVudHMoKTsgRG9jdW1lbnRbXSB0YXJnZXREb2NzID0KLSAgICAgICAgICogZGVzdGluYXRpb25zLmdldERvY3VtZW50cygpOwotICAgICAgICAgKiAKLSAgICAgICAgICogaWYgKHNvdXJjZURvY3MubGVuZ3RoICE9IHRhcmdldERvY3MubGVuZ3RoKSB7IHRocm93IG5ldwotICAgICAgICAgKiBQdWJsaWNhdGlvbkV4Y2VwdGlvbiggIlRoZSBudW1iZXIgb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkb2N1bWVudHMKLSAgICAgICAgICogbXVzdCBiZSBlcXVhbCEiKTsgfQotICAgICAgICAgKiAKLSAgICAgICAgICogTWFwIHNvdXJjZTJ0YXJnZXQgPSBuZXcgSGFzaE1hcCgpOyBmb3IgKGludCBpID0gMDsgaSA8Ci0gICAgICAgICAqIHNvdXJjZURvY3MubGVuZ3RoOyBpKyspIHsgc291cmNlMnRhcmdldC5wdXQoc291cmNlRG9jc1tpXSwKLSAgICAgICAgICogdGFyZ2V0RG9jc1tpXSk7IH0KLSAgICAgICAgICogCi0gICAgICAgICAqIERvY3VtZW50U2V0IHNvcnRlZFNvdXJjZXMgPSBuZXcgRG9jdW1lbnRTZXQoc291cmNlRG9jcyk7Ci0gICAgICAgICAqIFNpdGVVdGlsLnNvcnRBc2NlbmRpbmcodGhpcy5tYW5hZ2VyLCBzb3J0ZWRTb3VyY2VzKTsgRG9jdW1lbnRbXQotICAgICAgICAgKiBzb3J0ZWRTb3VyY2VEb2NzID0gc29ydGVkU291cmNlcy5nZXREb2N1bWVudHMoKTsKLSAgICAgICAgICogCi0gICAgICAgICAqIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkU291cmNlRG9jcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgKiBtb3ZlKHNvcnRlZFNvdXJjZURvY3NbaV0sIChEb2N1bWVudCkKLSAgICAgICAgICogc291cmNlMnRhcmdldC5nZXQoc29ydGVkU291cmNlRG9jc1tpXSkpOyB9Ci0gICAgICAgICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyI2NvcHkob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudFNldCwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRTZXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weShEb2N1bWVudFNldCBzb3VyY2VzLCBEb2N1bWVudFNldCBkZXN0aW5hdGlvbnMpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50W10gc291cmNlRG9jcyA9IHNvdXJjZXMuZ2V0RG9jdW1lbnRzKCk7Ci0gICAgICAgIERvY3VtZW50W10gdGFyZ2V0RG9jcyA9IGRlc3RpbmF0aW9ucy5nZXREb2N1bWVudHMoKTsKLQotICAgICAgICBpZiAoc291cmNlRG9jcy5sZW5ndGggIT0gdGFyZ2V0RG9jcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQdWJsaWNhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBudW1iZXIgb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkb2N1bWVudHMgbXVzdCBiZSBlcXVhbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCBzb3VyY2UydGFyZ2V0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VEb2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzb3VyY2UydGFyZ2V0LnB1dChzb3VyY2VEb2NzW2ldLCB0YXJnZXREb2NzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50U2V0IHNvcnRlZFNvdXJjZXMgPSBuZXcgRG9jdW1lbnRTZXQoc291cmNlRG9jcyk7Ci0gICAgICAgIHNvcnRBc2NlbmRpbmcoc29ydGVkU291cmNlcyk7Ci0gICAgICAgIERvY3VtZW50W10gc29ydGVkU291cmNlRG9jcyA9IHNvcnRlZFNvdXJjZXMuZ2V0RG9jdW1lbnRzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWRTb3VyY2VEb2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb3B5KHNvcnRlZFNvdXJjZURvY3NbaV0sICgoRG9jdW1lbnQpIHNvdXJjZTJ0YXJnZXQuZ2V0KHNvcnRlZFNvdXJjZURvY3NbaV0pKQotICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNvcnRBc2NlbmRpbmcoRG9jdW1lbnRTZXQgc2V0KSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGlmICghc2V0LmlzRW1wdHkoKSkgewotCi0gICAgICAgICAgICBEb2N1bWVudFtdIGRvY3MgPSBzZXQuZ2V0RG9jdW1lbnRzKCk7Ci0gICAgICAgICAgICBpbnQgbiA9IGRvY3MubGVuZ3RoOwotCi0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBkb2NzWzBdLmdldFB1YmxpY2F0aW9uKCk7Ci0gICAgICAgICAgICBTaXRlTWFuYWdlciBzaXRlTWFuYWdlciA9IG51bGw7Ci0gICAgICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoU2l0ZU1hbmFnZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3QocHViLmdldFNpdGVNYW5hZ2VySGludCgpKTsKLQotICAgICAgICAgICAgICAgIFNldCBub2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGVzLmFkZChkb2NzW2ldLmdldExpbmsoKS5nZXROb2RlKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFNpdGVOb2RlW10gYXNjZW5kaW5nID0gc2l0ZU1hbmFnZXIuc29ydEFzY2VuZGluZygoU2l0ZU5vZGVbXSkgbm9kZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBTaXRlTm9kZVtub2Rlcy5zaXplKCldKSk7Ci0KLSAgICAgICAgICAgICAgICBzZXQuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFzY2VuZGluZy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IGRvY3MubGVuZ3RoOyBkKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2NzW2RdLmdldFBhdGgoKS5lcXVhbHMoYXNjZW5kaW5nW2ldLmdldFBhdGgoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGRvY3NbZF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHNldC5nZXREb2N1bWVudHMoKS5sZW5ndGggIT0gbikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOdW1iZXIgb2YgZG9jdW1lbnRzIGhhcyBjaGFuZ2VkISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShzaXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBhZGRWZXJzaW9uKERvY3VtZW50IHNvdXJjZURvY3VtZW50LCBTdHJpbmcgYXJlYSwgU3RyaW5nIGxhbmd1YWdlLAotICAgICAgICAgICAgYm9vbGVhbiBhZGRUb1NpdGVTdHJ1Y3R1cmUpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYWRkVmVyc2lvbihzb3VyY2VEb2N1bWVudCwgYXJlYSwgbGFuZ3VhZ2UpOwotCi0gICAgICAgIGlmIChhZGRUb1NpdGVTdHJ1Y3R1cmUgJiYgc291cmNlRG9jdW1lbnQuaGFzTGluaygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHNvdXJjZURvY3VtZW50LmdldFBhdGgoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IHNvdXJjZURvY3VtZW50LmdldExpbmsoKS5nZXROb2RlKCkuaXNWaXNpYmxlKCk7Ci0gICAgICAgICAgICBhZGRUb1NpdGVNYW5hZ2VyKHBhdGgsIGRvY3VtZW50LCBzb3VyY2VEb2N1bWVudC5nZXRMaW5rKCkuZ2V0TGFiZWwoKSwgdmlzaWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGFkZFZlcnNpb24oRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFN0cmluZyBhcmVhLCBTdHJpbmcgbGFuZ3VhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiwgRG9jdW1lbnRFeGNlcHRpb24sIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBhZGQoc291cmNlRG9jdW1lbnQuZ2V0RmFjdG9yeSgpLCBzb3VyY2VEb2N1bWVudC5nZXRSZXNvdXJjZVR5cGUoKSwKLSAgICAgICAgICAgICAgICBzb3VyY2VEb2N1bWVudC5nZXRVVUlEKCksIHNvdXJjZURvY3VtZW50LmdldElucHV0U3RyZWFtKCksIHNvdXJjZURvY3VtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHVibGljYXRpb24oKSwgYXJlYSwgbGFuZ3VhZ2UsIHNvdXJjZURvY3VtZW50LmdldFNvdXJjZUV4dGVuc2lvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRG9jdW1lbnQuZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgIGNvcHlNZXRhRGF0YShzb3VyY2VEb2N1bWVudCwgZG9jdW1lbnQpOwotCi0gICAgICAgIHJldHVybiBkb2N1bWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnksIFB1YmxpY2F0aW9uIHB1YiwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLAotICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc291cmNlVXJpID0gRG9jdW1lbnRJbXBsLmdldFNvdXJjZVVSSShwdWIsIGFyZWEsIHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IERvY3VtZW50SW1wbC5nZXRSZXBvc2l0b3J5Tm9kZSh0aGlzLm1hbmFnZXIsIGZhY3RvcnksIHNvdXJjZVVyaSk7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5leGlzdHMoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHVibGljYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTg1OGY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBBIHB1YmxpY2F0aW9uJ3MgY29uZmlndXJhdGlvbi4gS2VlcCBpbiBzeW5jIHdpdGgKLSAqIHNyYy9yZXNvdXJjZXMvYnVpbGQvcHVibGljYXRpb24ucm5nIQotICovCi1wdWJsaWMgY2xhc3MgUHVibGljYXRpb25Db25maWd1cmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgUHVibGljYXRpb24gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIEZpbGUgc2VydmxldENvbnRleHQ7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudElkVG9QYXRoTWFwcGVyIG1hcHBlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgbGFuZ3VhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRMYW5ndWFnZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYnJlYWRjcnVtYnByZWZpeCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW5zdGFudGlhdG9ySGludCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudERpciA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb25maWdMb2FkZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPkNPTkZJR1VSQVRJT05fRklMRTwvY29kZT4gVGhlIHB1YmxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRklMRSA9IENPTkZJR1VSQVRJT05fUEFUSCArIEZpbGUuc2VwYXJhdG9yCi0gICAgICAgICAgICArICJwdWJsaWNhdGlvbi54bWwiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wdWJsaWNhdGlvbi8xLjEiOwotCi0gICAgLy8gcHJvcGVydGllcyBtYXJrZWQgd2l0aCAiKiIgYXJlIGN1cnJlbnRseSBub3QgcGFyc2VkIGJ5IHRoaXMgY2xhc3MuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTkFNRSA9ICJuYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vICoKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MT05HREVTQyA9ICJsb25nZGVzYyI7IC8vICoKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9WRVJTSU9OID0gInZlcnNpb24iOyAvLyAqCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTEVOWUFfVkVSU0lPTiA9ICJsZW55YS12ZXJzaW9uIjsgLy8gKgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xFTllBX1JFVklTSU9OID0gImxlbnlhLXJldmlzaW9uIjsgLy8gKgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPQ09PTl9WRVJTSU9OID0gImNvY29vbi12ZXJzaW9uIjsgLy8gKgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xBTkdVQUdFUyA9ICJsYW5ndWFnZXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xBTkdVQUdFID0gImxhbmd1YWdlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0RFRkFVTFRfTEFOR1VBR0UgPSAiZGVmYXVsdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVNUExBVEUgPSAidGVtcGxhdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RFTVBMQVRFX0lOU1RBTlRJQVRPUiA9ICJ0ZW1wbGF0ZS1pbnN0YW50aWF0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJuYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQVRIX01BUFBFUiA9ICJwYXRoLW1hcHBlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRE9DVU1FTlRfQlVJTERFUiA9ICJkb2N1bWVudC1idWlsZGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TSVRFX01BTkFHRVIgPSAic2l0ZS1tYW5hZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9SRVNPVVJDRV9UWVBFUyA9ICJyZXNvdXJjZS10eXBlcyI7Ly8gKgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1JFU09VUkNFX1RZUEUgPSAicmVzb3VyY2UtdHlwZSI7Ly8gKgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfV09SS0ZMT1cgPSAid29ya2Zsb3ciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX01PRFVMRVMgPSAibW9kdWxlcyI7Ly8gKgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX01PRFVMRSA9ICJtb2R1bGUiOy8vICoKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9CUkVBRENSVU1CX1BSRUZJWCA9ICJicmVhZGNydW1iLXByZWZpeCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ09OVEVOVF9ESVIgPSAiY29udGVudC1kaXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfU1JDID0gInNyYyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUFJPWElFUyA9ICJwcm94aWVzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QUk9YWSA9ICJwcm94eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9BUkVBID0gImFyZWEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVVJMID0gInVybCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9TU0wgPSAic3NsIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUHVibGljYXRpb24KLSAgICAgKiBAcGFyYW0gX2lkIHRoZSBwdWJsaWNhdGlvbiBpZAotICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29udGV4dFBhdGggdGhlIHNlcnZsZXQgY29udGV4dCBvZiB0aGlzIHB1YmxpY2F0aW9uCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGNvbmZpZwotICAgICAqICAgICAgICAgZmlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBQdWJsaWNhdGlvbkNvbmZpZ3VyYXRpb24oU3RyaW5nIF9pZCwgU3RyaW5nIHNlcnZsZXRDb250ZXh0UGF0aCkKLSAgICAgICAgICAgIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuaWQgPSBfaWQ7Ci0gICAgICAgIHRoaXMuc2VydmxldENvbnRleHQgPSBuZXcgRmlsZShzZXJ2bGV0Q29udGV4dFBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvYWRDb25maWd1cmF0aW9uKCkgewotCi0gICAgICAgIGlmIChpc0NvbmZpZ0xvYWRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJMb2FkaW5nIGNvbmZpZ3VyYXRpb24gZm9yIHB1YmxpY2F0aW9uIFsiICsgZ2V0SWQoKSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBnZXRDb25maWd1cmF0aW9uRmlsZSgpOwotCi0gICAgICAgIGlmICghY29uZmlnRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJDb25maWcgZmlsZSBbIiArIGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSBkb2VzIG5vdCBleGlzdDogIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBbIiArIGNvbmZpZ0ZpbGUKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJDb25maWd1cmF0aW9uIGZpbGUgWyIgKyBjb25maWdGaWxlICsgIl0gZXhpc3RzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBFTkFCTEVfWE1MX05BTUVTUEFDRVMgPSB0cnVlOwotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXIoRU5BQkxFX1hNTF9OQU1FU1BBQ0VTKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotICAgICAgICBTdHJpbmcgcGF0aE1hcHBlckNsYXNzTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbmZpZyA9IGJ1aWxkZXIuYnVpbGRGcm9tRmlsZShjb25maWdGaWxlKTsKLQotICAgICAgICAgICAgdGhpcy5uYW1lID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfTkFNRSkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBvbmUgc2FuaXR5IGNoZWNrIGZvciB0aGUgcHJvcGVyIG5hbWVzcGFjZS4gd2Ugc2hvdWxkIHJlYWxseQotICAgICAgICAgICAgICAgIC8vIGRvIHRoYXQgZm9yIGV2ZXJ5IGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgLy8gYnV0IHNpbmNlIEVMRU1FTlRfUEFUSF9NQVBQRVIgaXMgbWFuZGF0b3J5LCB0aGlzIHNob3VsZCBjYXRjaAotICAgICAgICAgICAgICAgIC8vIG1vc3QgY2FzZXMgb2YgZm9yZ290dGVuIG5hbWVzcGFjZS4KLSAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdldENoaWxkKEVMRU1FTlRfUEFUSF9NQVBQRVIpLmdldE5hbWVzcGFjZSgpICE9IENPTkZJR1VSQVRJT05fTkFNRVNQQUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlcHJlY2F0ZWQgY29uZmlndXJhdGlvbjogdGhlIHB1YmxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdGaWxlICsgIiBtdXN0IGJlIGluIHRoZSAiICsgQ09ORklHVVJBVElPTl9OQU1FU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBuYW1lc3BhY2UuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFNlZSB3ZWJhcHAvbGVueWEvcmVzb3VyY2VzL3NjaGVtYXMvcHVibGljYXRpb24ueG1sLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRoTWFwcGVyQ2xhc3NOYW1lID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfUEFUSF9NQVBQRVIpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgcGF0aE1hcHBlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShwYXRoTWFwcGVyQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB0aGlzLm1hcHBlciA9IChEb2N1bWVudElkVG9QYXRoTWFwcGVyKSBwYXRoTWFwcGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQdWJsaWNhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIGRvY3VtZW50VG9QYXRoTWFwcGVyOiBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXRoTWFwcGVyQ2xhc3NOYW1lICsgIl0iLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBkb2N1bWVudEJ1aWxkZXJDb25maWd1cmF0aW9uID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfRE9DVU1FTlRfQlVJTERFUiwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgaWYgKGRvY3VtZW50QnVpbGRlckNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRCdWlsZGVySGludCA9IGRvY3VtZW50QnVpbGRlckNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uW10gX2xhbmd1YWdlcyA9IGNvbmZpZy5nZXRDaGlsZChFTEVNRU5UX0xBTkdVQUdFUykuZ2V0Q2hpbGRyZW4oCi0gICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfTEFOR1VBR0UpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBsYW5ndWFnZUNvbmZpZyA9IF9sYW5ndWFnZXNbaV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbGFuZ3VhZ2VDb25maWcuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlcy5hZGQobGFuZ3VhZ2UpOwotICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZUNvbmZpZy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0RFRkFVTFRfTEFOR1VBR0UsIG51bGwpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0TGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gc2l0ZU1hbmFnZXJDb25maWd1cmF0aW9uID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfU0lURV9NQU5BR0VSLCBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXJDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNpdGVNYW5hZ2VyTmFtZSA9IHNpdGVNYW5hZ2VyQ29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb3hpZXNDb25maWcgPSBjb25maWcuZ2V0Q2hpbGQoRUxFTUVOVF9QUk9YSUVTKTsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25bXSBwcm94eUNvbmZpZ3MgPSBwcm94aWVzQ29uZmlnLmdldENoaWxkcmVuKEVMRU1FTlRfUFJPWFkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm94eUNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gcHJveHlDb25maWdzW2ldLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVJMKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3NsID0gcHJveHlDb25maWdzW2ldLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfU1NMKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXJlYSA9IHByb3h5Q29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0FSRUEpOwotCi0gICAgICAgICAgICAgICAgUHJveHkgcHJveHkgPSBuZXcgUHJveHkoKTsKLSAgICAgICAgICAgICAgICBwcm94eS5zZXRVcmwodXJsKTsKLQotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBnZXRQcm94eUtleShhcmVhLCBCb29sZWFuLnZhbHVlT2Yoc3NsKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5hcmVhU3NsMnByb3h5LnB1dChrZXksIHByb3h5KTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRkaW5nIHByb3h5OiBbIiArIHByb3h5ICsgIl0gZm9yIGFyZWE9WyIgKyBhcmVhICsgIl0gU1NMPVsiICsgc3NsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uIHRlbXBsYXRlQ29uZmlnID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfVEVNUExBVEUsIGZhbHNlKTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIGEgaGFjay4gRm9yIHNvbWUgcmVhc29uLCB0aGUgb2xkIGNvZGUgc2VlbXMgdG8KLSAgICAgICAgICAgIC8vIGltcGx5IHRoYXQgYSBwdWJsaWNhdGlvbgotICAgICAgICAgICAgLy8gY2FuIGhhdmUgbXVsdGlwbGUgdGVtcGxhdGVzLiBUaGlzIGlzIG5vdCB0aGUgY2FzZS4gQWxsIHRoaXMgY29kZQotICAgICAgICAgICAgLy8gc2hvdWxkIHVzZSBhIHNpbXBsZSBzdHJpbmcKLSAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGFycmF5cyBhdCBzb21lIHBvaW50LiBGb3Igbm93LCB0aGUgb2xkIGFycmF5IGlzIGtlcHQsCi0gICAgICAgICAgICAvLyB0byBhdm9pZCBoYXZpbmcgdG8gZGVhbAotICAgICAgICAgICAgLy8gd2l0aCBhbGwga2luZHMgb2YgTlBFcyB0aGF0IGtlZXAgY3JvcHBpbmcgdXAuLi4KLSAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUNvbmZpZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMgPSBuZXcgU3RyaW5nWzBdOyAvLyB1Z2guIGVtcHR5IGFycmF5IHRvIGtlZXAgdGhlCi0gICAgICAgICAgICAgICAgLy8gbGVnYWN5IGNvZGUgZnJvbSBicmVha2luZy4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzWzBdID0gdGVtcGxhdGVDb25maWcuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9JRCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gdGVtcGxhdGVJbnN0YW50aWF0b3JDb25maWcgPSBjb25maWcuZ2V0Q2hpbGQoCi0gICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfVEVNUExBVEVfSU5TVEFOVElBVE9SLCBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAodGVtcGxhdGVJbnN0YW50aWF0b3JDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFudGlhdG9ySGludCA9IHRlbXBsYXRlSW5zdGFudGlhdG9yQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFB1YmxpY2F0aW9uQ29uZmlndXJhdGlvbi5BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29udGVudERpckNvbmZpZyA9IGNvbmZpZy5nZXRDaGlsZChFTEVNRU5UX0NPTlRFTlRfRElSLCBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoY29udGVudERpckNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50RGlyID0gY29udGVudERpckNvbmZpZy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1NSQyk7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50IGRpcmVjdG9yeSBsb2FkZWQgZnJvbSBwdWIgY29uZmlndXJhdGlvbjogIiArIHRoaXMuY29udGVudERpcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmluZm8oIk5vIGNvbnRlbnQgZGlyZWN0b3J5IHNwZWNpZmllZCB3aXRoaW4gcHViIGNvbmZpZ3VyYXRpb24hIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcmVzb3VyY2VUeXBlQ29uZmlnID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfUkVTT1VSQ0VfVFlQRVMpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZUNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbltdIHJlc291cmNlVHlwZUNvbmZpZ3MgPSByZXNvdXJjZVR5cGVDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbihFTEVNRU5UX1JFU09VUkNFX1RZUEUpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VUeXBlQ29uZmlncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlc291cmNlVHlwZUNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGVzLmFkZChuYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd29ya2Zsb3cgPSByZXNvdXJjZVR5cGVDb25maWdzW2ldLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfV09SS0ZMT1csIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGUyd29ya2Zsb3cucHV0KG5hbWUsIHdvcmtmbG93KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb2JsZW0gd2l0aCBjb25maWcgZmlsZTogIiArIGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5icmVhZGNydW1icHJlZml4ID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfQlJFQURDUlVNQl9QUkVGSVgpLmdldFZhbHVlKCIiKTsKLQotICAgICAgICBpc0NvbmZpZ0xvYWRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgY29uZmlndXJhdGlvbiBmaWxlICh7QGxpbmsgI0NPTkZJR1VSQVRJT05fRklMRX0pLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldENvbmZpZ3VyYXRpb25GaWxlKCkgewotICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShnZXREaXJlY3RvcnkoKSwgQ09ORklHVVJBVElPTl9GSUxFKTsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0ZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHVibGljYXRpb24gSUQuCi0gICAgICogQHJldHVybiBBIHN0cmluZyB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2bGV0IGNvbnRleHQgdGhpcyBwdWJsaWNhdGlvbiBiZWxvbmdzIHRvICh1c3VhbGx5LCB0aGUKLSAgICAgKiA8Y29kZT53ZWJhcHBzL2xlbnlhPC9jb2RlPiBkaXJlY3RvcnkpLgotICAgICAqIEByZXR1cm4gQSA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0U2VydmxldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlcnZsZXRDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHB1YmxpY2F0aW9uIGRpcmVjdG9yeS4KLSAgICAgKiBAcmV0dXJuIEEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldERpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldFNlcnZsZXRDb250ZXh0KCksIFBVQkxJQ0FUSU9OX1BSRUZJWCArIEZpbGUuc2VwYXJhdG9yICsgZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiNnZXRDb250ZW50RGlyZWN0b3J5KFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRDb250ZW50RGlyZWN0b3J5KFN0cmluZyBhcmVhKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShnZXRDb250ZW50RGlyKCksIGFyZWEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aCBtYXBwZXIKLSAgICAgKiBAcGFyYW0gX21hcHBlciBUaGUgcGF0aCBtYXBwZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXRoTWFwcGVyKERlZmF1bHREb2N1bWVudElkVG9QYXRoTWFwcGVyIF9tYXBwZXIpIHsKLSAgICAgICAgYXNzZXJ0IF9tYXBwZXIgIT0gbnVsbDsKLSAgICAgICAgdGhpcy5tYXBwZXIgPSBfbWFwcGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhdGggbWFwcGVyLgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5Eb2N1bWVudElkVG9QYXRoTWFwcGVyPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudElkVG9QYXRoTWFwcGVyIGdldFBhdGhNYXBwZXIoKSB7Ci0gICAgICAgIGlmICh0aGlzLm1hcHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2FkQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLm1hcHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGxhbmd1YWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIGlmICh0aGlzLmRlZmF1bHRMYW5ndWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2FkQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRMYW5ndWFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdExhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBhdmFpbGFibGUgbGFuZ3VhZ2VzIGZvciB0aGlzIHB1YmxpY2F0aW9uCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5BcnJheTwvY29kZT4gb2YgbGFuZ3VhZ2VzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldExhbmd1YWdlcygpIHsKLSAgICAgICAgbG9hZENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgdGhpcy5sYW5ndWFnZXMudG9BcnJheShuZXcgU3RyaW5nW3RoaXMubGFuZ3VhZ2VzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYnJlYWRjcnVtYiBwcmVmaXguIEl0IGNhbiBiZSB1c2VkIGFzIGEgcHJlZml4IGlmIGEgcHVibGljYXRpb24gaXMKLSAgICAgKiBwYXJ0IG9mIGEgbGFyZ2VyIHNpdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBicmVhZGNydW1iIHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnJlYWRjcnVtYlByZWZpeCgpIHsKLSAgICAgICAgbG9hZENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuYnJlYWRjcnVtYnByZWZpeDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkb2N1bWVudEJ1aWxkZXJIaW50OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgYnVpbGRlciBvZiB0aGlzIGluc3RhbmNlLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBidWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCdWlsZGVySGludCgpIHsKLSAgICAgICAgbG9hZENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRCdWlsZGVySGludDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgYm9vbGVhbiBlcXVhbHMgPSBmYWxzZTsKLQotICAgICAgICBpZiAoZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG9iamVjdCkpIHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gKFB1YmxpY2F0aW9uKSBvYmplY3Q7Ci0gICAgICAgICAgICBlcXVhbHMgPSBnZXRJZCgpLmVxdWFscyhwdWJsaWNhdGlvbi5nZXRJZCgpKQotICAgICAgICAgICAgICAgICAgICAmJiBnZXRTZXJ2bGV0Q29udGV4dCgpLmVxdWFscyhwdWJsaWNhdGlvbi5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcXVhbHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBTdHJpbmcga2V5ID0gZ2V0U2VydmxldENvbnRleHQoKSArICI6IiArIGdldElkKCk7Ci0gICAgICAgIHJldHVybiBrZXkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCBhcmVhU3NsMnByb3h5ID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIGhhc2gga2V5IGZvciBhIGFyZWEtU1NMIGNvbWJpbmF0aW9uLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSBpc1NzbFByb3RlY3RlZCBJZiB0aGUgcHJveHkgaXMgYXNzaWduZWQgZm9yIFNTTC1wcm90ZWN0ZWQgcGFnZXMuCi0gICAgICogQHJldHVybiBBbiBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRQcm94eUtleShTdHJpbmcgYXJlYSwgYm9vbGVhbiBpc1NzbFByb3RlY3RlZCkgewotICAgICAgICByZXR1cm4gYXJlYSArICI6IiArIGlzU3NsUHJvdGVjdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb24jZ2V0UHJveHkob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQsCi0gICAgICogICAgICBib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBQcm94eSBnZXRQcm94eShEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBpc1NzbFByb3RlY3RlZCkgewotICAgICAgICBQcm94eSBwcm94eSA9IGdldFByb3h5KGRvY3VtZW50LmdldEFyZWEoKSwgaXNTc2xQcm90ZWN0ZWQpOwotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKQotICAgICAgICAgICAgICAgICAgICAuZGVidWcoIlJlc29sdmluZyBwcm94eSBmb3IgWyIgKyBkb2N1bWVudCArICJdIFNTTD1bIiArIGlzU3NsUHJvdGVjdGVkICsgIl0iKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZXNvbHZlZCBwcm94eTogWyIgKyBwcm94eSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJveHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiNnZXRQcm94eShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJveHkgZ2V0UHJveHkoU3RyaW5nIGFyZWEsIGJvb2xlYW4gaXNTc2xQcm90ZWN0ZWQpIHsKLSAgICAgICAgbG9hZENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgT2JqZWN0IGtleSA9IGdldFByb3h5S2V5KGFyZWEsIGlzU3NsUHJvdGVjdGVkKTsKLSAgICAgICAgUHJveHkgcHJveHkgPSAoUHJveHkpIHRoaXMuYXJlYVNzbDJwcm94eS5nZXQoa2V5KTsKLSAgICAgICAgcmV0dXJuIHByb3h5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSBpc1NzbFByb3RlY3RlZCBJZiB0aGUgcHJveHkgaXMgZm9yIFNTTC1wcm90ZWN0ZWQgVVJMcy4KLSAgICAgKiBAcGFyYW0gcHJveHkgVGhlIHByb3h5IHRvIHNldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQcm94eShTdHJpbmcgYXJlYSwgYm9vbGVhbiBpc1NzbFByb3RlY3RlZCwgUHJveHkgcHJveHkpIHsKLSAgICAgICAgT2JqZWN0IGtleSA9IGdldFByb3h5S2V5KGFyZWEsIGlzU3NsUHJvdGVjdGVkKTsKLSAgICAgICAgdGhpcy5hcmVhU3NsMnByb3h5LnB1dChrZXksIHByb3h5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzaXRlTWFuYWdlck5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uI2V4aXN0cygpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gZ2V0Q29uZmlndXJhdGlvbkZpbGUoKS5leGlzdHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHRlbXBsYXRlczsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb24jZ2V0VGVtcGxhdGVJZHMoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZW1wbGF0ZUlkcygpIHsKLSAgICAgICAgbG9hZENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdCh0aGlzLnRlbXBsYXRlcyk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiNnZXRTaXRlTWFuYWdlckhpbnQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2l0ZU1hbmFnZXJIaW50KCkgewotICAgICAgICBsb2FkQ29uZmlndXJhdGlvbigpOwotICAgICAgICByZXR1cm4gdGhpcy5zaXRlTWFuYWdlck5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiNnZXRJbnN0YW50aWF0b3JIaW50KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbnRpYXRvckhpbnQoKSB7Ci0gICAgICAgIGxvYWRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmluc3RhbnRpYXRvckhpbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiNnZXRDb250ZW50RGlyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREaXIoKSB7Ci0gICAgICAgIGxvYWRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGlmICh0aGlzLmNvbnRlbnREaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jb250ZW50RGlyID0gbmV3IEZpbGUoZ2V0RGlyZWN0b3J5KCksIENPTlRFTlRfUEFUSCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudERpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uI2dldFNvdXJjZVVSSSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiBOb2RlLkxFTllBX1BST1RPQ09MICsgUFVCTElDQVRJT05fUFJFRklYX1VSSSArICIvIiArIHRoaXMuaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiNnZXRDb250ZW50VVJJKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VVJJKFN0cmluZyBhcmVhKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3VyY2VVUkkoKSArICIvIiArIENPTlRFTlRfUEFUSCArICIvIiArIGFyZWE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgcmVzb3VyY2VUeXBlMndvcmtmbG93ID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb24jZ2V0V29ya2Zsb3dTY2hlbWEob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya2Zsb3dTY2hlbWEoUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotICAgICAgICBTdHJpbmcgd29ya2Zsb3cgPSAoU3RyaW5nKSB0aGlzLnJlc291cmNlVHlwZTJ3b3JrZmxvdy5nZXQocmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiB3b3JrZmxvdzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgcmVzb3VyY2VUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb24jZ2V0UmVzb3VyY2VUeXBlTmFtZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZVR5cGVOYW1lcygpIHsKLSAgICAgICAgbG9hZENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgdGhpcy5yZXNvdXJjZVR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLnJlc291cmNlVHlwZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldElkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFyZWEgZ2V0QXJlYShTdHJpbmcgbmFtZSkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkISIpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nW10gYXJlYXM7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXJlYU5hbWVzKCkgewotICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgbW9yZSBnZW5lcmljLgotICAgICAgICBpZiAodGhpcy5hcmVhcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSk7Ci0gICAgICAgICAgICBsaXN0LmFkZChQdWJsaWNhdGlvbi5MSVZFX0FSRUEpOwotICAgICAgICAgICAgbGlzdC5hZGQoUHVibGljYXRpb24uU1RBR0lOR19BUkVBKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKFB1YmxpY2F0aW9uLlRSQVNIX0FSRUEpOwotICAgICAgICAgICAgbGlzdC5hZGQoUHVibGljYXRpb24uQVJDSElWRV9BUkVBKTsKLSAgICAgICAgICAgIHRoaXMuYXJlYXMgPSAoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYXJlYXM7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50RmFjdG9yeSBnZXRGYWN0b3J5KCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQhIik7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgbG9hZENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25GYWN0b3J5LmphdmEgYi90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGY3MTAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5SXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLS8qKgotICogUHVibGljYXRpb24gZmFjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIFB1YmxpY2F0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlJdGVtRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBQdWJsaWNhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBwdWJsaWNhdGlvbiBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBQdWJsaWNhdGlvbkZhY3RvcnkoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgUHVibGljYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUl0ZW0gYnVpbGRJdGVtKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIGtleSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIG5ldyBQdWJsaWNhdGlvbkltcGwodGhpcy5tYW5hZ2VyLCBmYWN0b3J5LCBjb25maWcpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXRlbVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBQdWJsaWNhdGlvbi5JVEVNX1RZUEU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uSW1wbC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QdWJsaWNhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2MTkyNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMuY29udGV4dC5Db250ZXh0VXRpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLS8qKgotICogQSBwdWJsaWNhdGlvbi4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFB1YmxpY2F0aW9uSW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFB1YmxpY2F0aW9uIHsKLQotICAgIHByaXZhdGUgUHVibGljYXRpb25Db25maWd1cmF0aW9uIGRlbGVnYXRlOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBwcm90ZWN0ZWQgUHVibGljYXRpb25JbXBsKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgUHVibGljYXRpb25Db25maWd1cmF0aW9uIGRlbGVnYXRlKSB7Ci0gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5leGlzdHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJyZWFkY3J1bWJQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRCcmVhZGNydW1iUHJlZml4KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50RGlyKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Q29udGVudERpcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldENvbnRlbnREaXJlY3RvcnkoU3RyaW5nIGFyZWEpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENvbnRlbnREaXJlY3RvcnkoYXJlYSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VVJJKFN0cmluZyBhcmVhKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRDb250ZW50VVJJKGFyZWEpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExhbmd1YWdlKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0RGVmYXVsdExhbmd1YWdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0RGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0RGlyZWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyOwotICAgIAotICAgIHB1YmxpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkgewotICAgICAgICBpZiAodGhpcy5kb2N1bWVudEJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKERvY3VtZW50QnVpbGRlci5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudEJ1aWxkZXIgPSAoRG9jdW1lbnRCdWlsZGVyKSBzZWxlY3Rvci5zZWxlY3QoZGVsZWdhdGUuZ2V0RG9jdW1lbnRCdWlsZGVySGludCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRCdWlsZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFudGlhdG9ySGludCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluc3RhbnRpYXRvckhpbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TGFuZ3VhZ2VzKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50SWRUb1BhdGhNYXBwZXIgZ2V0UGF0aE1hcHBlcigpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFBhdGhNYXBwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJveHkgZ2V0UHJveHkoRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gaXNTc2xQcm90ZWN0ZWQpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3h5KGRvY3VtZW50LmdldEFyZWEoKSwgaXNTc2xQcm90ZWN0ZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm94eSBnZXRQcm94eShTdHJpbmcgYXJlYSwgYm9vbGVhbiBpc1NzbFByb3RlY3RlZCkgewotICAgICAgICBQcm94eSBwcm94eSA9IGRlbGVnYXRlLmdldFByb3h5KGFyZWEsIGlzU3NsUHJvdGVjdGVkKTsKLSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB1cmwgPSBnZXREZWZhdWx0UHJveHlVcmwoYXJlYSk7Ci0gICAgICAgICAgICBwcm94eSA9IG5ldyBQcm94eSgpOwotICAgICAgICAgICAgcHJveHkuc2V0VXJsKHVybCk7Ci0gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnNldFByb3h5KGFyZWEsIGlzU3NsUHJvdGVjdGVkLCBwcm94eSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb3h5OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBjb250ZXh0UGF0aDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgewotICAgICAgICBpZiAodGhpcy5jb250ZXh0UGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0VXRpbGl0eSBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0VXRpbGl0eSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChDb250ZXh0VXRpbGl0eS5ST0xFKTsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gY29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0Q29udGV4dFBhdGgoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShjb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dFBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHJldHVybiBUaGUgcHJveHkgVVJMIGlmIG5vIHByb3h5IGlzIGRlY2xhcmVkIGluIHtAbGluayBQdWJsaWNhdGlvbkNvbmZpZ3VyYXRpb24jQ09ORklHVVJBVElPTl9GSUxFfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRQcm94eVVybChTdHJpbmcgYXJlYSkgewotICAgICAgICByZXR1cm4gZ2V0Q29udGV4dFBhdGgoKSArICIvIiArIGdldElkKCkgKyAiLyIgKyBhcmVhOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBhbGxSZXNvdXJjZVR5cGVzOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdFRlbXBsYXRlSWQoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHRlbXBsYXRlSWRzID0gZ2V0VGVtcGxhdGVJZHMoKTsKLSAgICAgICAgaWYgKHRlbXBsYXRlSWRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUlkc1swXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU5hbWVzKCkgewotICAgICAgICBpZiAodGhpcy5hbGxSZXNvdXJjZVR5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuYWxsUmVzb3VyY2VUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHRoaXMuYWxsUmVzb3VyY2VUeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0aGlzLmRlbGVnYXRlLmdldFJlc291cmNlVHlwZU5hbWVzKCkpKTsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZUlkID0gZ2V0Rmlyc3RUZW1wbGF0ZUlkKCk7Ci0gICAgICAgICAgICBpZiAodGVtcGxhdGVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24gdGVtcGxhdGUgPSBnZXRGYWN0b3J5KCkuZ2V0UHVibGljYXRpb24odGVtcGxhdGVJZCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRlbXBsYXRlVHlwZXMgPSB0ZW1wbGF0ZS5nZXRSZXNvdXJjZVR5cGVOYW1lcygpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbFJlc291cmNlVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodGVtcGxhdGVUeXBlcykpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHRoaXMuYWxsUmVzb3VyY2VUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5hbGxSZXNvdXJjZVR5cGVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldFNlcnZsZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpdGVNYW5hZ2VySGludCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFNpdGVNYW5hZ2VySGludCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVVJJKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0U291cmNlVVJJKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFRlbXBsYXRlSWRzKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VGVtcGxhdGVJZHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdvcmtmbG93U2NoZW1hKFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9IHRoaXMuZGVsZWdhdGUuZ2V0V29ya2Zsb3dTY2hlbWEocmVzb3VyY2VUeXBlKTsKLSAgICAgICAgaWYgKHNjaGVtYSA9PSBudWxsICYmIGdldFRlbXBsYXRlSWRzKCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIHRlbXBsYXRlSWQgPSBnZXRGaXJzdFRlbXBsYXRlSWQoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUHVibGljYXRpb24gdGVtcGxhdGUgPSBnZXRGYWN0b3J5KCkuZ2V0UHVibGljYXRpb24odGVtcGxhdGVJZCk7Ci0gICAgICAgICAgICAgICAgc2NoZW1hID0gdGVtcGxhdGUuZ2V0V29ya2Zsb3dTY2hlbWEocmVzb3VyY2VUeXBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2NoZW1hOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgZGVsZWdhdGUuc2V0RGVmYXVsdExhbmd1YWdlKGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXRoTWFwcGVyKERlZmF1bHREb2N1bWVudElkVG9QYXRoTWFwcGVyIG1hcHBlcikgewotICAgICAgICBkZWxlZ2F0ZS5zZXRQYXRoTWFwcGVyKG1hcHBlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgYXJlYXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIHB1YmxpYyBBcmVhIGdldEFyZWEoU3RyaW5nIG5hbWUpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghdGhpcy5hcmVhcy5jb250YWluc0tleShuYW1lKSkgewotICAgICAgICAgICAgQXJlYSBhcmVhID0gbmV3IEFyZWFJbXBsKHRoaXMubWFuYWdlciwgdGhpcy5mYWN0b3J5LCB0aGlzLCBuYW1lKTsKLSAgICAgICAgICAgIHRoaXMuYXJlYXMucHV0KG5hbWUsIGFyZWEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoQXJlYSkgdGhpcy5hcmVhcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEFyZWFOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEFyZWFOYW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIWdldENsYXNzKCkuaXNJbnN0YW5jZShvYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoUHVibGljYXRpb24pIG9iaikuZ2V0SWQoKS5lcXVhbHMoZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldElkKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldEZhY3RvcnkoKS5nZXRTZXNzaW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uTWFuYWdlckltcGwuamF2YSBiL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25NYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YThmMjlhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25NYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQ6IFB1YmxpY2F0aW9uRmFjdG9yeS5qYXZhIDE3NzkyNyAyMDA1LTA1LTIzIDA1OjMyOjIwWiBncmVnb3IgJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnRocmVhZC5UaHJlYWRTYWZlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHB1YmxpY2F0aW9uIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaWNhdGlvbk1hbmFnZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgUHVibGljYXRpb25NYW5hZ2VyLAotICAgICAgICBTZXJ2aWNlYWJsZSwgSW5pdGlhbGl6YWJsZSwgVGhyZWFkU2FmZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+UHVibGljYXRpb25GYWN0b3J5PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHVibGljYXRpb25NYW5hZ2VySW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCBpZDJjb25maWc7Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIE1hcCBnZXRJZDJjb25maWcoKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5pZDJjb25maWcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5pZDJjb25maWcgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgRmlsZSBzZXJ2bGV0Q29udGV4dCA9IG5ldyBGaWxlKHRoaXMuc2VydmxldENvbnRleHRQYXRoKTsKLSAgICAgICAgICAgIEZpbGUgcHVibGljYXRpb25zRGlyZWN0b3J5ID0gbmV3IEZpbGUoc2VydmxldENvbnRleHQsIFB1YmxpY2F0aW9uLlBVQkxJQ0FUSU9OX1BSRUZJWCk7Ci0gICAgICAgICAgICBGaWxlW10gcHVibGljYXRpb25EaXJlY3RvcmllcyA9IHB1YmxpY2F0aW9uc0RpcmVjdG9yeS5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShmaWxlLCBQdWJsaWNhdGlvbkNvbmZpZ3VyYXRpb24uQ09ORklHVVJBVElPTl9GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0ZpbGUuZXhpc3RzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY2F0aW9uRGlyZWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBwdWJsaWNhdGlvbkRpcmVjdG9yaWVzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBhZGRQdWJsaWNhdGlvbihpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaWQyY29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbihEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGlkKQotICAgICAgICAgICAgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBBc3NlcnQubm90TnVsbCgicHVibGljYXRpb24gSUQiLCBpZCk7Ci0gICAgICAgIE1hcCBpZDJjb25maWcgPSBnZXRJZDJjb25maWcoKTsKLSAgICAgICAgaWYgKCFpZDJjb25maWcuY29udGFpbnNLZXkoaWQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHVibGljYXRpb25FeGNlcHRpb24oIlRoZSBwdWJsaWNhdGlvbiBbIiArIGlkICsgIl0gZG9lcyBub3QgZXhpc3QuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBQdWJsaWNhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnID0gKFB1YmxpY2F0aW9uQ29uZmlndXJhdGlvbikgaWQyY29uZmlnLmdldChpZCk7Ci0gICAgICAgIFB1YmxpY2F0aW9uRmFjdG9yeSBwdWJGYWN0b3J5ID0gbmV3IFB1YmxpY2F0aW9uRmFjdG9yeSh0aGlzLm1hbmFnZXIsIGNvbmZpZyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKFB1YmxpY2F0aW9uKSBmYWN0b3J5LmdldFNlc3Npb24oKS5nZXRSZXBvc2l0b3J5SXRlbShwdWJGYWN0b3J5LCBpZCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFB1YmxpY2F0aW9uW10gZ2V0UHVibGljYXRpb25zKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIExpc3QgcHVibGljYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXAgaWQyY29uZmlnID0gZ2V0SWQyY29uZmlnKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpZDJjb25maWcua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uSWQgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGdldFB1YmxpY2F0aW9uKGZhY3RvcnksIHB1YmxpY2F0aW9uSWQpOwotICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9ucy5hZGQocHVibGljYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoUHVibGljYXRpb25bXSkgcHVibGljYXRpb25zLnRvQXJyYXkobmV3IFB1YmxpY2F0aW9uW3B1YmxpY2F0aW9ucy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHVibGljYXRpb25JZHMoKSB7Ci0gICAgICAgIFNldCBpZHM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZHMgPSBnZXRJZDJjb25maWcoKS5rZXlTZXQoKTsKLSAgICAgICAgfSBjYXRjaCAoUHVibGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgaWRzLnRvQXJyYXkobmV3IFN0cmluZ1tpZHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldENvbnRleHRQYXRoOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKCJjb250ZXh0Oi8vLyIpOwotICAgICAgICAgICAgdGhpcy5zZXJ2bGV0Q29udGV4dFBhdGggPSBTb3VyY2VVdGlsLmdldEZpbGUoc291cmNlKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFB1YmxpY2F0aW9uKFN0cmluZyBwdWJJZCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIGlkMmNvbmZpZyA9IGdldElkMmNvbmZpZygpOwotICAgICAgICBpZiAoaWQyY29uZmlnLmNvbnRhaW5zS2V5KHB1YklkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uKCJUaGUgcHVibGljYXRpb24gWyIgKyBwdWJJZCArICJdIGFscmVhZHkgZXhpc3RzLiIpOwotICAgICAgICB9Ci0gICAgICAgIFB1YmxpY2F0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgUHVibGljYXRpb25Db25maWd1cmF0aW9uKHB1YklkLAotICAgICAgICAgICAgICAgIHRoaXMuc2VydmxldENvbnRleHRQYXRoKTsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKGNvbmZpZywgZ2V0TG9nZ2VyKCkpOwotICAgICAgICBpZDJjb25maWcucHV0KHB1YklkLCBjb25maWcpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmxldENvbnRleHRQYXRoKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2bGV0Q29udGV4dFBhdGg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1Jlc291cmNlVHlwZUltcGwuamF2YSBiL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUmVzb3VyY2VUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTkwMzllLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUmVzb3VyY2VUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5TY2hlbWE7Ci0KLS8qKgotICogUmVzb3VyY2UgdHlwZS4KLSAqIAotICogQHZlcnNpb24gJElkOiQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVHlwZUltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBDb25maWd1cmFibGUsIFRocmVhZFNhZmUsCi0gICAgICAgIFJlc291cmNlVHlwZSwgU2VydmljZWFibGUgewotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgc2FtcGxlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQU1QTEVfTkFNRSA9ICJEZWZhdWx0IFNhbXBsZSI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVVJJID0gInVyaSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAibmFtZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TQ0hFTUEgPSAic2NoZW1hIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9SRVdSSVRFX0FUVFJJQlVURSA9ICJsaW5rLWF0dHJpYnV0ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1hQQVRIID0gInhwYXRoIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1NBTVBMRVMgPSAic2FtcGxlcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TQU1QTEUgPSAic2FtcGxlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTUlNRV9UWVBFID0gIm1pbWUtdHlwZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GT1JNQVQgPSAiZm9ybWF0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0VYUElSRVMgPSAiZXhwaXJlcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1NFQ09ORFMgPSAic2Vjb25kcyI7Ci0KLSAgICBwcml2YXRlIFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nW10gbGlua0F0dHJpYnV0ZVhQYXRoczsKLSAgICBwcml2YXRlIE1hcCBzYW1wbGVzOwotICAgIHByaXZhdGUgU3RyaW5nIHNhbXBsZXNVcmkgPSBudWxsOwotICAgIHByaXZhdGUgTWFwIGZvcm1hdHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgbG9uZyBleHBpcmVzID0gMDsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEEgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9ybWF0IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgdXJpLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZvcm1hdChTdHJpbmcgdXJpKSB7Ci0gICAgICAgICAgICBBc3NlcnQubm90TnVsbCgidXJpIiwgdXJpKTsKLSAgICAgICAgICAgIHRoaXMudXJpID0gdXJpOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB1cmkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnVyaTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGUjY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBzY2hlbWFDb25mID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfU0NIRU1BLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIGlmIChzY2hlbWFDb25mICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gc2NoZW1hQ29uZi5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VSSSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gc2NoZW1hQ29uZi5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBuZXcgU2NoZW1hKGxhbmd1YWdlLCB1cmkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIHNhbXBsZSBjb250ZW50IGxvY2F0aW9ucy4KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gc2FtcGxlc0ZpbGVDb25mID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfU0FNUExFUywgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHNhbXBsZXNGaWxlQ29uZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zYW1wbGVzVXJpID0gc2FtcGxlc0ZpbGVDb25mLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVJJKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuc2FtcGxlcyA9IGxvYWRTYW1wbGVzKGNvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbltdIHJld3JpdGVBdHRyaWJ1dGVDb25maWdzID0gY29uZmlnLmdldENoaWxkcmVuKEVMRU1FTlRfUkVXUklURV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgTGlzdCB4UGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJld3JpdGVBdHRyaWJ1dGVDb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHhQYXRoID0gcmV3cml0ZUF0dHJpYnV0ZUNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9YUEFUSCk7Ci0gICAgICAgICAgICAgICAgeFBhdGhzLmFkZCh4UGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmxpbmtBdHRyaWJ1dGVYUGF0aHMgPSAoU3RyaW5nW10pIHhQYXRocy50b0FycmF5KG5ldyBTdHJpbmdbeFBhdGhzLnNpemUoKV0pOwotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uW10gZm9ybWF0Q29uZmlncyA9IGNvbmZpZy5nZXRDaGlsZHJlbihFTEVNRU5UX0ZPUk1BVCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hdENvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZvcm1hdENvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gZm9ybWF0Q29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VSSSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRzLnB1dChuYW1lLCBuZXcgRm9ybWF0KHVyaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uIGV4cGlyZXNDb25mID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfRVhQSVJFUywgZmFsc2UpOwotICAgICAgICAgICAgaWYgKGV4cGlyZXNDb25mICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmV4cGlyZXMgPSBleHBpcmVzQ29uZi5nZXRBdHRyaWJ1dGVBc0xvbmcoQVRUUklCVVRFX1NFQ09ORFMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQ29uZmlndXJpbmcgcmVzb3VyY2UgdHlwZSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGxvYWRTYW1wbGVzKENvbmZpZ3VyYXRpb24gc2FtcGxlc1BhcmVudENvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uW10gc2FtcGxlc0NvbmYgPSBzYW1wbGVzUGFyZW50Q29uZmlnLmdldENoaWxkcmVuKEVMRU1FTlRfU0FNUExFKTsKLSAgICAgICAgTWFwIHNhbXBsZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhbXBsZXNDb25mLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNhbXBsZXNDb25mW2ldLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgREVGQVVMVF9TQU1QTEVfTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBzYW1wbGVzQ29uZltpXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX01JTUVfVFlQRSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gc2FtcGxlc0NvbmZbaV0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUkkpOwotICAgICAgICAgICAgc2FtcGxlcy5wdXQobmFtZSwgbmV3IFNhbXBsZShuYW1lLCBtaW1lVHlwZSwgdXJpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNhbXBsZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gcmVhZENvbmZpZ3VyYXRpb24oU3RyaW5nIHVyaSkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZzsKLSAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyKCk7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkodXJpKTsKLSAgICAgICAgICAgIGNvbmZpZyA9IGJ1aWxkZXIuYnVpbGQoc291cmNlLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkxvYWRpbmcgc2FtcGxlcyBmcm9tIFVSSSBbIiArIHVyaSArICJdIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRlIGdldEV4cGlyZXMoKSB7Ci0gICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7Ci0gICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIHRoaXMuZXhwaXJlcyAqIDEwMDBsKTsKLSAgICAgICAgcmV0dXJuIGRhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNjaGVtYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TGlua0F0dHJpYnV0ZVhQYXRocygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlua0F0dHJpYnV0ZVhQYXRoczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRTYW1wbGVzKCkgewotICAgICAgICBpZiAodGhpcy5zYW1wbGVzVXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNhbXBsZXM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gc2FtcGxlc0NvbmZpZyA9IHJlYWRDb25maWd1cmF0aW9uKHRoaXMuc2FtcGxlc1VyaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRTYW1wbGVzKHNhbXBsZXNDb25maWcpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTYW1wbGVOYW1lcygpIHsKLSAgICAgICAgU2V0IG5hbWVzID0gZ2V0U2FtcGxlcygpLmtleVNldCgpOwotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTYW1wbGUgZ2V0U2FtcGxlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIE1hcCBzYW1wbGVzID0gZ2V0U2FtcGxlcygpOwotICAgICAgICBpZiAoIXNhbXBsZXMuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHNhbXBsZSB3aXRoIG5hbWUgWyIgKyBuYW1lICsgIl0gZm91bmQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTYW1wbGUpIHNhbXBsZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoIm5hbWUiLCBuYW1lKTsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEZvcm1hdHMoKSB7Ci0gICAgICAgIFNldCBuYW1lcyA9IHRoaXMuZm9ybWF0cy5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0VVJJKFN0cmluZyBmb3JtYXQpIHsKLQotICAgICAgICBpZiAoIXRoaXMuZm9ybWF0cy5jb250YWluc0tleShmb3JtYXQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIHJlc291cmNlIHR5cGUgWyIgKyBnZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmb3JtYXQgWyIgKyBmb3JtYXQgKyAiXS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoKEZvcm1hdCkgdGhpcy5mb3JtYXRzLmdldChmb3JtYXQpKS5nZXRVUkkoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9SZXNvdXJjZVR5cGVTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9SZXNvdXJjZVR5cGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjZjNGYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUmVzb3VyY2VUeXBlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuRXh0ZW5kZWRDb21wb25lbnRTZWxlY3RvcjsKLQotLyoqCi0gKiBTcGVjaWZpcyBzZWxlY3RvciBmb3IgcmVzb3VyY2UgdHlwZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVR5cGVTZWxlY3RvciBleHRlbmRzIEV4dGVuZGVkQ29tcG9uZW50U2VsZWN0b3J7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuRXh0ZW5kZWRDb21wb25lbnRTZWxlY3RvciNzZWxlY3QoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9uZW50IHNlbGVjdChPYmplY3QgaGludCkgdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc291cmNlVHlwZSB0eXBlID0gKFJlc291cmNlVHlwZSkgc3VwZXIuc2VsZWN0KGhpbnQpOwotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlLnNldE5hbWUoKFN0cmluZykgaGludCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChDb21wb25lbnQpIHR5cGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvQXhpc1VVSURHZW5lcmF0b3IuamF2YSBiL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9BeGlzVVVJREdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDA3NWZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9BeGlzVVVJREdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMudXVpZC5VVUlER2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5jb21wb25lbnRzLnV1aWQuVVVJREdlbkZhY3Rvcnk7Ci0KLS8qKgotICogVVVJRCBnZW5lcmF0b3IgYmFzZWQgb24gQXBhY2hlIEF4aXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzVVVJREdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFVVSURHZW5lcmF0b3IsIFRocmVhZFNhZmUgewotCi0gICAgcHJpdmF0ZSBVVUlER2VuIGRlbGVnYXRlOwotCi0gICAgcHJvdGVjdGVkIFVVSURHZW4gZ2V0RGVsZWdhdGUoKSB7Ci0gICAgICAgIGlmICh0aGlzLmRlbGVnYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBVVUlER2VuRmFjdG9yeS5nZXRVVUlER2VuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBuZXh0VVVJRCgpIHsKLSAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlKCkubmV4dFVVSUQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9TaGFyZWRJdGVtU3RvcmVJbXBsLmphdmEgYi90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU2hhcmVkSXRlbVN0b3JlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQ1NTMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9TaGFyZWRJdGVtU3RvcmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5RXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uUmVwb3NpdG9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uSWRlbnRpdHlNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5JZGVudGl0eU1hcEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5Mb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWJsZTsKLQotLyoqCi0gKiBTaGFyZWQgaXRlbSBzdG9yZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNoYXJlZEl0ZW1TdG9yZUltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBTaGFyZWRJdGVtU3RvcmUsIFRocmVhZFNhZmUgewotCi0gICAgcHJpdmF0ZSBJZGVudGl0eU1hcCBtYXA7Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIElkZW50aXR5TWFwIGdldElkZW50aXR5TWFwKCkgewotICAgICAgICBpZiAodGhpcy5tYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5tYXAgPSBuZXcgSWRlbnRpdHlNYXBJbXBsKGdldExvZ2dlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5tYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoUmVwb3NpdG9yeUxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5xdWV1ZUV2ZW50KFJlcG9zaXRvcnlFdmVudCBldmVudCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHBlcm1pdHRlZC4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSWRlbnRpdHkgZ2V0SWRlbnRpdHkoKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5SXRlbSBnZXRSZXBvc2l0b3J5SXRlbShSZXBvc2l0b3J5SXRlbUZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgUmVwb3NpdG9yeUl0ZW1GYWN0b3J5V3JhcHBlciB3cmFwcGVyID0gbmV3IFJlcG9zaXRvcnlJdGVtRmFjdG9yeVdyYXBwZXIoZmFjdG9yeSwgdGhpcyk7Ci0gICAgICAgIHJldHVybiAoUmVwb3NpdG9yeUl0ZW0pIGdldElkZW50aXR5TWFwKCkuZ2V0KHdyYXBwZXIsIGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lclJlZ2lzdGVyZWQoUmVwb3NpdG9yeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjaygpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWRlbnRpdHkoSWRlbnRpdHkgaWRlbnRpdHkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2sgY3JlYXRlTG9jayhMb2NrYWJsZSBsb2NrYWJsZSwgaW50IHZlcnNpb24pIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoVHJhbnNhY3Rpb25hYmxlIHRyYW5zYWN0aW9uYWJsZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEaXJ0eShUcmFuc2FjdGlvbmFibGUgb2JqZWN0KSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHBlcm1pdHRlZC4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck5ldyhUcmFuc2FjdGlvbmFibGUgb2JqZWN0KSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHBlcm1pdHRlZC4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlbW92ZWQoVHJhbnNhY3Rpb25hYmxlIG9iamVjdCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTG9jayhMb2NrYWJsZSBsb2NrYWJsZSkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aGlzLm1hcCA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9sZW55YS5yb2xlcyBiL3RydW5rL3NyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9sZW55YS5yb2xlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2NjZhZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC9qYXZhL29yZy9hcGFjaGUvbGVueWEvbGVueWEucm9sZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0KLSAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSByb2xlIGRlZmluaXRpb25zIGZvciBMZW55YS1zcGVjaWZpYyBBdmFsb24gc2VydmljZXMuCi0gIEEgcm9sZSBpcyB0aGUgaW50ZXJmYWNlIGZvciBhbiBBdmFsb24gc2VydmljZS4KLQotICBUaGUgbmFtZSBvZiB0aGUgcm9sZSB1c3VhbGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBpbnRlcmZhY2UsCi0gIGFuZCBpcyB1c2VkIGZvciBsb29raW5nIHVwIGEgY2xhc3MgaW1wbGVtZW50aW5nIHRoYXQgaW50ZXJmYWNlLgotCi0gIFRoZSByZWxhdGlvbiBiZXR3ZWVuIGEgcm9sZSBhbmQgaW1wbGVtZW50YXRpb25zIGZvciB0aGF0IHJvbGUgbWF5IGJlCi0gIG9uZS10by1vbmUgb3Igb25lLXRvLW1hbnkuCi0KLSAgRm9yIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAsIHRoZSBlbnRyeSBpbiB0aGlzIGZpbGUgY2FuIGJlIHN1ZmZpY2llbnQKLSAgdG8gY29tcGxldGVseSBzcGVjaWZ5IHRoaXMgcm9sZSwgYnkgc2V0dGluZyB0aGUgImRlZmF1bHQtY2xhc3MiIGZvciB0aGF0Ci0gIHJvbGUuIFRoaXMgaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uLgotCi0gIEZvciBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCwgdGhlIGVudHJ5IGluIHRoaXMgZmlsZSByZWZlcnMgdG8gYW4KLSAgRXh0ZW5kZWRDb21wb25lbnRTZWxlY3RvciwgbWVhbmluZyB0aGF0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSAKLSAgaW1wbGVtZW50YXRpb25zIGZvciB0aGF0IHJvbGUgYXJlIHJldHJpZXZlZCB2aWEgYSBzZWxlY3Rvci4KLSAgVGhpcyByZXF1aXJlcyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gaW4gdGhlIENvY29vbiBzZXJ2aWNlCi0gIGNvbmZpZ3VyYXRpb24gZmlsZSAoY29jb29uLnhjb25mKS4KLSAgCi0gIElmIGEgc2VydmljZSByZXF1aXJlcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMsIHRoZXNlIGNhbiBiZSBzcGVjaWZpZWQKLSAgaW4gdGhlIENvY29vbiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZmlsZSAoY29jb29uLnhjb25mKSBhcyBhbiBhcmJpdHJhcnkKLSAgWE1MIHNuaXBwZXQgd2hpY2ggaXMgdGhlbiBhdXRvbWF0aWNhbGx5IHBhc3NlZCB0byB0aGUgc2VydmljZSdzIAotICBjb25maWd1cmUoKSBtZXRob2QgYXQgaW5pdGlhbGl6YXRpb24uCi0KLSAgJElkJAotICAtLT4KLQotPCFET0NUWVBFIHJvbGUtbGlzdCBbCi08IUVMRU1FTlQgcm9sZS1saXN0IChyb2xlKyk+IAotPCFFTEVNRU5UIHJvbGUgKGhpbnQqKT4KLTwhRUxFTUVOVCBoaW50IEVNUFRZPgotPCFBVFRMSVNUIHJvbGUgbmFtZSBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgICAgICAgIHNob3J0aGFuZCBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgICAgICAgIGRlZmF1bHQtY2xhc3MgQ0RBVEEgI0lNUExJRUQKLT4KLTwhQVRUTElTVCBoaW50IHNob3J0aGFuZCBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgICAgICAgIGNsYXNzIENEQVRBICNSRVFVSVJFRAotPgotXT4KLQotPHJvbGUtbGlzdD4KLQotICA8cm9sZSBuYW1lPSJvcmcuYXBhY2hlLmxlbnlhLmFjLkF1dGhvcml6ZXJTZWxlY3RvciIKLSAgICAgICAgc2hvcnRoYW5kPSJhdXRob3JpemVycyIKLSAgICAgICAgZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5FeHRlbmRlZENvbXBvbmVudFNlbGVjdG9yIj4KLSAgICA8aGludCBzaG9ydGhhbmQ9InBvbGljeSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5Qb2xpY3lBdXRob3JpemVyIi8+Ci0gICAgPGhpbnQgc2hvcnRoYW5kPSJ3b3JrZmxvdyIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLndvcmtmbG93LldvcmtmbG93QXV0aG9yaXplciIvPgotICAgIDxoaW50IHNob3J0aGFuZD0idXNlY2FzZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2UuVXNlY2FzZUF1dGhvcml6ZXIiLz4KLSAgPC9yb2xlPgotICAKLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5hYy5Qb2xpY3lNYW5hZ2VyU2VsZWN0b3IiCi0gICAgICAgIHNob3J0aGFuZD0icG9saWN5LW1hbmFnZXJzIgotICAgICAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkV4dGVuZGVkQ29tcG9uZW50U2VsZWN0b3IiPgotICAgIDxoaW50IHNob3J0aGFuZD0iZmlsZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlUG9saWN5TWFuYWdlciIvPgotICAgIDxoaW50IHNob3J0aGFuZD0ic2l0ZW1hcCIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLnNpdGVtYXAuU2l0ZW1hcFBvbGljeU1hbmFnZXIiLz4KLSAgPC9yb2xlPgotICAKLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyIgotICAgICAgICBzaG9ydGhhbmQ9ImFjY2Vzcy1jb250cm9sbGVyIgotICAgICAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQnlwYXNzYWJsZUFjY2Vzc0NvbnRyb2xsZXIiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlclJlc29sdmVyU2VsZWN0b3IiCi0gICAgICAgIHNob3J0aGFuZD0iYWNjZXNzLWNvbnRyb2xsZXItcmVzb2x2ZXJzIgotICAgICAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkV4dGVuZGVkQ29tcG9uZW50U2VsZWN0b3IiPgotICAgIDxoaW50IHNob3J0aGFuZD0iY29tcG9zYWJsZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuQ29tcG9zYWJsZUFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciIvPgotICAgIDxoaW50IHNob3J0aGFuZD0iY29uZmlndXJhYmxlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5hYy5Db25maWd1cmFibGVBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIiLz4KLSAgICA8aGludCBzaG9ydGhhbmQ9InB1YmxpY2F0aW9uIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUHVibGljYXRpb25BY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIiLz4KLSAgPC9yb2xlPgotICAKLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5hYy5BdXRoZW50aWNhdG9yIgotICAgICAgICBzaG9ydGhhbmQ9ImF1dGhlbnRpY2F0b3IiCi0gICAgICAgIGRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5Vc2VyQXV0aGVudGljYXRvciIvPgotICAgICAgICAKLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZS5Tb3VyY2VDYWNoZSIKLSAgCQlzaG9ydGhhbmQ9InNvdXJjZWNhY2hlIgotICAJCWRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGUuU291cmNlQ2FjaGVJbXBsIi8+Ci0gIAkJCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmcuUHVibGljYXRpb25UZW1wbGF0ZU1hbmFnZXIiCi0gIAkgICAgc2hvcnRoYW5kPSJwdWJsaWNhdGlvbi10ZW1wbGF0ZS1tYW5hZ2VyIgotICAJICAgIGRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmcuUHVibGljYXRpb25UZW1wbGF0ZU1hbmFnZXJJbXBsIi8+Ci0gICAgICAgIAotICA8cm9sZSBuYW1lPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLk9wZXJhdGlvbiIKLSAgCSAgICBzaG9ydGhhbmQ9Im9wZXJhdGlvbiIKLSAgCSAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0T3BlcmF0aW9uIi8+Ci0gICAgICAgIAotICA8cm9sZSBuYW1lPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VTZWxlY3RvciIKLSAgICAgICAgc2hvcnRoYW5kPSJ1c2VjYXNlcyIKLSAgICAgICAgZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5pbXBsLlVzZWNhc2VTZWxlY3RvciIvPgotCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93LkZsb3dIZWxwZXIiCi0gIAkgICAgc2hvcnRoYW5kPSJmbG93aGVscGVyIgotICAJICAgIGRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93LkZsb3dIZWxwZXJJbXBsIi8+Ci0gICAgICAgIAotICA8cm9sZSBuYW1lPSJvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93TWFuYWdlciIKLSAgCSAgICBzaG9ydGhhbmQ9IndvcmtmbG93LW1hbmFnZXIiCi0gIAkgICAgZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5pbXBsLldvcmtmbG93TWFuYWdlckltcGwiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuTGlua1Jld3JpdGVyIgotICAJICAgIHNob3J0aGFuZD0ibGluay1yZXdyaXRlciIKLSAgCSAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLkxpbmtSZXdyaXRlckltcGwiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlciIKLSAgCSAgICBzaG9ydGhhbmQ9ImRvY3VtZW50LW1hbmFnZXIiCi0gIAkgICAgZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VySW1wbCIvPgotICAgICAgICAKLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRUeXBlQnVpbGRlciIKLSAgCSAgICBzaG9ydGhhbmQ9ImRvY3VtZW50LXR5cGUtYnVpbGRlciIKLSAgCSAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFR5cGVCdWlsZGVySW1wbCIvPgotCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlc01hbmFnZXIiCi0gIAkgICAgc2hvcnRoYW5kPSJyZXNvdXJjZXMtbWFuYWdlciIKLSAgCSAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5EZWZhdWx0UmVzb3VyY2VzTWFuYWdlciIvPgotICAgICAgICAKLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlclNlbGVjdG9yIgotICAJICAgIHNob3J0aGFuZD0ic2l0ZS1tYW5hZ2VycyIKLSAgCSAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkV4dGVuZGVkQ29tcG9uZW50U2VsZWN0b3IiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRlclNlbGVjdG9yIgotICAJICAgIHNob3J0aGFuZD0iZG9jdW1lbnQtYnVpbGRlcnMiCi0gIAkgICAgZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5FeHRlbmRlZENvbXBvbmVudFNlbGVjdG9yIi8+Ci0gICAgICAgIAotICA8cm9sZSBuYW1lPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLkluc3RhbnRpYXRvclNlbGVjdG9yIgotICAJICAgIHNob3J0aGFuZD0idGVtcGxhdGUtaW5zdGFudGlhdG9ycyIKLSAgCSAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkV4dGVuZGVkQ29tcG9uZW50U2VsZWN0b3IiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuZ3VpLkdVSU1hbmFnZXIiCi0gICAgICAgIHNob3J0aGFuZD0iZ3VpLW1hbmFnZXIiCi0gICAgICAgIGRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuZ3VpLmltcGwuR1VJTWFuYWdlckltcGwiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZVNlbGVjdG9yIgotICAJICAgIHNob3J0aGFuZD0icmVzb3VyY2UtdHlwZXMiCi0gIAkgICAgZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlU2VsZWN0b3IiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLkVsZW1lbnRTZXRTZWxlY3RvciIKLSAgCSAgICBzaG9ydGhhbmQ9Im1ldGEtZGF0YSIKLSAgCSAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkV4dGVuZGVkQ29tcG9uZW50U2VsZWN0b3IiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeU1hbmFnZXIiCi0gICAgICAgIHNob3J0aGFuZD0icmVwb3NpdG9yeS1tYW5hZ2VyIgotICAgICAgICBkZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlNYW5hZ2VySW1wbCIvPgotICAgICAgICAKLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25NYW5hZ2VyIgotICAgICAgICBzaG9ydGhhbmQ9InB1YmxpY2F0aW9uLW1hbmFnZXIiCi0gICAgICAgIGRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uTWFuYWdlckltcGwiLz4KLSAgICAgICAgCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnJlcG8uYXZhbG9uLlJlcG9zaXRvcnlGYWN0b3J5IgotICAgICAgICBzaG9ydGhhbmQ9InJlcG9zaXRvcnktZmFjdG9yeSIKLSAgICAgICAgZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucmVwby5hdmFsb24uUmVwb3NpdG9yeUZhY3RvcnlJbXBsIi8+Ci0KLTwhLS0gUkdFOiBpbnNlcnRlZCByb2xlcyB1c2VkIGJ5IHRoZSBMdWNlbmUyIGJsb2NrIC0tPgkKLQotICAgIDwhLS0gZGVmYXVsdCBpbmRleGVyIC0tPgotICA8cm9sZSBuYW1lPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkluZGV4ZXIvZGVmYXVsdCIgc2hvcnRoYW5kPSJkZWZhdWx0X2luZGV4ZXIiCi1kZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLmltcGwuRGVmYXVsdEluZGV4ZXJJbXBsIi8+Ci0KLSAgICA8IS0tIHBhcmFsbGVsIGluZGV4ZXIgLS0+Ci0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlci9wYXJhbGxlbCIgc2hvcnRoYW5kPSJwYXJhbGxlbF9pbmRleGVyIgotZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsLlBhcmFsbGVsSW5kZXhlckltcGwiLz4KLQotCTwhLS0gYW5hbHl6ZXIgbWFuYWdlciAtLT4KLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5BbmFseXplck1hbmFnZXIiIHNob3J0aGFuZD0iYW5hbHl6ZXJfbWFuYWdlciIKLWRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuaW1wbC5BbmFseXplck1hbmFnZXJJbXBsIi8+Ci0KLQk8IS0tIGluZGV4IG1hbmFnZXIgLS0+Ci0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhNYW5hZ2VyIiBzaG9ydGhhbmQ9ImluZGV4X21hbmFnZXIiCi1kZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLmltcGwuSW5kZXhNYW5hZ2VySW1wbCIvPgotCi08L3JvbGUtbGlzdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3QvYW50ZWF0ZXIvdGVzdHMueG1sIGIvdHJ1bmsvc3JjL2ltcGwvdGVzdC9hbnRlYXRlci90ZXN0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZmEwNTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9hbnRlYXRlci90ZXN0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLSAgPCFFTlRJVFkgZGVmYXVsdCBTWVNURU0gIi4uLy4uL3dlYmFwcC9sZW55YS9wdWJzL2RlZmF1bHQvdGVzdC9hbnRlYXRlci90ZXN0cy54bWwiPiAKLV0+Ci0KLTxwcm9qZWN0IG5hbWU9IkxlbnlhIEFudGVhdGVyIFRlc3RzIiBkZWZhdWx0PSJ0ZXN0cyI+Ci0KLSAgPHRhc2tkZWYgcmVzb3VyY2U9Ik1FVEEtSU5GL0FudGVhdGVyLnRhc2tzIi8+Ci0gIDx0eXBlZGVmIHJlc291cmNlPSJNRVRBLUlORi9BbnRlYXRlci50eXBlcyIvPgotICAKLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHQucG9ydCIgdmFsdWU9Ijg4ODgiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHQuaGFsdG9uZXJyb3IiIHZhbHVlPSJ0cnVlIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0cyIKLSAgICBkZXBlbmRzPSIKLSAgICAgICAgcHVicy5kZWZhdWx0Ci0gICAgIi8+Ci0KLSAgJmRlZmF1bHQ7Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOWE0NjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQ6IEFjY2Vzc0NvbnRyb2xUZXN0LmphdmEgNDA4NzAyIDIwMDYtMDUtMjIgMTY6MDM6NDlaIGFuZHJlYXMgJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlclJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVBY2NyZWRpdGFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLkxlbnlhVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUHVibGljYXRpb25BY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uSW1wbDsKLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCBleHRlbmRzIExlbnlhVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QVUJfSUQgPSAidGVzdCI7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlU2VsZWN0b3IgYWNjZXNzQ29udHJvbGxlclJlc29sdmVyU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIgYWNjZXNzQ29udHJvbGxlclJlc29sdmVyOwotICAgIHByaXZhdGUgRGVmYXVsdEFjY2Vzc0NvbnRyb2xsZXIgYWNjZXNzQ29udHJvbGxlcjsKLQotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb24gbG9naW4oU3RyaW5nIHVzZXJJZCkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBuZXcgU2Vzc2lvbkltcGwobnVsbCwgdHJ1ZSwgZ2V0TWFuYWdlcigpLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIAotICAgICAgICBEZWZhdWx0QWNjZXNzQ29udHJvbGxlciBhYyA9IGdldEFjY2Vzc0NvbnRyb2xsZXIoc2Vzc2lvbiwgVEVTVF9QVUJfSUQpOwotICAgICAgICBBY2NyZWRpdGFibGVNYW5hZ2VyIGFjTWdyID0gYWMuZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpOwotICAgICAgICBVc2VyIHVzZXIgPSBhY01nci5nZXRVc2VyTWFuYWdlcigpLmdldFVzZXIodXNlcklkKTsKLQotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiVGhlIHVzZXIgWyIgKyB1c2VySWQgKyAiXSBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFjLnNldHVwSWRlbnRpdHkoZ2V0UmVxdWVzdCgpKTsKLQotICAgICAgICBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5TZXNzaW9uIGNvY29vblNlc3Npb24gPSBnZXRSZXF1ZXN0KCkuZ2V0U2Vzc2lvbigpOwotICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IChJZGVudGl0eSkgY29jb29uU2Vzc2lvbi5nZXRBdHRyaWJ1dGUoSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZiAoIWlkZW50aXR5LmNvbnRhaW5zKHVzZXIpKSB7Ci0gICAgICAgICAgICBVc2VyIG9sZFVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICBpZiAob2xkVXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlbW92aW5nIHVzZXIgWyIgKyBvbGRVc2VyICsgIl0gZnJvbSBpZGVudGl0eS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWRlbnRpdHkucmVtb3ZlSWRlbnRpZmlhYmxlKG9sZFVzZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWRlbnRpdHkuYWRkSWRlbnRpZmlhYmxlKHVzZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWMuYXV0aG9yaXplKGdldFJlcXVlc3QoKSk7Ci0KLSAgICAgICAgQWNjcmVkaXRhYmxlW10gYWNjcnMgPSBpZGVudGl0eS5nZXRBY2NyZWRpdGFibGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWNjcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmluZm8oIkFjY3JlZGl0YWJsZTogIiArIGFjY3JzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlc3Npb24uc2V0SWRlbnRpdHkoaWRlbnRpdHkpOwotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRGVmYXVsdEFjY2Vzc0NvbnRyb2xsZXIgZ2V0QWNjZXNzQ29udHJvbGxlcigpIHsKLSAgICAgICAgcmV0dXJuIGdldEFjY2Vzc0NvbnRyb2xsZXIoZ2V0U2Vzc2lvbigpLCBURVNUX1BVQl9JRCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlZmF1bHRBY2Nlc3NDb250cm9sbGVyIGdldEFjY2Vzc0NvbnRyb2xsZXIoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgcHViSWQpIHsKLSAgICAgICAgRGVmYXVsdEFjY2Vzc0NvbnRyb2xsZXIgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuYWNjZXNzQ29udHJvbGxlclJlc29sdmVyU2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSBnZXRNYW5hZ2VyKCkubG9va3VwKAotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLmFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlclNlbGVjdG9yKTsKLQotICAgICAgICAgICAgdGhpcy5hY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIgPSAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyKSB0aGlzLmFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlclNlbGVjdG9yCi0gICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLkRFRkFVTFRfUkVTT0xWRVIpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHRoaXMuYWNjZXNzQ29udHJvbGxlclJlc29sdmVyKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmluZm8oCi0gICAgICAgICAgICAgICAgICAgICJVc2luZyBhY2Nlc3MgY29udHJvbGxlciByZXNvbHZlcjogWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMuYWNjZXNzQ29udHJvbGxlclJlc29sdmVyLmdldENsYXNzKCkgKyAiXSIpOwotCi0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbihzZXNzaW9uLCBwdWJJZCk7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJSZXNvbHZlIGFjY2VzcyBjb250cm9sbGVyIik7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKAotICAgICAgICAgICAgICAgICAgICAiUHVibGljYXRpb24gZGlyZWN0b3J5OiBbIiArIHB1Yi5nZXREaXJlY3RvcnkoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIik7Ci0KLSAgICAgICAgICAgIFN0cmluZyB1cmwgPSAiLyIgKyBwdWJJZCArICIvYXV0aG9yaW5nL2luZGV4Lmh0bWwiOwotICAgICAgICAgICAgY29udHJvbGxlciA9IChEZWZhdWx0QWNjZXNzQ29udHJvbGxlcikgKChQdWJsaWNhdGlvbkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcikgdGhpcy5hY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIpCi0gICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlQWNjZXNzQ29udHJvbGxlcih1cmwpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiUmVzb2x2ZWQgYWNjZXNzIGNvbnRyb2xsZXI6IFsiICsgY29udHJvbGxlci5nZXRDbGFzcygpICsgIl0iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB0ZWFyZG93biBtZXRob2QgZm9yIEpVbml0Ci0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodGhpcy5hY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXJTZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5hY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY2Vzc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5yZWxlYXNlKHRoaXMuYWNjZXNzQ29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzQ29udHJvbGxlclJlc29sdmVyU2VsZWN0b3IucmVsZWFzZSh0aGlzLmFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZSh0aGlzLmFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlclNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJOQU1FID0gImxlbnlhIjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvbGljeSBtYW5hZ2VyLgotICAgICAqIEByZXR1cm4gQSBwb2xpY3kgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUG9saWN5TWFuYWdlciBnZXRQb2xpY3lNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gZ2V0QWNjZXNzQ29udHJvbGxlcigpLmdldFBvbGljeU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIEFuIGFjY3JlZGl0YWJsZSBtYW5hZ2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBBY2NyZWRpdGFibGVNYW5hZ2VyIGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBY2Nlc3NDb250cm9sbGVyKCkuZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGaWxlIGdldEFjY3JlZGl0YWJsZXNEaXJlY3RvcnkoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVBY2NyZWRpdGFibGVNYW5hZ2VyIGFjY3JNZ3IgPSAoRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXIpIGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKTsKLSAgICAgICAgcmV0dXJuIGFjY3JNZ3IuZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkoZ2V0TWFuYWdlcigpLCBnZXRTZXNzaW9uKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudEZhY3RvcnkgZ2V0RmFjdG9yeShTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgcmV0dXJuIERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkoZ2V0TWFuYWdlcigpLCBzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsKLQotICAgIHByb3RlY3RlZCBTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIGlmICh0aGlzLnNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24gPSBsb2dpbigibGVueWEiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHB1YklkKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0RmFjdG9yeShzZXNzaW9uKS5nZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKFN0cmluZyBpZCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEZhY3RvcnkoKS5nZXRQdWJsaWNhdGlvbihpZCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJZGVudGl0eSBnZXRJZGVudGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKS5nZXRJZGVudGl0eSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvQWJzdHJhY3RFeGNhbGlidXJUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL0Fic3RyYWN0RXhjYWxpYnVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDMxYzZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvQWJzdHJhY3RFeGNhbGlidXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtczsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5leGNhbGlidXIudGVzdGNhc2UuRXhjYWxpYnVyVGVzdENhc2U7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgZXhjYWxpYnVyIHRlc3RzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4Y2FsaWJ1clRlc3QgZXh0ZW5kcyBFeGNhbGlidXJUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5DT05GSUdVUkFUSU9OPC9jb2RlPiBUaGUgcGF0aCB0byB0aGUgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT04gPSAiLyIgKwotICAgIEFic3RyYWN0RXhjYWxpYnVyVGVzdC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi9sZW55YS54dGVzdCI7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdCBUaGUgdGVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RFeGNhbGlidXJUZXN0KFN0cmluZyB0ZXN0KSB7Ci0gICAgICAgIHN1cGVyKHRlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnRlc3RjYXNlLkV4Y2FsaWJ1clRlc3RDYXNlI3ByZXBhcmUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKENPTkZJR1VSQVRJT04pOwotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBBYnN0cmFjdEV4Y2FsaWJ1clRlc3QuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShDT05GSUdVUkFUSU9OKTsKLSAgICAgICAgcHJlcGFyZShzdHJlYW0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9MZW55YVRlc3RDYXNlLmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL0xlbnlhVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlYTY5Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL0xlbnlhVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkRlZmF1bHRDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29yZS5jb250YWluZXIuQ29udGFpbmVyVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LmNvbW1hbmRsaW5lLkNvbW1hbmRMaW5lQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5jb21tYW5kbGluZS5Db21tYW5kTGluZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQubW9jay5Nb2NrRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24udXRpbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN5c3RlbVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBMZW55YSB0ZXN0cyB3aGljaCBuZWVkIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTGVueWFUZXN0Q2FzZSBleHRlbmRzIENvbnRhaW5lclRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBEZWZhdWx0Q29udGV4dCBjb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29udGV4dChEZWZhdWx0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyLmFkZENvbnRleHQoY29udGV4dCk7Ci0KLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICBTdHJpbmcgdGVtcFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlbXBEaXIiLCAiYnVpbGQvbGVueWEvdGVtcCIpOwotICAgICAgICBTdHJpbmcgY29udGV4dFJvb3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbnRleHRSb290IiwgImJ1aWxkL2xlbnlhL3dlYmFwcCIpOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJBZGRpbmcgY29udGV4dCByb290IGVudHJ5IFsiICsgY29udGV4dFJvb3QgKyAiXSIpOwotCi0gICAgICAgIEZpbGUgY29udGV4dFJvb3REaXIgPSBuZXcgRmlsZShjb250ZXh0Um9vdCk7Ci0gICAgICAgIGNvbnRleHQucHV0KCJjb250ZXh0LXJvb3QiLCBjb250ZXh0Um9vdERpcik7Ci0KLSAgICAgICAgU3RyaW5nIHRlc3RQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0UGF0aCIsICJidWlsZC90ZXN0Iik7Ci0gICAgICAgIEZpbGUgdGVzdFJvb3REaXIgPSBuZXcgRmlsZSh0ZXN0UGF0aCk7Ci0gICAgICAgIGNvbnRleHQucHV0KCJ0ZXN0LXBhdGgiLCB0ZXN0Um9vdERpcik7Ci0KLSAgICAgICAgQ29udGV4dCBlbnZDb250ZXh0ID0gbmV3IENvbW1hbmRMaW5lQ29udGV4dChjb250ZXh0Um9vdCk7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyhlbnZDb250ZXh0LCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGNvbnRleHQucHV0KENvbnN0YW50cy5DT05URVhUX0VOVklST05NRU5UX0NPTlRFWFQsIGVudkNvbnRleHQpOwotCi0gICAgICAgIEZpbGUgdGVtcERpciA9IG5ldyBGaWxlKHRlbXBQYXRoKTsKLQotICAgICAgICBGaWxlIHdvcmtEaXIgPSBuZXcgRmlsZSh0ZW1wRGlyLCAid29yayIpOwotICAgICAgICBjb250ZXh0LnB1dCgid29yay1kaXJlY3RvcnkiLCB3b3JrRGlyKTsKLQotICAgICAgICBGaWxlIGNhY2hlRGlyID0gbmV3IEZpbGUodGVtcERpciwgImNhY2hlIik7Ci0gICAgICAgIGNvbnRleHQucHV0KENvbnN0YW50cy5DT05URVhUX0NBQ0hFX0RJUiwgY2FjaGVEaXIpOwotCi0gICAgICAgIEZpbGUgdXBsb2FkRGlyID0gbmV3IEZpbGUodGVtcERpciwgInVwbG9hZCIpOwotICAgICAgICBjb250ZXh0LnB1dChDb25zdGFudHMuQ09OVEVYVF9VUExPQURfRElSLCB1cGxvYWREaXIpOwotCi0gICAgICAgIGNvbnRleHQucHV0KENvbnN0YW50cy5DT05URVhUX0NMQVNTX0xPQURFUiwgTGVueWFUZXN0Q2FzZS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgY29udGV4dC5wdXQoQ29uc3RhbnRzLkNPTlRFWFRfQ0xBU1NQQVRILCBnZXRDbGFzc1BhdGgoY29udGV4dFJvb3QpKTsKLSAgICAgICAgLy8gY29udGV4dC5wdXQoQ29uc3RhbnRzLkNPTlRFWFRfQ09ORklHX1VSTCwgY29uZi50b1VSTCgpKTsKLSAgICAgICAgY29udGV4dC5wdXQoQ29uc3RhbnRzLkNPTlRFWFRfREVGQVVMVF9FTkNPRElORywgIklTTy04ODU5LTEiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlcXVlc3QgcmVxdWVzdCA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgUmVxdWVzdCBnZXRSZXF1ZXN0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0ZXN0UGF0aCA9IG5ldyBGaWxlKCJidWlsZC90ZXN0Iik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUgPSBMZW55YVRlc3RDYXNlLmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIueHRlc3QiOwotICAgICAgICBGaWxlIHJlc291cmNlRmlsZSA9IG5ldyBGaWxlKHRlc3RQYXRoLCByZXNvdXJjZU5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlc291cmNlRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkxvYWRpbmcgcmVzb3VyY2UgIiArIHJlc291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBwcmVwYXJlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzb3VyY2VGaWxlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUmVzb3VyY2Ugbm90IGZvdW5kICIgKyByZXNvdXJjZU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIGdldE1hbmFnZXIoKS5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgIE1vY2tFbnZpcm9ubWVudCBlbnYgPSBuZXcgTW9ja0Vudmlyb25tZW50KHJlc29sdmVyKTsKLQotICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSBnZXRXZWJhcHBVcmwoKTsKLQotICAgICAgICB0aGlzLnJlcXVlc3QgPSBuZXcgQ29tbWFuZExpbmVSZXF1ZXN0KGVudiwKLSAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICBwYXRoSW5mbywKLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcCgpLAotICAgICAgICAgICAgICAgIGdldFJlcXVlc3RQYXJhbWV0ZXJzKCkpOwotICAgICAgICBjb250ZXh0LnB1dCgib2JqZWN0LW1vZGVsLnJlcXVlc3QiLCB0aGlzLnJlcXVlc3QpOwotCi0gICAgICAgIE1hcCBvYmplY3RNb2RlbCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG9iamVjdE1vZGVsLnB1dChPYmplY3RNb2RlbEhlbHBlci5SRVFVRVNUX09CSkVDVCwgcmVxdWVzdCk7Ci0gICAgICAgIENvbnRleHQgZW52Q29udGV4dCA9IChDb250ZXh0KSBjb250ZXh0LmdldChDb25zdGFudHMuQ09OVEVYVF9FTlZJUk9OTUVOVF9DT05URVhUKTsKLSAgICAgICAgb2JqZWN0TW9kZWwucHV0KE9iamVjdE1vZGVsSGVscGVyLkNPTlRFWFRfT0JKRUNULCBlbnZDb250ZXh0KTsKLSAgICAgICAgY29udGV4dC5wdXQoQ29udGV4dEhlbHBlci5DT05URVhUX09CSkVDVF9NT0RFTCwgb2JqZWN0TW9kZWwpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFdlYmFwcFVybCgpIHsKLSAgICAgICAgcmV0dXJuICIvdGVzdC9hdXRob3JpbmcvaW5kZXguaHRtbCI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRSZXF1ZXN0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBidWlsZHMgdGhlIGltcG9ydGFudCBDbGFzc1BhdGggdXNlZCBieSB0aGlzIGNsYXNzLiBJdCBkb2VzIHNvIGluIGEgbmV1dHJhbCB3YXkuIEl0Ci0gICAgICogaXRlcmF0ZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIHRocm91Z2ggZXZlcnkgZmlsZSBpbiB0aGUgbGliIGRpcmVjdG9yeSBhbmQgYWRkcyBpdCB0byB0aGUKLSAgICAgKiBjbGFzc3BhdGguCi0gICAgICogCi0gICAgICogQWxzbywgd2UgYWRkIHRoZSBmaWxlcyB0byB0aGUgQ2xhc3NMb2FkZXIgZm9yIHRoZSBDb2Nvb24gc3lzdGVtLiBJbiBvcmRlciB0byBwcm90ZWN0Ci0gICAgICogb3Vyc2VsdmVzIGZyb20gc2tpdHpvZnJhbnRpYyBjbGFzc2xvYWRlcnMsIHdlIG5lZWQgdG8gd29yayB3aXRoIGEga25vd24gb25lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHBhdGgKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NQYXRoKGZpbmFsIFN0cmluZyBjb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWlsZENsYXNzUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBTdHJpbmcgY2xhc3NEaXIgPSBjb250ZXh0ICsgIi9XRUItSU5GL2NsYXNzZXMiOwotICAgICAgICBidWlsZENsYXNzUGF0aC5hcHBlbmQoY2xhc3NEaXIpOwotCi0gICAgICAgIEZpbGUgcm9vdCA9IG5ldyBGaWxlKGNvbnRleHQgKyAiL1dFQi1JTkYvbGliIik7Ci0gICAgICAgIGlmIChyb290LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIEZpbGVbXSBsaWJyYXJpZXMgPSByb290Lmxpc3RGaWxlcygpOwotICAgICAgICAgICAgQXJyYXlzLnNvcnQobGlicmFyaWVzKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpYnJhcmllc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLmphciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkQ2xhc3NQYXRoLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoSU9VdGlscy5nZXRGdWxsRmlsZW5hbWUobGlicmFyaWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnVpbGRDbGFzc1BhdGguYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpLmFwcGVuZChTeXN0ZW1VdGlscy5KQVZBX0NMQVNTX1BBVEgpOwotCi0gICAgICAgIC8vIEV4dHJhIGNsYXNzIHBhdGggaXMgbmVjZXNzYXJ5IGZvciBub24tY2xhc3Nsb2FkZXItYXdhcmUgamF2YSBjb21waWxlcnMgdG8gY29tcGlsZSBYU1BzCi0gICAgICAgIC8vIGJ1aWxkQ2xhc3NQYXRoLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKQotICAgICAgICAvLyAuYXBwZW5kKGdldEV4dHJhQ2xhc3NQYXRoKGNvbnRleHQpKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJDb250ZXh0IGNsYXNzcGF0aDogIiArIGJ1aWxkQ2xhc3NQYXRoKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkQ2xhc3NQYXRoLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vZ2VuZXJhdGlvbi9UZXN0UHJveHlHZW5lcmF0b3JTZXJ2bGV0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9nZW5lcmF0aW9uL1Rlc3RQcm94eUdlbmVyYXRvclNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiNzEyMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9nZW5lcmF0aW9uL1Rlc3RQcm94eUdlbmVyYXRvclNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZ2VuZXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotCi0KLS8qKgotICogUHJveHkgR2VuZXJhdG9yIFNlcnZsZXQgVGVzdAotICovCi1wdWJsaWMgY2xhc3MgVGVzdFByb3h5R2VuZXJhdG9yU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplLCBnaXZlbiBhIHNlcnZsZXQgY29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5pbml0KGNvbmZpZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHRvIGdldAotICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgdG8gcHV0IGl0IGluCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJTyBlcnJvciBvY2N1cnMKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotCi0gICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotICAgICAgICB3cml0ZXIucHJpbnQoIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludCgiPHNlcnZsZXQgY2xhc3M9XCIiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJcIj4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KCI8cmVxdWVzdCBtZXRob2Q9XCJHRVRcIj4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KGdldFJlcXVlc3RJbmZvKHJlcXVlc3QpKTsKLSAgICAgICAgd3JpdGVyLnByaW50KGdldFBhcmFtZXRlcnMocmVxdWVzdCkpOwotICAgICAgICB3cml0ZXIucHJpbnQoZ2V0U2Vzc2lvbihyZXF1ZXN0KSk7Ci0gICAgICAgIHdyaXRlci5wcmludChnZXRDb29raWVzKHJlcXVlc3QpKTsKLSAgICAgICAgd3JpdGVyLnByaW50KCI8L3JlcXVlc3Q+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludCgiPC9zZXJ2bGV0PiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIGEgUE9TVCB1c2luZyB0aGUgcmVxdWVzdCBhbmQgc3RvcmUgdGhlIHJlc3BvbnNlIGluIHRoZSByZXNwb25zZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0gICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotCi0gICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotICAgICAgICB3cml0ZXIucHJpbnQoIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludCgiPHNlcnZsZXQgY2xhc3M9XCIiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJcIj4iKTsKLSAgICAgICAgd3JpdGVyLnByaW50KCI8cmVxdWVzdCBtZXRob2Q9XCJQT1NUXCI+Iik7Ci0gICAgICAgIHdyaXRlci5wcmludChnZXRSZXF1ZXN0SW5mbyhyZXF1ZXN0KSk7Ci0gICAgICAgIHdyaXRlci5wcmludChnZXRQYXJhbWV0ZXJzKHJlcXVlc3QpKTsKLSAgICAgICAgd3JpdGVyLnByaW50KGdldFNlc3Npb24ocmVxdWVzdCkpOwotICAgICAgICB3cml0ZXIucHJpbnQoZ2V0Q29va2llcyhyZXF1ZXN0KSk7Ci0gICAgICAgIHdyaXRlci5wcmludCgiPC9yZXF1ZXN0PiIpOwotICAgICAgICB3cml0ZXIucHJpbnQoIjwvc2VydmxldD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcmVxdWVzdDogVVJJLCBTZXJ2ZXIgbmFtZSBhbmQgcG9ydAotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0Ci0gICAgICogQHJldHVybiBUaGUgaW5mb3JtYXRpb24gKGFzIFhNTCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RJbmZvKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotICAgICAgICBzYi5hcHBlbmQoIjxVUkk+IiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpICsgIjwvVVJJPiIpOwotICAgICAgICBzYi5hcHBlbmQoIjxzZXJ2ZXJuYW1lPiIgKyByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSArICI8L3NlcnZlcm5hbWU+Iik7Ci0gICAgICAgIHNiLmFwcGVuZCgiPHNlcnZlcnBvcnQ+IiArIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpICsgIjwvc2VydmVycG9ydD4iKTsKLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHBhcmFtZXRlcnMgZnJvbSBhIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdAotICAgICAqIEByZXR1cm4gVGhlIHBhcmFtZXRlcnMgKGFzIFhNTCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0gICAgICAgIEVudW1lcmF0aW9uIHBhcmFtZXRlcnMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Ci0gICAgICAgIGJvb2xlYW4gaGFzUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuaGFzTW9yZUVsZW1lbnRzKCk7Ci0KLSAgICAgICAgaWYgKGhhc1BhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiPHBhcmFtZXRlcnM+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAocGFyYW1ldGVycy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiPHBhcmFtZXRlciBuYW1lPVwiIiArIG5hbWUgKyAiXCI+Iik7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8dmFsdWU+IiArIHZhbHVlc1tpXSArICI8L3ZhbHVlPiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQoIjwvcGFyYW1ldGVyPiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1BhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9wYXJhbWV0ZXJzPiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBzZXNzaW9uIGF0dHJpYnV0ZXMgb2YgYSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIFRoZSBzZXNzaW9uIGF0dHJpYnV0ZXMgKGluIFhNTCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0KLSAgICAgICAgLy9IdHRwU2Vzc2lvbiBzZXNzaW9uPXJlcXVlc3QuZ2V0U2Vzc2lvbih0cnVlKTsKLSAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0KLSAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI8c2Vzc2lvbj4iKTsKLQotICAgICAgICAgICAgRW51bWVyYXRpb24gYXR0cmlidXRlcyA9IHNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMoKTsKLQotICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8bm9hdHRyaWJ1dGVzLz4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGF0dHJpYnV0ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IChTdHJpbmcpIGF0dHJpYnV0ZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxhdHRyaWJ1dGUgbmFtZT1cIiIgKyBhdHRyaWJ1dGVOYW1lICsgIlwiPiIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIiArIHNlc3Npb24uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvYXR0cmlidXRlPiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQoIjwvc2Vzc2lvbj4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiPG5vc2Vzc2lvbi8+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYWxsIGNvb2tpZXMgb2YgYSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIFRoZSBjb29raWVzIChhcyBYTUwpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb29raWVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotCi0gICAgICAgIENvb2tpZVtdIGNvb2tpZXMgPSByZXF1ZXN0LmdldENvb2tpZXMoKTsKLQotICAgICAgICBpZiAoY29va2llcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29va2llcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8Y29va2llcz4iKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxjb29raWU+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGNvbW1lbnQ+IiArIGNvb2tpZXNbaV0uZ2V0Q29tbWVudCgpICsgIjwvY29tbWVudD4iKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8ZG9tYWluPiIgKyBjb29raWVzW2ldLmdldERvbWFpbigpICsgIjwvZG9tYWluPiIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxtYXhhZ2U+IiArIGNvb2tpZXNbaV0uZ2V0TWF4QWdlKCkgKyAiPC9tYXhhZ2U+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPG5hbWU+IiArIGNvb2tpZXNbaV0uZ2V0TmFtZSgpICsgIjwvbmFtZT4iKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8cGF0aD4iICsgY29va2llc1tpXS5nZXRQYXRoKCkgKyAiPC9wYXRoPiIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxzZWN1cmU+IiArIGNvb2tpZXNbaV0uZ2V0U2VjdXJlKCkgKyAiPC9zZWN1cmU+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHZhbHVlPiIgKyBjb29raWVzW2ldLmdldFZhbHVlKCkgKyAiPC92YWx1ZT4iKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8dmVyc2lvbj4iICsgY29va2llc1tpXS5nZXRWZXJzaW9uKCkgKyAiPC92ZXJzaW9uPiIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvY29va2llPiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9jb29raWVzPiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxub2Nvb2tpZXMvPiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI8bm9jb29raWVzLz4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvTWV0YURhdGFUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjZlOWI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvTWV0YURhdGFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLmR1YmxpbmNvcmUuRHVibGluQ29yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci0KLS8qKgotICogTWV0YSBkYXRhIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhRGF0YVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBtZXRhIGRhdGEuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IHB1YmxpY2F0aW9uLmdldEFyZWEoImF1dGhvcmluZyIpLmdldFNpdGUoKS5nZXROb2RlKCIvaW5kZXgiKS5nZXRMaW5rKCJlbiIpLmdldERvY3VtZW50KCk7IAotCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVcmkgPSAiZm9vYmFyIjsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jLmdldE1ldGFEYXRhKG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgZSA9IGUxOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZSk7Ci0KLSAgICAgICAgbmFtZXNwYWNlVXJpID0gRHVibGluQ29yZS5EQ19OQU1FU1BBQ0U7Ci0gICAgICAgIE1ldGFEYXRhIGRjID0gZG9jLmdldE1ldGFEYXRhKG5hbWVzcGFjZVVyaSk7Ci0KLSAgICAgICAgZG9jLmdldFJlcG9zaXRvcnlOb2RlKCkubG9jaygpOwotCi0gICAgICAgIGNoZWNrU2V0VGl0bGUoZGMpOwotICAgICAgICBjaGVja1JlbW92ZUFsbFZhbHVlcyhkYyk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1NldFRpdGxlKE1ldGFEYXRhIGRjKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYy5zZXRWYWx1ZSgiZm9vIiwgImJhciIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGUpOwotICAgICAgICBkYy5zZXRWYWx1ZSgidGl0bGUiLCAiVGhpcyBpcyB0aGUgdGl0bGUiKTsKLQotICAgICAgICBlID0gbnVsbDsKLSAgICAgICAgLy8gYWRkVmFsdWUoKSBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2UgYSB2YWx1ZSBpcyBhbHJlYWR5IHNldAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGMuYWRkVmFsdWUoInRpdGxlIiwgImJhciIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGUpOwotCi0gICAgfQotCi0gICAgU3RyaW5nIE5BTUVTUEFDRSA9ICJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS90ZXN0L21ldGFkYXRhIjsKLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrT25Db3B5KFB1YmxpY2F0aW9uIHB1YikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGFEYXRhUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVnaXN0cnkgPSAoTWV0YURhdGFSZWdpc3RyeSkgZ2V0TWFuYWdlcigpLmxvb2t1cChNZXRhRGF0YVJlZ2lzdHJ5LlJPTEUpOwotICAgICAgICAgICAgRWxlbWVudFNldCBzZXQgPSBuZXcgVGVzdEVsZW1lbnRTZXQoKTsKLSAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKE5BTUVTUEFDRSwgc2V0KTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKHJlZ2lzdHJ5KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0gICAgICAgIERvY3VtZW50IHNvdXJjZSA9IGZhY3RvcnkuZ2V0KHB1YiwgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsICIvaW5kZXgiLCAiZW4iKTsKLSAgICAgICAgRG9jdW1lbnQgdGFyZ2V0ID0gZmFjdG9yeS5nZXQocHViLCBQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSwgIi9pbmRleCIsICJlbiIpOwotICAgICAgICAKLSAgICAgICAgTWV0YURhdGEgc291cmNlTWV0YSA9IHNvdXJjZS5nZXRNZXRhRGF0YShOQU1FU1BBQ0UpOwotICAgICAgICBzb3VyY2VNZXRhLnNldFZhbHVlKCJjb3B5IiwgInNvdXJjZUNvcHkiKTsKLSAgICAgICAgc291cmNlTWV0YS5zZXRWYWx1ZSgiaWdub3JlIiwgInNvdXJjZUlnbm9yZSIpOwotICAgICAgICBzb3VyY2VNZXRhLnNldFZhbHVlKCJkZWxldGUiLCAic291cmNlRGVsZXRlIik7Ci0gICAgICAgIAotICAgICAgICBNZXRhRGF0YSB0YXJnZXRNZXRhID0gdGFyZ2V0LmdldE1ldGFEYXRhKE5BTUVTUEFDRSk7Ci0gICAgICAgIHRhcmdldE1ldGEuc2V0VmFsdWUoImlnbm9yZSIsICJ0YXJnZXRJZ25vcmUiKTsKLSAgICAgICAgdGFyZ2V0TWV0YS5zZXRWYWx1ZSgiZGVsZXRlIiwgInRhcmdldERlbGV0ZSIpOwotICAgICAgICAKLSAgICAgICAgdGFyZ2V0TWV0YS5yZXBsYWNlQnkoc291cmNlTWV0YSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKHRhcmdldE1ldGEuZ2V0VmFsdWVzKCJjb3B5IikubGVuZ3RoID09IDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlTWV0YS5nZXRWYWx1ZXMoImNvcHkiKSwgdGFyZ2V0TWV0YS5nZXRWYWx1ZXMoImNvcHkiKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKHRhcmdldE1ldGEuZ2V0VmFsdWVzKCJpZ25vcmUiKS5sZW5ndGggPT0gMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0YXJnZXRNZXRhLmdldEZpcnN0VmFsdWUoImlnbm9yZSIpLCAidGFyZ2V0SWdub3JlIik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKHRhcmdldE1ldGEuZ2V0VmFsdWVzKCJkZWxldGUiKS5sZW5ndGggPT0gMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tSZW1vdmVBbGxWYWx1ZXMoTWV0YURhdGEgZGMpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRjLnJlbW92ZUFsbFZhbHVlcygidGl0bGUiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkYy5nZXRWYWx1ZXMoInRpdGxlIikubGVuZ3RoID09IDApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBjbGFzcyBUZXN0RWxlbWVudCBpbXBsZW1lbnRzIEVsZW1lbnQgewotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgaW50IGFjdGlvbk9uQ29weTsKLQotICAgICAgICBwcm90ZWN0ZWQgVGVzdEVsZW1lbnQoU3RyaW5nIG5hbWUsIGludCBhY3Rpb25PbkNvcHkpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLmFjdGlvbk9uQ29weSA9IGFjdGlvbk9uQ29weTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uT25Db3B5KCkgewotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbk9uQ29weTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgY2xhc3MgVGVzdEVsZW1lbnRTZXQgaW1wbGVtZW50cyBFbGVtZW50U2V0IHsKLQotICAgICAgICBwcml2YXRlIEVsZW1lbnRbXSBlbGVtZW50cyA9IHsgbmV3IFRlc3RFbGVtZW50KCJjb3B5IiwgRWxlbWVudC5PTkNPUFlfQ09QWSksCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RFbGVtZW50KCJpZ25vcmUiLCBFbGVtZW50Lk9OQ09QWV9JR05PUkUpLAotICAgICAgICAgICAgICAgIG5ldyBUZXN0RWxlbWVudCgiZGVsZXRlIiwgRWxlbWVudC5PTkNPUFlfREVMRVRFKSB9OwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBNYXAgbmFtZTJlbGVtZW50OwotCi0gICAgICAgIHByb3RlY3RlZCBUZXN0RWxlbWVudFNldCgpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUyZWxlbWVudC5wdXQoZWxlbWVudHNbaV0uZ2V0TmFtZSgpLCBlbGVtZW50c1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiAoRWxlbWVudCkgdGhpcy5uYW1lMmVsZW1lbnQuZ2V0KG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVsZW1lbnRbXSBnZXRFbGVtZW50cygpIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIE5BTUVTUEFDRTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RlZmF1bHREb2N1bWVudEJ1aWxkZXJUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RlZmF1bHREb2N1bWVudEJ1aWxkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjlmNDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9EZWZhdWx0RG9jdW1lbnRCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLS8qKgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdERvY3VtZW50QnVpbGRlclRlc3QgZXh0ZW5kcyBEZWZhdWx0RG9jdW1lbnRUZXN0IHsKLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5EZWZhdWx0RG9jdW1lbnRUZXN0I2dldERvY3VtZW50KERvY3VtZW50VGVzdFNldCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoRG9jdW1lbnRUZXN0U2V0IHNldCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZ2V0UHVibGljYXRpb24oInRlc3QiKTsKLSAgICAgICAgcmV0dXJuIGdldEZhY3RvcnkoKS5nZXRGcm9tVVJMKCIvIiArIHB1Yi5nZXRJZCgpICsgIi8iICsgc2V0LmdldEFyZWEoKSArIHNldC5nZXRVcmwoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRGVmYXVsdERvY3VtZW50VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9EZWZhdWx0RG9jdW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMDI1YTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9EZWZhdWx0RG9jdW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLQotLyoqCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RG9jdW1lbnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvY3VtZW50VGVzdFNldFtdIHRlc3RTZXRzID0gewotICAgICAgICAgICAgbmV3IERvY3VtZW50VGVzdFNldCgiL2luZGV4Lmh0bWwiLCAiL2luZGV4IiwgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsICJlbiIsICJodG1sIiksCi0gICAgICAgICAgICBuZXcgRG9jdW1lbnRUZXN0U2V0KCIvaW5kZXhfZGUuaHRtbCIsICIvaW5kZXgiLCBQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSwgImRlIiwKLSAgICAgICAgICAgICAgICAgICAgImh0bWwiKSB9OwotCi0gICAgLyoqCi0gICAgICogVGVzdHMgYSBkb2N1bWVudCB0ZXN0IHNldC4KLSAgICAgKiBAcGFyYW0gdGVzdFNldCBUaGUgdGVzdCBzZXQuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRG9jdW1lbnRUZXN0KERvY3VtZW50VGVzdFNldCB0ZXN0U2V0KSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KHRlc3RTZXQpOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJVVUlEOiAgICAgICAgICIgKyBkb2N1bWVudC5nZXRVVUlEKCkpOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJBcmVhOiAgICAgICAgICIgKyBkb2N1bWVudC5nZXRBcmVhKCkpOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJMYW5ndWFnZTogICAgICIgKyBkb2N1bWVudC5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiRG9jdW1lbnQgVVJMOiAiICsgZG9jdW1lbnQuZ2V0Q2Fub25pY2FsRG9jdW1lbnRVUkwoKSk7Ci0gICAgICAgIGdldExvZ2dlcigpLmluZm8oIkNvbXBsZXRlIFVSTDogIiArIGRvY3VtZW50LmdldENhbm9uaWNhbFdlYmFwcFVSTCgpKTsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiRXh0ZW5zaW9uOiAgICAiICsgZG9jdW1lbnQuZ2V0RXh0ZW5zaW9uKCkpOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gZ2V0UHVibGljYXRpb24oInRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRvY3VtZW50LmdldFB1YmxpY2F0aW9uKCksIHB1YmxpY2F0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRvY3VtZW50LmdldFBhdGgoKSwgdGVzdFNldC5nZXRQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZG9jdW1lbnQuZ2V0QXJlYSgpLCB0ZXN0U2V0LmdldEFyZWEoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkb2N1bWVudC5nZXRMYW5ndWFnZSgpLCB0ZXN0U2V0LmdldExhbmd1YWdlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZG9jdW1lbnQuZ2V0Q2Fub25pY2FsRG9jdW1lbnRVUkwoKSwgdGVzdFNldC5nZXRVcmwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkb2N1bWVudC5nZXRDYW5vbmljYWxXZWJhcHBVUkwoKSwgIi8iICsgcHVibGljYXRpb24uZ2V0SWQoKSArICIvIgotICAgICAgICAgICAgICAgICsgZG9jdW1lbnQuZ2V0QXJlYSgpICsgdGVzdFNldC5nZXRVcmwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkb2N1bWVudC5nZXRFeHRlbnNpb24oKSwgdGVzdFNldC5nZXRFeHRlbnNpb24oKSk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgZGVmYXVsdCBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREb2N1bWVudCgpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFNldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGRvRG9jdW1lbnRUZXN0KHRlc3RTZXRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRlc3QgZG9jdW1lbnQgZm9yIGEgZ2l2ZW4gdGVzdCBzZXQuCi0gICAgICogQHBhcmFtIHRlc3RTZXQgQSBkb2N1bWVudCB0ZXN0IHNldC4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBnZXREb2N1bWVudChEb2N1bWVudFRlc3RTZXQgdGVzdFNldCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbigidGVzdCIpOwotICAgICAgICBTdHJpbmcgdXVpZCA9IHB1Yi5nZXRBcmVhKHRlc3RTZXQuZ2V0QXJlYSgpKS5nZXRTaXRlKCkuZ2V0Tm9kZSh0ZXN0U2V0LmdldFBhdGgoKSkuZ2V0VXVpZCgpOwotICAgICAgICBEb2N1bWVudElkZW50aWZpZXIgaWQgPSBuZXcgRG9jdW1lbnRJZGVudGlmaWVyKHB1Yi5nZXRJZCgpLCB0ZXN0U2V0LmdldEFyZWEoKSwgdXVpZCwgdGVzdFNldAotICAgICAgICAgICAgICAgIC5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbmV3IERvY3VtZW50SW1wbChnZXRNYW5hZ2VyKCksIGdldEZhY3RvcnkoKSwgaWQsIC0xLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGRvY3VtZW50LnNldEV4dGVuc2lvbih0ZXN0U2V0LmdldEV4dGVuc2lvbigpKTsKLQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBjbGFzcyB0byBzdG9yZSB0ZXN0IGRhdGEgZm9yIGEgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBEb2N1bWVudFRlc3RTZXQgewotICAgICAgICBwcml2YXRlIFN0cmluZyB1cmw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXJlYTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGFuZ3VhZ2U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEN0b3IuCi0gICAgICAgICAqIEBwYXJhbSBfdXJsIFRoZSB1cmwuCi0gICAgICAgICAqIEBwYXJhbSBfcGF0aCBUaGUgcGF0aC4KLSAgICAgICAgICogQHBhcmFtIF9hcmVhIFRoZSBhcmVhLgotICAgICAgICAgKiBAcGFyYW0gX2xhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgICAgICogQHBhcmFtIF9leHRlbnNpb24gVGhlIGV4dGVuc2lvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEb2N1bWVudFRlc3RTZXQoU3RyaW5nIF91cmwsIFN0cmluZyBfcGF0aCwgU3RyaW5nIF9hcmVhLCBTdHJpbmcgX2xhbmd1YWdlLAotICAgICAgICAgICAgICAgIFN0cmluZyBfZXh0ZW5zaW9uKSB7Ci0gICAgICAgICAgICB0aGlzLnVybCA9IF91cmw7Ci0gICAgICAgICAgICB0aGlzLnBhdGggPSBfcGF0aDsKLSAgICAgICAgICAgIHRoaXMuYXJlYSA9IF9hcmVhOwotICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IF9sYW5ndWFnZTsKLSAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gX2V4dGVuc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBhcmVhLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBcmVhKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJlYTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBwYXRoLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBsYW5ndWFnZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBVUkwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnVybDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRGYWN0b3J5VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjODI3NWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBEb2N1bWVudCBmYWN0b3J5IHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEZhY3RvcnlUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgbWV0YSBkYXRhLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERvY3VtZW50RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKGdldE1hbmFnZXIoKSwgZ2V0UmVxdWVzdCgpKTsKLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnlBID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeShnZXRNYW5hZ2VyKCksIHNlc3Npb24pOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gZ2V0UHVibGljYXRpb24oInRlc3QiKTsKLSAgICAgICAgCi0gICAgICAgIERvY3VtZW50IGRvY0ExID0gZmFjdG9yeUEuZ2V0KHB1YmxpY2F0aW9uLCBQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSwgIi9pbmRleCIsICJlbiIpOwotICAgICAgICBEb2N1bWVudCBkb2NBMiA9IGZhY3RvcnlBLmdldChwdWJsaWNhdGlvbiwgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsICIvaW5kZXgiLCAiZW4iKTsKLSAgICAgICAgYXNzZXJ0U2FtZShkb2NBMSwgZG9jQTIpOwotICAgICAgICAKLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnlCID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeShnZXRNYW5hZ2VyKCksIHNlc3Npb24pOwotCi0gICAgICAgIERvY3VtZW50IGRvY0IxID0gZmFjdG9yeUIuZ2V0KHB1YmxpY2F0aW9uLCBQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSwgIi9pbmRleCIsICJlbiIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0U2FtZShkb2NBMSwgZG9jQjEpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudExvY2F0b3JUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50TG9jYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4ZDUzNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50TG9jYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRMb2NhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REb2N1bWVudExvY2F0b3IoKSB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcHViSWQgPSAicHViIjsKLSAgICAgICAgU3RyaW5nIGFyZWEgPSAiYXJlYSI7Ci0gICAgICAgIFN0cmluZyBhcmVhMiA9ICJhcmVhMiI7Ci0gICAgICAgIFN0cmluZyBsYW5ndWFnZURlID0gImRlIjsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlRW4gPSAiZW4iOwotICAgICAgICAKLSAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHJvb3QgPSBEb2N1bWVudExvY2F0b3IuZ2V0TG9jYXRvcihwdWJJZCwgYXJlYSwgIiIsIGxhbmd1YWdlRGUpOwotICAgICAgICBEb2N1bWVudExvY2F0b3IgZm9vID0gRG9jdW1lbnRMb2NhdG9yLmdldExvY2F0b3IocHViSWQsIGFyZWEsICIvZm9vIiwgbGFuZ3VhZ2VEZSk7Ci0gICAgICAgIERvY3VtZW50TG9jYXRvciBmb29CYXIgPSBEb2N1bWVudExvY2F0b3IuZ2V0TG9jYXRvcihwdWJJZCwgYXJlYSwgIi9mb28vYmFyIiwgbGFuZ3VhZ2VEZSk7Ci0gICAgICAgIERvY3VtZW50TG9jYXRvciBmb29CYXJCYXogPSBEb2N1bWVudExvY2F0b3IuZ2V0TG9jYXRvcihwdWJJZCwgYXJlYSwgIi9mb28vYmFyL2JheiIsIGxhbmd1YWdlRGUpOwotCi0gICAgICAgIERvY3VtZW50TG9jYXRvciBmb29FbiA9IERvY3VtZW50TG9jYXRvci5nZXRMb2NhdG9yKHB1YklkLCBhcmVhLCAiL2ZvbyIsIGxhbmd1YWdlRW4pOwotICAgICAgICBEb2N1bWVudExvY2F0b3IgZm9vMiA9IERvY3VtZW50TG9jYXRvci5nZXRMb2NhdG9yKHB1YklkLCBhcmVhMiwgIi9mb28iLCBsYW5ndWFnZURlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZm9vLmdldFBhcmVudCgpLCByb290KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZvb0Jhci5nZXRQYXJlbnQoKSwgZm9vKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZvb0JhckJhei5nZXRQYXJlbnQoKSwgZm9vQmFyKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhyb290LmdldERlc2NlbmRhbnQoImZvbyIpLCBmb28pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZm9vLmdldERlc2NlbmRhbnQoImJhci9iYXoiKSwgZm9vQmFyQmF6KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhmb28uZ2V0Q2hpbGQoImJhciIpLCBmb29CYXIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZvby5nZXRMYW5ndWFnZVZlcnNpb24obGFuZ3VhZ2VFbiksIGZvb0VuKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhmb28uZ2V0QXJlYVZlcnNpb24oYXJlYTIpLCBmb28yKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudE1hbmFnZXJUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50TWFuYWdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0YTlkMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50TWFuYWdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLk5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogRG9jdW1lbnQgbWFuYWdlciB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRNYW5hZ2VyVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgLyoqCi0gICAgICogRG8gdGhlIHRlc3QuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jdW1lbnRNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2NNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY01hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIGRvVGVzdE1vdmVBbGwoZG9jTWFuYWdlciwgIi9kb2N0eXBlcyIsICIvdHV0b3JpYWwvZG9jdHlwZXMiKTsKLSAgICAgICAgICAgIGRvVGVzdE1vdmVBbGwoZG9jTWFuYWdlciwgIi90dXRvcmlhbC9kb2N0eXBlcyIsICIvZG9jdHlwZXMiKTsKLSAgICAgICAgICAgIGRvVGVzdENvcHlBbGwoZG9jTWFuYWdlciwgIi9kb2N0eXBlcyIsICIvdHV0b3JpYWwvZG9jdHlwZXMiKTsKLQotICAgICAgICAgICAgU3RyaW5nIGFyZWFOYW1lMSA9ICJhdXRob3JpbmciOwotICAgICAgICAgICAgU3RyaW5nIGFyZWFOYW1lMiA9ICJsaXZlIjsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoMSA9ICIvdHV0b3JpYWwiOwotICAgICAgICAgICAgU3RyaW5nIHBhdGgyID0gIi9kb2N0eXBlcyI7Ci0KLSAgICAgICAgICAgIGRvVGVzdENvcHlUb0FyZWEoZG9jTWFuYWdlciwgYXJlYU5hbWUxLCBhcmVhTmFtZTIsIHBhdGgxLCBwYXRoMik7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkb2NNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShkb2NNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVzdENvcHlUb0FyZWEoRG9jdW1lbnRNYW5hZ2VyIGRvY01hbmFnZXIsIFN0cmluZyBzb3VyY2VBcmVhTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBkZXN0QXJlYU5hbWUsIFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBmYWN0b3J5LmdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgc291cmNlQXJlYSA9IHB1Yi5nZXRBcmVhKHNvdXJjZUFyZWFOYW1lKS5nZXRTaXRlKCk7Ci0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgZGVzdEFyZWEgPSBwdWIuZ2V0QXJlYShkZXN0QXJlYU5hbWUpLmdldFNpdGUoKTsKLQotICAgICAgICBpZiAoZGVzdEFyZWEuY29udGFpbnMocGF0aDEpKSB7Ci0gICAgICAgICAgICBkZXN0QXJlYS5nZXROb2RlKHBhdGgxKS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVzdEFyZWEuY29udGFpbnMocGF0aDIpKSB7Ci0gICAgICAgICAgICBkZXN0QXJlYS5nZXROb2RlKHBhdGgyKS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoZGVzdEFyZWEuY29udGFpbnMocGF0aDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZGVzdEFyZWEuY29udGFpbnMocGF0aDIpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNvcHkgc2Vjb25kIG5vZGUgZmlyc3QgdG8gdGVzdCBjb3JyZWN0IG9yZGVyaW5nCi0gICAgICAgIGRvVGVzdENvcHlUb0FyZWEoZG9jTWFuYWdlciwgcGF0aDIsIHNvdXJjZUFyZWFOYW1lLCBkZXN0QXJlYU5hbWUpOwotICAgICAgICBkb1Rlc3RDb3B5VG9BcmVhKGRvY01hbmFnZXIsIHBhdGgxLCBzb3VyY2VBcmVhTmFtZSwgZGVzdEFyZWFOYW1lKTsKLQotICAgICAgICBMaXN0IHNvdXJjZU5vZGVzID0gQXJyYXlzLmFzTGlzdChzb3VyY2VBcmVhLmdldE5vZGVzKCkpOwotCi0gICAgICAgIFNpdGVOb2RlIGF1dGhvcmluZ05vZGUxID0gc291cmNlQXJlYS5nZXROb2RlKHBhdGgxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2VOb2Rlcy5jb250YWlucyhhdXRob3JpbmdOb2RlMSkpOwotICAgICAgICBpbnQgc291cmNlUG9zMSA9IHNvdXJjZU5vZGVzLmluZGV4T2YoYXV0aG9yaW5nTm9kZTEpOwotCi0gICAgICAgIFNpdGVOb2RlIHNvdXJjZU5vZGUyID0gc291cmNlQXJlYS5nZXROb2RlKHBhdGgyKTsKLSAgICAgICAgaW50IHNvdXJjZVBvczIgPSBzb3VyY2VOb2Rlcy5pbmRleE9mKHNvdXJjZU5vZGUyKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZVBvczEgPCBzb3VyY2VQb3MyKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGRlc3RBcmVhLmNvbnRhaW5zKHBhdGgxKSk7Ci0gICAgICAgIExpc3QgbGl2ZU5vZGVzID0gQXJyYXlzLmFzTGlzdChkZXN0QXJlYS5nZXROb2RlcygpKTsKLSAgICAgICAgU2l0ZU5vZGUgbGl2ZU5vZGUxID0gZGVzdEFyZWEuZ2V0Tm9kZShwYXRoMSk7Ci0gICAgICAgIGFzc2VydFRydWUobGl2ZU5vZGVzLmNvbnRhaW5zKGxpdmVOb2RlMSkpOwotICAgICAgICBpbnQgbGl2ZVBvczEgPSBsaXZlTm9kZXMuaW5kZXhPZihsaXZlTm9kZTEpOwotCi0gICAgICAgIFNpdGVOb2RlIGxpdmVOb2RlMiA9IGRlc3RBcmVhLmdldE5vZGUocGF0aDIpOwotICAgICAgICBpbnQgbGl2ZVBvczIgPSBsaXZlTm9kZXMuaW5kZXhPZihsaXZlTm9kZTIpOwotCi0gICAgICAgIGFzc2VydFRydWUobGl2ZVBvczEgPCBsaXZlUG9zMik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZXN0Q29weVRvQXJlYShEb2N1bWVudE1hbmFnZXIgZG9jTWFuYWdlciwgU3RyaW5nIHBhdGgsIFN0cmluZyBhcmVhTmFtZTEsCi0gICAgICAgICAgICBTdHJpbmcgYXJlYU5hbWUyKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbigidGVzdCIpOwotICAgICAgICBBcmVhIGFyZWExID0gcHViLmdldEFyZWEoYXJlYU5hbWUxKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gYXJlYTEuZ2V0U2l0ZSgpLmdldE5vZGUocGF0aCkuZ2V0TGluaygiZW4iKS5nZXREb2N1bWVudCgpOwotICAgICAgICBkb2NNYW5hZ2VyLmNvcHlUb0FyZWEoZG9jLCBhcmVhTmFtZTIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVzdENvcHlBbGwoRG9jdW1lbnRNYW5hZ2VyIGRvY01hbmFnZXIsIFN0cmluZyBzb3VyY2VQYXRoLCBTdHJpbmcgdGFyZ2V0UGF0aCkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiwgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbigidGVzdCIpOwotICAgICAgICBBcmVhIGF1dGhvcmluZyA9IHB1Yi5nZXRBcmVhKCJhdXRob3JpbmciKTsKLQotICAgICAgICBTaXRlTm9kZSBzb3VyY2VOb2RlID0gYXV0aG9yaW5nLmdldFNpdGUoKS5nZXROb2RlKHNvdXJjZVBhdGgpOwotICAgICAgICAKLSAgICAgICAgTm9kZVNldCBub2RlcyA9IFNpdGVVdGlsLmdldFN1YlNpdGUoZ2V0TWFuYWdlcigpLCBzb3VyY2VOb2RlKTsKLSAgICAgICAgRG9jdW1lbnRbXSBkb2NzID0gbm9kZXMuZ2V0RG9jdW1lbnRzKCk7Ci0gICAgICAgIE1hcCBkb2MycGF0aCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUJhc2UgPSBzb3VyY2VQYXRoLnN1YnN0cmluZygwLCBzb3VyY2VQYXRoLmxhc3RJbmRleE9mKCIvIikpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0QmFzZSA9IHRhcmdldFBhdGguc3Vic3RyaW5nKDAsIHRhcmdldFBhdGgubGFzdEluZGV4T2YoIi8iKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBkb2MycGF0aC5wdXQoZG9jc1tpXSwgZG9jc1tpXS5nZXRQYXRoKCkuc3Vic3RyaW5nKHNvdXJjZUJhc2UubGVuZ3RoKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvY01hbmFnZXIuY29weUFsbChhdXRob3JpbmcsIHNvdXJjZVBhdGgsIGF1dGhvcmluZywgdGFyZ2V0UGF0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkb2NzW2ldLmhhc0xpbmsoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb2xkUGF0aCA9IChTdHJpbmcpIGRvYzJwYXRoLmdldChkb2NzW2ldKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdQYXRoID0gdGFyZ2V0QmFzZSArIG9sZFBhdGg7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGF1dGhvcmluZy5nZXRTaXRlKCkuY29udGFpbnMobmV3UGF0aCkpOwotICAgICAgICAgICAgU2l0ZU5vZGUgbmV3Tm9kZSA9IGF1dGhvcmluZy5nZXRTaXRlKCkuZ2V0Tm9kZShuZXdQYXRoKTsKLSAgICAgICAgICAgIERvY3VtZW50IG5ld0RvYyA9IG5ld05vZGUuZ2V0TGluayhkb2NzW2ldLmdldExhbmd1YWdlKCkpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RG9jLmdldENvbnRlbnRMZW5ndGgoKSwgZG9jc1tpXS5nZXRDb250ZW50TGVuZ3RoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobmV3RG9jLmdldFVVSUQoKS5lcXVhbHMoZG9jc1tpXS5nZXRVVUlEKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc291cmNlTmFtZXMgPSBnZXRDaGlsZE5hbWVzKHNvdXJjZU5vZGUpOwotICAgICAgICBTaXRlTm9kZSB0YXJnZXROb2RlID0gYXV0aG9yaW5nLmdldFNpdGUoKS5nZXROb2RlKHRhcmdldFBhdGgpOwotICAgICAgICBTdHJpbmdbXSB0YXJnZXROYW1lcyA9IGdldENoaWxkTmFtZXModGFyZ2V0Tm9kZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmdVdGlsLmpvaW4oc291cmNlTmFtZXMsICIsIiksIFN0cmluZ1V0aWwuam9pbih0YXJnZXROYW1lcywgIiwiKSk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENoaWxkTmFtZXMoU2l0ZU5vZGUgbm9kZSkgewotCQlTaXRlTm9kZVtdIHNvdXJjZUNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZHJlbigpOwotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbc291cmNlQ2hpbGRyZW4ubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAJbmFtZXNbaV0gPSBzb3VyY2VDaGlsZHJlbltpXS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVzdE1vdmVBbGwoRG9jdW1lbnRNYW5hZ2VyIGRvY01hbmFnZXIsIFN0cmluZyBzb3VyY2VQYXRoLCBTdHJpbmcgdGFyZ2V0UGF0aCkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiwgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbigidGVzdCIpOwotICAgICAgICBBcmVhIGF1dGhvcmluZyA9IHB1Yi5nZXRBcmVhKCJhdXRob3JpbmciKTsKLQotICAgICAgICBTaXRlTm9kZSBzb3VyY2VOb2RlID0gYXV0aG9yaW5nLmdldFNpdGUoKS5nZXROb2RlKHNvdXJjZVBhdGgpOwotICAgICAgICBTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IGdldENoaWxkTmFtZXMoc291cmNlTm9kZSk7Ci0KLSAgICAgICAgTm9kZVNldCBub2RlcyA9IFNpdGVVdGlsLmdldFN1YlNpdGUoZ2V0TWFuYWdlcigpLCBzb3VyY2VOb2RlKTsKLSAgICAgICAgRG9jdW1lbnRbXSBkb2NzID0gbm9kZXMuZ2V0RG9jdW1lbnRzKCk7Ci0gICAgICAgIE1hcCBkb2MycGF0aCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUJhc2UgPSBzb3VyY2VQYXRoLnN1YnN0cmluZygwLCBzb3VyY2VQYXRoLmxhc3RJbmRleE9mKCIvIikpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0QmFzZSA9IHRhcmdldFBhdGguc3Vic3RyaW5nKDAsIHRhcmdldFBhdGgubGFzdEluZGV4T2YoIi8iKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBkb2MycGF0aC5wdXQoZG9jc1tpXSwgZG9jc1tpXS5nZXRQYXRoKCkuc3Vic3RyaW5nKHNvdXJjZUJhc2UubGVuZ3RoKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvY01hbmFnZXIubW92ZUFsbChhdXRob3JpbmcsIHNvdXJjZVBhdGgsIGF1dGhvcmluZywgdGFyZ2V0UGF0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkb2NzW2ldLmhhc0xpbmsoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb2xkUGF0aCA9IChTdHJpbmcpIGRvYzJwYXRoLmdldChkb2NzW2ldKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdQYXRoID0gZG9jc1tpXS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGFyZ2V0QmFzZSArIG9sZFBhdGgsIG5ld1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTaXRlTm9kZSB0YXJnZXROb2RlID0gYXV0aG9yaW5nLmdldFNpdGUoKS5nZXROb2RlKHRhcmdldFBhdGgpOwotICAgICAgICBTdHJpbmdbXSB0YXJnZXROYW1lcyA9IGdldENoaWxkTmFtZXModGFyZ2V0Tm9kZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmdVdGlsLmpvaW4oc291cmNlTmFtZXMsICIsIiksIFN0cmluZ1V0aWwuam9pbih0YXJnZXROYW1lcywgIiwiKSk7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRHVibGluQ29yZVRlc3QuamF2YSBiL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRHVibGluQ29yZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlMTIwOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0R1YmxpbkNvcmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5kdWJsaW5jb3JlLkR1YmxpbkNvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0vKioKLSAqIER1YmxpbiBDb3JlIHRlc3QuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIER1YmxpbkNvcmVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJFQSA9ICJhdXRob3JpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gIi90dXRvcmlhbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdVQUdFID0gImRlIjsKLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGZldGNoaW5nLCBtb2RpZmljYXRpb24gYW5kIHJlZmV0Y2hpbmcgb2YgYSBkYyBjb3JlIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIAotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIAotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2F2ZUFuZFJlbG9hZCgpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiwgTWV0YURhdGFFeGNlcHRpb24sCi0gICAgICAgICAgICBBY2Nlc3NDb250cm9sRXhjZXB0aW9uLCBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIGxvZ2luKCJsZW55YSIpOwotICAgICAgICAKLSAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBnZXRQdWJsaWNhdGlvbigidGVzdCIpOwotICAgICAgICAKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gcHVibGljYXRpb24uZ2V0QXJlYShBUkVBKS5nZXRTaXRlKCkuZ2V0Tm9kZShQQVRIKS5nZXRMaW5rKExBTkdVQUdFKS5nZXREb2N1bWVudCgpOwotICAgICAgICAKLSAgICAgICAgZG9jLmdldFJlcG9zaXRvcnlOb2RlKCkubG9jaygpOwotICAgICAgICAKLSAgICAgICAgTWV0YURhdGEgZGNDb3JlID0gZG9jLmdldE1ldGFEYXRhKER1YmxpbkNvcmUuRENfTkFNRVNQQUNFKTsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gZGNDb3JlLmdldEZpcnN0VmFsdWUoRHVibGluQ29yZS5FTEVNRU5UX1RJVExFKTsKLSAgICAgICAgU3RyaW5nIHN1YmplY3QgPSBkY0NvcmUuZ2V0Rmlyc3RWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfU1VCSkVDVCk7Ci0gICAgICAgIFN0cmluZyBjcmVhdG9yID0gZGNDb3JlLmdldEZpcnN0VmFsdWUoRHVibGluQ29yZS5FTEVNRU5UX0NSRUFUT1IpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgY3JlYXRvciA9ICJ0ZXN0IjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuZXdDcmVhdG9yID0gY3JlYXRvciArICItdGVzdCI7Ci0gICAgICAgIGRjQ29yZS5zZXRWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfQ1JFQVRPUiwgbmV3Q3JlYXRvcik7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jMiA9IHB1YmxpY2F0aW9uLmdldEFyZWEoQVJFQSkuZ2V0U2l0ZSgpLmdldE5vZGUoUEFUSCkuZ2V0TGluayhMQU5HVUFHRSkuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgICBNZXRhRGF0YSBkY0NvcmUyID0gZG9jMi5nZXRNZXRhRGF0YShEdWJsaW5Db3JlLkRDX05BTUVTUEFDRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0aXRsZSwgZGNDb3JlMi5nZXRGaXJzdFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9USVRMRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3ViamVjdCwgZGNDb3JlMi5nZXRGaXJzdFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9TVUJKRUNUKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNyZWF0b3IuZXF1YWxzKGRjQ29yZTIuZ2V0Rmlyc3RWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfQ1JFQVRPUikpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0NyZWF0b3IsIGRjQ29yZTIuZ2V0Rmlyc3RWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfQ1JFQVRPUikpOwotICAgICAgICAKLSAgICAgICAgZG9jLmdldFJlcG9zaXRvcnlOb2RlKCkudW5sb2NrKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QdWJsaWNhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4YTI4ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotCi0vKioKLSAqIFB1YmxpY2F0aW9uIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaWNhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBwdWJsaWNhdGlvbiBmdW5jdGlvbmFsaXR5LgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUHVibGljYXRpb25NYW5hZ2VyIHB1Yk1nciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWJNZ3IgPSAoUHVibGljYXRpb25NYW5hZ2VyKSBnZXRNYW5hZ2VyKCkubG9va3VwKFB1YmxpY2F0aW9uTWFuYWdlci5ST0xFKTsKLQotICAgICAgICAgICAgUHVibGljYXRpb25bXSBwdWJzID0gcHViTWdyLmdldFB1YmxpY2F0aW9ucyhnZXRGYWN0b3J5KCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZG9UZXN0UHVibGljYXRpb24ocHVic1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwdWJNZ3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKHB1Yk1ncik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvVGVzdFB1YmxpY2F0aW9uKFB1YmxpY2F0aW9uIHB1YikgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnREaXJQYXRoID0gcHViLmdldENvbnRlbnREaXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50RGlyUGF0aCk7Ci0KLSAgICAgICAgRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoY29udGVudERpclBhdGgpOwotCi0gICAgICAgIGFzc2VydFRydWUocHViLmV4aXN0cygpKTsKLQotICAgICAgICBTdHJpbmdbXSBhcmVhTmFtZXMgPSBwdWIuZ2V0QXJlYU5hbWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJlYU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBBcmVhIGFyZWEgPSBwdWIuZ2V0QXJlYShhcmVhTmFtZXNbaV0pOwotICAgICAgICAgICAgaWYgKGFyZWEuZ2V0RG9jdW1lbnRzKCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIEZpbGUgYXJlYUNvbnRlbnREaXIgPSBwdWIuZ2V0Q29udGVudERpcmVjdG9yeShhcmVhTmFtZXNbaV0pOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYXJlYUNvbnRlbnREaXIuaXNEaXJlY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGNvbnRlbnREaXIsIGFyZWFOYW1lc1tpXSksIGFyZWFDb250ZW50RGlyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IHB1Yi5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsYW5ndWFnZXMubGVuZ3RoID4gMCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwdWIuZ2V0RGVmYXVsdExhbmd1YWdlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5hc0xpc3QobGFuZ3VhZ2VzKS5jb250YWlucyhwdWIuZ2V0RGVmYXVsdExhbmd1YWdlKCkpKTsKLQotICAgICAgICBTdHJpbmdbXSB0eXBlcyA9IHB1Yi5nZXRSZXNvdXJjZVR5cGVOYW1lcygpOwotICAgICAgICBhc3NlcnRUcnVlKHR5cGVzLmxlbmd0aCA+IDApOwotCi0gICAgICAgIFNldCB0eXBlU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCh0eXBlcykpOwotCi0gICAgICAgIFN0cmluZ1tdIHRlbXBsYXRlSWRzID0gcHViLmdldFRlbXBsYXRlSWRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGVJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHRlbXBsYXRlID0gcHViLmdldEZhY3RvcnkoKS5nZXRQdWJsaWNhdGlvbih0ZW1wbGF0ZUlkc1tpXSk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB0ZW1wbGF0ZVR5cGVzID0gdGVtcGxhdGUuZ2V0UmVzb3VyY2VUeXBlTmFtZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgdGVtcGxhdGVUeXBlcy5sZW5ndGg7IHQrKykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUodHlwZVNldC5jb250YWlucyh0ZW1wbGF0ZVR5cGVzW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9UZXN0UGFnZUVudmVsb3BlLmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1Rlc3RQYWdlRW52ZWxvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmZDlkNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1Rlc3RQYWdlRW52ZWxvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RQYWdlRW52ZWxvcGUgZXh0ZW5kcyBQYWdlRW52ZWxvcGUgewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSB0ZXN0IHBhZ2UgZW52ZWxvcGUuCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBkb2N1bWVudCB1cmwgKHN0YXJ0aW5nIHdpdGggYSBzbGFzaCkuCi0gICAgICogQHRocm93cyBQYWdlRW52ZWxvcGVFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdFBhZ2VFbnZlbG9wZShQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIHVybCwgU2VydmljZU1hbmFnZXIgbWFuYWdlciwKLSAgICAgICAgICAgIExvZ2dlciBsb2dnZXIpIHRocm93cyBQYWdlRW52ZWxvcGVFeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRDb250ZXh0KCIiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuY3JlYXRlU2Vzc2lvbihtYW5hZ2VyLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeShtYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgICAgIHNldERvY3VtZW50KG1hcC5nZXRGcm9tVVJMKHVybCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL2ZpbGUvRmlsZVB1YmxpY2F0aW9uVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9maWxlL0ZpbGVQdWJsaWNhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZGRlZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL2ZpbGUvRmlsZVB1YmxpY2F0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLmZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlUHVibGljYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5zb3VyY2VEb2N1bWVudElkPC9jb2RlPiBUaGUgc291cmNlIGRvY3VtZW50IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc291cmNlRG9jdW1lbnRJZCA9ICIvdHV0b3JpYWwiOwotICAgIC8qKgotICAgICAqIDxjb2RlPmRlc3RpbmF0aW9uRG9jdW1lbnRJZDwvY29kZT4gVGhlIGRlc3RpbmF0aW9uIGRvY3VtZW50IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVzdGluYXRpb25Eb2N1bWVudElkID0gIi9kb2N0eXBlcy9zaW1wbGUtZG9jdW1lbnQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPnNvdXJjZUxhbmd1YWdlPC9jb2RlPiBUaGUgc291cmNlIGxhbmd1YWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc291cmNlTGFuZ3VhZ2UgPSAiZW4iOwotICAgIC8qKgotICAgICAqIDxjb2RlPmRlc3RpbmF0aW9uTGFuZ3VhZ2U8L2NvZGU+IFRoZSBkZXN0aW5hdGlvbiBsYW5ndWFnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uTGFuZ3VhZ2UgPSAiZW4iOwotCi0gICAgLyoqCi0gICAgICogVGVzdHMgY29weWluZyBhIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvcHlEb2N1bWVudCgpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiwgRG9jdW1lbnRFeGNlcHRpb24sIFNpdGVFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q29weURvY3VtZW50KFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBLAotICAgICAgICAgICAgICAgIHNvdXJjZURvY3VtZW50SWQsCi0gICAgICAgICAgICAgICAgc291cmNlTGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsCi0gICAgICAgICAgICAgICAgZGVzdGluYXRpb25Eb2N1bWVudElkLAotICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uTGFuZ3VhZ2UpOwotICAgICAgICB0ZXN0Q29weURvY3VtZW50KFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBLAotICAgICAgICAgICAgICAgIHNvdXJjZURvY3VtZW50SWQsCi0gICAgICAgICAgICAgICAgc291cmNlTGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgUHVibGljYXRpb24uTElWRV9BUkVBLAotICAgICAgICAgICAgICAgIHNvdXJjZURvY3VtZW50SWQsCi0gICAgICAgICAgICAgICAgc291cmNlTGFuZ3VhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGNvcHlpbmcgYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gc291cmNlQXJlYSBUaGUgc291cmNlIGFyZWEuCi0gICAgICogQHBhcmFtIF9zb3VyY2VEb2N1bWVudElkIFRoZSBzb3VyY2UgZG9jdW1lbnQgSUQuCi0gICAgICogQHBhcmFtIF9zb3VyY2VMYW5ndWFnZSBUaGUgc291cmNlIGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkFyZWEgVGhlIGRlc3RpbmF0aW9uIGFyZWEuCi0gICAgICogQHBhcmFtIF9kZXN0aW5hdGlvbkRvY3VtZW50SWQgVGhlIGRlc3RpbmF0aW9uIGRvY3VtZW50IElELgotICAgICAqIEBwYXJhbSBfZGVzdGluYXRpb25MYW5ndWFnZSBUaGUgZGVzdGluYXRpb24gbGFuZ3VhZ2UuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weURvY3VtZW50KFN0cmluZyBzb3VyY2VBcmVhLCBTdHJpbmcgX3NvdXJjZURvY3VtZW50SWQsCi0gICAgICAgICAgICBTdHJpbmcgX3NvdXJjZUxhbmd1YWdlLCBTdHJpbmcgZGVzdGluYXRpb25BcmVhLCBTdHJpbmcgX2Rlc3RpbmF0aW9uRG9jdW1lbnRJZCwKLSAgICAgICAgICAgIFN0cmluZyBfZGVzdGluYXRpb25MYW5ndWFnZSkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNpdGVFeGNlcHRpb24gewotCi0gICAgICAgIGdldExvZ2dlcigpLmluZm8oIkNvcHkgZG9jdW1lbnQiKTsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiICAgIFNvdXJjZSBhcmVhOiAgICAgICAgICAgICBbIiArIHNvdXJjZUFyZWEgKyAiXSIpOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCIgICAgU291cmNlIGRvY3VtZW50IElEOiAgICAgIFsiICsgX3NvdXJjZURvY3VtZW50SWQgKyAiXSIpOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCIgICAgU291cmNlIGxhbmd1YWdlOiAgICAgICAgIFsiICsgX3NvdXJjZUxhbmd1YWdlICsgIl0iKTsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiICAgIERlc3RpbmF0aW9uIGFyZWE6ICAgICAgICBbIiArIGRlc3RpbmF0aW9uQXJlYSArICJdIik7Ci0gICAgICAgIGdldExvZ2dlcigpLmluZm8oIiAgICBEZXN0aW5hdGlvbiBkb2N1bWVudCBJRDogWyIgKyBfZGVzdGluYXRpb25Eb2N1bWVudElkICsgIl0iKTsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiICAgIERlc3RpbmF0aW9uIGxhbmd1YWdlOiAgICBbIiArIF9kZXN0aW5hdGlvbkxhbmd1YWdlICsgIl0iKTsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBnZXRGYWN0b3J5KCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgc291cmNlRG9jdW1lbnQgPSBtYXAuZ2V0KHB1YmxpY2F0aW9uLAotICAgICAgICAgICAgICAgIHNvdXJjZUFyZWEsCi0gICAgICAgICAgICAgICAgX3NvdXJjZURvY3VtZW50SWQsCi0gICAgICAgICAgICAgICAgX3NvdXJjZUxhbmd1YWdlKTsKLSAgICAgICAgRG9jdW1lbnQgZGVzdGluYXRpb25Eb2N1bWVudCA9IG1hcC5nZXQocHVibGljYXRpb24sCi0gICAgICAgICAgICAgICAgZGVzdGluYXRpb25BcmVhLAotICAgICAgICAgICAgICAgIF9kZXN0aW5hdGlvbkRvY3VtZW50SWQsCi0gICAgICAgICAgICAgICAgX2Rlc3RpbmF0aW9uTGFuZ3VhZ2UpOwotLyoKLSAgICAgICAgcHVibGljYXRpb24uY29weURvY3VtZW50KHNvdXJjZURvY3VtZW50LCBkZXN0aW5hdGlvbkRvY3VtZW50KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGRlc3RpbmF0aW9uRG9jdW1lbnQuZXhpc3RzKCkpOwotCi0gICAgICAgIFRyZWVTaXRlTWFuYWdlciBtYW5hZ2VyID0gKFRyZWVTaXRlTWFuYWdlcikgcHVibGljYXRpb24uZ2V0U2l0ZU1hbmFnZXIobWFwKTsKLSAgICAgICAgU2l0ZVRyZWUgZGVzdGluYXRpb25UcmVlID0gbWFuYWdlci5nZXRUcmVlKGRlc3RpbmF0aW9uQXJlYSk7Ci0gICAgICAgIFNpdGVUcmVlTm9kZSBkZXN0aW5hdGlvbk5vZGUgPSBkZXN0aW5hdGlvblRyZWUuZ2V0Tm9kZShfZGVzdGluYXRpb25Eb2N1bWVudElkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXN0aW5hdGlvbk5vZGUpOwotICAgICAgICBMYWJlbCBkZXN0aW5hdGlvbkxhYmVsID0gZGVzdGluYXRpb25Ob2RlLmdldExhYmVsKF9kZXN0aW5hdGlvbkxhbmd1YWdlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXN0aW5hdGlvbkxhYmVsKTsKLQotICAgICAgICBTaXRlVHJlZU5vZGUgc291cmNlTm9kZSA9IGRlc3RpbmF0aW9uVHJlZS5nZXROb2RlKF9zb3VyY2VEb2N1bWVudElkKTsKLSAgICAgICAgTGFiZWwgc291cmNlTGFiZWwgPSBzb3VyY2VOb2RlLmdldExhYmVsKF9zb3VyY2VMYW5ndWFnZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZXN0aW5hdGlvbkxhYmVsLmdldExhYmVsKCkuZXF1YWxzKHNvdXJjZUxhYmVsLmdldExhYmVsKCkpKTsKLSovCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvUkNNTFRlc3QuamF2YSBiL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvUkNNTFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5Njc0YS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3JjL1JDTUxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucmM7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci0KLS8qKgotICogUkNNTCBUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSQ01MVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0JLyoqCi0JICogPGNvZGU+Y288L2NvZGU+IENoZWNrb3V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBjbyA9IDA7Ci0JLyoqCi0JICogPGNvZGU+Y2k8L2NvZGU+IENoZWNraW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IGNpID0gMTsKLSAgICAKLQlwcml2YXRlIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSB0ZXN0IFRoZSB0ZXN0IHRvIGV4ZWN1dGUuCi0gICAgICovCi0gICAgcHVibGljIFJDTUxUZXN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UkNNTCgpIHsKLSAgICAgICAgU3RyaW5nW10gYXJncyA9IHsgIiIsICIiLCAiIiB9OwotICAgICAgICB0ZXN0UkNNTChhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UkNNTChTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgUkNNTCByY21sRGlyZWN0b3J5IGRhdGFmaWxlbmFtZSByb290RGlyZWN0b3J5Iik7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCBkb2MgPSBudWxsOwotCQkJZG9jLmdldFJlcG9zaXRvcnlOb2RlKCkuY2hlY2tvdXQoKTsKLQotCQkJKG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSkucHJpbnQodGhpcy5kb2N1bWVudCk7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iKTsKLQotCQkJaWYgKGRvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpLmlzQ2hlY2tlZE91dCgpKSB7Ci0JCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaGVja2VkIG91dCIpOwotCQkJfSBlbHNlIHsKLQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vdCBjaGVja2VkIG91dCIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JICAgIH0KLQotLyogICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzc1tdIGNsYXNzZXMgPSB7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0ZXN0IHN1aXRlLgotICAgICAqIEByZXR1cm4gYSB0ZXN0IHN1aXRlLgotICAgICAqLwotLyogICAgcHVibGljIHN0YXRpYyBUZXN0IGdldFN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoY2xhc3Nlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotKi8KLSAgICAvKiogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBpbml0aWFsaXNlIHRoZSBSQ01MLWRvY3VtZW50LiBEZWxldGUgYWxsIGVudHJpZXMKLQkJICovCi0gICAgICAgIHRoaXMuZG9jdW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVEb2N1bWVudChudWxsLCAiWFBTUmV2aXNpb25Db250cm9sIiwgbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yYy9SZXZpc2lvbkNvbnRyb2xsZXJUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3JjL1JldmlzaW9uQ29udHJvbGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhY2Q5ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3JjL1JldmlzaW9uQ29udHJvbGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZXZpc2lvbiBDb250cm9sbGVyIHRlc3QKLSAqLwotcHVibGljIGNsYXNzIFJldmlzaW9uQ29udHJvbGxlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgPGEKLSAgICAgKiAgICAgIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDEwMDUiPkJ1ZwotICAgICAqICAgICAgNDEwMDU8L2E+Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tJbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsb2dpbigibGVueWEiKTsKLQotICAgICAgICBEb2N1bWVudE1hbmFnZXIgZG9jTWdyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY01nciA9IChEb2N1bWVudE1hbmFnZXIpIGdldE1hbmFnZXIoKS5sb29rdXAoRG9jdW1lbnRNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgRG9jdW1lbnQgc291cmNlID0gZ2V0UHVibGljYXRpb24oInRlc3QiKS5nZXRBcmVhKCJhdXRob3JpbmciKS5nZXRTaXRlKCkuZ2V0Tm9kZSgKLSAgICAgICAgICAgICAgICAgICAgIi9saW5rcyIpLmdldExpbmsoImVuIikuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIERvY3VtZW50IHRhcmdldCA9IGRvY01nci5hZGRWZXJzaW9uKHNvdXJjZSwgImF1dGhvcmluZyIsICJlcyIpOwotICAgICAgICAgICAgdGFyZ2V0LmRlbGV0ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRvY01nciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UoZG9jTWdyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGdldEZhY3RvcnkoKS5nZXRTZXNzaW9uKCkuY29tbWl0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJldmlzaW9uQ29udHJvbGxlcigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uLCBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7ICIiLCAiIiwgIiIsICIiIH07Ci0KLSAgICAgICAgLy8gVGVzdFJ1bm5lci5ydW4oZ2V0U3VpdGUoKSk7Ci0KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDQpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIlVzYWdlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBSZXZpc2lvbkNvbnRyb2xsZXJUZXN0LmNsYXNzLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB1c2VybmFtZSh1c2VyIHdobyBjaGVja291dCkgc291cmNlKGZpbGVuYW1lIHdpdGhvdXQgdGhlIHJvb3REaXJlY3Rvcnkgb2YgdGhlIGRvY3VtZW50IHRvIGNoZWNrb3V0KSB1c2VybmFtZSh1c2VyIHdobyBjaGVja2luKSBkZXN0aW5hdGlvbihmaWxlbmFtZSB3aXRob3V0IHRoZSByb290RGlyZWN0b3J5IG9mIGRvY3VtZW50IHRvIGNoZWNraW4pIik7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50IGRvYzEgPSBudWxsOwotICAgICAgICBEb2N1bWVudCBkb2MyID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgaWRlbnRpdHlTID0gYXJnc1swXTsKLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9IGFyZ3NbMV07Ci0gICAgICAgIFN0cmluZyBpZGVudGl0eUQgPSBhcmdzWzJdOwotICAgICAgICBTdHJpbmcgZGVzdGluYXRpb24gPSBhcmdzWzNdOwotICAgICAgICAvL2RvYzEuZ2V0UmVwb3NpdG9yeU5vZGUoKS5jaGVja291dCgpOwotICAgICAgICAvL2RvYzIuZ2V0UmVwb3NpdG9yeU5vZGUoKS5jaGVja2luKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvU2ltcGxlU2l0ZU1hbmFnZXJUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvU2ltcGxlU2l0ZU1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTkzYzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpbXBsZVNpdGVNYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5zaW1wbGUuRG9jdW1lbnRTdG9yZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVNpdGVNYW5hZ2VyVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICIvZm9vL2JhciI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfUEFUSCA9ICIvZm9vIjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTaXRlTWFuYWdlcigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGxvZ2luKCJsZW55YSIpOwotCi0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeShnZXRNYW5hZ2VyKCksIHNlc3Npb24pOwotICAgICAgICBQdWJsaWNhdGlvbltdIHB1YnMgPSBmYWN0b3J5LmdldFB1YmxpY2F0aW9ucygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVicy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hlY2tQdWJsaWNhdGlvbihzZXNzaW9uLCBmYWN0b3J5LCBwdWJzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUHVibGljYXRpb24oU2Vzc2lvbiBzZXNzaW9uLCBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgUHVibGljYXRpb24gcHViKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24sIFNpdGVFeGNlcHRpb24sIERvY3VtZW50QnVpbGRFeGNlcHRpb24sIFB1YmxpY2F0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2NNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgU2l0ZU1hbmFnZXIgc2l0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3IgcmVzb3VyY2VUeXBlU2VsZWN0b3IgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIGdldE1hbmFnZXIoKS5sb29rdXAoU2l0ZU1hbmFnZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgc2l0ZU1hbmFnZXIgPSAoU2l0ZU1hbmFnZXIpIHNlbGVjdG9yLnNlbGVjdChwdWIuZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSBzaXRlTWFuYWdlci5nZXRTaXRlU3RydWN0dXJlKGZhY3RvcnksIHB1YiwKLSAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpOwotCi0gICAgICAgICAgICBkb2NNYW5hZ2VyID0gKERvY3VtZW50TWFuYWdlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIHJlc291cmNlVHlwZVNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgZ2V0TWFuYWdlcigpLmxvb2t1cCgKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIFJlc291cmNlVHlwZSB0eXBlID0gKFJlc291cmNlVHlwZSkgcmVzb3VyY2VUeXBlU2VsZWN0b3Iuc2VsZWN0KCJlbnRyeSIpOwotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRTb3VyY2VVcmkgPSAiY29udGV4dDovL3NpdGVtYXAueG1hcCI7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRvY01hbmFnZXIuYWRkKGZhY3RvcnksIHR5cGUsIGNvbnRlbnRTb3VyY2VVcmksIHB1YiwKLSAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsICJlbiIsICJ4bWwiKTsKLQotICAgICAgICAgICAgc3RydWN0dXJlLmFkZChQQVRILCBkb2MpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdHJ1Y3R1cmUuY29udGFpbnMoUEFUSCkpOwotICAgICAgICAgICAgRG9jdW1lbnQgbGlua0RvYyA9IHN0cnVjdHVyZS5nZXROb2RlKFBBVEgpLmdldExpbmsoImVuIikuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGFzc2VydFNhbWUobGlua0RvYywgZG9jKTsKLQotICAgICAgICAgICAgaWYgKCEoc3RydWN0dXJlIGluc3RhbmNlb2YgRG9jdW1lbnRTdG9yZSkpIHsKLSAgICAgICAgICAgICAgICBMaW5rIGxpbmsgPSBkb2MuZ2V0TGluaygpOwotICAgICAgICAgICAgICAgIGNoZWNrU2V0TGFiZWwobGluayk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNpdGVOb2RlW10gbm9kZXMgPSBzdHJ1Y3R1cmUuZ2V0Tm9kZXMoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobm9kZXMubGVuZ3RoID4gMCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc3RydWN0dXJlLmNvbnRhaW5zKG5vZGVzW2ldLmdldFBhdGgoKSkpOwotCi0gICAgICAgICAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IHN0cnVjdHVyZS5nZXROb2RlKG5vZGVzW2ldLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChub2RlKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobm9kZXNbaV0sIG5vZGUpOwotCi0gICAgICAgICAgICAgICAgY2hlY2tMaW5rcyhzaXRlTWFuYWdlciwgbm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRvYy5nZXRMaW5rKCkuZGVsZXRlKCk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzdHJ1Y3R1cmUuY29udGFpbnNCeVV1aWQoZG9jLmdldFVVSUQoKSwgZG9jLmdldExhbmd1YWdlKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHN0cnVjdHVyZS5jb250YWlucyhQQVRIKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzdHJ1Y3R1cmUuY29udGFpbnMoUEFSRU5UX1BBVEgpKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHNpdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRvY01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKGRvY01hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZVNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShyZXNvdXJjZVR5cGVTZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2Vzc2lvbi5jb21taXQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1NldExhYmVsKExpbmsgbGluaykgewotICAgICAgICBTdHJpbmcgbmV3TGFiZWwgPSAiTmV3IExhYmVsIjsKLSAgICAgICAgU3RyaW5nIG9sZExhYmVsID0gbGluay5nZXRMYWJlbCgpOwotICAgICAgICBhc3NlcnRGYWxzZShvbGRMYWJlbC5lcXVhbHMobmV3TGFiZWwpKTsKLSAgICAgICAgbGluay5zZXRMYWJlbChuZXdMYWJlbCk7Ci0gICAgICAgIGFzc2VydFRydWUobGluay5nZXRMYWJlbCgpLmVxdWFscyhuZXdMYWJlbCkpOwotICAgICAgICBsaW5rLnNldExhYmVsKG9sZExhYmVsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0xpbmtzKFNpdGVNYW5hZ2VyIHNpdGVNYW5hZ2VyLCBTaXRlTm9kZSBub2RlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IG5vZGUuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBMaW5rIGxpbmsgPSBub2RlLmdldExpbmsobGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhsaW5rLmdldExhbmd1YWdlKCksIGxhbmd1YWdlc1tpXSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGxpbmsuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChub2RlLmdldFV1aWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gbGluay5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZG9jKTsKLSAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgZG9jVXVpZCA9IGRvYy5nZXRVVUlEKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVVdWlkID0gbm9kZS5nZXRVdWlkKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkb2MuZ2V0VVVJRCgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZG9jVXVpZCwgbm9kZVV1aWQpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb2MuZ2V0TGFuZ3VhZ2UoKSwgbGluay5nZXRMYW5ndWFnZSgpKTsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBpdCBtYXkgbm90IGJlIGFsbG93ZWQgdG8gaW5zZXJ0IHRoZSBkb2MgdHdpY2UKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzaXRlTWFuYWdlci5hZGQoIi9zaWRlYmFyIiwgZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIHRocm93biIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9MaW5rUmV3cml0ZXJUZXN0LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvTGlua1Jld3JpdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ExNjhjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9MaW5rUmV3cml0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLlNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQVBJOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogTGluayByZXdyaXRlciB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgTGlua1Jld3JpdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfSUQgPSAiL2luZGV4IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRE9DVU1FTlRfSUQgPSAiL2NvbmNlcHRzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRE9DVU1FTlRfSUQgPSAiL2NvcGllZCI7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG1ldGhvZC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5rUmV3cml0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8qCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbihnZXRNYW5hZ2VyKCksICJ0ZXN0Iik7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRJZGVudGl0eU1hcCgpLmdldChwdWIsIFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBLCBET0NVTUVOVF9JRCwgImVuIik7Ci0gICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IHhtbCA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudChnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oImluZGV4X2VuLnhtbCIpKTsKLSAgICAgICAgZG9jdW1lbnQuZ2V0UmVwb3NpdG9yeU5vZGUoKS5sb2NrKCk7Ci0gICAgICAgIFNvdXJjZVV0aWwud3JpdGVET00oeG1sLCBkb2N1bWVudC5nZXRTb3VyY2VVUkkoKSwgZ2V0TWFuYWdlcigpKTsKLQotICAgICAgICBMaW5rUmV3cml0ZXIgcmV3cml0ZXIgPSBudWxsOwotICAgICAgICBEb2N1bWVudE1hbmFnZXIgZG9jTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIERvY3VtZW50IHRhcmdldCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2NNYW5hZ2VyID0gKERvY3VtZW50TWFuYWdlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IHNvdXJjZSA9IGdldElkZW50aXR5TWFwKCkuZ2V0KHB1YiwKLSAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsCi0gICAgICAgICAgICAgICAgICAgIFNPVVJDRV9ET0NVTUVOVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgImVuIik7Ci0gICAgICAgICAgICBzb3VyY2UuZ2V0UmVwb3NpdG9yeU5vZGUoKS5sb2NrKCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50TG9jYXRvciB0YXJnZXRMb2MgPSBEb2N1bWVudExvY2F0b3IuZ2V0TG9jYXRvcihwdWIuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsCi0gICAgICAgICAgICAgICAgICAgIFRBUkdFVF9ET0NVTUVOVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgImVuIik7Ci0KLSAgICAgICAgICAgIFNpdGVVdGlsLmdldFNpdGVTdHJ1Y3R1cmUoZ2V0TWFuYWdlcigpLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0RmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0UHVibGljYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldEFyZWEoKSkuZ2V0UmVwb3NpdG9yeU5vZGUoKS5sb2NrKCk7Ci0KLSAgICAgICAgICAgIGRvY01hbmFnZXIubW92ZShzb3VyY2UsIHRhcmdldExvYyk7Ci0gICAgICAgICAgICB0YXJnZXQgPSBzb3VyY2UuZ2V0RmFjdG9yeSgpLmdldCh0YXJnZXRMb2MpOwotCi0gICAgICAgICAgICByZXdyaXRlciA9IChMaW5rUmV3cml0ZXIpIGdldE1hbmFnZXIoKS5sb29rdXAoTGlua1Jld3JpdGVyLlJPTEUpOwotICAgICAgICAgICAgcmV3cml0ZXIucmV3cml0ZUxpbmtzKHNvdXJjZSwgdGFyZ2V0KTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRvY01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKGRvY01hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJld3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShyZXdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSB4UGF0aHMgPSBkb2N1bWVudC5nZXRSZXNvdXJjZVR5cGUoKS5nZXRMaW5rQXR0cmlidXRlWFBhdGhzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoeFBhdGhzLmxlbmd0aCA+IDApOwotCi0gICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IHhtbERvYyA9IFNvdXJjZVV0aWwucmVhZERPTShkb2N1bWVudC5nZXRTb3VyY2VVUkkoKSwgZ2V0TWFuYWdlcigpKTsKLSAgICAgICAgYm9vbGVhbiBtYXRjaGVkID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4UGF0aHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGVMaXN0IG5vZGVzID0gWFBhdGhBUEkuc2VsZWN0Tm9kZUxpc3QoeG1sRG9jLCB4UGF0aHNbaV0pOwotICAgICAgICAgICAgZm9yIChpbnQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IG5vZGVJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyaWJ1dGUgPSAoQXR0cikgbm9kZXMuaXRlbShub2RlSW5kZXgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRVcmwgPSBhdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCB0YXJnZXREb2MgPSBnZXRJZGVudGl0eU1hcCgpLmdldEZyb21VUkwodGFyZ2V0VXJsKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RG9jLmVxdWFscyh0YXJnZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKG1hdGNoZWQpOwotICAgICAgICAqLwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL2luZGV4X2VuLnhtbCBiL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9pbmRleF9lbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MGVhNDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL2luZGV4X2VuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi14bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi14bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLQotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogaW5kZXhfZW4ueG1sIDE2OTI5OSAyMDA1LTA1LTA5IDEyOjAwOjQzWiBqd2thbHR6ICQgLS0+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT5XZWxjb21lIHRvIHRoZSBEZWZhdWx0IHB1YmxpY2F0aW9uPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+SGVsbG8gYW5kIHdlbGNvbWUgdG8gdGhlIExlbnlhIGRlZmF1bHQgcHVibGljYXRpb24hPC9oMT4KLQotICAgIDxwPkFwYWNoZSBMZW55YSBpcyBhIEphdmEgT3Blbi1Tb3VyY2UgQ29udGVudCBNYW5hZ2VtZW50IFN5c3RlbQotICAgIGJhc2VkIG9uIG9wZW4gc3RhbmRhcmRzIHN1Y2ggYXMgWE1MIGFuZCBYU0xUIGFuZCB0aGUgQXBhY2hlCi0gICAgU29mdHdhcmUgU3RhY2ssIGluIHBhcnRpY3VsYXIgdGhlIFhNTCBwdWJsaXNoaW5nIGZyYW1ld29yayBBcGFjaGUKLSAgICBDb2Nvb24uPC9wPgotCi0gICAgPHA+Rm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBjb25jZXB0cyBhbmQgdGhlIHRlcm1pbm9sb2d5IHVzZWQgaW4KLSAgICBBcGFjaGUgTGVueWEgcGxlYXNlIHNlZSB0aGUgPGEgaHJlZj0iL3Rlc3QvYXV0aG9yaW5nL2NvbmNlcHRzLmh0bWwiPkNvbmNlcHRzCi0gICAgc2VjdGlvbjwvYT4uIFRvIHNlZSB3aGF0IHlvdSBjYW4gZG8gd2l0aCBBcGFjaGUgTGVueWEgcGxlYXNlCi0gICAgcmVmZXIgdG8gdGhlIDxhIGhyZWY9Ii90ZXN0L2F1dGhvcmluZy9mZWF0dXJlcy5odG1sIj5GZWF0dXJlcwotICAgIHNlY3Rpb248L2E+LjwvcD4KLQotICAgIDxwPklmIHlvdSdkIGxpa2UgdG8gZ2V0IGEgcXVpY2sgaW50cm9kdWN0aW9uIG9uIGhvdyB0byB1c2UgQXBhY2hlCi0gICAgTGVueWEgQ01TIHBsZWFzZSBnbyB0aHJvdWdoIHRoZSA8YQotICAgIGhyZWY9Ii90ZXN0L2F1dGhvcmluZy90dXRvcmlhbC5odG1sIj50dXRvcmlhbDwvYT4uPC9wPgotCi0gICAgPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBwdWJsaWNhdGlvbiBpczwvcD4KLQotICAgIDx1bD4KLSAgICAgIDxsaT50byBzaG93IGJlZ2lubmVycyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgQXBhY2hlCi0gICAgICBMZW55YSBDTVMsPC9saT4KLQotICAgICAgPGxpPnRvIHByb3ZpZGUgYW4gIm91dCBvZiB0aGUgYm94IiBwdWJsaWNhdGlvbiB0aGF0IGNhbiBiZQotICAgICAgZWFzaWx5IGFkYXB0ZWQgYW5kIHVzZWQsPC9saT4KLQotICAgICAgPGxpPmFuZCB0byBwcm92aWRlIGEgYmFzaXMgZm9yIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbnMgb2YgbmV3Ci0gICAgICBjb25jZXB0cyBhbmQgYmVzdCBwcmFjdGljZXMuPC9saT4KLQotICAgIDwvdWw+Ci0KLSAgICA8cD5UaGlzIHB1YmxpY2F0aW9uIGRvZXMgbm90IGdvIHRvIHRoZSBsaW1pdCBvZiB3aGF0J3MgcG9zc2libGUKLSAgICB3aXRoIEFwYWNoZSBMZW55YSBDTVMsIHRoZXJlIGFyZSBubyBmYW5jeSBiZWxscyBhbmQgd2hpc3RsZXMgdG8KLSAgICBjb25mdXNlIHlvdSwgdGhpcyBwdWJsaWNhdGlvbiBzaW1wbHkgY29udGFpbnMgZXZlcnl0aGluZyB5b3UgbmVlZAotICAgIHRvIGdldCBzdGFydGVkLjwvcD4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvQWJzdHJhY3RVc2VjYXNlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL0Fic3RyYWN0VXNlY2FzZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2OGUzYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvQWJzdHJhY3RVc2VjYXNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLmltcGwuVGVzdFVzZWNhc2VJbnZva2VyOwotCi0vKioKLSAqIFVzZWNhc2UgdGVzdCBiYXNlIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVc2VjYXNlVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgLyoqCi0gICAgICogVGhlIHRlc3QuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlY2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgcHJlcGFyZVVzZWNhc2UoKTsKLQotICAgICAgICBVc2VjYXNlSW52b2tlciBpbnZva2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludm9rZXIgPSAoVXNlY2FzZUludm9rZXIpIGdldE1hbmFnZXIoKS5sb29rdXAoVGVzdFVzZWNhc2VJbnZva2VyLlJPTEUpOwotICAgICAgICAgICAgaW52b2tlci5zZXRUZXN0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgICAgIGludm9rZXIuaW52b2tlKGdldFJlcXVlc3QoKS5nZXRQYXRoSW5mbygpLCBnZXRVc2VjYXNlTmFtZSgpLCBnZXRQYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnRhcmdldFVybCA9IGludm9rZXIuZ2V0VGFyZ2V0VXJsKCk7Ci0KLSAgICAgICAgICAgIExpc3QgZXJyb3JNZXNzYWdlcyA9IGludm9rZXIuZ2V0RXJyb3JNZXNzYWdlcygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZXJyb3JNZXNzYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBVc2VjYXNlTWVzc2FnZSBtZXNzYWdlID0gKFVzZWNhc2VNZXNzYWdlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbSA9IG1lc3NhZ2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IG1lc3NhZ2UuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbSArPSAiIFsiICsgcGFyYW1zW2pdICsgIl0iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJVc2VjYXNlIGVycm9yOiAiICsgbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnZva2VyLmdldFJlc3VsdCgpLCBVc2VjYXNlSW52b2tlci5TVUNDRVNTKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnZva2VyLmdldEVycm9yTWVzc2FnZXMoKS5zaXplKCksIDApOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGludm9rZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKGludm9rZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9ucygpOwotCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldFVybDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFVybCgpIHsKLSAgICAgICAgaWYgKHRoaXMudGFyZ2V0VXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSB1c2VjYXNlIGhhcyBub3QgeWV0IGJlZW4gZXhlY3V0ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0VXJsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmVVc2VjYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFVzZWNhc2VOYW1lKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc3Rjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L1dvcmtmbG93VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy9Xb3JrZmxvd1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4NjFhNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L1dvcmtmbG93VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dhYmxlOwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrZmxvd1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB2YXJpYWJsZU5hbWUgPSAiaXNfbGl2ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gIi9hdXRob3JpbmcvaW5kZXguaHRtbCI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFdlYmFwcFVybCgpIHsKLSAgICAgICAgcmV0dXJuICIvdGVzdCIgKyBVUkw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHdvcmtmbG93LgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFdvcmtmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gZ2V0UHVibGljYXRpb24oInRlc3QiKTsKLSAgICAgICAgU3RyaW5nIHVybCA9ICIvIiArIHB1YmxpY2F0aW9uLmdldElkKCkgKyBVUkw7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBnZXRGYWN0b3J5KCk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbWFwLmdldEZyb21VUkwodXJsKTsKLQotICAgICAgICBkb2N1bWVudC5nZXRSZXBvc2l0b3J5Tm9kZSgpLmxvY2soKTsKLQotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRTZXNzaW9uKHN1Ym1pdFNpdHVhdGlvbik7Ci0gICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKGdldE1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBzZXNzaW9uLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLAotICAgICAgICAgICAgICAgIGRvY3VtZW50KTsKLSAgICAgICAgaWYgKHdvcmtmbG93YWJsZS5nZXRWZXJzaW9ucygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiA9IHdvcmtmbG93YWJsZS5nZXRMYXRlc3RWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpZiAodmVyc2lvbi5nZXRWYWx1ZSh2YXJpYWJsZU5hbWUpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnZva2UoZG9jdW1lbnQsIGRlYWN0aXZhdGVTaXR1YXRpb24pOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uLmdldFN0YXRlKCkuZXF1YWxzKCJyZXZpZXciKSkgewotICAgICAgICAgICAgICAgIGludm9rZShkb2N1bWVudCwgcmVqZWN0U2l0dWF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IHNpdHVhdGlvbkluZGV4ID0gMDsgc2l0dWF0aW9uSW5kZXggPCBzaXR1YXRpb25zLmxlbmd0aDsgc2l0dWF0aW9uSW5kZXgrKykgewotICAgICAgICAgICAgVGVzdFNpdHVhdGlvbiBzaXR1YXRpb24gPSBzaXR1YXRpb25zW3NpdHVhdGlvbkluZGV4XTsKLSAgICAgICAgICAgIGludm9rZShkb2N1bWVudCwgc2l0dWF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvY3VtZW50LmdldFJlcG9zaXRvcnlOb2RlKCkudW5sb2NrKCk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiVGVzdCBjb21wbGV0ZWQuIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlKERvY3VtZW50IGRvY3VtZW50LCBUZXN0U2l0dWF0aW9uIHNpdHVhdGlvbikKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uLCBSZXBvc2l0b3J5RXhjZXB0aW9uLCBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldFNlc3Npb24oc2l0dWF0aW9uKTsKLSAgICAgICAgV29ya2Zsb3dhYmxlIGluc3RhbmNlID0gbmV3IERvY3VtZW50V29ya2Zsb3dhYmxlKGdldE1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBzZXNzaW9uLAotICAgICAgICAgICAgICAgIGRvY3VtZW50LAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YW5jZSk7Ci0KLSAgICAgICAgU3RyaW5nIGV2ZW50ID0gc2l0dWF0aW9uLmdldEV2ZW50KCk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiRXZlbnQ6ICIgKyBldmVudCk7Ci0KLSAgICAgICAgV29ya2Zsb3dVdGlsLmludm9rZShnZXRNYW5hZ2VyKCksIHNlc3Npb24sIGdldExvZ2dlcigpLCBkb2N1bWVudCwgZXZlbnQpOwotCi0gICAgICAgIGJvb2xlYW4gdmFsdWUgPSBpbnN0YW5jZS5nZXRMYXRlc3RWZXJzaW9uKCkuZ2V0VmFsdWUodmFyaWFibGVOYW1lKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJWYXJpYWJsZTogIiArIHZhcmlhYmxlTmFtZSArICIgPSAiICsgdmFsdWUpOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHNpdHVhdGlvbi5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2Vzc2lvbiBnZXRTZXNzaW9uKFRlc3RTaXR1YXRpb24gc2l0dWF0aW9uKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBsb2dpbihzaXR1YXRpb24uZ2V0VXNlcigpKTsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiVXNlcjogWyIgKyBzZXNzaW9uLmdldElkZW50aXR5KCkuZ2V0VXNlcigpICsgIl0iKTsKLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGVzdFNpdHVhdGlvbiBzdWJtaXRTaXR1YXRpb24gPSBuZXcgVGVzdFNpdHVhdGlvbigibGVueWEiLCAic3VibWl0IiwgZmFsc2UpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RTaXR1YXRpb24gcmVqZWN0U2l0dWF0aW9uID0gbmV3IFRlc3RTaXR1YXRpb24oImFsaWNlIiwgInJlamVjdCIsIGZhbHNlKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXN0U2l0dWF0aW9uIGRlYWN0aXZhdGVTaXR1YXRpb24gPSBuZXcgVGVzdFNpdHVhdGlvbigiYWxpY2UiLAotICAgICAgICAgICAgImRlYWN0aXZhdGUiLAotICAgICAgICAgICAgZmFsc2UpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RTaXR1YXRpb24gcHVibGlzaFNpdHVhdGlvbiA9IG5ldyBUZXN0U2l0dWF0aW9uKCJhbGljZSIsCi0gICAgICAgICAgICAicHVibGlzaCIsCi0gICAgICAgICAgICB0cnVlKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RTaXR1YXRpb25bXSBzaXR1YXRpb25zID0geyBzdWJtaXRTaXR1YXRpb24sIHJlamVjdFNpdHVhdGlvbiwKLSAgICAgICAgICAgIHN1Ym1pdFNpdHVhdGlvbiwgcHVibGlzaFNpdHVhdGlvbiwgZGVhY3RpdmF0ZVNpdHVhdGlvbiB9OwotCi0gICAgLyoqCi0gICAgICogQSB0ZXN0IHNpdHVhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RTaXR1YXRpb24gewotICAgICAgICBwcml2YXRlIFN0cmluZyB1c2VyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBldmVudDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZhbHVlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IHRlc3Qgc2l0dWF0aW9uLgotICAgICAgICAgKiBAcGFyYW0gX3VzZXIgVGhlIHVzZXIuCi0gICAgICAgICAqIEBwYXJhbSBfZXZlbnQgVGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gX3ZhbHVlIFRoZSB2YXJpYWJsZSB2YWx1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUZXN0U2l0dWF0aW9uKFN0cmluZyBfdXNlciwgU3RyaW5nIF9ldmVudCwgYm9vbGVhbiBfdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudXNlciA9IF91c2VyOwotICAgICAgICAgICAgdGhpcy5ldmVudCA9IF9ldmVudDsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBfdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEByZXR1cm4gQW4gZXZlbnQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgdXNlci4KLSAgICAgICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnVzZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUuCi0gICAgICAgICAqIEByZXR1cm4gQSB2YWx1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvbmV0L0luZXRBZGRyZXNzVXRpbFRlc3QuamF2YSBiL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9uZXQvSW5ldEFkZHJlc3NVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWVjNzc0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9uZXQvSW5ldEFkZHJlc3NVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubmV0OwotCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb3JlLmNvbnRhaW5lci5Db250YWluZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBJbmV0IGFkZHJlc3MgdXRpbCB0ZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbmV0QWRkcmVzc1V0aWxUZXN0IGV4dGVuZHMgQ29udGFpbmVyVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEluZXRBZGRyZXNzVXRpbCgpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nW10gYXJncyA9IHsgIjE5NS4yMjYuNi42NCIsICIyNTUuMjU1LjI1NS4wIiwgIjE5NS4yMjYuNi43MCIgfTsKLQotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogSW5ldEFkZHJlc3NVdGlsVGVzdCBuZXR3b3JrIHN1Ym5ldCBpcCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSW5ldEFkZHJlc3MgbmV0d29yayA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShhcmdzWzBdKTsgLy8gIjE5NS4yMjYuNi42NCIpOwotICAgICAgICBJbmV0QWRkcmVzcyBzdWJuZXQgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYXJnc1sxXSk7IC8vICIyNTUuMjU1LjI1NS4wIik7Ci0gICAgICAgIEluZXRBZGRyZXNzIGlwID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFyZ3NbMl0pOyAvLyAiMTk1LjIyNi42LjcwIik7Ci0gICAgICAgIAotICAgICAgICBJbmV0QWRkcmVzc1V0aWwgdXRpbCA9IG5ldyBJbmV0QWRkcmVzc1V0aWwoZ2V0TG9nZ2VyKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odXRpbC5jb250YWlucyhuZXR3b3JrLCBzdWJuZXQsIGlwKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL01vY2tGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vTW9ja0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1ZjIwZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vTW9ja0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgTW9ja0ZhY3RvcnkgaW1wbGVtZW50cyBJZGVudGlmaWFibGVGYWN0b3J5IHsKLSAgICAKLSAgICBwcml2YXRlIFVuaXRPZldvcmsgdW5pdDsKLSAgICAKLSAgICBwdWJsaWMgTW9ja0ZhY3RvcnkoVW5pdE9mV29yayB1bml0KSB7Ci0gICAgICAgIHRoaXMudW5pdCA9IHVuaXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgYnVpbGQoSWRlbnRpdHlNYXAgbWFwLCBTdHJpbmcga2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNb2NrVHJhbnNhY3Rpb25hYmxlKGtleSwgdGhpcy51bml0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAibW9jayI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vTW9ja1JldmlzaW9uQ29udHJvbGxlci5qYXZhIGIvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL01vY2tSZXZpc2lvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5ODkyMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vTW9ja1JldmlzaW9uQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgTW9ja1JldmlzaW9uQ29udHJvbGxlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGhpc3RvcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEhpc3RvcnkgZ2V0SGlzdG9yeShNb2NrVHJhbnNhY3Rpb25hYmxlIHRyYW5zYWN0aW9uYWJsZSkgewotICAgICAgICBIaXN0b3J5IGhpc3RvcnkgPSAoSGlzdG9yeSkgaGlzdG9yaWVzLmdldCh0cmFuc2FjdGlvbmFibGUuZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChoaXN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGhpc3RvcnkgPSBuZXcgSGlzdG9yeSgpOwotICAgICAgICAgICAgaGlzdG9yaWVzLnB1dCh0cmFuc2FjdGlvbmFibGUuZ2V0SWQoKSwgaGlzdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhpc3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBIaXN0b3J5IHsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBIaXN0b3J5KCkgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGludCB2ZXJzaW9uID0gMDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrZWRPdXQgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2hlY2tPdXRVc2VyID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIG5ld1ZlcnNpb24oKSB7Ci0gICAgICAgICAgICB0aGlzLnZlcnNpb24rKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGludCBnZXRMYXRlc3RWZXJzaW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkT3V0KCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tlZE91dDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY2hlY2tPdXQoU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tlZE91dCA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrT3V0VXNlciA9IHVzZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0luKCkgewotICAgICAgICAgICAgdGhpcy5jaGVja2VkT3V0ID0gZmFsc2U7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrT3V0VXNlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlY2tPdXRVc2VyKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tPdXRVc2VyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL01vY2tUcmFuc2FjdGlvbmFibGUuamF2YSBiL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Nb2NrVHJhbnNhY3Rpb25hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzQwYTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL01vY2tUcmFuc2FjdGlvbmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE1vY2tUcmFuc2FjdGlvbmFibGUgaW1wbGVtZW50cyBUcmFuc2FjdGlvbmFibGUgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIAotICAgIHB1YmxpYyBNb2NrVHJhbnNhY3Rpb25hYmxlKFN0cmluZyBpZCwgVW5pdE9mV29yayB1bml0KSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgdGhpcy51bml0ID0gdW5pdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGUoKSB7Ci0gICAgICAgIE1vY2tSZXZpc2lvbkNvbnRyb2xsZXIuZ2V0SGlzdG9yeSh0aGlzKS5uZXdWZXJzaW9uKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNoYW5nZWQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlVHJhbnNhY3Rpb25hYmxlKCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVUcmFuc2FjdGlvbmFibGUoKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZWQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZVRyYW5zYWN0aW9uYWJsZSgpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tpbigpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vY2tSZXZpc2lvbkNvbnRyb2xsZXIuZ2V0SGlzdG9yeSh0aGlzKS5jaGVja0luKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tvdXQoKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICBNb2NrUmV2aXNpb25Db250cm9sbGVyLmdldEhpc3RvcnkodGhpcykuY2hlY2tPdXQoZ2V0VXNlcklkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoYW5nZWQoKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGN1cnJlbnRWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbigpOwotICAgICAgICAgICAgaW50IGxvY2tWZXJzaW9uID0gZ2V0TG9jaygpLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmVyc2lvbiA+IGxvY2tWZXJzaW9uOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldExhdGVzdFZlcnNpb24oKSB7Ci0gICAgICAgIGludCBjdXJyZW50VmVyc2lvbiA9IE1vY2tSZXZpc2lvbkNvbnRyb2xsZXIuZ2V0SGlzdG9yeSh0aGlzKS5nZXRMYXRlc3RWZXJzaW9uKCk7Ci0gICAgICAgIHJldHVybiBjdXJyZW50VmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWRPdXQoKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gTW9ja1JldmlzaW9uQ29udHJvbGxlci5nZXRIaXN0b3J5KHRoaXMpLmlzQ2hlY2tlZE91dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZE91dEJ5U2Vzc2lvbigpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB1c2VyID0gTW9ja1JldmlzaW9uQ29udHJvbGxlci5nZXRIaXN0b3J5KHRoaXMpLmdldENoZWNrT3V0VXNlcigpOwotICAgICAgICByZXR1cm4gdXNlciAhPSBudWxsICYmIHVzZXIuZXF1YWxzKGdldFVzZXJJZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlcklkKCkgewotICAgICAgICByZXR1cm4gKChVbml0T2ZXb3JrSW1wbCkgdGhpcy51bml0KS5nZXRJZGVudGl0eSgpLmdldFVzZXIoKS5nZXRJZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTG9jayBsb2NrOwotCi0gICAgcHVibGljIExvY2sgZ2V0TG9jaygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9jazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxvY2sgIT0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBVbml0T2ZXb3JrIHVuaXQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2NrKCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5sb2NrID0gdW5pdC5jcmVhdGVMb2NrKHRoaXMsIGdldExhdGVzdFZlcnNpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5sb2NrKCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5sb2NrID0gbnVsbDsKLSAgICAgICAgdW5pdC5yZW1vdmVMb2NrKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL01vY2tVc2VyLmphdmEgYi90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vTW9ja1VzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwY2Q5YS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vTW9ja1VzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrVXNlciBpbXBsZW1lbnRzIFVzZXIgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIAotICAgIHB1YmxpYyBNb2NrVXNlcihTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERvY3VtZW50TG9jYWxlKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1lbnVMb2NhbGUoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHREb2N1bWVudExvY2FsZShTdHJpbmcgZG9jdW1lbnRMb2NhbGUpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWVudUxvY2FsZShTdHJpbmcgbWVudUxvY2FsZSkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwbGFpblRleHRQYXNzd29yZCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBBY2NyZWRpdGFibGVbXSBnZXRBY2NyZWRpdGFibGVzKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KEZpbGUgY29uZmlndXJhdGlvbkRpcmVjdG9yeSkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVMb2dnaW5nKExvZ2dlciBhcmcwKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkZWRUb0dyb3VwKEdyb3VwIGdyb3VwKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIEdyb3VwW10gZ2V0R3JvdXBzKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZyb21BbGxHcm91cHMoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlZEZyb21Hcm91cChHcm91cCBncm91cCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBBY2NyZWRpdGFibGVNYW5hZ2VyIGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1NYW5hZ2VyIGdldEl0ZW1NYW5hZ2VyKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbkNoYW5nZVBhc3N3b3JkKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvblRlc3QuamF2YSBiL3RydW5rL3NyYy9pbXBsL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5MzY0My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvcmUuY29udGFpbmVyLkNvbnRhaW5lclRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2FjdGlvblRlc3QgZXh0ZW5kcyBDb250YWluZXJUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb24oKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotCi0gICAgICAgIElkZW50aXR5IGxlbnlhID0gbmV3IElkZW50aXR5KGdldExvZ2dlcigpKTsKLSAgICAgICAgbGVueWEuYWRkSWRlbnRpZmlhYmxlKG5ldyBNb2NrVXNlcigibGVueWEiKSk7Ci0KLSAgICAgICAgSWRlbnRpdHkgYWxpY2UgPSBuZXcgSWRlbnRpdHkoZ2V0TG9nZ2VyKCkpOwotICAgICAgICBhbGljZS5hZGRJZGVudGlmaWFibGUobmV3IE1vY2tVc2VyKCJhbGljZSIpKTsKLQotICAgICAgICBJZGVudGl0eU1hcCBsZW55YU1hcCA9IG5ldyBJZGVudGl0eU1hcEltcGwoZ2V0TG9nZ2VyKCkpOwotICAgICAgICBVbml0T2ZXb3JrIGxlbnlhVW5pdCA9IG5ldyBVbml0T2ZXb3JrSW1wbChsZW55YU1hcCwgbGVueWEsIGdldExvZ2dlcigpKTsKLSAgICAgICAgSWRlbnRpZmlhYmxlRmFjdG9yeSBsZW55YUZhY3RvcnkgPSBuZXcgTW9ja0ZhY3RvcnkobGVueWFVbml0KTsKLQotICAgICAgICBJZGVudGl0eU1hcCBhbGljZU1hcCA9IG5ldyBJZGVudGl0eU1hcEltcGwoZ2V0TG9nZ2VyKCkpOwotICAgICAgICBVbml0T2ZXb3JrIGFsaWNlVW5pdCA9IG5ldyBVbml0T2ZXb3JrSW1wbChhbGljZU1hcCwgYWxpY2UsIGdldExvZ2dlcigpKTsKLSAgICAgICAgSWRlbnRpZmlhYmxlRmFjdG9yeSBhbGljZUZhY3RvcnkgPSBuZXcgTW9ja0ZhY3RvcnkoYWxpY2VVbml0KTsKLQotICAgICAgICBNb2NrVHJhbnNhY3Rpb25hYmxlIGxlbnlhVDEgPSAoTW9ja1RyYW5zYWN0aW9uYWJsZSkgbGVueWFNYXAuZ2V0KGxlbnlhRmFjdG9yeSwgInQxIik7Ci0gICAgICAgIE1vY2tUcmFuc2FjdGlvbmFibGUgYWxpY2VUMSA9IChNb2NrVHJhbnNhY3Rpb25hYmxlKSBhbGljZU1hcC5nZXQoYWxpY2VGYWN0b3J5LCAidDEiKTsKLQotICAgICAgICBjaGVja0RvdWJsZUxvY2sobGVueWFUMSk7Ci0gICAgICAgIGNoZWNrTG9ja0FuZE1vZGlmeShsZW55YVVuaXQsIGxlbnlhVDEsIGFsaWNlVDEpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tEb3VibGVMb2NrKE1vY2tUcmFuc2FjdGlvbmFibGUgdCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdC5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0LmxvY2soKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIGV4Y2VwdGlvbiB0aHJvd24hIiwgZmFsc2UpOwotICAgICAgICB9IGNhdGNoIChMb2NrRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICB9Ci0gICAgICAgIHQudW5sb2NrKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tMb2NrQW5kTW9kaWZ5KFVuaXRPZldvcmsgbGVueWFVbml0LCBNb2NrVHJhbnNhY3Rpb25hYmxlIGxlbnlhVDEsCi0gICAgICAgICAgICBNb2NrVHJhbnNhY3Rpb25hYmxlIGFsaWNlVDEpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGxlbnlhVDEubG9jaygpOwotICAgICAgICBhbGljZVQxLndyaXRlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsZW55YVVuaXQuY29tbWl0KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBleGNlcHRpb24gdGhyb3duISIsIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgfQotICAgICAgICBsZW55YVQxLnVubG9jaygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC93ZWJ0ZXN0L2NvbmZpZy54bWwgYi90cnVuay9zcmMvaW1wbC90ZXN0L3dlYnRlc3QvY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0ZDM2ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvaW1wbC90ZXN0L3dlYnRlc3QvY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPGNvbmZpZwotICAgICAgICBob3N0PSJsb2NhbGhvc3QiCi0gICAgICAgIHBvcnQ9Ijg4ODgiCi0gICAgICAgIHByb3RvY29sPSJodHRwIgotICAgICAgICBzYXZlcmVzcG9uc2U9InRydWUiCi0gICAgICAgIHJlc3VsdHBhdGg9InNyYy90ZXN0L3dlYnRlc3QvcmVzdWx0cy8iCi0gICAgICAgIHZlcmJvc2U9InRydWUiCi0gICAgICAgIGJhc2VwYXRoPSIiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC93ZWJ0ZXN0L3Rlc3RzLnhtbCBiL3RydW5rL3NyYy9pbXBsL3Rlc3Qvd2VidGVzdC90ZXN0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYWM1ZjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2ltcGwvdGVzdC93ZWJ0ZXN0L3Rlc3RzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLSAgPCFFTlRJVFkgZGVmYXVsdCBTWVNURU0gIi4uLy4uL3dlYmFwcC9sZW55YS9wdWJzL2RlZmF1bHQvdGVzdC93ZWJ0ZXN0L3Rlc3RzLnhtbCI+Ci0gIDwhRU5USVRZIGNvbmZpZyBTWVNURU0gImNvbmZpZy54bWwiPiAKLV0+Ci0KLTxwcm9qZWN0IG5hbWU9IkxlbnlhIHdlYnRlc3QgdGVzdHMiIGRlZmF1bHQ9InRlc3RzIj4KLQotICA8dGFza2RlZiBmaWxlPSIke3dlYnRlc3QuaG9tZX0vd2VidGVzdFRhc2tkZWZzLnByb3BlcnRpZXMiPgotICAgIDxjbGFzc3BhdGg+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7d2VidGVzdC5ob21lfSIgaW5jbHVkZXM9IioqL2xpYi8qLmphciIvPgotICAgIDwvY2xhc3NwYXRoPgotICA8L3Rhc2tkZWY+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0cyIgZGVwZW5kcz0icHVicy5kZWZhdWx0Ii8+Ci0gIAotICAmZGVmYXVsdDsKLSAgCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BY2Nlc3NDb250cm9sRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0FjY2Vzc0NvbnRyb2xFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2ZjcyNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0FjY2Vzc0NvbnRyb2xFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLS8qKgotICogQWNjZXNzIGNvbnRyb2wgZXhjZXB0aW9uLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBDcmVhdGUgYW4gQWNjZXNzQ29udHJvbEV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvQWNjZXNzQ29udHJvbGxlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BY2Nlc3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTU1ZjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BY2Nlc3NDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLQotLyoqCi0gKiBBbiBhY2Nlc3MgY29udHJvbGxlciBhbGxvd3MgYXV0aGVudGljYXRpbmcgYW5kIGF1dGhvcml6aW5nIGlkZW50aXRpZXMuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWNjZXNzQ29udHJvbGxlciBleHRlbmRzIENvbXBvbmVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYWNjZXNzIGNvbnRyb2wgbmFtZXNwYWNlIFVSSS4KLSAgICAgKi8KLSAgICBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9hYy8xLjAiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgcHJlZml4IGZvciB0aGUgYWNjZXNzIGNvbnRyb2wgbmFtZXNwYWNlLgotICAgICAqLwotICAgIFN0cmluZyBERUZBVUxUX1BSRUZJWCA9ICJhYyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXZhbG9uIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBBY2Nlc3NDb250cm9sbGVyLmNsYXNzLmdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEF1dGhlbnRpY2F0ZXMgYSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSByZXF1ZXN0IEEgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBib29sZWFuIGF1dGhlbnRpY2F0ZShSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQXV0aG9yaXplcyBhIHJlcXVlc3QgaW5zaWRlIGEgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIHJlcXVlc3QgQSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIGJvb2xlYW4gYXV0aG9yaXplKFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgaWRlbnRpdHkgZm9yIHRoaXMgYWNjZXNzIGNvbnRyb2xsZXIuCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgdGhhdCBjb250YWlucyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24uCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgdm9pZCBzZXR1cElkZW50aXR5KFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIEFuIGFjY3JlZGl0YWJsZSBtYW5hZ2VyLgotICAgICAqLwotICAgIEFjY3JlZGl0YWJsZU1hbmFnZXIgZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9saWN5IG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBIHBvbGljeSBtYW5hZ2VyLgotICAgICAqLwotICAgIFBvbGljeU1hbmFnZXIgZ2V0UG9saWN5TWFuYWdlcigpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGF1dGhvcml6ZXJzLgotICAgICAqLwotICAgIEF1dGhvcml6ZXJbXSBnZXRBdXRob3JpemVycygpOwotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0FjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODk4ZmZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci0KLS8qKgotICogQW4gYWNjZXNzIGNvbnRyb2xsZXIgcmVzb2x2ZXIgcmVzb2x2ZXMgdGhlIGFwcHJvcHJpYXRlIGFjY2VzcyBjb250cm9sbGVyCi0gKiBmb3IgYSBnaXZlbiBDb2Nvb24gb2JqZWN0IG1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciBleHRlbmRzIENvbXBvbmVudCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiByb2xlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLmNsYXNzLmdldE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCByZXNvbHZlciB0byB1c2UuCi0gICAgICovCi0gICAgU3RyaW5nIERFRkFVTFRfUkVTT0xWRVIgPSAicHVibGljYXRpb24iOwotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZXMgYW4gYWNjZXNzIGNvbnRyb2xsZXIgZm9yIGEgY2VydGFpbiBVUkwuCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgVVJMIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uICh3aXRob3V0IGNvbnRleHQgcHJlZml4KS4KLSAgICAgKiBAcmV0dXJuIEFuIGFjY2VzcyBjb250cm9sbGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRyb2xsZXIgY291bGQgYmUgcmVzb2x2ZWQuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgQWNjZXNzQ29udHJvbGxlciByZXNvbHZlQWNjZXNzQ29udHJvbGxlcihTdHJpbmcgd2ViYXBwVXJsKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyBhIHJlc29sdmVkIGFjY2VzcyBjb250cm9sbGVyLiAKLSAgICAgKiBAcGFyYW0gY29udHJvbGxlciBUaGUgYWNjZXNzIGNvbnRyb2xsZXIgdG8gcmVsZWFzZS4KLSAgICAgKi8KLSAgICB2b2lkIHJlbGVhc2UoQWNjZXNzQ29udHJvbGxlciBjb250cm9sbGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BY2NyZWRpdGFibGUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvQWNjcmVkaXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNmI0ZGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BY2NyZWRpdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLQotLyoqCi0gKiBBbiBBY2NyZWRpdGFibGUgY2FuIGJlIGFjY3JlZGl0ZWQgd2l0aCByb2xlcyBvbiBhIGNlcnRhaW4gVVJJCi0gKiB1c2luZyBhIHtAbGluayBvcmcuYXBhY2hlLmxlbnlhLmFjLkNyZWRlbnRpYWx9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjY3JlZGl0YWJsZSB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGFjY3JlZGl0YWJsZXMgb2YgdGhpcyBhY2NyZWRpdGFibGUuCi0gICAgICogVGhlIHNldCBjb250YWlucyB0aGUgYWNjcmVkaXRhYmxlIGl0c2VsZiBhbmQgYWxsIGNvbGxlY3Rpb25zIGl0IGJlbG9uZ3MgdG8uCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBhY2NyZWRpdGFibGVzLgotICAgICAqLwotICAgIEFjY3JlZGl0YWJsZVtdIGdldEFjY3JlZGl0YWJsZXMoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvQWNjcmVkaXRhYmxlTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BY2NyZWRpdGFibGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmJlODIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BY2NyZWRpdGFibGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci0KLS8qKgotICogQW4gQWNjcmVkaXRhYmxlTWFuYWdlciBjb21iaW5lcyBhIFVzZXJNYW5hZ2VyLCBhIEdyb3VwTWFuYWdlciwgYW4gSVBSYW5nZU1hbmFnZXIgYW5kIGEKLSAqIFJvbGVNYW5hZ2VyLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjY3JlZGl0YWJsZU1hbmFnZXIgZXh0ZW5kcyBDb21wb25lbnQgewotCi0gICAgLyoqCi0gICAgICogQXZhbG9uIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBBY2NyZWRpdGFibGVNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXIgbWFuYWdlciBvZiB0aGlzIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqIEByZXR1cm4gQSB1c2VyIG1hbmFnZXIuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgVXNlck1hbmFnZXIgZ2V0VXNlck1hbmFnZXIoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdyb3VwIG1hbmFnZXIgb2YgdGhpcyBhY2Nlc3MgY29udHJvbGxlci4KLSAgICAgKiBAcmV0dXJuIEEgZ3JvdXAgbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBHcm91cE1hbmFnZXIgZ2V0R3JvdXBNYW5hZ2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb2xlIG1hbmFnZXIgb2YgdGhpcyBhY2Nlc3MgY29udHJvbGxlci4KLSAgICAgKiBAcmV0dXJuIEEgcm9sZSBtYW5hZ2VyLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIFJvbGVNYW5hZ2VyIGdldFJvbGVNYW5hZ2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJUCByYW5nZSBtYW5hZ2VyIG9mIHRoaXMgYWNjZXNzIGNvbnRyb2xsZXIuCi0gICAgICogQHJldHVybiBBbiBJUCByYW5nZSBtYW5hZ2VyLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIElQUmFuZ2VNYW5hZ2VyIGdldElQUmFuZ2VNYW5hZ2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBdHRhY2hlcyBhbiBpdGVtIG1hbmFnZXIgbGlzdGVuZXIgdG8gdGhpcyBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQW4gaXRlbSBtYW5hZ2VyIGxpc3RlbmVyLgotICAgICAqLwotICAgIHZvaWQgYWRkSXRlbU1hbmFnZXJMaXN0ZW5lcihJdGVtTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW4gaXRlbSBtYW5hZ2VyIGxpc3RlbmVyIGZyb20gdGhpcyBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQW4gaXRlbSBtYW5hZ2VyIGxpc3RlbmVyLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlSXRlbU1hbmFnZXJMaXN0ZW5lcihJdGVtTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgc291cmNlIFVSSSB0byBzdG9yZSBjb25maWd1cmF0aW9uIHNvdXJjZXMuIFRoaXMgVVJJCi0gICAgICogbXVzdCBwb2ludCB0byBhIGNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25Db2xsZWN0aW9uVXJpKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB1bmlxdWUgSUQgb2YgdGhpcyBhY2NyZWRpdGFibGUgbWFuYWdlci4gSXQgaXMgdXNlZCB0byBjaGVjawotICAgICAqIGlmIHR3byBhY2NyZWRpdGFibGVzIGJlbG9uZyB0byB0aGUgc2FtZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvQWNjcmVkaXRhYmxlTWFuYWdlckZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvQWNjcmVkaXRhYmxlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkYmMzZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0FjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIHByb2R1Y2UgYWNjcmVkaXRhYmxlIG1hbmFnZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5IHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgQXZhbG9uIHNlcnZpY2Ugcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IEFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBjb25maWd1cmF0aW9uLgotICAgICAqIEByZXR1cm4gQW4gYWNjcmVkaXRhYmxlIG1hbmFnZXIgZm9yIGEgY2VydGFpbiBjb25maWd1cmF0aW9uLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBmYWlsZWQuCi0gICAgICovCi0gICAgQWNjcmVkaXRhYmxlTWFuYWdlciBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BdXRoZW50aWNhdG9yLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0F1dGhlbnRpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjMWZlMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0F1dGhlbnRpY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotCi0vKioKLSAqIEFuIGF1dGhlbnRpY2F0b3IuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXV0aGVudGljYXRvciBleHRlbmRzIENvbXBvbmVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBBdmFsb24gcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IEF1dGhlbnRpY2F0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQXV0aGVudGljYXRlcyBhIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZU1hbmFnZXIgVGhlIGFjY3JlZGl0YWJsZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IGlzIGF1dGhlbnRpY2F0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgYm9vbGVhbiBhdXRoZW50aWNhdGUoQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyLCBSZXF1ZXN0IHJlcXVlc3QpCi0gICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9BdXRob3JpemVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0F1dGhvcml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyNjI5Yy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0F1dGhvcml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotCi0vKioKLSAqIEFuIEF1dGhvcml6ZXIgY2hlY2tzIGlmIGFuIElkZW50aXR5IGlzIGF1dGhvcml6ZWQgdG8gaW52b2tlIGEgY2VydGFpbiByZXF1ZXN0LgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF1dGhvcml6ZXIgZXh0ZW5kcyBDb21wb25lbnQgewotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBBdmFsb24gcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IEF1dGhvcml6ZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQXV0aG9yaXplcyBhbiBpZGVudGl0eSBhdCBhIFVSTC4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpZGVudGl0eSBpcyBhdXRob3JpemVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIGJvb2xlYW4gYXV0aG9yaXplKFJlcXVlc3QgcmVxdWVzdCkKLSAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvQ3JlZGVudGlhbC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9DcmVkZW50aWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjM0MzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9DcmVkZW50aWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotLyoqCi0gKiBBIGNyZWRlbnRpYWwgYXNzaWducyBhIHtAbGluayBSb2xlfSB0byBhbiB7QGxpbmsgQWNjcmVkaXRhYmxlfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDcmVkZW50aWFsIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFjY3JlZGl0YWJsZSB0aGlzIGNyZWRlbnRpYWwgYXBwbGllcyB0by4KLSAgICAgKi8KLSAgICBBY2NyZWRpdGFibGUgZ2V0QWNjcmVkaXRhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByb2xlIG9mIHRoaXMgY3JlZGVudGlhbC4KLSAgICAgKi8KLSAgICBSb2xlIGdldFJvbGUoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG1ldGhvZCwgb25lIG9mIHtAbGluayAjR1JBTlR9IGFuZCB7QGxpbmsgI0RFTll9LgotICAgICAqLwotICAgIFN0cmluZyBnZXRNZXRob2QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgImdyYW50IiBtZXRob2QuCi0gICAgICovCi0gICAgU3RyaW5nIEdSQU5UID0gImdyYW50IjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgImRlbnkiIG1ldGhvZC4KLSAgICAgKi8KLSAgICBTdHJpbmcgREVOWSA9ICJkZW55IjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvR3JvdXAuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4MDk4NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0dyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjOwotCi0vKioKLSAqIEEgZ3JvdXAuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JvdXAgZXh0ZW5kcyBJZGVudGlmaWFibGUsIEl0ZW0gewotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbWJlcnMgb2YgdGhpcyBncm91cC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBHcm91cGFibGV9cy4KLSAgICAgKi8KLSAgICBHcm91cGFibGVbXSBnZXRNZW1iZXJzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG1lbWJlciB0byB0aGlzIGdyb3VwLgotICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB0byBhZGQuCi0gICAgICovCi0gICAgdm9pZCBhZGQoR3JvdXBhYmxlIG1lbWJlcik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIG1lbWJlciBmcm9tIHRoaXMgZ3JvdXAuCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHRvIHJlbW92ZS4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZShHcm91cGFibGUgbWVtYmVyKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBtZW1iZXJzIGZyb20gdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUFsbE1lbWJlcnMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgZ3JvdXAgY29udGFpbnMgdGhpcyBtZW1iZXIuCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIGJvb2xlYW4gY29udGFpbnMoR3JvdXBhYmxlIG1lbWJlcik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVsZXRlIGEgZ3JvdXAuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSBkZWxldGUgZmFpbGVkCi0gICAgICovCi0gICAgdm9pZCBkZWxldGUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGlzIGdyb3VwLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNhdmluZyBmYWlsZWQuCi0gICAgICovCi0gICAgdm9pZCBzYXZlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Hcm91cE1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvR3JvdXBNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTE3OTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Hcm91cE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLS8qKgotICogQSBncm91cCBtYW5hZ2VyLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwTWFuYWdlciBleHRlbmRzIEl0ZW1NYW5hZ2VyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIGdyb3Vwcy4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGdyb3Vwcy4KLSAgICAgKi8KLSAgICBHcm91cFtdIGdldEdyb3VwcygpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhIGdyb3VwIHRvIHRoaXMgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gaWQgdGhlIElEIG9mIHRoZSBncm91cCB0byBiZSBhZGRlZC4KLSAgICAgKiBAcmV0dXJuIEEgZ3JvdXAuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIGdyb3VwIGlzIGFscmVhZHkgY29udGFpbmVkLgotICAgICAqLwotICAgIEdyb3VwIGFkZChTdHJpbmcgaWQpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIGdyb3VwIGZyb20gdGhpcyBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBncm91cCB0aGUgZ3JvdXAgdG8gYmUgcmVtb3ZlZC4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiB0aGUgZ3JvdXAgaXMgbm90IGNvbnRhaW5lZC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZShHcm91cCBncm91cCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBncm91cCB3aXRoIHRoZSBnaXZlbiBncm91cCBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGdyb3VwSWQgdGhlIGlkIG9mIHRoZSByZXF1ZXN0ZWQgZ3JvdXAuCi0gICAgICogQHJldHVybiBhIDxjb2RlPkdyb3VwPC9jb2RlPiBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGdyb3VwIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBHcm91cCBnZXRHcm91cChTdHJpbmcgZ3JvdXBJZCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0dyb3VwYWJsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Hcm91cGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5MjMzMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0dyb3VwYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotLyoqCi0gKiBHZW5lcmFsaXplZCBpbnRlcmZhY2Ugb2YgZ3JvdXAgbWVtYmVyIG9iamVjdHMuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JvdXBhYmxlIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIEdyb3VwYWJsZSBvZiBiZWluZyBhZGRlZCB0byBhIGdyb3VwLgotICAgICAqIEBwYXJhbSBncm91cCBUaGUgZ3JvdXAuCi0gICAgICovCi0gICAgdm9pZCBhZGRlZFRvR3JvdXAoR3JvdXAgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBHcm91cGFibGUgb2YgYmVpbmcgcmVtb3ZlZCBmcm9tIGEgZ3JvdXAuCi0gICAgICogQHBhcmFtIGdyb3VwIFRoZSBncm91cC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZWRGcm9tR3JvdXAoR3JvdXAgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGlzIEdyb3VwYWJsZS4KLSAgICAgKiBAcmV0dXJuIEEge0BsaW5rIEdyb3VwfSBhcnJheS4KLSAgICAgKi8KLSAgICBHcm91cFtdIGdldEdyb3VwcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhpcyBHcm91cGFibGUgZnJvbSBhbGwgZ3JvdXBzLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlRnJvbUFsbEdyb3VwcygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9JUFJhbmdlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0lQUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1NGEwMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0lQUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjOwotCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci0KLQotLyoqCi0gKiBBbiBJUCByYW5nZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUFJhbmdlIGV4dGVuZHMgQWNjcmVkaXRhYmxlLCBJdGVtLCBHcm91cGFibGUgewotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5ldHdvcmsgYWRkcmVzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWRkcmVzcyBBIHN0cmluZywgZS5nLiAxOTIuMTY4LjAuMzIKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiB0aGUgY29udmVyc2lvbiBvZiB0aGUgU3RyaW5nIHRvIGFuCi0gICAgICogSW5ldEFkZHJlc3MgZmFpbGVkLgotICAgICAqLwotICAgIHZvaWQgc2V0TmV0d29ya0FkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5ldHdvcmsgYWRkcmVzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWRkcmVzcyBBIGJ5dGUgYXJyYXkgb2YgdGhlIGxlbmd0aCA0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBieXRlIGFycmF5IHRvIGFuCi0gICAgICogSW5ldEFkZHJlc3MgZmFpbGVkLgotICAgICAqLwotICAgIHZvaWQgc2V0TmV0d29ya0FkZHJlc3MoYnl0ZVtdIGFkZHJlc3MpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ldHdvcmsgYWRkcmVzcy4KLSAgICAgKiBAcmV0dXJuIEFuIEluZXRBZGRyZXNzIHZhbHVlLgotICAgICAqLwotICAgIEluZXRBZGRyZXNzIGdldE5ldHdvcmtBZGRyZXNzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3VibmV0IG1hc2suCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hc2sgQSBzdHJpbmcsIGUuZy4gMTkyLjE2OC4wLjMyCi0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIGNvbnZlcnNpb24gb2YgdGhlIFN0cmluZyB0byBhbgotICAgICAqIEluZXRBZGRyZXNzIGZhaWxlZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFN1Ym5ldE1hc2soU3RyaW5nIG1hc2spIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN1Ym5ldCBtYXNrLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXNrIEEgYnl0ZSBhcnJheSBvZiB0aGUgbGVuZ3RoIDQuCi0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIGNvbnZlcnNpb24gb2YgdGhlIGJ5dGUgYXJyYXkgdG8gYW4KLSAgICAgKiBJbmV0QWRkcmVzcyBmYWlsZWQuCi0gICAgICovCi0gICAgdm9pZCBzZXRTdWJuZXRNYXNrKGJ5dGVbXSBtYXNrKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJuZXQgbWFzay4KLSAgICAgKiBAcmV0dXJuIEFuIEluZXRBZGRyZXNzIHZhbHVlLgotICAgICAqLwotICAgIEluZXRBZGRyZXNzIGdldFN1Ym5ldE1hc2soKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhpcyBJUCByYW5nZSBjb250YWlucyBhIGNlcnRhaW4gbWFjaGluZS4KLSAgICAgKiBAcGFyYW0gbWFjaGluZSBUaGUgbWFjaGluZSB0byBjaGVjayBmb3IuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBjb250YWlucyhNYWNoaW5lIG1hY2hpbmUpOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgSVAgcmFuZ2UuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSBzYXZlIGZhaWxlZAotICAgICAqLwotICAgIHZvaWQgc2F2ZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIERlbGV0ZSBhbiBJUCByYW5nZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgdGhlIGRlbGV0ZSBmYWlsZWQKLSAgICAgKi8KLSAgICB2b2lkIGRlbGV0ZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSVBSYW5nZU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSVBSYW5nZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhM2E0Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0lQUmFuZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjOwotCi0vKioKLSAqIEFuIElQIHJhbmdlIG1hbmFnZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBSYW5nZU1hbmFnZXIgZXh0ZW5kcyBJdGVtTWFuYWdlciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBJUCByYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIElQIHJhbmdlcy4KLSAgICAgKi8KLSAgICBJUFJhbmdlW10gZ2V0SVBSYW5nZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIGdpdmVuIElQIHJhbmdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQgSVAgcmFuZ2UgdGhhdCBpcyB0byBiZSBhZGRlZAotICAgICAqIEByZXR1cm4gQW4gSVAgcmFuZ2UuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIElQIHJhbmdlIGlzIGFscmVhZHkgY29udGFpbmVkLgotICAgICAqLwotICAgIElQUmFuZ2UgYWRkKFN0cmluZyBpZCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBnaXZlbiBJUCByYW5nZQotICAgICAqCi0gICAgICogQHBhcmFtIHJhbmdlIElQIHJhbmdlIHRoYXQgaXMgdG8gYmUgcmVtb3ZlZAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHRoZSBJUCByYW5nZSBpcyBub3QgY29udGFpbmVkLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlKElQUmFuZ2UgcmFuZ2UpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgSVBSYW5nZSB3aXRoIHRoZSBnaXZlbiBpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByYW5nZUlkIHVzZXIgaWQgb2YgcmVxdWVzdGVkIElQIHJhbmdlCi0gICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIElQIHJhbmdlIG9yIG51bGwgaWYgdGhlcmUgaXMKLSAgICAgKiBubyBJUCByYW5nZSB3aXRoIHRoZSBnaXZlbiBpZAotICAgICAqLwotICAgIElQUmFuZ2UgZ2V0SVBSYW5nZShTdHJpbmcgcmFuZ2VJZCk7Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9JZGVudGlmaWFibGUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSWRlbnRpZmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZGU3MGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9JZGVudGlmaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLS8qKgotICogQSBtYXJrZXIgaW50ZXJmYWNlIHRvIG1hcmsgYW4ge0BsaW5rIEFjY3JlZGl0YWJsZX0gYXMgaWRlbnRpZmlhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZSBleHRlbmRzIEFjY3JlZGl0YWJsZSB7Ci0gICAgLy8gaW1wbGVtZW50IGhlcmUKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSWRlbnRpdHkuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSWRlbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzNGUxOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0lkZW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLQotLyoqCi0gKiBJZGVudGl0eSBvYmplY3QuIFVzZWQgdG8gc3RvcmUgdGhlIGF1dGhlbnRpY2F0ZWQgYWNjcmVkaXRhYmxlcyBpbiB0aGUgc2Vzc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlLCBTZXJpYWxpemFibGUgewotICAgIC8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgU2V0IGlkZW50aWZpYWJsZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIElkZW50aXR5KExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKHRoaXMsIGxvZ2dlcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoaXMgaWRlbnRpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgYWRkSWRlbnRpZmlhYmxlKFdvcmxkLmdldEluc3RhbmNlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluIHRoZSBjYXNlIG9mIFRvbWNhdCB0aGUgb2JqZWN0IHdpbGwgYmUgc2VyaWFsaXplZCB0byBUT01DQVQvd29yay9TdGFuZGFsb25lL2xvY2FsaG9zdC9sZW55YS9TRVNTSU9OUy5zZXIKLSAgICAgKiBAcGFyYW0gb3V0IE91dHB1dFN0cmVhbSB0byBob2xkIHRoZSBzZXJpYWxpemVkIGlkZW50aXR5Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdCh0aGlzLmlkZW50aWZpYWJsZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluIGNhc2Ugb2YgVG9tY2F0IHRoZSBvYmplY3Qgd2lsbCBiZSByZXN0b3JlZCBmcm9tIFRPTUNBVC93b3JrL1N0YW5kYWxvbmUvbG9jYWxob3N0L2xlbnlhL1NFU1NJT05TLnNlcgotICAgICAqIEBwYXJhbSBpbiBJbnB1dFN0cmVhbSB0aGF0IGhvbGRzIHRoZSBzZXJpYWxpemVkIGlkZW50aXR5Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICB0aGlzLmlkZW50aWZpYWJsZXMgPSAoU2V0KSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWRlbnRpZmlhYmxlcyBvZiB0aGlzIGlkZW50aXR5LgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgaWRlbnRpZmlhYmxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSWRlbnRpZmlhYmxlW10gZ2V0SWRlbnRpZmlhYmxlcygpIHsKLSAgICAgICAgcmV0dXJuIChJZGVudGlmaWFibGVbXSkgdGhpcy5pZGVudGlmaWFibGVzLnRvQXJyYXkobmV3IElkZW50aWZpYWJsZVt0aGlzLmlkZW50aWZpYWJsZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBpZGVudGlmaWFibGUgdG8gdGhpcyBpZGVudGl0eS4KLSAgICAgKiBAcGFyYW0gaWRlbnRpZmlhYmxlIFRoZSBpZGVudGlmaWFibGUgdG8gYWRkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlKSB7Ci0gICAgICAgIGFzc2VydCBpZGVudGlmaWFibGUgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IGlkZW50aWZpYWJsZSAhPSB0aGlzOwotICAgICAgICBhc3NlcnQgIXRoaXMuaWRlbnRpZmlhYmxlcy5jb250YWlucyhpZGVudGlmaWFibGUpOwotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQWRkaW5nIGlkZW50aWZpYWJsZTogWyIgKyBpZGVudGlmaWFibGUgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5pZGVudGlmaWFibGVzLmFkZChpZGVudGlmaWFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgQWNjcmVkaXRhYmxlI2dldEFjY3JlZGl0YWJsZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBBY2NyZWRpdGFibGVbXSBnZXRBY2NyZWRpdGFibGVzKCkgewotICAgICAgICBTZXQgYWNjcmVkaXRhYmxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIElkZW50aWZpYWJsZVtdIF9pZGVudGlmaWFibGVzID0gZ2V0SWRlbnRpZmlhYmxlcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2lkZW50aWZpYWJsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEFjY3JlZGl0YWJsZVtdIGdyb3VwQWNjcmVkaXRhYmxlcyA9IF9pZGVudGlmaWFibGVzW2ldLmdldEFjY3JlZGl0YWJsZXMoKTsKLSAgICAgICAgICAgIGFjY3JlZGl0YWJsZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ3JvdXBBY2NyZWRpdGFibGVzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKEFjY3JlZGl0YWJsZVtdKSBhY2NyZWRpdGFibGVzLnRvQXJyYXkobmV3IEFjY3JlZGl0YWJsZVthY2NyZWRpdGFibGVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgQWNjcmVkaXRhYmxlW10gYWNjcmVkaXRhYmxlcyA9IGdldEFjY3JlZGl0YWJsZXMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjY3JlZGl0YWJsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAiICsgYWNjcmVkaXRhYmxlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc3RyaW5nID0gIltpZGVudGl0eToiICsgYnVmLnRvU3RyaW5nKCkgKyAiXSI7Ci0KLSAgICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhpcyBpZGVudGl0eSBiZWxvbmdzIHRvIGEgY2VydGFpbiBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIgdG8gY2hlY2sgZm9yLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oQWNjcmVkaXRhYmxlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVzZXIgdXNlciA9IGdldFVzZXIoKTsKLSAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGhpc0lkID0gdXNlci5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0SWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBvdGhlcklkID0gbWFuYWdlci5nZXRJZCgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXNJZC5lcXVhbHMob3RoZXJJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIG9mIHRoaXMgaWRlbnRpdHkuCi0gICAgICogQHJldHVybiBBIHVzZXIuCi0gICAgICovCi0gICAgcHVibGljIFVzZXIgZ2V0VXNlcigpIHsKLSAgICAgICAgVXNlciB1c2VyID0gbnVsbDsKLSAgICAgICAgSWRlbnRpZmlhYmxlW10gX2lkZW50aWZpYWJsZXMgPSBnZXRJZGVudGlmaWFibGVzKCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKHVzZXIgPT0gbnVsbCAmJiBpIDwgX2lkZW50aWZpYWJsZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpZiAoX2lkZW50aWZpYWJsZXNbaV0gaW5zdGFuY2VvZiBVc2VyKSB7Ci0gICAgICAgICAgICAgICAgdXNlciA9IChVc2VyKSBfaWRlbnRpZmlhYmxlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYWNoaW5lIG9mIHRoaXMgaWRlbnRpdHkuCi0gICAgICogQHJldHVybiBBIG1hY2hpbmUuCi0gICAgICovCi0gICAgcHVibGljIE1hY2hpbmUgZ2V0TWFjaGluZSgpIHsKLSAgICAgICAgTWFjaGluZSBtYWNoaW5lID0gbnVsbDsKLSAgICAgICAgSWRlbnRpZmlhYmxlW10gX2lkZW50aWZpYWJsZXMgPSBnZXRJZGVudGlmaWFibGVzKCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKG1hY2hpbmUgPT0gbnVsbCAmJiBpIDwgX2lkZW50aWZpYWJsZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpZiAoX2lkZW50aWZpYWJsZXNbaV0gaW5zdGFuY2VvZiBNYWNoaW5lKSB7Ci0gICAgICAgICAgICAgICAgbWFjaGluZSA9IChNYWNoaW5lKSBfaWRlbnRpZmlhYmxlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFjaGluZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhpcyBpZGVudGl0eSBjb250YWlucyBhIGNlcnRhaW4gaWRlbnRpZmlhYmxlLgotICAgICAqIEBwYXJhbSBpZGVudGlmaWFibGUgVGhlIGlkZW50aWZpYWJsZSB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkZW50aWZpYWJsZXMuY29udGFpbnMoaWRlbnRpZmlhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGZXRjaGVzIHRoZSBpZGVudGl0eSBmcm9tIGEgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgc2Vzc2lvbi4KLSAgICAgKiBAcmV0dXJuIEFuIGlkZW50aXR5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSWRlbnRpdHkgZ2V0SWRlbnRpdHkoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIElkZW50aXR5IGlkZW50aXR5ID0gKElkZW50aXR5KSBzZXNzaW9uLmdldEF0dHJpYnV0ZShJZGVudGl0eS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gaWRlbnRpdHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNlcnRhaW4gaWRlbnRpZmlhYmxlIGZyb20gdGhlIGlkZW5pdHkuCi0gICAgICogQHBhcmFtIGlkZW50aWZpYWJsZSBBbiBpZGVudGlmaWFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUpIHsKLSAgICAgICAgYXNzZXJ0IHRoaXMuaWRlbnRpZmlhYmxlcy5jb250YWlucyhpZGVudGlmaWFibGUpOwotICAgICAgICB0aGlzLmlkZW50aWZpYWJsZXMucmVtb3ZlKGlkZW50aWZpYWJsZSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Jbmhlcml0aW5nUG9saWN5TWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Jbmhlcml0aW5nUG9saWN5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTgzNzcyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSW5oZXJpdGluZ1BvbGljeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlcjsKLQotLyoqCi0gKiBQb2xpY3kgbWFuYWdlciB3aGljaCBpbmhlcml0cyBjcmVkZW50aWFscyBpbiBhIHBvbGljeSB0cmVlLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaGVyaXRpbmdQb2xpY3lNYW5hZ2VyIGV4dGVuZHMgUG9saWN5TWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBzdWJ0cmVlIHBvbGljeSBmcm9tIGEgZmlsZS4gV2hlbiB0aGUgZmlsZSBpcyBub3QgcHJlc2VudCwgYW4gZW1wdHkgcG9saWN5IGlzCi0gICAgICogcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGFjY2VzcyBjb250cm9sbGVyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgaW5zaWRlIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICogQHJldHVybiBBIHBvbGljeS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBQb2xpY3kgYnVpbGRTdWJ0cmVlUG9saWN5KEFjY3JlZGl0YWJsZU1hbmFnZXIgY29udHJvbGxlciwgU3RyaW5nIHVybCkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXhpc3RpbmcgcG9saWNpZXMgZm9yIGFsbCBVUkwgc3RlcHMgaW4gYm90dG9tLXVwIG9yZGVyLCBlbmRpbmcgd2l0aCB0aGUgcm9vdCBwb2xpY3kuCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGFjY3JlZGl0YWJsZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgaW5zaWRlIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBwb2xpY2llcy4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBQb2xpY3lbXSBnZXRQb2xpY2llcyhBY2NyZWRpdGFibGVNYW5hZ2VyIGNvbnRyb2xsZXIsIFN0cmluZyB1cmwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgYSBTdWJ0cmVlIHBvbGljeS4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdG8gc2F2ZSB0aGUgcG9saWN5IGZvci4KLSAgICAgKiBAcGFyYW0gcG9saWN5IFRoZSBwb2xpY3kgdG8gc2F2ZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICB2b2lkIHNhdmVTdWJ0cmVlUG9saWN5KFN0cmluZyB1cmwsIFBvbGljeSBwb2xpY3kpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0l0ZW0uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njc1MzM0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ0VuYWJsZWQ7Ci0KLQotLyoqCi0gKiBBbiBpdGVtIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIGEgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVtIGV4dGVuZHMgTG9nRW5hYmxlZCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSUQuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIEEgc3RyaW5nLgotICAgICAqLwotICAgIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlcyB0aGlzIGl0ZW0uCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBpdGVtIG1hbmFnZXIgdGhpcyBpdGVtIGJlbG9uZ3MgdG8uCi0gICAgICovCi0gICAgSXRlbU1hbmFnZXIgZ2V0SXRlbU1hbmFnZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9JdGVtTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9JdGVtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjU1ZTcxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSXRlbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLS8qKgotICogSXRlbSBtYW5hZ2VyLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1NYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gaXRlbSBtYW5hZ2VyIGxpc3RlbmVyLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkLgotICAgICAqLwotICAgIHZvaWQgYWRkSXRlbU1hbmFnZXJMaXN0ZW5lcihJdGVtTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gbWFuYWdlciBsaXN0ZW5lci4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZS4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUl0ZW1NYW5hZ2VyTGlzdGVuZXIoSXRlbU1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlciB0aGlzIGl0ZW0gbWFuYWdlciBiZWxvbmdzIHRvLgotICAgICAqLwotICAgIEFjY3JlZGl0YWJsZU1hbmFnZXIgZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9JdGVtTWFuYWdlckxpc3RlbmVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0l0ZW1NYW5hZ2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2ODU3MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0l0ZW1NYW5hZ2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhbGxvd3MgbGlzdGVuaW5nIHRvIG9iamVjdHMgdGhhdCBtYW5hZ2VzIGl0ZW1zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1NYW5hZ2VyTGlzdGVuZXIgewotCi0gICAgLyoqCi0JICogQ2FsbGVkIHdoZW4gYW4gYWNjcmVkaXRhYmxlIHdhcyBhZGRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0aGF0IHdhcyBhZGRlZC4KLQkgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMuCi0JICovCi0gICAgdm9pZCBpdGVtQWRkZWQoSXRlbSBpdGVtKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotCSAqIENhbGxlZCB3aGVuIGFuIGFjY3JlZGl0YWJsZSB3YXMgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0aGF0IHdhcyByZW1vdmVkLgotCSAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KLQkgKi8KLSAgICB2b2lkIGl0ZW1SZW1vdmVkKEl0ZW0gaXRlbSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSXRlbVV0aWwuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvSXRlbVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0MmQ5ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL0l0ZW1VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy52YWxpZGF0b3IuRW1haWxWYWxpZGF0b3I7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWNjZXNzIGNvbnRyb2wgaXRlbXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtVXRpbCB7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBJRC4KLSAgICAgKiBAcGFyYW0gaWQgVGhlIHN0cmluZyB0byB0ZXN0LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBpZCAhPSBudWxsICYmIGlkLm1hdGNoZXMoIlxcdysiKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuCi0gICAgICogQHBhcmFtIGVtYWlsIFRoZSBzdHJpbmcuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFbWFpbChTdHJpbmcgZW1haWwpIHsKLSAgICAgICAgcmV0dXJuIEVtYWlsVmFsaWRhdG9yLmdldEluc3RhbmNlKCkuaXNWYWxpZChlbWFpbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL01hY2hpbmUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvTWFjaGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJmN2EwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvTWFjaGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgbWFjaGluZSAocmVwcmVzZW50aW5nIGFuIElQIGFkZHJlc3MpLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgTWFjaGluZSBpbXBsZW1lbnRzIElkZW50aWZpYWJsZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBtYWNoaW5lIG9iamVjdC4gVGhpcyBtZXRob2QgYWNjZXB0cwotICAgICAqIG51bWVyaWMgSVB2NCBhZGRyZXNzZXMgbGlrZSA8Y29kZT4iMTI5LjE2OC4wLjMyIjwvY29kZT4sCi0gICAgICogbnVtZXJpYyBJUHY2IGFkZHJlc3NlcyBsaWtlIDxjb2RlPiIxMDgwOjo4OjgwMDoyMDBDOjQxN0EiPC9jb2RlPgotICAgICAqIGFzIHdlbGwgYXMgaG9zdG5hbWVzIChpZiBETlMgcmVzb2x1dGlvbiBpcyBhdmFpbGFibGUpIGxpa2UKLSAgICAgKiA8Y29kZT4ibG9jYWxob3N0IjwvY29kZT4gb3IgPGNvZGU+Ind3dy5hcGFjaGUuY29tIjwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGlwIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBsaWtlIDxjb2RlPiIxOTIuMTY4LjAuMzIiPC9jb2RlPiwKLSAgICAgKiAgICAgIDxjb2RlPiI6OjEiPC9jb2RlPiwgLi4uCi0gICAgICogLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHRoZSBjb252ZXJzaW9uIG9mIHRoZQotICAgICAqICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhbiA8Y29kZT5JbmV0QWRkcmVzczwvY29kZT4gZmFpbGVkCi0gICAgICovCi0gICAgcHVibGljIE1hY2hpbmUoU3RyaW5nIGlwKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5TmFtZShpcCkpOwotICAgICAgICB9IGNhdGNoKFVua25vd25Ib3N0RXhjZXB0aW9uIHVoZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAoIkZhaWxlZCB0byBjb252ZXJ0IGFkZHJlc3MgWyIgKyBpcCArICJdOiAiLCB1aGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBhZGRyZXNzOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlck9iamVjdCkgewotICAgICAgICBib29sZWFuIGVxdWFscyA9IGZhbHNlOwotCi0gICAgICAgIGlmIChvdGhlck9iamVjdCBpbnN0YW5jZW9mIE1hY2hpbmUpIHsKLSAgICAgICAgICAgIE1hY2hpbmUgb3RoZXJNYWNoaW5lID0gKE1hY2hpbmUpIG90aGVyT2JqZWN0OwotICAgICAgICAgICAgZXF1YWxzID0gZ2V0QWRkcmVzcygpLmVxdWFscyhvdGhlck1hY2hpbmUuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcXVhbHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0QWRkcmVzcygpLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZSNnZXRBY2NyZWRpdGFibGVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjcmVkaXRhYmxlW10gZ2V0QWNjcmVkaXRhYmxlcygpIHsKLSAgICAgICAgQWNjcmVkaXRhYmxlW10gcmFuZ2VzID0gZ2V0SVBSYW5nZXMoKTsKLSAgICAgICAgQWNjcmVkaXRhYmxlW10gYWNjcmVkaXRhYmxlcyA9IG5ldyBBY2NyZWRpdGFibGVbcmFuZ2VzLmxlbmd0aCArIDFdOwotICAgICAgICBhY2NyZWRpdGFibGVzWzBdID0gdGhpczsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFjY3JlZGl0YWJsZXNbaSsxXSA9IHJhbmdlc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWNjcmVkaXRhYmxlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJUCBhZGRyZXNzLgotICAgICAqIEByZXR1cm4gVGhlIElQIGFkZHJlc3MuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJcCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGFuIElQIGFkZHJlcy4KLSAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBJUCBhZGRyZXNzLCByZXByZXNlbnRlZCBieSBhIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIEFuIEluZXRBZGRyZXNzIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyB1bm5lY2Vzc2FyeSBhbmQgZG9lcyBub3Qgd29yayBmb3IgSVB2Ni4KLSAgICAgKiAgICAgIFVzZSA8Y29kZT5JbmV0QWRkcmVzcy5nZXRCeU5hbWUoc3RyaW5nKTwvY29kZT4gaW5zdGVhZCEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEluZXRBZGRyZXNzIGdldEFkZHJlc3MoU3RyaW5nIHN0cmluZykKLSAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc3RyaW5nLnNwbGl0KCJcXC4iKTsKLQotICAgICAgICBJbmV0QWRkcmVzcyBhZGRyZXNzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIG51bWJlcnMgPSBuZXcgYnl0ZVtzdHJpbmdzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgbnVtYmVyID0gSW50ZWdlci5wYXJzZUludChzdHJpbmdzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAobnVtYmVyID4gMTI3KSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bWJlciA9IG51bWJlciAtIDI1NjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbnVtYmVyc1tpXSA9IChieXRlKSBudW1iZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MobnVtYmVycyk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29udmVydCBhZGRyZXNzIFsiICsgc3RyaW5nICsgIl06ICIsCi0gICAgICAgICAgICAgICAgICAgIGUxKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgVW5rbm93bkhvc3RFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbnZlcnQgYWRkcmVzcyBbIiArIHN0cmluZyArICJdOiAiLAotICAgICAgICAgICAgICAgICAgICBlMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0SXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJUCBhZGRyZXNzLgotICAgICAqIEByZXR1cm4gQW4gSVAgYWRkcmVzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBJUCBhZGRyZXNzLgotICAgICAqIEBwYXJhbSBfYWRkcmVzcyBBbiBJUCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoSW5ldEFkZHJlc3MgX2FkZHJlc3MpIHsKLSAgICAgICAgdGhpcy5hZGRyZXNzID0gX2FkZHJlc3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGlwUmFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYW4gSVAgcmFuZ2UgdG8gdGhpcyBtYWNoaW5lLgotICAgICAqIEBwYXJhbSByYW5nZSBBbiBJUCByYW5nZSB0aGlzIG1hY2hpbmUgYmVsb25ncyB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJUFJhbmdlKElQUmFuZ2UgcmFuZ2UpIHsKLSAgICAgICAgYXNzZXJ0IHJhbmdlICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCAhdGhpcy5pcFJhbmdlcy5jb250YWlucyhyYW5nZSk7Ci0gICAgICAgIHRoaXMuaXBSYW5nZXMuYWRkKHJhbmdlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSVAgcmFuZ2VzIHRoaXMgbWFjaGluZSBiZWxvbmdzIHRvLgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgSVAgcmFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBJUFJhbmdlW10gZ2V0SVBSYW5nZXMoKSB7Ci0gICAgICAgIHJldHVybiAoSVBSYW5nZVtdKSB0aGlzLmlwUmFuZ2VzLnRvQXJyYXkobmV3IElQUmFuZ2VbdGhpcy5pcFJhbmdlcy5zaXplKCldKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL01vZGlmaWFibGVQb2xpY3kuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvTW9kaWZpYWJsZVBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWVmMmQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvTW9kaWZpYWJsZVBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLS8qKgotICogTW9kaWZpYWJsZSBwb2xpY3kuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kaWZpYWJsZVBvbGljeSBleHRlbmRzIFBvbGljeSB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGlmIHRoaXMgcG9saWN5IHJlcXVpcmVzIFNTTCBwcm90ZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzc2wKLSAgICAgKiAgICAgICAgICAgIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICB2b2lkIHNldFNTTChib29sZWFuIHNzbCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcm9sZSB0byB0aGlzIHBvbGljeSBmb3IgYSBjZXJ0YWluIGFjY3JlZGl0YWJsZSBhbmQgYSBjZXJ0YWluIHJvbGUuCi0gICAgICogSWYgYSBjcmVkZW5pdGFsIGV4aXN0cyBmb3IgdGhlIGFjY3JlZGl0YWJsZSwgdGhlIHJvbGUgaXMgYWRkZWQgdG8gdGhpcwotICAgICAqIGNyZWRlbnRpYWwuIE90aGVyd2lzZSwgYSBuZXcgY3JlZGVudGlhbCBpcyBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY2NyZWRpdGFibGUKLSAgICAgKiAgICAgICAgICAgIEFuIGFjY3JlZGl0YWJsZS4KLSAgICAgKiBAcGFyYW0gcm9sZQotICAgICAqICAgICAgICAgICAgQSByb2xlLgotICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSb2xlKEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUsIFJvbGUgcm9sZSwgU3RyaW5nIG1ldGhvZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcm9sZSBmcm9tIHRoaXMgcG9saWN5IGZvciBhIGNlcnRhaW4gYWNjcmVkaXRhYmxlIGFuZCBhIGNlcnRhaW4KLSAgICAgKiByb2xlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY2NyZWRpdGFibGUKLSAgICAgKiAgICAgICAgICAgIEFuIGFjY3JlZGl0YWJsZS4KLSAgICAgKiBAcGFyYW0gcm9sZQotICAgICAqICAgICAgICAgICAgQSByb2xlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhY2NyZWRpdGFibGUtcm9sZSBwYWlyIGlzIG5vdCBjb250YWluZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlLCBSb2xlIHJvbGUpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIHJvbGVzIGZyb20gdGhpcyBwb2xpY3kgZm9yIGEgY2VydGFpbiBhY2NyZWRpdGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZQotICAgICAqICAgICAgICAgICAgQW4gYWNjcmVkaXRhYmxlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhY2NyZWRpdGFibGUtcm9sZSBwYWlyIGlzIG5vdCBjb250YWluZWQuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVSb2xlcyhBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIGEgcm9sZSB1cCB0aGUgY3JlZGVudGlhbCB0cmVlLCBnaXZpbmcgaXQgaGlnaGVyIHByaW9yaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY2NyZWRpdGFibGUKLSAgICAgKiBAcGFyYW0gcm9sZQotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1vdmVSb2xlVXAoQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSwgUm9sZSByb2xlKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyBhIHJvbGUgZG93biB0aGUgY3JlZGVudGlhbCB0cmVlLCBkZWNyZWFzaW5nIGl0cyBwcmlvcml0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWNjcmVkaXRhYmxlCi0gICAgICogQHBhcmFtIHJvbGUKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb3ZlUm9sZURvd24oQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSwgUm9sZSByb2xlKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvUGFzc3dvcmQuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvUGFzc3dvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkYWJiOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1Bhc3N3b3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotCi0vKioKLSAqIEVuY3J5cHQgcGxhaW4gdGV4dCBwYXNzd29yZAotICogRXhhbXBsZTogIm1lc3NhZ2UgZGlnZXN0IiBiZWNvbWVzICJmOTZiNjk3ZDdjYjc5MzhkNTI1YTJmMzFhYWYxNjFkMCIgKGhleGFkZWNpbWFsIG5vdGF0aW9uICgzMiBjaGFyYWN0ZXJzKSkKLSAqLwotcHVibGljIGNsYXNzIFBhc3N3b3JkIHsKLQotICAgIC8qKgotICAgICAqIEVuY3J5cHQgcGxhaW4gdGV4dCBwYXNzd29yZAotICAgICAqCi0gICAgICogQHBhcmFtIHBsYWluIHBsYWluIHRleHQgcGFzc3dvcmQKLSAgICAgKiBAcmV0dXJuIGVuY3J5cHRlZCBwYXNzd29yZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY3J5cHQoU3RyaW5nIHBsYWluKSB7Ci0gICAgICAgIHJldHVybiBnZXRNRDUocGxhaW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIE1ENSByZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gcGxhaW4gVGhlIHBsYWluIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ENShTdHJpbmcgcGxhaW4pIHsKLSAgICAgICAgTWVzc2FnZURpZ2VzdCBtZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOwotICAgICAgICB9IGNhdGNoIChqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5naWZ5KG1kLmRpZ2VzdChwbGFpbi5nZXRCeXRlcygpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBieXRlIGJ1ZmZlciB0byBhIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyaW5naWZ5KGJ5dGVbXSBidWYpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyICogYnVmLmxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBoID0gKGJ1ZltpXSAmIDB4ZjApID4+IDQ7Ci0gICAgICAgICAgICBpbnQgbCA9IChidWZbaV0gJiAweDBmKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXcgQ2hhcmFjdGVyKChjaGFyKSAoKGggPiA5KSA/ICgoJ2EnICsgaCkgLSAxMCkgOiAoJzAnICsgaCkpKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3IENoYXJhY3RlcigoY2hhcikgKChsID4gOSkgPyAoKCdhJyArIGwpIC0gMTApIDogKCcwJyArIGwpKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Qb2xpY3kuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvUG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDM1NWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Qb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLS8qKgotICogQSBwb2xpY3kgYXNzaWducyByb2xlcyB0byBhY2NyZWRpdGFibGVzIHVzaW5nIGNyZWRlbnRpYWxzLgotICogQWRkaXRpb25hbGx5LCBTU0wgcHJvdGVjdGlvbiBpcyBkZWZpbmVkLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9saWN5IHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaWRlbnRpdHkgd2FzIG5vdCBtYXRjaGVkIGluIHRoaXMgcG9saWN5LgotICAgICAqLwotICAgIGludCBSRVNVTFRfTk9UX01BVENIRUQgPSAwOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSByb2xlIGlzIGRlbmllZCBmb3IgdGhlIGlkZW50aXR5LgotICAgICAqLwotICAgIGludCBSRVNVTFRfREVOSUVEID0gMTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgcm9sZSBpcyBncmFudGVkIGZvciB0aGUgaWRlbnRpdHkuCi0gICAgICovCi0gICAgaW50IFJFU1VMVF9HUkFOVEVEID0gMjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBjZXJ0YWluIHJvbGUgaXMgZ3JhbnRlZCBmb3IgYSBjZXJ0YWluIHBvbGljeS4KLSAgICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIGlkZW50aXR5LgotICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gQSByZXN1bHQgY29kZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBpbnQgY2hlY2soSWRlbnRpdHkgaWRlbnRpdHksIFJvbGUgcm9sZSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIHBvbGljeSByZXF1aXJlcyBTU0wgcHJvdGVjdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzU1NMUHJvdGVjdGVkKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgcG9saWN5IGlzIGVtcHR5LiBBIHBvbGljeSBpcyBlbXB0eSBpZiBpdCBkb2VzCi0gICAgICogbm90IGNvbnRhaW4gYW55IGNyZWRlbnRpYWxzLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNFbXB0eSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgaWRlbnRpdHkuCi0gICAgICogQHJldHVybiBBbGwgY3JlZGVudGlhbHMgZGVmaW5lZCBieSB0aGlzIHBvbGljeSBmb3IgdGhpcyBpZGVudGl0eS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIENyZWRlbnRpYWxbXSBnZXRDcmVkZW50aWFscyhJZGVudGl0eSBpZGVudGl0eSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBbGwgY3JlZGVudGlhbHMgZGVmaW5lZCBieSB0aGlzIHBvbGljeS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIENyZWRlbnRpYWxbXSBnZXRDcmVkZW50aWFscygpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1BvbGljeU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvUG9saWN5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDYzNTI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvUG9saWN5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotCi0vKioKLSAqIEEgcG9saWN5IG1hbmFnZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb2xpY3lNYW5hZ2VyIGV4dGVuZHMgQ29tcG9uZW50IHsKLQotICAgIC8qKgotICAgICAqIFRoZSBBdmFsb24gcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IFBvbGljeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9saWN5IGZvciBhIGdpdmVuIHBhZ2UuCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCBpbnNpZGUgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIFRoZSBwb2xpY3kuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgUG9saWN5IGdldFBvbGljeShBY2NyZWRpdGFibGVNYW5hZ2VyIGNvbnRyb2xsZXIsIFN0cmluZyB1cmwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgZ3JhbnRlZCByb2xlcyBmb3IgYSBjZXJ0YWluIGlkZW50aXR5IG9uIGEgY2VydGFpbiBVUkwuCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZU1hbmFnZXIgVGhlIGFjY3JlZGl0YWJsZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgaWRlbnRpdHkuCi0gICAgICogQHBhcmFtIHVybCBUaGUgVVJMLgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Ygcm9sZXMuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBSb2xlW10gZ2V0R3JhbnRlZFJvbGVzKEFjY3JlZGl0YWJsZU1hbmFnZXIgYWNjcmVkaXRhYmxlTWFuYWdlciwgSWRlbnRpdHkgaWRlbnRpdHksIFN0cmluZyB1cmwpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbGwgY3JlZGVudGlhbHMgZm9yIHRoaXMgdXJsCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIEFjY3JlZGl0YWJsZSBNYW5hZ2VyCi0gICAgICogQHBhcmFtIHVybCBUaGUgQUMgdXJsCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBjcmVkZW50aWFscwotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIENyZWRlbnRpYWxbXSBnZXRDcmVkZW50aWFscyhBY2NyZWRpdGFibGVNYW5hZ2VyIGNvbnRyb2xsZXIsIFN0cmluZyB1cmwpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGFuIGFjY3JlZGl0YWJsZSB3YXMgYWRkZWQuIFVzZWQgdG8gY3JlYXRlIHRoZSBhZG1pbiBpbnRlcmZhY2UKLSAgICAgKiBwb2xpY3kuIFRoaXMgbWV0aG9kIGdldCBpbnZva2VkLCB3aGVuIGUuZy4gYSBuZXcgdXNlciBpcyBhZGRlZC4gVGhlIHVzZXIKLSAgICAgKiBhbHdheXMgc2hvdWxkIGJlIGFibGUgdG8gZWRpdCBoZXIgcHJvZmlsZS4gVGhlcmVmb3JlIHRoZSBtZXRob2Qgbm9ybWFsbHkKLSAgICAgKiBncmFudCBpbmhlcml0IGVkaXQgcmlnaHRzIHRvIHRoZSB1c2VyIHByb2ZpbGUgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIgdGhlIGFjY3JlZGl0YWJsZSBiZWxvbmdlZCB0by4KLSAgICAgKiBAcGFyYW0gYWNjcmVkaXRhYmxlIFRoZSBhY2NyZWRpdGFibGUgdGhhdCB3YXMgcmVtb3ZlZC4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICB2b2lkIGFjY3JlZGl0YWJsZUFkZGVkKEFjY3JlZGl0YWJsZU1hbmFnZXIgbWFuYWdlciwgQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYW4gYWNjcmVkaXRhYmxlIHdhcyByZW1vdmVkLiBVc2VkIHRvIGNsZWFuIHVwIHRoZSBwb2xpY2llcwotICAgICAqIGFuZCB0byByZW1vdmUgdGhlIGFkbWluIGludGVyZmFjZSBwb2xpY3kuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIGFjY3JlZGl0YWJsZSBtYW5hZ2VyIHRoZSBhY2NyZWRpdGFibGUgYmVsb25nZWQgdG8uCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZSBUaGUgYWNjcmVkaXRhYmxlIHRoYXQgd2FzIHJlbW92ZWQuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgdm9pZCBhY2NyZWRpdGFibGVSZW1vdmVkKEFjY3JlZGl0YWJsZU1hbmFnZXIgbWFuYWdlciwgQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1JvbGUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM4MjNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotLyoqCi0gKiBUaGUgcm9sZSBpbnRlcmZhY2UuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZSBleHRlbmRzIEl0ZW0gewotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgdGhlIHJvbGUgbWF5IGJlIGFzc2lnbmVkIHRvIGFjY3JlZGl0YWJsZXMgaW4gcG9saWNpZXMuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0Fzc2lnbmFibGUoKTsKLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1JvbGVNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1JvbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTM3ZWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Sb2xlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotLyoqCi0gKiBSb2xlIG1hbmFnZXIuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZU1hbmFnZXIgZXh0ZW5kcyBJdGVtTWFuYWdlciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByb2xlIGZvciB0aGUgZ2l2ZW4gSUQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm9sZUlkIFRoZSBuYW1lIG9mIHRoZSByb2xlIHJlcXVlc3RlZC4KLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Um9sZTwvY29kZT4gb3IgbnVsbCBpZiBubyByb2xlIHdpdGggdGhlIGdpdmVuIG5hbWUgZm91bmQKLSAgICAgKi8KLSAgICBSb2xlIGdldFJvbGUoU3RyaW5nIHJvbGVJZCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCByb2xlcwotICAgICAqCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiByb2xlcwotICAgICAqLwotICAgIFJvbGVbXSBnZXRSb2xlcygpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhIHJvbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSByb2xlIFJvbGUgdG8gYWRkCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIHJvbGUgaXMgYWxyZWFkeSBjb250YWluZWQuCi0gICAgICovCi0gICAgdm9pZCBhZGQoUm9sZSByb2xlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSByb2xlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm9sZSBSb2xlIHRvIHJlbW92ZQotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHRoZSByb2xlIGlzIG5vdCBjb250YWluZWQuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmUoUm9sZSByb2xlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1VzZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU3MTg4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvVXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWM7Ci0KLS8qKgotICogQSB1c2VyLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXIgZXh0ZW5kcyBJZGVudGlmaWFibGUsIEl0ZW0sIEdyb3VwYWJsZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBlbWFpbCBhZGRyZXNzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotICAgICAqLwotICAgIFN0cmluZyBnZXRFbWFpbCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW1haWwgYWRkcmVzcwotICAgICAqCi0gICAgICogQHBhcmFtIGVtYWlsIHRoZSBuZXcgZW1haWwgYWRkcmVzcwotICAgICAqLwotICAgIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXNzd29yZC4KLSAgICAgKiBAcGFyYW0gcGxhaW5UZXh0UGFzc3dvcmQgVGhlIHBsYWluIHRleHQgcGFzc3dvcmQuCi0gICAgICovCi0gICAgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGxhaW5UZXh0UGFzc3dvcmQpOwotICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHN1cHBvcnQgZm9yIGNoYW5naW5nIHBhc3N3b3JkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHBhc3N3b3JkIGNoYW5nZSBpcyBzdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5DaGFuZ2VQYXNzd29yZCgpOwotIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXIncyBwcmVmZXJyZWQgbG9jYWxlIGZvciB0aGUgTGVueWEKLSAgICAgKiBDTVMgbWVudXMgYW5kIENNUyBzY3JlZW5zLgotICAgICAqIAotICAgICAqIFRoZSBsb2NhbGUgY2FuIGVpdGhlciBiZSBhIDIgbGV0dGVyIGNvdW50cnkgY29kZSAKLSAgICAgKiAoZGUsIGVuKSBvciBhIGxvY2FsZSBjb2RlIGFjY29yZGluZyB0byBSRkMgMTc2NiAvCi0gICAgICogSVNPIDYzOSAvIElTTyAzMTY2IChkZV9ERSwgZGVfQ0gsIGRlX0FULCBlbl9VUywgLi4uKSAgCi0gICAgICogQHJldHVybiBUaGUgbG9jYWxlLgotICAgICAqLwotICAgIFN0cmluZyBnZXREZWZhdWx0TWVudUxvY2FsZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHVzZXIncyBwcmVmZXJyZWQgbG9jYWxlIGZvciB0aGUgTGVueWEKLSAgICAgKiBtZW51IGFuZCBDTVMgc2NyZWVucy4KLSAgICAgKiAKLSAgICAgKiBUaGUgbG9jYWxlIGNhbiBlaXRoZXIgYmUgYSAyIGxldHRlciBjb3VudHJ5IGNvZGUgCi0gICAgICogKGRlLCBlbikgb3IgYSBsb2NhbGUgY29kZSBhY2NvcmRpbmcgdG8gUkZDIDE3NjYgLwotICAgICAqIElTTyA2MzkgLyBJU08gMzE2NiAoZGVfREUsIGRlX0NILCBkZV9BVCwgZW5fVVMsIC4uLikKLSAgICAgKiBAcGFyYW0gbWVudUxvY2FsZSBUaGUgbG9jYWxlLgotICAgICAqLwotICAgIHZvaWQgc2V0RGVmYXVsdE1lbnVMb2NhbGUoU3RyaW5nIG1lbnVMb2NhbGUpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXIncyBkZWZhdWx0IGxvY2FsZSBvZiBkb2N1bWVudHMKLSAgICAgKiB0byBiZSBjcmVhdGVkIG9yIGVkaXRlZC4KLSAgICAgKiAKLSAgICAgKiBUaGUgbG9jYWxlIGNhbiBlaXRoZXIgYmUgYSAyIGxldHRlciBjb3VudHJ5IGNvZGUgCi0gICAgICogKGRlLCBlbikgb3IgYSBsb2NhbGUgY29kZSBhY2NvcmRpbmcgdG8gUkZDIDE3NjYgLwotICAgICAqIElTTyA2MzkgLyBJU08gMzE2NiAoZGVfREUsIGRlX0NILCBkZV9BVCwgZW5fVVMsIC4uLikKLSAgICAgKiBAcmV0dXJuIFRoZSBsb2NhbGUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldERlZmF1bHREb2N1bWVudExvY2FsZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHVzZXIncyBkZWZhdWx0IGxvY2FsZSBvZiBkb2N1bWVudHMKLSAgICAgKiB0byBiZSBjcmVhdGVkIG9yIGVkaXRlZC4KLSAgICAgKiAKLSAgICAgKiBUaGUgbG9jYWxlIGNhbiBlaXRoZXIgYmUgYSAyIGxldHRlciBjb3VudHJ5IGNvZGUgCi0gICAgICogKGRlLCBlbikgb3IgYSBsb2NhbGUgY29kZSBhY2NvcmRpbmcgdG8gUkZDIDE3NjYgLwotICAgICAqIElTTyA2MzkgLyBJU08gMzE2NiAoZGVfREUsIGRlX0NILCBkZV9BVCwgZW5fVVMsIC4uLikKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnRMb2NhbGUgVGhlIGxvY2FsZS4KLSAgICAgKi8KLSAgICB2b2lkIHNldERlZmF1bHREb2N1bWVudExvY2FsZShTdHJpbmcgZG9jdW1lbnRMb2NhbGUpOyAKLSAgICAKLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSB1c2VyCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgdGhlIHNhdmUgZmFpbGVkCi0gICAgICovCi0gICAgdm9pZCBzYXZlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVsZXRlIGEgdXNlcgotICAgICAqCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSBkZWxldGUgZmFpbGVkCi0gICAgICovCi0gICAgdm9pZCBkZWxldGUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBdXRoZW50aWNhdGUgYSB1c2VyLiBUaGlzIGlzIGRvbmUgYnkgZW5jcnlwdGluZwotICAgICAqIHRoZSBnaXZlbiBwYXNzd29yZCBhbmQgY29tcGFyaW5nIHRoaXMgdG8gdGhlCi0gICAgICogZW5jcnlwdGVkUGFzc3dvcmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQgdG8gYXV0aGVudGljYXRlIHdpdGgKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHBhc3N3b3JkIG1hdGNoZXMgdGhlIHBhc3N3b3JkIGZvciB0aGlzIHVzZXIKLSAgICAgKi8KLSAgICBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmcgcGFzc3dvcmQpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFjY3JlZGl0YWJsZSBtYW5hZ2VyIHRoaXMgYWNjcmVkaXRhYmxlIGJlbG9uZ3MgdG8uCi0gICAgICovCi0gICAgQWNjcmVkaXRhYmxlTWFuYWdlciBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1VzZXJNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1VzZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDdjMWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Vc2VyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotLyoqCi0gKiBVc2VyIG1hbmFnZXIuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVXNlck1hbmFnZXIgZXh0ZW5kcyBJdGVtTWFuYWdlciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCB1c2Vycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdXNlcnMKLSAgICAgKi8KLSAgICBVc2VyW10gZ2V0VXNlcnMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHN1cHBvcnRlZCB1c2VyIHR5cGVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB1c2VyIHR5cGVzCi0gICAgICovCi0gICAgVXNlclR5cGVbXSBnZXRVc2VyVHlwZXMoKTsKLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgZ2l2ZW4gdXNlcgotICAgICAqCi0gICAgICogQHBhcmFtIHVzZXIgQSB1c2VyLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIGlzIGFscmVhZHkgY29udGFpbmVkLgotICAgICAqLwotICAgIHZvaWQgYWRkKFVzZXIgdXNlcikgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBnaXZlbiB1c2VyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlciBVc2VyIHRoYXQgaXMgdG8gYmUgcmVtb3ZlZAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIGlzIG5vdCBjb250YWluZWQuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmUoVXNlciB1c2VyKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHVzZXIgd2l0aCB0aGUgZ2l2ZW4gdXNlciBpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VySWQgdXNlciBpZCBvZiByZXF1ZXN0ZWQgdXNlcgotICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCB1c2VyIG9yIG51bGwgaWYgdGhlcmUgaXMKLSAgICAgKiBubyB1c2VyIHdpdGggdGhlIGdpdmVuIHVzZXIgaWQKLSAgICAgKi8KLSAgICBVc2VyIGdldFVzZXIoU3RyaW5nIHVzZXJJZCk7Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Vc2VyVHlwZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Vc2VyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzlmM2JlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvYWMvVXNlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjOwotCi0vKioKLSAqIEEgdXNlciB0eXBlIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgVXNlck1hbmFnZXIKLSAqIE5vdGU6IHRoZSB0eXBlcyBhcmUgY29uZmlndXJlZCB0aHJvdWdoIHRoZSBhY2Nlc3MgY29udHJvbCBjb25maWd1cmF0aW9uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFVzZXJUeXBlICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVVc2VDYXNlOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlclR5cGUoKSB7Ci0JICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBfa2V5IFRoZSBrZXkuCi0gICAgICogQHBhcmFtIF9jbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUuCi0gICAgICogQHBhcmFtIF9jcmVhdGVVc2VDYXNlIFRoZSBjcmVhdGUgdXNlY2FzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlclR5cGUoU3RyaW5nIF9rZXksIFN0cmluZyBfY2xhc3NOYW1lLCBTdHJpbmcgX2NyZWF0ZVVzZUNhc2UpIHsKLQkgIHRoaXMua2V5ID0gX2tleTsKLQkgIHRoaXMuY2xhc3NOYW1lID0gX2NsYXNzTmFtZTsKLQkgIHRoaXMuY3JlYXRlVXNlQ2FzZSA9IF9jcmVhdGVVc2VDYXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUga2V5IHRvIGJlIHVzZWQgZm9yIHRoaXMgdHlwZS4gCi0gICAgICogVGhpcyBrZXkgY2FuIGJlIHVzZWQgZm9yIGEgZGljdGlvbmFyeSBlbnRyeSBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JICByZXR1cm4gdGhpcy5rZXk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUga2V5IHRvIGJlIHVzZWQgZm9yIHRoaXMgdHlwZS4gCi0gICAgICogVGhpcyBrZXkgY2FuIGJlIHVzZWQgZm9yIGEgZGljdGlvbmFyeSBlbnRyeSBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBfa2V5IHRoZSBuZXcga2V5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBfa2V5KSB7Ci0JICB0aGlzLmtleSA9IF9rZXk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZyB0aGlzCi0gICAgICogdHlwZSBvZiB1c2VyLiBOb3RlIHRoYXQgaW4gY3VycmVudCB2ZXJzaW9uLCB0aGlzIGZpZWxkIGlzIGZvcgotICAgICAqIGluZm9ybWF0aW9uIG9ubHk7IGluIGxhdGVyIHZlcnNpb25zLCBpdCBtaWdodCBiZSB1c2VkIGZvcgotICAgICAqIGludHJvc3BlY3Rpb24gYW5kIGR5bmFtaWMgc2NyaXB0IGNyZWF0aW9uLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVVc2VyCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmxkYXAuTERBUFVzZXIKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkgIHJldHVybiB0aGlzLmNsYXNzTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoaXMKLSAgICAgKiB0eXBlIG9mIHVzZXIuIE5vdGUgdGhhdCBpbiBjdXJyZW50IHZlcnNpb24sIHRoaXMgZmllbGQgaXMgZm9yCi0gICAgICogaW5mb3JtYXRpb24gb25seTsgaW4gbGF0ZXIgdmVyc2lvbnMsIGl0IG1pZ2h0IGJlIHVzZWQgZm9yCi0gICAgICogaW50cm9zcGVjdGlvbiBhbmQgZHluYW1pYyBmbG93c2NyaXB0IGNyZWF0aW9uLgotICAgICAqIEBwYXJhbSBfY2xhc3NOYW1lIHRoZSBuZXcgY2xhc3NOYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBfY2xhc3NOYW1lKSB7Ci0JICB0aGlzLmNsYXNzTmFtZSA9IF9jbGFzc05hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgY3JlYXRlVXNlQ2FzZSBuYW1lIHRvIGJlIHVzZWQgd2hlbiBhIHVzZXIgb2YgdGhpcyB0eXBlCi0gICAgICogaXMgdG8gYmUgY3JlYXRlZC4gCi0gICAgICogVGhpcyBuYW1lIHdpbGwgYmUgdXNlZCBpbiB0aGUgZmxvd3NjcmlwdCAoY3VycmVudGx5OiB1c2VyLWFkbWluLmpzKSwKLSAgICAgKiBpbiBvcmRlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpZmZlcmVudCB0eXBlcy4KLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGUgbmFtZSBvZiB0aGUgdXNlIGNhc2UgaW4gdGhlIGZsb3dzY3JpcHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENyZWF0ZVVzZUNhc2UoKSB7Ci0JICByZXR1cm4gdGhpcy5jcmVhdGVVc2VDYXNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNyZWF0ZVVzZUNhc2UgbmFtZSB0byBiZSB1c2VkIHdoZW4gYSB1c2VyIG9mIHRoaXMgdHlwZQotICAgICAqIGlzIHRvIGJlIGNyZWF0ZWQuIAotICAgICAqIFRoaXMgbmFtZSB3aWxsIGJlIHVzZWQgaW4gdGhlIGZsb3dzY3JpcHQgKGN1cnJlbnRseTogdXNlci1hZG1pbi5qcyksCi0gICAgICogaW4gb3JkZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgdHlwZXMuCi0gICAgICogQHBhcmFtIF9jcmVhdGVVc2VDYXNlIHRoZSBuZXcgY3JlYXRlVXNlQ2FzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZVVzZUNhc2UoU3RyaW5nIF9jcmVhdGVVc2VDYXNlKSB7Ci0JICB0aGlzLmNyZWF0ZVVzZUNhc2UgPSBfY3JlYXRlVXNlQ2FzZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1dvcmxkLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2FjL1dvcmxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjVmYmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9hYy9Xb3JsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYzsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBUaGUgd29ybGQuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXb3JsZCBpbXBsZW1lbnRzIElkZW50aWZpYWJsZSwgU2VyaWFsaXphYmxlIHsKLSAgICAKLSAgICAvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgV29ybGQgb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgV29ybGQoKSB7Ci0JICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBXb3JsZCBpbnN0YW5jZTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiB3b3JsZCBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHdvcmxkIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdvcmxkIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgV29ybGQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlI2dldEFjY3JlZGl0YWJsZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBBY2NyZWRpdGFibGVbXSBnZXRBY2NyZWRpdGFibGVzKCkgewotICAgICAgICByZXR1cm4gKEFjY3JlZGl0YWJsZVtdKSBDb2xsZWN0aW9ucy5zaW5nbGV0b24odGhpcykudG9BcnJheShuZXcgQWNjcmVkaXRhYmxlWzFdKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy9Qb2xpY3lVdGlsLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy9Qb2xpY3lVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDhlMWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvUG9saWN5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXJNYW5hZ2VyOwotCi0vKioKLSAqIFBvbGljeSB1dGlsaXR5IGNsYXNzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUG9saWN5VXRpbCB7Ci0KLSAgICAvKioKLSAgICAgKiBGZXRjaGVzIHRoZSBzdG9yZWQgcm9sZXMgZnJvbSB0aGUgcmVxdWVzdC4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIEEgcm9sZSBhcnJheS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gSWYgdGhlIHJlcXVlc3QgZG9lcyBub3QgY29udGFpbiB0aGUgcm9sZXMKLSAgICAgKiAgICAgICAgIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBSb2xlW10gZ2V0Um9sZXMoUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Qgcm9sZUxpc3QgPSAoTGlzdCkgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoUm9sZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIGlmIChyb2xlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYnVmLmFwcGVuZCgiICAgIFVSSTogWyIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSArICJdXG4iKTsKLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAgICBQYXJhbWV0ZXI6IFsiICsga2V5ICsgIl0gPSBbIiArIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKGtleSkgKyAiXVxuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKCJSZXF1ZXN0IFsiICsgcmVxdWVzdCArICJdIGRvZXMgbm90IGNvbnRhaW4gcm9sZXM6IFxuIgotICAgICAgICAgICAgICAgICAgICArIGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJvbGVbXSByb2xlcyA9IChSb2xlW10pIHJvbGVMaXN0LnRvQXJyYXkobmV3IFJvbGVbcm9sZUxpc3Quc2l6ZSgpXSk7Ci0gICAgICAgIHJldHVybiByb2xlczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSB3ZWIgYXBwbGljYXRpb24gVVJMLgotICAgICAqIEBwYXJhbSB1c2VySWQgVGhlIHVzZXIgSUQuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEByZXR1cm4gQSB1c2VyLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVc2VyIGdldFVzZXIoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIHdlYmFwcFVybCwKLSAgICAgICAgICAgIFN0cmluZyB1c2VySWQsIExvZ2dlciBsb2dnZXIpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlclJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlciBjb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgbWFuYWdlci5sb29rdXAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcikgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuREVGQVVMVF9SRVNPTFZFUik7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gcmVzb2x2ZXIucmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIod2ViYXBwVXJsKTsKLQotICAgICAgICAgICAgQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyID0gY29udHJvbGxlci5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9IGFjY3JlZGl0YWJsZU1hbmFnZXIuZ2V0VXNlck1hbmFnZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYW5hZ2VyLmdldFVzZXIodXNlcklkKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSB3ZWIgYXBwbGljYXRpb24gVVJMLgotICAgICAqIEBwYXJhbSByb2xlIFRoZSBJRCBvZiB0aGUgcm9sZS4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIgdG8gdXNlLgotICAgICAqIEByZXR1cm4gQWxsIHVzZXJzIHdoaWNoIGhhdmUgdGhlIHJvbGUgb24gdGhpcyBVUkwuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVzZXJbXSBnZXRVc2Vyc1dpdGhSb2xlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyB3ZWJhcHBVcmwsCi0gICAgICAgICAgICBTdHJpbmcgcm9sZSwgTG9nZ2VyIGxvZ2dlcikgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBBY2Nlc3NDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSBtYW5hZ2VyLmxvb2t1cChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyKSBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5ERUZBVUxUX1JFU09MVkVSKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSByZXNvbHZlci5yZXNvbHZlQWNjZXNzQ29udHJvbGxlcih3ZWJhcHBVcmwpOwotCi0gICAgICAgICAgICBBY2NyZWRpdGFibGVNYW5hZ2VyIGFjY3JlZGl0YWJsZU1hbmFnZXIgPSBjb250cm9sbGVyLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKTsKLSAgICAgICAgICAgIFVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyID0gYWNjcmVkaXRhYmxlTWFuYWdlci5nZXRVc2VyTWFuYWdlcigpOwotICAgICAgICAgICAgVXNlcltdIHVzZXJzID0gdXNlck1hbmFnZXIuZ2V0VXNlcnMoKTsKLSAgICAgICAgICAgIExpc3QgdXNlcnNXaXRoUm9sZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIFBvbGljeU1hbmFnZXIgcG9saWN5TWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0UG9saWN5TWFuYWdlcigpOwotCi0gICAgICAgICAgICBSb2xlIHJvbGVPYmplY3QgPSBhY2NyZWRpdGFibGVNYW5hZ2VyLmdldFJvbGVNYW5hZ2VyKCkuZ2V0Um9sZShyb2xlKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElkZW50aXR5IGlkZW50aXR5ID0gbmV3IElkZW50aXR5KGxvZ2dlcik7Ci0gICAgICAgICAgICAgICAgaWRlbnRpdHkuYWRkSWRlbnRpZmlhYmxlKHVzZXJzW2ldKTsKLSAgICAgICAgICAgICAgICBSb2xlW10gcm9sZXMgPSBwb2xpY3lNYW5hZ2VyLmdldEdyYW50ZWRSb2xlcyhhY2NyZWRpdGFibGVNYW5hZ2VyLCBpZGVudGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlYmFwcFVybCk7Ci0gICAgICAgICAgICAgICAgaWYgKEFycmF5cy5hc0xpc3Qocm9sZXMpLmNvbnRhaW5zKHJvbGVPYmplY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzZXJzV2l0aFJvbGUuYWRkKHVzZXJzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAoVXNlcltdKSB1c2Vyc1dpdGhSb2xlLnRvQXJyYXkobmV3IFVzZXJbdXNlcnNXaXRoUm9sZS5zaXplKCldKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9EaXNjb3ZlckNoZWNrb3V0QWN0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL0Rpc2NvdmVyQ2hlY2tvdXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmYjUyZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL0Rpc2NvdmVyQ2hlY2tvdXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICoNCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3Rpbmc7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZWRpcmVjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOw0KLQ0KLQ0KLS8qKg0KLSAqIEFuIGFjdGlvbiB0aGF0IHRlc3RzIGlmIGEgZG9jdW1lbnQgaXMgYWxyZWFkeSBjaGVja2VkIG91dCBieSBhIGdpdmVuIHVzZXIuDQotICogSWYgaXQgaXNuJ3QsIGEgY2hlY2sgb3V0IHdpbGwgYmUgdHJpZWQuDQotICovDQotcHVibGljIGNsYXNzIERpc2NvdmVyQ2hlY2tvdXRBY3Rpb24gZXh0ZW5kcyBSZXZpc2lvbkNvbnRyb2xsZXJBY3Rpb24gew0KLQ0KLSAgICAvKioNCi0JICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5hY3RpbmcuQWN0aW9uI2FjdChvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZWRpcmVjdG9yLCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlciwgamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVycykNCi0JICovDQotCXB1YmxpYyBNYXAgYWN0KFJlZGlyZWN0b3IgcmVkaXJlY3RvciwgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIHNyYywNCi0gICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBzdXBlci5hY3QocmVkaXJlY3RvciwgcmVzb2x2ZXIsIG9iamVjdE1vZGVsLCBzcmMsIHBhcmFtZXRlcnMpOw0KLQ0KLSAgICAgICAgSGFzaE1hcCBhY3Rpb25NYXAgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZSgpOw0KLQ0KLSAgICAgICAgaWYgKG5vZGUuaXNDaGVja2VkT3V0KCkpIHsNCi0gICAgICAgICAgICBhY3Rpb25NYXAucHV0KCJmaWxlbmFtZSIsIG5vZGUuZ2V0U291cmNlVVJJKCkpOw0KLSAgICAgICAgICAgIGFjdGlvbk1hcC5wdXQoInVzZXIiLCBub2RlLmdldENoZWNrb3V0VXNlcklkKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBhY3Rpb25NYXA7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL0xhbmd1YWdlRXhpc3RzQWN0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL0xhbmd1YWdlRXhpc3RzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjk4ZTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9MYW5ndWFnZUV4aXN0c0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5hY3RpbmcuU2VydmljZWFibGVBY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVkaXJlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci0KLS8qKgotICogQWN0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBjdXJyZW50IFVSTCByZXByZXNlbnRzIGFuIGV4aXN0aW5nIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTGFuZ3VhZ2VFeGlzdHNBY3Rpb24gZXh0ZW5kcyBTZXJ2aWNlYWJsZUFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgY3VycmVudCBVUkwgcmVwcmVzZW50cyBhbiBleGlzdGluZyBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IDxjb2RlPk1hcDwvY29kZT4gaWYgdGhlcmUgaXMgYSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgZm9yIHRoZSBjdXJyZW50Ci0gICAgICogICAgICAgICBsYW5ndWFnZSwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBNYXAgYWN0KFJlZGlyZWN0b3IgcmVkaXJlY3RvciwgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIHNvdXJjZSwKLSAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmdldERvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotCi0gICAgICAgIFN0cmluZyB1cmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgaWYgKGZhY3RvcnkuaXNEb2N1bWVudCh1cmwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL1Jlc2VydmVkQ2hlY2tpbkFjdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9SZXNlcnZlZENoZWNraW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1MzkxYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL1Jlc2VydmVkQ2hlY2tpbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiBDaGVja2luIGRvY3VtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNlcnZlZENoZWNraW5BY3Rpb24gZXh0ZW5kcyBSZXZpc2lvbkNvbnRyb2xsZXJBY3Rpb24gewotICAgIC8qKgotICAgICAqIENoZWNraW4gZG9jdW1lbnQKLSAgICAgKiBAcmV0dXJuIEhhc2hNYXAgd2l0aCBjaGVja2luIHBhcmFtZXRlcnMKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmFjdGluZy5BY3Rpb24jYWN0KG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3IsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlciwgamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnMpCi0gICAgICovCi0gICAgcHVibGljIE1hcCBhY3QoUmVkaXJlY3RvciByZWRpcmVjdG9yLCBTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgTWFwIG9iamVjdE1vZGVsLCBTdHJpbmcgc3JjLAotICAgICAgICAgICAgUGFyYW1ldGVycyBwYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuYWN0KHJlZGlyZWN0b3IsIHJlc29sdmVyLCBvYmplY3RNb2RlbCwgc3JjLCBwYXJhbWV0ZXJzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IChJZGVudGl0eSkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKElkZW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5jcmVhdGVTZXNzaW9uKHRoaXMubWFuYWdlciwgaWRlbnRpdHksIHRydWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgICAgIGlmIChmYWN0b3J5LmlzRG9jdW1lbnQodXJsKSkgewotICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IGZhY3RvcnkuZ2V0RnJvbVVSTCh1cmwpLmdldFJlcG9zaXRvcnlOb2RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuaXNDaGVja2VkT3V0QnlTZXNzaW9uKHNlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuY2hlY2tpbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgVVJMIFsiICsgdXJsICsgIl0gZG9lc24ndCByZXByZXNlbnQgYSBkb2N1bWVudC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJDb3VsZCBub3QgY2hlY2sgaW4gbm9kZTogIiwgZSk7Ci0gICAgICAgICAgICBNYXAgYWN0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGFjdGlvbk1hcC5wdXQoImV4Y2VwdGlvbiIsICJnZW5lcmljRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICBhY3Rpb25NYXAucHV0KCJmaWxlbmFtZSIsIGdldE5vZGUoKS5nZXRTb3VyY2VVUkkoKSk7Ci0gICAgICAgICAgICBhY3Rpb25NYXAucHV0KCJtZXNzYWdlIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbk1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL1Jlc2VydmVkQ2hlY2tvdXRBY3Rpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvUmVzZXJ2ZWRDaGVja291dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTc5YTJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvUmVzZXJ2ZWRDaGVja291dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIEFjdGlvbiBkb2luZyByZXNlcnZlZCBjaGVja291dAotICovCi1wdWJsaWMgY2xhc3MgUmVzZXJ2ZWRDaGVja291dEFjdGlvbiBleHRlbmRzIFJldmlzaW9uQ29udHJvbGxlckFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmFjdGluZy5BY3Rpb24jYWN0KG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3IsIG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLCBqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgYWN0KFJlZGlyZWN0b3IgcmVkaXJlY3RvciwgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIHNyYywKLSAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmFjdChyZWRpcmVjdG9yLCByZXNvbHZlciwgb2JqZWN0TW9kZWwsIHNyYywgcGFyYW1ldGVycyk7Ci0KLSAgICAgICAgSGFzaE1hcCBhY3Rpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vY2hlY2sgb3V0Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGdldE5vZGUoKTsKLSAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IGdldFVzZXJuYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5ub3ROdWxsKCJub2RlIiwgbm9kZSk7Ci0gICAgICAgICAgICBBc3NlcnQubm90TnVsbCgidXNlcm5hbWUiLCB1c2VybmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICghbm9kZS5pc0NoZWNrZWRPdXRCeVNlc3Npb24obm9kZS5nZXRTZXNzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgbm9kZS5jaGVja291dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFjdGlvbk1hcC5wdXQoImV4Y2VwdGlvbiIsICJnZW5lcmljRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICBhY3Rpb25NYXAucHV0KCJmaWxlbmFtZSIsIGdldE5vZGUoKS5nZXRTb3VyY2VVUkkoKSk7Ci0gICAgICAgICAgICBhY3Rpb25NYXAucHV0KCJtZXNzYWdlIiwgIiIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiVGhlIG5vZGUgIiArIGdldE5vZGUoKS5nZXRTb3VyY2VVUkkoKSArICIgY291bGRuJ3QgYmUgY2hlY2tlZCBvdXQ6ICIsIGUpOwotCi0gICAgICAgICAgICByZXR1cm4gYWN0aW9uTWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvUmVzZXJ2ZWRDaGVja291dFRlc3RBY3Rpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvUmVzZXJ2ZWRDaGVja291dFRlc3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4YzI5Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL1Jlc2VydmVkQ2hlY2tvdXRUZXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uYWN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVkaXJlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0KLS8qKgotICogQW4gYWN0aW9uIHRoYXQgdGVzdHMgaWYgYSBkb2N1bWVudCBpcyBhbHJlYWR5IGNoZWNrZWQgb3V0IGJ5IGEgZ2l2ZW4gdXNlci4KLSAqIElmIGl0IGlzbid0LCBhIGNoZWNrIG91dCB3aWxsIGJlIHRyaWVkLgotICovCi0KLXB1YmxpYyBjbGFzcyBSZXNlcnZlZENoZWNrb3V0VGVzdEFjdGlvbiBleHRlbmRzIFJldmlzaW9uQ29udHJvbGxlckFjdGlvbiB7Ci0KLSAgICAvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmFjdGluZy5BY3Rpb24jYWN0KG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3IsIG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLCBqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBNYXAgYWN0KFJlZGlyZWN0b3IgcmVkaXJlY3RvciwgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIHNyYywKLSAgICAgICAgUGFyYW1ldGVycyBwYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuYWN0KHJlZGlyZWN0b3IsIHJlc29sdmVyLCBvYmplY3RNb2RlbCwgc3JjLCBwYXJhbWV0ZXJzKTsKLQotICAgICAgICBIYXNoTWFwIGFjdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQotCQkJaWYgKCFub2RlLmlzQ2hlY2tlZE91dCgpIHx8ICFub2RlLmdldENoZWNrb3V0VXNlcklkKCkuZXF1YWxzKGdldFVzZXJuYW1lKCkpKSB7Ci0JCQkJLy9jaGVjayBvdXQKLQkJCSAgICBnZXROb2RlKCkuY2hlY2tvdXQoKTsKLQkJCX0KLQkJfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0JCQlhY3Rpb25NYXAucHV0KCJleGNlcHRpb24iLCAiUmVwb3NpdG9yeUV4Y2VwdGlvbiIpOwotCQkJYWN0aW9uTWFwLnB1dCgiZmlsZW5hbWUiLCBnZXROb2RlKCkuZ2V0U291cmNlVVJJKCkpOwotCi0JCQlyZXR1cm4gYWN0aW9uTWFwOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYWN0aW9uTWFwLnB1dCgiZXhjZXB0aW9uIiwgImdlbmVyaWNFeGNlcHRpb24iKTsKLQkJCWFjdGlvbk1hcC5wdXQoImZpbGVuYW1lIiwgZ2V0Tm9kZSgpLmdldFNvdXJjZVVSSSgpKTsKLQkJCWFjdGlvbk1hcC5wdXQoIm1lc3NhZ2UiLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlnZXRMb2dnZXIoKS5lcnJvcigiLmFjdCgpOiBUaGUgbm9kZSAiICsgZ2V0Tm9kZSgpLmdldFNvdXJjZVVSSSgpICsgIiBjb3VsZG4ndCBiZSBjaGVja2VkIG91dDogIiwgZSk7Ci0KLQkJCXJldHVybiBhY3Rpb25NYXA7Ci0JCX0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9SZXNvdXJjZUV4aXN0c0FjdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9SZXNvdXJjZUV4aXN0c0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGZlNzJkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvUmVzb3VyY2VFeGlzdHNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnRocmVhZC5UaHJlYWRTYWZlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmFjdGluZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZWRpcmVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlRyYXZlcnNhYmxlU291cmNlOwotCi0KLS8qKgotICogVGhpcyBhY3Rpb24gc2ltcGx5IGNoZWNrcyB0byBzZWUgaWYgYSBnaXZlbiByZXNvdXJjZSBleGlzdHMuIEl0IGNoZWNrcwotICogd2hldGhlciB0aGUgc3BlY2lmaWVkIGluIHRoZSBzcmMgYXR0cmlidXRlIHNvdXJjZSBleGlzdHMgb3Igbm90LgotICogVGhlIGFjdGlvbiByZXR1cm5zIGVtcHR5IDxjb2RlPk1hcDwvY29kZT4gaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZS4KLSAqIDxwPkluc3RlYWQgb2Ygc3JjIGF0dHJpYnV0ZSwgc291cmNlIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcKLSAqIHBhcmFtZXRlciBuYW1lZCAndXJsJyAodGhpcyBpcyBvbGQgc3ludGF4KS4KLSAqIDxwPkluIG9yZGVyIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIHRoZSB0eXBlIGNhbiBiZSBzcGVjaWZpZWQKLSAqIHVzaW5nIHRoZSBwYXJhbWV0ZXIgJ3R5cGUnICgmbHQ7bWFwOnBhcmFtZXRlciBuYW1lPSJ0eXBlIiB2YWx1ZT0iZmlsZSIvJmd0OyBvcgotICogJmx0O21hcDpwYXJhbWV0ZXIgbmFtZT0idHlwZSIgdmFsdWU9ImRpcmVjdG9yeSIvJmd0OykuIFRoZSBwYXJhbWV0ZXIgJ3R5cGUnIGlzIG9wdGlvbmFsLgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IHtAbGluayBvcmcuYXBhY2hlLmNvY29vbi5zZWxlY3Rpb24uUmVzb3VyY2VFeGlzdHNTZWxlY3Rvcn0KLSAqIHNob3VsZCBiZSBwcmVmZXJyZWQgdG8gdGhpcyBjb21wb25lbnQsIGFzIHRoZSBzZW1hbnRpY3Mgb2YgYSBTZWxlY3RvciBiZXR0ZXIKLSAqIG1hdGNoIHRoZSBzdXBwbGllZCBmdW5jdGlvbmFsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VFeGlzdHNBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiBpbXBsZW1lbnRzIFRocmVhZFNhZmUgewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uYWN0aW5nLkFjdGlvbiNhY3Qob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVkaXJlY3Rvciwgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXIsIGphdmEudXRpbC5NYXAsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnMpCi0gICAgICovCi0gICAgcHVibGljIE1hcCBhY3QoUmVkaXJlY3RvciByZWRpcmVjdG9yLCBTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgTWFwIG9iamVjdE1vZGVsLCBTdHJpbmcgc291cmNlLAotICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdXJsID0gcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoInVybCIsIHNvdXJjZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoInR5cGUiLCAicmVzb3VyY2UiKTsKLSAgICAgICAgU291cmNlIHNyYyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNyYyA9IHJlc29sdmVyLnJlc29sdmVVUkkodXJsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNyYy5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDb2xsZWN0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIFRyYXZlcnNhYmxlU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYXZlcnNhYmxlU291cmNlIHRyYXZlcnNhYmxlU291cmNlID0gKFRyYXZlcnNhYmxlU291cmNlKSBzcmM7Ci0gICAgICAgICAgICAgICAgICAgIGlzQ29sbGVjdGlvbiA9IHRyYXZlcnNhYmxlU291cmNlLmlzQ29sbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4aXN0cyA9IHR5cGUuZXF1YWxzKCJyZXNvdXJjZSIpCi0gICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuZXF1YWxzKCJmaWxlIikgJiYgIWlzQ29sbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscygiZGlyZWN0b3J5IikgJiYgaXNDb2xsZWN0aW9uOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChleGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcodHlwZSArICIgZXhpc3RzOiAiICsgc3JjLmdldFVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiLmFjdCgpOiBSZXNvdXJjZSAiICsgc291cmNlICsgIiBhcyB0eXBlIFwiIiArIHR5cGUgKwotICAgICAgICAgICAgICAgICJcIiBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzcmMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9SZXZpc2lvbkNvbnRyb2xsZXJBY3Rpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvUmV2aXNpb25Db250cm9sbGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOGVlODAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9SZXZpc2lvbkNvbnRyb2xsZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uYWN0aW5nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmFjdGluZy5TZXJ2aWNlYWJsZUFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZWRpcmVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QYWdlRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUGFnZUVudmVsb3BlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmMuUkNFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLQotLyoqCi0gKiBSZXZpc2lvbiBjb250cm9sbGVyIGFjdGlvbi4KLSAqIAotICogQHZlcnNpb24gJElkOiBSZXZpc2lvbkNvbnRyb2xsZXJBY3Rpb24uamF2YSA0ODcyOTAgMjAwNi0xMi0xNCAxODoxODozNVoKLSAqICAgICAgICAgIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgUmV2aXNpb25Db250cm9sbGVyQWN0aW9uIGV4dGVuZHMgU2VydmljZWFibGVBY3Rpb24gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmNtbERpcmVjdG9yeSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYmFja3VwRGlyZWN0b3J5ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBOb2RlIG5vZGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5hY3RpbmcuQWN0aW9uI2FjdChvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZWRpcmVjdG9yLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXIsIGphdmEudXRpbC5NYXAsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgYWN0KFJlZGlyZWN0b3IgcmVkaXJlY3RvciwgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIHNyYywKLSAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCByZXF1ZXN0IG9iamVjdAotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLQotICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiLmFjdCgpOiBObyByZXF1ZXN0IG9iamVjdCIpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFBhZ2VFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbih0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uIHJlcG9TZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbigKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotCi0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHJlcG9TZXNzaW9uKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbih0aGlzLm1hbmFnZXIsIG9iamVjdE1vZGVsKTsKLSAgICAgICAgICAgIGVudmVsb3BlID0gUGFnZUVudmVsb3BlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFBhZ2VFbnZlbG9wZShmYWN0b3J5LCBvYmplY3RNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgcHVibGljYXRpb24pOwotICAgICAgICAgICAgZG9jdW1lbnQgPSBlbnZlbG9wZS5nZXREb2N1bWVudCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIlJlc29sdmluZyBwYWdlIGVudmVsb3BlIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IFBhcmFtZXRlcnMgZm9yIFJDCi0gICAgICAgIFN0cmluZyBwdWJsaWNhdGlvblBhdGggPSBwdWJsaWNhdGlvbi5nZXREaXJlY3RvcnkoKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgIFJDRW52aXJvbm1lbnQgcmNFbnZpcm9ubWVudCA9IFJDRW52aXJvbm1lbnQuZ2V0SW5zdGFuY2UocHVibGljYXRpb24uZ2V0U2VydmxldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxQYXRoKCksIGdldExvZ2dlcigpKTsKLSAgICAgICAgdGhpcy5yY21sRGlyZWN0b3J5ID0gcmNFbnZpcm9ubWVudC5nZXRSQ01MRGlyZWN0b3J5KCk7Ci0gICAgICAgIHRoaXMucmNtbERpcmVjdG9yeSA9IHB1YmxpY2F0aW9uUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgdGhpcy5yY21sRGlyZWN0b3J5OwotICAgICAgICB0aGlzLmJhY2t1cERpcmVjdG9yeSA9IHJjRW52aXJvbm1lbnQuZ2V0QmFja3VwRGlyZWN0b3J5KCk7Ci0gICAgICAgIHRoaXMuYmFja3VwRGlyZWN0b3J5ID0gcHVibGljYXRpb25QYXRoICsgRmlsZS5zZXBhcmF0b3IgKyB0aGlzLmJhY2t1cERpcmVjdG9yeTsKLQotICAgICAgICAvLyBHZXQgc2Vzc2lvbgotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotCi0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCIuYWN0KCk6IE5vIHNlc3Npb24gb2JqZWN0Iik7Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSAoSWRlbnRpdHkpIHNlc3Npb24uZ2V0QXR0cmlidXRlKElkZW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIuYWN0KCk6IElkZW50aXR5OiAiICsgaWRlbnRpdHkpOwotCi0gICAgICAgIC8vIEZJWE1FOiBoYWNrIGJlY2F1c2Ugb2YgdGhlIHVyaSBmb3IgdGhlIGVkaXRvciBiaXRmbHV4LiBUaGUgZmlsZW5hbWUKLSAgICAgICAgLy8gY2Fubm90IGJlIGdldCBmcm9tCi0gICAgICAgIC8vIHRoZSBwYWdlLWVudmVsb3BlCi0KLSAgICAgICAgU3RyaW5nIGRvY3VtZW50aWQgPSBkb2N1bWVudC5nZXRQYXRoKCk7Ci0gICAgICAgIGludCBieCA9IGRvY3VtZW50aWQubGFzdEluZGV4T2YoIi1ieGUiKTsKLQotICAgICAgICBpZiAoYnggPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBkb2N1bWVudC5nZXRMYW5ndWFnZSgpOwotCi0gICAgICAgICAgICBpbnQgbCA9IGRvY3VtZW50aWQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgYnhMZW5ndGggPSAiLWJ4ZSIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgbGFuZyA9IGRvY3VtZW50aWQubGFzdEluZGV4T2YoIl8iLCBieCk7Ci0gICAgICAgICAgICBpbnQgbGFuZ0xlbmd0aCA9IGJ4IC0gbGFuZzsKLQotICAgICAgICAgICAgaWYgKGJ4ID4gMCAmJiBieCArIGJ4TGVuZ3RoIDw9IGwpIHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudGlkID0gZG9jdW1lbnRpZC5zdWJzdHJpbmcoMCwgYngpICsgZG9jdW1lbnRpZC5zdWJzdHJpbmcoYnggKyBieExlbmd0aCwgbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGFuZyA+IDAgJiYgbGFuZ0xlbmd0aCArIGxhbmcgPCBsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gZG9jdW1lbnRpZC5zdWJzdHJpbmcobGFuZyArIDEsIGxhbmcgKyBsYW5nTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRpZCA9IGRvY3VtZW50aWQuc3Vic3RyaW5nKDAsIGxhbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkb2N1bWVudGlkLnN1YnN0cmluZyhsYW5nICsgbGFuZ0xlbmd0aCwgbCAtIGJ4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERvY3VtZW50IHNyY0RvYyA9IGZhY3RvcnkuZ2V0KHB1YmxpY2F0aW9uLCBkb2N1bWVudC5nZXRBcmVhKCksIGRvY3VtZW50aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgICAgIHRoaXMubm9kZSA9IHNyY0RvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLm5vZGUgPSBkb2N1bWVudC5nZXRSZXBvc2l0b3J5Tm9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy51c2VybmFtZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGlkZW50aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFVzZXIgdXNlciA9IGlkZW50aXR5LmdldFVzZXIoKTsKLSAgICAgICAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlci5nZXRJZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIi5hY3QoKTogTm8gaWRlbnRpdHkgeWV0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiLmFjdCgpOiBVc2VybmFtZTogIiArIHRoaXMudXNlcm5hbWUpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbm9kZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBub2RlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHVzZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSB1c2VyIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZXJuYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy51c2VybmFtZTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9jb250ZXh0L0NvbnRleHRVdGlsaXR5LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9jb250ZXh0L0NvbnRleHRVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjRjNWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvY29udGV4dC9Db250ZXh0VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0dWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlc3BvbnNlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGdldHRpbmcgdGhlIGNvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlIGFuZAotICogb2JqZWN0IG1vZGVsIG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0VXRpbGl0eSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzCi0gICAgICAgIENvbXBvbmVudCwgQ29udGV4dHVhbGl6YWJsZSB7Ci0gICAgLyoqCi0gICAgICogVGhlIGNvbXBvbmVudCdzIHJvbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRSA9IENvbnRleHRVdGlsaXR5LmNsYXNzLmdldE5hbWUoKTsKLQotICAgIHByb3RlY3RlZCBDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGUjY29udGV4dHVhbGl6ZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29udGV4dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjb250ZXh0IG9iamVjdCBvZiB0aGUgY3VycmVudCByZXF1ZXN0LgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRleHQgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuCi0gICAgICovCi0gICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgcmVxdWVzdCBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0IG9iamVjdCBvZiB0aGUgY3VycmVudCByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3QoKSB7Ci0gICAgICAgIHJldHVybiBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgcmVzcG9uc2Ugb2JqZWN0IG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuCi0gICAgICogQHJldHVybiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuCi0gICAgICovCi0gICAgcHVibGljIFJlc3BvbnNlIGdldFJlc3BvbnNlKCkgewotICAgICAgICByZXR1cm4gQ29udGV4dEhlbHBlci5nZXRSZXNwb25zZShjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBvYmplY3QgbW9kZWwgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgbW9kZWwgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE9iamVjdE1vZGVsKCkgewotICAgICAgICByZXR1cm4gQ29udGV4dEhlbHBlci5nZXRPYmplY3RNb2RlbChjb250ZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0Fic3RyYWN0UGFnZUVudmVsb3BlTW9kdWxlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0Fic3RyYWN0UGFnZUVudmVsb3BlTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTc4YjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9BYnN0cmFjdFBhZ2VFbnZlbG9wZU1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QYWdlRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUGFnZUVudmVsb3BlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5VUkxJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBjbGFzc2VzIHdoaWNoIG5lZWQgYWNjZXNzIHRvIHRoZSBwYWdlIGVudmVsb3BlLgotICogCi0gKiBUaGUgd2ViIGFwcGxpY2F0aW9uIFVSTCBjYW4gYmUgcHJvdmlkZWQgaW4gdGhlIGF0dHJpYnV0ZSBuYW1lLCBzZXBhcmF0ZWQgYnkgYSBjb2xvbiAoIjoiKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFnZUVudmVsb3BlTW9kdWxlIGV4dGVuZHMgT3BlcmF0aW9uTW9kdWxlIHsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdGhlIHBhZ2UgZW52ZWxvcGUgZm9yIHRoZSBnaXZlbiBvYmplY3RNb2RlbC4KLSAgICAgKiBAcGFyYW0gb2JqZWN0TW9kZWwgdGhlIG9iamVjdE1vZGVsIGZvciB3aGljaCB0aGUgcGFnZSBlbmV2ZWxvcGUgaXMgcmVxdWVzdGVkLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+UGFnZUVudmVsb3BlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcGFnZSBlbnZlbG9wZSBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBQYWdlRW52ZWxvcGUgZ2V0RW52ZWxvcGUoTWFwIG9iamVjdE1vZGVsLCBTdHJpbmcgbmFtZSkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB3ZWJhcHBVcmwgPSBudWxsOwotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLQotICAgICAgICBQYWdlRW52ZWxvcGUgZW52ZWxvcGUgPSAoUGFnZUVudmVsb3BlKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShQYWdlRW52ZWxvcGUuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKGVudmVsb3BlID09IG51bGwpIHsKLQotICAgICAgICAgICAgU3RyaW5nW10gc25pcHBldHMgPSBuYW1lLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICBpZiAoc25pcHBldHMubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgICAgIHdlYmFwcFVybCA9IHNuaXBwZXRzWzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3ZWJhcHBVcmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUmVzb2x2aW5nIHBhZ2UgZW52ZWxvcGUgZm9yIFVSTCBbIiArIHdlYmFwcFVybCArICJdIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IE9iamVjdE1vZGVsSGVscGVyLmdldENvbnRleHQob2JqZWN0TW9kZWwpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZsZXRDb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UmVhbFBhdGgoIiIpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgUHVibGljYXRpb24gcHViID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHViSWQgPSBuZXcgVVJMSW5mb3JtYXRpb24od2ViYXBwVXJsKS5nZXRQdWJsaWNhdGlvbklkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHB1YklkICE9IG51bGwgJiYgZmFjdG9yeS5leGlzdHNQdWJsaWNhdGlvbihwdWJJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVudmVsb3BlID0gUGFnZUVudmVsb3BlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFBhZ2VFbnZlbG9wZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlYmFwcFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHNlcnZsZXRDb250ZXh0UGF0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiUmVzb2x2aW5nIHBhZ2UgZW52ZWxvcGUgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKFBhZ2VFbnZlbG9wZS5jbGFzcy5nZXROYW1lKCksIGVudmVsb3BlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW52ZWxvcGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgVVJMIGF0dGFjaG1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHNuaXBwZXRzID0gbmFtZS5zcGxpdCgiOiIpOwotICAgICAgICByZXR1cm4gc25pcHBldHNbMF07Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9EYXRlQ29udmVydGVyTW9kdWxlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0RhdGVDb252ZXJ0ZXJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzY2YwYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0RhdGVDb252ZXJ0ZXJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay50aHJlYWQuVGhyZWFkU2FmZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuQWJzdHJhY3RJbnB1dE1vZHVsZTsKLQotLyoqCi0gKiBUaGUgRGF0ZUNvbnZlcnRlck1vZHVsZSBjb252ZXJ0cyBhIGRhdGUgc3RyaW5nIGZyb20gb25lIGZvcm1hdCBpbnRvIAotICogYW5vdGhlciBmb3JtYXQuIAotICogVGhlIGNvbnZlcnNpb24gaXMgZGVmaW5lZCBieSB0aGUgbmVzdGVkIGVsZW1lbnRzICZsdDtzcmMtcGF0dGVybi8mZ3Q7IGFuZCAKLSAqICZsdDtwYXR0ZXJuLyZndDsgb2YgdGhlIG1vZHVsZSBkZWNsYXJhdGlvbi4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRlQ29udmVydGVyTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RJbnB1dE1vZHVsZSBpbXBsZW1lbnRzIFRocmVhZFNhZmUgewotCi0gICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHNyY1BhdHRlcm4gPSAoU3RyaW5nKSB0aGlzLnNldHRpbmdzLmdldCgic3JjLXBhdHRlcm4iKTsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAoU3RyaW5nKSB0aGlzLnNldHRpbmdzLmdldCgicGF0dGVybiIpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1vZGVDb25mICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNyY1BhdHRlcm4gPSBtb2RlQ29uZi5nZXRDaGlsZCgic3JjLXBhdHRlcm4iKS5nZXRWYWx1ZShzcmNQYXR0ZXJuKTsKLSAgICAgICAgICAgIHBhdHRlcm4gPSBtb2RlQ29uZi5nZXRDaGlsZCgicGF0dGVybiIpLmdldFZhbHVlKHBhdHRlcm4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNyY1BhdHRlcm49PW51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJTb3VyY2UgZGF0ZSBwYXR0ZXJuIG5vdCBzcGVjaWZpZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhdHRlcm49PW51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJEYXRlIHBhdHRlcm4gbm90IHNwZWNpZmllZC4iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc3JjRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoc3JjUGF0dGVybik7IAotICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChwYXR0ZXJuKTsKLSAgICAgICAgICAgIERhdGUgZGF0ZSA9IHNyY0Zvcm1hdC5wYXJzZShuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBmb3JtYXQuZm9ybWF0KGRhdGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBjb252ZXJ0IGRhdGU6ICIrbmFtZSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0RvY3VtZW50SW5mb01vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9Eb2N1bWVudEluZm9Nb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3MDFjOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0RvY3VtZW50SW5mb01vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQ6JCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0OwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5BYnN0cmFjdElucHV0TW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBJbnB1dCBtb2R1bGUgdG8gZ2V0IGRvY3VtZW50IGluZm9ybWF0aW9uLgotICoge2RvYy1pbmZvOntwdWJsaWNhdGlvbi1pZH06e2FyZWF9Ont1dWlkfTp7ZG9jdW1lbnQtbGFuZ3VhZ2V9Ontwcm9wZXJ0eX19IHdoZXJlIHtwcm9wZXJ0eX0gbWF5IGJlOgotICogPHVsPgotICogPGxpPjxzdHJvbmc+PGNvZGU+Y29udGVudExlbmd0aDwvY29kZT48L3N0cm9uZz4gLSB0aGUgY29udGVudCBsZW5ndGggKG51bWJlciBvZiBieXRlcykuPC9saT4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPmV4cGlyZXM8L2NvZGU+PC9zdHJvbmc+IC0gdGhlIGV4cGlyYXRpb24gZGF0ZSBpbiBJU08gODYwMSBmb3JtYXQuPC9saT4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPmxhc3RNb2RpZmllZDwvY29kZT48L3N0cm9uZz4gLSB0aGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBpbiBJU08gODYwMQotICogZm9ybWF0LjwvbGk+Ci0gKiA8bGk+PHN0cm9uZz48Y29kZT5taW1lVHlwZTwvY29kZT48L3N0cm9uZz4gLSB0aGUgTUlNRSB0eXBlPC9saT4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPm5vZGVOYW1lPC9jb2RlPjwvc3Ryb25nPiAtIHRoZSBuYW1lIG9mIHRoZSBub2RlIGluIHRoZSBzaXRlIHN0cnVjdHVyZTwvbGk+Ci0gKiA8bGk+PHN0cm9uZz48Y29kZT5wYXRoPC9jb2RlPjwvc3Ryb25nPiAtIHRoZSBwYXRoIGluIHRoZSBzaXRlIHN0cnVjdHVyZSAoc3RhcnRpbmcgd2l0aCBhCi0gKiBzbGFzaCkgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBkb2N1bWVudCBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgc2l0ZSBzdHJ1Y3R1cmUuPC9saT4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPnJlc291cmNlVHlwZTwvY29kZT48L3N0cm9uZz4gLSB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdHlwZTwvbGk+Ci0gKiA8bGk+PHN0cm9uZz48Y29kZT5zb3VyY2VFeHRlbnNpb248L2NvZGU+PC9zdHJvbmc+IC0gdGhlIHNvdXJjZSBleHRlbnNpb248L2xpPgotICogPGxpPjxzdHJvbmc+PGNvZGU+dmlzaWJsZUluTmF2PC9jb2RlPjwvc3Ryb25nPiAtIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkb2N1bWVudCdzIG5vZGUKLSAqIGlzIHZpc2libGUgaW4gdGhlIG5hdmlnYXRpb24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuPC9saT4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPndlYmFwcFVybDwvY29kZT48L3N0cm9uZz4gLSB0aGUgd2ViIGFwcGxpY2F0aW9uIFVSTCBvZiB0aGUgZG9jdW1lbnQgb3IKLSAqIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZG9jdW1lbnQgaXMgbm90IHJlZmVyZW5jZWQgaW4gdGhlIHNpdGUgc3RydWN0dXJlLjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRJbmZvTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RJbnB1dE1vZHVsZSBpbXBsZW1lbnRzIFNlcnZpY2VhYmxlIHsKLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLy8gSW5wdXQgbW9kdWxlIHBhcmFtZXRlcnM6Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQU1fUFVCTElDQVRJT05fSUQgPSAicHVibGljYXRpb24taWQiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFNX0FSRUEgPSAiYXJlYSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQU1fVVVJRCA9ICJ1dWlkIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBQQVJBTV9ET0NVTUVOVF9MQU5HVUFHRSA9ICJkb2N1bWVudC1sYW5ndWFnZSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQU1fUFJPUEVSVFkgPSAicHJvcGVydHkiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFNX1JFVklTSU9OID0gInJldmlzaW9uIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBNSU5fTUFOREFUT1JZX1BBUkFNUyA9IDU7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBVVUlEID0gInV1aWQiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIExBTkdVQUdFID0gImxhbmd1YWdlIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBQQVRIID0gInBhdGgiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PREVfTkFNRSA9ICJub2RlTmFtZSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0VCQVBQX1VSTCA9ICJ3ZWJhcHBVcmwiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERPQ1VNRU5UX1VSTCA9ICJkb2N1bWVudFVybCI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfVFlQRSA9ICJyZXNvdXJjZVR5cGUiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIExBU1RfTU9ESUZJRUQgPSAibGFzdE1vZGlmaWVkIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEUgPSAibWltZVR5cGUiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRFTlRfTEVOR1RIID0gImNvbnRlbnRMZW5ndGgiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNPVVJDRV9FWFRFTlNJT04gPSAic291cmNlRXh0ZW5zaW9uIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFWFBJUkVTID0gImV4cGlyZXMiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFZJU0lCTEVfSU5fTkFWSUdBVElPTiA9ICJ2aXNpYmxlSW5OYXYiOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQQVJBTVMgPSB7IFBBUkFNX1BVQkxJQ0FUSU9OX0lELCBQQVJBTV9BUkVBLCBQQVJBTV9VVUlELAotICAgICAgICAgICAgUEFSQU1fRE9DVU1FTlRfTEFOR1VBR0UsIFBBUkFNX1BST1BFUlRZLCBQQVJBTV9SRVZJU0lPTiB9OwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUVUQV9SRVNPVVJDRV9UWVBFID0gInJlc291cmNlVHlwZSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUVUQV9FWFBJUkVTID0gImV4cGlyZXMiOwotCi0gICAgcHJvdGVjdGVkIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzIFoiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgcGFyYW1ldGVycyBhbmQgcmV0dXJuIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uSWQgVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBkb2N1bWVudCBVVUlELgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgZG9jdW1lbnQgbGFuZ3VhZ2UuCi0gICAgICogQHBhcmFtIHJldmlzaW9uIFRoZSByZXZpc2lvbi4KLSAgICAgKiBAcGFyYW0gb2JqZWN0TW9kZWwgVGhlIG9iamVjdCBtb2RlbC4KLSAgICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCBvYmplY3QgY3JlYXRlZC4KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIHB1YmxpY2F0aW9uSWQsIFN0cmluZyBhcmVhLCBTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlLAotICAgICAgICAgICAgaW50IHJldmlzaW9uLCBNYXAgb2JqZWN0TW9kZWwpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgZG9jRmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGRvY0ZhY3RvcnkuZ2V0UHVibGljYXRpb24ocHVibGljYXRpb25JZCk7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGRvY0ZhY3RvcnkuZ2V0KHB1YiwgYXJlYSwgdXVpZCwgbGFuZ3VhZ2UsIHJldmlzaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIGRvY3VtZW50IFsiICsgcHVibGljYXRpb25JZCArICI6IgotICAgICAgICAgICAgICAgICAgICArIGFyZWEgKyAiOiIgKyB1dWlkICsgIjoiICsgbGFuZ3VhZ2UgKyAiXTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgSW5wdXRNb2R1bGVQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBJbnB1dE1vZHVsZVBhcmFtZXRlcnMobmFtZSwgUEFSQU1TLCBNSU5fTUFOREFUT1JZX1BBUkFNUyk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHJldiA9IC0xOwotICAgICAgICAgICAgaWYgKHBhcmFtcy5pc1BhcmFtZXRlcihQQVJBTV9SRVZJU0lPTikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV2aXNpb24gPSBwYXJhbXMuZ2V0UGFyYW1ldGVyKFBBUkFNX1JFVklTSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJldmlzaW9uLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV2ID0gSW50ZWdlci52YWx1ZU9mKHJldmlzaW9uKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudChwYXJhbXMuZ2V0UGFyYW1ldGVyKFBBUkFNX1BVQkxJQ0FUSU9OX0lEKSwgcGFyYW1zCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoUEFSQU1fQVJFQSksIHBhcmFtcy5nZXRQYXJhbWV0ZXIoUEFSQU1fVVVJRCksIHBhcmFtcwotICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKFBBUkFNX0RPQ1VNRU5UX0xBTkdVQUdFKSwgcmV2LCBvYmplY3RNb2RlbCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBwYXJhbXMuZ2V0UGFyYW1ldGVyKFBBUkFNX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoUkVTT1VSQ0VfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvY3VtZW50LmdldFJlc291cmNlVHlwZSgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlLmVxdWFscyhMQVNUX01PRElGSUVEKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZShkb2N1bWVudC5nZXRMYXN0TW9kaWZpZWQoKSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKE1JTUVfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvY3VtZW50LmdldE1pbWVUeXBlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoQ09OVEVOVF9MRU5HVEgpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLnRvU3RyaW5nKGRvY3VtZW50LmdldENvbnRlbnRMZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoU09VUkNFX0VYVEVOU0lPTikpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvY3VtZW50LmdldFNvdXJjZUV4dGVuc2lvbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKExBTkdVQUdFKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlLmVxdWFscyhQQVRIKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZG9jdW1lbnQuZ2V0UGF0aCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKE5PREVfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvY3VtZW50LmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlLmVxdWFscyhVVUlEKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZG9jdW1lbnQuZ2V0VVVJRCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKFdFQkFQUF9VUkwpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBkb2N1bWVudC5nZXRDYW5vbmljYWxXZWJhcHBVUkwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlLmVxdWFscyhET0NVTUVOVF9VUkwpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBkb2N1bWVudC5nZXRDYW5vbmljYWxEb2N1bWVudFVSTCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKEVYUElSRVMpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRGF0ZSBleHBpcmVzID0gZG9jdW1lbnQuZ2V0RXhwaXJlcygpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZUZvcm1hdC5mb3JtYXQoZXhwaXJlcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyBleHBpcmVzIGRhdGUgZnJvbSBkb2N1bWVudC4iLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoVklTSUJMRV9JTl9OQVZJR0FUSU9OKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbi50b1N0cmluZyhpc1Zpc2libGVJbk5hdmlnYXRpb24oZG9jdW1lbnQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZSArICInIG5vdCBzdXBwb3J0ZWQgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIGlucHV0IG1vZHVsZSBwYXJhbWV0ZXJzLiIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmlzaWJsZUluTmF2aWdhdGlvbihEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldExpbmsoKS5nZXROb2RlKCkuaXNWaXNpYmxlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJPYnRhaW5pbmcgbmF2aWdhdGlvbiB2aXNpYmlsaXR5IGZhaWxlZCBbIiArIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgICAgICsgIl06ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvRG9jdW1lbnRVUkxNb2R1bGUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvRG9jdW1lbnRVUkxNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmZGEwMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0RvY3VtZW50VVJMTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRIZWxwZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIG1vZHVsZSBjb25zdHJ1Y3RzIHRoZSBkb2N1bWVudCB1cmwgdGFraW5nIGludG8gYWNjb3VudCBkaWZmZXJlbmNlIGluIHRoZSBsYW5ndWFnZSAudmVyc2lvbgotICogYmVpbmcgY3JlYXRlZCBhbmQgdXNlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogRXhhbXBsZToKLSAqIDxjb2RlPntkb2N1bWVudC11cmw6e3BhZ2UtZW52ZWxvcGU6YXJlYX06e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH06e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9fTwvY29kZT4KLSAqIDwvcD4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50VVJMTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RQYWdlRW52ZWxvcGVNb2R1bGUgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHVybDsKLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gbmFtZS5zcGxpdCgiOiIpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzLmxlbmd0aCA8IDMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzOiAiICsgYXR0cmlidXRlcy5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgKyAiLiBFeHBlY3RlZCAzIChhcmVhLCBkb2N1bWVudC11dWlkLCBsYW5ndWFnZSkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBhcmVhID0gYXR0cmlidXRlc1swXTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHV1aWQgPSBhdHRyaWJ1dGVzWzFdOwotICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBhdHRyaWJ1dGVzWzJdOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEhlbHBlciBoZWxwZXIgPSBuZXcgRG9jdW1lbnRIZWxwZXIodGhpcy5tYW5hZ2VyLCBvYmplY3RNb2RlbCk7Ci0gICAgICAgICAgICB1cmwgPSBoZWxwZXIuZ2V0RG9jdW1lbnRVcmwodXVpZCwgYXJlYSwgbGFuZ3VhZ2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIlJlc29sdmluZyBhdHRyaWJ1dGUgWyIgKyBuYW1lICsgIl0gZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlTmFtZXMob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEF0dHJpYnV0ZU5hbWVzKENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXR0cmlidXRlVmFsdWVzKFN0cmluZyBuYW1lLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSB7IGdldEF0dHJpYnV0ZShuYW1lLCBtb2RlQ29uZiwgb2JqZWN0TW9kZWwpIH07Ci0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9GYWxsYmFja01vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9GYWxsYmFja01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTcyYmUyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvRmFsbGJhY2tNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VVdGlsOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBtb2R1bGUgY2hlY2tzIGlmIGEgZmlsZSBleGlzdHMgaW4gYSBwdWJsaWF0aW9uLCBhbmQgaWYgbm90LCBpdCBjaG9vc2VzIHRoZSBjb3JlIGZpbGUuIFRoZQotICogYXR0cmlidXRlIG5hbWUgbXVzdCBhIHBhdGggcmVsYXRpdmVseSB0byB0aGUgPGNvZGU+d2ViYXBwcy9sZW55YS9sZW55YTwvY29kZT4gZGlyZWN0b3J5LgotICogPC9wPgotICogPHA+Ci0gKiBFeGFtcGxlOiA8Y29kZT57ZmFsbGJhY2s6eHNsdC9zdHlsZS54c2x9PC9jb2RlPiBsb29rcyBpZgotICogPGNvZGU+bGVueWEvcHVicy8ocHVibGljYXRpb24taWQpL2xlbnlhL3hzbHQvc3R5bGUueHNsPC9jb2RlPiBleGlzdHMsIGFuZCBpZiBub3QsIGl0IHVzZXMKLSAqIDxjb2RlPmxlbnlhL3hzbHQvc3R5bGUueHNsPC9jb2RlPi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRmFsbGJhY2tNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdFBhZ2VFbnZlbG9wZU1vZHVsZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGJhc2VVcmlzOwotCi0gICAgLyoqCi0gICAgICogPGNvZGU+UEFUSF9QUkVGSVg8L2NvZGU+IFRoZSBwYXRoIHByZWZpeCBmcm9tIHRoZSB3ZWJhcHAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1BSRUZJWCA9ICJsZW55YS8iOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQVRIID0gImRpcmVjdG9yeSI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfU1JDID0gInNyYyI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZSNjb25maWd1cmUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25mKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZShjb25mKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uW10gcGF0aENvbmZpZ3MgPSBjb25mLmdldENoaWxkcmVuKEVMRU1FTlRfUEFUSCk7Ci0gICAgICAgIExpc3QgYmFzZVVyaUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aENvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gcGF0aENvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9TUkMpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkodXJpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gU291cmNlVXRpbC5nZXRGaWxlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVyaUxpc3QuYWRkKHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oIk9taXR0aW5nIHBhdGggWyIgKyB1cmkgKyAiXSAobm90IGEgZGlyZWN0b3J5KS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oIk9taXR0aW5nIHBhdGggWyIgKyB1cmkgKyAiXSAoZG9lcyBub3QgZXhpc3QpLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIkNvdWxkIG5vdCByZXNvbHZlIHBhdGggWyIgKyB1cmkgKyAiXTogIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQ29uZmlndXJpbmcgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5iYXNlVXJpcyA9IChTdHJpbmdbXSkgYmFzZVVyaUxpc3QudG9BcnJheShuZXcgU3RyaW5nW2Jhc2VVcmlMaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUmVzb2x2aW5nIGZpbGUgZm9yIHBhdGggWyIgKyBuYW1lICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXNvbHZlZFVyaSA9IHJlc29sdmVVUkkobmFtZSwgb2JqZWN0TW9kZWwpOwotICAgICAgICByZXR1cm4gcmVzb2x2ZWRVcmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZXMgdGhlIFVSSSBmb3IgYSBjZXJ0YWluIHBhdGguCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGguCi0gICAgICogQHBhcmFtIG9iamVjdE1vZGVsIFRoZSBvYmplY3QgbW9kZWwuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZVVSSShmaW5hbCBTdHJpbmcgcGF0aCwgTWFwIG9iamVjdE1vZGVsKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyByZXNvbHZlZFVyaSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjaGVja2VkVXJpcyA9ICJcbiI7Ci0KLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIF9iYXNlVXJpcyA9IGdldEJhc2VVUklzKG9iamVjdE1vZGVsLCBwYXRoKTsKLSAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgd2hpbGUgKHJlc29sdmVkVXJpID09IG51bGwgJiYgaSA8IF9iYXNlVXJpcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gX2Jhc2VVcmlzW2ldICsgIi8iICsgcGF0aDsKLQotICAgICAgICAgICAgICAgIGNoZWNrZWRVcmlzICs9IHVyaSArICJcbiI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiVHJ5aW5nIHRvIHJlc29sdmUgVVJJIFsiICsgdXJpICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVXJpID0gdXJpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiU2tpcHBpbmcgVVJJIFsiICsgdXJpICsgIl0gKGRvZXMgbm90IGV4aXN0KS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJDb3VsZCBub3QgcmVzb2x2ZSBVUkkgWyIgKyB1cmkgKyAiXTogIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiUmVzb2x2aW5nIGF0dHJpYnV0ZSBbIiArIHBhdGggKyAiXSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzb2x2ZWRVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVzb2x2ZSBmaWxlIGZvciBwYXRoIFsiICsgcGF0aCArICJdLiIKLSAgICAgICAgICAgICAgICAgICAgKyAiXG5DaGVja2VkIFVSSXM6IiArIGNoZWNrZWRVcmlzKTsKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXNvbHZlZFVyaSA9IHRoaXMuYmFzZVVyaXNbdGhpcy5iYXNlVXJpcy5sZW5ndGggLSAxXSArICIvIiArIHBhdGg7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJObyBVUkkgcmVzb2x2ZWQsIGNob29zaW5nIGxhc3QgZGVmaW5lZCBVUkk6IFsiICsgcmVzb2x2ZWRVcmkgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUmVzb2x2ZWQgVVJJOiBbIiArIHJlc29sdmVkVXJpICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzb2x2ZWRVcmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmFzZSBkaXJlY3RvcnkgVVJJcyBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgdHJhdmVyc2VkLgotICAgICAqIEBwYXJhbSBvYmplY3RNb2RlbCBUaGUgb2JqZWN0IG1vZGVsLgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgYXR0cmlidXRlLgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Ygc3RyaW5ncy4KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRCYXNlVVJJcyhNYXAgb2JqZWN0TW9kZWwsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZU5hbWVzKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBdHRyaWJ1dGVOYW1lcyhDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZSNnZXRBdHRyaWJ1dGVWYWx1ZXMoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEF0dHJpYnV0ZVZhbHVlcyhTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvYmplY3RzID0geyBnZXRBdHRyaWJ1dGUobmFtZSwgbW9kZUNvbmYsIG9iamVjdE1vZGVsKSB9OwotCi0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvSW5wdXRNb2R1bGVQYXJhbWV0ZXJzLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0lucHV0TW9kdWxlUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWIwNzNkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvSW5wdXRNb2R1bGVQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZDokICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotCi0vKioKLSAqIElucHV0IG1vZHVsZSBwYXJhbWV0ZXIgY2xhc3MuCi0gKiBQYXJzZXMgaW5wdXQgbW9kdWxlIHBhcmFtZXRlcnMgYW5kIG9mZmVycyBhY2Nlc3NvcnMgZm9yIHRoZSBwYXJhbWV0ZXJzLgotICogVGhlIHBhcmFtZXRlcnMgYXJlIGV4cGVjdGVkIHRvIGJlIHNlcGFyYXRlZCBieSAiOiIuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnB1dE1vZHVsZVBhcmFtZXRlcnMgewotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhciBQQVJBTV9TRVBBUkFUT1IgPSAnOic7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFBhcmFtZXRlcnMgcGFyYW1zOwotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBwYXJhbUxpc3Q7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGFyc2UgaW5wdXQgbW9kdWxlIHBhcmFtZXRlcnMuIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIFBhcmFtZXRlciB0byBiZSBwYXJzZWQuCi0gICAgICogQHBhcmFtIHBhcmFtTGlzdCBMaXN0IG9mIGV4cGVjdGVkIHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIG1pblBhcmFtcyBNaW5pbXVtIG51bWJlciBvZiBwYXJhbWV0ZXJzIGV4cGVjdGVkLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dE1vZHVsZVBhcmFtZXRlcnMoU3RyaW5nIHBhcmFtZXRlcnMsIGZpbmFsIFN0cmluZ1tdIHBhcmFtTGlzdCwgaW50IG1pblBhcmFtcykKLSAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcGFyYW1zID0gbmV3IFBhcmFtZXRlcnMoKTsKLSAgICAgICAgdGhpcy5wYXJhbUxpc3QgPSAoU3RyaW5nW10pcGFyYW1MaXN0LmNsb25lKCk7Ci0gICAgICAgIHBhcnNlUGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBtaW5QYXJhbXMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJzZSBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVyIGxpc3QgcGFzc2VkLgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCi0gICAgICogQHBhcmFtIG1pblBhcmFtcyBNaW5pbXVtIG51bWJlciBvZiBwYXJhbWV0ZXJzLgotICAgICAqIEByZXR1cm4gUGFyYW1ldGVycyBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCBwYXJzZWQgcGFyYW1ldGVycy4KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUGFyYW1ldGVycyBwYXJzZVBhcmFtZXRlcnMoU3RyaW5nIHBhcmFtZXRlcnMsIGludCBtaW5QYXJhbXMpCi0gICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIFBhcnNlIHBhcmFtZXRlcnMKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGVuZCA9IHBhcmFtZXRlcnMuaW5kZXhPZihQQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8cGFyYW1MaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZW5kICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtVG9rZW4gPSBwYXJhbWV0ZXJzLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICAgICAgICAgICAgICBwYXJhbXMuc2V0UGFyYW1ldGVyKHBhcmFtTGlzdFtpXSwgcGFyYW1Ub2tlbik7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQrMTsKLSAgICAgICAgICAgICAgICBlbmQgPSBwYXJhbWV0ZXJzLmluZGV4T2YoUEFSQU1fU0VQQVJBVE9SLCBzdGFydCsxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKChpKzEpIDwgbWluUGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEEgbWFuZGF0b3J5IHBhcmFtZXRlciBpcyBtaXNzaW5nLgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBwYXJhbWV0ZXJzOiBtYW5kYXRvcnkgcGFyYW1ldGVyICciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJhbUxpc3RbaV0gKyAiJyBub3QgZm91bmQgWyIgKyBwYXJhbWV0ZXJzICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBaZXJvIG9yIG9uZSBwYXJhbWV0ZXIgcGFzc2VkLgotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2V0UGFyYW1ldGVyKHBhcmFtTGlzdFtpXSwgcGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHBhcmFtZXRlcnMgcGFyc2VkIGV4Y2VwdCB0aGUgbGFzdCBvbmUuCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVRva2VuID0gcGFyYW1ldGVycy5zdWJzdHJpbmcoc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1Ub2tlbi5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2V0UGFyYW1ldGVyKHBhcmFtTGlzdFtpXSwgcGFyYW1Ub2tlbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhIHBhcmFtZXRlci4KLSAgICAgKiBAcGFyYW0gcGFyYW0gTmFtZSBvZiByZXF1ZXN0ZWQgcGFyYW1ldGVyLgotICAgICAqIEByZXR1cm4gUmVxdWVzdGVkIHBhcmFtZXRlci4KLSAgICAgKiBAdGhyb3dzIFBhcmFtZXRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBjYW5ub3QgYmUgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW0pIHRocm93cyBQYXJhbWV0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXJhbXMuZ2V0UGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRG9lcyBhIHBhcmFtZXRlciB3aXRoIGdpdmVuIG5hbWUgZXhpc3RzPwotICAgICAqIEBwYXJhbSBwYXJhbSBQYXJhbWV0ZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcGFyYW1ldGVycyBleGlzdHMsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcihTdHJpbmcgcGFyYW0pIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtcy5pc1BhcmFtZXRlcihwYXJhbSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9NZXRhRGF0YU1vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9NZXRhRGF0YU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhjNmZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvTWV0YURhdGFNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkOiBEdWJsaW5Db3JlTW9kdWxlLmphdmEgMTY5Mjk5IDIwMDUtMDUtMDkgMTI6MDA6NDNaIGp3a2FsdHogJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBJbnB1dCBtb2R1bGUgdG8gYWNjZXNzIG1ldGEgZGF0YSB2YWx1ZXMuIFVzZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBhcwotICogaW5wdXQgbW9kdWxlIHBhcmFtZXRlci4KLSAqIDwvcD4KLSAqIDxwPkNvbmZpZ3VyYXRpb246PC9wPgotICogPHByZT4KLSAqICAmbHQ7Y29tcG9uZW50LWluc3RhbmNlIGxvZ2dlcj0ic2l0ZW1hcC5tb2R1bGVzLmlucHV0LmR1YmxpbmNvcmUiIG5hbWU9IlsuLi5dIgotICogICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuTWV0YURhdGFNb2R1bGUiCi0gKiAgICBuYW1lc3BhY2U9IltuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50IHNldF0iLyZndDsKLSAqIDwvcHJlPgotICogPHA+VXNhZ2UgZXhhbXBsZXM6PC9wPgotICogPHVsPgotICogPGxpPjxjb2RlPntkdWJsaW5jb3JlOnRpdGxlfTwvY29kZT48L2xpPgotICogPGxpPjxjb2RlPntteU1ldERhdGE6bXlFbGVtZW50TmFtZX08L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhRGF0YU1vZHVsZSBleHRlbmRzIEFic3RyYWN0UGFnZUVudmVsb3BlTW9kdWxlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgdmFsdWU7Ci0KLSAgICAgICAgTWV0YURhdGEgbWV0YURhdGEgPSBnZXRDdXN0b21NZXRhRGF0YShvYmplY3RNb2RlbCk7Ci0KLSAgICAgICAgaWYgKCFtZXRhRGF0YS5pc1ZhbGlkQXR0cmlidXRlKG5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVGhlIGF0dHJpYnV0ZSBbIiArIG5hbWUgKyAiXSBpcyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbHVlID0gbWV0YURhdGEuZ2V0Rmlyc3RWYWx1ZShuYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIk9idGFpbmluZyBjdXN0b20gbWV0YSBkYXRhIHZhbHVlIGZvciBbIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZU5hbWVzKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBdHRyaWJ1dGVOYW1lcyhDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWV0YURhdGFSZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWdpc3RyeSA9IChNZXRhRGF0YVJlZ2lzdHJ5KSB0aGlzLm1hbmFnZXIubG9va3VwKE1ldGFEYXRhUmVnaXN0cnkuUk9MRSk7Ci0gICAgICAgICAgICBFbGVtZW50W10gZWxlbWVudHMgPSByZWdpc3RyeS5nZXRFbGVtZW50U2V0KHRoaXMubmFtZXNwYWNlVXJpKS5nZXRFbGVtZW50cygpOwotICAgICAgICAgICAgU3RyaW5nW10ga2V5cyA9IG5ldyBTdHJpbmdbZWxlbWVudHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGtleXNbaV0gPSBlbGVtZW50c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChrZXlzKS5pdGVyYXRvcigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVnaXN0cnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlVmFsdWVzKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBdHRyaWJ1dGVWYWx1ZXMoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gdmFsdWVzOwotICAgICAgICBNZXRhRGF0YSBtZXRhRGF0YSA9IGdldEN1c3RvbU1ldGFEYXRhKG9iamVjdE1vZGVsKTsKLQotICAgICAgICBpZiAoIW1ldGFEYXRhLmlzVmFsaWRBdHRyaWJ1dGUobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJUaGUgYXR0cmlidXRlIFsiICsgbmFtZSArICJdIGlzIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWVzID0gbWV0YURhdGEuZ2V0VmFsdWVzKG5hbWUpOwotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiT2J0YWluaW5nIGN1c3RvbSBtZXRhIGRhdGEgdmFsdWUgZm9yIFsiICsgbmFtZQotICAgICAgICAgICAgICAgICAgICArICJdIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YSBnZXRDdXN0b21NZXRhRGF0YShNYXAgb2JqZWN0TW9kZWwpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRklYTUU6IFRoZXJlIHNlZW1zIHRvIGJlIG5vIHJlYXNvbiB0byBwYXNzIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBnZXQgdGhlIHBhZ2UgZW52ZWxvcGUuCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0RW52ZWxvcGUob2JqZWN0TW9kZWwsICIiKS5nZXREb2N1bWVudCgpOwotICAgICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIlRoZXJlIGlzIG5vIGRvY3VtZW50IGZvciB0aGlzIHBhZ2UgZW52ZWxvcGUhIik7Ci0gICAgICAgIH0KLSAgICAgICAgTWV0YURhdGEgbWV0YURhdGEgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWV0YURhdGEgPSBkb2N1bWVudC5nZXRNZXRhRGF0YSh0aGlzLm5hbWVzcGFjZVVyaSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJPYnRhaW5pbmcgY3VzdG9tIG1ldGEgZGF0YSB2YWx1ZSBmb3IgWyIKLSAgICAgICAgICAgICAgICAgICAgKyBkb2N1bWVudCArICJdIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVyaTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25mKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZShjb25mKTsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VVcmkgPSBjb25mLmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7Ci0gICAgfQotICAgIAotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9PcGVyYXRpb25Nb2R1bGUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvT3BlcmF0aW9uTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2QwOGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9PcGVyYXRpb25Nb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LkFic3RyYWN0SW5wdXRNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBTdXBlciBjbGFzcyBmb3Igb3BlcmF0aW9uLWJhc2VkIGlucHV0IG1vZHVsZXMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvbk1vZHVsZSBleHRlbmRzIEFic3RyYWN0SW5wdXRNb2R1bGUgaW1wbGVtZW50cyBTZXJ2aWNlYWJsZSwKLSAgICAgICAgSW5pdGlhbGl6YWJsZSwgQ29udGV4dHVhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25Nb2R1bGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEb2N1bWVudEZhY3RvcnkgZG9jdW1lbnRJZGVudGl0eU1hcDsKLQotICAgIHByaXZhdGUgUmVxdWVzdCByZXF1ZXN0OwotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50RmFjdG9yeSBnZXREb2N1bWVudEZhY3RvcnkoKSB7Ci0gICAgICAgIGlmICh0aGlzLmRvY3VtZW50SWRlbnRpdHlNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgdGhpcy5yZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50SWRlbnRpdHlNYXAgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KHRoaXMubWFuYWdlciwgc2Vzc2lvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudElkZW50aXR5TWFwOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgX21hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gX21hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuSW5pdGlhbGl6YWJsZSNpbml0aWFsaXplKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0dWFsaXplKENvbnRleHQgY29udGV4dCkgdGhyb3dzIENvbnRleHRFeGNlcHRpb24gewotICAgICAgICB0aGlzLnJlcXVlc3QgPSBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QoY29udGV4dCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1BhZ2VFbnZlbG9wZU1vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9QYWdlRW52ZWxvcGVNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhMWI0OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1BhZ2VFbnZlbG9wZU1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUGFnZUVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci0KLS8qKgotICogSW5wdXQgbW9kdWxlIHdyYXBwaW5nIHRoZSBwYWdlIGVudmVsb3BlLiBUaGlzIG1vZHVsZSBwcm92aWRlcyBwdWJsaWNhdGlvbgotICogcmVsYXRlZCBpbmZvcm1hdGlvbiBzdWNoIGFzIGRvY3VtZW50LXV1aWQsIGFyZWEsIHB1YmxpY2F0aW9uLWlkLgotICogCi0gKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlBhZ2VFbnZlbG9wZQotICogQGRlcHJlY2F0ZWQgdXNlIERvY3VtZW50SW5mb01vZHVsZSBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgUGFnZUVudmVsb3BlTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RQYWdlRW52ZWxvcGVNb2R1bGUgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1BBUkFNRVRFUl9ET0NUWVBFID0gImRvY3R5cGUiOwotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSk7Ci0KLSAgICAgICAgaWYgKCFBcnJheXMuYXNMaXN0KFBhZ2VFbnZlbG9wZS5QQVJBTUVURVJfTkFNRVMpLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVGhlIGF0dHJpYnV0ZSBbIiArIG5hbWUgKyAiXSBpcyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFnZUVudmVsb3BlIGVudmVsb3BlID0gZ2V0RW52ZWxvcGUob2JqZWN0TW9kZWwsIGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkFSRUEpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZlbG9wZS5nZXRBcmVhKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhZ2VFbnZlbG9wZS5DT05URVhUKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZW52ZWxvcGUuZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYWdlRW52ZWxvcGUuSVNfUFVCTElDQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBCb29sZWFuLnRvU3RyaW5nKGVudmVsb3BlLmdldFB1YmxpY2F0aW9uKCkgIT0gbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhZ2VFbnZlbG9wZS5QVUJMSUNBVElPTl9JRCkpIHsKLSAgICAgICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBlbnZlbG9wZS5nZXRQdWJsaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gcHViICE9IG51bGwgPyBwdWIuZ2V0SWQoKSA6ICIiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYWdlRW52ZWxvcGUuUFVCTElDQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZlbG9wZS5nZXRQdWJsaWNhdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYWdlRW52ZWxvcGUuUFVCTElDQVRJT05fTEFOR1VBR0VTX0NTVikpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IFN0cmluZ1V0aWxzLmpvaW4oZW52ZWxvcGUuZ2V0UHVibGljYXRpb24oKS5nZXRMYW5ndWFnZXMoKSwgJywnKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRFRkFVTFRfTEFOR1VBR0UpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZlbG9wZS5nZXRQdWJsaWNhdGlvbigpLmdldERlZmF1bHRMYW5ndWFnZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYWdlRW52ZWxvcGUuTEFOR1VBR0UpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZlbG9wZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYWdlRW52ZWxvcGUuQlJFQURDUlVNQl9QUkVGSVgpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZlbG9wZS5nZXRQdWJsaWNhdGlvbigpLmdldEJyZWFkY3J1bWJQcmVmaXgoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRPQ1VNRU5UX1BBVEgpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRQYXRoKGVudmVsb3BlLCBvYmplY3RNb2RlbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZW52ZWxvcGUuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRPQ1VNRU5UKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkb2N1bWVudDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYWdlRW52ZWxvcGUuRE9DVU1FTlRfSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBhdHRyaWJ1dGUgWyAiICsgbmFtZSArICIgXSBpcyBkZXByZWNhdGVkLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgVXNlIGRvY3VtZW50LXBhdGggb3IgZG9jdW1lbnQtdXVpZCBpbnN0ZWFkISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkb2N1bWVudC5nZXRVVUlEKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRPQ1VNRU5UX1BBUkVOVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZG9jdW1lbnQuZ2V0TG9jYXRvcigpLmdldFBhcmVudCgpLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYWdlRW52ZWxvcGUuRE9DVU1FTlRfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZG9jdW1lbnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZG9jdW1lbnQuZ2V0TGluaygpLmdldExhYmVsKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRPQ1VNRU5UX1VSTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZG9jdW1lbnQuZ2V0Q2Fub25pY2FsRG9jdW1lbnRVUkwoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhQYWdlRW52ZWxvcGUuRE9DVU1FTlRfVVJMX1dJVEhPVVRfTEFOR1VBR0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvY3VtZW50LmdldENhbm9uaWNhbFdlYmFwcFVSTCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkb2N1bWVudC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRPQ1VNRU5UX0VYVEVOU0lPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZG9jdW1lbnQuZ2V0RXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRPQ1VNRU5UX1NPVVJDRV9FWFRFTlNJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvY3VtZW50LmdldFNvdXJjZUV4dGVuc2lvbigpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9VVUlEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkb2N1bWVudC5nZXRVVUlEKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRPQ1VNRU5UX0xBTkdVQUdFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkb2N1bWVudC5nZXRMYW5ndWFnZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9MQU5HVUFHRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvY3VtZW50LmdldExhbmd1YWdlcygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9MQU5HVUFHRVNfQ1NWKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmdVdGlscy5qb2luKGRvY3VtZW50LmdldExhbmd1YWdlcygpLCAnLCcpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9MQVNUTU9ESUZJRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZShkb2N1bWVudC5nZXRMYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KERBVEVfRk9STUFUKS5mb3JtYXQoZGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoUGFnZUVudmVsb3BlLkRPQ1VNRU5UX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzb3VyY2VUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJHZXR0aW5nIGF0dHJpYnV0ZSBmb3IgbmFtZSBbIiArIG5hbWUgKyAiXSBmYWlsZWQ6ICIsCi0gICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZXR1cm5pbmcgWyIgKyBuYW1lICsgIl0gPSBbIiArIHZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhdGgoUGFnZUVudmVsb3BlIGVudmVsb3BlLCBNYXAgb2JqZWN0TW9kZWwpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBhdGg7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGVudmVsb3BlLmdldERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgUHVibGljYXRpb24gcHViID0gZW52ZWxvcGUuZ2V0UHVibGljYXRpb24oKTsKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotICAgICAgICAgICAgU3RyaW5nIHVybCA9IFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpOwotICAgICAgICAgICAgRG9jdW1lbnRMb2NhdG9yIGxvYzsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9jID0gcHViLmdldERvY3VtZW50QnVpbGRlcigpLmdldExvY2F0b3IocHViLmdldEZhY3RvcnkoKSwgdXJsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKERvY3VtZW50QnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0aCA9IGxvYy5nZXRQYXRoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXRoID0gZG9jLmdldExvY2F0b3IoKS5nZXRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPGNvZGU+REFURV9GT1JNQVQ8L2NvZGU+IFRoZSBkYXRlIGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfRk9STUFUID0gInl5eXktTU0tZGQgSEg6bW06c3MgWiI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZSNnZXRBdHRyaWJ1dGVOYW1lcyhvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLAotICAgICAqICAgICAgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QXR0cmlidXRlTmFtZXMoQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChQYWdlRW52ZWxvcGUuUEFSQU1FVEVSX05BTUVTKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEF0dHJpYnV0ZVZhbHVlcyhTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvYmplY3RzID0geyBnZXRBdHRyaWJ1dGUobmFtZSwgbW9kZUNvbmYsIG9iamVjdE1vZGVsKSB9OwotCi0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9QdWJsaWNhdGlvbkZhbGxiYWNrTW9kdWxlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1B1YmxpY2F0aW9uRmFsbGJhY2tNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0YThlOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1B1YmxpY2F0aW9uRmFsbGJhY2tNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QYWdlRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci0KLS8qKgotICogUHVibGljYXRpb24gRmFsbGJhY2sgTW9kdWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaWNhdGlvbkZhbGxiYWNrTW9kdWxlIGV4dGVuZHMgRmFsbGJhY2tNb2R1bGUgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHVibGljYXRpb25GYWxsYmFja01vZHVsZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuRmFsbGJhY2tNb2R1bGUjZ2V0QmFzZVVSSXMoamF2YS51dGlsLk1hcCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEJhc2VVUklzKE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIG5hbWUpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc3VwZXJVcmlzID0gc3VwZXIuZ2V0QmFzZVVSSXMob2JqZWN0TW9kZWwsIG5hbWUpOwotICAgICAgICBTdHJpbmdbXSB1cmlzID0gbmV3IFN0cmluZ1tzdXBlclVyaXMubGVuZ3RoICsgMV07Ci0KLSAgICAgICAgUGFnZUVudmVsb3BlIGVudmVsb3BlID0gZ2V0RW52ZWxvcGUob2JqZWN0TW9kZWwsIG5hbWUpOwotICAgICAgICBTdHJpbmcgcHVibGljYXRpb25JZCA9IGVudmVsb3BlLmdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKTsKLQotICAgICAgICBTdHJpbmcgcHVibGljYXRpb25VcmkgPSAiY29udGV4dDovLyIgKyBQdWJsaWNhdGlvbi5QVUJMSUNBVElPTl9QUkVGSVhfVVJJICsgIi8iCi0gICAgICAgICAgICAgICAgKyBwdWJsaWNhdGlvbklkICsgIi9sZW55YSI7Ci0gICAgICAgIHVyaXNbMF0gPSBwdWJsaWNhdGlvblVyaTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyVXJpcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdXJpc1tpICsgMV0gPSBzdXBlclVyaXNbaV07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdXJpczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9QdWJsaWNhdGlvblRlbXBsYXRlRmFsbGJhY2tNb2R1bGUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvUHVibGljYXRpb25UZW1wbGF0ZUZhbGxiYWNrTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTc0ZDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9QdWJsaWNhdGlvblRlbXBsYXRlRmFsbGJhY2tNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotCi0vKioKLSAqIFRoaXMgbW9kdWxlIHVzZXMgcHVibGljYXRpb24gdGVtcGxhdGluZyB0byByZXNvbHZlIHRoZSByZWFsIHBhdGggZm9yIGEgcmVzb3VyY2UuIFRoZSBjdXJyZW50Ci0gKiBwdWJsaWNhdGlvbiBJRCBjYW4gYmUgcHJvdmlkZWQgYXMgYSBwYXJhbWV0ZXI6IDxjb2RlPntmYWxsYmFjazp7cHViLWlkfTpmb28vYmFyfTwvY29kZT4uIFRoaXMKLSAqIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBjb2Nvb246Ly8gcmVxdWVzdCB3aGljaCBhcmUgdHJpZ2dlcmVkIGZyb20gbm9uLWVudmlyb25tZW50IGNvbXBvbmVudHMKLSAqIChlLmcuIHRoZSBzY2hlZHVsZXIpLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaWNhdGlvblRlbXBsYXRlRmFsbGJhY2tNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdFBhZ2VFbnZlbG9wZU1vZHVsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBQdWJsaWNhdGlvblRlbXBsYXRlRmFsbGJhY2tNb2R1bGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKGZpbmFsIFN0cmluZyBuYW1lLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZXNvbHZpbmcgcHVibGljYXRpb24gdGVtcGxhdGUgZm9yIGZpbGUgWyIgKyBuYW1lICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXNvbHZlZFVyaSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRVcmkgPSBudWxsOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBwdWJsaWNhdGlvbiBJRCBpcyBwcm92aWRlZCBpbiBhdHRyaWJ1dGUgbmFtZQotICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiOiIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IG5hbWUuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIGF0dHJpYnV0ZSBtYXkgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBjb2xvbnMhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNhdGlvbklkID0gcGFydHNbMF07Ci0gICAgICAgICAgICAgICAgdGFyZ2V0VXJpID0gcGFydHNbMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUHVibGljYXRpb24gSUQgcHJvdmlkZWQgZXhwbGljaXRlbHk6IFsiICsgcHVibGljYXRpb25JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0VXJpID0gbmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlZFVyaSA9IHJlc29sdmVyLnJlc29sdmVVUkkoImZhbGxiYWNrOi8vIiArIHRhcmdldFVyaSkuZ2V0VVJJKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlJlc29sdmluZyBwYXRoIFsiICsgbmFtZSArICJdIGZhaWxlZDogIjsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKG1lc3NhZ2UsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVkVXJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJhc2UgVVJJIGZvciBhIGNlcnRhaW4gcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VVUkkoUHVibGljYXRpb24gcHVibGljYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uVXJpID0gImNvbnRleHQ6Ly8iICsgUHVibGljYXRpb24uUFVCTElDQVRJT05fUFJFRklYX1VSSSArICIvIgotICAgICAgICAgICAgICAgICsgcHVibGljYXRpb24uZ2V0SWQoKTsKLSAgICAgICAgcmV0dXJuIHB1YmxpY2F0aW9uVXJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJhc2UgVVJJIGZvciBhIGNlcnRhaW4gcHVibGljYXRpb24gaW5jbHVkaW5nIHRoZSBwcmVmaXggImxlbnlhIi4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMZW55YUJhc2VVUkkoUHVibGljYXRpb24gcHVibGljYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uVXJpID0gImNvbnRleHQ6Ly8iICsgUHVibGljYXRpb24uUFVCTElDQVRJT05fUFJFRklYX1VSSSArICIvIgotICAgICAgICAgICAgICAgICsgcHVibGljYXRpb24uZ2V0SWQoKSArICIvbGVueWEiOwotICAgICAgICByZXR1cm4gcHVibGljYXRpb25Vcmk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9SZXNvdXJjZUV4aXN0c01vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9SZXNvdXJjZUV4aXN0c01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBhYjQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvUmVzb3VyY2VFeGlzdHNNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5BYnN0cmFjdElucHV0TW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLQotLyoqCi0gKiBDaGVja3MgaWYgYSBjZXJ0YWluIHJlc291cmNlIGV4aXN0cyBhbmQgcmV0dXJucyBlaXRoZXIgdGhlIHN0cmluZyAidHJ1ZSIgb3IgImZhbHNlIi4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRXhpc3RzTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RJbnB1dE1vZHVsZSBpbXBsZW1lbnRzIFNlcnZpY2VhYmxlLCBEaXNwb3NhYmxlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyByZXNvdXJjZVVSSSA9IG5hbWU7Ci0KLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb3VyY2UgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVVUkkocmVzb3VyY2VVUkkpOwotICAgICAgICAgICAgZXhpc3RzID0gc291cmNlLmV4aXN0cygpOwotICAgICAgICB9IGNhdGNoIChTb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oIkV4Y2VwdGlvbiByZXNvbHZpbmcgcmVzb3VyY2UgWyIgKyByZXNvdXJjZVVSSSArICJdIiwgZSk7Ci0gICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4udG9TdHJpbmcoZXhpc3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZSNnZXRBdHRyaWJ1dGVOYW1lcyhvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLAotICAgICAqICAgICAgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QXR0cmlidXRlTmFtZXMoQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VULml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBfbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBfbWFuYWdlcjsKLSAgICAgICAgdGhpcy5yZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgX21hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGUjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZSh0aGlzLnJlc29sdmVyKTsKLSAgICAgICAgdGhpcy5yZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlVmFsdWVzKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBdHRyaWJ1dGVWYWx1ZXMoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUsIG1vZGVDb25mLCBvYmplY3RNb2RlbCk7Ci0gICAgICAgIHJldHVybiAocmVzdWx0ID09IG51bGwgPyBudWxsIDogbmV3IE9iamVjdFtdIHsgcmVzdWx0IH0pOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvUmVzb3VyY2VUeXBlTW9kdWxlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1Jlc291cmNlVHlwZU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmMzMzI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvUmVzb3VyY2VUeXBlTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LkFic3RyYWN0SW5wdXRNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFJlc291cmNlIHR5cGUgbW9kdWxlLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc3ludGF4IGlzIGVpdGhlciA8Y29kZT57cmVzb3VyY2UtdHlwZTombHQ7YXR0cmlidXRlJmd0O308L2NvZGU+ICh3aGljaCB1c2VzIHRoZSByZXNvdXJjZQotICogdHlwZSBvZiB0aGUgY3VycmVubHR5IHJlcXVlc3RlZCBkb2N1bWVudCkgb3IKLSAqIDxjb2RlPntyZXNvdXJjZS10eXBlOiZsdDtuYW1lJmd0OzombHQ7YXR0cmlidXRlJmd0O308L2NvZGU+ICh3aGljaCBhbGxvd3MgdG8gYWNjZXNzIGFuCi0gKiBhcmJpdHJhcnkgcmVzb3VyY2UgdHlwZSkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEF0dHJpYnV0ZXM6Ci0gKiA8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+PHN0cm9uZz48Y29kZT5leHBpcmVzPC9jb2RlPjwvc3Ryb25nPiAtIHRoZSBleHBpcmF0aW9uIGRhdGUgaW4gUkZDIDgyMi8xMTIzIGZvcm1hdCwgc2VlCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlI2dldEV4cGlyZXMoKX08L2xpPgotICogPGxpPjxzdHJvbmc+PGNvZGU+c2NoZW1hVXJpPC9jb2RlPjwvc3Ryb25nPiAtIHNlZQotICoge0BsaW5rIG9yZy5hcGFjaGUubGVueWEueG1sLlNjaGVtYSNnZXRVUkkoKX08L2xpPgotICogPGxpPjxzdHJvbmc+PGNvZGU+aHR0cFNjaGVtYVVyaTwvY29kZT48L3N0cm9uZz4gLSB0aGUgVVJJIHRvIHJlcXVlc3QgdGhlIHNjaGVtYSBvdmVyIEhUVFAsIHdpdGhvdXQgUHJveHkgYW5kIGNvbnRleHQgKHVzZSB7cHJveHk6fSBhcm91bmQgaXQpLjwvbGk+Ci0gKiA8bGk+PHN0cm9uZz48Y29kZT5zdXBwb3J0c0Zvcm1hdDp7Zm9ybWF0fTwvY29kZT48L3N0cm9uZz4gLSB0cnVlIGlmIHRoZSByZXNvdXJjZSB0eXBlCi0gKiBzdXBwb3J0cyB0aGlzIGZvcm1hdCwgZmFsc2Ugb3RoZXJ3aXNlPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVR5cGVNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdElucHV0TW9kdWxlIGltcGxlbWVudHMgU2VydmljZWFibGUgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX1VSSSA9ICJzY2hlbWFVcmkiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfU0NIRU1BX1VSSSA9ICJodHRwU2NoZW1hVXJpIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBJUkVTID0gImV4cGlyZXMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRTX0ZPUk1BVCA9ICJzdXBwb3J0c0Zvcm1hdCI7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24odGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLQotICAgICAgICAgICAgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBzdGVwcyA9IG5hbWUuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgIGlmIChzdGVwcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBkb2NGYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2ViYXBwVXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2NGYWN0b3J5LmdldEZyb21VUkwod2ViYXBwVXJsKTsKLSAgICAgICAgICAgICAgICBwdWIgPSBkb2N1bWVudC5nZXRQdWJsaWNhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlID0gbmFtZTsKLSAgICAgICAgICAgICAgICByZXNvdXJjZVR5cGUgPSBkb2N1bWVudC5nZXRSZXNvdXJjZVR5cGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlID0gc3RlcHNbMV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlVHlwZU5hbWUgPSBzdGVwc1swXTsKLQotICAgICAgICAgICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9va3VwKFJlc291cmNlVHlwZS5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlVHlwZSA9IChSZXNvdXJjZVR5cGUpIHNlbGVjdG9yLnNlbGVjdChyZXNvdXJjZVR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXR0cmlidXRlLnN0YXJ0c1dpdGgoImZvcm1hdC0iKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZvcm1hdFN0ZXBzID0gbmFtZS5zcGxpdCgiLSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXQgPSBmb3JtYXRTdGVwc1sxXTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc291cmNlVHlwZS5nZXRGb3JtYXRVUkkoZm9ybWF0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlLmVxdWFscyhTQ0hFTUFfVVJJKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzb3VyY2VUeXBlLmdldFNjaGVtYSgpLmdldFVSSSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKEhUVFBfU0NIRU1BX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gcmVzb3VyY2VUeXBlLmdldFNjaGVtYSgpLmdldFVSSSgpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gdHJhbnNmb3JtRmFsbGJhY2tVcmlUb0h0dHAocHViLmdldElkKCksIHVyaSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZS5lcXVhbHMoRVhQSVJFUykpIHsKLSAgICAgICAgICAgICAgICBEYXRlIGV4cGlyZXMgPSByZXNvdXJjZVR5cGUuZ2V0RXhwaXJlcygpOwotICAgICAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkVFRSwgZGQgTU1NIHl5eXkga2s6bW06c3Mgenp6Iik7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzZGYuZm9ybWF0KGV4cGlyZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUuZXF1YWxzKFNVUFBPUlRTX0ZPUk1BVCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0ID0gc3RlcHNbc3RlcHMubGVuZ3RoIC0gMV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZm9ybWF0cyA9IHJlc291cmNlVHlwZS5nZXRGb3JtYXRzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udG9TdHJpbmcoQXJyYXlzLmFzTGlzdChmb3JtYXRzKS5jb250YWlucyhmb3JtYXQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkF0dHJpYnV0ZSBbIiArIG5hbWUgKyAiXSBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiUmVzb2x2aW5nIGF0dHJpYnV0ZSBbIiArIG5hbWUgKyAiXSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgYSBmYWxsYmFjayBVUkkgZm9yIHJlc291cmNlcyBpbnRvIGEgSFRUUCBVUkwuCi0gICAgICogCi0gICAgICogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgbW9kdWxlIHVybHM6Ci0gICAgICogCi0gICAgICogZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2Zvby9yZXNvdXJjZXMvc2NoZW1hcy9iYXIucm5nIC0+Ci0gICAgICogcHJlZml4L3B1YmlkL21vZHVsZXMvZm9vL3NjaGVtYXMvYmFyLnJuZwotICAgICAqIAotICAgICAqIEZJWE1FOiBhbGxvdyBvdGhlciBraW5kIG9mIGZhbGxiYWNrIFVSSXMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHViaWQgcHVibGljYXRpb24gaWQgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gcHJlZml4IHByZWZpeCB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgcmVzdWx0aW5nIFVSTAotICAgICAqIEBwYXJhbSB1cmkgZmFsbGJhY2sgdXJpLCBtdXN0IHN0YXJ0IHdpdGggZmFsbGJhY2s6Ly8KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtRmFsbGJhY2tVcmlUb0h0dHAoU3RyaW5nIHB1YmlkLCBTdHJpbmcgdXJpKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy8iKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBTdHJpbmdVdGlscy5zdWJzdHJpbmdBZnRlcih1cmksICJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvIik7Ci0gICAgICAgICAgICBTdHJpbmcgbW9kdWxlID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmVmb3JlKHBhdGgsICIvIik7Ci0gICAgICAgICAgICBwYXRoID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQWZ0ZXIocGF0aCwgbW9kdWxlICsgIi9yZXNvdXJjZXMiKTsKLSAgICAgICAgICAgIHJldHVybiAiLyIgKyBwdWJpZCArICIvbW9kdWxlcy8iICsgbW9kdWxlICsgcGF0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBjcmVhdGUgSFRUUCBVUkwgZnJvbSA6ICIgKyB1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9mbG93L0Zsb3dIZWxwZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9mbG93L0Zsb3dIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NWZhYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vZmxvdy9GbG93SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuZmxvdy5qYXZhc2NyaXB0LmZvbS5GT01fQ29jb29uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlBhZ2VFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QYWdlRW52ZWxvcGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5GaWxlUmVzZXJ2ZWRDaGVja0luRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dFeGNlcHRpb247Ci0KLS8qKgotICogRmxvd3NjcmlwdCB1dGlsaXR5IGNsYXNzLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZsb3dIZWxwZXIgewotCQotICAgIC8qKgotICAgICAqIFRoZSBBdmFsb24gUm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IEZsb3dIZWxwZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIGVudmVsb3BlLgotICAgICAqIEBwYXJhbSBjb2Nvb24gVGhlIEZPTV9Db2Nvb24gb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSBwYWdlIGVudmVsb3BlLgotICAgICAqIEB0aHJvd3MgUGFnZUVudmVsb3BlRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgUGFnZUVudmVsb3BlIGdldFBhZ2VFbnZlbG9wZShGT01fQ29jb29uIGNvY29vbikgdGhyb3dzIFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlcXVlc3QgVVJJIG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuCi0gICAgICogQHBhcmFtIGNvY29vbiBUaGUgRk9NX0NvY29vbiBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UmVxdWVzdFVSSShGT01fQ29jb29uIGNvY29vbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0IG9iamVjdCBvZiB0aGUgY3VycmVudCByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBjb2Nvb24gVGhlIEZPTV9Db2Nvb24gb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSByZXF1ZXN0IG9iamVjdC4KLSAgICAgKi8KLSAgICBSZXF1ZXN0IGdldFJlcXVlc3QoRk9NX0NvY29vbiBjb2Nvb24pOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ29jb29uIE9iamVjdCBNb2RlbAotICAgICAqIEBwYXJhbSBjb2Nvb24gVGhlIEZsb3cgT2JqZWN0IE1vZGVsIG9mIENvY29vbgotICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCBtb2RlbAotICAgICAqLwotICAgIE1hcCBnZXRPYmplY3RNb2RlbChGT01fQ29jb29uIGNvY29vbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgRG9jdW1lbnRIZWxwZXIgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGNvY29vbiBUaGUgRmxvdyBPYmplY3QgTW9kZWwgb2YgQ29jb29uCi0gICAgICogQHJldHVybiBUaGUgZG9jdW1lbnQgaGVscGVyCi0gICAgICogQHNlZSBEb2N1bWVudEhlbHBlcgotICAgICAqLwotICAgIERvY3VtZW50SGVscGVyIGdldERvY3VtZW50SGVscGVyKEZPTV9Db2Nvb24gY29jb29uKTsKLQotICAgIC8qKgotICAgICAqIFJlc29sdmVzIHRoZSByZXF1ZXN0IHBhcmFtZXRlciB2YWx1ZSBmb3IgYSBzcGVjaWZpYyBuYW1lLiBUaGUgcGFyYW1ldGVyCi0gICAgICogbmFtZXMgYXJlIGVuY29kZWQgYXMgPGNvZGU+e25hbWV9Ont2YWx1ZX0ue2F4aXN9PC9jb2RlPi4gVGhpcyBpcyBhCi0gICAgICogd29ya2Fyb3VuZCBmb3IgdGhlICZsdDtpbnB1dCB0eXBlPSJpbWFnZSIvJmd0OyBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIuCi0gICAgICogQHBhcmFtIGNvY29vbiBUaGUgRk9NX0NvY29vbiBvYmplY3QuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUgVGhlIHJlcXVlc3QgcGFyYW1ldGVyIG5hbWUuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SW1hZ2VQYXJhbWV0ZXJWYWx1ZShGT01fQ29jb29uIGNvY29vbiwgU3RyaW5nIHBhcmFtZXRlck5hbWUpOwotCi0gICAgLyoqCi0gICAgICogVHJpZ2dlciBhIHdvcmtmbG93IGV2ZW50IGZvciB0aGUgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50Ci0gICAgICogUGFnZUVudmVsb3BlLgotICAgICAqIEBwYXJhbSBjb2Nvb24gVGhlIENvY29vbiBGbG93IE9iamVjdCBNb2RlbAotICAgICAqIEBwYXJhbSBldmVudCBUaGUgbmFtZSBvZiB0aGUgd29ya2Zsb3cgZXZlbnQgdG8gdHJpZ2dlci4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIElmIGFuIHdvcmtmbG93IGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgUGFnZUVudmVsb3BlRXhjZXB0aW9uIFBhZ2UgZW52ZWxvcGUgY2FuIG5vdCBvcGVyYXRlIHByb3Blcmx5LgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBJZiBhbiBhY2Nlc3MgY29udHJvbCB2aW9sYXRpb24gb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgdHJpZ2dlcldvcmtmbG93KEZPTV9Db2Nvb24gY29jb29uLCBTdHJpbmcgZXZlbnQpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbiwgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNraXMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgZnJvbSB0aGUgUGFnZUVudmVsb3BlIGNvbnRleHQuCi0gICAgICogQHBhcmFtIGNvY29vbiBUaGUgQ29jb29uIEZsb3cgT2JqZWN0IE1vZGVsCi0gICAgICogQHBhcmFtIGJhY2t1cCBXZXRoZXIgYSBuZXcgcmV2aXNpb24gc2hvdWxkIGJlIGNyZWF0ZWQuCi0gICAgICogQHRocm93cyBGaWxlUmVzZXJ2ZWRDaGVja0luRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICB2b2lkIHJlc2VydmVkQ2hlY2tJbihGT01fQ29jb29uIGNvY29vbiwgYm9vbGVhbiBiYWNrdXApIHRocm93cyBGaWxlUmVzZXJ2ZWRDaGVja0luRXhjZXB0aW9uLAotICAgICAgICAgICAgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2Zsb3cvRmxvd0hlbHBlckltcGwuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9mbG93L0Zsb3dIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWQ5MzIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2Zsb3cvRmxvd0hlbHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZmxvdzsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLmZsb3cuamF2YXNjcmlwdC5mb20uRk9NX0NvY29vbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlBhZ2VFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QYWdlRW52ZWxvcGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUGFnZUVudmVsb3BlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5GaWxlUmVzZXJ2ZWRDaGVja0luRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBGbG93c2NyaXB0IHV0aWxpdHkgY2xhc3MuIFRoZSBGT01fQ29jb29uIG9iamVjdCBpcyBub3QgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvciB0byBhdm9pZCBlcnJvcnMuCi0gKiBUaGlzIHdheSwgbm90IHRoZSBpbml0aWFsLCBidXQgdGhlIGN1cnJlbnQgRk9NX0NvY29vbiBvYmplY3QgaXMgdXNlZCBieSB0aGUgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIEZsb3dIZWxwZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgRmxvd0hlbHBlciwgU2VydmljZWFibGUgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmxvd0hlbHBlckltcGwoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93LkZsb3dIZWxwZXIjZ2V0UGFnZUVudmVsb3BlKG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuZmxvdy5qYXZhc2NyaXB0LmZvbS5GT01fQ29jb29uKQotICAgICAqLwotICAgIHB1YmxpYyBQYWdlRW52ZWxvcGUgZ2V0UGFnZUVudmVsb3BlKEZPTV9Db2Nvb24gY29jb29uKSB0aHJvd3MgUGFnZUVudmVsb3BlRXhjZXB0aW9uIHsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gZ2V0UmVxdWVzdChjb2Nvb24pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbih0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IG1hcCA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgICAgIFBhZ2VFbnZlbG9wZUZhY3RvcnkgZmFjdG9yeSA9IFBhZ2VFbnZlbG9wZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gUHVibGljYXRpb25VdGlsLmdldFB1YmxpY2F0aW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRQYWdlRW52ZWxvcGUobWFwLCBjb2Nvb24uZ2V0T2JqZWN0TW9kZWwoKSwgcHVibGljYXRpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmZsb3cuRmxvd0hlbHBlciNnZXRSZXF1ZXN0VVJJKG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuZmxvdy5qYXZhc2NyaXB0LmZvbS5GT01fQ29jb29uKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSShGT01fQ29jb29uIGNvY29vbikgewotICAgICAgICByZXR1cm4gY29jb29uLmdldFJlcXVlc3QoKS5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZmxvdy5GbG93SGVscGVyI2dldFJlcXVlc3Qob3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5mbG93LmphdmFzY3JpcHQuZm9tLkZPTV9Db2Nvb24pCi0gICAgICovCi0gICAgcHVibGljIFJlcXVlc3QgZ2V0UmVxdWVzdChGT01fQ29jb29uIGNvY29vbikgewotICAgICAgICByZXR1cm4gY29jb29uLmdldFJlcXVlc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93LkZsb3dIZWxwZXIjZ2V0T2JqZWN0TW9kZWwob3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5mbG93LmphdmFzY3JpcHQuZm9tLkZPTV9Db2Nvb24pCi0gICAgICovCi0gICAgcHVibGljIE1hcCBnZXRPYmplY3RNb2RlbChGT01fQ29jb29uIGNvY29vbikgewotICAgICAgICByZXR1cm4gY29jb29uLmdldE9iamVjdE1vZGVsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZmxvdy5GbG93SGVscGVyI2dldERvY3VtZW50SGVscGVyKG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuZmxvdy5qYXZhc2NyaXB0LmZvbS5GT01fQ29jb29uKQotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudEhlbHBlciBnZXREb2N1bWVudEhlbHBlcihGT01fQ29jb29uIGNvY29vbikgewotICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50SGVscGVyKHRoaXMubWFuYWdlciwgY29jb29uLmdldE9iamVjdE1vZGVsKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxjb2RlPlNFUEFSQVRPUjwvY29kZT4gVGhlIHNlcGFyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICI6IjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmZsb3cuRmxvd0hlbHBlciNnZXRJbWFnZVBhcmFtZXRlclZhbHVlKG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuZmxvdy5qYXZhc2NyaXB0LmZvbS5GT01fQ29jb29uLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEltYWdlUGFyYW1ldGVyVmFsdWUoRk9NX0NvY29vbiBjb2Nvb24sIFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlc29sdmluZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG5hbWUgWyIgKyBwYXJhbWV0ZXJOYW1lICsgIl0iKTsKLQotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBjb2Nvb24uZ2V0UmVxdWVzdCgpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsKLQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHBhcmFtZXRlck5hbWUgKyBTRVBBUkFUT1I7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkgJiYgdmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ29tcGxldGUgcGFyYW1ldGVyIG5hbWU6IFsiICsgbmFtZSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmFtZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpLCBuYW1lLmxlbmd0aCgpIC0gMik7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZXNvbHZlZCB2YWx1ZTogWyIgKyB2YWx1ZSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmZsb3cuRmxvd0hlbHBlciN0cmlnZ2VyV29ya2Zsb3cob3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5mbG93LmphdmFzY3JpcHQuZm9tLkZPTV9Db2Nvb24sCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRyaWdnZXJXb3JrZmxvdyhGT01fQ29jb29uIGNvY29vbiwgU3RyaW5nIGV2ZW50KSB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24sCi0gICAgICAgICAgICBQYWdlRW52ZWxvcGVFeGNlcHRpb24sIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldFBhZ2VFbnZlbG9wZShjb2Nvb24pLmdldERvY3VtZW50KCk7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IGdldFJlcXVlc3QoY29jb29uKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24odGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLCBzZXNzaW9uLCBnZXRMb2dnZXIoKSwgZG9jdW1lbnQsIGV2ZW50KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93LkZsb3dIZWxwZXIjcmVzZXJ2ZWRDaGVja0luKG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuZmxvdy5qYXZhc2NyaXB0LmZvbS5GT01fQ29jb29uLAotICAgICAqICAgICAgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNlcnZlZENoZWNrSW4oRk9NX0NvY29vbiBjb2Nvb24sIGJvb2xlYW4gYmFja3VwKQotICAgICAgICAgICAgdGhyb3dzIEZpbGVSZXNlcnZlZENoZWNrSW5FeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFBhZ2VFbnZlbG9wZSBwYWdlRW52ZWxvcGUgPSBnZXRQYWdlRW52ZWxvcGUoY29jb29uKTsKLSAgICAgICAgTm9kZSBub2RlID0gcGFnZUVudmVsb3BlLmdldERvY3VtZW50KCkuZ2V0UmVwb3NpdG9yeU5vZGUoKTsKLSAgICAgICAgbm9kZS5jaGVja2luKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vZ2VuZXJhdGlvbi9MZW55YU1ldGFEYXRhR2VuZXJhdG9yLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vZ2VuZXJhdGlvbi9MZW55YU1ldGFEYXRhR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzY0NzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2dlbmVyYXRpb24vTGVueWFNZXRhRGF0YUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZ2VuZXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNhY2hpbmcuQ2FjaGVhYmxlUHJvY2Vzc2luZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5nZW5lcmF0aW9uLlNlcnZpY2VhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VWYWxpZGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuaW1wbC52YWxpZGl0eS5UaW1lU3RhbXBWYWxpZGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci54bWwuZG9tLkRPTVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLlJlcG9zaXRvcnlTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Db250ZW50SG9sZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIDxwPgotICogR2VuZXJhdGVzIHRoZSBtZXRhIGRhdGEgb2YgYSBkb2N1bWVudC4gVGhlIDxjb2RlPnNyYzwvY29kZT4gYXR0cmlidXRlIG11c3QgYmUKLSAqIGEge0BsaW5rIFJlcG9zaXRvcnlTb3VyY2V9IFVSSSAoZS5nLiwgPGNvZGU+bGVueWEtZG9jdW1lbnQ6Li4uPC9jb2RlPikuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGUgb3V0cHV0OgotICogPC9wPgotICogCi0gKiA8cHJlPgotICogICZsdDtsZW55YTptZXRhZGF0YSB4bWxuczpsZW55YT0mcXVvdDtodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWV0YWRhdGEvMS4wJnF1b3Q7Jmd0OwotICogICZsdDtlbGVtZW50cyB4bWxucz0mcXVvdDtodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyZxdW90OyZndDsKLSAqICAmbHQ7dGl0bGUmZ3Q7U2VhcmNoJmx0Oy90aXRsZSZndDsKLSAqICAmbHQ7ZGF0ZSZndDsyMDA2LTA2LTEyIDEzOjQzOjE0Jmx0Oy9kYXRlJmd0OwotICogICZsdDtsYW5ndWFnZSZndDtlbiZsdDsvbGFuZ3VhZ2UmZ3Q7Ci0gKiAgJmx0O2NyZWF0b3ImZ3Q7bGVueWEmbHQ7L2NyZWF0b3ImZ3Q7Ci0gKiAgJmx0Oy9lbGVtZW50cyZndDsKLSAqICAmbHQ7ZWxlbWVudHMgeG1sbnM9JnF1b3Q7aHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvZG9jdW1lbnQvMS4wJnF1b3Q7Jmd0OwotICogICZsdDtleHRlbnNpb24mZ3Q7eG1sJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKiAgJmx0O3Jlc291cmNlVHlwZSZndDt1c2VjYXNlJmx0Oy9yZXNvdXJjZVR5cGUmZ3Q7Ci0gKiAgJmx0O2NvbnRlbnRUeXBlJmd0O3htbCZsdDsvY29udGVudFR5cGUmZ3Q7Ci0gKiAgJmx0Oy9lbGVtZW50cyZndDsKLSAqICAmbHQ7L2xlbnlhOm1ldGFkYXRhJmd0OwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBMZW55YU1ldGFEYXRhR2VuZXJhdG9yIGV4dGVuZHMgU2VydmljZWFibGVHZW5lcmF0b3IgaW1wbGVtZW50cwotICAgICAgICBDYWNoZWFibGVQcm9jZXNzaW5nQ29tcG9uZW50IHsKLQotICAgIC8qKiBOb2RlIGFuZCBhdHRyaWJ1dGUgbmFtZXMgKi8KLSAgICBwcm90ZWN0ZWQgQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlczsKLQotICAgIC8qKiBNZXRhZGF0YSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfTUVUQV9OT0RFX05BTUUgPSAibWV0YSI7Ci0KLSAgICAvKiogVGhlIFVSSSBvZiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtZXRhZGF0YSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9NRVRBID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZXRhZGF0YS8xLjAiOwotCi0gICAgLyoqIFRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciB0aGlzIG5hbWVzcGFjZSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9NRVRBID0gImxlbnlhIjsKLQotICAgIC8qKiBUaGUgcGFyc2VyIGZvciB0aGUgWE1MIHNuaXBwZXRzIHRvIGJlIGluY2x1ZGVkLiAqLwotICAgIHByb3RlY3RlZCBET01QYXJzZXIgcGFyc2VyID0gbnVsbDsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBzcmM7Ci0gICAgCi0gICAgLyoqIFRoZSByZXBvc2l0b3J5IGNvbnRlbnQgaG9sZGVyIHRvIGdlbmVyYXRlIHRoZSBtZXRhIGRhdGEgZm9yICovCi0gICAgcHJpdmF0ZSBDb250ZW50SG9sZGVyIGNvbnRlbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBSZWN5Y2xlIHRoaXMgY29tcG9uZW50LiBBbGwgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKLSAgICAgICAgdGhpcy5jb250ZW50ID0gbnVsbDsKLSAgICAgICAgdGhpcy5zcmMgPSBudWxsOwotICAgICAgICB0aGlzLnBhcnNlciA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnJlY3ljbGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VydmljZWFibGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFuYWdlciB0aGUgQ29tcG9uZW50TWFuYWdlcgotICAgICAqIAotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiBpbiBjYXNlIGEgY29tcG9uZW50IGNvdWxkIG5vdCBiZSBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXJ2aWNlKG1hbmFnZXIpOwotICAgICAgICB0aGlzLnBhcnNlciA9IChET01QYXJzZXIpIG1hbmFnZXIubG9va3VwKERPTVBhcnNlci5ST0xFKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dXAgdGhlIGZpbGUgZ2VuZXJhdG9yLiBUcnkgdG8gZ2V0IHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBzb3VyY2UgZm9yIGNhY2hpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0dXAoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIHNyYywgUGFyYW1ldGVycyBwYXIpCi0gICAgICAgICAgICB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5zZXR1cChyZXNvbHZlciwgb2JqZWN0TW9kZWwsIHNyYywgcGFyKTsKLSAgICAgICAgdGhpcy5zcmMgPSBzcmM7Ci0gICAgICAgIAotICAgICAgICBSZXBvc2l0b3J5U291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb3VyY2UgPSAoUmVwb3NpdG9yeVNvdXJjZSkgcmVzb2x2ZXIucmVzb2x2ZVVSSShzcmMpOwotICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gc291cmNlLmdldENvbnRlbnQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlIHVuaXF1ZSBrZXkuIFRoaXMga2V5IG11c3QgYmUgdW5pcXVlIGluc2lkZSB0aGUgc3BhY2Ugb2YgdGhpcyBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgZ2VuZXJhdGVkIGtleSBoYXNoZXMgdGhlIHNyYwotICAgICAqLwotICAgIHB1YmxpYyBTZXJpYWxpemFibGUgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5zcmM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlIHZhbGlkaXR5IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBnZW5lcmF0ZWQgdmFsaWRpdHkgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5Ci0gICAgICogICAgICAgICBub3QgY2FjaGVhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2VWYWxpZGl0eSBnZXRWYWxpZGl0eSgpIHsKLSAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSB0aGlzLmNvbnRlbnQuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiRXJyb3IgZGV0ZXJtaW5pbmcgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSIsIGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBUaW1lU3RhbXBWYWxpZGl0eShsYXN0TW9kaWZpZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIFhNTCBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICBzdGFydE5vZGVSb290KCk7Ci0gICAgICAgIHBlcmZvcm1JbmNsdWRlc01ldGEoKTsKLSAgICAgICAgZW5kTm9kZVJvb3QoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUluY2x1ZGVzTWV0YSgpIHRocm93cyBTQVhFeGNlcHRpb24sIFByb2Nlc3NpbmdFeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuYW1lc3BhY2VzID0gdGhpcy5jb250ZW50LmdldE1ldGFEYXRhTmFtZXNwYWNlVXJpcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydFByZWZpeE1hcHBpbmcoIiIsIG5hbWVzcGFjZXNbaV0pOwotICAgICAgICAgICAgICAgIHN0YXJ0Tm9kZU1ldGEobmFtZXNwYWNlc1tpXSk7Ci0gICAgICAgICAgICAgICAgcGFyc2VNZXRhRGF0YShuYW1lc3BhY2VzW2ldKTsKLSAgICAgICAgICAgICAgICBlbmROb2RlTWV0YShuYW1lc3BhY2VzW2ldKTsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlTWV0YURhdGEoU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGFEYXRhIG1ldGFEYXRhID0gZ2V0TWV0YURhdGEobmFtZXNwYWNlKTsKLSAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBtZXRhRGF0YS5nZXRBdmFpbGFibGVLZXlzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbWV0YURhdGEuZ2V0VmFsdWVzKG5hbWVzW2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlLCBuYW1lc1tpXSwgbmFtZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlc0ltcGwoKSk7Ci0gICAgICAgICAgICAgICAgY2hhcltdIHZhbHVlQ2hhcnMgPSB2YWx1ZXNbal0udG9DaGFyQXJyYXkoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnModmFsdWVDaGFycywgMCwgdmFsdWVDaGFycy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChuYW1lc3BhY2UsIG5hbWVzW2ldLCBuYW1lc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5kTm9kZVJvb3QoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KFVSSV9NRVRBLCAibWV0YWRhdGEiLCBQUkVGSVhfTUVUQSArICI6bWV0YWRhdGEiKTsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKFBSRUZJWF9NRVRBKTsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydE5vZGVSb290KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhQUkVGSVhfTUVUQSwgVVJJX01FVEEpOwotICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChVUklfTUVUQSwgIm1ldGFkYXRhIiwgUFJFRklYX01FVEEgKyAiOm1ldGFkYXRhIiwKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnROb2RlTWV0YShTdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlLCAiZWxlbWVudHMiLCAiZWxlbWVudHMiLCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5kTm9kZU1ldGEoU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChuYW1lc3BhY2UsICJlbGVtZW50cyIsICJlbGVtZW50cyIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YSBnZXRNZXRhRGF0YShTdHJpbmcgbmFtZXNwYWNlVXJpKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LmdldE1ldGFEYXRhKG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIk9idGFpbmluZyBtZXRhIGRhdGEgdmFsdWUgZm9yIFsiICsgdGhpcy5jb250ZW50Ci0gICAgICAgICAgICAgICAgICAgICsgIl0gZmFpbGVkOiAiLCBlMSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc2VsZWN0aW9uL0xhc3RNb2RTb3VyY2VTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NlbGVjdGlvbi9MYXN0TW9kU291cmNlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliNDA3Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc2VsZWN0aW9uL0xhc3RNb2RTb3VyY2VTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uc2VsZWN0aW9uLlNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnRocmVhZC5UaHJlYWRTYWZlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiA8cD4KLSAqIExhc3QgTW9kaWZpZWQgU291cmNlIFNlbGVjdG9yLgotICogPC9wPgotICogCi0gKiA8cHJlPgotICogICZsdDttYXA6c2VsZWN0b3IgbmFtZT0ibGFzdC1tb2QiIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNlbGVjdGlvbi5MYXN0TW9kU291cmNlU2VsZWN0b3IiLyZndDsKLSAqCi0gKiAgICZsdDttYXA6c2VsZWN0IHR5cGU9Imxhc3QtbW9kIiZndDsKLSAqICAgICAgJmx0O21hcDpwYXJhbWV0ZXIgbmFtZT0iY29tcGFyZS10byIgdmFsdWU9Intzb3VyY2VUb0NvbXBhcmVUb30iLyZndDsKLSAqCi0gKiAgICAgICZsdDttYXA6d2hlbiB0ZXN0PSJjYWNoZWRzb3VyY2UiJmd0OwotICogICAgICAgICAmbHQ7IS0tIGV4ZWN1dGVzIGlmZiBjYWNoZWRzb3VyY2UgbGFzdC1tb2RpZmllZCAgJmd0OyBjb3VyY2VUb0NvbXBhcmVUbyBsYXN0LW1vZGlmaWVkIC0tJmd0OwotICogICAgICAgICAmbHQ7bWFwOnJlYWQgc3JjPSJ7Y2FjaGVkc291cmNlfSIgbWltZS10eXBlPSJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCIvJmd0OwotICogICAgICAmbHQ7L21hcDp3aGVuJmd0OwotICogICAgICAmbHQ7bWFwOm90aGVyd2lzZSZndDsKLSAqICAgICAgICAgJmx0O21hcDpyZWFkIHNyYz0ie3NvdXJjZVRvQ29tcGFyZVRvfSIgbWltZS10eXBlPSJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCIvJmd0OwotICogICAgICAmbHQ7L21hcDpvdGhlcndpc2UmZ3Q7Ci0gKiAgICZsdDsvbWFwOnNlbGVjdCZndDsKLSAqIDwvcHJlPgotICovCi0KLXB1YmxpYyBjbGFzcyBMYXN0TW9kU291cmNlU2VsZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQKLSAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBUaHJlYWRTYWZlLCBTZXJ2aWNlYWJsZSwgRGlzcG9zYWJsZSwgU2VsZWN0b3IgewotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICBwcml2YXRlIFNvdXJjZSBjb21wYXJlID0gbnVsbDsKLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB0aGlzLnJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKW1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChudWxsICE9IHRoaXMuc291cmNlKSB7Ci0gICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHRoaXMuc291cmNlKTsKLSAgICAgICAgICAgIHRoaXMuc291cmNlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCAhPSB0aGlzLmNvbXBhcmUpIHsKLSAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2UodGhpcy5jb21wYXJlKTsKLSAgICAgICAgICAgIHRoaXMuY29tcGFyZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UodGhpcy5yZXNvbHZlcik7Ci0gICAgICAgIHRoaXMucmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0aGlzLm1hbmFnZXIgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChTdHJpbmcgZXhwcmVzc2lvbiwgTWFwIG9iamVjdE1vZGVsLCBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZVRvQ29tcGFyZSA9IHBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCJjb21wYXJlLXRvIixudWxsKTsKLSAgICAgICAgU3RyaW5nIGNvbXBhcmVUb1NvdXJjZSA9IGV4cHJlc3Npb247Ci0gICAgICAgIGxvbmcgc291cmNlTW9kRGF0ZSA9IDA7Ci0gICAgICAgIGxvbmcgY29tcGFyZU1vZERhdGUgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSShzb3VyY2VUb0NvbXBhcmUpOwotICAgICAgICAgICAgc291cmNlTW9kRGF0ZSA9IHNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgIGNvbXBhcmUgPSByZXNvbHZlci5yZXNvbHZlVVJJKGNvbXBhcmVUb1NvdXJjZSk7Ci0gICAgICAgICAgICBjb21wYXJlTW9kRGF0ZSA9IGNvbXBhcmUuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oIkV4Y2VwdGlvbiByZXNvbHZpbmcgcmVzb3VyY2UgIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBpc05ld2VyID0gKGNvbXBhcmVNb2REYXRlID4gc291cmNlTW9kRGF0ZSk7ICAgICAgICAKLQotICAgICAgICByZXR1cm4gKHNvdXJjZVRvQ29tcGFyZSAhPSBudWxsICYmIGlzTmV3ZXIpOwotICAgICAgICAKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NlcmlhbGl6YXRpb24vTGlua1NlcmlhbGl6ZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zZXJpYWxpemF0aW9uL0xpbmtTZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDFhODEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NlcmlhbGl6YXRpb24vTGlua1NlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNlcmlhbGl6YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5zZXJpYWxpemF0aW9uLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLnhtbC54bGluay5FeHRlbmRlZFhMaW5rUGlwZTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotLyoqCi0gKiBMaW5rIHNlcmlhbGl6ZXIuCi0gKiBUT0RPOiBhZGQgbWVhbmluZ2Z1bCBqYXZhZG9jcwotICovCi1wdWJsaWMgY2xhc3MgTGlua1NlcmlhbGl6ZXIgZXh0ZW5kcyBFeHRlbmRlZFhMaW5rUGlwZSBpbXBsZW1lbnRzIFNlcmlhbGl6ZXIgewotCi0gICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHtAbGluayBPdXRwdXRTdHJlYW19IHdoZXJlIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2Ugc2hvdWxkIGJlIHNlcmlhbGl6ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMub3V0ID0gbmV3IFByaW50U3RyZWFtKG91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtaW1lLXR5cGUgb2YgdGhlIG91dHB1dCBvZiB0aGlzIDxjb2RlPkNvbXBvbmVudDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIENvbnN0YW50cy5MSU5LX0NPTlRFTlRfVFlQRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaW1wbGVMaW5rKFN0cmluZyBocmVmLCBTdHJpbmcgcm9sZSwgU3RyaW5nIGFyY3JvbGUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIHNob3csCi0gICAgICAgICAgICBTdHJpbmcgYWN0dWF0ZSwgU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUsIFN0cmluZyByYXcsIEF0dHJpYnV0ZXMgYXR0cikKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBwcmludChocmVmKTsKLSAgICAgICAgc3VwZXIuc2ltcGxlTGluayhocmVmLCByb2xlLCBhcmNyb2xlLCB0aXRsZSwgc2hvdywgYWN0dWF0ZSwgdXJpLCBuYW1lLCByYXcsIGF0dHIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TG9jYXRvcihTdHJpbmcgaHJlZiwgU3RyaW5nIHJvbGUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgdXJpLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyByYXcsIEF0dHJpYnV0ZXMgYXR0cikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0cmF2ZXJzYWJsZShocmVmKSkgewotICAgICAgICAgICAgcHJpbnQoaHJlZik7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc3RhcnRMb2NhdG9yKGhyZWYsIHJvbGUsIHRpdGxlLCBsYWJlbCwgdXJpLCBuYW1lLCByYXcsIGF0dHIpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzYWJsZShTdHJpbmcgaHJlZikgewotICAgICAgICBpZiAoaHJlZi5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoaHJlZi5jaGFyQXQoMCkgPT0gJyMnKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoaHJlZi5pbmRleE9mKCI6Ly8iKSAhPSAtMSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGhyZWYuc3RhcnRzV2l0aCgibWFpbHRvOiIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoaHJlZi5zdGFydHNXaXRoKCJuZXdzOiIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoaHJlZi5zdGFydHNXaXRoKCJqYXZhc2NyaXB0OiIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnQoU3RyaW5nIGhyZWYpIHsKLSAgICAgICAgaW50IGFua2VyUG9zID0gaHJlZi5pbmRleE9mKCcjJyk7Ci0gICAgICAgIGlmIChhbmtlclBvcyA9PSAtMSkgewotICAgICAgICAgICAgLy8gVE9ETzogWGFsYW4gZW5jb2RlcyBpbnRlcm5hdGlvbmFsIGNoYXJhY3RlcnMgaW50byBVUkwgZW5jb2RpbmcKLSAgICAgICAgICAgIG91dC5wcmludGxuKGhyZWYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaHJlZi5zdWJzdHJpbmcoMCwgYW5rZXJQb3MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgaWYgdGhlIGNvbXBvbmVudCB3YW50cyB0byBzZXQgdGhlIGNvbnRlbnQgbGVuZ3RoCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3ljbGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgewotICAgICAgICBzdXBlci5yZWN5Y2xlKCk7Ci0gICAgICAgIHRoaXMub3V0ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL0FnZ3JlZ2F0aW5nRmFsbGJhY2tTb3VyY2VGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL0FnZ3JlZ2F0aW5nRmFsbGJhY2tTb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmQ0ZmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9BZ2dyZWdhdGluZ0ZhbGxiYWNrU291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlVSSUFic29sdXRpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmcuQWxsRXhpc3RpbmdTb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLlB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyOwotCi0vKioKLSAqIEFnZ3JlZ2F0ZSBhbGwgZXhpc3RpbmcgZmFsbGJhY2sgVVJJcyBieSBtZXJnaW5nIHRoZWlyIFhNTCBjb250ZW50IHVuZGVyCi0gKiB0aGUgZG9jdW1lbnQgZWxlbWVudCBvZiB0aGUgZmlyc3QgZW5jb3VudGVyZWQgc291cmNlLgotICovCi1wdWJsaWMgY2xhc3MgQWdncmVnYXRpbmdGYWxsYmFja1NvdXJjZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBTb3VyY2VGYWN0b3J5LAotICAgICAgICBTZXJ2aWNlYWJsZSwgQ29udGV4dHVhbGl6YWJsZSwgVVJJQWJzb2x1dGl6ZXIgewotCi0gICAgcHVibGljIFNvdXJjZSBnZXRTb3VyY2UoZmluYWwgU3RyaW5nIGxvY2F0aW9uLCBNYXAgcGFyYW1ldGVycykgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHByb3RvY29sIGFuZCB0aGUgZmlyc3QgJy8vJwotICAgICAgICBpbnQgcG9zID0gbG9jYXRpb24uaW5kZXhPZigiOi8vIik7Ci0KLSAgICAgICAgaWYgKHBvcyA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBsb2NhdGlvbiBbIiArIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIl0gZG9lcyBub3QgY29udGFpbiB0aGUgc3RyaW5nICc6Ly8nIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcGF0aCA9IGxvY2F0aW9uLnN1YnN0cmluZyhwb3MgKyAzKTsKLSAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uSWQgPSBudWxsOwotCi0gICAgICAgIC8vIGFsbG93IGZvciB0ZW1wbGF0ZS1mYWxsYmFjazovL3twdWJpZH0vL3twYXRofSBmb3IgdGhlIHNha2Ugb2YgdGhlCi0gICAgICAgIC8vIGNvY29vbiB1c2Utc3RvcmUKLSAgICAgICAgaWYgKHBhdGguaW5kZXhPZigiLy8iKSA+IDEpIHsKLSAgICAgICAgICAgIHBvcyA9IHBhdGguaW5kZXhPZigiLy8iKTsKLSAgICAgICAgICAgIHB1YmxpY2F0aW9uSWQgPSBwYXRoLnN1YnN0cmluZygwLCBwb3MpOwotICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHBvcyArIDIsIHBhdGgubGVuZ3RoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBwYXRoIGFmdGVyIHRoZSBwcm90b2NvbCBtdXN0IG5vdCBiZSBlbXB0eSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiTG9jYXRpb246ICAgICBbIiArIGxvY2F0aW9uICsgIl0iKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJQYXRoOiAgICAgICAgIFsiICsgcGF0aCArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBQdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlciB0ZW1wbGF0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVtcGxhdGVNYW5hZ2VyID0gKFB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyKSB0aGlzLm1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgLmxvb2t1cChQdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlci5ST0xFKTsKLQotICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gQ29udGV4dEhlbHBlci5nZXRSZXF1ZXN0KHRoaXMuY29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChwdWJsaWNhdGlvbklkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2ViYXBwVXJsID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuc3Vic3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpLmxlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24od2ViYXBwVXJsKTsKLSAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbklkID0gaW5mby5nZXRQdWJsaWNhdGlvbklkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmdldERvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSB1cmlzOwotCi0gICAgICAgICAgICBpZiAoZmFjdG9yeS5leGlzdHNQdWJsaWNhdGlvbihwdWJsaWNhdGlvbklkKSkgewotICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24ocHVibGljYXRpb25JZCk7Ci0gICAgICAgICAgICAgICAgQWxsRXhpc3RpbmdTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG5ldyBBbGxFeGlzdGluZ1NvdXJjZVJlc29sdmVyKCk7Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGVNYW5hZ2VyLnZpc2l0KHB1YiwgcGF0aCwgcmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgIHVyaXMgPSByZXNvbHZlci5nZXRVcmlzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVyaXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0IGFsbFVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhbGxVcmlzLmFkZEFsbChBcnJheXMuYXNMaXN0KHVyaXMpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRTb3VyY2VVcmkgPSBudWxsOwotICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgibGVueWEvbW9kdWxlcy8iKSkgewotICAgICAgICAgICAgICAgIE1vZHVsZU1hbmFnZXIgbW9kdWxlTWdyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtb2R1bGVNZ3IgPSAoTW9kdWxlTWFuYWdlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChNb2R1bGVNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbW9kdWxlU2hvcnRjdXQgPSBwYXRoLnNwbGl0KCIvIilbMl07Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlVXJpID0gbW9kdWxlTWdyLmdldEJhc2VVUkkobW9kdWxlU2hvcnRjdXQpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbW9kdWxlUGF0aCA9IHBhdGguc3Vic3RyaW5nKCgibGVueWEvbW9kdWxlcy8iICsgbW9kdWxlU2hvcnRjdXQpLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dFNvdXJjZVVyaSA9IGJhc2VVcmkgKyBtb2R1bGVQYXRoOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGVNZ3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UobW9kdWxlTWdyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dFNvdXJjZVVyaSA9ICJjb250ZXh0Oi8vIiArIHBhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsLmV4aXN0cyhjb250ZXh0U291cmNlVXJpLCB0aGlzLm1hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgYWxsVXJpcy5hZGQoY29udGV4dFNvdXJjZVVyaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGFnZ3JlZ2F0ZVVyaXMgPSAoU3RyaW5nW10pIGFsbFVyaXMudG9BcnJheShuZXcgU3RyaW5nW2FsbFVyaXMuc2l6ZSgpXSk7IAotICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGluZ1NvdXJjZShsb2NhdGlvbiwgYWdncmVnYXRlVXJpcywgdGhpcy5tYW5hZ2VyKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlc29sdmluZyBwYXRoIFsiICsgbG9jYXRpb24gKyAiXSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHRlbXBsYXRlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UodGVtcGxhdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoU291cmNlIHNvdXJjZSkgewotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHVibGljIHZvaWQgY29udGV4dHVhbGl6ZShDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb250ZXh0RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGFic29sdXRpemUoU3RyaW5nIGJhc2VVUkksIFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICByZXR1cm4gU291cmNlVXRpbC5hYnNvbHV0aXplKGJhc2VVUkksIGxvY2F0aW9uLCB0cnVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvQWdncmVnYXRpbmdTb3VyY2UuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvQWdncmVnYXRpbmdTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjNGJlZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL0FnZ3JlZ2F0aW5nU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNvdXJjZS5pbXBsLk11bHRpU291cmNlVmFsaWRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VWYWxpZGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFnZ3JlZ2F0aW5nU291cmNlIGltcGxlbWVudHMgU291cmNlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIHNvdXJjZVVyaXM7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEBwYXJhbSB1cmlzCi0gICAgICogQHBhcmFtIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQWdncmVnYXRpbmdTb3VyY2UoU3RyaW5nIHVyaSwgU3RyaW5nW10gdXJpcywgU2VydmljZU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB0aGlzLnNvdXJjZVVyaXMgPSAoU3RyaW5nW10pdXJpcy5jbG9uZSgpOwotICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VVJJKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9hZERvbSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlVXJpcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIERvY3VtZW50IHNvdXJjZURvbSA9IFNvdXJjZVV0aWwucmVhZERPTShzb3VyY2VVcmlzW2ldLCB0aGlzLm1hbmFnZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZURvbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgc291cmNlIFsiICsgc291cmNlVXJpc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZG9lc24ndCBjb250YWluIFhNTC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGRvY0VsZW1lbnQgPSBzb3VyY2VEb20uZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9tID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVyaSA9IGRvY0VsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBkb2NFbGVtZW50LmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gZG9jRWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRG9jdW1lbnQobnVsbCwgbG9jYWxOYW1lLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKG5hbWVzcGFjZVVyaSwgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20gPSBoZWxwZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBlbGVtZW50cyA9IERvY3VtZW50SGVscGVyLmdldENoaWxkcmVuKGRvY0VsZW1lbnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBjbG9uZSA9IChFbGVtZW50KSB0aGlzLmRvbS5pbXBvcnROb2RlKGVsZW1lbnRzW2VdLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoY2xvbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIERvY3VtZW50IGRvbTsKLSAgICBwcml2YXRlIGJ5dGVbXSBkYXRhOwotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldERvbSgpIHsKLSAgICAgICAgaWYgKHRoaXMuZG9tID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvYWREb20oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kb207Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXREYXRhKCkgewotICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvbSA9IGdldERvbSgpOwotICAgICAgICAgICAgaWYgKGRvbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudEhlbHBlci53cml0ZURvY3VtZW50KGRvbSwgb3V0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZVVyaXMubGVuZ3RoID4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZ2V0RGF0YSgpLmxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFleGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhpcyArICIgZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShnZXREYXRhKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKLSAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc291cmNlVXJpcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBNYXRoLm1heChsYXN0TW9kaWZpZWQsIFNvdXJjZVV0aWwuZ2V0TGFzdE1vZGlmaWVkKHNvdXJjZVVyaXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3htbCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7Ci0gICAgICAgIHJldHVybiAiYWdncmVnYXRlLXRlbXBsYXRlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXJpOwotICAgIH0KLQotICAgIHByaXZhdGUgU291cmNlVmFsaWRpdHkgdmFsaWRpdHk7Ci0KLSAgICBwdWJsaWMgU291cmNlVmFsaWRpdHkgZ2V0VmFsaWRpdHkoKSB7Ci0gICAgICAgIGlmICh0aGlzLnZhbGlkaXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgTXVsdGlTb3VyY2VWYWxpZGl0eSBhZ2dyZWdhdGVkVmFsaWRpdHkgPSBuZXcgTXVsdGlTb3VyY2VWYWxpZGl0eShyZXNvbHZlciwgMCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZVVyaXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHRoaXMuc291cmNlVXJpc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVkVmFsaWRpdHkuYWRkU291cmNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWdncmVnYXRlZFZhbGlkaXR5LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGl0eSA9IGFnZ3JlZ2F0ZWRWYWxpZGl0eTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRpdHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgdGhpcy5kb20gPSBudWxsOwotICAgICAgICB0aGlzLmRhdGEgPSBudWxsOwotICAgICAgICB0aGlzLnZhbGlkaXR5ID0gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvRmFsbGJhY2tTb3VyY2VGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL0ZhbGxiYWNrU291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZjOTQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvRmFsbGJhY2tTb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuVVJJQWJzb2x1dGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubW9kdWxlLk1vZHVsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5VUkxJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLkV4aXN0aW5nU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZy5QdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLlZpc2l0aW5nU291cmNlUmVzb2x2ZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBTb3VyY2UgZmFjdG9yeSBmb2xsb3dpbmcgdGhlIGZhbGxiYWNrIHByaW5jaXBsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIElEIG9mIHRoZSBjdXJyZW50IHB1YmxpY2F0aW9uIGNhbiBiZSBwYXNzZWQgaW4gdGhlIFVSTCAoPGNvZGU+ZmFsbGJhY2s6cHViOi8vcGF0aDwvY29kZSksCi0gKiB0aGlzIGlzIG5lY2Vzc2FyeSBhcyBhIHdvcmthcm91bmQgZm9yIGJ1ZyA0MDU2NC4KLSAqIDwvcD4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRmFsbGJhY2tTb3VyY2VGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgU291cmNlRmFjdG9yeSwKLSAgICAgICAgU2VydmljZWFibGUsIENvbnRleHR1YWxpemFibGUsIFVSSUFic29sdXRpemVyIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEZhbGxiYWNrU291cmNlRmFjdG9yeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VGYWN0b3J5I2dldFNvdXJjZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgZ2V0U291cmNlKGZpbmFsIFN0cmluZyBsb2NhdGlvbiwgTWFwIHBhcmFtZXRlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcm90b2NvbCBhbmQgdGhlIGZpcnN0ICcvLycKLSAgICAgICAgaW50IHBvcyA9IGxvY2F0aW9uLmluZGV4T2YoIjovLyIpOwotCi0gICAgICAgIGlmIChwb3MgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgbG9jYXRpb24gWyIgKyBsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICArICJdIGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAnOi8vJyIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGF0aCA9IGxvY2F0aW9uLnN1YnN0cmluZyhwb3MgKyAzKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwdWJsaWNhdGlvbklkID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8vIGV4dHJhY3QgcHVibGljYXRpb24gSUQKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGxvY2F0aW9uLnN1YnN0cmluZygwLCBwb3MpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmVmaXgsICI6Iik7Ci0gICAgICAgIGlmICh0b2tlbnMuY291bnRUb2tlbnMoKSA+IDEpIHsKLSAgICAgICAgICAgIHRva2Vucy5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIHB1YmxpY2F0aW9uSWQgPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHJlbW92ZSBxdWVyeSBzdHJpbmcKLSAgICAgICAgaW50IHF1ZXN0aW9uTWFya0luZGV4ID0gcGF0aC5pbmRleE9mKCI/Iik7Ci0gICAgICAgIGlmIChxdWVzdGlvbk1hcmtJbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcXVlc3Rpb25NYXJrSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIHBhdGggYWZ0ZXIgdGhlIHByb3RvY29sIG11c3Qgbm90IGJlIGVtcHR5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJMb2NhdGlvbjogICAgIFsiICsgbG9jYXRpb24gKyAiXSIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlBhdGg6ICAgICAgICAgWyIgKyBwYXRoICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyIHRlbXBsYXRlTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHNvdXJjZVJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb3VyY2VSZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLQotICAgICAgICAgICAgdGVtcGxhdGVNYW5hZ2VyID0gKFB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKFB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyLlJPTEUpOwotCi0gICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QodGhpcy5jb250ZXh0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHB1YmxpY2F0aW9uSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB3ZWJhcHBVcmwgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKS5zdWJzdHJpbmcocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpLmxlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24od2ViYXBwVXJsKTsKLSAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbklkID0gaW5mby5nZXRQdWJsaWNhdGlvbklkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmdldERvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgaWYgKGZhY3RvcnkuZXhpc3RzUHVibGljYXRpb24ocHVibGljYXRpb25JZCkpIHsKLSAgICAgICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBmYWN0b3J5LmdldFB1YmxpY2F0aW9uKHB1YmxpY2F0aW9uSWQpOwotICAgICAgICAgICAgICAgIFZpc2l0aW5nU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBnZXRTb3VyY2VWaXNpdG9yKCk7Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGVNYW5hZ2VyLnZpc2l0KHB1YiwgcGF0aCwgcmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLmdldFNvdXJjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCJsZW55YS9tb2R1bGVzLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1vZHVsZU1hbmFnZXIgbW9kdWxlTWdyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU1nciA9IChNb2R1bGVNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKE1vZHVsZU1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbW9kdWxlU2hvcnRjdXQgPSBwYXRoLnNwbGl0KCIvIilbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZVVyaSA9IG1vZHVsZU1nci5nZXRCYXNlVVJJKG1vZHVsZVNob3J0Y3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtb2R1bGVQYXRoID0gcGF0aC5zdWJzdHJpbmcoKCJsZW55YS9tb2R1bGVzLyIgKyBtb2R1bGVTaG9ydGN1dCkubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gc291cmNlUmVzb2x2ZXIucmVzb2x2ZVVSSShiYXNlVXJpICsgbW9kdWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlTWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShtb2R1bGVNZ3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRVcmkgPSAiY29udGV4dDovLyIgKyBwYXRoOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2VSZXNvbHZlci5yZXNvbHZlVVJJKGNvbnRleHRVcmkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUmVzb2x2ZWQgc291cmNlOiAgWyIgKyBzb3VyY2UuZ2V0VVJJKCkgKyAiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVzb2x2aW5nIHBhdGggWyIgKyBsb2NhdGlvbiArICJdIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAodGVtcGxhdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZSh0ZW1wbGF0ZU1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNvdXJjZVJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzb3VyY2VSZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc291cmNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBWaXNpdGluZ1NvdXJjZVJlc29sdmVyIGdldFNvdXJjZVZpc2l0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhpc3RpbmdTb3VyY2VSZXNvbHZlcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dCBjb250ZXh0OwotCi0gICAgLyoqIFRoZSBTZXJ2aWNlTWFuYWdlciAqLwotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIF9tYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IF9tYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZSNjb250ZXh0dWFsaXplKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udGV4dHVhbGl6ZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0IF9jb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIENvbnRleHRFeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbnRleHQgPSBfY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VGYWN0b3J5I3JlbGVhc2Uob3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKFNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgLy8gSW4gZmFjdCwgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBhcyB0aGlzIGZhY3RvcnkKLSAgICAgICAgLy8gcmV0dXJucyBhIHNvdXJjZSBvYmplY3QgZnJvbSBhIGRpZmZlcmVudCBmYWN0b3J5LiBTbyB0aGF0Ci0gICAgICAgIC8vIGZhY3Rvcnkgc2hvdWxkIHJlbGVhc2UgdGhlIHNvdXJjZQotICAgICAgICBpZiAobnVsbCAhPSBzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmdldExvZ2dlcigpLmRlYnVnKCJSZWxlYXNpbmcgc291cmNlICIgKyBzb3VyY2UuZ2V0VVJJKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZXhjZXB0aW9uCi0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlVSSUFic29sdXRpemVyI2Fic29sdXRpemUoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBhYnNvbHV0aXplKFN0cmluZyBiYXNlVVJJLCBTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIFNvdXJjZVV0aWwuYWJzb2x1dGl6ZShiYXNlVVJJLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvTGVueWFTb3VyY2VGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL0xlbnlhU291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY4OTcwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvTGVueWFTb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay50aHJlYWQuVGhyZWFkU2FmZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5mbG93LkZsb3dIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LkpYUGF0aEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSlhQYXRoSGVscGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlF1ZXJ5OwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3IgdGhlICJsZW55YSIgc2NoZW1lICh2aXJ0dWFsIHByb3RvY29sKSwgd2hpY2ggaXMgdXNlZCB0byByZXNvbHZlIGFueSBzcmM9ImxlbnlhOi4uLiIKLSAqIGF0dHJpYnV0ZXMgaW4gc2l0ZW1hcHMuIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc3RydWN0cyB0aGUgcGF0aCB0byB0aGUgc291cmNlIGRvY3VtZW50IGZyb20gdGhlCi0gKiBwYWdlIGVudmVsb3BlIGFuZCBkZWxlZ2F0ZXMgYW55IGZ1cnRoZXIgcmVzb2x2aW5nIHRvIHRoZSAiY29udGV4dCIgc291cmNlIHJlc29sdmVyIG9mIENvY29vbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgTGVueWFTb3VyY2VGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgU291cmNlRmFjdG9yeSwgVGhyZWFkU2FmZSwKLSAgICAgICAgQ29udGV4dHVhbGl6YWJsZSwgU2VydmljZWFibGUgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FID0gImxlbnlhOiI7Ci0KLSAgICAvKiogZmFsbGJhY2sgaWYgbm8gY29uZmlndXJhdGlvbiBpcyBhdmFpbGFibGUgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RFTEVHQVRJT05fU0NIRU1FID0gImNvbnRleHQ6IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RFTEVHQVRJT05fUFJFRklYID0gIi8iCi0gICAgICAgICAgICArIFB1YmxpY2F0aW9uLlBVQkxJQ0FUSU9OX1BSRUZJWF9VUkk7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgY29udGV4dDsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGZvciByZXNvbHZpbmcgdGhlIG9iamVjdCBtb2RlbC4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGUjY29udGV4dHVhbGl6ZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoQ29udGV4dCBfY29udGV4dCkgdGhyb3dzIENvbnRleHRFeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbnRleHQgPSBfY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBfbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBfbWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VGYWN0b3J5I2dldFNvdXJjZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgZ2V0U291cmNlKGZpbmFsIFN0cmluZyBsb2NhdGlvbiwgZmluYWwgTWFwIHBhcmFtZXRlcnMpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU291cmNlRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgc2Vzc2lvbk5hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gdXJpQW5kUXVlcnkgPSBsb2NhdGlvbi5zcGxpdCgiXFw/Iik7Ci0gICAgICAgIGlmICh1cmlBbmRRdWVyeS5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSh1cmlBbmRRdWVyeVsxXSk7Ci0gICAgICAgICAgICBzZXNzaW9uTmFtZSA9IHF1ZXJ5LmdldFZhbHVlKCJzZXNzaW9uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXNzaW9uIHNlc3Npb247Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXNzaW9uID0gZ2V0U2Vzc2lvbihzZXNzaW9uTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkNyZWF0aW5nIHJlcG9zaXRvcnkgc291cmNlIGZvciBVUkkgWyIgKyBsb2NhdGlvbiArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFJlcG9zaXRvcnlTb3VyY2UodGhpcy5tYW5hZ2VyLCBsb2NhdGlvbiwgc2Vzc2lvbiwgZ2V0TG9nZ2VyKCkpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNlc3Npb24gZ2V0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbk5hbWUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIG9iamVjdE1vZGVsID0gQ29udGV4dEhlbHBlci5nZXRPYmplY3RNb2RlbCh0aGlzLmNvbnRleHQpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb247Ci0gICAgICAgIGlmIChzZXNzaW9uTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLSAgICAgICAgICAgIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbk5hbWUuZXF1YWxzKCJ1c2VjYXNlIikpIHsKLSAgICAgICAgICAgIHNlc3Npb24gPSBnZXRVc2VjYXNlU2Vzc2lvbihvYmplY3RNb2RlbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiSW52YWxpZCBzZXNzaW9uOiBbIiArIHNlc3Npb25OYW1lICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXNzaW9uIGdldFVzZWNhc2VTZXNzaW9uKE1hcCBvYmplY3RNb2RlbCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oImZvbyIpOwotICAgICAgICAgICAgSlhQYXRoSGVscGVyQ29uZmlndXJhdGlvbiBoZWxwZXJDb25maWcgPSBKWFBhdGhIZWxwZXIuc2V0dXAoY29uZmlnKTsKLSAgICAgICAgICAgIE9iamVjdCBjb250ZXh0T2JqZWN0ID0gRmxvd0hlbHBlci5nZXRDb250ZXh0T2JqZWN0KG9iamVjdE1vZGVsKTsKLSAgICAgICAgICAgIHJldHVybiAoU2Vzc2lvbikgSlhQYXRoSGVscGVyLmdldEF0dHJpYnV0ZSgidXNlY2FzZS9zZXNzaW9uIiwgY29uZmlnLCBoZWxwZXJDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHRPYmplY3QpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIG5vdGhpbmcgYmVjYXVzZSB0aGUgZGVsZWdhdGVkIGZhY3RvcnkgZG9lcyB0aGlzLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUZhY3RvcnkjcmVsZWFzZShvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoU291cmNlIHNvdXJjZSkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvUmVwb3NpdG9yeVNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9SZXBvc2l0b3J5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWNjYmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9SZXBvc2l0b3J5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Nb2RpZmlhYmxlVHJhdmVyc2FibGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlVmFsaWRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLmltcGwuQWJzdHJhY3RTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMuY29udGV4dC5Db250ZXh0VXRpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Db250ZW50SG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotCi0vKioKLSAqIFJlcG9zaXRvcnkgc291cmNlLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U291cmNlIGV4dGVuZHMgQWJzdHJhY3RTb3VyY2UgaW1wbGVtZW50cyBNb2RpZmlhYmxlVHJhdmVyc2FibGVTb3VyY2UgewotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgQ29udGVudEhvbGRlciBjb250ZW50OwotICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOwotICAgIHByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUUgPSAibGVueWEiOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gdXJpIFRoZSBzb3VyY2UgVVJJLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSByZXBvc2l0b3J5IHNlc3Npb24uCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEB0aHJvd3MgU291cmNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlTb3VyY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIHVyaSwgU2Vzc2lvbiBzZXNzaW9uLCBMb2dnZXIgbG9nZ2VyKQotICAgICAgICAgICAgdGhyb3dzIFNvdXJjZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiSW5pdCBSZXBvc2l0b3J5U291cmNlOiAiICsgdXJpKTsKLQotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcmVwb3NpdG9yeSBzZXNzaW9uIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLQotICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIlRoZSBzb3VyY2UgVVJJIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRTeXN0ZW1JZCh1cmkpOwotCi0gICAgICAgIC8vIFNjaGVtZQotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgZW5kID0gdXJpLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKGVuZCA9PSAtMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIk1hbGZvcm1lZCB1cmkgZm9yIHhtb2R1bGUgc291cmNlIChjYW5ub3QgZmluZCBzY2hlbWUpIDogIgotICAgICAgICAgICAgICAgICAgICArIHVyaSk7Ci0KLSAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgICAgIGlmICghU0NIRU1FLmVxdWFscyhzY2hlbWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigiTWFsZm9ybWVkIHVyaSBmb3IgYSB4bW9kdWxlIHNvdXJjZSA6ICIgKyB1cmkpOwotCi0gICAgICAgIHNldFNjaGVtZShzY2hlbWUpOwotCi0gICAgICAgIE5vZGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmFjdG9yeSA9IChOb2RlRmFjdG9yeSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChOb2RlRmFjdG9yeS5ST0xFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZVVyaTsKLSAgICAgICAgICAgIGludCByZXZpc2lvbk51bWJlciA9IC0xOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgcXVlc3Rpb25NYXJrSW5kZXggPSB1cmkuaW5kZXhPZigiPyIpOwotICAgICAgICAgICAgaWYgKHF1ZXN0aW9uTWFya0luZGV4ID4gLTEpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VVcmkgPSB1cmkuc3Vic3RyaW5nKDAsIHF1ZXN0aW9uTWFya0luZGV4KTsKLSAgICAgICAgICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeSh1cmkuc3Vic3RyaW5nKHF1ZXN0aW9uTWFya0luZGV4ICsgMSkpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXZpc2lvblN0cmluZyA9IHF1ZXJ5LmdldFZhbHVlKCJyZXYiLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAocmV2aXNpb25TdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQ29udGV4dFV0aWxpdHkgdXRpbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1dGlsID0gKENvbnRleHRVdGlsaXR5KSB0aGlzLm1hbmFnZXIubG9va3VwKENvbnRleHRVdGlsaXR5LlJPTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gdXRpbC5nZXRSZXF1ZXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2ViYXBwVXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbih0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgY3VycmVudERvYyA9IHB1Yi5nZXRGYWN0b3J5KCkuZ2V0RnJvbVVSTCh3ZWJhcHBVcmwpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnREb2MuZ2V0U291cmNlVVJJKCkuZXF1YWxzKHNvdXJjZVVyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbk51bWJlciA9IEludGVnZXIudmFsdWVPZihyZXZpc2lvblN0cmluZykuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZSh1dGlsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNvdXJjZVVyaSA9IHVyaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJldmlzaW9uTnVtYmVyID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gKENvbnRlbnRIb2xkZXIpIHNlc3Npb24uZ2V0UmVwb3NpdG9yeUl0ZW0oZmFjdG9yeSwgc291cmNlVXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBzZXNzaW9uLmdldFJlcG9zaXRvcnlJdGVtKGZhY3RvcnksIHNvdXJjZVVyaSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gbm9kZS5nZXRIaXN0b3J5KCkuZ2V0UmV2aXNpb24ocmV2aXNpb25OdW1iZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU291cmNlRXhjZXB0aW9uKCJDcmVhdGluZyByZXBvc2l0b3J5IG5vZGUgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShmYWN0b3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJlcG9zaXRvcnkgbm9kZSB3aGljaCBpcyBhY2Nlc3NlZCBieSB0aGlzIHNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotICAgICAgICAKLSAgICAgICAgaWYgKCEodGhpcy5jb250ZW50IGluc3RhbmNlb2YgTm9kZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG9wZXJhdGlvbiBjYW4gb25seSBiZSBpbnZva2VkIG9uIG5vZGVzLCBub3Qgb24gcmV2aXNpb25zLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKE5vZGUpIHRoaXMuY29udGVudDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTG9nZ2VyIGdldExvZ2dlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLk1vZGlmaWFibGVTb3VyY2UjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Tm9kZSgpLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuTW9kaWZpYWJsZVNvdXJjZSNkZWxldGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldE5vZGUoKS5kZWxldGUoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLk1vZGlmaWFibGVTb3VyY2UjY2FuQ2FuY2VsKGphdmEuaW8uT3V0cHV0U3RyZWFtKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkNhbmNlbChPdXRwdXRTdHJlYW0gYXJnMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuTW9kaWZpYWJsZVNvdXJjZSNjYW5jZWwoamF2YS5pby5PdXRwdXRTdHJlYW0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKE91dHB1dFN0cmVhbSBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZSNleGlzdHMoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChnZXRDb250ZW50KCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlI2dldElucHV0U3RyZWFtKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiR2V0IElucHV0U3RyZWFtIGZvciAiICsgZ2V0VVJJKCkpOwotICAgICAgICBpZiAoIWV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU291cmNlTm90Rm91bmRFeGNlcHRpb24oIlRoZSBzb3VyY2UgWyIgKyBnZXRVUkkoKSArICJdIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udGVudCgpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gY29udmVydChvcmcudzNjLmRvbS5Eb2N1bWVudCBlZG9jKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGZpbmFsIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IGVkb2M7Ci0gICAgICAgIGZpbmFsIFBpcGVkT3V0cHV0U3RyZWFtIHBvcyA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbSgpOwotICAgICAgICBQaXBlZElucHV0U3RyZWFtIHBpcyA9IG5ldyBQaXBlZElucHV0U3RyZWFtKCk7Ci0gICAgICAgIHBpcy5jb25uZWN0KHBvcyk7Ci0KLSAgICAgICAgKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKGRvYywgcG9zKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gdHJhbmZvcm0gb3JnLnczYy5kb20uRG9jdW1lbnQgdG8gUGlwZWRPdXRwdXRTdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LAotICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5jb252ZXJ0KG9yZy53M2MuZG9tLkRvY3VtZW50IGVkb2MpIikpLnN0YXJ0KCk7Ci0KLSAgICAgICAgcmV0dXJuIHBpczsKLSAgICB9Ci0KLSAgICB2b2lkIHRyYW5zZm9ybShvcmcudzNjLmRvbS5Eb2N1bWVudCBlZG9jLCBQaXBlZE91dHB1dFN0cmVhbSBwb3MpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQotICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgiZW5jb2RpbmciLCAiVVRGLTgiKTsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoImluZGVudCIsICJ5ZXMiKTsKLQotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShlZG9jKSwgbmV3IFN0cmVhbVJlc3VsdChwb3MpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IG9mIHRoaXMgc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50SG9sZGVyIGdldENvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlI2dldENvbnRlbnRMZW5ndGgoKQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udGVudCgpLmdldENvbnRlbnRMZW5ndGgoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZSNnZXRMYXN0TW9kaWZpZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb250ZW50KCkuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzb3VyY2UgVVJJLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVVJJKCkgewotICAgICAgICByZXR1cm4gZ2V0Q29udGVudCgpLmdldFNvdXJjZVVSSSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZSNnZXRNaW1lVHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb250ZW50KCkuZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgZ2V0UGFyZW50KCkgewotICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCJnZXRQYXJlbnQoKSBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYWtlQ29sbGVjdGlvbigpIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkud2FybigiUmVwb3NpdG9yeVNvdXJjZSgpLm1ha2VDb2xsZWN0aW9uKCkgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIC8vIFF1aWNrIGFuZCBkaXJ0eQotICAgICAgICBTdHJpbmcgbmFtZSA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0VVJJKCkpLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiZ2V0TmFtZSgpOiBVUkk6ICIgKyBuYW1lKTsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZSBnZXRDaGlsZChTdHJpbmcgbmFtZSkgewotICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCJnZXRDaGlsZCgpIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGdldE5vZGUoKS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgbmV3Q2hpbGRyZW4gPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE5vZGUgY2hpbGQgPSAoTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLmFkZChuZXcgUmVwb3NpdG9yeVNvdXJjZSh0aGlzLm1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRTb3VyY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGRyZW47Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXROb2RlKCkuaXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTb3VyY2VWYWxpZGl0eSB2YWxpZGl0eTsKLQotICAgIHB1YmxpYyBTb3VyY2VWYWxpZGl0eSBnZXRWYWxpZGl0eSgpIHsKLSAgICAgICAgaWYgKHRoaXMudmFsaWRpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy52YWxpZGl0eSA9IG5ldyBSZXBvc2l0b3J5U291cmNlVmFsaWRpdHkodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRpdHk7Ci0gICAgfQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9SZXBvc2l0b3J5U291cmNlVmFsaWRpdHkuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvUmVwb3NpdG9yeVNvdXJjZVZhbGlkaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMGI0MzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9SZXBvc2l0b3J5U291cmNlVmFsaWRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVZhbGlkaXR5OwotCi0vKioKLSAqIFZhbGlkaXR5IGZvciByZXBvc2l0b3J5IHNvdXJjZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U291cmNlVmFsaWRpdHkgaW1wbGVtZW50cyBTb3VyY2VWYWxpZGl0eSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZVVyaTsKLSAgICBwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIHRoaXMgdmFsaWRpdHkgaXMgZm9yLgotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5U291cmNlVmFsaWRpdHkoUmVwb3NpdG9yeVNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgdGhpcy5zb3VyY2VVcmkgPSBzb3VyY2UuZ2V0U291cmNlVVJJKCk7Ci0gICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gc291cmNlLmdldExhc3RNb2RpZmllZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaXNWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIFNvdXJjZVZhbGlkaXR5LlVOS05PV047Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpc1ZhbGlkKFNvdXJjZVZhbGlkaXR5IHZhbGlkaXR5KSB7Ci0gICAgICAgIGlmICh2YWxpZGl0eSBpbnN0YW5jZW9mIFJlcG9zaXRvcnlTb3VyY2VWYWxpZGl0eSkgewotICAgICAgICAgICAgUmVwb3NpdG9yeVNvdXJjZVZhbGlkaXR5IHJlcG9WYWxpZGl0eSA9IChSZXBvc2l0b3J5U291cmNlVmFsaWRpdHkpIHZhbGlkaXR5OwotICAgICAgICAgICAgU3RyaW5nIHJlcG9WYWxpZGl0eVVyaSA9IHJlcG9WYWxpZGl0eS5nZXRTb3VyY2VVUkkoKTsKLQotICAgICAgICAgICAgaWYgKCFyZXBvVmFsaWRpdHlVcmkuZXF1YWxzKHRoaXMuc291cmNlVXJpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXcm9uZyBzb3VyY2UgVVJJOiBbIiArIHJlcG9WYWxpZGl0eVVyaQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBpbnN0ZWFkIG9mIFsiICsgdGhpcy5zb3VyY2VVcmkgKyAiXSEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLmxhc3RNb2RpZmllZCA+PSByZXBvVmFsaWRpdHkuZ2V0TGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU291cmNlVmFsaWRpdHkuVkFMSUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBTb3VyY2VWYWxpZGl0eS5JTlZBTElEOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFNvdXJjZVZhbGlkaXR5LklOVkFMSUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhc3RNb2RpZmllZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlVXJpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9TaXRlU291cmNlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL1NpdGVTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5YTM5Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL1NpdGVTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250YWluZXIuQ29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VWYWxpZGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuaW1wbC52YWxpZGl0eS5UaW1lU3RhbXBWYWxpZGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuUXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci0KLS8qKgotICogU291cmNlIGZvciB0aGUgc2l0ZTovIHByb3RvY29sLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZVNvdXJjZSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFNvdXJjZSB7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBTb3VyY2UgZGVsZWdhdGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGNvY29vbiByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgc291cmNlIFVSSS4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIFNpdGVTb3VyY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgUmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgbG9jYXRpb24sIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKHRoaXMsIGxvZ2dlcik7Ci0KLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgdGhpcy51cmkgPSBsb2NhdGlvbjsKLQotICAgICAgICBTdHJpbmcgYXJlYU5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgcHViSWQ7Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIGxvY2F0aW9uU3RlcHMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxvY2F0aW9uLCAiPyIpOwotICAgICAgICBTdHJpbmcgY29tcGxldGVQYXRoID0gbG9jYXRpb25TdGVwcy5uZXh0VG9rZW4oKTsKLQotICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICB0aGlzLnNjaGVtZSA9IGNvbXBsZXRlUGF0aC5zdWJzdHJpbmcoMCwgY29tcGxldGVQYXRoLmluZGV4T2YoIjoiKSArIDEpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFic29sdXRlUGF0aCA9IGNvbXBsZXRlUGF0aC5zdWJzdHJpbmcoc2NoZW1lLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGlmIChhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aCgiLy8iKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmdWxsUGF0aCA9IGFic29sdXRlUGF0aC5zdWJzdHJpbmcoMik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ZXBzID0gbmV3IFN0cmluZ1Rva2VuaXplcihmdWxsUGF0aCwgIi8iKTsKLSAgICAgICAgICAgICAgICBwdWJJZCA9IHN0ZXBzLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGFyZWFOYW1lID0gc3RlcHMubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHB1YklkICsgIi8iICsgYXJlYU5hbWU7Ci0gICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gZnVsbFBhdGguc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2ViYXBwVXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgVVJMSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBVUkxJbmZvcm1hdGlvbih3ZWJhcHBVcmwpOwotICAgICAgICAgICAgICAgIHB1YklkID0gaW5mby5nZXRQdWJsaWNhdGlvbklkKCk7Ci0gICAgICAgICAgICAgICAgYXJlYU5hbWUgPSBpbmZvLmdldEFyZWEoKTsKLSAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIlRoZSBwYXRoIFsiICsgYWJzb2x1dGVQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIG11c3Qgc3RhcnQgd2l0aCBhdCBsZWFzdCBvbmUgc2xhc2guIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmdldERvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgUHVibGljYXRpb24gcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgICAgICAgICBTaXRlU3RydWN0dXJlIHNpdGUgPSBwdWIuZ2V0QXJlYShhcmVhTmFtZSkuZ2V0U2l0ZSgpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBzdGVwcyA9IHJlbGF0aXZlUGF0aC5zdWJzdHJpbmcoMSkuc3BsaXQoIi8iKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gc3RlcHNbMF07Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIi8iICsgbGFuZ3VhZ2U7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJlbGF0aXZlUGF0aC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKTsKLQotICAgICAgICAgICAgaWYgKHNpdGUuY29udGFpbnMocGF0aCwgbGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gc2l0ZS5nZXROb2RlKHBhdGgpLmdldExpbmsobGFuZ3VhZ2UpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uU3RlcHMuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KGxvY2F0aW9uU3RlcHMubmV4dFRva2VuKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0ID0gcXVlcnkuZ2V0VmFsdWUoImZvcm1hdCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBnZXRGb3JtYXRTb3VyY2UoZG9jLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlbGVnYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxlbnlhVVJMID0gZG9jLmdldFNvdXJjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBuZXcgUmVwb3NpdG9yeVNvdXJjZShtYW5hZ2VyLCBsZW55YVVSTCwgc2Vzc2lvbiwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlID09IG51bGwgPyAwIDogdGhpcy5kZWxlZ2F0ZS5nZXRDb250ZW50TGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9PSBudWxsID8gMCA6IHRoaXMuZGVsZWdhdGUuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPT0gbnVsbCA/ICIiIDogdGhpcy5kZWxlZ2F0ZS5nZXRNaW1lVHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU291cmNlVmFsaWRpdHkgZ2V0VmFsaWRpdHkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmdldFZhbGlkaXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU291cmNlIGdldEZvcm1hdFNvdXJjZShEb2N1bWVudCBkb2MsIFN0cmluZyBmb3JtYXQpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNlcnZpY2VFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZm9ybWF0QmFzZVVyaSA9IGRvYy5nZXRSZXNvdXJjZVR5cGUoKS5nZXRGb3JtYXRVUkkoZm9ybWF0KTsKLSAgICAgICAgU3RyaW5nIGZvcm1hdFVyaSA9IGZvcm1hdEJhc2VVcmkgKyAiLyIgKyBkb2MuZ2V0UHVibGljYXRpb24oKS5nZXRJZCgpICsgIi8iICsgZG9jLmdldEFyZWEoKQotICAgICAgICAgICAgICAgICsgIi8iICsgZG9jLmdldFVVSUQoKSArICIvIiArIGRvYy5nZXRMYW5ndWFnZSgpOwotCi0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyLnJlc29sdmVVUkkoZm9ybWF0VXJpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL1NpdGVTb3VyY2VGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL1NpdGVTb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMzBjNmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9TaXRlU291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhpcyBzb3VyY2UgZmFjdG9yeSBhbGxvd3MgdG8gYWNjZXNzIGRvY3VtZW50cyBiYXNlZCBvbiB0aGVpciBwYXRoIGluIHRoZSBzaXRlIHN0cnVjdHVyZS4KLSAqIDwvcD4KLSAqIDxwPgotICogUmVsYXRpdmUgYWRkcmVzc2luZyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgcHVibGljYXRpb24gYW5kIGFyZWEuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN5bnRheDoKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT5BYnNvbHV0ZTogPGNvZGU+c2l0ZTovL3twdWJJZH0ve2FyZWF9L3tsYW5ndWFnZX17cGF0aH08L2NvZGU+PC9saT4KLSAqIDxsaT5SZWxhdGl2ZTogPGNvZGU+c2l0ZTove2xhbmd1YWdlfXtwYXRofTwvY29kZT48L2xpPgotICogPC91bD4KLSAqIDxwPgotICogVXNhZ2UgZXhhbXBsZXM6Ci0gKiA8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+PGNvZGU+c2l0ZTovL2RlZmF1bHQvYXV0aG9yaW5nL2VuL25ld3MvdG9kYXk8L2NvZGU+PC9saT4KLSAqIDxsaT48Y29kZT5zaXRlOi9lbi9uZXdzL3RvZGF5PC9jb2RlPjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZVNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBTb3VyY2VGYWN0b3J5LCBUaHJlYWRTYWZlLAotICAgICAgICBDb250ZXh0dWFsaXphYmxlLCBTZXJ2aWNlYWJsZSwgQ29uZmlndXJhYmxlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJzaXRlIjsKLQotICAgIHByaXZhdGUgQ29udGV4dCBjb250ZXh0OwotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIFVzZWQgZm9yIHJlc29sdmluZyB0aGUgb2JqZWN0IG1vZGVsLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZSNjb250ZXh0dWFsaXplKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udGV4dHVhbGl6ZShDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb250ZXh0RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGUjY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUZhY3RvcnkjZ2V0U291cmNlKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZSBnZXRTb3VyY2UoU3RyaW5nIGxvY2F0aW9uLCBNYXAgcGFyYW1ldGVycykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uLCBTb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNYXAgb2JqZWN0TW9kZWwgPSBDb250ZXh0SGVscGVyLmdldE9iamVjdE1vZGVsKHRoaXMuY29udGV4dCk7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotICAgICAgICByZXR1cm4gbmV3IFNpdGVTb3VyY2UodGhpcy5tYW5hZ2VyLCByZXF1ZXN0LCBsb2NhdGlvbiwgZ2V0TG9nZ2VyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUZhY3RvcnkjcmVsZWFzZShvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoU291cmNlIHNvdXJjZSkgewotICAgICAgICAvLyBTb3VyY2Ugd2lsbCBiZSByZWxlYXNlZCBieSBkZWxlZ2F0ZWQgc291cmNlIGZhY3RvcnkuCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL1NvdXJjZVV0aWwuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvU291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhkYWJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvU291cmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLm91dHB1dC5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLk1vZGlmaWFibGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLk1vZGlmaWFibGVUcmF2ZXJzYWJsZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVV0aWwgewotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29waWVzIG9uZSBTb3VyY2UgdG8gYW5vdGhlciB1c2luZyBhIHNvdXJjZSBidWZmZXIgaS5lLiB0aGUgc291cmNlIFNvdXJjZQotICAgICAqIGlzIGJ1ZmZlcmVkIGJlZm9yZSBpdCBpcyBjb3BpZWQgdG8gaXRzIGZpbmFsIGRlc3RpbmF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgb3B0aW9uYWwgYnVmZmVyaW5nIGlzIHNvbWV0aW1lcyB1c2VmdWwsIGlmIHRoZSBzb3VyY2UgU291cmNlIHNvbWVob3cKLSAgICAgKiBkZXBlbmRzIG9uIHRoZSBkZXN0aW5hdGlvbiBTb3VyY2UuIFRoaXMgc2l0dWF0aW9uIG1heSBvY2N1ciBlLmcuIGlmCi0gICAgICogc291cmNlIFNvdXJjZSBpcyBhIENvY29vbiBwaXBlbGluZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogPGVtPk5PVEU6PC9lbT4gby5hLmUuLnMuU291cmNlVXRpbC5jb3B5IGRvZXMgbm90IGNsb3NlIHN0cmVhbXMgb24gYW4KLSAgICAgKiBleGNlcHRpb24hIQotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gICAgICogQHBhcmFtIHVzZUJ1ZmZlciBJZiB0cnVlLCB0aGUgc291cmNlIGRhdGEgd2lsbCBiZSByZWFkIGludG8gYSBidWZmZXIKLSAgICAgKiAgICAgICAgYmVmb3JlIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIGZpbmFsIGRlc3RpbmF0aW9uLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShTb3VyY2Ugc291cmNlLCBNb2RpZmlhYmxlU291cmNlIGRlc3RpbmF0aW9uLCBib29sZWFuIHVzZUJ1ZmZlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIHNvdXJjZUlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIGRlc3RPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc291cmNlSW5wdXRTdHJlYW0gPSBzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGRlc3RPdXRwdXRTdHJlYW0gPSBkZXN0aW5hdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgaWYgKHVzZUJ1ZmZlcikgewotICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzb3VyY2VCb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KHNvdXJjZUlucHV0U3RyZWFtLCBzb3VyY2VCb3MpOwotICAgICAgICAgICAgICAgIElPVXRpbHMud3JpdGUoc291cmNlQm9zLnRvQnl0ZUFycmF5KCksIGRlc3RPdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJT1V0aWxzLmNvcHkoc291cmNlSW5wdXRTdHJlYW0sIGRlc3RPdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRlc3RPdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlc3RPdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICBkZXN0T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc291cmNlSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvdXJjZUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgb25lIFNvdXJjZSB0byBhbm90aGVyLiBUaGUgc291cmNlIFNvdXJjZSBpcyBvcHRpb25hbGx5IGJ1ZmZlcmVkLgotICAgICAqIEBwYXJhbSByZXNvbHZlciBUaGUgU291cmNlUmVzb2x2ZXIgdG8gdXNlIGZvciBsb29raW4gdXAgU291cmNlcy4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSBzb3VyY2UgdG8gYmUgY29waWVkLgotICAgICAqIEBwYXJhbSBkZXN0VXJpIFRoZSBVUkkgdG8gY29weSB0by4KLSAgICAgKiBAcGFyYW0gdXNlQnVmZmVyIElmIHRydWUsIHRoZSBzb3VyY2UgU291cmNlIGlzIGJ1ZmZlcmVkIGJlZm9yZSBjb3BpZWQgdG8KLSAgICAgKiAgICAgICAgdGhlIGZpbmFsIGRlc3RpbmF0aW9uLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlcy4KLSAgICAgKiBAdGhyb3dzIFNvdXJjZUV4Y2VwdGlvbiBJZiB0aGUgZGVzdGluYXRpb24gaXMgbm90IG1vZGlmaWFibGUuCi0gICAgICogQHNlZSAjY29weShTb3VyY2UsIE1vZGlmaWFibGVTb3VyY2UsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBzb3VyY2VVcmksIFN0cmluZyBkZXN0VXJpLAotICAgICAgICAgICAgYm9vbGVhbiB1c2VCdWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgU291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIFNvdXJjZSBkZXN0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLSAgICAgICAgICAgIGRlc3QgPSByZXNvbHZlci5yZXNvbHZlVVJJKGRlc3RVcmkpOwotCi0gICAgICAgICAgICBpZiAoIShkZXN0IGluc3RhbmNlb2YgTW9kaWZpYWJsZVNvdXJjZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNvdXJjZUV4Y2VwdGlvbigiRGVzdGluYXRpb24gJyIgKyBkZXN0LmdldFVSSSgpICsgIicgaXMgbm90IG1vZGlmaWFibGUuIik7Ci0KLSAgICAgICAgICAgIGNvcHkoc291cmNlLCAoTW9kaWZpYWJsZVNvdXJjZSkgZGVzdCwgdXNlQnVmZmVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICBpZiAoZGVzdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2UoZGVzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSBTb3VyY2Ugd2l0aG91dCBidWZmZXJpbmcuCi0gICAgICogQHBhcmFtIHJlc29sdmVyIEEgU291cmNlUmVzb2x2ZXIgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIHNvdXJjZVVyaSBUaGUgc291cmNlIFVSSSB0byBjb3B5IGZyb20uCi0gICAgICogQHBhcmFtIGRlc3RVcmkgVGhlIGRlc3RpbmF0aW9uIFVSSSB0byBjb3B5IHRvLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlcy4KLSAgICAgKiBAc2VlICNjb3B5KFNvdXJjZVJlc29sdmVyLCBTdHJpbmcsIFN0cmluZywgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIHNvdXJjZVVyaSwgU3RyaW5nIGRlc3RVcmkpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjb3B5KHJlc29sdmVyLCBzb3VyY2VVcmksIGRlc3RVcmksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSBTb3VyY2Ugd2l0aG91dCBidWZmZXJpbmcuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgQSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHNvdXJjZVVyaSBUaGUgc291cmNlIFVSSSB0byBjb3B5IGZyb20uCi0gICAgICogQHBhcmFtIGRlc3RVcmkgVGhlIGRlc3RpbmF0aW9uIFVSSSB0byBjb3B5IHRvLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlcy4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAc2VlICNjb3B5KFNvdXJjZVJlc29sdmVyLCBTdHJpbmcsIFN0cmluZywgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgc291cmNlVXJpLCBTdHJpbmcgZGVzdFVyaSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBtYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIGNvcHkocmVzb2x2ZXIsIHNvdXJjZVVyaSwgZGVzdFVyaSwgZmFsc2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBET00gZnJvbSBhIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSBzb3VyY2UgVVJJLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzb3VyY2UgZG9lcyBub3QgZXhpc3QuCi0gICAgICogQHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IHJlYWRET00oU3RyaW5nIHNvdXJjZVVyaSwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uLCBTb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBtYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgRE9NIHRvIGEgc291cmNlLgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHNvdXJjZVVyaSBUaGUgc291cmNlIFVSSS4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gaWYgdGhlIHNvdXJjZSByZXNvbHZlciBjb3VsZCBub3QgYmUgb2J0YWluZWQuCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBVUkkgaXMgbm90IHZhbGlkLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURPTShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHNvdXJjZVVyaSwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBTZXJ2aWNlRXhjZXB0aW9uLAotICAgICAgICAgICAgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgTW9kaWZpYWJsZVNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgbWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSAoTW9kaWZpYWJsZVNvdXJjZSkgcmVzb2x2ZXIucmVzb2x2ZVVSSShzb3VyY2VVcmkpOwotCi0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb1N0cmVhbSA9IHNvdXJjZS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIHdyaXRlRE9NKGRvY3VtZW50LCBvU3RyZWFtKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgWE1MIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBvU3RyZWFtIFRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVET00oRG9jdW1lbnQgZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBvU3RyZWFtKQotICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRIZWxwZXIud3JpdGVEb2N1bWVudChkb2N1bWVudCwgb1N0cmVhbSk7Ci0gICAgICAgIGlmIChvU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9TdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb1N0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGRvY3VtZW50OiAiLCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBzb3VyY2UgaWYgaXQgZXhpc3RzLgotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkgVGhlIHNvdXJjZSBVUkkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKFN0cmluZyBzb3VyY2VVcmksIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uLAotICAgICAgICAgICAgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgTW9kaWZpYWJsZVRyYXZlcnNhYmxlU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBtYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IChNb2RpZmlhYmxlVHJhdmVyc2FibGVTb3VyY2UpIHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2UuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYWxsIGVtcHR5IGNvbGxlY3Rpb25zIGluIGEgc3VidHJlZS4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSByb290IHNvdXJjZSBVUkkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRW1wdHlDb2xsZWN0aW9ucyhTdHJpbmcgc291cmNlVXJpLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIE1vZGlmaWFibGVUcmF2ZXJzYWJsZVNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIG1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gKE1vZGlmaWFibGVUcmF2ZXJzYWJsZVNvdXJjZSkgcmVzb2x2ZXIucmVzb2x2ZVVSSShzb3VyY2VVcmkpOwotICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0NvbGxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlVHJhdmVyc2FibGVTb3VyY2UgY2hpbGQgPSAoTW9kaWZpYWJsZVRyYXZlcnNhYmxlU291cmNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlRW1wdHlDb2xsZWN0aW9ucyhjaGlsZC5nZXRVUkkoKSwgbWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgc291cmNlIGV4aXN0cy4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSBzb3VyY2UgVVJJLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4aXN0cyhTdHJpbmcgc291cmNlVXJpLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgbWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHNvdXJjZVVyaSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzb3VyY2UuZXhpc3RzKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIGEgc291cmNlLgotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkgVGhlIHNvdXJjZSBVUkkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIEEgbG9uZyB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKFN0cmluZyBzb3VyY2VVcmksIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpCi0gICAgICAgICAgICB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBtYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLQotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBvdXQgYSByZXBvc2l0b3J5IHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSBzb3VyY2UgVVJJLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tvdXQoU3RyaW5nIHNvdXJjZVVyaSwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uLCBTZXJ2aWNlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBSZXBvc2l0b3J5U291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBtYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IChSZXBvc2l0b3J5U291cmNlKSByZXNvbHZlci5yZXNvbHZlVVJJKHNvdXJjZVVyaSk7Ci0KLSAgICAgICAgICAgIHNvdXJjZS5nZXROb2RlKCkuY2hlY2tvdXQoKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGluIGEgdHJhbnNhY3Rpb25hYmxlIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSBzb3VyY2UgVVJJLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tpbihTdHJpbmcgc291cmNlVXJpLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKQotICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFJlcG9zaXRvcnlTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIG1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gKFJlcG9zaXRvcnlTb3VyY2UpIHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLQotICAgICAgICAgICAgc291cmNlLmdldE5vZGUoKS5jaGVja2luKCk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvY2tzIGEgdHJhbnNhY3Rpb25hYmxlIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSBzb3VyY2UgVVJJLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9jayhTdHJpbmcgc291cmNlVXJpLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgUmVwb3NpdG9yeVNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgbWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSAoUmVwb3NpdG9yeVNvdXJjZSkgcmVzb2x2ZXIucmVzb2x2ZVVSSShzb3VyY2VVcmkpOwotCi0gICAgICAgICAgICBzb3VyY2UuZ2V0Tm9kZSgpLmxvY2soKTsKLQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVubG9ja3MgYSB0cmFuc2FjdGlvbmFibGUgc291cmNlLgotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkgVGhlIHNvdXJjZSBVUkkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmxvY2soU3RyaW5nIHNvdXJjZVVyaSwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFJlcG9zaXRvcnlTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIG1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gKFJlcG9zaXRvcnlTb3VyY2UpIHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLQotICAgICAgICAgICAgc291cmNlLmdldE5vZGUoKS51bmxvY2soKTsKLQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIHNvdXJjZSBhcyBkaXJ0eS4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSBzb3VyY2UgVVJJLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRGlydHkoU3RyaW5nIHNvdXJjZVVyaSwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFJlcG9zaXRvcnlTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIG1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gKFJlcG9zaXRvcnlTb3VyY2UpIHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLSAgICAgICAgICAgIHNvdXJjZS5nZXROb2RlKCkucmVnaXN0ZXJEaXJ0eSgpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkgVGhlIHNvdXJjZSBVUkkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIEEgY29udGVudCBsZW5ndGguCi0gICAgICogQHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoU3RyaW5nIHNvdXJjZVVyaSwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIG1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSShzb3VyY2VVcmkpOwotCi0gICAgICAgICAgICByZXR1cm4gc291cmNlLmdldENvbnRlbnRMZW5ndGgoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkgVGhlIHNvdXJjZSBVUkkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIEEgbWltZSB0eXBlLgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1pbWVUeXBlKFN0cmluZyBzb3VyY2VVcmksIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpCi0gICAgICAgICAgICB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBtYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLQotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRNaW1lVHlwZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlc29sdmVyCi0gICAgICogQHBhcmFtIHNvdXJjZVVyaQotICAgICAqIEBwYXJhbSBkZXN0T3V0cHV0U3RyZWFtCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBzb3VyY2VVcmksIE91dHB1dFN0cmVhbSBkZXN0T3V0cHV0U3RyZWFtKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gdXNlQnVmZmVyID0gdHJ1ZTsKLSAgICAgICAgSW5wdXRTdHJlYW0gc291cmNlSW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLSAgICAgICAgICAgIHNvdXJjZUlucHV0U3RyZWFtID0gc291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIGlmICh1c2VCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc291cmNlQm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIElPVXRpbHMuY29weShzb3VyY2VJbnB1dFN0cmVhbSwgc291cmNlQm9zKTsKLSAgICAgICAgICAgICAgICBJT1V0aWxzLndyaXRlKHNvdXJjZUJvcy50b0J5dGVBcnJheSgpLCBkZXN0T3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KHNvdXJjZUlucHV0U3RyZWFtLCBkZXN0T3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkZXN0T3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZXN0T3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgZGVzdE91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNvdXJjZUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VJbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvVGVtcGxhdGVGYWxsYmFja1NvdXJjZUZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvVGVtcGxhdGVGYWxsYmFja1NvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkM2ZjOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL1RlbXBsYXRlRmFsbGJhY2tTb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmcuRXhpc3RpbmdBbmNlc3RvclNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmcuVmlzaXRpbmdTb3VyY2VSZXNvbHZlcjsKLQotLyoqCi0gKiBTb3VyY2UgZmFjdG9yeSBmb2xsb3dpbmcgdGhlIGZhbGxiYWNrIHByaW5jaXBsZSwgcmVzb2x2aW5nIHRoZSBleGlzdGluZyBhbmNlc3RvciBvZiB0aGUgZXhpc3RpbmcgcmVzb3VyY2UuCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVVJMIHN5bnRheCwgc2VlIHtAbGluayBGYWxsYmFja1NvdXJjZUZhY3Rvcnl9LgotICogCi0gKiBAdmVyc2lvbiAkSWQ6IEZhbGxiYWNrU291cmNlRmFjdG9yeS5qYXZhIDI2NDE1MyAyMDA1LTA4LTI5IDE1OjExOjE0WiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlRmFsbGJhY2tTb3VyY2VGYWN0b3J5IGV4dGVuZHMgRmFsbGJhY2tTb3VyY2VGYWN0b3J5IHsKLQotICAgIHByb3RlY3RlZCBWaXNpdGluZ1NvdXJjZVJlc29sdmVyIGdldFNvdXJjZVZpc2l0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhpc3RpbmdBbmNlc3RvclNvdXJjZVJlc29sdmVyKCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9aaXBTb3VyY2UuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvWmlwU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZmYzZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9aaXBTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZTsKLS8vcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNvdXJjZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24udXRpbC5NSU1FVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVZhbGlkaXR5OwotCi0vKioKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Imh0dHA6Ly9hcGFjaGUub3JnL35yZWluaGFyZCI+UmVpbmhhcmQgUG9ldHo8L2E+Ci0gICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3ppZWdlbGVyQGFwYWNoZS5vcmciPkNhcnN0ZW4gWmllZ2VsZXI8L2E+Ci0gICogQHZlcnNpb24gQ1ZTICRJZDogWmlwU291cmNlLmphdmEgMzA5MzIgMjAwNC0wNy0yOSAxNzozNTozOFogdmdyaXRzZW5rbyAkCi0gICogQHNpbmNlIDIuMS40IAotICAqLwotcHVibGljIGNsYXNzIFppcFNvdXJjZSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFNvdXJjZSB7Ci0KLSAgICBTb3VyY2UgYXJjaGl2ZTsKLSAgICBTdHJpbmcgZG9jdW1lbnROYW1lOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gYXJjaGl2ZSBUaGUgYXJjaGl2ZSBzb3VyY2UuCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIFRoZSBmaWxlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWmlwU291cmNlKFNvdXJjZSBhcmNoaXZlLCBTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5hcmNoaXZlID0gYXJjaGl2ZTsKLSAgICAgICAgdGhpcy5kb2N1bWVudE5hbWUgPSBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIGlmKCF0aGlzLmFyY2hpdmUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aXBTdHJlYW0gPSBudWxsOwotICAgICAgICBaaXBFbnRyeSBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHppcFN0cmVhbSA9IG5ldyBaaXBJbnB1dFN0cmVhbSh0aGlzLmFyY2hpdmUuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnQgPSB6aXBTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldE5hbWUoKS5lcXVhbHModGhpcy5kb2N1bWVudE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aXBTdHJlYW0uY2xvc2VFbnRyeSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoZG9jdW1lbnQgIT0gbnVsbCAmJiBmb3VuZCA9PSBmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHppcFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5lcnJvcigiRXJyb3Igd2hpbGUgY2xvc2luZyBaaXBJbnB1dFN0cmVhbTogIiArIHRoaXMuZG9jdW1lbnROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIGZvdW5kOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQotICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aXBTdHJlYW0gPQotICAgICAgICAgICAgbmV3IFppcElucHV0U3RyZWFtKHRoaXMuYXJjaGl2ZS5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgWmlwRW50cnkgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gemlwU3RyZWFtLmdldE5leHRFbnRyeSgpOwotICAgICAgICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmRvY3VtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdvIHRvIG5leHQgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgemlwU3RyZWFtLmNsb3NlRW50cnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGRvY3VtZW50ICE9IG51bGwgJiYgZm91bmQgPT0gZmFsc2UpOwotCi0gICAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU291cmNlTm90Rm91bmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBkb2N1bWVudCAiCi0gICAgICAgICAgICAgICAgICAgICsgZG9jdW1lbnROYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgaW4gdGhlIGFyY2hpdmUgIgotICAgICAgICAgICAgICAgICAgICArIHRoaXMuYXJjaGl2ZS5nZXRVUkkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgd2Ugd2lsbCBleHRyYWN0IHRoZSBkb2N1bWVudCBhbmQgd3JpdGUgaXQgaW50byBhIGJ5dGUgYXJyYXkKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLSAgICAgICAgaW50IGxlbmd0aCA9IC0xOwotICAgICAgICB3aGlsZSAoemlwU3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewotICAgICAgICAgICAgbGVuZ3RoID0gemlwU3RyZWFtLnJlYWQoYnVmZmVyLCAwLCA4MTkyKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgYmFvcy53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgemlwU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIGJhb3MuZmx1c2goKTsKLQotICAgICAgICAvLyByZXR1cm4gYW4gaW5wdXQgc3RyZWFtCi0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJjaGl2ZS5nZXRVUkkoKSArICIvIiArIHRoaXMuZG9jdW1lbnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgewotICAgICAgICByZXR1cm4gWmlwU291cmNlRmFjdG9yeS5aSVBfU09VUkNFX1NDSEVNRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU291cmNlVmFsaWRpdHkgZ2V0VmFsaWRpdHkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFyY2hpdmUuZ2V0VmFsaWRpdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7Ci0gICAgICAgIFN0cmluZyBleHQgPSB0aGlzLmRvY3VtZW50TmFtZS5zdWJzdHJpbmcoIHRoaXMuZG9jdW1lbnROYW1lLmxhc3RJbmRleE9mKCIuIikgKTsKLSAgICAgICAgcmV0dXJuIE1JTUVVdGlscy5nZXRNSU1FVHlwZSggZXh0ICk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJjaGl2ZS5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvWmlwU291cmNlRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9aaXBTb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzc2ZWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9aaXBTb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNvdXJjZS5pbXBsOwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLQotCi0vKiogSW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgU291cmNlfSB0aGF0IGdldHMgaXRzIGNvbnRlbnQgZnJvbQotICAqIGFuZCBaSVAgYXJjaGl2ZS4KLSAgKiAKLSAgKiBBIFpJUCBzb3VyY2UgY2FuIGJlIHJlYWNoZWQgdXNpbmcgdGhlIHppcDovLyBwc2V1ZG8tcHJvdG9jb2wuIFRoZSBzeW50YXggaXMKLSAgKiB6aXA6Ly9teUZpbGUueG1sQG15WmlwLnppcCAoemlwOi8vW2ZpbGVdQFthcmNoaXZlXSkKLSAgKiAKLSAgKiBAYXV0aG9yIDxhIGhyZWY9Imh0dHA6Ly9hcGFjaGUub3JnL35yZWluaGFyZCI+UmVpbmhhcmQgUG9ldHo8L2E+Ci0gICogQHZlcnNpb24gQ1ZTICRJZDogWmlwU291cmNlRmFjdG9yeS5qYXZhIDMwOTMyIDIwMDQtMDctMjkgMTc6MzU6MzhaIHZncml0c2Vua28gJAotICAqIEBzaW5jZSAyLjEuNAotICAqLyAKLXB1YmxpYyBjbGFzcyBaaXBTb3VyY2VGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkCi0gICAgaW1wbGVtZW50cyBTb3VyY2VGYWN0b3J5LCBUaHJlYWRTYWZlLCBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLSAgICAvKioKLSAgICAgKiBUaGUgVVJMIHNjaGVtZSwgaW5jbHVkaW5nIHRoZSBjb2xvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaSVBfU09VUkNFX1NDSEVNRSA9ICJ6aXA6IjsKLQotICAgIHB1YmxpYyBTb3VyY2UgZ2V0U291cmNlKFN0cmluZyBsb2NhdGlvbiwgTWFwIHBhcmFtZXRlcnMpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIGlmICggdGhpcy5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5kZWJ1ZygiUHJvY2Vzc2luZyAiICsgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzeW50YXggY2hlY2tzCi0gICAgICAgIGludCBzZXBhcmF0b3JQb3MgPSBsb2NhdGlvbi5pbmRleE9mKCdAJyk7Ci0gICAgICAgIGlmIChzZXBhcmF0b3JQb3MgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIkAgcmVxdWlyZWQgaW4gVVJJOiAiICsgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGludCBwcm90b2NvbEVuZCA9IGxvY2F0aW9uLmluZGV4T2YoIjovLyIpOwotICAgICAgICBpZiAocHJvdG9jb2xFbmQgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIlVSSSBkb2VzIG5vdCBjb250YWluICc6Ly8nIDogIiArIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgc291cmNlIG9mIHRoZSBhcmNoaXZlIGFuZCByZXR1cm4gdGhlIFppcFNvdXJjZSBwYXNzaW5nCi0gICAgICAgIC8vIGEgc291cmNlIHJldHJpZXZlZCBmcm9tIHRoZSBTb3VyY2VSZXNvbHZlcgotICAgICAgICBTdHJpbmcgZG9jdW1lbnROYW1lID0gbG9jYXRpb24uc3Vic3RyaW5nKHByb3RvY29sRW5kICsgMywgc2VwYXJhdG9yUG9zKTsKLSAgICAgICAgU291cmNlIGFyY2hpdmU7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKXRoaXMubWFuYWdlci5sb29rdXAoIFNvdXJjZVJlc29sdmVyLlJPTEUgKTsKLSAgICAgICAgICAgIGFyY2hpdmUgPSByZXNvbHZlci5yZXNvbHZlVVJJKGxvY2F0aW9uLnN1YnN0cmluZyhzZXBhcmF0b3JQb3MgKyAxKSk7ICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTb3VyY2VFeGNlcHRpb24oIlNvdXJjZVJlc29sdmVyIGlzIG5vdCBhdmFpbGFibGUuIiwgc2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgWmlwU291cmNlKGFyY2hpdmUsIGRvY3VtZW50TmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKFNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3RyYW5zZm9ybWF0aW9uL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMDc3NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24udHJhbnNmb3JtYXRpb24uQWJzdHJhY3RTQVhUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKgotICogTWV0YSBkYXRhIHRyYW5zZm9ybWVyLgotICovCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0U0FYVHJhbnNmb3JtZXIgaW1wbGVtZW50cwotICAgICAgICBEaXNwb3NhYmxlIHsKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZXNwYWNlIGZvciB0aGUgbWV0YSBkYXRhIGlzIGh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGEvMS4wCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhLzEuMC8iOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJtZXRhIjsKLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBlbGVtZW50IGlzIGdldHRpbmcgdGhlIHZhbHVlIGZvciBhIHNwZWNpZmljIG5zIGFuZCBrZXkuIEl0IGlzCi0gICAgICogdGhlIG9ubHkgbWV0aG9kIGltcGxlbWVudGVkIHNvIGZhci4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBWQUxVRV9FTEVNRU5UID0gInZhbHVlIjsKLQotICAgIC8qKgotICAgICAqIEVMRU1FTlRfQVRUIC0gd2hpY2ggbWV0YSBkYXRhIGtleSBkbyB3ZSB3YW50IHRvIGxvb2sgdXAKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0FUVCA9ICJlbGVtZW50IjsKLQotICAgIC8qKgotICAgICAqIE5TX0FUVCAtIGluIHdoaWNoIG5hbWVzcGFjZSBzaG91bGQgd2UgbG9vawotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIE5TX0FUVCA9ICJucyI7Ci0KLSAgICAvKioKLSAgICAgKiBVVUlEX0FUVCAtIGZvciB3aGljaCB1dWlkPwotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFVVSURfQVRUID0gInV1aWQiOwotCi0gICAgLyoqCi0gICAgICogTEFOR19BVFQgLSBpbiB3aGljaCBsYW5ndWFnZSB0aGlzIGlzIG9wdGlvbmFsICh3aGVuIG5vdCBmb3VuZCB1c2UKLSAgICAgKiBwdWJsaWNhdGlvbiBkZWZhdWx0KQotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIExBTkdfQVRUID0gImxhbmciOwotCi0gICAgLyoqIEhlbHBlciBmb3IgbGVueWEgZG9jdW1lbnQgcmV0cml2YWwgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY2F0aW9uSWQgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBhcmVhID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyB1dWlkID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBQdWJsaWNhdGlvbiBwdWI7Ci0KLSAgICBwcml2YXRlIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogU2V0dXAgdGhlIE1ldGFEYXRhVHJhbnNmb3JtZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0dXAoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIHNyYywKLSAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXR1cChyZXNvbHZlciwgb2JqZWN0TW9kZWwsIHNyYywgcGFyKTsKLSAgICAgICAgdGhpcy5wdWJsaWNhdGlvbklkID0gcGFyLmdldFBhcmFtZXRlcigicHViaWQiLCBudWxsKTsKLSAgICAgICAgaWYgKHRoaXMucHVibGljYXRpb25JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBwdWJpZCBpcyBub3Qgc2V0ISBQbGVhc2Ugc2V0IGxpa2UgZS5nLiA8bWFwOnBhcmFtZXRlciBuYW1lPSdwdWJpZCcgdmFsdWU9J3tyZXF1ZXN0LXBhcmFtOnB1YmlkfScvPiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5hcmVhID0gcGFyLmdldFBhcmFtZXRlcigiYXJlYSIsIG51bGwpOwotICAgICAgICBpZiAodGhpcy5hcmVhID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIGFyZWEgaXMgbm90IHNldCEgUGxlYXNlIHNldCBsaWtlIGUuZy4gPG1hcDpwYXJhbWV0ZXIgbmFtZT0nYXJlYScgdmFsdWU9J3tyZXF1ZXN0LXBhcmFtOmFyZWF9Jy8+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIGZhY3RvcnkgPSBEb2N1bWVudFV0aWwuZ2V0RG9jdW1lbnRGYWN0b3J5KHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWIgPSBmYWN0b3J5LmdldFB1YmxpY2F0aW9uKHRoaXMucHVibGljYXRpb25JZCk7Ci0gICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2V0aW5nIHB1YmxpY2F0aW9uIGlkIC8gYXJlYSBmcm9tIHBhZ2UgZW52ZWxvcGUiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHJhdywKLSAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChOQU1FU1BBQ0VfVVJJLmVxdWFscyh1cmkpKSB7Ci0gICAgICAgICAgICBpZiAoVkFMVUVfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZyA9IG51bGwsIHV1aWQgPSBudWxsLCBucyA9IG51bGwsIGtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKGkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoRUxFTUVOVF9BVFQuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoTlNfQVRULmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgbnMgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVVVJRF9BVFQuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB1dWlkID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKExBTkdfQVRULmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgbGFuZyA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0vL2VuZCBmb3IKLSAgICAgICAgICAgICAgICBpZih1dWlkPT1udWxsfHxucz09bnVsbHx8a2V5PT1udWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJFcnJvciBieSBzZXR0aW5nIHVwIHRoZSB0cmFuc2Zvcm1hdGlvbi4gUGxlYXNlIGZpeCB0aGUgY2FsbGluZyBjb2RlLiIpOwotICAgICAgICAgICAgICAgIGlmIChsYW5nPT1udWxsKQotICAgICAgICAgICAgICAgICAgICBsYW5nPXB1Yi5nZXREZWZhdWx0TGFuZ3VhZ2UoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IHB1Yi5nZXRBcmVhKGFyZWEpLmdldERvY3VtZW50KHV1aWQsIGxhbmcpOwotICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YSBtZXRhRGF0YSA9IGRvY3VtZW50LmdldE1ldGFEYXRhKG5zKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIFtdIHJldHVyblZhbHVlPW1ldGFEYXRhLmdldFZhbHVlcyhrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWUubGVuZ3RoPjEpewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXR1cm5WYWx1ZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgVkFMVUVfRUxFTUVOVCwgVkFMVUVfRUxFTUVOVCwgIkNEQVRBIiwgcmV0dXJuVmFsdWVbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBFTEVNRU5UX0FUVCwgRUxFTUVOVF9BVFQsICJDREFUQSIsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQobnMsIFZBTFVFX0VMRU1FTlQsIFBSRUZJWCsiOiIrVkFMVUVfRUxFTUVOVCwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KG5zLCBWQUxVRV9FTEVNRU5ULCBQUkVGSVgrIjoiK1ZBTFVFX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAocmV0dXJuVmFsdWUubGVuZ3RoPT0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhyZXR1cm5WYWx1ZVswXS50b0NoYXJBcnJheSgpLCAwLCByZXR1cm5WYWx1ZVswXS50b0NoYXJBcnJheSgpLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIkVycm9yIGJ5IGdldHRpbmcgZG9jdW1lbnQgZm9yIFsgIitsYW5nKyIvIit1dWlkKyIgXSIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiRXJyb3IgYnkgZ2V0dGluZyBtZXRhIGRhdGEgd2l0aCBucyBbICIrbnMrIiBdIGZvciBkb2N1bWVudCBmb3IgWyAiK2xhbmcrIi8iK3V1aWQrIiBdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2FybiA9ICJDb3VsZCBub3QgZmluZCBtZXRob2QgZm9yICIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArICIuIElnbm9yaW5nLiI7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkud2Fybih3YXJuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIG5hbWUsIHJhdywgYXR0cik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcmF3KQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghTkFNRVNQQUNFX1VSSS5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgc3VwZXIuZW5kRWxlbWVudCh1cmksIG5hbWUsIHJhdyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9FbGVtZW50LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzQ4YTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhOwotCi0vKioKLSAqIEEgbWV0YSBkYXRhIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIHZhbHVlcy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTXVsdGlwbGUoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiB0aGUgZWxlbWVudCB2YWx1ZSBjYW4gYmUgZWRpdGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNFZGl0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogQ29weSBhbGwgdmFsdWVzIGlmIHRoZSBtZXRhIGRhdGEgYXJlIGNvcGllZC4KLSAgICAgKi8KLSAgICBpbnQgT05DT1BZX0NPUFkgPSAwOwotICAgIAotICAgIC8qKgotICAgICAqIERvbid0IGNvcHkgdGhlIHZhbHVlcyBvZiB0aGlzIGVsZW1lbnQgaWYgdGhlIG1ldGEgZGF0YSBhcmUgY29waWVkLgotICAgICAqLwotICAgIGludCBPTkNPUFlfSUdOT1JFID0gMTsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBhbGwgdmFsdWVzIG9mIHRoaXMgZWxlbWVudCBpZiB0aGUgbWV0YSBkYXRhIGFyZSBjb3BpZWQuCi0gICAgICovCi0gICAgaW50IE9OQ09QWV9ERUxFVEUgPSAyOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgYWN0aW9uIHRvIGJlIHRha2VuIHdoZW4gbWV0YSBkYXRhIGFyZSBjb3BpZWQgZnJvbSBvbmUgb3duZXIgdG8gYW5vdGhlci4KLSAgICAgKi8KLSAgICBpbnQgZ2V0QWN0aW9uT25Db3B5KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL0VsZW1lbnRTZXQuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL0VsZW1lbnRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjMWE2MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9FbGVtZW50U2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGE7Ci0KLS8qKgotICogRGVmaW5pdGlvbiBvZiBhIHNldCBvZiBtZXRhIGRhdGEgZWxlbWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudFNldCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgc3VwcG9ydGVkIGVsZW1lbnRzLgotICAgICAqLwotICAgIEVsZW1lbnRbXSBnZXRFbGVtZW50cygpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gVGhlIGVsZW1lbnQuCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCB3aXRoIHRoaXMgbmFtZSBkb2VzIG5vdCBleGlzdC4KLSAgICAgKi8KLSAgICBFbGVtZW50IGdldEVsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoaXMgZWxlbWVudCBzZXQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpOwotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhbiBlbGVtZW50IHdpdGggYSBjZXJ0YWluIG5hbWUgaXMgY29udGFpbmVkLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIGJvb2xlYW4gY29udGFpbnNFbGVtZW50KFN0cmluZyBuYW1lKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9NZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA3YWE0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhOwotCi0vKioKLSAqIEdlbmVyaWMgbWV0YSBkYXRhIGludGVyZmFjZS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZm9yIGEgY2VydGFpbiBrZXkuCi0gICAgICogQHBhcmFtIGtleSBUaGUga2V5LgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Ygc3RyaW5ncy4KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0VmFsdWVzKFN0cmluZyBrZXkpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHZhbHVlIGZvciBhIGNlcnRhaW4ga2V5LgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleS4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHZhbHVlIGlzIHNldCBmb3IgdGhpcyBrZXkuCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZpcnN0VmFsdWUoU3RyaW5nIGtleSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhbGwgYXZhaWxhYmxlIGtleXMuCi0gICAgICogQHJldHVybiBUaGUga2V5cyBhdmFpbGFibGUgaW4gdGhpcyBNZXRhRGF0YSBvYmplY3QuCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0QXZhaWxhYmxlS2V5cygpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIGNlcnRhaW4ga2V5LiBBbGwgZXhpc3RpbmcgdmFsdWVzIHdpbGwgYmUgcmVtb3ZlZC4KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkZHMgYSB2YWx1ZSBmb3IgYSBjZXJ0YWluIGtleS4gVGhlIGV4aXN0aW5nIHZhbHVlcyB3aWxsIG5vdCBiZSByZW1vdmVkLgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZC4KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHZhbHVlIHNldCBhbmQgdGhlIGVsZW1lbnQgZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlIHZhbHVlcy4KLSAgICAgKi8KLSAgICB2b2lkIGFkZFZhbHVlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgbWV0YSBkYXRhIGJ5IHRoZSBjb250ZW50cyBvZiBvdGhlci4KLSAgICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIG1ldGEgZGF0YSBtYW5hZ2VyLgotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgcmVwbGFjZUJ5KE1ldGFEYXRhIG90aGVyKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgbWV0YSBkYXRhIGJ5IHRoZSBjb250ZW50cyBvZiBvdGhlci4KLSAgICAgKiBBbGwgbWV0YSBkYXRhIGlzIHJlcGxhY2VkLCBkaXNyZWdhcmRpbmcgdGhlIHJ1bGVzIGdpdmVuIGJ5IGVsZW1lbnQuZ2V0QWN0aW9uT25Db3B5KCkuCi0gICAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBtZXRhIGRhdGEgbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGZvcmNlZFJlcGxhY2VCeShNZXRhRGF0YSBvdGhlcikgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWxsIGtleXMgdGhhdCBjYW4gYmUgdXNlZC4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRQb3NzaWJsZUtleXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBrZXkgcmVwcmVzZW50cyBhIHZhbGlkIG1ldGFkYXRhIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1ZhbGlkQXR0cmlidXRlKFN0cmluZyBrZXkpOwotICAgIAotICAgIC8qKgotICAgICAqIEdldCBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlLgotICAgICAqIEByZXR1cm4gbGFzdCBtb2RpZmljYXRpb24gZGF0ZQotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgICBsb25nIGdldExhc3RNb2RpZmllZCgpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbjsKLSAgICAgCi0gICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgc2V0IHRoaXMgbWV0YSBkYXRhIG9iamVjdCBiZWxvbmdzIHRvLgotICAgICAqLwotICAgIEVsZW1lbnRTZXQgZ2V0RWxlbWVudFNldCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIHZhbHVlcyBmb3IgYSBjZXJ0YWluIGtleS4KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVBbGxWYWx1ZXMoU3RyaW5nIGtleSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uOwotICAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9NZXRhRGF0YUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGVjOWRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGE7Ci0KLS8qKgotICogTWV0YSBkYXRhIGV4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1ldGFEYXRhRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBNZXRhRGF0YUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXJnMAotICAgICAqIEBwYXJhbSBhcmcxCi0gICAgICovCi0gICAgcHVibGljIE1ldGFEYXRhRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotICAgICAgICBzdXBlcihhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXJnMAotICAgICAqLwotICAgIHB1YmxpYyBNZXRhRGF0YUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXJnMAotICAgICAqLwotICAgIHB1YmxpYyBNZXRhRGF0YUV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhT3duZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhT3duZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiYTRjNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9NZXRhRGF0YU93bmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGE7Ci0KLS8qKgotICogT3duZXIgb2YgbWV0YS1kYXRhLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YU93bmVyIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtZXRhIGRhdGEgb2JqZWN0LgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVcmkgVGhlIG5hbWVzcGFjZSBVUkkuCi0gICAgICogQHJldHVybiBBIG1ldGEgZGF0YSBvYmplY3QuCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgTWV0YURhdGEgZ2V0TWV0YURhdGEoU3RyaW5nIG5hbWVzcGFjZVVyaSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFVSSXMgb2YgdGhlIG1ldGEgZGF0YSBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBvd25lci4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHN0cmluZ3MuCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0TWV0YURhdGFOYW1lc3BhY2VVcmlzKCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvTWV0YURhdGFSZWdpc3RyeS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvTWV0YURhdGFSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzY0YjQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL01ldGFEYXRhUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YTsKLQotLyoqCi0gKiBNZXRhIGRhdGEgcmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFSZWdpc3RyeSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiByb2xlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gTWV0YURhdGFSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50IHNldC4KLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHNldC4KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4gCi0gICAgICovCi0gICAgRWxlbWVudFNldCBnZXRFbGVtZW50U2V0KFN0cmluZyBuYW1lc3BhY2VVcmkpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBzZXQgaXMgcmVnaXN0ZXJlZC4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgVVJJLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNSZWdpc3RlcmVkKFN0cmluZyBuYW1lc3BhY2VVcmkpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhbiBlbGVtZW50IHNldC4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgVVJJLgotICAgICAqIEBwYXJhbSBlbGVtZW50U2V0IFRoZSBlbGVtZW50IHNldC4KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIGlmIGEgc2V0IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhpcyBuYW1lLgotICAgICAqLwotICAgIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIG5hbWVzcGFjZVVyaSwgRWxlbWVudFNldCBlbGVtZW50U2V0KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcmVnaXN0ZXJlZCBuYW1lc3BhY2UgVVJJcy4KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXROYW1lc3BhY2VVcmlzKCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvZHVibGluY29yZS9EdWJsaW5Db3JlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9kdWJsaW5jb3JlL0R1YmxpbkNvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyYzllYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9kdWJsaW5jb3JlL0R1YmxpbkNvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5kdWJsaW5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGE7Ci0KLS8qKgotICogPHA+Ci0gKiBEdWJsaW4gY29yZSBtZXRhZGF0YSBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBkZXNjcmlwdGlvbnMgYXJlIGNpdGluZyB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5kdWJsaW5jb3JlLm9yZyI+RHVibGluIENvcmUgd2Vic2l0ZSA8L2E+LgotICogPC9wPgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRHVibGluQ29yZSBleHRlbmRzIE1ldGFEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBkdWJsaW4gY29yZSBlbGVtZW50cyBuYW1lc3BhY2UuCi0gICAgICovCi0gICAgU3RyaW5nIERDX05BTUVTUEFDRSA9ICJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGR1YmxpbiBjb3JlIHRlcm1zIG5hbWVzcGFjZS4gCi0gICAgICovCi0gICAgU3RyaW5nIERDVEVSTVNfTkFNRVNQQUNFID0gImh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8iOwotICAgIAotICAgIC8qKgotICAgICAqIEEgbmFtZSBnaXZlbiB0byB0aGUgcmVzb3VyY2UuIFR5cGljYWxseSwgVGl0bGUgd2lsbCBiZSBhIG5hbWUgYnkgd2hpY2ggdGhlIHJlc291cmNlIGlzCi0gICAgICogZm9ybWFsbHkga25vd24uCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RJVExFID0gInRpdGxlIjsKLQotICAgIC8qKgotICAgICAqIEFuIGVudGl0eSBwcmltYXJpbHkgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuIEV4YW1wbGVzIG9mIENyZWF0b3IKLSAgICAgKiBpbmNsdWRlIGEgcGVyc29uLCBhbiBvcmdhbml6YXRpb24sIG9yIGEgc2VydmljZS4gVHlwaWNhbGx5LCB0aGUgbmFtZSBvZiBhIENyZWF0b3Igc2hvdWxkIGJlCi0gICAgICogdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW50aXR5LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DUkVBVE9SID0gImNyZWF0b3IiOwotCi0gICAgLyoqCi0gICAgICogQSB0b3BpYyBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuIFR5cGljYWxseSwgU3ViamVjdCB3aWxsIGJlIGV4cHJlc3NlZCBhcyBrZXl3b3Jkcywga2V5Ci0gICAgICogcGhyYXNlcyBvciBjbGFzc2lmaWNhdGlvbiBjb2RlcyB0aGF0IGRlc2NyaWJlIGEgdG9waWMgb2YgdGhlIHJlc291cmNlLiBSZWNvbW1lbmRlZCBiZXN0Ci0gICAgICogcHJhY3RpY2UgaXMgdG8gc2VsZWN0IGEgdmFsdWUgZnJvbSBhIGNvbnRyb2xsZWQgdm9jYWJ1bGFyeSBvciBmb3JtYWwgY2xhc3NpZmljYXRpb24gc2NoZW1lLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TVUJKRUNUID0gInN1YmplY3QiOwotCi0gICAgLyoqCi0gICAgICogQW4gYWNjb3VudCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuIEV4YW1wbGVzIG9mIERlc2NyaXB0aW9uIGluY2x1ZGUsIGJ1dCBpcyBub3QKLSAgICAgKiBsaW1pdGVkIHRvOiBhbiBhYnN0cmFjdCwgdGFibGUgb2YgY29udGVudHMsIHJlZmVyZW5jZSB0byBhIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBvZgotICAgICAqIGNvbnRlbnQgb3IgYSBmcmVlLXRleHQgYWNjb3VudCBvZiB0aGUgY29udGVudC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotCi0gICAgLyoqCi0gICAgICogQW4gZW50aXR5IHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdGhlIHJlc291cmNlIGF2YWlsYWJsZS4gRXhhbXBsZXMgb2YgUHVibGlzaGVyIGluY2x1ZGUgYQotICAgICAqIHBlcnNvbiwgYW4gb3JnYW5pemF0aW9uLCBvciBhIHNlcnZpY2UuIFR5cGljYWxseSwgdGhlIG5hbWUgb2YgYSBQdWJsaXNoZXIgc2hvdWxkIGJlIHVzZWQgdG8KLSAgICAgKiBpbmRpY2F0ZSB0aGUgZW50aXR5LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QVUJMSVNIRVIgPSAicHVibGlzaGVyIjsKLQotICAgIC8qKgotICAgICAqIEFuIGVudGl0eSByZXNwb25zaWJsZSBmb3IgbWFraW5nIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLiBFeGFtcGxlcyBvZgotICAgICAqIENvbnRyaWJ1dG9yIGluY2x1ZGUgYSBwZXJzb24sIGFuIG9yZ2FuaXphdGlvbiwgb3IgYSBzZXJ2aWNlLiBUeXBpY2FsbHksIHRoZSBuYW1lIG9mIGEKLSAgICAgKiBDb250cmlidXRvciBzaG91bGQgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW50aXR5LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT05UUklCVVRPUiA9ICJjb250cmlidXRvciI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGRhdGUgb2YgYW4gZXZlbnQgaW4gdGhlIGxpZmVjeWNsZSBvZiB0aGUgcmVzb3VyY2UuIFR5cGljYWxseSwgRGF0ZSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIHRoZSBjcmVhdGlvbiBvciBhdmFpbGFiaWxpdHkgb2YgdGhlIHJlc291cmNlLiBSZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlIGZvciBlbmNvZGluZyB0aGUgZGF0ZQotICAgICAqIHZhbHVlIGlzIGRlZmluZWQgaW4gYSBwcm9maWxlIG9mIElTTyA4NjAxIFtXM0NEVEZdIGFuZCBpbmNsdWRlcyAoYW1vbmcgb3RoZXJzKSBkYXRlcyBvZiB0aGUKLSAgICAgKiBmb3JtIFlZWVktTU0tREQuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0RBVEUgPSAiZGF0ZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmF0dXJlIG9yIGdlbnJlIG9mIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4gVHlwZSBpbmNsdWRlcyB0ZXJtcyBkZXNjcmliaW5nIGdlbmVyYWwKLSAgICAgKiBjYXRlZ29yaWVzLCBmdW5jdGlvbnMsIGdlbnJlcywgb3IgYWdncmVnYXRpb24gbGV2ZWxzIGZvciBjb250ZW50LiBSZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlCi0gICAgICogaXMgdG8gc2VsZWN0IGEgdmFsdWUgZnJvbSBhIGNvbnRyb2xsZWQgdm9jYWJ1bGFyeSAoZm9yIGV4YW1wbGUsIHRoZSBEQ01JIFR5cGUgVm9jYWJ1bGFyeQotICAgICAqIFtEQ1QxXSkuIFRvIGRlc2NyaWJlIHRoZSBwaHlzaWNhbCBvciBkaWdpdGFsIG1hbmlmZXN0YXRpb24gb2YgdGhlIHJlc291cmNlLCB1c2UgdGhlIEZPUk1BVAotICAgICAqIGVsZW1lbnQuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RZUEUgPSAidHlwZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGh5c2ljYWwgb3IgZGlnaXRhbCBtYW5pZmVzdGF0aW9uIG9mIHRoZSByZXNvdXJjZS4gVHlwaWNhbGx5LCBGb3JtYXQgbWF5IGluY2x1ZGUgdGhlCi0gICAgICogbWVkaWEtdHlwZSBvciBkaW1lbnNpb25zIG9mIHRoZSByZXNvdXJjZS4gRm9ybWF0IG1heSBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzb2Z0d2FyZSwKLSAgICAgKiBoYXJkd2FyZSwgb3Igb3RoZXIgZXF1aXBtZW50IG5lZWRlZCB0byBkaXNwbGF5IG9yIG9wZXJhdGUgdGhlIHJlc291cmNlLiBFeGFtcGxlcyBvZgotICAgICAqIGRpbWVuc2lvbnMgaW5jbHVkZSBzaXplIGFuZCBkdXJhdGlvbi4gUmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSBpcyB0byBzZWxlY3QgYSB2YWx1ZSBmcm9tIGEKLSAgICAgKiBjb250cm9sbGVkIHZvY2FidWxhcnkgKGZvciBleGFtcGxlLCB0aGUgbGlzdCBvZiBJbnRlcm5ldCBNZWRpYSBUeXBlcyBbTUlNRV0gZGVmaW5pbmcgY29tcHV0ZXIKLSAgICAgKiBtZWRpYSBmb3JtYXRzKS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRk9STUFUID0gImZvcm1hdCI7Ci0KLSAgICAvKioKLSAgICAgKiBBbiB1bmFtYmlndW91cyByZWZlcmVuY2UgdG8gdGhlIHJlc291cmNlIHdpdGhpbiBhIGdpdmVuIGNvbnRleHQuIFJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2UgaXMKLSAgICAgKiB0byBpZGVudGlmeSB0aGUgcmVzb3VyY2UgYnkgbWVhbnMgb2YgYSBzdHJpbmcgb3IgbnVtYmVyIGNvbmZvcm1pbmcgdG8gYSBmb3JtYWwgaWRlbnRpZmljYXRpb24KLSAgICAgKiBzeXN0ZW0uIEZvcm1hbCBpZGVudGlmaWNhdGlvbiBzeXN0ZW1zIGluY2x1ZGUgYnV0IGFyZSBub3QgbGltaXRlZCB0byB0aGUgVW5pZm9ybSBSZXNvdXJjZQotICAgICAqIElkZW50aWZpZXIgKFVSSSkgKGluY2x1ZGluZyB0aGUgVW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9yIChVUkwpKSwgdGhlIERpZ2l0YWwgT2JqZWN0Ci0gICAgICogSWRlbnRpZmllciAoRE9JKSBhbmQgdGhlIEludGVybmF0aW9uYWwgU3RhbmRhcmQgQm9vayBOdW1iZXIgKElTQk4pLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9JREVOVElGSUVSID0gImlkZW50aWZpZXIiOwotCi0gICAgLyoqCi0gICAgICogQSBSZWZlcmVuY2UgdG8gYSByZXNvdXJjZSBmcm9tIHdoaWNoIHRoZSBwcmVzZW50IHJlc291cmNlIGlzIGRlcml2ZWQuIFRoZSBwcmVzZW50IHJlc291cmNlCi0gICAgICogbWF5IGJlIGRlcml2ZWQgZnJvbSB0aGUgU291cmNlIHJlc291cmNlIGluIHdob2xlIG9yIGluIHBhcnQuIFJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2UgaXMgdG8KLSAgICAgKiBpZGVudGlmeSB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSBieSBtZWFucyBvZiBhIHN0cmluZyBvciBudW1iZXIgY29uZm9ybWluZyB0byBhIGZvcm1hbAotICAgICAqIGlkZW50aWZpY2F0aW9uIHN5c3RlbS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU09VUkNFID0gInNvdXJjZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxhbmd1YWdlIG9mIHRoZSBpbnRlbGxlY3R1YWwgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuIFJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2UgaXMgdG8gdXNlCi0gICAgICogUkZDIDMwNjYgW1JGQzMwNjZdIHdoaWNoLCBpbiBjb25qdW5jdGlvbiB3aXRoIElTTzYzOSBbSVNPNjM5XSksIGRlZmluZXMgdHdvLSBhbmQgdGhyZWUtbGV0dGVyCi0gICAgICogcHJpbWFyeSBsYW5ndWFnZSB0YWdzIHdpdGggb3B0aW9uYWwgc3VidGFncy4gRXhhbXBsZXMgaW5jbHVkZSAiZW4iIG9yICJlbmciIGZvciBFbmdsaXNoLAotICAgICAqICJha2siIGZvciBBa2thZGlhbiIsIGFuZCAiZW4tR0IiIGZvciBFbmdsaXNoIHVzZWQgaW4gdGhlIFVuaXRlZCBLaW5nZG9tLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIHJlZmVyZW5jZSB0byBhIHJlbGF0ZWQgcmVzb3VyY2UuIFJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2UgaXMgdG8gaWRlbnRpZnkgdGhlIHJlZmVyZW5jZWQKLSAgICAgKiByZXNvdXJjZSBieSBtZWFucyBvZiBhIHN0cmluZyBvciBudW1iZXIgY29uZm9ybWluZyB0byBhIGZvcm1hbCBpZGVudGlmaWNhdGlvbiBzeXN0ZW0uCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1JFTEFUSU9OID0gInJlbGF0aW9uIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBleHRlbnQgb3Igc2NvcGUgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLiBUeXBpY2FsbHksIENvdmVyYWdlIHdpbGwgaW5jbHVkZSBzcGF0aWFsCi0gICAgICogbG9jYXRpb24gKGEgcGxhY2UgbmFtZSBvciBnZW9ncmFwaGljIGNvb3JkaW5hdGVzKSwgdGVtcG9yYWwgcGVyaW9kIChhIHBlcmlvZCBsYWJlbCwgZGF0ZSwgb3IKLSAgICAgKiBkYXRlIHJhbmdlKSBvciBqdXJpc2RpY3Rpb24gKHN1Y2ggYXMgYSBuYW1lZCBhZG1pbmlzdHJhdGl2ZSBlbnRpdHkpLiBSZWNvbW1lbmRlZCBiZXN0Ci0gICAgICogcHJhY3RpY2UgaXMgdG8gc2VsZWN0IGEgdmFsdWUgZnJvbSBhIGNvbnRyb2xsZWQgdm9jYWJ1bGFyeSAoZm9yIGV4YW1wbGUsIHRoZSBUaGVzYXVydXMgb2YKLSAgICAgKiBHZW9ncmFwaGljIE5hbWVzIFtUR05dKSBhbmQgdG8gdXNlLCB3aGVyZSBhcHByb3ByaWF0ZSwgbmFtZWQgcGxhY2VzIG9yIHRpbWUgcGVyaW9kcyBpbgotICAgICAqIHByZWZlcmVuY2UgdG8gbnVtZXJpYyBpZGVudGlmaWVycyBzdWNoIGFzIHNldHMgb2YgY29vcmRpbmF0ZXMgb3IgZGF0ZSByYW5nZXMuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPVkVSQUdFID0gImNvdmVyYWdlIjsKLQotICAgIC8qKgotICAgICAqIEluZm9ybWF0aW9uIGFib3V0IHJpZ2h0cyBoZWxkIGluIGFuZCBvdmVyIHRoZSByZXNvdXJjZS4gVHlwaWNhbGx5LCBSaWdodHMgd2lsbCBjb250YWluIGEKLSAgICAgKiByaWdodHMgbWFuYWdlbWVudCBzdGF0ZW1lbnQgZm9yIHRoZSByZXNvdXJjZSwgb3IgcmVmZXJlbmNlIGEgc2VydmljZSBwcm92aWRpbmcgc3VjaAotICAgICAqIGluZm9ybWF0aW9uLiBSaWdodHMgaW5mb3JtYXRpb24gb2Z0ZW4gZW5jb21wYXNzZXMgSW50ZWxsZWN0dWFsIFByb3BlcnR5IFJpZ2h0cyAoSVBSKSwKLSAgICAgKiBDb3B5cmlnaHQsIGFuZCB2YXJpb3VzIFByb3BlcnR5IFJpZ2h0cy4gSWYgdGhlIFJpZ2h0cyBlbGVtZW50IGlzIGFic2VudCwgbm8gYXNzdW1wdGlvbnMgbWF5Ci0gICAgICogYmUgbWFkZSBhYm91dCBhbnkgcmlnaHRzIGhlbGQgaW4gb3Igb3ZlciB0aGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1JJR0hUUyA9ICJyaWdodHMiOwotCi0gICAgLyoqCi0gICAgICogQSBzdW1tYXJ5IG9mIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fQUJTVFJBQ1QgPSAiYWJzdHJhY3QiOwotCi0gICAgLyoqCi0gICAgICogSW5mb3JtYXRpb24gYWJvdXQgd2hvIGNhbiBhY2Nlc3MgdGhlIHJlc291cmNlIG9yIGFuIGluZGljYXRpb24gb2YgaXRzIHNlY3VyaXR5IHN0YXR1cy4gQWNjZXNzCi0gICAgICogUmlnaHRzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBhY2Nlc3Mgb3IgcmVzdHJpY3Rpb25zIGJhc2VkIG9uIHByaXZhY3ksIHNlY3VyaXR5IG9yCi0gICAgICogb3RoZXIgcmVndWxhdGlvbnMuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0FDQ0VTU1JJR0hUUyA9ICJhY2Nlc3NSaWdodHMiOwotCi0gICAgLyoqCi0gICAgICogQW55IGZvcm0gb2YgdGhlIHRpdGxlIHVzZWQgYXMgYSBzdWJzdGl0dXRlIG9yIGFsdGVybmF0aXZlIHRvIHRoZSBmb3JtYWwgdGl0bGUgb2YgdGhlCi0gICAgICogcmVzb3VyY2UuIFRoaXMgcXVhbGlmaWVyIGNhbiBpbmNsdWRlIFRpdGxlIGFiYnJldmlhdGlvbnMgYXMgd2VsbCBhcyB0cmFuc2xhdGlvbnMuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0FMVEVSTkFUSVZFID0gImFsdGVybmF0aXZlIjsKLQotICAgIC8qKgotICAgICAqIEEgY2xhc3Mgb2YgZW50aXR5IGZvciB3aG9tIHRoZSByZXNvdXJjZSBpcyBpbnRlbmRlZCBvciB1c2VmdWwuIEEgY2xhc3Mgb2YgZW50aXR5IG1heSBiZQotICAgICAqIGRldGVybWluZWQgYnkgdGhlIGNyZWF0b3Igb3IgdGhlIHB1Ymxpc2hlciBvciBieSBhIHRoaXJkIHBhcnR5LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9BVURJRU5DRSA9ICJhdWRpZW5jZSI7Ci0KLSAgICAvKioKLSAgICAgKiBEYXRlIChvZnRlbiBhIHJhbmdlKSB0aGF0IHRoZSByZXNvdXJjZSB3aWxsIGJlY29tZSBvciBkaWQgYmVjb21lIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fQVZBSUxBQkxFID0gImF2YWlsYWJsZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGJpYmxpb2dyYXBoaWMgcmVmZXJlbmNlIGZvciB0aGUgcmVzb3VyY2UuIFJlY29tbWVuZGVkIHByYWN0aWNlIGlzIHRvIGluY2x1ZGUgc3VmZmljaWVudAotICAgICAqIGJpYmxpb2dyYXBoaWMgZGV0YWlsIHRvIGlkZW50aWZ5IHRoZSByZXNvdXJjZSBhcyB1bmFtYmlndW91c2x5IGFzIHBvc3NpYmxlLCB3aGV0aGVyIG9yIG5vdAotICAgICAqIHRoZSBjaXRhdGlvbiBpcyBpbiBhIHN0YW5kYXJkIGZvcm0uCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0JJQkxJT0dSQVBISUNDSVRBVElPTiA9ICJiaWJsaW9ncmFwaGljQ2l0YXRpb24iOwotCi0gICAgLyoqCi0gICAgICogQSByZWZlcmVuY2UgdG8gYW4gZXN0YWJsaXNoZWQgc3RhbmRhcmQgdG8gd2hpY2ggdGhlIHJlc291cmNlIGNvbmZvcm1zLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9DT05GT1JNU1RPID0gImNvbmZvcm1zVG8iOwotCi0gICAgLyoqCi0gICAgICogRGF0ZSBvZiBjcmVhdGlvbiBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0NSRUFURUQgPSAiY3JlYXRlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBEYXRlIG9mIGFjY2VwdGFuY2Ugb2YgdGhlIHJlc291cmNlIChlLmcuIG9mIHRoZXNpcyBieSB1bml2ZXJzaXR5IGRlcGFydG1lbnQsIG9mIGFydGljbGUgYnkKLSAgICAgKiBqb3VybmFsLCBldGMuKS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREFURUFDQ0VQVEVEID0gImRhdGVBY2NlcHRlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBEYXRlIG9mIGEgc3RhdGVtZW50IG9mIGNvcHlyaWdodC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREFURUNPUFlSSUdIVEVEID0gImRhdGVDb3B5cmlnaHRlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBEYXRlIG9mIHN1Ym1pc3Npb24gb2YgdGhlIHJlc291cmNlIChlLmcuIHRoZXNpcywgYXJ0aWNsZXMsIGV0Yy4pLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9EQVRFU1VCTUlUVEVEID0gImRhdGVTdWJtaXR0ZWQiOwotCi0gICAgLyoqCi0gICAgICogQSBnZW5lcmFsIHN0YXRlbWVudCBkZXNjcmliaW5nIHRoZSBlZHVjYXRpb24gb3IgdHJhaW5pbmcgY29udGV4dC4gQWx0ZXJuYXRpdmVseSwgYSBtb3JlCi0gICAgICogc3BlY2lmaWMgc3RhdGVtZW50IG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXVkaWVuY2UgaW4gdGVybXMgb2YgaXRzIHByb2dyZXNzaW9uIHRocm91Z2ggYW4KLSAgICAgKiBlZHVjYXRpb24gb3IgdHJhaW5pbmcgY29udGV4dC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fRURVQ0FUSU9OTEVWRUwgPSAiZWR1Y2F0aW9uTGV2ZWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNpemUgb3IgZHVyYXRpb24gb2YgdGhlIHJlc291cmNlLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9FWFRFTlQgPSAiZXh0ZW50IjsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZXNjcmliZWQgcmVzb3VyY2UgcHJlLWV4aXN0ZWQgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UsIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lCi0gICAgICogaW50ZWxsZWN0dWFsIGNvbnRlbnQgcHJlc2VudGVkIGluIGFub3RoZXIgZm9ybWF0LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9IQVNGT1JNQVQgPSAiaGFzRm9ybWF0IjsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZXNjcmliZWQgcmVzb3VyY2UgaW5jbHVkZXMgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UgZWl0aGVyIHBoeXNpY2FsbHkgb3IgbG9naWNhbGx5LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9IQVNQQVJUID0gImhhc1BhcnQiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlc2NyaWJlZCByZXNvdXJjZSBoYXMgYSB2ZXJzaW9uLCBlZGl0aW9uLCBvciBhZGFwdGF0aW9uLCBuYW1lbHksIHRoZSByZWZlcmVuY2VkCi0gICAgICogcmVzb3VyY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0hBU1ZFUlNJT04gPSAiaGFzVmVyc2lvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpYmVkIHJlc291cmNlIGlzIHRoZSBzYW1lIGludGVsbGVjdHVhbCBjb250ZW50IG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlLCBidXQKLSAgICAgKiBwcmVzZW50ZWQgaW4gYW5vdGhlciBmb3JtYXQuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0lTRk9STUFUT0YgPSAiaXNGb3JtYXRPZiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpYmVkIHJlc291cmNlIGlzIGEgcGh5c2ljYWwgb3IgbG9naWNhbCBwYXJ0IG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9JU1BBUlRPRiA9ICJpc1BhcnRPZiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpYmVkIHJlc291cmNlIGlzIHJlZmVyZW5jZWQsIGNpdGVkLCBvciBvdGhlcndpc2UgcG9pbnRlZCB0byBieSB0aGUgcmVmZXJlbmNlZAotICAgICAqIHJlc291cmNlLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9JU1JFRkVSRU5DRURCWSA9ICJpc1JlZmVyZW5jZWRCeSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpYmVkIHJlc291cmNlIGlzIHN1cHBsYW50ZWQsIGRpc3BsYWNlZCwgb3Igc3VwZXJzZWRlZCBieSB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fSVNSRVBMQUNFREJZID0gImlzUmVwbGFjZWRCeSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpYmVkIHJlc291cmNlIGlzIHJlcXVpcmVkIGJ5IHRoZSByZWZlcmVuY2VkIHJlc291cmNlLCBlaXRoZXIgcGh5c2ljYWxseSBvcgotICAgICAqIGxvZ2ljYWxseS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fSVNSRVFVSVJFREJZID0gImlzUmVxdWlyZWRCeSI7Ci0KLSAgICAvKioKLSAgICAgKiBEYXRlIG9mIGZvcm1hbCBpc3N1YW5jZSAoZS5nLiwgcHVibGljYXRpb24pIG9mIHRoZSByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fSVNTVUVEID0gImlzc3VlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpYmVkIHJlc291cmNlIGlzIGEgdmVyc2lvbiwgZWRpdGlvbiwgb3IgYWRhcHRhdGlvbiBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZS4KLSAgICAgKiBDaGFuZ2VzIGluIHZlcnNpb24gaW1wbHkgc3Vic3RhbnRpdmUgY2hhbmdlcyBpbiBjb250ZW50IHJhdGhlciB0aGFuIGRpZmZlcmVuY2VzIGluIGZvcm1hdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fSVNWRVJTSU9OT0YgPSAiaXNWZXJzaW9uT2YiOwotCi0gICAgLyoqCi0gICAgICogQSBsZWdhbCBkb2N1bWVudCBnaXZpbmcgb2ZmaWNpYWwgcGVybWlzc2lvbiB0byBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmVzb3VyY2UuIFJlY29tbWVuZGVkCi0gICAgICogYmVzdCBwcmFjdGljZSBpcyB0byBpZGVudGlmeSB0aGUgbGljZW5zZSB1c2luZyBhIFVSSS4gRXhhbXBsZXMgb2Ygc3VjaCBsaWNlbnNlcyBjYW4gYmUgZm91bmQKLSAgICAgKiBhdCBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy8uCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0xJQ0VOU0UgPSAibGljZW5zZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIG9mIGVudGl0eSB0aGF0IG1lZGlhdGVzIGFjY2VzcyB0byB0aGUgcmVzb3VyY2UgYW5kIGZvciB3aG9tIHRoZSByZXNvdXJjZSBpcyBpbnRlbmRlZAotICAgICAqIG9yIHVzZWZ1bC4gVGhlIGF1ZGllbmNlcyBmb3IgYSByZXNvdXJjZSBhcmUgb2YgdHdvIGJhc2ljIGNsYXNzZXM6ICgxKSBhbiB1bHRpbWF0ZSBiZW5lZmljaWFyeQotICAgICAqIG9mIHRoZSByZXNvdXJjZSwgYW5kICgyKSBmcmVxdWVudGx5LCBhbiBlbnRpdHkgdGhhdCBtZWRpYXRlcyBhY2Nlc3MgdG8gdGhlIHJlc291cmNlLiBUaGUKLSAgICAgKiBtZWRpYXRvciBlbGVtZW50IHJlZmluZW1lbnQgcmVwcmVzZW50cyB0aGUgc2Vjb25kIG9mIHRoZXNlIHR3byBjbGFzc2VzLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9NRURJQVRPUiA9ICJtZWRpYXRvciI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF0ZXJpYWwgb3IgcGh5c2ljYWwgY2FycmllciBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX01FRElVTSA9ICJtZWRpdW0iOwotCi0gICAgLyoqCi0gICAgICogRGF0ZSBvbiB3aGljaCB0aGUgcmVzb3VyY2Ugd2FzIGNoYW5nZWQuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX01PRElGSUVEID0gIm1vZGlmaWVkIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZXNjcmliZWQgcmVzb3VyY2UgcmVmZXJlbmNlcywgY2l0ZXMsIG9yIG90aGVyd2lzZSBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX1JFRkVSRU5DRVMgPSAicmVmZXJlbmNlcyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpYmVkIHJlc291cmNlIHN1cHBsYW50cywgZGlzcGxhY2VzLCBvciBzdXBlcnNlZGVzIHRoZSByZWZlcmVuY2VkIHJlc291cmNlLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9SRVBMQUNFUyA9ICJyZXBsYWNlcyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVzY3JpYmVkIHJlc291cmNlIHJlcXVpcmVzIHRoZSByZWZlcmVuY2VkIHJlc291cmNlIHRvIHN1cHBvcnQgaXRzIGZ1bmN0aW9uLCBkZWxpdmVyeSwgb3IKLSAgICAgKiBjb2hlcmVuY2Ugb2YgY29udGVudC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fUkVRVUlSRVMgPSAicmVxdWlyZXMiOwotCi0gICAgLyoqCi0gICAgICogQSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIG93bmluZyBvciBtYW5hZ2luZyByaWdodHMgb3ZlciB0aGUgcmVzb3VyY2UuIFJlY29tbWVuZGVkIGJlc3QKLSAgICAgKiBwcmFjdGljZSBpcyB0byB1c2UgdGhlIFVSSSBvciBuYW1lIG9mIHRoZSBSaWdodHMgSG9sZGVyIHRvIGluZGljYXRlIHRoZSBlbnRpdHkuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX1JJR0hUU0hPTERFUiA9ICJyaWdodHNIb2xkZXIiOwotCi0gICAgLyoqCi0gICAgICogU3BhdGlhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGludGVsbGVjdHVhbCBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fU1BBVElBTCA9ICJzcGF0aWFsIjsKLQotICAgIC8qKgotICAgICAqIEEgbGlzdCBvZiBzdWJ1bml0cyBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX1RBQkxFT0ZDT05URU5UUyA9ICJ0YWJsZU9mQ29udGVudHMiOwotCi0gICAgLyoqCi0gICAgICogVGVtcG9yYWwgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBpbnRlbGxlY3R1YWwgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX1RFTVBPUkFMID0gInRlbXBvcmFsIjsKLQotICAgIC8qKgotICAgICAqIERhdGUgKG9mdGVuIGEgcmFuZ2UpIG9mIHZhbGlkaXR5IG9mIGEgcmVzb3VyY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX1ZBTElEID0gInZhbGlkIjsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvZHVibGluY29yZS9EdWJsaW5Db3JlSGVscGVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9kdWJsaW5jb3JlL0R1YmxpbkNvcmVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViOWZlNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tZXRhZGF0YS9kdWJsaW5jb3JlL0R1YmxpbkNvcmVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICoNCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLmR1YmxpbmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFPd25lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGFjY2VzcyBkdWJsaW4gY29yZSBtZXRhIGRhdGEuDQotICovDQotcHVibGljIGNsYXNzIER1YmxpbkNvcmVIZWxwZXIgew0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIG93bmVyIFRoZSBvd25lci4NCi0gICAgICogQHJldHVybiBUaGUgZHVibGluIGNvcmUgdGl0bGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHRpdGxlIGlzIG5vdCBzZXQuDQotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gaWYgdGhlIG93bmVyIGhhcyBubyBkdWJsaW4gY29yZSBtZXRhIGRhdGEuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUaXRsZShNZXRhRGF0YU93bmVyIG93bmVyKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGdldER1YmxpbkNvcmUob3duZXIpLmdldEZpcnN0VmFsdWUoRHVibGluQ29yZS5FTEVNRU5UX1RJVExFKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50Lg0KLSAgICAgKiBAcGFyYW0gZmFsbGJhY2tUb1V1aWQgSWYgdGhlIGR1YmxpbiBjb3JlIHRpdGxlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgZG9jdW1lbnQncyBVVUlEIGlzIHJldHVybmVkLg0KLSAgICAgKiBAcmV0dXJuIFRoZSBkdWJsaW4gY29yZSB0aXRsZS4NCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgaGFzIG5vIGR1YmxpbiBjb3JlIG1ldGEgZGF0YS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpdGxlKERvY3VtZW50IGRvYywgYm9vbGVhbiBmYWxsYmFja1RvVXVpZCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IER1YmxpbkNvcmVIZWxwZXIuZ2V0VGl0bGUoZG9jKTsNCi0gICAgICAgIHJldHVybiB0aXRsZSA9PSBudWxsID8gZG9jLmdldFVVSUQoKSA6IHRpdGxlOw0KLSAgICB9DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1ldGFEYXRhIGdldER1YmxpbkNvcmUoTWV0YURhdGFPd25lciBvd25lcikgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBvd25lci5nZXRNZXRhRGF0YShEdWJsaW5Db3JlLkRDX05BTUVTUEFDRSk7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21vZHVsZS9Nb2R1bGVFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21vZHVsZS9Nb2R1bGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlMzIyNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tb2R1bGUvTW9kdWxlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubW9kdWxlOwotCi0vKioKLSAqIE1vZHVsZSBleGNlcHRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE1vZHVsZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXJnMAotICAgICAqIEBwYXJhbSBhcmcxCi0gICAgICovCi0gICAgcHVibGljIE1vZHVsZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLSAgICAgICAgc3VwZXIoYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKi8KLSAgICBwdWJsaWMgTW9kdWxlRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICovCi0gICAgcHVibGljIE1vZHVsZUV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21vZHVsZS9Nb2R1bGVNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9tb2R1bGUvTW9kdWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzZkM2ViLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL21vZHVsZS9Nb2R1bGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubW9kdWxlOwotCi0vKioKLSAqIE1vZHVsZSBtYW5hZ2VyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZU1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiByb2xlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gTW9kdWxlTWFuYWdlci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmFzZSBVUkkgb2YgYSBtb2R1bGUgZGlyZWN0b3J5LgotICAgICAqIEBwYXJhbSBtb2R1bGVTaG9ydGN1dCBUaGUgbW9kdWxlIHNob3J0Y3V0LgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICogQHRocm93cyBNb2R1bGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gbW9kdWxlIGZvciB0aGlzIHNob3J0Y3V0LgotICAgICAqLwotICAgIFN0cmluZyBnZXRCYXNlVVJJKFN0cmluZyBtb2R1bGVTaG9ydGN1dCkgdGhyb3dzIE1vZHVsZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0aW5nIG9mIGFsbCBtb2R1bGUgaWQgKHNob3J0Y3V0cykKLSAgICAgKiBAcmV0dXJuIE1hcAotICAgICAqLwotICAgIFN0cmluZ1tdIGdldE1vZHVsZUlkcygpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvb2JzZXJ2YXRpb24vQWJzdHJhY3RSZXBvc2l0b3J5TGlzdGVuZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL0Fic3RyYWN0UmVwb3NpdG9yeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzNlMGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvb2JzZXJ2YXRpb24vQWJzdHJhY3RSZXBvc2l0b3J5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5TdGFydGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci0KLS8qKgotICogQWJzdHJhY3QgcmVwb3NpdG9yeSBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiB3aGljaCByZWdpc3RlcmVzIHdpdGggdGhlIG9ic2VydmF0aW9uCi0gKiByZWdpc3RyeSBhdCBzdGFydHVwLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXBvc2l0b3J5TGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBTZXJ2aWNlYWJsZSwKLSAgICAgICAgU3RhcnRhYmxlLCBUaHJlYWRTYWZlLCBSZXBvc2l0b3J5TGlzdGVuZXIgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9ic2VydmF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVnaXN0cnkgPSAoT2JzZXJ2YXRpb25SZWdpc3RyeSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChPYnNlcnZhdGlvblJlZ2lzdHJ5LlJPTEUpOwotICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVnaXN0cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9Eb2N1bWVudEV2ZW50LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9Eb2N1bWVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ODc5OWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvb2JzZXJ2YXRpb24vRG9jdW1lbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLS8qKgotICogRG9jdW1lbnQtcmVsYXRlZCBldmVudC4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50RXZlbnQgZXh0ZW5kcyBSZXBvc2l0b3J5RXZlbnQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHViSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXJlYTsKLSAgICBwcml2YXRlIFN0cmluZyB1dWlkOwotICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlOwotICAgIHByaXZhdGUgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZTsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYW5nZSBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgQ0hBTkdFRCA9ICJjaGFuZ2VkIjsKLSAgICAvKioKLSAgICAgKiBUaGUgcmVtb3ZhbCBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNT1ZFRCA9ICJyZW1vdmVkIjsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIHNlc3Npb24gVGhlIHNlc3Npb24uCi0gICAgICogQHBhcmFtIHB1YklkIFRoZSBwdWJsaWNhdGlvbiBJRC4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gdXVpZCBUaGUgVVVJRC4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHJlc291cmNlIHR5cGUuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXZlbnQsIGZvciBleGFtcGxlCi0gICAgICogICAgICAgIHtAbGluayAjQ0hBTkdFRH0gb3Ige0BsaW5rICNSRU1PVkVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRFdmVudChTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBwdWJJZCwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UsCi0gICAgICAgICAgICBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCBPYmplY3QgZGVzY3JpcHRvcikgewotICAgICAgICBzdXBlcihzZXNzaW9uLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgdGhpcy5wdWJJZCA9IHB1YklkOwotICAgICAgICB0aGlzLmFyZWEgPSBhcmVhOwotICAgICAgICB0aGlzLnV1aWQgPSB1dWlkOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFyZWEuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmVhKCkgewotICAgICAgICByZXR1cm4gYXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBwdWJsaWNhdGlvbiBJRC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY2F0aW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBwdWJJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBVVUlELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXVpZCgpIHsKLSAgICAgICAgcmV0dXJuIHV1aWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbGFuZ3VhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhbmd1YWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJlc291cmNlIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL09ic2VydmF0aW9uRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9PYnNlcnZhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWMxY2U5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL09ic2VydmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb247Ci0KLS8qKgotICogT2JzZXJ2YXRpb24tc3BlY2lmaWMgZXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgT2JzZXJ2YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQwMjUwMjk2NzAwOTI2MTQ1OTNMOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE9ic2VydmF0aW9uRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICogQHBhcmFtIGFyZzEKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JzZXJ2YXRpb25FeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0gICAgICAgIHN1cGVyKGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICovCi0gICAgcHVibGljIE9ic2VydmF0aW9uRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICovCi0gICAgcHVibGljIE9ic2VydmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvb2JzZXJ2YXRpb24vT2JzZXJ2YXRpb25SZWdpc3RyeS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvb2JzZXJ2YXRpb24vT2JzZXJ2YXRpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFmNTRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL09ic2VydmF0aW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotCi0vKioKLSAqIE9ic2VydmF0aW9uIHJlZ2lzdHJ5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ic2VydmF0aW9uUmVnaXN0cnkgZXh0ZW5kcyBSZXBvc2l0b3J5TGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiBzZXJ2aWNlIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBPYnNlcnZhdGlvblJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byBsaXN0ZW4gdG8uCi0gICAgICogQHRocm93cyBPYnNlcnZhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIGRvY3VtZW50LgotICAgICAqLwotICAgIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihSZXBvc2l0b3J5TGlzdGVuZXIgbGlzdGVuZXIsIERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgT2JzZXJ2YXRpb25FeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIgd2hpY2ggaXMgbm90aWZpZWQgZm9yIGFsbCBldmVudHMuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lci4KLSAgICAgKiBAdGhyb3dzIE9ic2VydmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgdm9pZCByZWdpc3Rlckxpc3RlbmVyKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIE9ic2VydmF0aW9uRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9SZXBvc2l0b3J5RXZlbnQuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL1JlcG9zaXRvcnlFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJkYWE3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL1JlcG9zaXRvcnlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQSByZXBvc2l0b3J5IGV2ZW50IHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaWYgYSBkb2N1bWVudCB3YXMgYWRkZWQsIGNoYW5nZWQsIG9yIHJlbW92ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5RXZlbnQgewotCi0gICAgcHJpdmF0ZSBTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJpdmF0ZSBPYmplY3QgZGVzY3JpcHRvciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uLgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5RXZlbnQoU2Vzc2lvbiBzZXNzaW9uLCBPYmplY3QgZGVzY3JpcHRvcikgewotICAgICAgICAKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInNlc3Npb24iLCBzZXNzaW9uKTsKLSAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgCi0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJkZXNjcmlwdG9yIiwgZGVzY3JpcHRvcik7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL1JlcG9zaXRvcnlFdmVudEZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL1JlcG9zaXRvcnlFdmVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmMGQ1NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9SZXBvc2l0b3J5RXZlbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHJlcG9zaXRvcnkgZXZlbnRzLgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUV2ZW50RmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVwb3NpdG9yeSBldmVudCBmb3IgYSBub2RlLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHNlc3Npb24gVGhlIHNlc3Npb24uCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBkZXNjcmlwdG9yLgotICAgICAqIEByZXR1cm4gQW4gZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXBvc2l0b3J5RXZlbnQgY3JlYXRlRXZlbnQoU2VydmljZU1hbmFnZXIgbWFuYWdlciwKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiwgTG9nZ2VyIGxvZ2dlciwgT2JqZWN0IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVwb3NpdG9yeUV2ZW50KHNlc3Npb24sIGRlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZXBvc2l0b3J5IGV2ZW50IGZvciBhIG5vZGUuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3IuCi0gICAgICogQHJldHVybiBBbiBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlcG9zaXRvcnlFdmVudCBjcmVhdGVFdmVudChTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBEb2N1bWVudCBkb2MsCi0gICAgICAgICAgICBMb2dnZXIgbG9nZ2VyLCBPYmplY3QgZGVzY3JpcHRvcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudEV2ZW50KGRvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpLmdldFNlc3Npb24oKSwgZG9jLmdldFB1YmxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldElkKCksIGRvYy5nZXRBcmVhKCksIGRvYy5nZXRVVUlEKCksIGRvYy5nZXRMYW5ndWFnZSgpLCBkb2MKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlVHlwZSgpLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZXBvc2l0b3J5IGV2ZW50IGZvciBhIG5vZGUuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZS4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3IuCi0gICAgICogQHJldHVybiBBbiBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlcG9zaXRvcnlFdmVudCBjcmVhdGVFdmVudChTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsCi0gICAgICAgICAgICBMb2dnZXIgbG9nZ2VyLCBPYmplY3QgZGVzY3JpcHRvcikgewotICAgICAgICBSZXBvc2l0b3J5RXZlbnQgZXZlbnQ7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgIGlmICghbm9kZS5nZXRTb3VyY2VVUkkoKS5lbmRzV2l0aCgibWV0YSIpKSB7Ci0gICAgICAgICAgICBkb2MgPSBnZXREb2N1bWVudChtYW5hZ2VyLCBub2RlLCBsb2dnZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkb2MgIT0gbnVsbCkgewotICAgICAgICAgICAgZXZlbnQgPSBjcmVhdGVFdmVudChtYW5hZ2VyLCBkb2MsIGxvZ2dlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudCA9IG5ldyBSZXBvc2l0b3J5RXZlbnQobm9kZS5nZXRTZXNzaW9uKCksIGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBldmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCByZXByZXNlbnRlZCBieSB0aGUgbm9kZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqICAgICAgICAgdGhlIG5vZGUgZG9lc24ndCByZXByZXNlbnQgYSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvY3VtZW50IGdldERvY3VtZW50KFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIE5vZGUgbm9kZSwgTG9nZ2VyIGxvZ2dlcikgewotCi0gICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VVcmkgPSBub2RlLmdldFNvdXJjZVVSSSgpOwotICAgICAgICBpZiAoc291cmNlVXJpLmVuZHNXaXRoKCIueG1sIikpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLQotICAgICAgICBpZiAoIXNvdXJjZVVyaS5zdGFydHNXaXRoKCJsZW55YTovLyIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgc291cmNlIFVSSSBbIiArIHNvdXJjZVVyaQotICAgICAgICAgICAgICAgICAgICArICJdIGRvZXNuJ3Qgc3RhcnQgd2l0aCBsZW55YTovLyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBzb3VyY2VVcmkuc3Vic3RyaW5nKCJsZW55YTovL2xlbnlhL3B1YnMvIi5sZW5ndGgoKSk7Ci0KLSAgICAgICAgU3RyaW5nW10gc3RlcHMgPSBwYXRoLnNwbGl0KCIvIik7Ci0gICAgICAgIFN0cmluZyBwdWJJZCA9IHN0ZXBzWzBdOwotICAgICAgICBTdHJpbmcgYXJlYSA9IHN0ZXBzWzJdOwotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVEb2N1bWVudEZhY3RvcnkobWFuYWdlciwgbm9kZS5nZXRTZXNzaW9uKCkpOwotICAgICAgICAgICAgUHVibGljYXRpb24gcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgICAgICAgICBTdHJpbmcgZG9jUGF0aCA9IHBhdGguc3Vic3RyaW5nKChwdWJJZCArICIvY29udGVudC8iICsgYXJlYSkubGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgdXVpZCA9IGRvY1BhdGguc3Vic3RyaW5nKDEsIGRvY1BhdGgubGVuZ3RoKCkgLSAiL2VuIi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBkb2NQYXRoLnN1YnN0cmluZyhkb2NQYXRoLmxlbmd0aCgpIC0gImVuIi5sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIGRvYyA9IGZhY3RvcnkuZ2V0KHB1YiwgYXJlYSwgdXVpZCwgbGFuZ3VhZ2UpOwotCi0gICAgICAgICAgICBpZiAoZG9jID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgdGhlIG5vZGUgd2FzIG5vdCBhIGRvY3VtZW50IG5vZGUKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiTm8gZG9jdW1lbnQgZm91bmQgZm9yIG5vZGUgWyIgKyBzb3VyY2VVcmkgKyAiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvb2JzZXJ2YXRpb24vUmVwb3NpdG9yeUxpc3RlbmVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9SZXBvc2l0b3J5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzZDAyMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9SZXBvc2l0b3J5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbjsKLQotLyoqCi0gKiBMaXN0ZW5lciB0byByZXBvc2l0b3J5IGV2ZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvc2l0b3J5TGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYW4gZXZlbnQgd2FzIGZpcmVkLgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQuCi0gICAgICovCi0gICAgdm9pZCBldmVudEZpcmVkKFJlcG9zaXRvcnlFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0FyZWEuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0FyZWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwYmYzOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9BcmVhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci0KLS8qKgotICogQW4gYXJlYS4KLSAqLwotcHVibGljIGludGVyZmFjZSBBcmVhIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGFyZWEgKCJhdXRob3JpbmciLCAibGl2ZSIsIGV0Yy4pLgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcHVibGljYXRpb24gdGhlIGFyZWEgYmVsb25ncyB0by4KLSAgICAgKi8KLSAgICBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHNpdGUgc3RydWN0dXJlIG9mIHRoZSBhcmVhLgotICAgICAqLwotICAgIFNpdGVTdHJ1Y3R1cmUgZ2V0U2l0ZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBVVUlELgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIG5vdCBjb250YWluZWQuCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIGRvY3VtZW50IGlzIGNvbnRhaW5lZC4KLSAgICAgKiBAcGFyYW0gdXVpZCBUaGUgVVVJRC4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEFsbCBkb2N1bWVudHMgaW4gdGhpcyBhcmVhLgotICAgICAqLwotICAgIERvY3VtZW50W10gZ2V0RG9jdW1lbnRzKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9EZWZhdWx0RG9jdW1lbnRCdWlsZGVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9EZWZhdWx0RG9jdW1lbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTA4YmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRGVmYXVsdERvY3VtZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnRocmVhZC5UaHJlYWRTYWZlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci0KLS8qKgotICogRGVmYXVsdCBkb2N1bWVudCBidWlsZGVyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RG9jdW1lbnRCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgRG9jdW1lbnRCdWlsZGVyLAotICAgICAgICBTZXJ2aWNlYWJsZSwgVGhyZWFkU2FmZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsICIuIi1zZXBhcmF0ZWQgZXh0ZW5zaW9ucyBmcm9tIGEgVVJMIChlLmcuLAotICAgICAqIDxjb2RlPi9mb28ucHJpbnQuaHRtbDwvY29kZT4gaXMgdHJhbnNmb3JtZWQgdG8gPGNvZGU+L2ZvbzwvY29kZT4pLgotICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0byB0cmltLgotICAgICAqIEByZXR1cm4gQSBVUkwgc3RyaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVtb3ZlRXh0ZW5zaW9ucyhTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGludCBkb3RJbmRleCA9IHVybC5pbmRleE9mKCIuIik7Ci0gICAgICAgIGlmIChkb3RJbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGRvdEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhbmd1YWdlIG9mIGEgVVJMLgotICAgICAqIEBwYXJhbSB1cmxXaXRob3V0U3VmZml4IFRoZSBVUkwgd2l0aG91dCB0aGUgc3VmZml4LgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYW5ndWFnZShTdHJpbmcgdXJsV2l0aG91dFN1ZmZpeCkgewotCi0gICAgICAgIFN0cmluZyBsYW5ndWFnZSA9ICIiOwotICAgICAgICBTdHJpbmcgdXJsID0gdXJsV2l0aG91dFN1ZmZpeDsKLQotICAgICAgICBpbnQgbGFuZ3VhZ2VTZXBhcmF0b3JJbmRleCA9IHVybC5sYXN0SW5kZXhPZigiXyIpOwotICAgICAgICBpZiAobGFuZ3VhZ2VTZXBhcmF0b3JJbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3VmZml4ID0gdXJsLnN1YnN0cmluZyhsYW5ndWFnZVNlcGFyYXRvckluZGV4ICsgMSk7Ci0gICAgICAgICAgICBpZiAoc3VmZml4Lmxlbmd0aCgpIDw9IDUpIHsKLSAgICAgICAgICAgICAgICBsYW5ndWFnZSA9IHN1ZmZpeDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uIG9mIGEgVVJMLgotICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTC4KLSAgICAgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb24oU3RyaW5nIHVybCkgewotICAgICAgICBpbnQgc3RhcnRPZlN1ZmZpeCA9IHVybC5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBTdHJpbmcgc3VmZml4ID0gIiI7Ci0KLSAgICAgICAgaWYgKChzdGFydE9mU3VmZml4ID4gLTEpICYmICF1cmwuZW5kc1dpdGgoIi4iKSkgewotICAgICAgICAgICAgc3VmZml4ID0gdXJsLnN1YnN0cmluZyhzdGFydE9mU3VmZml4ICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VmZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRCdWlsZGVyI2lzRG9jdW1lbnQoRG9jdW1lbnRGYWN0b3J5LAotICAgICAqICAgICAgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnQoRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnksIFN0cmluZyB1cmwpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50TG9jYXRvciBsb2NhdG9yID0gZ2V0TG9jYXRvcldpdGhvdXRDaGVjayhmYWN0b3J5LCB1cmwpOwotICAgICAgICAgICAgaWYgKGxvY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24obG9jYXRvci5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbG9jYXRvci5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgQXJlYSBhcmVhID0gcHViLmdldEFyZWEobG9jYXRvci5nZXRBcmVhKCkpOwotICAgICAgICAgICAgICAgIGlmIChhcmVhLmdldFNpdGUoKS5jb250YWlucyhwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBTaXRlTm9kZSBub2RlID0gYXJlYS5nZXRTaXRlKCkuZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuaGFzTGluayhsb2NhdG9yLmdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyB0aGUgY2Fub25pY2FsIGRvY3VtZW50IFVSTC4KLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZG9jdW1lbnQgZmFjdG9yeS4KLSAgICAgKiBAcGFyYW0gbG9jYXRvciBUaGUgZG9jdW1lbnQgbG9jYXRvci4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGRDYW5vbmljYWxEb2N1bWVudFVybChEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgRG9jdW1lbnRMb2NhdG9yIGxvY2F0b3IpIHsKLQotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2VTdWZmaXggPSAiIjsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbG9jYXRvci5nZXRMYW5ndWFnZSgpOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24obG9jYXRvci5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbGFuZ3VhZ2UuZXF1YWxzKHB1Yi5nZXREZWZhdWx0TGFuZ3VhZ2UoKSkpIHsKLSAgICAgICAgICAgIGxhbmd1YWdlU3VmZml4ID0gIl8iICsgbGFuZ3VhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdXJsID0gbG9jYXRvci5nZXRQYXRoKCkgKyBsYW5ndWFnZVN1ZmZpeCArICIuaHRtbCI7Ci0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBidWlsZENhbm9uaWNhbFVybChEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgRG9jdW1lbnRMb2NhdG9yIGRvYykgewotCi0gICAgICAgIFN0cmluZyBkb2N1bWVudFVybCA9IGJ1aWxkQ2Fub25pY2FsRG9jdW1lbnRVcmwoZmFjdG9yeSwgZG9jKTsKLSAgICAgICAgU3RyaW5nIHVybCA9ICIvIiArIGRvYy5nZXRQdWJsaWNhdGlvbklkKCkgKyAiLyIgKyBkb2MuZ2V0QXJlYSgpICsgZG9jdW1lbnRVcmw7Ci0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50TG9jYXRvciBnZXRMb2NhdG9yKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBTdHJpbmcgd2ViYXBwVXJsKQotICAgICAgICAgICAgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIERvY3VtZW50TG9jYXRvciBsb2NhdG9yID0gZ2V0TG9jYXRvcldpdGhvdXRDaGVjayhmYWN0b3J5LCB3ZWJhcHBVcmwpOwotICAgICAgICBpZiAobG9jYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbigiVGhlIHdlYmFwcCBVUkwgWyIgKyB3ZWJhcHBVcmwKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBkb2VzIG5vdCByZWZlciB0byBhIGRvY3VtZW50ISIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb2NhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkb2N1bWVudCBsb2NhdG9yIGZvciBhIHdlYmFwcCBVUkwgd2l0aG91dCBjaGVja2luZyBpZiB0aGUKLSAgICAgKiB3ZWJhcHAgVVJMIHJlZmVycyB0byBhIGxvY2F0b3IgZmlyc3QuCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgd2ViYXBwIFVSTC4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQgbG9jYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgVVJMIGRvZXNuJ3QKLSAgICAgKiAgICAgICAgIHJlZmVyIHRvIGEgbG9jYXRvci4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudExvY2F0b3IgZ2V0TG9jYXRvcldpdGhvdXRDaGVjayhEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIHdlYmFwcFVybCkKLSAgICAgICAgICAgIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIXdlYmFwcFVybC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3ZWJhcHBVcmwuc3Vic3RyaW5nKDEpLnNwbGl0KCIvIikubGVuZ3RoIDwgMykgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKHdlYmFwcFVybCk7Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb247Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLCBmYWN0b3J5LCB3ZWJhcHBVcmwpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkb2N1bWVudFVSTCA9IGluZm8uZ2V0RG9jdW1lbnRVcmwoKTsKLQotICAgICAgICBkb2N1bWVudFVSTCA9IHJlbW92ZUV4dGVuc2lvbnMoZG9jdW1lbnRVUkwpOwotCi0gICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKGRvY3VtZW50VVJMKTsKLSAgICAgICAgU3RyaW5nIGZ1bGxMYW5ndWFnZSA9ICIiLmVxdWFscyhsYW5ndWFnZSkgPyAiIiA6ICgiXyIgKyBsYW5ndWFnZSk7Ci0gICAgICAgIGRvY3VtZW50VVJMID0gZG9jdW1lbnRVUkwuc3Vic3RyaW5nKDAsIGRvY3VtZW50VVJMLmxlbmd0aCgpIC0gZnVsbExhbmd1YWdlLmxlbmd0aCgpKTsKLQotICAgICAgICBpZiAoIiIuZXF1YWxzKGxhbmd1YWdlKSkgewotICAgICAgICAgICAgbGFuZ3VhZ2UgPSBwdWJsaWNhdGlvbi5nZXREZWZhdWx0TGFuZ3VhZ2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwYXRoID0gZG9jdW1lbnRVUkw7Ci0KLSAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50QnVpbGRFeGNlcHRpb24oIlBhdGggWyIgKyBwYXRoICsgIl0gZG9lcyBub3Qgc3RhcnQgd2l0aCAnLychIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRG9jdW1lbnRMb2NhdG9yLmdldExvY2F0b3IocHVibGljYXRpb24uZ2V0SWQoKSwgaW5mby5nZXRBcmVhKCksIHBhdGgsIGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRlciNpc1ZhbGlkRG9jdW1lbnROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZERvY3VtZW50TmFtZShTdHJpbmcgZG9jdW1lbnROYW1lKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudE5hbWUubWF0Y2hlcygiW2EtekEtWjAtOVxcLV0rIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9EZWZhdWx0RG9jdW1lbnRJZFRvUGF0aE1hcHBlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRGVmYXVsdERvY3VtZW50SWRUb1BhdGhNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmZTUwMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9EZWZhdWx0RG9jdW1lbnRJZFRvUGF0aE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIERlZmF1bHQgRG9jdW1lbnRJZFRvUGF0aE1hcHBlciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdERvY3VtZW50SWRUb1BhdGhNYXBwZXIgaW1wbGVtZW50cyBEb2N1bWVudElkVG9QYXRoTWFwcGVyLAotICAgICAgICBQYXRoVG9Eb2N1bWVudElkTWFwcGVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaWxlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9GSUxFTkFNRV9QUkVGSVggPSAiaW5kZXgiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudElkVG9QYXRoTWFwcGVyI2dldEZpbGUob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb24sCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBhcmVhLCBTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldERpcmVjdG9yeShwdWJsaWNhdGlvbiwgYXJlYSksIGdldFBhdGgodXVpZCwgbGFuZ3VhZ2UpKTsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0RGlyZWN0b3J5KFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTdHJpbmcgYXJlYSkgewotCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHB1YmxpY2F0aW9uLmdldERpcmVjdG9yeSgpLCBQdWJsaWNhdGlvbi5DT05URU5UX1BBVEggKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICAgICsgYXJlYSk7Ci0KLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudElkVG9QYXRoTWFwcGVyI2dldFBhdGgoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgaWYgKHV1aWQuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXVpZC5zdWJzdHJpbmcoMSkgKyAiLyIgKyBnZXRGaWxlbmFtZShsYW5ndWFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdXVpZCArICIvIiArIGxhbmd1YWdlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyB0aGUgZmlsZW5hbWUgZm9yIGEgZ2l2ZW4gbGFuZ3VhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZW5hbWUoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIFN0cmluZyBsYW5ndWFnZVN1ZmZpeCA9ICIiOwotICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGxhbmd1YWdlKSkgewotICAgICAgICAgICAgbGFuZ3VhZ2VTdWZmaXggPSAiXyIgKyBsYW5ndWFnZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFTRV9GSUxFTkFNRV9QUkVGSVggKyBsYW5ndWFnZVN1ZmZpeDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBJRCBmb3IgYSBjZXJ0YWluIGZpbGUuCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSByZXByZXNlbnRpbmcgdGhlIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICogQHRocm93cyBEb2N1bWVudERvZXNOb3RFeGlzdEV4Y2VwdGlvbiB3aGVuIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBmaWxlIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgZXhpc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudElkKFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTdHJpbmcgYXJlYSwgRmlsZSBmaWxlKQotICAgICAgICAgICAgdGhyb3dzIERvY3VtZW50RG9lc05vdEV4aXN0RXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBTdHJpbmcgY29udGVudERpck5hbWUgPSBwdWJsaWNhdGlvbi5nZXRDb250ZW50RGlyZWN0b3J5KGFyZWEpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aChjb250ZW50RGlyTmFtZSkpIHsKLSAgICAgICAgICAgIC8vIHRyaW0gZXZlcnl0aGluZyB1cCB0byB0aGUgZG9jdW1lbnRJZAotICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlRmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoY29udGVudERpck5hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgLy8gdHJpbSBldmVyeXRoaW5nIGFmdGVyIHRoZSBkb2N1bWVudElkCi0gICAgICAgICAgICByZWxhdGl2ZUZpbGVOYW1lID0gcmVsYXRpdmVGaWxlTmFtZS5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVGaWxlTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikpOwotICAgICAgICAgICAgLy8gYW5kIHJlcGxhY2UgdGhlIG9zIHNwZWNpZmljIHNlcGFyYXRvciBieSAnLycKLSAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZUZpbGVOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotICAgICAgICB9Ci0gICAgICAgIC8vIERvY3VtZW50IGRvZXMgbm90IHNlZW0gdG8gZXhpc3QKLSAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RG9lc05vdEV4aXN0RXhjZXB0aW9uKCJObyBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggZmlsZSIgKyBmaWxlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFuZ3VhZ2UgZm9yIGEgY2VydGFpbiBmaWxlCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGRvY3VtZW50IGZpbGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYW5ndWFnZSBmb3IgdGhlIGdpdmVuIGRvY3VtZW50IGZpbGUgb3IgbnVsbCBpZiB0aGUgZmlsZSBoYXMgbm8gbGFuZ3VhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZShGaWxlIGZpbGUpIHsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGxhc3REb3RJbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgIFN0cmluZyBzdWZmaXggPSBmaWxlTmFtZS5zdWJzdHJpbmcobGFzdERvdEluZGV4KTsKLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgZmlsZSBpcyBvZiB0aGUgZm9ybSBpbmRleC5odG1sIG9yIGluZGV4X2VuLmh0bWwKLQotICAgICAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aChCQVNFX0ZJTEVOQU1FX1BSRUZJWCkgJiYgZmlsZU5hbWUuZW5kc1dpdGgoc3VmZml4KSkgewotICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlU3VmZml4ID0gZmlsZU5hbWUuc3Vic3RyaW5nKEJBU0VfRklMRU5BTUVfUFJFRklYLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZS5pbmRleE9mKHN1ZmZpeCkpOwotICAgICAgICAgICAgaWYgKGxhbmd1YWdlU3VmZml4Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhlIGxlYWRpbmcgJ18nCi0gICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZVN1ZmZpeC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhbmd1YWdlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWRhMGQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhT3duZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotCi0vKioKLSAqIEEgQ01TIGRvY3VtZW50LgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50IGV4dGVuZHMgTWV0YURhdGFPd25lciwgUmVwb3NpdG9yeUl0ZW0gewotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBkb2N1bWVudCBuYW1lc3BhY2UgVVJJLgotICAgICAqLwotICAgIFN0cmluZyBOQU1FU1BBQ0UgPSAiaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2RvY3VtZW50LzEuMCI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeC4KLSAgICAgKi8KLSAgICBTdHJpbmcgREVGQVVMVF9QUkVGSVggPSAibGVueWEiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSB0cmFuc2FjdGlvbmFibGUgdHlwZSBmb3IgZG9jdW1lbnQgb2JqZWN0cy4KLSAgICAgKi8KLSAgICBTdHJpbmcgVFJBTlNBQ1RJT05BQkxFX1RZUEUgPSAiZG9jdW1lbnQiOwotICAgIAotICAgIC8qKgotICAgICAqIDxjb2RlPkRPQ1VNRU5UX01FVEFfU1VGRklYPC9jb2RlPiBUaGUgc3VmZml4IGZvciBkb2N1bWVudCBtZXRhIFVyaXMKLSAgICAgKi8KLSAgICBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfTUVUQV9TVUZGSVggPSAiLm1ldGEiOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRhdGUgYXQgd2hpY2ggcG9pbnQgdGhlIHJlcXVlc3RlZCBkb2N1bWVudCBpcyBjb25zaWRlcmVkIGV4cGlyZWQKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGluIFJGQyAxMTIzIGRhdGUgZm9ybWF0Ci0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgRGF0ZSBnZXRFeHBpcmVzKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgbmFtZSBvZiB0aGlzIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50LW5hbWUgb2YgdGhpcyBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHB1YmxpY2F0aW9uIHRoaXMgZG9jdW1lbnQgYmVsb25ncyB0by4KLSAgICAgKiBAcmV0dXJuIEEgcHVibGljYXRpb24gb2JqZWN0LgotICAgICAqLwotICAgIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2Fub25pY2FsIHdlYiBhcHBsaWNhdGlvbiBVUkwuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZG9jdW1lbnQgVVJMLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgU3RyaW5nIGdldENhbm9uaWNhbERvY3VtZW50VVJMKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBvZiB0aGlzIGRvY3VtZW50LgotICAgICAqIEVhY2ggZG9jdW1lbnQgaGFzIG9uZSBsYW5ndWFnZSBhc3NvY2lhdGVkIHRvIGl0LiAKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGRlbm90aW5nIHRoZSBsYW5ndWFnZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSBsYW5ndWFnZXMgdGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgaW4uCi0gICAgICogQSBkb2N1bWVudCBoYXMgb25lIGFzc29jaWF0ZWQgbGFuZ3VhZ2UgKEBzZWUgRG9jdW1lbnQjZ2V0TGFuZ3VhZ2UpCi0gICAgICogYnV0IHRoZXJlIGFyZSBwb3NzaWJseSBhIG51bWJlciBvZiBvdGhlciBsYW5ndWFnZXMgZm9yIHdoaWNoIGEgCi0gICAgICogZG9jdW1lbnQgd2l0aCB0aGUgc2FtZSBkb2N1bWVudC11dWlkIGlzIGFsc28gYXZhaWxhYmxlIGluLiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHN0cmluZ3MgZGVub3RpbmcgdGhlIGxhbmd1YWdlcy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIFN0cmluZ1tdIGdldExhbmd1YWdlcygpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRhdGUgb2YgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIG9mIHRoaXMgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBIGRhdGUgZGVub3RpbmcgdGhlIGRhdGUgb2YgdGhlIGxhc3QgbW9kaWZpY2F0aW9uLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXJlYSB0aGlzIGRvY3VtZW50IGJlbG9uZ3MgdG8uCi0gICAgICogQHJldHVybiBUaGUgYXJlYS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0QXJlYSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZSBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgZmlsZSBvYmplY3QuCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpbXBsaWVzIHRoZSB1c2FnZSBvZiBhIGZpbGVzeXN0ZW0gYmFzZWQgc3RvcmFnZS4gVXNlIHtAbGluayAjZ2V0U291cmNlVVJJKCl9IGluc3RlYWQuCi0gICAgICovCi0gICAgRmlsZSBnZXRGaWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gaW4gdGhlIFVSTCB3aXRob3V0IHRoZSBkb3QuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVVUlELgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFVVSUQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIGRvY3VtZW50LXV1aWQsIGxhbmd1YWdlIGFuZCBpbiB0aGUgZ2l2ZW4KLSAgICAgKiBhcmVhIGFjdHVhbGx5IGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRvY3VtZW50IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBib29sZWFuIGV4aXN0cygpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIGRvY3VtZW50IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBkb2N1bWVudC11dWlkIGFuZCB0aGUgZ2l2ZW4gYXJlYQotICAgICAqIGluZGVwZW5kZW50bHkgb2YgdGhlIGdpdmVuIGxhbmd1YWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIGRvY3VtZW50LXV1aWQgYW5kIGFyZWEgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGJvb2xlYW4gZXhpc3RzSW5BbnlMYW5ndWFnZSgpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZGVudGl0eSBtYXAgdGhpcyBkb2N1bWVudCBiZWxvbmdzIHRvLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBpZGVudGl0eSBtYXAuCi0gICAgICovCi0gICAgRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkkgdG8gcmVzb2x2ZSB0aGUgZG9jdW1lbnQncyBzb3VyY2UuCi0gICAgICogVGhlIHNvdXJjZSBjYW4gb25seSBiZSB1c2VkIGZvciByZWFkLW9ubHkgYWNjZXNzLgotICAgICAqIEZvciB3cml0ZSBhY2Nlc3MsIHVzZSB7QGxpbmsgI2dldE91dHB1dFN0cmVhbSgpfS4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIFN0cmluZyBnZXRTb3VyY2VVUkkoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRoZSBkb2N1bWVudCBjb250ZW50IHRvLgotICAgICAqLwotICAgIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBY2NlcHRzIGEgZG9jdW1lbnQgdmlzaXRvci4KLSAgICAgKiBAcGFyYW0gdmlzaXRvciBUaGUgdmlzaXRvci4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGFjY2VwdChEb2N1bWVudFZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGUgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBkZWxldGUoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcmVwb3NpdG9yeSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGlzIGRvY3VtZW50LgotICAgICAqLwotICAgIE5vZGUgZ2V0UmVwb3NpdG9yeU5vZGUoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJlc291cmNlIHR5cGUgb2YgdGhpcyBkb2N1bWVudCAoZm9ybWVybHkga25vd24gYXMgZG9jdHlwZSkKLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHJlc291cmNlIHR5cGUgb2YgdGhpcyBkb2N1bWVudC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzb3VyY2UgZXh0ZW5zaW9uIHVzZWQgYnkgdGhpcyBkb2N1bWVudCwgd2l0aG91dCB0aGUgZG90LgotICAgICAqLwotICAgIFN0cmluZyBnZXRTb3VyY2VFeHRlbnNpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBzb3VyY2UgZXh0ZW5zaW9uIHVzZWQgYnkgdGhpcyBkb2N1bWVudCwgd2l0aG91dCB0aGUgZG90LgotICAgICAqLwotICAgIHZvaWQgc2V0U291cmNlRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1pbWUgdHlwZSBvZiB0aGlzIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbWltZSB0eXBlIG9mIHRoaXMgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE1pbWVUeXBlKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZG9jdW1lbnQgaWRlbnRpZmllciBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBEb2N1bWVudElkZW50aWZpZXIgZ2V0SWRlbnRpZmllcigpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBnZXRMaW5rKCkuZ2V0Tm9kZSgpLmdldFBhdGgoKS4KLSAgICAgKiBAcmV0dXJuIFRoZSBwYXRoIG9mIHRoaXMgZG9jdW1lbnQgaW4gdGhlIHNpdGUgc3RydWN0dXJlLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIG5vdCBsaW5rZWQgaW4gdGhlIHNpdGUgc3RydWN0dXJlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRQYXRoKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgY2VydGFpbiB0cmFuc2xhdGlvbiAobGFuZ3VhZ2UgdmVyc2lvbikgb2YgdGhpcyBkb2N1bWVudCBleGlzdHMuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGV4aXN0c1RyYW5zbGF0aW9uKFN0cmluZyBsYW5ndWFnZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNlcnRhaW4gdHJhbnNsYXRpb24gKGxhbmd1YWdlIHZlcnNpb24pIG9mIHRoaXMgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiBkb2Vzbid0IGV4aXN0LgotICAgICAqLwotICAgIERvY3VtZW50IGdldFRyYW5zbGF0aW9uKFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGlzIGRvY3VtZW50IGV4aXN0cyBpbiBhIGNlcnRhaW4gYXJlYS4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGV4aXN0c0FyZWFWZXJzaW9uKFN0cmluZyBhcmVhKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBpbiBhIGNlcnRhaW4gYXJlYS4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJlYSB2ZXJzaW9uIGRvZXNuJ3QgZXhpc3QuCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0QXJlYVZlcnNpb24oU3RyaW5nIGFyZWEpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIHRyYW5zbGF0aW9uIG9mIHRoaXMgZG9jdW1lbnQgZXhpc3RzIGluIGEgY2VydGFpbiBhcmVhLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBleGlzdHNWZXJzaW9uKFN0cmluZyBhcmVhLCBTdHJpbmcgbGFuZ3VhZ2UpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0cmFuc2xhdGlvbiBvZiB0aGlzIGRvY3VtZW50IGluIGEgY2VydGFpbiBhcmVhLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZWEgdmVyc2lvbiBkb2Vzbid0IGV4aXN0LgotICAgICAqLwotICAgIERvY3VtZW50IGdldFZlcnNpb24oU3RyaW5nIGFyZWEsIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBsb2NhdG9yLgotICAgICAqLwotICAgIERvY3VtZW50TG9jYXRvciBnZXRMb2NhdG9yKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbGluayB0byB0aGlzIGRvY3VtZW50IGluIHRoZSBzaXRlIHN0cnVjdHVyZS4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgc2l0ZSBzdHJ1Y3R1cmUuCi0gICAgICovCi0gICAgTGluayBnZXRMaW5rKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFyZWEgdGhlIGRvY3VtZW50IGJlbG9uZ3MgdG8uCi0gICAgICovCi0gICAgQXJlYSBhcmVhKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBkb2N1bWVudCBpcyBsaW5rZWQgaW4gdGhlIHNpdGUgc3RydWN0dXJlLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzTGluaygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgaW5wdXQgc3RyZWFtIHRvIG9idGFpbiB0aGUgZG9jdW1lbnQncyBjb250ZW50LgotICAgICAqLwotICAgIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoaXMgZG9jdW1lbnQuCi0gICAgICovCi0gICAgaW50IGdldFJldmlzaW9uTnVtYmVyKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEJ1aWxkRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEJ1aWxkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZWJkYjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLS8qKgotICogRG9jdW1lbnQgYnVpbGQgZXhjZXB0aW9uLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gZXh0ZW5kcyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50QnVpbGRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgQSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEJ1aWxkZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDRiMzRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLS8qKgotICogQSBkb2N1bWVudCBidWlsZGVyIGJ1aWxkcyBhIGRvY3VtZW50IGZyb20gYSBVUkwuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRCdWlsZGVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBBdmFsb24gcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IERvY3VtZW50QnVpbGRlci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGRvY3VtZW50IGZvciBhIHdlYiBhcHBsaWNhdGlvbiBVUkwuCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkuCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgd2ViIGFwcGxpY2F0aW9uIFVSTC4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQgaWRlbnRpZmllci4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIERvY3VtZW50TG9jYXRvciBnZXRMb2NhdG9yKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBTdHJpbmcgd2ViYXBwVXJsKSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhbiBVUkwgY29ycmVzcG9uZHMgdG8gYSBDTVMgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBmb3JtIC97cHVibGljYXRpb24taWR9Ly4uLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNEb2N1bWVudChEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIHVybCkgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYW4gVVJMIGNvcnJlc3BvbmRpbmcgdG8gYSBDTVMgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICogQHBhcmFtIGxvY2F0b3IgVGhlIGxvY2F0b3IuCi0gICAgICogQHJldHVybiBhIFN0cmluZyBUaGUgY29ycmVzcG9uZGluZyBVUkwuCi0gICAgICovCi0gICAgU3RyaW5nIGJ1aWxkQ2Fub25pY2FsVXJsKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBEb2N1bWVudExvY2F0b3IgbG9jYXRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBkb2N1bWVudCBuYW1lIGlzIHZhbGlkLgotICAgICAqIEBwYXJhbSBkb2N1bWVudE5hbWUgVGhlIGRvY3VtZW50IG5hbWUuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1ZhbGlkRG9jdW1lbnROYW1lKFN0cmluZyBkb2N1bWVudE5hbWUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnREb2VzTm90RXhpc3RFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RG9lc05vdEV4aXN0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNGYxNWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnREb2VzTm90RXhpc3RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi0vKioKLSAqIERvY3VtZW50IGRvZXMgbm90IGV4aXN0IGV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnREb2VzTm90RXhpc3RFeGNlcHRpb24gZXh0ZW5kcyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnREb2VzTm90RXhpc3RFeGNlcHRpb24KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnREb2VzTm90RXhpc3RFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudERvZXNOb3RFeGlzdEV4Y2VwdGlvbgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBleGNlcHRpb24gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudERvZXNOb3RFeGlzdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50RG9lc05vdEV4aXN0RXhjZXB0aW9uCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50RG9lc05vdEV4aXN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnREb2VzTm90RXhpc3RFeGNlcHRpb24KLSAgICAgKiBAcGFyYW0gY2F1c2UgdGhlIGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnREb2VzTm90RXhpc3RFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWFiNzdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotLyoqCi0gKiBEb2N1bWVudCBleGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgUHVibGljYXRpb25FeGNlcHRpb24gewotCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50RXhjZXB0aW9uCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50RXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnRFeGNlcHRpb24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudEV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBleGNlcHRpb24gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50RXhjZXB0aW9uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JhNjE0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUl0ZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBBIERvY3VtZW50SWRlbnRpdHlNYXAgYXZvaWRzIHRoZSBtdWx0aXBsZSBpbnN0YW5jaWF0aW9uIG9mIGEgZG9jdW1lbnQgb2JqZWN0LgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRGYWN0b3J5IGV4dGVuZHMgUmVwb3NpdG9yeUl0ZW1GYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0KERvY3VtZW50SWRlbnRpZmllciBpZGVudGlmaWVyKSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gdXVpZCBUaGUgZG9jdW1lbnQgSUQuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBleGlzdC4KLSAgICAgKi8KLSAgICBEb2N1bWVudCBnZXQoUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBhcmVhLCBTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKQotICAgICAgICAgICAgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcmV2aXNpb24gb2YgYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBkb2N1bWVudCBJRC4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSByZXZpc2lvbiBUaGUgcmV2aXNpb24uLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIERvY3VtZW50IGdldChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UsIGludCByZXZpc2lvbikKLSAgICAgICAgICAgIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgaWRlbnRpZmllZCBieSBhIGNlcnRhaW4gd2ViIGFwcGxpY2F0aW9uIFVSTC4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSB3ZWIgYXBwbGljYXRpb24gVVJMLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIERvY3VtZW50IGdldEZyb21VUkwoU3RyaW5nIHdlYmFwcFVybCkgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBjbG9uZSBvZiBhIGRvY3VtZW50IGZvciBhbm90aGVyIGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgZG9jdW1lbnQgdG8gY2xvbmUuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZSBvZiB0aGUgdGFyZ2V0IGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgRG9jdW1lbnRMb2NhdG9yI2dldExhbmd1YWdlVmVyc2lvbihTdHJpbmcpfSBpbnN0ZWFkLgotICAgICAqLwotICAgIERvY3VtZW50IGdldExhbmd1YWdlVmVyc2lvbihEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIGNsb25lIG9mIGEgZG9jdW1lbnQgZm9yIGFub3RoZXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIGNsb25lLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhIG9mIHRoZSB0YXJnZXQgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBEb2N1bWVudExvY2F0b3IjZ2V0QXJlYVZlcnNpb24oU3RyaW5nKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBEb2N1bWVudCBnZXRBcmVhVmVyc2lvbihEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGFyZWEpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgZG9jdW1lbnQgZm9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIHV1aWQgVGhlIGRvY3VtZW50IFVVSUQuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0KFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTdHJpbmcgYXJlYSwgU3RyaW5nIHV1aWQpCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIHdlYmFwcCBVUkwgcmVwcmVzZW50cyBhIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSB3ZWJhcHBVcmwgQSB3ZWIgYXBwbGljYXRpb24gVVJMLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0RvY3VtZW50KFN0cmluZyB3ZWJhcHBVcmwpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24uCi0gICAgICovCi0gICAgU2Vzc2lvbiBnZXRTZXNzaW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxvY2F0b3IgVGhlIGxvY2F0b3IuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0KERvY3VtZW50TG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaWQgVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqIEByZXR1cm4gQSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBwdWJsaWNhdGlvbiBkb2VzIG5vdCBleGlzdC4KLSAgICAgKi8KLSAgICBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbihTdHJpbmcgaWQpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEFsbCBwdWJsaWNhdGlvbnMuCi0gICAgICovCi0gICAgUHVibGljYXRpb25bXSBnZXRQdWJsaWNhdGlvbnMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaWQgVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqIEByZXR1cm4gSWYgYSBwdWJsaWNhdGlvbiB3aXRoIHRoaXMgSUQgZXhpc3RzLgotICAgICAqLwotICAgIGJvb2xlYW4gZXhpc3RzUHVibGljYXRpb24oU3RyaW5nIGlkKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RmFjdG9yeUJ1aWxkZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50RmFjdG9yeUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyNDE1Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudEZhY3RvcnlCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLS8qKgotICogRG9jdW1lbnQgZmFjdG9yeSBidWlsZGVyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50RmFjdG9yeUJ1aWxkZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiBzZXJ2aWNlIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBEb2N1bWVudEZhY3RvcnlCdWlsZGVyLmNsYXNzLmdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgZmFjdG9yeS4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgc2Vzc2lvbi4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQgaWRlbnRpdHkgbWFwLgotICAgICAqLwotICAgIERvY3VtZW50RmFjdG9yeSBjcmVhdGVEb2N1bWVudEZhY3RvcnkoU2Vzc2lvbiBzZXNzaW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRJZFRvUGF0aE1hcHBlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRJZFRvUGF0aE1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJkNTZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50SWRUb1BhdGhNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIERvY3VtZW50IElkIHRvIFBhdGggbWFwcGVyIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50SWRUb1BhdGhNYXBwZXIgewotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZSB0aGUgZG9jdW1lbnQtcGF0aCBmb3IgYSBnaXZlbiBwdWJsaWNhdGlvbiwgYXJlYSBhbmQgZG9jdW1lbnQtdXVpZC4gVGhlIGZpbGUgc2VwYXJhdG9yCi0gICAgICogaXMgdGhlIHNsYXNoICgvKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXVpZCB0aGUgVVVJRCBvZiB0aGUgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgdGhlIGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIGRvY3VtZW50LCB3aXRob3V0IHB1YmxpY2F0aW9uIElEIGFuZCBhcmVhCi0gICAgICovCi0gICAgU3RyaW5nIGdldFBhdGgoU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlIHRoZSBkb2N1bWVudC1wYXRoIGZvciBhIGdpdmVuIHB1YmxpY2F0aW9uLCBhcmVhLCBkb2N1bWVudC11dWlkIGFuZCBsYW5ndWFnZQotICAgICAqIAotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiB0aGUgcHVibGljYXRpb24gb2YgdGhlIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIGFyZWEgdGhlIGFyZWEgb2YgdGhlIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIHV1aWQgdGhlIHV1aWQgb2YgdGhlIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIGxhbmd1YWdlIHRoZSBsYW5ndWFnZSBvZiB0aGUgZG9jdW1lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBkb2N1bWVudAotICAgICAqLwotICAgIEZpbGUgZ2V0RmlsZShQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudElkZW50aWZpZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50SWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGNhYzNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50SWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi0vKioKLSAqIFZhbHVlIG9iamVjdCB0byBpZGVudGlmeSBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudElkZW50aWZpZXIgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHVibGljYXRpb25JZDsKLSAgICBwcml2YXRlIFN0cmluZyBhcmVhOwotICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlOwotICAgIHByaXZhdGUgU3RyaW5nIHV1aWQ7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBwdWJJZCBUaGUgcHVibGljYXRpb24gSUQuCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIHV1aWQgVGhlIGRvY3VtZW50IFVVSUQuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRJZGVudGlmaWVyKFN0cmluZyBwdWJJZCwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLQotICAgICAgICBpZiAodXVpZC5zdGFydHNXaXRoKCIvIikgJiYgdXVpZC5zcGxpdCgiLSIpLmxlbmd0aCA9PSA0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgVVVJRCBbIiArIHV1aWQgKyAiXSBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgJy8nISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1dWlkLmluZGV4T2YoIi8iKSA+IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBVVUlEIFsiICsgdXVpZAotICAgICAgICAgICAgICAgICAgICArICJdIG11c3Qgbm90IGNvbnRhaW4gYSAnLycgYWZ0ZXIgdGhlIGZpcnN0IHBvc2l0aW9uISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wdWJsaWNhdGlvbklkID0gcHViSWQ7Ci0gICAgICAgIHRoaXMuYXJlYSA9IGFyZWE7Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICAgICAgdGhpcy51dWlkID0gdXVpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBVVUlELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXVpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhcmVhLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJlYSgpIHsKLSAgICAgICAgcmV0dXJuIGFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbGFuZ3VhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhbmd1YWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljYXRpb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIHB1YmxpY2F0aW9uSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEb2N1bWVudElkZW50aWZpZXIpICYmIG9iai5oYXNoQ29kZSgpID09IGhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEtleSgpLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnB1YmxpY2F0aW9uSWQgKyAiOiIgKyB0aGlzLmFyZWEgKyAiOiIgKyB0aGlzLnV1aWQgKyAiOiIgKyB0aGlzLmxhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRLZXkoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50TG9jYXRvci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjNiY2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLS8qKgotICogQSBEb2N1bWVudExvY2F0b3IgZGVzY3JpYmVzIGEgZG9jdW1lbnQgYmFzZWQgb24gaXRzIHBhdGggaW4gdGhlIHNpdGUgc3RydWN0dXJlLiBUaGUgYWN0dWFsCi0gKiBkb2N1bWVudCBkb2Vzbid0IGhhdmUgdG8gZXhpc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudExvY2F0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGxvY2F0b3JzID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3BlY2lmaWMgZG9jdW1lbnQgbG9jYXRvci4KLSAgICAgKiBAcGFyYW0gcHViSWQgVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhIG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgZG9jdW1lbnQgaW4gdGhlIHNpdGUgc3RydWN0dXJlLgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBsb2NhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnRMb2NhdG9yIGdldExvY2F0b3IoU3RyaW5nIHB1YklkLCBTdHJpbmcgYXJlYSwgU3RyaW5nIHBhdGgsIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBTdHJpbmcga2V5ID0gRG9jdW1lbnRMb2NhdG9yLmdldEtleShwdWJJZCwgYXJlYSwgcGF0aCwgbGFuZ3VhZ2UpOwotICAgICAgICBEb2N1bWVudExvY2F0b3IgbG9jYXRvciA9IChEb2N1bWVudExvY2F0b3IpIGxvY2F0b3JzLmdldChrZXkpOwotICAgICAgICBpZiAobG9jYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2NhdG9yID0gbmV3IERvY3VtZW50TG9jYXRvcihwdWJJZCwgYXJlYSwgcGF0aCwgbGFuZ3VhZ2UpOwotICAgICAgICAgICAgbG9jYXRvcnMucHV0KGtleSwgbG9jYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvY2F0b3I7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0S2V5KFN0cmluZyBwdWJJZCwgU3RyaW5nIGFyZWEsIFN0cmluZyBwYXRoLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgcmV0dXJuIHB1YklkICsgIjoiICsgYXJlYSArICI6IiArIHBhdGggKyAiOiIgKyBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwdWJJZDsKLSAgICBwcml2YXRlIFN0cmluZyBhcmVhOwotICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFuZ3VhZ2U7Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnRMb2NhdG9yKFN0cmluZyBwdWJJZCwgU3RyaW5nIGFyZWEsIFN0cmluZyBwYXRoLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgdGhpcy5wdWJJZCA9IHB1YklkOwotICAgICAgICB0aGlzLmFyZWEgPSBhcmVhOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgYXJlYSBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmVhKCkgewotICAgICAgICByZXR1cm4gYXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBsYW5ndWFnZSBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhbmd1YWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHBhdGggb2YgdGhlIGRvY3VtZW50IGluIHRoZSBzaXRlIHN0cnVjdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljYXRpb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIHB1YklkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsb2NhdG9yIHdpdGggdGhlIHNhbWUgcHVibGljYXRpb24gSUQsIGFyZWEsIGFuZCBsYW5ndWFnZSwgYnV0IGEgZGlmZmVyZW50IHBhdGggaW4KLSAgICAgKiB0aGUgc2l0ZSBzdHJ1Y3R1cmUuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGguCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50IGxvY2F0b3IuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50TG9jYXRvciBnZXRQYXRoVmVyc2lvbihTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gRG9jdW1lbnRMb2NhdG9yLmdldExvY2F0b3IoZ2V0UHVibGljYXRpb25JZCgpLCBnZXRBcmVhKCksIHBhdGgsIGdldExhbmd1YWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkZXNjZW5kYW50IG9mIHRoaXMgbG9jYXRvci4KLSAgICAgKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHdoaWNoIG11c3Qgbm90IGJlZ2luIHdpdGggYSBzbGFzaCBhbmQgbXVzdCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgIGVtcHR5LgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBsb2NhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0RGVzY2VuZGFudChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0gICAgICAgIGlmIChyZWxhdGl2ZVBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHJlbGF0aXZlIHBhdGggbXVzdCBub3QgYmUgZW1wdHkhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSByZWxhdGl2ZSBwYXRoIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBzbGFzaCEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UGF0aFZlcnNpb24oZ2V0UGF0aCgpICsgIi8iICsgcmVsYXRpdmVQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY2hpbGQgb2YgdGhpcyBsb2NhdG9yLgotICAgICAqIEBwYXJhbSBzdGVwIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBjaGlsZCwgaXQgbXVzdCBub3QgY29udGFpbiBhIHNsYXNoLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBsb2NhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0Q2hpbGQoU3RyaW5nIHN0ZXApIHsKLSAgICAgICAgaWYgKHN0ZXAuaW5kZXhPZigiLyIpID4gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzdGVwIFsiICsgc3RlcCArICJdIG11c3Qgbm90IGNvbnRhaW4gYSBzbGFzaCEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0RGVzY2VuZGFudChzdGVwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBsb2NhdG9yLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBsb2NhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaXMgdGhlIHJvb3QgbG9jYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRMb2NhdG9yIGdldFBhcmVudCgpIHsKLSAgICAgICAgaW50IGxhc3RTbGFzaEluZGV4ID0gZ2V0UGF0aCgpLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyZW50UGF0aCA9IGdldFBhdGgoKS5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoSW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIGdldFBhdGhWZXJzaW9uKHBhcmVudFBhdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBsb2NhdG9yLgotICAgICAqIEBwYXJhbSBkZWZhdWx0UGF0aCBUaGUgcGF0aCBvZiB0aGUgbG9jYXRvciB0byByZXR1cm4gaWYgdGhpcyBpcyB0aGUgcm9vdCBsb2NhdG9yLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBsb2NhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0UGFyZW50KFN0cmluZyBkZWZhdWx0UGF0aCkgewotICAgICAgICBEb2N1bWVudExvY2F0b3IgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYXRoVmVyc2lvbihkZWZhdWx0UGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbG9jYXRvciB3aXRoIHRoZSBzYW1lIHB1YmxpY2F0aW9uIElELCBhcmVhLCBhbmQgcGF0aCwgYnV0IHdpdGggYSBkaWZmZXJlbnQKLSAgICAgKiBsYW5ndWFnZS4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBsb2NhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0TGFuZ3VhZ2VWZXJzaW9uKFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICByZXR1cm4gRG9jdW1lbnRMb2NhdG9yLmdldExvY2F0b3IoZ2V0UHVibGljYXRpb25JZCgpLCBnZXRBcmVhKCksIGdldFBhdGgoKSwgbGFuZ3VhZ2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gRG9jdW1lbnRMb2NhdG9yLmdldEtleShnZXRQdWJsaWNhdGlvbklkKCksIGdldEFyZWEoKSwgZ2V0UGF0aCgpLCBnZXRMYW5ndWFnZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEb2N1bWVudExvY2F0b3IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgRG9jdW1lbnRMb2NhdG9yIGxvY2F0b3IgPSAoRG9jdW1lbnRMb2NhdG9yKSBvYmo7Ci0gICAgICAgIHJldHVybiBsb2NhdG9yLmdldEtleSgpLmVxdWFscyhnZXRLZXkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEtleSgpLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsb2NhdG9yIHdpdGggdGhlIHNhbWUgcHVibGljYXRpb24gSUQsIHBhdGgsIGFuZCBsYW5ndWFnZSwgYnV0IHdpdGggYSBkaWZmZXJlbnQKLSAgICAgKiBhcmVhLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBsb2NhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0QXJlYVZlcnNpb24oU3RyaW5nIGFyZWEpIHsKLSAgICAgICAgcmV0dXJuIERvY3VtZW50TG9jYXRvci5nZXRMb2NhdG9yKGdldFB1YmxpY2F0aW9uSWQoKSwgYXJlYSwgZ2V0UGF0aCgpLCBnZXRMYW5ndWFnZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0RvY3VtZW50TWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZWFkMDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudFNldDsKLQotLyoqCi0gKiBIZWxwZXIgdG8gbWFuYWdlIGRvY3VtZW50cy4gSXQgdGFrZXMgY2FyZSBvZiBhdHRhY2htZW50cyBldGMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudE1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiBjb21wb25lbnQgcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IERvY3VtZW50TWFuYWdlci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBkb2N1bWVudCBleGlzdHMuCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICogQHBhcmFtIHB1YiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIHV1aWQgVGhlIFVVSUQuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBib29sZWFuIGV4aXN0cyhEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgUHVibGljYXRpb24gcHViLCBTdHJpbmcgYXJlYSwgU3RyaW5nIHV1aWQsCi0gICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvcGllcyBhIGRvY3VtZW50IGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIgbG9jYXRpb24uCi0gICAgICogQHBhcmFtIHNvdXJjZURvY3VtZW50IFRoZSBkb2N1bWVudCB0byBjb3B5LgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgZGVzdGluYXRpb24gZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiBhIGRvY3VtZW50IHdoaWNoIGRlc3RpbmF0aW9uRG9jdW1lbnQgZGVwZW5kcyBvbiBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgIGV4aXN0LgotICAgICAqLwotICAgIHZvaWQgY29weShEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgRG9jdW1lbnRMb2NhdG9yIGRlc3RpbmF0aW9uKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSBkb2N1bWVudCB0byBhbm90aGVyIGFyZWEuCi0gICAgICogQHBhcmFtIHNvdXJjZURvY3VtZW50IFRoZSBkb2N1bWVudCB0byBjb3B5LgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkFyZWEgVGhlIGRlc3RpbmF0aW9uIGFyZWEuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiBhIGRvY3VtZW50IHdoaWNoIHRoZSBkZXN0aW5hdGlvbiBkb2N1bWVudCBkZXBlbmRzIG9uIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgZXhpc3QuCi0gICAgICovCi0gICAgdm9pZCBjb3B5VG9BcmVhKERvY3VtZW50IHNvdXJjZURvY3VtZW50LCBTdHJpbmcgZGVzdGluYXRpb25BcmVhKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSBkb2N1bWVudCBzZXQgdG8gYW5vdGhlciBhcmVhLgotICAgICAqIEBwYXJhbSBkb2N1bWVudFNldCBUaGUgZG9jdW1lbnQgc2V0IHRvIGNvcHkuCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uQXJlYSBUaGUgZGVzdGluYXRpb24gYXJlYS4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGEgZG9jdW1lbnQgd2hpY2ggb25lIG9mIHRoZSBkZXN0aW5hdGlvbiBkb2N1bWVudHMgZGVwZW5kcyBvbgotICAgICAqICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIHZvaWQgY29weVRvQXJlYShEb2N1bWVudFNldCBkb2N1bWVudFNldCwgU3RyaW5nIGRlc3RpbmF0aW9uQXJlYSkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBpbiB0aGUgc2FtZSBwdWJsaWNhdGlvbiB0aGUgPGNvZGU+cGFyZW50RG9jdW1lbnQ8L2NvZGU+IGJlbG9uZ3MgdG8KLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzOgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VEb2N1bWVudCBUaGUgZG9jdW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgYW5kIG1ldGEgZGF0YSBmcm9tLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSB0YXJnZXQgYXJlYS4KLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgdGFyZ2V0IHBhdGguCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSB0YXJnZXQgbGFuZ3VhZ2UuCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbiBUaGUgZXh0ZW5zaW9uIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50IHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gbmF2aWdhdGlvblRpdGxlIG5hdmlnYXRpb24gdGl0bGUKLSAgICAgKiBAcGFyYW0gdmlzaWJsZUluTmF2IGRldGVybWluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBub2RlIGluIHRoZSBuYXZpZ2F0aW9uCi0gICAgICogQHJldHVybiBUaGUgYWRkZWQgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBjYW4gbm90IGJlIGNyZWF0ZWQKLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyBhbHJlYWR5IGNvbnRhaW5lZC4KLSAgICAgKi8KLSAgICBEb2N1bWVudCBhZGQoRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFN0cmluZyBhcmVhLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGxhbmd1YWdlLAotICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIG5hdmlnYXRpb25UaXRsZSwgYm9vbGVhbiB2aXNpYmxlSW5OYXYpCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiwgUHVibGljYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnM6Ci0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICogQHBhcmFtIHJlc291cmNlVHlwZSB0aGUgZG9jdW1lbnQgdHlwZSAoYWthIHJlc291cmNlIHR5cGUpIG9mIHRoZSBuZXcgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gY29udGVudFNvdXJjZVVyaSBUaGUgVVJJIHRvIHJlYWQgdGhlIGNvbnRlbnQgZnJvbS4KLSAgICAgKiBAcGFyYW0gcHViIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aC4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSBleHRlbnNpb24gVGhlIGV4dGVuc2lvbiB0byB1c2UgZm9yIHRoZSBkb2N1bWVudCBzb3VyY2UsIHdpdGhvdXQgdGhlIGxlYWRpbmcgZG90LgotICAgICAqIEBwYXJhbSBuYXZpZ2F0aW9uVGl0bGUgVGhlIG5hdmlnYXRpb24gdGl0bGUuCi0gICAgICogQHBhcmFtIHZpc2libGVJbk5hdiBUaGUgbmF2aWdhdGlvbiB2aXNpYmlsaXR5LgotICAgICAqIEByZXR1cm4gVGhlIGFkZGVkIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgY2FuIG5vdCBiZSBjcmVhdGVkCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgaXMgYWxyZWFkeSBjb250YWluZWQuCi0gICAgICovCi0gICAgRG9jdW1lbnQgYWRkKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCBTdHJpbmcgY29udGVudFNvdXJjZVVyaSwKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiwgU3RyaW5nIGFyZWEsIFN0cmluZyBwYXRoLCBTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBleHRlbnNpb24sCi0gICAgICAgICAgICBTdHJpbmcgbmF2aWdhdGlvblRpdGxlLCBib29sZWFuIHZpc2libGVJbk5hdikgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24sCi0gICAgICAgICAgICBQdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgd2l0aG91dCBhZGRpbmcgaXQgdG8gdGhlIHNpdGUgc3RydWN0dXJlLgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkb2N1bWVudCBmYWN0b3J5LgotICAgICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgdGhlIGRvY3VtZW50IHR5cGUgKGFrYSByZXNvdXJjZSB0eXBlKSBvZiB0aGUgbmV3IGRvY3VtZW50Ci0gICAgICogQHBhcmFtIGNvbnRlbnRTb3VyY2VVcmkgVGhlIFVSSSB0byByZWFkIHRoZSBjb250ZW50IGZyb20uCi0gICAgICogQHBhcmFtIHB1YiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBleHRlbnNpb24gdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgc291cmNlLCB3aXRob3V0IHRoZSBsZWFkaW5nIGRvdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBhZGRlZCBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGNhbiBub3QgYmUgY3JlYXRlZAotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIGFscmVhZHkgY29udGFpbmVkLgotICAgICAqLwotICAgIERvY3VtZW50IGFkZChEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIGNvbnRlbnRTb3VyY2VVcmksCi0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBhcmVhLCBTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBleHRlbnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiwgUHVibGljYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IHZlcnNpb24gb2YgYSBkb2N1bWVudCB3aXRoIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCAvIG9yIGluIGEgZGlmZmVyZW50IGFyZWEuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZURvY3VtZW50IFRoZSBkb2N1bWVudCB0byBpbml0aWFsaXplIHRoZSBjb250ZW50cyBhbmQgbWV0YSBkYXRhIGZyb20uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZSBvZiB0aGUgbmV3IGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gVGhlIGFkZGVkIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgY2FuIG5vdCBiZSBjcmVhdGVkCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgaXMgYWxyZWFkeSBjb250YWluZWQuCi0gICAgICovCi0gICAgRG9jdW1lbnQgYWRkVmVyc2lvbihEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgU3RyaW5nIGFyZWEsIFN0cmluZyBsYW5ndWFnZSkKLSAgICAgICAgICAgIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBQdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgdmVyc2lvbiBvZiBhIGRvY3VtZW50IHdpdGggYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIC8gb3IgaW4gYSBkaWZmZXJlbnQgYXJlYS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlRG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIGFuZCBtZXRhIGRhdGEgZnJvbS4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlIG9mIHRoZSBuZXcgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGFkZFRvU2l0ZSBJZiB0aGUgbmV3IHZlcnNpb24gc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzaXRlIHN0cnVjdHVyZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBhZGRlZCBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGNhbiBub3QgYmUgY3JlYXRlZAotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIGFscmVhZHkgY29udGFpbmVkLgotICAgICAqLwotICAgIERvY3VtZW50IGFkZFZlcnNpb24oRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIFN0cmluZyBhcmVhLCBTdHJpbmcgbGFuZ3VhZ2UsIGJvb2xlYW4gYWRkVG9TaXRlKQotICAgICAgICAgICAgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24sIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhIGRvY3VtZW50IGZyb20gdGhlIGNvbnRlbnQgcmVwb3NpdG9yeSBhbmQgZnJvbSB0aGUgc2l0ZSBzdHJ1Y3R1cmUuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byBkZWxldGUuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHZvaWQgZGVsZXRlKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyBhIGRvY3VtZW50IGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIuCi0gICAgICogQHBhcmFtIHNvdXJjZURvY3VtZW50IFRoZSBzb3VyY2UgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFRoZSBkZXN0aW5hdGlvbiBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGEgZG9jdW1lbnQgd2hpY2ggdGhlIGRlc3RpbmF0aW9uIGRvY3VtZW50IGRlcGVuZHMgb24gZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICBleGlzdC4KLSAgICAgKi8KLSAgICB2b2lkIG1vdmUoRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIERvY3VtZW50TG9jYXRvciBkZXN0aW5hdGlvbikgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgYSBkb2N1bWVudCBzZXQgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlci4gQSBzb3VyY2UgaXMgbW92ZWQgdG8gdGhlIGRlc3RpbmF0aW9uIG9mCi0gICAgICogdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIHNldC4KLSAgICAgKiBAcGFyYW0gc291cmNlcyBUaGUgc291cmNlIGRvY3VtZW50cy4KLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25zIFRoZSBkZXN0aW5hdGlvbiBkb2N1bWVudHMuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiBhIGRvY3VtZW50IHdoaWNoIHRoZSBkZXN0aW5hdGlvbiBkb2N1bWVudCBkZXBlbmRzIG9uIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgZXhpc3QuCi0gICAgICovCi0gICAgdm9pZCBtb3ZlKERvY3VtZW50U2V0IHNvdXJjZXMsIERvY3VtZW50U2V0IGRlc3RpbmF0aW9ucykgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgZG9jdW1lbnQgc2V0IGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIuIEEgc291cmNlIGlzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gb2YKLSAgICAgKiB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgc2V0LgotICAgICAqIEBwYXJhbSBzb3VyY2VzIFRoZSBzb3VyY2UgZG9jdW1lbnRzLgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbnMgVGhlIGRlc3RpbmF0aW9uIGRvY3VtZW50cy4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGEgZG9jdW1lbnQgd2hpY2ggdGhlIGRlc3RpbmF0aW9uIGRvY3VtZW50IGRlcGVuZHMgb24gZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICBleGlzdC4KLSAgICAgKi8KLSAgICB2b2lkIGNvcHkoRG9jdW1lbnRTZXQgc291cmNlcywgRG9jdW1lbnRTZXQgZGVzdGluYXRpb25zKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyBhIGRvY3VtZW50IHRvIGFub3RoZXIgbG9jYXRpb24sIGluY2wuIGFsbCByZXF1aXJpbmcgZG9jdW1lbnRzLiBJZiBhIHNpdGV0cmVlIGlzIHVzZWQsCi0gICAgICogdGhpcyBtZWFucyB0aGF0IHRoZSB3aG9sZSBzdWJ0cmVlIGlzIG1vdmVkLgotICAgICAqIEBwYXJhbSBzb3VyY2VBcmVhIFRoZSBzb3VyY2UgYXJlYS4KLSAgICAgKiBAcGFyYW0gc291cmNlUGF0aCBUaGUgc291cmNlIHBhdGguCi0gICAgICogQHBhcmFtIHRhcmdldEFyZWEgVGhlIHRhcmdldCBhcmVhLgotICAgICAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSB0YXJnZXQgcGF0aC4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIG1vdmVBbGwoQXJlYSBzb3VyY2VBcmVhLCBTdHJpbmcgc291cmNlUGF0aCwgQXJlYSB0YXJnZXRBcmVhLCBTdHJpbmcgdGFyZ2V0UGF0aCkKLSAgICAgICAgICAgIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIGFsbCBsYW5ndWFnZSB2ZXJzaW9ucyBvZiBhIGRvY3VtZW50IHRvIGFub3RoZXIgbG9jYXRpb24uCi0gICAgICogQHBhcmFtIHNvdXJjZUFyZWEgVGhlIHNvdXJjZSBhcmVhLgotICAgICAqIEBwYXJhbSBzb3VyY2VQYXRoIFRoZSBzb3VyY2UgcGF0aC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0QXJlYSBUaGUgdGFyZ2V0IGFyZWEuCi0gICAgICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHRhcmdldCBwYXRoLgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50cyBjb3VsZCBub3QgYmUgbW92ZWQuCi0gICAgICovCi0gICAgdm9pZCBtb3ZlQWxsTGFuZ3VhZ2VWZXJzaW9ucyhBcmVhIHNvdXJjZUFyZWEsIFN0cmluZyBzb3VyY2VQYXRoLCBBcmVhIHRhcmdldEFyZWEsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGF0aCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgZG9jdW1lbnQgdG8gYW5vdGhlciBsb2NhdGlvbiwgaW5jbC4gYWxsIHJlcXVpcmluZyBkb2N1bWVudHMuIElmIGEgc2l0ZXRyZWUgaXMgdXNlZCwKLSAgICAgKiB0aGlzIG1lYW5zIHRoYXQgdGhlIHdob2xlIHN1YnRyZWUgaXMgY29waWVkLgotICAgICAqIEBwYXJhbSBzb3VyY2VBcmVhIFRoZSBzb3VyY2UgYXJlYS4KLSAgICAgKiBAcGFyYW0gc291cmNlUGF0aCBUaGUgc291cmNlIHBhdGguCi0gICAgICogQHBhcmFtIHRhcmdldEFyZWEgVGhlIHRhcmdldCBhcmVhLgotICAgICAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSB0YXJnZXQgcGF0aC4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGNvcHlBbGwoQXJlYSBzb3VyY2VBcmVhLCBTdHJpbmcgc291cmNlUGF0aCwgQXJlYSB0YXJnZXRBcmVhLCBTdHJpbmcgdGFyZ2V0UGF0aCkKLSAgICAgICAgICAgIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvcGllcyBhbGwgbGFuZ3VhZ2UgdmVyc2lvbnMgb2YgYSBkb2N1bWVudCB0byBhbm90aGVyIGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSBzb3VyY2VBcmVhIFRoZSBzb3VyY2UgYXJlYS4KLSAgICAgKiBAcGFyYW0gc291cmNlUGF0aCBUaGUgc291cmNlIHBhdGguCi0gICAgICogQHBhcmFtIHRhcmdldEFyZWEgVGhlIHRhcmdldCBhcmVhLgotICAgICAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSB0YXJnZXQgcGF0aC4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudHMgY291bGQgbm90IGJlIGNvcGllZC4KLSAgICAgKi8KLSAgICB2b2lkIGNvcHlBbGxMYW5ndWFnZVZlcnNpb25zKEFyZWEgc291cmNlQXJlYSwgU3RyaW5nIHNvdXJjZVBhdGgsIEFyZWEgdGFyZ2V0QXJlYSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQYXRoKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGEgZG9jdW1lbnQsIGluY2wuIGFsbCByZXF1aXJpbmcgZG9jdW1lbnRzLiBJZiBhIHNpdGV0cmVlIGlzIHVzZWQsIHRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgICAgKiB3aG9sZSBzdWJ0cmVlIGlzIGRlbGV0ZWQuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGRlbGV0ZUFsbChEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhbGwgbGFuZ3VhZ2UgdmVyc2lvbnMgb2YgYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50cyBjb3VsZCBub3QgYmUgY29waWVkLgotICAgICAqLwotICAgIHZvaWQgZGVsZXRlQWxsTGFuZ3VhZ2VWZXJzaW9ucyhEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhIHNldCBvZiBkb2N1bWVudHMuCi0gICAgICogQHBhcmFtIGRvY3VtZW50cyBUaGUgZG9jdW1lbnRzLgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgZGVsZXRlKERvY3VtZW50U2V0IGRvY3VtZW50cykgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vRG9jdW1lbnRVdGlsLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzNWI2OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Eb2N1bWVudFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci0KLS8qKgotICogRG9jdW1lbnQgdXRpbGl0eSBjbGFzcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERvY3VtZW50VXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudEZhY3RvcnlCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQgZmFjdG9yeS4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uLgotICAgICAqIEByZXR1cm4gYSBkb2N1bWVudCBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRG9jdW1lbnRGYWN0b3J5IGNyZWF0ZURvY3VtZW50RmFjdG9yeShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLAotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeUJ1aWxkZXIgYnVpbGRlciA9IGdldEJ1aWxkZXIobWFuYWdlcik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZURvY3VtZW50RmFjdG9yeShzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIERvY3VtZW50RmFjdG9yeUJ1aWxkZXIgZ2V0QnVpbGRlcihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIGlmIChEb2N1bWVudFV0aWwuYnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50VXRpbC5idWlsZGVyID0gKERvY3VtZW50RmFjdG9yeUJ1aWxkZXIpIG1hbmFnZXIubG9va3VwKERvY3VtZW50RmFjdG9yeUJ1aWxkZXIuUk9MRSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRG9jdW1lbnRVdGlsLmJ1aWxkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGRvY3VtZW50IGZhY3RvcnkgZm9yIHRoZSBzZXNzaW9uIHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZQotICAgICAqIHJlcXVlc3QuIElmIG5vIHNlc3Npb24gZXhpc3RzLCBpdCBpcyBjcmVhdGVkLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudEZhY3RvcnkgZ2V0RG9jdW1lbnRGYWN0b3J5KFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBTZXNzaW9uIHNlc3Npb247Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbihtYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlRG9jdW1lbnRGYWN0b3J5KG1hbmFnZXIsIHNlc3Npb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgZG9jdW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLSAgICAgKiBkb2N1bWVudCBpcyByZXF1ZXN0ZWQuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZ2V0Q3VycmVudERvY3VtZW50KFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFJlcXVlc3QgcmVxdWVzdCkKLSAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uLCBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbihtYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KG1hbmFnZXIsIHNlc3Npb24pOwotICAgICAgICBTdHJpbmcgdXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkocmVxdWVzdCk7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgIGlmIChmYWN0b3J5LmlzRG9jdW1lbnQodXJsKSkgewotICAgICAgICAgICAgZG9jID0gZmFjdG9yeS5nZXRGcm9tVVJMKHVybCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL0lkZW50aXR5RG9jdW1lbnRJZFRvUGF0aE1hcHBlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vSWRlbnRpdHlEb2N1bWVudElkVG9QYXRoTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYzk3ZGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vSWRlbnRpdHlEb2N1bWVudElkVG9QYXRoTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBJZGVudGl0eSBEb2N1bWVudCBJZCB0byBwYXRoIG1hcHBlcgotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlEb2N1bWVudElkVG9QYXRoTWFwcGVyIGltcGxlbWVudHMgRG9jdW1lbnRJZFRvUGF0aE1hcHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50SWRUb1BhdGhNYXBwZXIjZ2V0RmlsZShvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0RmlsZShQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEsIFN0cmluZyBkb2N1bWVudElkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgRmlsZSBhcmVhRGlyZWN0b3J5ID0gbmV3IEZpbGUocHVibGljYXRpb24uZ2V0RGlyZWN0b3J5KCksIFB1YmxpY2F0aW9uLkNPTlRFTlRfUEFUSAotICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBhcmVhKTsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYXJlYURpcmVjdG9yeSwgZ2V0UGF0aChkb2N1bWVudElkLCBsYW5ndWFnZSkpOwotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50SWRUb1BhdGhNYXBwZXIjZ2V0UGF0aChqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoU3RyaW5nIGRvY3VtZW50SWQsIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBhc3NlcnQgZG9jdW1lbnRJZC5zdGFydHNXaXRoKCIvIik7Ci0gICAgICAgIC8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoCi0gICAgICAgIGRvY3VtZW50SWQgPSBkb2N1bWVudElkLnN1YnN0cmluZygxKTsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50SWQgKyBnZXRTdWZmaXgobGFuZ3VhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgdGhlIGZpbGVuYW1lIGZvciBhIGdpdmVuIGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBBIHN0cmluZyB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1ZmZpeChTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlU3VmZml4ID0gIiI7Ci0gICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsICYmICEiIi5lcXVhbHMobGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICBsYW5ndWFnZVN1ZmZpeCA9ICJfIiArIGxhbmd1YWdlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYW5ndWFnZVN1ZmZpeDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1BhZ2VFbnZlbG9wZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUGFnZUVudmVsb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzJkNWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUGFnZUVudmVsb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkNvbnNvbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5SQ0Vudmlyb25tZW50OwotCi0vKioKLSAqIEEgcGFnZSBlbnZlbG9wZSBjYXJyaWVzIGEgc2V0IG9mIGluZm9ybWF0aW9uIHRoYXQgYXJlIG5lZWRlZCBkdXJpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiBhCi0gKiBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFBhZ2VFbnZlbG9wZSB7Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWVzIG9mIHRoZSBwYWdlIGVudmVsb3BlIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVJBTUVURVJfTkFNRVMgPSB7IFBhZ2VFbnZlbG9wZS5BUkVBLCBQYWdlRW52ZWxvcGUuQ09OVEVYVCwKLSAgICAgICAgICAgIFBhZ2VFbnZlbG9wZS5QVUJMSUNBVElPTl9JRCwgUGFnZUVudmVsb3BlLlBVQkxJQ0FUSU9OLCBQYWdlRW52ZWxvcGUuSVNfUFVCTElDQVRJT04sCi0gICAgICAgICAgICBQYWdlRW52ZWxvcGUuUFVCTElDQVRJT05fTEFOR1VBR0VTX0NTViwgUGFnZUVudmVsb3BlLkRPQ1VNRU5ULAotICAgICAgICAgICAgUGFnZUVudmVsb3BlLkRPQ1VNRU5UX0lELCBQYWdlRW52ZWxvcGUuRE9DVU1FTlRfUEFSRU5ULCBQYWdlRW52ZWxvcGUuRE9DVU1FTlRfTkFNRSwKLSAgICAgICAgICAgIFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9MQUJFTCwgUGFnZUVudmVsb3BlLkRPQ1VNRU5UX1VSTCwKLSAgICAgICAgICAgIFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9VUkxfV0lUSE9VVF9MQU5HVUFHRSwgUGFnZUVudmVsb3BlLkRPQ1VNRU5UX1BBVEgsCi0gICAgICAgICAgICBQYWdlRW52ZWxvcGUuRE9DVU1FTlRfRVhURU5TSU9OLCBQYWdlRW52ZWxvcGUuRE9DVU1FTlRfU09VUkNFX0VYVEVOU0lPTiwKLSAgICAgICAgICAgIFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9VVUlELCBQYWdlRW52ZWxvcGUuRE9DVU1FTlRfVFlQRSwgUGFnZUVudmVsb3BlLkRFRkFVTFRfTEFOR1VBR0UsCi0gICAgICAgICAgICBQYWdlRW52ZWxvcGUuRE9DVU1FTlRfTEFOR1VBR0UsIFBhZ2VFbnZlbG9wZS5ET0NVTUVOVF9MQU5HVUFHRVMsCi0gICAgICAgICAgICBQYWdlRW52ZWxvcGUuRE9DVU1FTlRfTEFOR1VBR0VTX0NTViwgUGFnZUVudmVsb3BlLkRPQ1VNRU5UX0xBU1RNT0RJRklFRCwKLSAgICAgICAgICAgIFBhZ2VFbnZlbG9wZS5CUkVBRENSVU1CX1BSRUZJWCwgUGFnZUVudmVsb3BlLlNTTF9QUkVGSVgsIFBhZ2VFbnZlbG9wZS5MQU5HVUFHRSB9OwotICAgIC8qKgotICAgICAqIDxjb2RlPlBVQkxJQ0FUSU9OX0lEPC9jb2RlPiBUaGUgcHVibGljYXRpb24gaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNBVElPTl9JRCA9ICJwdWJsaWNhdGlvbi1pZCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+UFVCTElDQVRJT048L2NvZGU+IFRoZSBwdWJsaWNhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0FUSU9OID0gInB1YmxpY2F0aW9uIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5JU19QVUJMSUNBVElPTjwvY29kZT4gSWYgdGhlIGN1cnJlbnQgVVJMIHJlZmVycyB0byBhIHB1YmxpY2F0aW9uICgidHJ1ZSIgb3IgImZhbHNlIikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfUFVCTElDQVRJT04gPSAiaXMtcHVibGljYXRpb24iOwotICAgIC8qKgotICAgICAqIDxjb2RlPlBVQkxJQ0FUSU9OX0xBTkdVQUdFU19DU1Y8L2NvZGU+IEEgbGlzdCBvZiB0aGUgcHVibGljYXRpb24ncyBsYW5ndWFnZXMsCi0gICAgICogY29tbWEtc2VwZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDQVRJT05fTEFOR1VBR0VTX0NTViA9ICJwdWJsaWNhdGlvbi1sYW5ndWFnZXMtY3N2IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5DT05URVhUPC9jb2RlPiBUaGUgY29udGV4dCBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gImNvbnRleHQtcHJlZml4IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5BUkVBPC9jb2RlPiBUaGUgYXJlYQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRUEgPSAiYXJlYSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+REVGQVVMVF9MQU5HVUFHRTwvY29kZT4gVGhlIGRlZmF1bHQgbGFuZ3VhZ2Ugb2YgdGhlIHB1YmxpY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MQU5HVUFHRSA9ICJkZWZhdWx0LWxhbmd1YWdlIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ET0NVTUVOVDwvY29kZT4gVGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVCA9ICJkb2N1bWVudCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RE9DVU1FTlRfSUQ8L2NvZGU+IFRoZSBkb2N1bWVudCBpZCBvZiB0aGUgY3VycmVudCBkb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0lEID0gImRvY3VtZW50LWlkIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ET0NVTUVOVF9QQVJFTlQ8L2NvZGU+IFRoZSBkb2N1bWVudCBpZCBvZiB0aGUgcGFyZW50IGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfUEFSRU5UID0gImRvY3VtZW50LXBhcmVudCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RE9DVU1FTlRfTkFNRTwvY29kZT4gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9OQU1FID0gImRvY3VtZW50LW5hbWUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkRPQ1VNRU5UX1RZUEU8L2NvZGU+IFRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfVFlQRSA9ICJkb2N1bWVudC10eXBlIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ET0NVTUVOVF9MQUJFTDwvY29kZT4gVGhlIGxhYmVsIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfTEFCRUwgPSAiZG9jdW1lbnQtbGFiZWwiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkRPQ1VNRU5UX1VSTDwvY29kZT4gVGhlIFVSTCBvZiB0aGUgY3VycmVudCBkb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1VSTCA9ICJkb2N1bWVudC11cmwiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkRPQ1VNRU5UX1VSTF9XSVRIT1VUX0xBTkdVQUdFPC9jb2RlPiBUaGUgVVJMIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpdGhvdXQgYQotICAgICAqIGxhbmd1YWdlIGV4dGVuc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9VUkxfV0lUSE9VVF9MQU5HVUFHRSA9ICJkb2N1bWVudC11cmwtd2l0aG91dC1sYW5ndWFnZSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RE9DVU1FTlRfRklMRTwvY29kZT4gVGhlIGZpbGUgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9GSUxFID0gImRvY3VtZW50LWZpbGUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkRPQ1VNRU5UX1BBVEg8L2NvZGU+IFRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfUEFUSCA9ICJkb2N1bWVudC1wYXRoIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ET0NVTUVOVF9FWFRFTlNJT048L2NvZGU+IFRoZSBleHRlbnNpb24gb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9FWFRFTlNJT04gPSAiZG9jdW1lbnQtZXh0ZW5zaW9uIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ET0NVTUVOVF9TT1VSQ0VfRVhURU5TSU9OPC9jb2RlPiBUaGUgc291cmNlIGV4dGVuc2lvbiBvZiB0aGUgY3VycmVudCBkb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1NPVVJDRV9FWFRFTlNJT04gPSAiZG9jdW1lbnQtc291cmNlLWV4dGVuc2lvbiI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RE9DVU1FTlRfVVVJRDwvY29kZT4gVGhlIHV1aWQgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9VVUlEID0gImRvY3VtZW50LXV1aWQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkRPQ1VNRU5UX0xBTkdVQUdFPC9jb2RlPiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9MQU5HVUFHRSA9ICJkb2N1bWVudC1sYW5ndWFnZSI7Ci0gICAgLyoqCi0gICAgICogVGhpcyBhdHRyaWJ1dGUgcmV0dXJucyB0aGUgZG9jdW1lbnQgbGFuZ3VhZ2UgaWYgdGhlIGRvY3VtZW50IGV4aXN0cywgb3IgdGhlCi0gICAgICogZGVmYXVsdCBsYW5ndWFnZSBvdGhlcndpc2UuIFRoaXMgbWFrZXMgaXQgc3VpdGFibGUgZm9yIDQwNCBwYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HVUFHRSA9ICJsYW5ndWFnZSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RE9DVU1FTlRfTEFOR1VBR0VTPC9jb2RlPiBUaGUgbGFuZ3VhZ2VzIHRoZSBjdXJyZW50IGRvY3VtZW50IGlzIGF2YWlsYWJsZSBpbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0xBTkdVQUdFUyA9ICJkb2N1bWVudC1sYW5ndWFnZXMiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkRPQ1VNRU5UX0xBTkdVQUdFU19DU1Y8L2NvZGU+IFRoZSBsYW5ndWFnZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGluLAotICAgICAqIGNvbW1hLXNlcGVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0xBTkdVQUdFU19DU1YgPSAiZG9jdW1lbnQtbGFuZ3VhZ2VzLWNzdiI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RE9DVU1FTlRfTEFTVE1PRElGSUVEPC9jb2RlPiBUaGUgbGFzdCBtb2RpZmllZCBkYXRlIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfTEFTVE1PRElGSUVEID0gImRvY3VtZW50LWxhc3Rtb2RpZmllZCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+QlJFQURDUlVNQl9QUkVGSVg8L2NvZGU+IFRoZSBicmVhZGNydW1iIHByZWZpeCBvZiB0aGUgcHVibGljYXRpb24sIHVzZWQgZm9yCi0gICAgICogbmF2aWdhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSRUFEQ1JVTUJfUFJFRklYID0gImJyZWFkY3J1bWItcHJlZml4IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5TU0xfUFJFRklYPC9jb2RlPiBUaGUgU1NMIHByZWZpeCBvZiB0aGUgcHVibGljYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfUFJFRklYID0gInNzbC1wcmVmaXgiOwotICAgIC8qKgotICAgICAqIDxjb2RlPk5BTUVTUEFDRTwvY29kZT4gVGhlIHBhZ2UgZW52ZWxvcGUgbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+REVGQVVMVF9QUkVGSVg8L2NvZGU+IFRoZSBkZWZhdWx0IHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJFRklYID0gImxlbnlhIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXJlYTsKLSAgICBwcml2YXRlIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBhZ2VFbnZlbG9wZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcGFnZSBlbnZlbG9wZSBmcm9tIGFuIG9iamVjdCBtb2RlbC4KLSAgICAgKiBAcGFyYW0gbWFwIFRoZSBpZGVudGl0eSBtYXAgdG8gdXNlLgotICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgc2VydmxldCBjb250ZXh0IHByZWZpeC4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSB3ZWIgYXBwbGljYXRpb24gVVJMLgotICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29udGV4dCBUaGUgc2VydmxldCBjb250ZXh0IGRpcmVjdG9yeS4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEB0aHJvd3MgUGFnZUVudmVsb3BlRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIFBhZ2VFbnZlbG9wZShEb2N1bWVudEZhY3RvcnkgbWFwLCBTdHJpbmcgY29udGV4dFBhdGgsCi0gICAgICAgICAgICBTdHJpbmcgd2ViYXBwVXJsLCBGaWxlIHNlcnZsZXRDb250ZXh0LCBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikKLSAgICAgICAgICAgIHRocm93cyBQYWdlRW52ZWxvcGVFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZhY3RvcnkgPSBtYXA7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRQYXRoOwotICAgICAgICB0aGlzLndlYmFwcFVybCA9IHdlYmFwcFVybDsKLSAgICAgICAgdGhpcy5wdWJsaWNhdGlvbiA9IHB1YmxpY2F0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHdlYmFwcFVybDsKLQotICAgIHByaXZhdGUgRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBmYWN0b3J5LgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudCBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudEZhY3RvcnkgZ2V0RG9jdW1lbnRGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIG1lc3NhZ2UgdG8gcmVwb3J0IHdoZW4gY3JlYXRpbmcgdGhlIGVudmVsb3BlIGZhaWxlZC4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlRXhjZXB0aW9uTWVzc2FnZShSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgcmV0dXJuICJSZXNvbHZpbmcgcGFnZSBlbnZlbG9wZSBmYWlsZWQ6IiArICJcbiAgVVJJOiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkKLSAgICAgICAgICAgICAgICArICJcbiAgQ29udGV4dDogIiArIGdldENvbnRleHQoKSArICJcbiAgUHVibGljYXRpb24gSUQ6ICIKLSAgICAgICAgICAgICAgICArIGdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKSArICJcbiAgQXJlYTogIiArIHRoaXMuZG9jdW1lbnQuZ2V0QXJlYSgpCi0gICAgICAgICAgICAgICAgKyAiXG4gIERvY3VtZW50IFVVSUQ6ICIgKyB0aGlzLmRvY3VtZW50LmdldFVVSUQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNhdGlvbiBvZiB0aGlzIFBhZ2VFbnZlbG9wZS4KLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+UHVibGljYXRpb248L2NvZGU+IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgewotICAgICAgICAvKgotICAgICAgICAgKiBpZiAodGhpcy5wdWJsaWNhdGlvbiA9PSBudWxsKSB7IHRyeSB7IFB1YmxpY2F0aW9uIHB1YiA9Ci0gICAgICAgICAqIFB1YmxpY2F0aW9uTWFuYWdlckltcGwuZ2V0SW5zdGFuY2UobmV3IENvbnNvbGVMb2dnZXIoKSkgLmdldFB1YmxpY2F0aW9uKHRoaXMud2ViYXBwVXJsLAotICAgICAgICAgKiB0aGlzLnNlcnZsZXRDb250ZXh0KTsgaWYgKHB1Yi5leGlzdHMoKSkgeyB0aGlzLnB1YmxpY2F0aW9uID0gcHViOyBpZgotICAgICAgICAgKiAoZ2V0SWRlbnRpdHlNYXAoKS5pc0RvY3VtZW50KHRoaXMud2ViYXBwVXJsKSkgeyBEb2N1bWVudCBfZG9jdW1lbnQgPQotICAgICAgICAgKiBnZXRJZGVudGl0eU1hcCgpLmdldEZyb21VUkwodGhpcy53ZWJhcHBVcmwpOyBzZXREb2N1bWVudChfZG9jdW1lbnQpOyB9IH0gfSBjYXRjaAotICAgICAgICAgKiAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0gfQotICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIHRoaXMucHVibGljYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBhcmVhLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJlYSgpIHsKLSAgICAgICAgaWYgKHRoaXMuYXJlYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKHRoaXMud2ViYXBwVXJsKTsKLSAgICAgICAgICAgIHRoaXMuYXJlYSA9IGluZm8uZ2V0QXJlYSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmNFbnZpcm9ubWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+UkNFbnZpcm9ubWVudDwvY29kZT4gdmFsdWUKLSAgICAgKiBAZGVwcmVjYXRlZCBXZSBzaG91bGQgZGV0YWNoIHRoZSBSQyBlbnZpcm9ubWVudCBmcm9tIHRoZSBwYWdlIGVudmVsb3BlLgotICAgICAqLwotICAgIHB1YmxpYyBSQ0Vudmlyb25tZW50IGdldFJDRW52aXJvbm1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBSQ0Vudmlyb25tZW50LmdldEluc3RhbmNlKGdldFB1YmxpY2F0aW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICBuZXcgQ29uc29sZUxvZ2dlcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZXh0LCBlLmcuICIvbGVueWEiLgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50LXBhdGguCi0gICAgICogQHJldHVybiBhIDxjb2RlPkZpbGU8Y29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFB1YmxpY2F0aW9uKCkuZ2V0UGF0aE1hcHBlcigpLmdldFBhdGgoZ2V0RG9jdW1lbnQoKS5nZXRVVUlEKCksCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS5nZXRMYW5ndWFnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldENvbnRleHQoU3RyaW5nIHN0cmluZykgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBzdHJpbmc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZG9jdW1lbnRDaGVja2VkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3VycmVudCBVUkwgZG9lcyBub3QgcmVwcmVzZW50IGEgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotICAgICAgICBpZiAoIWRvY3VtZW50Q2hlY2tlZCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudENoZWNrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChnZXREb2N1bWVudEZhY3RvcnkoKS5pc0RvY3VtZW50KHRoaXMud2ViYXBwVXJsKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50ID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCkuZ2V0RnJvbVVSTCh0aGlzLndlYmFwcFVybCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gX2RvY3VtZW50IEEgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQgX2RvY3VtZW50KSB7Ci0gICAgICAgIHRoaXMuZG9jdW1lbnQgPSBfZG9jdW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGRvY3VtZW50IGxhbmd1YWdlIG9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlIGlmIHRoZSBkb2N1bWVudCBkb2Vzbid0IGV4aXN0LgotICAgICAqIEBzZWUgI0xBTkdVQUdFCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotICAgICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgUHVibGljYXRpb24gcHViID0gZ2V0UHVibGljYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChwdWIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgbGFuZ3VhZ2UgYXR0cmlidXRlIGNhbid0IGJlIHVzZWQgb3V0c2lkZSBhIHB1YmxpY2F0aW9uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHB1Yi5nZXREZWZhdWx0TGFuZ3VhZ2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRMYW5ndWFnZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QYWdlRW52ZWxvcGVFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1BhZ2VFbnZlbG9wZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmM5NDQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1BhZ2VFbnZlbG9wZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLQotLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiB0aGUgY3JlYXRpb24gb2YgYSB7QGxpbmsgUGFnZUVudmVsb3BlfSBvYmplY3QgZmFpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRW52ZWxvcGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIC8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBQYWdlRW52ZWxvcGVFeGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbigpIHsKLQkgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUGFnZUVudmVsb3BlRXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBleGNlcHRpb24gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBQYWdlRW52ZWxvcGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBQYWdlRW52ZWxvcGVFeGNlcHRpb24uCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gY2F1c2UgIHRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1BhZ2VFbnZlbG9wZUZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1BhZ2VFbnZlbG9wZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2NDY0OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QYWdlRW52ZWxvcGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotCi0vKioKLSAqIENvbW1vbiBlbnRyeSBwb2ludCBmb3IgY3JlYXRpbmcgcGFnZSBlbnZlbG9wZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRW52ZWxvcGVGYWN0b3J5IHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFBhZ2VFbnZlbG9wZUZhY3RvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBhZ2VFbnZlbG9wZUZhY3RvcnkoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQYWdlRW52ZWxvcGVGYWN0b3J5IGluc3RhbmNlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIFBhZ2VFbnZlbG9wZUZhY3RvcnkuCi0gICAgICogQHJldHVybiBUaGUgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBhZ2VFbnZlbG9wZUZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBQYWdlRW52ZWxvcGVGYWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhZ2UgZW52ZWxvcGUgZm9yIHRoZSBvYmplY3QgbW9kZWwgb2YgYSBDb2Nvb24gY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBtYXAgVGhlIGRvY3VtZW50IGlkZW50aXR5IG1hcCB0byB1c2UuCi0gICAgICogQHBhcmFtIG9iamVjdE1vZGVsIFRoZSBvYmplY3QgbW9kZWwuCi0gICAgICogQHBhcmFtIHB1YiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHJldHVybiBBIHBhZ2UgZW52ZWxvcGUuCi0gICAgICogQHRocm93cyBQYWdlRW52ZWxvcGVFeGNlcHRpb24gaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIFBhZ2VFbnZlbG9wZSBnZXRQYWdlRW52ZWxvcGUoRG9jdW1lbnRGYWN0b3J5IG1hcCwgTWFwIG9iamVjdE1vZGVsLCBQdWJsaWNhdGlvbiBwdWIpCi0gICAgICAgICAgICB0aHJvd3MgUGFnZUVudmVsb3BlRXhjZXB0aW9uIHsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0Q29udGV4dChvYmplY3RNb2RlbCk7Ci0gICAgICAgIFN0cmluZyB3ZWJhcHBVcmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgU3RyaW5nIHNlcnZsZXRDb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UmVhbFBhdGgoIiIpOwotICAgICAgICByZXR1cm4gZ2V0UGFnZUVudmVsb3BlKG1hcCwgY29udGV4dFBhdGgsIHdlYmFwcFVybCwgbmV3IEZpbGUoc2VydmxldENvbnRleHRQYXRoKSwgcHViKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcGFnZSBlbnZlbG9wZS4KLSAgICAgKiBAcGFyYW0gbWFwIFRoZSBkb2N1bWVudCBpZGVudGl0eSBtYXAgdG8gdXNlLgotICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgc2VydmxldCBjb250ZXh0IHByZWZpeC4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSB3ZWIgYXBwbGljYXRpb24gVVJMLgotICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29udGV4dCBUaGUgc2VydmxldCBjb250ZXh0IGRpcmVjdG9yeS4KLSAgICAgKiBAcGFyYW0gcHViIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgcGFnZSBlbnZlbG9wZS4KLSAgICAgKiBAdGhyb3dzIFBhZ2VFbnZlbG9wZUV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFnZUVudmVsb3BlIGdldFBhZ2VFbnZlbG9wZShEb2N1bWVudEZhY3RvcnkgbWFwLCBTdHJpbmcgY29udGV4dFBhdGgsIFN0cmluZyB3ZWJhcHBVcmwsCi0gICAgICAgICAgICBGaWxlIHNlcnZsZXRDb250ZXh0LCBQdWJsaWNhdGlvbiBwdWIpIHRocm93cyBQYWdlRW52ZWxvcGVFeGNlcHRpb24gewotICAgICAgICBQYWdlRW52ZWxvcGUgZW52ZWxvcGUgPSBuZXcgUGFnZUVudmVsb3BlKG1hcCwgY29udGV4dFBhdGgsIHdlYmFwcFVybCwgc2VydmxldENvbnRleHQsIHB1Yik7Ci0gICAgICAgIHJldHVybiBlbnZlbG9wZTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QYXRoVG9Eb2N1bWVudElkTWFwcGVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QYXRoVG9Eb2N1bWVudElkTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYjRmM2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUGF0aFRvRG9jdW1lbnRJZE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgYmFzaWNhbGx5IHRoZSByZXZlcnNlIG9mIERvY3VtZW50SWRUb1BhdGhNYXBwZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGF0aFRvRG9jdW1lbnRJZE1hcHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlIHRoZSBkb2N1bWVudC1pZCBmb3IgYSBnaXZlbiBmaWxlLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiB0aGUgcHVibGljYXRpb24gd2hlcmUgdGhlIGZpbGUgaXMuCi0gICAgICogQHBhcmFtIGFyZWEgdGhlIGFyZWEgd2hlcmUgdGhlIGZpbGUgaXMuCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRvY3VtZW50Ci0gICAgICogQHJldHVybiB0aGUgZG9jdW1lbnQtaWQgb2YgdGhlIGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZS4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RG9lc05vdEV4aXN0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldERvY3VtZW50SWQoUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBhcmVhLCBGaWxlIGZpbGUpCi0gICAgICAgIHRocm93cyBEb2N1bWVudERvZXNOb3RFeGlzdEV4Y2VwdGlvbjsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFuZ3VhZ2UgZm9yIGEgZ2l2ZW4gZmlsZQotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBkb2N1bWVudCBmaWxlCi0gICAgICogQHJldHVybiB0aGUgbGFuZ3VhZ2UgZm9yIHRoZSBnaXZlbiBkb2N1bWVudCBmaWxlIG9yIG51bGwgaWYgdGhlIGZpbGUKLSAgICAgKiBoYXMgbm8gbGFuZ3VhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZShGaWxlIGZpbGUpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Qcm94eS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiOWY5Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi0vKioKLSAqIDxwPgotICogQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHByb3h5IGNvbmZpZ3VyYXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENvbmZpZ3VyYXRpb24gZXhhbXBsZSAoPGNvZGU+JFBVQl9IT01FL2NvbmZpZy9wdWJsaWNhdGlvbi54bWw8L2NvZGU+KToKLSAqIDwvcD4KLSAqIDxwcmU+Ci0gKiAmbHQ7cHJveGllcyZndDsKLSAqICAgJmx0O3Byb3h5IGFyZWE9ImxpdmUiIHNzbD0idHJ1ZSIgdXJsPSJodHRwczovL3d3dy5ob3N0LmNvbS9zc2wvZGVmYXVsdCIvJmd0OwotICogICAmbHQ7cHJveHkgYXJlYT0ibGl2ZSIgc3NsPSJmYWxzZSIgdXJsPSJodHRwOi8vd3d3Lmhvc3QuY29tL2RlZmF1bHQiLyZndDsKLSAqICAgJmx0O3Byb3h5IGFyZWE9ImF1dGhvcmluZyIgc3NsPSJ0cnVlIiB1cmw9Imh0dHBzOi8vd3d3Lmhvc3QuY29tL2xlbnlhL2RlZmF1bHQvYXV0aG9yaW5nIi8mZ3Q7Ci0gKiAgICZsdDtwcm94eSBhcmVhPSJhdXRob3JpbmciIHNzbD0iZmFsc2UiIHVybD0iaHR0cDovL3d3dy5ob3N0LmNvbS9sZW55YS9kZWZhdWx0L2F1dGhvcmluZyIvJmd0OwotICogJmx0O3Byb3hpZXM7Jmd0OwotICogPC9wcmU+Ci0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFByb3h5IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHVybDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIFVSTCBvZiBhIHBhcnRpY3VsYXIgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKERvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAgICAgIHJldHVybiBnZXRVcmwoKSArIGRvY3VtZW50LmdldENhbm9uaWNhbERvY3VtZW50VVJMKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJveHkgVVJMLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnVybDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm94eSBVUkwuCi0gICAgICogQHBhcmFtIF91cmwgVGhlIHVybCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyBfdXJsKSB7Ci0gICAgICAgIHRoaXMudXJsID0gX3VybDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUHJveHkgVVJMPVsiICsgZ2V0VXJsKCkgKyAiXSI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QdWJsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIxYWVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtOwotCi0vKioKLSAqIEEgTGVueWEgcHVibGljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHVibGljYXRpb24gZXh0ZW5kcyBSZXBvc2l0b3J5SXRlbSB7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5BVVRIT1JJTkdfQVJFQTwvY29kZT4gVGhlIGF1dGhvcmluZyBhcmVhCi0gICAgICovCi0gICAgU3RyaW5nIEFVVEhPUklOR19BUkVBID0gImF1dGhvcmluZyI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+REFWX0FSRUE8L2NvZGU+IFRoZSB3ZWJEQVYgYXV0aG9yaW5nIGFyZWEKLSAgICAgKi8KLSAgICBTdHJpbmcgREFWX0FSRUEgPSAid2ViZGF2IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5TVEFHSU5HX0FSRUE8L2NvZGU+IFRoZSBzdGFnaW5nIGFyZWEKLSAgICAgKi8KLSAgICBTdHJpbmcgU1RBR0lOR19BUkVBID0gInN0YWdpbmciOwotICAgIC8qKgotICAgICAqIDxjb2RlPkxJVkVfQVJFQTwvY29kZT4gVGhlIGxpdmUgYXJlYQotICAgICAqLwotICAgIFN0cmluZyBMSVZFX0FSRUEgPSAibGl2ZSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+QVJDSElWRV9BUkVBPC9jb2RlPiBUaGUgYXJjaGl2ZSBhcmVhCi0gICAgICovCi0gICAgU3RyaW5nIEFSQ0hJVkVfQVJFQSA9ICJhcmNoaXZlIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5UUkFTSF9BUkVBPC9jb2RlPiBUaGUgdHJhc2ggYXJlYQotICAgICAqLwotICAgIFN0cmluZyBUUkFTSF9BUkVBID0gInRyYXNoIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5QVUJMSUNBVElPTl9QUkVGSVg8L2NvZGU+IFRoZSBwdWJsaWNhdGlvbiBwcmVmaXgKLSAgICAgKi8KLSAgICBTdHJpbmcgUFVCTElDQVRJT05fUFJFRklYID0gImxlbnlhIiArIEZpbGUuc2VwYXJhdG9yICsgInB1YnMiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlBVQkxJQ0FUSU9OX1BSRUZJWF9VUkk8L2NvZGU+IFRoZSBwdWJsaWNhdGlvbiBwcmVmaXggVVJJCi0gICAgICovCi0gICAgU3RyaW5nIFBVQkxJQ0FUSU9OX1BSRUZJWF9VUkkgPSAibGVueWEvcHVicyI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+Q09ORklHVVJBVElPTl9QQVRIPC9jb2RlPiBUaGUgY29uZmlndXJhdGlvbiBwYXRoCi0gICAgICovCi0gICAgU3RyaW5nIENPTkZJR1VSQVRJT05fUEFUSCA9ICJjb25maWciOwotICAgIC8qKgotICAgICAqIDxjb2RlPkNPTlRFTlRfUEFUSDwvY29kZT4gVGhlIGNvbnRlbnQgcGF0aAotICAgICAqLwotICAgIFN0cmluZyBDT05URU5UX1BBVEggPSAiY29udGVudCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+UEVORElOR19QQVRIPC9jb2RlPiBUaGUgcGVuZGluZyBwYXRoCi0gICAgICovCi0gICAgU3RyaW5nIFBFTkRJTkdfUEFUSCA9ICJwZW5kaW5nIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ERUxFVEVfUEFUSDwvY29kZT4gVGhlIGRlbGV0ZSBwYXRoCi0gICAgICovCi0gICAgU3RyaW5nIERFTEVURV9QQVRIID0gImRlbGV0ZSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGl0ZW0gdHlwZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgSVRFTV9UWVBFID0gInB1YmxpY2F0aW9uIjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdmFsdWUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldElkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcHVibGljYXRpb24gYXMgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlcnZsZXQgY29udGV4dCB0aGlzIHB1YmxpY2F0aW9uIGJlbG9uZ3MgdG8gKHVzdWFsbHksIHRoZQotICAgICAqIDxjb2RlPndlYmFwcHMvbGVueWE8L2NvZGU+IGRpcmVjdG9yeSkuCi0gICAgICogQHJldHVybiBBIDxjb2RlPkZpbGU8L2NvZGU+IG9iamVjdC4KLSAgICAgKi8KLSAgICBGaWxlIGdldFNlcnZsZXRDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoaXMgcHVibGljYXRpb24gZXhpc3RzLgotICAgICAqLwotICAgIGJvb2xlYW4gZXhpc3RzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNhdGlvbiBkaXJlY3RvcnkuCi0gICAgICogQHJldHVybiBBIDxjb2RlPkZpbGU8L2NvZGU+IG9iamVjdC4KLSAgICAgKi8KLSAgICBGaWxlIGdldERpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBkaXJlY3Rvcnkgb2YgYSBzcGVjaWZpYyBhcmVhLgotICAgICAqIEBwYXJhbSBhcmVhIGEgPGNvZGU+RmlsZTwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSByb290IG9mIHRoZSBhcmVhIGNvbnRlbnQgZGlyZWN0b3J5LgotICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdG9yeSBvZiB0aGUgZ2l2ZW4gY29udGVudCBhcmVhLgotICAgICAqLwotICAgIEZpbGUgZ2V0Q29udGVudERpcmVjdG9yeShTdHJpbmcgYXJlYSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHBhdGggbWFwcGVyCi0gICAgICogQHBhcmFtIG1hcHBlciBUaGUgcGF0aCBtYXBwZXIKLSAgICAgKi8KLSAgICB2b2lkIHNldFBhdGhNYXBwZXIoRGVmYXVsdERvY3VtZW50SWRUb1BhdGhNYXBwZXIgbWFwcGVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhdGggbWFwcGVyLgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5Eb2N1bWVudElkVG9QYXRoTWFwcGVyPC9jb2RlPgotICAgICAqLwotICAgIERvY3VtZW50SWRUb1BhdGhNYXBwZXIgZ2V0UGF0aE1hcHBlcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZhdWx0IGxhbmd1YWdlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBsYW5ndWFnZQotICAgICAqLwotICAgIFN0cmluZyBnZXREZWZhdWx0TGFuZ3VhZ2UoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCBsYW5ndWFnZQotICAgICAqIEBwYXJhbSBsYW5ndWFnZSB0aGUgZGVmYXVsdCBsYW5ndWFnZQotICAgICAqLwotICAgIHZvaWQgc2V0RGVmYXVsdExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIGF2YWlsYWJsZSBsYW5ndWFnZXMgZm9yIHRoaXMgcHVibGljYXRpb24KLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPkFycmF5PC9jb2RlPiBvZiBsYW5ndWFnZXMKLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRMYW5ndWFnZXMoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYnJlYWRjcnVtYiBwcmVmaXguIEl0IGNhbiBiZSB1c2VkIGFzIGEgcHJlZml4IGlmIGEgcHVibGljYXRpb24gaXMgcGFydCBvZiBhIGxhcmdlcgotICAgICAqIHNpdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBicmVhZGNydW1iIHByZWZpeAotICAgICAqLwotICAgIFN0cmluZyBnZXRCcmVhZGNydW1iUHJlZml4KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoaW50IG9mIHRoZSBzaXRlIG1hbmFnZXIgc2VydmljZSB0aGF0IGlzIHVzZWQgYnkgdGhpcyBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgaGludCB0byB1c2UgZm9yIHNlcnZpY2Ugc2VsZWN0aW9uLgotICAgICAqLwotICAgIFN0cmluZyBnZXRTaXRlTWFuYWdlckhpbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IGJ1aWxkZXIgb2YgdGhpcyBpbnN0YW5jZS4KLSAgICAgKiBAcmV0dXJuIEEgaGludCB0byB1c2UgZm9yIHNlcnZpY2Ugc2VsZWN0aW9uLgotICAgICAqLwotICAgIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHB1YmxpY2F0aW9uIHRlbXBsYXRlIGluc3RhbnRpYXRvciBoaW50LiBJZiB0aGUgcHVibGljYXRpb24gZG9lcyBub3QgYWxsb3cKLSAgICAgKiB0ZW1wbGF0aW5nLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiBAcmV0dXJuIEEgaGludCB0byB1c2UgZm9yIHNlcnZpY2Ugc2VsZWN0aW9uLgotICAgICAqLwotICAgIFN0cmluZyBnZXRJbnN0YW50aWF0b3JIaW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IGRpci4KLSAgICAgKiBJZiB0aGUgcHVibGljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSBhIGNvbnRlbnQgZGlyLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqIEByZXR1cm4gQSBiYXNlIGRpcmVjdG9yeSB3aGVyZSBhbGwgdGhlIGNvbnRlbnQgaXMgbG9jYXRlZC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q29udGVudERpcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJveHkgd2hpY2ggaXMgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIGRvY3VtZW50J3MgYXJlYQotICAgICAqIChzZWUge0BsaW5rICNnZXRQcm94eShTdHJpbmcsIGJvb2xlYW4pfSkuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gaXNTc2xQcm90ZWN0ZWQgQSBib29sZWFuIHZhbHVlLgotICAgICAqIEByZXR1cm4gQSBwcm94eS4KLSAgICAgKi8KLSAgICBQcm94eSBnZXRQcm94eShEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBpc1NzbFByb3RlY3RlZCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRoZSBwcm94eSB3aGljaCBpcyB1c2VkIGZvciB0aGUgZ2l2ZW4gYXJlYSBhbmQgdGhlIHNzbCBwYXJhbWV0ZXIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIElmIG5vIHByb3h5IGlzIGRlZmluZWQgaW4gdGhlIHB1YmxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZSwgYSBkZWZhdWx0IHByb3h5Ci0gICAgICogd2l0aCB0aGUgVVJMIDxjb2RlPntjb250ZXh0UGF0aH0ve3B1YklkfS97YXJlYX08L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgYXJlYSBzdHJpbmcgaXMgInJvb3QiLCB0aGUgZ2xvYmFsIHByb3h5IGlzIHJldHVybmVkLiBJZiBubyBnbG9iYWwgcHJveHkKLSAgICAgKiBpcyBkZWZpbmVkLCBhIGRlZmF1bHQgZ2xvYmFsIHByb3h5IHdpdGggdGhlIFVSTCA8Y29kZT57Y29udGV4dFBhdGh9PC9jb2RlPgotICAgICAqIGlzIHJldHVybmVkLiAKLSAgICAgKiA8L3A+Ci0gICAgICogQHBhcmFtIGFyZWEgYXJlYQotICAgICAqIEBwYXJhbSBpc1NzbFByb3RlY3RlZCBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHJldHVybiBBIHByb3h5LgotICAgICAqLwotICAgIFByb3h5IGdldFByb3h5KFN0cmluZyBhcmVhLCBib29sZWFuIGlzU3NsUHJvdGVjdGVkKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHRlbXBsYXRlcyBvZiB0aGUgcHVibGljYXRpb24uCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0VGVtcGxhdGVJZHMoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIFVSSSBiYXNlIGZvciB0aGlzIHB1YmxpY2F0aW9uCi0gICAgICovCi0gICAgU3RyaW5nIGdldFNvdXJjZVVSSSgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHJldHVybiB0aGUgVVJJIGJhc2UgdW5kZXIgd2hpY2ggY29udGVudHMgaW4gdGhpcyBwdWJsaWNhdGlvbiBhcmUgYWNjZXNzZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q29udGVudFVSSShTdHJpbmcgYXJlYSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSByZXNvdXJjZSB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHdvcmtmbG93IGlzIHJlZ2lzdGVyZWQgZm9yCi0gICAgICogICAgICAgICAgICB0aGlzIHJlc291cmNlIHR5cGUuCi0gICAgICogQHJldHVybiBUaGUgd29ya2Zsb3cgc2NoZW1hIHRvIHVzZSBmb3IgdGhpcyByZXNvdXJjZSB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRXb3JrZmxvd1NjaGVtYShSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvdXJjZSB0eXBlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBwdWJsaWNhdGlvbi4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRSZXNvdXJjZVR5cGVOYW1lcygpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gQW4gYXJlYSBvYmplY3QuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgQXJlYSBnZXRBcmVhKFN0cmluZyBuYW1lKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIGF2YWlsYWJsZSBhcmVhcy4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRBcmVhTmFtZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkb2N1bWVudCBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudEZhY3RvcnkgZ2V0RmFjdG9yeSgpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QdWJsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3OGMwYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QdWJsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLS8qKgotICogUHVibGljYXRpb24gRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBQdWJsaWNhdGlvbkV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBleGNlcHRpb24gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBQdWJsaWNhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBleGNlcHRpb24gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBQdWJsaWNhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBQdWJsaWNhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25NYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QdWJsaWNhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiNGM4My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QdWJsaWNhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotLyoqCi0gKiBQdWJsaWNhdGlvbiBtYW5hZ2VyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFB1YmxpY2F0aW9uTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSdzIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBQdWJsaWNhdGlvbk1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5LgotICAgICAqIEByZXR1cm4gQWxsIHB1YmxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBQdWJsaWNhdGlvbltdIGdldFB1YmxpY2F0aW9ucyhEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkuCi0gICAgICogQHBhcmFtIGlkIFRoZSBwdWJsaWNhdGlvbiBJRC4KLSAgICAgKiBAcmV0dXJuIEEgcHVibGljYXRpb24uCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcHVibGljYXRpb24gZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24oRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBpZCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIElEcyBvZiBhbGwgYXZhaWxhYmxlIHB1YmxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRQdWJsaWNhdGlvbklkcygpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gaWQgVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgdGhlIHB1YmxpY2F0aW9uIGFscmVhZHkgZXhpc3RzLgotICAgICAqLwotICAgIHZvaWQgYWRkUHVibGljYXRpb24oU3RyaW5nIGlkKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb247Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9QdWJsaWNhdGlvblV0aWwuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTNhZmZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1B1YmxpY2F0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci0KLS8qKgotICogUHVibGljYXRpb24gdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFB1YmxpY2F0aW9uVXRpbCB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHB1YmxpY2F0aW9uLiBUaGUgcHVibGljYXRpb24gSUQgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcmVxdWVzdCBVUkkuIFRoZSBzZXJ2bGV0Ci0gICAgICogY29udGV4dCBwYXRoIGlzIHJlc29sdmVkIGZyb20gdGhlIGNvbnRleHQgb2JqZWN0LgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIG9iamVjdE1vZGVsIFRoZSBvYmplY3QgbW9kZWwgb2YgdGhlIENvY29vbiBjb21wb25lbnQuCi0gICAgICogQHJldHVybiBhIDxjb2RlPlB1YmxpY2F0aW9uPC9jb2RlPgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBjcmVhdGluZyB0aGUgcHVibGljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UHVibGljYXRpb24obWFuYWdlciwgT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcHVibGljYXRpb24gYmFzZWQgb24gYSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHJlcXVlc3QgQSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4gQSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gY3JlYXRpbmcgdGhlIHB1YmxpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24oU2VydmljZU1hbmFnZXIgbWFuYWdlciwgUmVxdWVzdCByZXF1ZXN0KQotICAgICAgICAgICAgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24obWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFB1YmxpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeShtYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgU3RyaW5nIHdlYmFwcFVybCA9IFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpOwotICAgICAgICByZXR1cm4gZ2V0UHVibGljYXRpb25Gcm9tVXJsKG1hbmFnZXIsIGZhY3RvcnksIHdlYmFwcFVybCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHB1YmxpY2F0aW9uIGZyb20gYSB3ZWJhcHAgVVJMIGFuZCBhIHNlcnZsZXQgY29udGV4dCBkaXJlY3RvcnkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeS4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSBVUkwgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gKHdpdGhvdXQgY29udGV4dCBwcmVmaXgpCi0gICAgICogQHJldHVybiBBIHB1YmxpY2F0aW9uCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbkZyb21VcmwoU2VydmljZU1hbmFnZXIgbWFuYWdlciwKLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBTdHJpbmcgd2ViYXBwVXJsKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKHdlYmFwcFVybCk7Ci0gICAgICAgIFN0cmluZyBwdWJJZCA9IGluZm8uZ2V0UHVibGljYXRpb25JZCgpOwotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBwdWJsaWNhdGlvbnMuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZG9jdW1lbnQgZmFjdG9yeS4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHB1YmxpY2F0aW9ucy4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFB1YmxpY2F0aW9uW10gZ2V0UHVibGljYXRpb25zKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgUHVibGljYXRpb25NYW5hZ2VyIHB1Yk1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHViTWFuYWdlciA9IChQdWJsaWNhdGlvbk1hbmFnZXIpIG1hbmFnZXIubG9va3VwKFB1YmxpY2F0aW9uTWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIHJldHVybiBwdWJNYW5hZ2VyLmdldFB1YmxpY2F0aW9ucyhmYWN0b3J5KTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHVibGljYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHViTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHB1Yk1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgcHVibGljYXRpb24gaWQgaXMgdmFsaWQuCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpZCBjb250YWlucyBvbmx5IGxvd2VyY2FzZSBsZXR0ZXJzIGFuZC9vciBudW1iZXJzLCBhbmQgaXMgbm90IGFuIGVtcHR5Ci0gICAgICogICAgICAgICBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRQdWJsaWNhdGlvbklEKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gaWQubWF0Y2hlcygiW2EtejAtOV0rIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gYXJlYXMgPSB7IFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBLCBQdWJsaWNhdGlvbi5EQVZfQVJFQSwKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uLlNUQUdJTkdfQVJFQSwgUHVibGljYXRpb24uTElWRV9BUkVBLCBQdWJsaWNhdGlvbi5BUkNISVZFX0FSRUEsCi0gICAgICAgICAgICBQdWJsaWNhdGlvbi5UUkFTSF9BUkVBIH07Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIGEgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgYXJlYSBuYW1lLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhIHN0cmluZyB0byB0ZXN0LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQXJlYShTdHJpbmcgYXJlYSkgewotICAgICAgICByZXR1cm4gYXJlYSAhPSBudWxsICYmIEFycmF5cy5hc0xpc3QoYXJlYXMpLmNvbnRhaW5zKGFyZWEpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUmVzb3VyY2VUeXBlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9SZXNvdXJjZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4OTVkZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9SZXNvdXJjZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5TY2hlbWE7Ci0KLS8qKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVR5cGUgewotCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiBzZXJ2aWNlIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBSZXNvdXJjZVR5cGUuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUHJlZml4IGZvciB0cmFuc2xhdGluZyB0aGUgcmVzb3VyY2UgdHlwZSBuYW1lLCBlLmcuCi0gICAgICogJmx0O2kxOG46dGV4dCZndDtyZXNvdXJjZVR5cGUtJmx0O2p4Om91dAotICAgICAqIHZhbHVlPSIke3Jlc291cmNlVHlwZS5nZXROYW1lKCl9Ii8mZ3Q7Jmx0Oy9pMThuOnRleHQmZ3Q7Ci0gICAgICovCi0gICAgU3RyaW5nIEkxOE5fUFJFRklYID0gInJlc291cmNlVHlwZS0iOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGF0ZSBhdCB3aGljaCBwb2ludCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIGNvbnNpZGVyZWQKLSAgICAgKiBleHBpcmVkCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbiBSRkMgMTEyMyBkYXRlIGZvcm1hdAotICAgICAqLwotICAgIERhdGUgZ2V0RXhwaXJlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGRvY3VtZW50IHR5cGUuCi0gICAgICogQHJldHVybiBBIHN0cmluZyB2YWx1ZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgc291cmNlIFVSSSBvZiB0aGUgUmVsYXhORyBzY2hlbWEuCi0gICAgICovCi0gICAgU2NoZW1hIGdldFNjaGVtYSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBYUGF0aHMgcmVwcmVzZW50aW5nIGF0dHJpYnV0ZXMgdG8gYmUgcmV3cml0dGVuIHdoZW4gYQotICAgICAqIGRvY3VtZW50IFVSTCBoYXMgY2hhbmdlZC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHN0cmluZ3MuCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0TGlua0F0dHJpYnV0ZVhQYXRocygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIGF2YWlsYWJsZSBzYW1wbGVzLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IHNhbXBsZS4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRTYW1wbGVOYW1lcygpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUuCi0gICAgICogQHJldHVybiBUaGUgc2FtcGxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotICAgICAqLwotICAgIFNhbXBsZSBnZXRTYW1wbGUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHR5cGUuCi0gICAgICovCi0gICAgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWxsIHN1cHBvcnRlZCBmb3JtYXRzLgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldEZvcm1hdHMoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmb3JtYXQgVGhlIGZvcm1hdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBVUkkgdG8gZ2V0IHRoZSBmb3JtYXR0ZWQgY29udGVudCBhdC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Rm9ybWF0VVJJKFN0cmluZyBmb3JtYXQpOwotCi0gICAgLyoqCi0gICAgICogQSByZXNvdXJjZSB0eXBlIHNhbXBsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNhbXBsZSB7Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgU2FtcGxlKFN0cmluZyBuYW1lLCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgICAgIEFzc2VydC5ub3ROdWxsKCJuYW1lIiwgbmFtZSk7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgQXNzZXJ0Lm5vdE51bGwoIm1pbWVUeXBlIiwgbWltZVR5cGUpOwotICAgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOwotICAgICAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInVyaSIsIHVyaSk7Ci0gICAgICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1pbWVUeXBlOwotICAgICAgICBwcml2YXRlIFN0cmluZyB1cmk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHNhbXBsZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgTUlNRSB0eXBlIG9mIHRoZSBzYW1wbGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubWltZVR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgVVJJIG9mIHRoZSBzYW1wbGUgc291cmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy51cmk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1NpbmdsZUxhbmd1YWdlSWRlbnRpdHlNYXBwZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1NpbmdsZUxhbmd1YWdlSWRlbnRpdHlNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmZDBkYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9TaW5nbGVMYW5ndWFnZUlkZW50aXR5TWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi0vKioKLSAqIFNpbmdsZSBMYW5ndWFnZSBJZGVudGl0eSBtYXBwZXIuCi0gKiBTaW1pbGFyIHRvIHRoZSB7QGxpbmsgRGVmYXVsdERvY3VtZW50SWRUb1BhdGhNYXBwZXJ9LCBidXQgZG9lc24ndCBhZGQgCi0gKiBhIGxhbmd1YWdlIHN1ZmZpeCB0byB0aGUgc291cmNlIFVSSXMuIFRoaXMgaXMgdXNlZnVsIGZvciBwdWJsaWNhdGlvbnMKLSAqIHdoaWNoIGRvIG5vdCBoYXZlIG11bHRpcGxlIGxhbmd1YWdlIHZlcnNpb24gb2YgdGhlIHNhbWUgZG9jdW1lbnQsCi0gKiBzdWNoIGFzIHRoZSAiYmxvZyIgcHVibGljYXRpb24uCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVMYW5ndWFnZUlkZW50aXR5TWFwcGVyIGV4dGVuZHMgSWRlbnRpdHlEb2N1bWVudElkVG9QYXRoTWFwcGVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJhbWV0ZXIgPGNvZGU+bGFuZ3VhZ2U8L2NvZGU+IGlzIGlnbm9yZWQsIHNpbmNlIHRoaXMgbWFwcGVyIGlzIHVzZWQgZm9yIHNpdHVhdGlvbnMgd2hlcmUgb25seSBvbmUgbGFuZ3VhZ2UgdmVyc2lvbiBvZiBhIGRvY3VtZW50IGV4aXN0cwotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uSWRlbnRpdHlEb2N1bWVudElkVG9QYXRoTWFwcGVyI2dldFN1ZmZpeChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3VmZml4KFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9VUkxJbmZvcm1hdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vVVJMSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ZjUzZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9VUkxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVzb2x2ZXMgYWxsIExlbnlhLXNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gYSB3ZWJhcHAgVVJMLgotICovCi1wdWJsaWMgY2xhc3MgVVJMSW5mb3JtYXRpb24gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHVibGljYXRpb25JZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXJlYSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29tcGxldGVBcmVhID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBkb2N1bWVudFVybCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB1cmw7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcmVhICh3aXRob3V0IHRoZSAid2ViZGF2IiBwcmVmaXgpLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmVhKCkgewotICAgICAgICBpZiAodGhpcy5hcmVhID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb21wbGV0ZUFyZWEgPSBnZXRDb21wbGV0ZUFyZWEoKTsKLSAgICAgICAgICAgIGlmIChQdWJsaWNhdGlvbi5EQVZfQVJFQS5lcXVhbHMoY29tcGxldGVBcmVhKSkgewotICAgICAgICAgICAgICAgIHRoaXMuYXJlYSA9IFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmFyZWEgPSBjb21wbGV0ZUFyZWE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBhcmVhIChpbmNsdWRpbmcgdGhlICJ3ZWJkYXYiIHByZWZpeCkuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBsZXRlQXJlYSgpIHsKLSAgICAgICAgU3RyaW5nIHB1YklkID0gZ2V0UHVibGljYXRpb25JZCgpOwotICAgICAgICBpZiAodGhpcy5jb21wbGV0ZUFyZWEgPT0gbnVsbCAmJiBwdWJJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHViVXJsID0gdGhpcy51cmwuc3Vic3RyaW5nKHB1YklkLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGlmIChwdWJVcmwuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUFyZWEgPSBleHRyYWN0QmVmb3JlU2xhc2gocHViVXJsLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVBcmVhID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZUFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgVVJMLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFVybCgpIHsKLSAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnRVcmwgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHB1YklkID0gZ2V0UHVibGljYXRpb25JZCgpOwotICAgICAgICAgICAgU3RyaW5nIGFyZWEgPSBnZXRDb21wbGV0ZUFyZWEoKTsKLSAgICAgICAgICAgIGlmIChwdWJJZCAhPSBudWxsICYmIGFyZWEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBwdWJJZCArICIvIiArIGFyZWE7Ci0gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFVybCA9IHRoaXMudXJsLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50VXJsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNhdGlvbklkKCkgewotICAgICAgICBpZiAodGhpcy5wdWJsaWNhdGlvbklkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHVibGljYXRpb25JZCA9IGV4dHJhY3RCZWZvcmVTbGFzaCh0aGlzLnVybCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucHVibGljYXRpb25JZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RCZWZvcmVTbGFzaChTdHJpbmcgcmVtYWluaW5nKSB7Ci0KLSAgICAgICAgaWYgKHJlbWFpbmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzdGVwOwotICAgICAgICBpbnQgc2xhc2hJbmRleCA9IHJlbWFpbmluZy5pbmRleE9mKCcvJyk7Ci0gICAgICAgIGlmIChzbGFzaEluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBzdGVwID0gcmVtYWluaW5nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RlcCA9IHJlbWFpbmluZy5zdWJzdHJpbmcoMCwgc2xhc2hJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0ZXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIEEgd2ViYXBwIFVSTCAod2l0aG91dCBjb250ZXh0IHByZWZpeCkuCi0gICAgICovCi0gICAgcHVibGljIFVSTEluZm9ybWF0aW9uKFN0cmluZyB3ZWJhcHBVcmwpIHsKLQotICAgICAgICBpZiAoIXdlYmFwcFVybC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgVVJMIFsiICsgd2ViYXBwVXJsICsgIl0gZG9lc24ndCBzdGFydCB3aXRoIGEgc2xhc2ghIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnVybCA9IHdlYmFwcFVybC5zdWJzdHJpbmcoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9BbGxFeGlzdGluZ1NvdXJjZVJlc29sdmVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0FsbEV4aXN0aW5nU291cmNlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1ZjRiYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0FsbEV4aXN0aW5nU291cmNlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotCi0vKioKLSAqIFNvdXJjZSB2aXNpdG9yIHRvIG9idGFpbiBhbGwgZXhpc3Rpbmcgc291cmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbEV4aXN0aW5nU291cmNlUmVzb2x2ZXIgaW1wbGVtZW50cyBTb3VyY2VWaXNpdG9yIHsKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0KFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgc291cmNlVXJpKSB7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSShzb3VyY2VVcmkpOwotICAgICAgICAgICAgaWYgKHNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRoaXMudXJpcy5hZGQoc291cmNlVXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IHVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEFsbCBleGlzdGluZyBzb3VyY2UgVVJJcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXJpcygpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgdGhpcy51cmlzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLnVyaXMuc2l6ZSgpXSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0V4aXN0aW5nQW5jZXN0b3JTb3VyY2VSZXNvbHZlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9FeGlzdGluZ0FuY2VzdG9yU291cmNlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkZjYxNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0V4aXN0aW5nQW5jZXN0b3JTb3VyY2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotCi0vKioKLSAqIFNvdXJjZSB2aXNpdG9yIHRvIG9idGFpbiB0aGUgZmlyc3QgZXhpc3Rpbmcgc291cmNlLgotICogCi0gKiBAdmVyc2lvbiAkSWQ6IEV4aXN0aW5nU291cmNlUmVzb2x2ZXIuamF2YSAxNzk1NjggMjAwNS0wNi0wMiAwOToyNzoyNlogandrYWx0eiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGlzdGluZ0FuY2VzdG9yU291cmNlUmVzb2x2ZXIgaW1wbGVtZW50cyBWaXNpdGluZ1NvdXJjZVJlc29sdmVyIHsKLQotICAgIHByaXZhdGUgU291cmNlIHNvdXJjZTsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEV4aXN0aW5nQW5jZXN0b3JTb3VyY2VSZXNvbHZlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBhbmNlc3RvciBvZiB0aGUgZmlyc3QgZXhpc3Rpbmcgc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgZ2V0U291cmNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgbWF0Y2hlcyA9IDA7Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIHNvdXJjZVVyaSkgewotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVzKys7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgPT0gMikgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9FeGlzdGluZ1NvdXJjZVJlc29sdmVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0V4aXN0aW5nU291cmNlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkYzkxYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0V4aXN0aW5nU291cmNlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLQotLyoqCi0gKiBTb3VyY2UgdmlzaXRvciB0byBvYnRhaW4gdGhlIGZpcnN0IGV4aXN0aW5nIHNvdXJjZS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRXhpc3RpbmdTb3VyY2VSZXNvbHZlciBpbXBsZW1lbnRzIFZpc2l0aW5nU291cmNlUmVzb2x2ZXIgewotCi0gICAgcHJpdmF0ZSBTb3VyY2Ugc291cmNlOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhpc3RpbmdTb3VyY2VSZXNvbHZlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBleGlzdGluZyBzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZSBnZXRTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIHNvdXJjZVVyaSkgewotICAgICAgICBpZiAodGhpcy5zb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoc291cmNlVXJpKTsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0luc3RhbnRpYXRvci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9JbnN0YW50aWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFlMjA1YS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0luc3RhbnRpYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLQotLyoqCi0gKiBPYmplY3QgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgdGVtcGxhdGluZy1lbmFibGVkIHB1YmxpY2F0aW9uLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5zdGFudGlhdG9yIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBBdmFsb24gcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IEluc3RhbnRpYXRvci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZSBhIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSB0ZW1wbGF0ZVB1YmxpY2F0aW9uIFRoZSB0ZW1wbGF0ZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gbmV3UHVibGljYXRpb25JZCBUaGUgSUQgb2YgdGhlIG5ldyBwdWJsaWNhdGlvbiBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gbmV3UHVibGljYXRpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBuZXcgcHVibGljYXRpb24uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgaW5zdGFudGlhdGUoUHVibGljYXRpb24gdGVtcGxhdGVQdWJsaWNhdGlvbiwgU3RyaW5nIG5ld1B1YmxpY2F0aW9uSWQsCi0gICAgICAgICAgICBTdHJpbmcgbmV3UHVibGljYXRpb25OYW1lKSB0aHJvd3MgRXhjZXB0aW9uOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9QdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9QdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmNmNTA4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3RlbXBsYXRpbmcvUHVibGljYXRpb25UZW1wbGF0ZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci0KLS8qKgotICogPHA+Ci0gKiBDb21wb25lbnQgdG8gbWFuYWdlIHB1YmxpY2F0aW9uIHRlbXBsYXRlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogV2hlbiBhIHNvdXJjZSBpcyBvYnRhaW5lZCwgdGhlIHRyYXZlcnNpbmcgb3JkZXIgaXMKLSAqIDwvcD4KLSAqIDxvbD4KLSAqIDxsaT50aGUgcHVibGljYXRpb24gaXRzZWxmLDwvbGk+Ci0gKiA8bGk+YWxsIGl0cyB0ZW1wbGF0ZXMsPC9saT4KLSAqIDxsaT50aGUgY29yZS48L2xpPgotICogPC9vbD4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBQdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYXZhbG9uIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBQdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBWaXNpdHMgdGhlIHZlcnNpb25zIG9mIGEgc291cmNlIGluIHRyYXZlcnNpbmcgb3JkZXIuIFRoZSBzb3VyY2UgZG9lc24ndCBoYXZlIHRvIGV4aXN0IHRvIGJlCi0gICAgICogdmlzaXRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBvcmlnaW5hbCBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgc291cmNlLCByZWxhdGl2ZWx5IHRvIHRoZSBwdWJsaWNhdGlvbiBkaXJlY3RvcnkuCi0gICAgICogQHBhcmFtIHZpc2l0b3IgVGhlIHZpc2l0b3IuCi0gICAgICovCi0gICAgdm9pZCB2aXNpdChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIHBhdGgsIFNvdXJjZVZpc2l0b3IgdmlzaXRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBWaXNpdHMgdGhlIHB1YmxpY2F0aW9ucyBpbiB0cmF2ZXJzaW5nIG9yZGVyLiBUaGUgY29yZSBpcyBub3QgdmlzaXRlZC4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIG9yaWdpbmFsIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSB2aXNpdG9yIFRoZSB2aXNpdG9yLgotICAgICAqLwotICAgIHZvaWQgdmlzaXQoUHVibGljYXRpb24gcHVibGljYXRpb24sIFB1YmxpY2F0aW9uVmlzaXRvciB2aXNpdG9yKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhpbnQgZm9yIHRoZSBwdWJsaWF0aW9uIHdoaWNoIGRlY2xhcmVzIGEgc2VydmljZS4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIG9yaWdpbmFsIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VydmljZSBzZWxlY3Rvci4KLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxIaW50IFRoZSBvcmlnaW5hbCBoaW50LgotICAgICAqIEByZXR1cm4gQW4gb2JqZWN0LgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgT2JqZWN0IGdldFNlbGVjdGFibGVIaW50KFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IsIFN0cmluZyBvcmlnaW5hbEhpbnQpCi0gICAgICAgICAgICB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3RlbXBsYXRpbmcvUHVibGljYXRpb25WaXNpdG9yLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL1B1YmxpY2F0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2E5M2M3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3RlbXBsYXRpbmcvUHVibGljYXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci0KLS8qKgotICogUHVibGljYXRpb24gdmlzaXRvciBpbnRlcmZhY2UuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBQdWJsaWNhdGlvblZpc2l0b3IgewotICAgIAotICAgIC8qKgotICAgICAqIFZpc2l0cyBhIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICovCi0gICAgdm9pZCB2aXNpdChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3RlbXBsYXRpbmcvU291cmNlVmlzaXRvci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9Tb3VyY2VWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTU2OTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9Tb3VyY2VWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU291cmNlVmlzaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBWaXNpdHMgYSBzb3VyY2UuIFdlIHBhc3MgdGhlIHJlc29sdmVyIGFuZCB0aGUgVVJJIHNvIHRoYXQgdGhlIHZpc2l0b3IgY2FuCi0gICAgICogZGVjaWRlIGlmIGl0IHdhbnRzIHRvIHJlc29sdmUgdGhlIHNvdXJjZSAobWFpbmx5IGZvciBwZXJmb3JtYW5jZQotICAgICAqIHJlYXNvbnMpLgotICAgICAqIEBwYXJhbSByZXNvbHZlciBUaGUgcmVzb2x2ZXIuCi0gICAgICogQHBhcmFtIHNvdXJjZVVyaSBUaGUgc291cmNlIFVSSS4KLSAgICAgKi8KLSAgICB2b2lkIHZpc2l0KFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgc291cmNlVXJpKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9UZW1wbGF0aW5nRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL1RlbXBsYXRpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc0MDNjNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL1RlbXBsYXRpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotICAgIC8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVtcGxhdGluZ0V4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVtcGxhdGluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBUZW1wbGF0aW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIFRlbXBsYXRpbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL1Zpc2l0aW5nU291cmNlUmVzb2x2ZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3RlbXBsYXRpbmcvVmlzaXRpbmdTb3VyY2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDU0NDlhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3RlbXBsYXRpbmcvVmlzaXRpbmdTb3VyY2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotCi0vKioKLSAqIFVSSSByZXNvbHZlci4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXNpdGluZ1NvdXJjZVJlc29sdmVyIGV4dGVuZHMgU291cmNlVmlzaXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCBzb3VyY2UuCi0gICAgICovCi0gICAgU291cmNlIGdldFNvdXJjZSgpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdXRpbC9Eb2N1bWVudEhlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdXRpbC9Eb2N1bWVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZlYzZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3V0aWwvRG9jdW1lbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGRvY3VtZW50cyBmcm9tIFhTUC4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50SGVscGVyIHsKLQotICAgIHByaXZhdGUgTWFwIG9iamVjdE1vZGVsOwotICAgIHByaXZhdGUgRG9jdW1lbnRGYWN0b3J5IGlkZW50aXR5TWFwOwotICAgIHByaXZhdGUgUHVibGljYXRpb24gcHVibGljYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIF9vYmplY3RNb2RlbCBUaGUgQ29jb29uIG9iamVjdCBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRIZWxwZXIoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgTWFwIF9vYmplY3RNb2RlbCkgewotICAgICAgICB0aGlzLm9iamVjdE1vZGVsID0gX29iamVjdE1vZGVsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5wdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbihtYW5hZ2VyLCBfb2JqZWN0TW9kZWwpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KF9vYmplY3RNb2RlbCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKG1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaWRlbnRpdHlNYXAgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KG1hbmFnZXIsIHNlc3Npb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkb2N1bWVudCBVUkwuIDxici8+SWYgdGhlIGRvY3VtZW50IElEIGlzIG51bGwsIHRoZSBjdXJyZW50IGRvY3VtZW50IElEIGlzIHVzZWQuCi0gICAgICogPGJyLz5JZiB0aGUgZG9jdW1lbnQgYXJlYSBpcyBudWxsLCB0aGUgY3VycmVudCBhcmVhIGlzIHVzZWQuIDxici8+SWYgdGhlIGxhbmd1YWdlIGlzIG51bGwsCi0gICAgICogdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaXMgdXNlZC4KLSAgICAgKiBAcGFyYW0gdXVpZCBUaGUgdGFyZ2V0IGRvY3VtZW50IFVVSUQuCi0gICAgICogQHBhcmFtIGRvY3VtZW50QXJlYSBUaGUgdGFyZ2V0IGFyZWEuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSB0YXJnZXQgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudFVybChTdHJpbmcgdXVpZCwgU3RyaW5nIGRvY3VtZW50QXJlYSwgU3RyaW5nIGxhbmd1YWdlKQotICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB1cmwgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KHRoaXMub2JqZWN0TW9kZWwpOwotICAgICAgICAgICAgU3RyaW5nIHdlYmFwcFVybCA9IFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpOwotICAgICAgICAgICAgRG9jdW1lbnQgZW52RG9jdW1lbnQgPSB0aGlzLmlkZW50aXR5TWFwLmdldEZyb21VUkwod2ViYXBwVXJsKTsKLSAgICAgICAgICAgIGlmICh1dWlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1dWlkID0gZW52RG9jdW1lbnQuZ2V0VVVJRCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZG9jdW1lbnRBcmVhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKHdlYmFwcFVybCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXRlQXJlYSA9IGluZm8uZ2V0Q29tcGxldGVBcmVhKCk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnRBcmVhID0gY29tcGxldGVBcmVhOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGFuZ3VhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gZW52RG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSB0aGlzLmlkZW50aXR5TWFwLmdldCh0aGlzLnB1YmxpY2F0aW9uLCBkb2N1bWVudEFyZWEsIHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgICAgIHVybCA9IGRvY3VtZW50LmdldENhbm9uaWNhbFdlYmFwcFVSTCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dFBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVybCA9IGNvbnRleHRQYXRoICsgdXJsOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHVybDsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbXBsZXRlIFVSTCBvZiB0aGUgcGFyZW50IGRvY3VtZW50LiBJZiB0aGUgZG9jdW1lbnQgaXMgYSB0b3AtbGV2ZWwgZG9jdW1lbnQsIHRoZQotICAgICAqIC9pbmRleCBkb2N1bWVudCBpcyBjaG9zZW4uIElmIHRoZSBwYXJlbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFwcHJvcHJpYXRlIGxhbmd1YWdlLCB0aGUKLSAgICAgKiBkZWZhdWx0IGxhbmd1YWdlIGlzIGNob3Nlbi4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGxldGVQYXJlbnRVcmwoKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHBhcmVudFVybDsKLSAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLm9iamVjdE1vZGVsKTsKLSAgICAgICAgICAgIFN0cmluZyB3ZWJhcHBVcmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gdGhpcy5pZGVudGl0eU1hcC5nZXRGcm9tVVJMKHdlYmFwcFVybCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHRQYXRoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOwotCi0gICAgICAgICAgICBEb2N1bWVudExvY2F0b3IgcGFyZW50TG9jYXRvciA9IGRvY3VtZW50LmdldExvY2F0b3IoKS5nZXRQYXJlbnQoIi9pbmRleCIpOwotICAgICAgICAgICAgRG9jdW1lbnQgcGFyZW50ID0gdGhpcy5pZGVudGl0eU1hcC5nZXQocGFyZW50TG9jYXRvcik7Ci0gICAgICAgICAgICBwYXJlbnRVcmwgPSBwYXJlbnQuZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIERvY3VtZW50QnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRleHRQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHRQYXRoID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dFBhdGggKyBwYXJlbnRVcmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBleGlzdGluZyBsYW5ndWFnZSB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQuIElmIHRoZSBkb2N1bWVudCBleGlzdHMgaW4gdGhlIGRlZmF1bHQKLSAgICAgKiBsYW5ndWFnZSwgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgdmVyc2lvbiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIHJhbmRvbSBsYW5ndWFnZSB2ZXJzaW9uIGlzCi0gICAgICogcmV0dXJuZWQuIElmIG5vIGxhbmd1YWdlIHZlcnNpb24gZXhpc3RzLCBhIERvY3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZ2V0RXhpc3RpbmdMYW5ndWFnZVZlcnNpb24oRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRFeGlzdGluZ0xhbmd1YWdlVmVyc2lvbihkb2N1bWVudCwgZG9jdW1lbnQuZ2V0UHVibGljYXRpb24oKS5nZXREZWZhdWx0TGFuZ3VhZ2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBleGlzdGluZyBsYW5ndWFnZSB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQuIElmIHRoZSBkb2N1bWVudCBleGlzdHMgaW4gdGhlIHByZWZlcnJlZAotICAgICAqIGxhbmd1YWdlLCB0aGlzIHZlcnNpb24gaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgaWYgdGhlIGRvY3VtZW50IGV4aXN0cyBpbiB0aGUgZGVmYXVsdAotICAgICAqIGxhbmd1YWdlLCB0aGUgZGVmYXVsdCBsYW5ndWFnZSB2ZXJzaW9uIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIGEgcmFuZG9tIGxhbmd1YWdlIHZlcnNpb24gaXMKLSAgICAgKiByZXR1cm5lZC4gSWYgbm8gbGFuZ3VhZ2UgdmVyc2lvbiBleGlzdHMsIGEgRG9jdW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHByZWZlcnJlZExhbmd1YWdlIFRoZSBwcmVmZXJyZWQgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXRFeGlzdGluZ0xhbmd1YWdlVmVyc2lvbihmaW5hbCBEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgIFN0cmluZyBwcmVmZXJyZWRMYW5ndWFnZSkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGRvY3VtZW50LmdldFB1YmxpY2F0aW9uKCk7Ci0KLSAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gZG9jdW1lbnQuZ2V0TGFuZ3VhZ2VzKCk7Ci0KLSAgICAgICAgaWYgKGxhbmd1YWdlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RXhjZXB0aW9uKCJUaGUgZG9jdW1lbnQgWyIgKyBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICArICJdIGRvZXMgbm90IGV4aXN0IGluIGFueSBsYW5ndWFnZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgbGFuZ3VhZ2VMaXN0ID0gQXJyYXlzLmFzTGlzdChsYW5ndWFnZXMpOwotCi0gICAgICAgIFN0cmluZyBleGlzdGluZ0xhbmd1YWdlID0gbnVsbDsKLQotICAgICAgICBpZiAobGFuZ3VhZ2VMaXN0LmNvbnRhaW5zKHByZWZlcnJlZExhbmd1YWdlKSkgewotICAgICAgICAgICAgZXhpc3RpbmdMYW5ndWFnZSA9IHByZWZlcnJlZExhbmd1YWdlOwotICAgICAgICB9IGVsc2UgaWYgKGxhbmd1YWdlTGlzdC5jb250YWlucyhwdWJsaWNhdGlvbi5nZXREZWZhdWx0TGFuZ3VhZ2UoKSkpIHsKLSAgICAgICAgICAgIGV4aXN0aW5nTGFuZ3VhZ2UgPSBwdWJsaWNhdGlvbi5nZXREZWZhdWx0TGFuZ3VhZ2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4aXN0aW5nTGFuZ3VhZ2UgPSBsYW5ndWFnZXNbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudCBleGlzdGluZ1ZlcnNpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhpc3RpbmdWZXJzaW9uID0gZG9jdW1lbnQuZ2V0VHJhbnNsYXRpb24oZXhpc3RpbmdMYW5ndWFnZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEb2N1bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBleGlzdGluZ1ZlcnNpb247Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdXRpbC9Eb2N1bWVudExhbmd1YWdlc0hlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdXRpbC9Eb2N1bWVudExhbmd1YWdlc0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcxNWViLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3V0aWwvRG9jdW1lbnRMYW5ndWFnZXNIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgdGhlIHBvbGljeSBHVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudExhbmd1YWdlc0hlbHBlciB7Ci0KLSAgICBwcml2YXRlIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5OwotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLSAgICBwcml2YXRlIFB1YmxpY2F0aW9uIHB1YjsKLSAgICBwcml2YXRlIFN0cmluZyB1cmw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFBhdGg7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgRG9jdW1lbnRsYW5ndWFnZUhlbHBlci4KLSAgICAgKiBAcGFyYW0gb2JqZWN0TW9kZWwgdGhlIG9iamVjdE1vZGVsCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gaWYgdGhlIHBhZ2UgZW52ZWxvcGUgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50TGFuZ3VhZ2VzSGVscGVyKE1hcCBvYmplY3RNb2RlbCwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLSAgICAgICAgdGhpcy51cmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbihtYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLQotICAgICAgICAgICAgdGhpcy5wdWIgPSBQdWJsaWNhdGlvblV0aWwuZ2V0UHVibGljYXRpb24obWFuYWdlciwgb2JqZWN0TW9kZWwpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgbGFuZ3VhZ2UuCi0gICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldExvY2F0b3IoKS5nZXRMYW5ndWFnZSgpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsIGF2YWlsYWJsZSBsYW5ndWFnZXMgZm9yIHRoZSBjdXJyZW50IFVSTC4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGFycmF5LgotICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMYW5ndWFnZXMoKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudExvY2F0b3IgbG9jYXRvciA9IGdldExvY2F0b3IoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IHB1Yi5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHZlcnNpb24gPSBsb2NhdG9yLmdldExhbmd1YWdlVmVyc2lvbihsYW5ndWFnZXNbaV0pOwotICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24obG9jYXRvci5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICAgICAgICAgIGlmIChwdWIuZ2V0QXJlYSh2ZXJzaW9uLmdldEFyZWEoKSkuZ2V0U2l0ZSgpLmNvbnRhaW5zKHZlcnNpb24uZ2V0UGF0aCgpLCB2ZXJzaW9uLmdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlcy5hZGQobGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGF2YWlsYWJsZUxhbmd1YWdlcy50b0FycmF5KG5ldyBTdHJpbmdbYXZhaWxhYmxlTGFuZ3VhZ2VzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGUgdGhlIFVSTCBmb3IgYSBnaXZlbiBsYW5ndWFnZSBhbmQgdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gdGhlIGNvbnRydWN0b3IuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIHRoZSBsYW5ndWFnZQotICAgICAqIEByZXR1cm4gdGhlIHVybCBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCi0gICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChsYW5ndWFnZSk7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRQYXRoICsgZG9jLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGRvY3VtZW50IGZvciBhIGdpdmVuIGxhbmd1YWdlIGFuZCB0aGUgcGFyYW1ldGVycyBnaXZlbiBpbiB0aGUgY29udHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgdGhlIGxhbmd1YWdlCi0gICAgICogQHJldHVybiB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKLSAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50TG9jYXRvciBsb2NhdG9yID0gZ2V0TG9jYXRvcigpOwotICAgICAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHZlcnNpb24gPSBsb2NhdG9yLmdldExhbmd1YWdlVmVyc2lvbihsYW5ndWFnZSk7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IHRoaXMuZmFjdG9yeS5nZXQodmVyc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50TG9jYXRvciBnZXRMb2NhdG9yKCkgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudExvY2F0b3IgbG9jYXRvciA9IHRoaXMucHViLmdldERvY3VtZW50QnVpbGRlcigpLmdldExvY2F0b3IodGhpcy5mYWN0b3J5LCB0aGlzLnVybCk7Ci0gICAgICAgIHJldHVybiBsb2NhdG9yOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi91dGlsL0RvY3VtZW50U2V0LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi91dGlsL0RvY3VtZW50U2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWU4MmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdXRpbC9Eb2N1bWVudFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIG9yZGVyZWQgc2V0IG9mIGRvY3VtZW50cyB3aXRob3V0IGR1cGxpY2F0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFNldCB7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudFNldCgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIF9kb2N1bWVudHMgVGhlIGluaXRpYWwgZG9jdW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudFNldChEb2N1bWVudFtdIF9kb2N1bWVudHMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhZGQoX2RvY3VtZW50c1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgZG9jdW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIGRvY3VtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgbGlzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRMaXN0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGRvY3VtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRbXSBnZXREb2N1bWVudHMoKSB7Ci0gICAgICAgIHJldHVybiAoRG9jdW1lbnRbXSkgdGhpcy5kb2N1bWVudHMudG9BcnJheShuZXcgRG9jdW1lbnRbdGhpcy5kb2N1bWVudHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGRvY3VtZW50IHRvIHRoaXMgc2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgZG9jdW1lbnQgdG8gYWRkLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBhbHJlYWR5IGNvbnRhaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkb2N1bWVudCBpcyBudWxsISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmRvY3VtZW50cy5jb250YWlucyhkb2N1bWVudCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkb2N1bWVudCBbIiArIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgICAgICsgIl0gaXMgYWxyZWFkeSBjb250YWluZWQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5kb2N1bWVudHMuYWRkKGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZG9jdW1lbnQgc2V0IHRvIHRoaXMgc2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgVGhlIGRvY3VtZW50cyB0byBhZGQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQWxsKERvY3VtZW50U2V0IHNldCkgewotICAgICAgICBhc3NlcnQgc2V0ICE9IG51bGw7Ci0gICAgICAgIERvY3VtZW50W10gZG9jdW1lbnRzID0gc2V0LmdldERvY3VtZW50cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFjb250YWlucyhkb2N1bWVudHNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgYWRkKGRvY3VtZW50c1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gaWYgdGhlIGRvY3VtZW50IGlzIGNvbnRhaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmNvbnRhaW5zKGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhpcyBzZXQgaXMgZW1wdHkuCi0gICAgICogCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIGdldExpc3QoKS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlzaXRzIHRoZSBzZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZpc2l0b3IgVGhlIHZpc2l0b3IuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHZpc2l0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KERvY3VtZW50VmlzaXRvciB2aXNpdG9yKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudFtdIHJlc291cmNlcyA9IGdldERvY3VtZW50cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmVzb3VyY2VzW2ldLmFjY2VwdCh2aXNpdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShEb2N1bWVudCByZXNvdXJjZSkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSByZXNvdXJjZSBpcyBudWxsISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZ2V0TGlzdCgpLmNvbnRhaW5zKHJlc291cmNlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHJlc291cmNlIFsiICsgcmVzb3VyY2UgKyAiXSBpcyBub3QgY29udGFpbmVkISIpOwotICAgICAgICB9Ci0gICAgICAgIGdldExpc3QoKS5yZW1vdmUocmVzb3VyY2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBkb2N1bWVudHMgaW4gYSBzZXQgZnJvbSB0aGlzIHNldC4KLSAgICAgKiBAcGFyYW0gc2V0IFRoZSBzZXQuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKERvY3VtZW50U2V0IHNldCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBzZXQuZ2V0RG9jdW1lbnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZW1vdmUoZG9jdW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGRvY3VtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZ2V0TGlzdCgpLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV2ZXJzZXMgdGhlIGRvY3VtZW50IG9yZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJldmVyc2UoKSB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoZ2V0TGlzdCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3V0aWwvRG9jdW1lbnRWaXNpdG9yLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi91dGlsL0RvY3VtZW50VmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWEzZGUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3V0aWwvRG9jdW1lbnRWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogVmlzaXRvciBmb3IgcmVzb3VyY2VzLgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRWaXNpdG9yIHsKLQotICAgIC8qKgotICAgICAqIFZpc2l0cyBhIHJlc291cmNlLgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgcmVzb3VyY2UuCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICB2b2lkIHZpc2l0RG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdXRpbC9MYW5ndWFnZVZlcnNpb25zLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi91dGlsL0xhbmd1YWdlVmVyc2lvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1OTdkYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi91dGlsL0xhbmd1YWdlVmVyc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIERvY3VtZW50IHNldCBjb250YWluaW5nIGFsbCBsYW5ndWFnZSB2ZXJzaW9ucyBvZiBhIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTGFuZ3VhZ2VWZXJzaW9ucyBleHRlbmRzIERvY3VtZW50U2V0IHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIExhbmd1YWdlVmVyc2lvbnMoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IGRvY3VtZW50LmdldExhbmd1YWdlcygpOwotICAgICAgICBhZGQoZG9jdW1lbnQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldExhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBsYW5ndWFnZVZlcnNpb247Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VWZXJzaW9uID0gZG9jdW1lbnQuZ2V0RmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExhbmd1YWdlVmVyc2lvbihkb2N1bWVudCwgbGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGQobGFuZ3VhZ2VWZXJzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL0NoZWNrSW5FbnRyeS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvQ2hlY2tJbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDU0ZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvQ2hlY2tJbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYzsKLQotCi0vKioKLSAqIEEgY2hlY2tpbiBlbnRyeQotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tJbkVudHJ5IGV4dGVuZHMgUkNNTEVudHJ5IHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IENoZWNrSW5FbnRyeSBvYmplY3QuCi0gICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBJRC4KLSAgICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIGlkZW50aXR5IHRvIHVzZQotICAgICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lCi0gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyLgotICAgICAqIEBwYXJhbSBiYWNrdXAgSWYgdGhpcyBlbnRyeSBoYXMgYSBiYWNrdXAuCi0gICAgICovCi0gICAgcHVibGljIENoZWNrSW5FbnRyeShTdHJpbmcgc2Vzc2lvbklkLCBTdHJpbmcgaWRlbnRpdHksIGxvbmcgdGltZSwgaW50IHZlcnNpb24sIGJvb2xlYW4gYmFja3VwKSB7Ci0gICAgICAgIHN1cGVyKHNlc3Npb25JZCwgaWRlbnRpdHksIHRpbWUpOwotICAgICAgICBzZXRUeXBlKFJDTUwuY2kpOwotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB0aGlzLmJhY2t1cCA9IGJhY2t1cDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgdmVyc2lvbiBudW1iZXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHZlcnNpb24gPSAwOwotICAgIHByaXZhdGUgYm9vbGVhbiBiYWNrdXA7Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQmFja3VwKCkgewotICAgICAgICByZXR1cm4gdGhpcy5iYWNrdXA7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvQ2hlY2tPdXRFbnRyeS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvQ2hlY2tPdXRFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjg3NzkyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL0NoZWNrT3V0RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJjOwotCi0vKioKLSAqIEEgQ2hlY2tvdXQgZW50cnkKLSAqLwotcHVibGljIGNsYXNzIENoZWNrT3V0RW50cnkgZXh0ZW5kcyBSQ01MRW50cnkgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQ2hlY2tPdXRFbnRyeSBvYmplY3QuCi0gICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBJRC4KLSAgICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIGlkZW50aXR5Ci0gICAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tPdXRFbnRyeShTdHJpbmcgc2Vzc2lvbklkLCBTdHJpbmcgaWRlbnRpdHksIGxvbmcgdGltZSkgewotICAgICAgICBzdXBlcihzZXNzaW9uSWQsIGlkZW50aXR5LCB0aW1lKTsKLSAgICAgICAgc2V0VHlwZShSQ01MLmNvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yYy9GaWxlUmVzZXJ2ZWRDaGVja0luRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yYy9GaWxlUmVzZXJ2ZWRDaGVja0luRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NWU0YTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvRmlsZVJlc2VydmVkQ2hlY2tJbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJjOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLQotLyoqCi0gKiBSZXNlcnZlZCBjaGVjay1pbiBleGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIEZpbGVSZXNlcnZlZENoZWNrSW5FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIC8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBEYXRlIGRhdGUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlU3RyaW5nID0gbnVsbDsKLSAgICBwcml2YXRlIHNob3J0IHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZpbGVSZXNlcnZlZENoZWNrSW5FeGNlcHRpb24gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIF9zb3VyY2UgVGhlIHNvdXJjZSBkb2N1bWVudAotICAgICAqIEBwYXJhbSByY21sIFRoZSBSQ01MCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVJlc2VydmVkQ2hlY2tJbkV4Y2VwdGlvbihTdHJpbmcgX3NvdXJjZSwgUkNNTCByY21sKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zb3VyY2UgPSBfc291cmNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSQ01MRW50cnkgcmNtbEVudHJ5ID0gcmNtbC5nZXRMYXRlc3RFbnRyeSgpOwotCi0gICAgICAgICAgICB0aGlzLnVzZXJuYW1lID0gcmNtbEVudHJ5LmdldElkZW50aXR5KCk7Ci0gICAgICAgICAgICB0aGlzLmRhdGUgPSBuZXcgRGF0ZShyY21sRW50cnkuZ2V0VGltZSgpKTsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHJjbWxFbnRyeS5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gUkNNTC5jbykgewotICAgICAgICAgICAgICAgIHRoaXMudHlwZVN0cmluZyA9ICJDaGVja291dCI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMudHlwZVN0cmluZyA9ICJDaGVja2luIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBGaWxlUmVzZXJ2ZWRDaGVja0luRXhjZXB0aW9uIG9iamVjdCEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICogQHJldHVybiBUaGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAiVW5hYmxlIHRvIGNoZWNrIGluIHRoZSBmaWxlICIgKyB0aGlzLnNvdXJjZSArICIgYmVjYXVzZSBvZiBhICIgKyB0aGlzLnR5cGVTdHJpbmcgKwotICAgICAgICAiIGJ5IHVzZXIgIiArIHRoaXMudXNlcm5hbWUgKyAiIGF0ICIgKyB0aGlzLmRhdGU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGF0ZQotICAgICAqIEByZXR1cm4gdGhlIGRhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy5kYXRlLmdldFRpbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0eXBlU3RyaW5nCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGVTdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB1c2VyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgdXNlciBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXNlcm5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFRoZSBzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL0ZpbGVSZXNlcnZlZENoZWNrT3V0RXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yYy9GaWxlUmVzZXJ2ZWRDaGVja091dEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjg2ZWZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL0ZpbGVSZXNlcnZlZENoZWNrT3V0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYzsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0KLS8qKgotICogRXhjZXB0aW9uIGZvciBhbHJlYWR5IGNoZWNrZWQgb3V0IGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlUmVzZXJ2ZWRDaGVja091dEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBTdHJpbmcgc291cmNlID0gbnVsbDsKLSAgICBwcml2YXRlIERhdGUgY2hlY2tPdXREYXRlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBjaGVja091dFVzZXJuYW1lID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRmlsZVJlc2VydmVkQ2hlY2tPdXRFeGNlcHRpb24gb2JqZWN0LgotICAgICAqIEBwYXJhbSBfc291cmNlIFRoZSBzb3VyY2UKLSAgICAgKiBAcGFyYW0gcmNtbCBUaGUgUkNNTAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBGaWxlUmVzZXJ2ZWRDaGVja091dEV4Y2VwdGlvbihTdHJpbmcgX3NvdXJjZSwgUkNNTCByY21sKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zb3VyY2UgPSBfc291cmNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDaGVja091dEVudHJ5IGNvZSA9IHJjbWwuZ2V0TGF0ZXN0Q2hlY2tPdXRFbnRyeSgpOwotCi0gICAgICAgICAgICB0aGlzLmNoZWNrT3V0VXNlcm5hbWUgPSBjb2UuZ2V0SWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tPdXREYXRlID0gbmV3IERhdGUoY29lLmdldFRpbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIEZpbGVSZXNlcnZlZENoZWNrT3V0RXhjZXB0aW9uIG9iamVjdCEiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRhdGUgb2YgdGhlIGNoZWNrb3V0LgotICAgICAqIEByZXR1cm4gdGhlIGRhdGUgb2YgdGhlIGNoZWNrb3V0Ci0gICAgICovCi0gICAgcHVibGljIERhdGUgZ2V0Q2hlY2tPdXREYXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy5jaGVja091dERhdGUuZ2V0VGltZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNvdXJjZSBvZiB0aGUgY2hlY2tvdXQuCi0gICAgICogQHJldHVybiB0aGUgc291cmNlIG9mIHRoZSBjaGVja291dAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB1c2VyIG5hbWUgd2hvIGRpZCB0aGlzIGNoZWNrb3V0LgotICAgICAqIEByZXR1cm4gdGhlIHVzZXIgbmFtZSBvZiB0aGlzIGNoZWNrb3V0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGVja091dFVzZXJuYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jaGVja091dFVzZXJuYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvUkNFbnZpcm9ubWVudC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvUkNFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmMyOTE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL1JDRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgaG9sZHMgdGhlIHJldmlzaW9uIGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgUkNFbnZpcm9ubWVudCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPGNvZGU+Q09ORklHVVJBVElPTl9GSUxFPC9jb2RlPiBUaGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9GSUxFID0gImxlbnlhIiArIEZpbGUuc2VwYXJhdG9yICsgImNvbmZpZyIgKwotICAgICAgICBGaWxlLnNlcGFyYXRvciArICJyYyIgKyBGaWxlLnNlcGFyYXRvciArICJyZXZpc2lvbi1jb250cm9sbGVyLnhjb25mIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5SQ01MX0RJUkVDVE9SWTwvY29kZT4gVGhlIFJDTUwgZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkNNTF9ESVJFQ1RPUlkgPSAicmNtbC1kaXJlY3RvcnkiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkJBQ0tVUF9ESVJFQ1RPUlk8L2NvZGU+IFRoZSBiYWNrdXAgZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1VQX0RJUkVDVE9SWSA9ICJiYWNrdXAtZGlyZWN0b3J5IjsKLSAgICBwcml2YXRlIFN0cmluZyByY21sRGlyZWN0b3J5OwotICAgIHByaXZhdGUgU3RyaW5nIGJhY2t1cERpcmVjdG9yeTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgaW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gUkMgZW52aXJvbm1lbnQgZm9yIHRoaXMgY29udGV4dCBwYXRoLgotICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoICh0aGUgTGVueWEgd2ViYXBwIGRpcmVjdG9yeSkuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEByZXR1cm4gQW4gUkMgZW52aXJvbm1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSQ0Vudmlyb25tZW50IGdldEluc3RhbmNlKFN0cmluZyBjb250ZXh0UGF0aCwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBSQ0Vudmlyb25tZW50IGluc3RhbmNlID0gKFJDRW52aXJvbm1lbnQpIGluc3RhbmNlcy5nZXQoY29udGV4dFBhdGgpOyAKLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFJDRW52aXJvbm1lbnQoY29udGV4dFBhdGgsIGxvZ2dlcik7Ci0gICAgICAgICAgICBpbnN0YW5jZXMucHV0KGNvbnRleHRQYXRoLCBpbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgUkNFbnZpcm9ubWVudCBvYmplY3QgZnJvbSB0aGUgY29udGV4dCBwYXRoCi0gICAgICogQHBhcmFtIGNvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGgKLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIFJDRW52aXJvbm1lbnQoU3RyaW5nIGNvbnRleHRQYXRoLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIGVuYWJsZUxvZ2dpbmcobG9nZ2VyKTsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImNvbnRleHQgcGF0aDoiICsgY29udGV4dFBhdGgpOwotCi0gICAgICAgIFN0cmluZyBjb25maWd1cmF0aW9uRmlsZVBhdGggPSBjb250ZXh0UGF0aCArICIvIiArIENPTkZJR1VSQVRJT05fRklMRTsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImNvbmZpZ3VyYXRpb24gZmlsZSBwYXRoOiIgKyBjb25maWd1cmF0aW9uRmlsZVBhdGgpOwotCi0gICAgICAgIEZpbGUgY29uZmlndXJhdGlvbkZpbGUgPSBuZXcgRmlsZShjb25maWd1cmF0aW9uRmlsZVBhdGgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGJ1aWxkZXIuYnVpbGRGcm9tRmlsZShjb25maWd1cmF0aW9uRmlsZSk7Ci0gICAgICAgICAgICBjb25maWd1cmUoY29uZmlndXJhdGlvbik7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIkNhbm5vdCBsb2FkIHJldmlzaW9uIGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbiEgIiwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiQ2Fubm90IGxvYWQgcmV2aXNpb24gY29udHJvbGxlciBjb25maWd1cmF0aW9uISAiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIkNhbm5vdCBsb2FkIHJldmlzaW9uIGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbiEgIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGUjY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24pICAgICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJldmlzaW9uIGNvbnRyb2xsZXIKLSAgICAgICAgc2V0UkNNTERpcmVjdG9yeShjb25maWd1cmF0aW9uLmdldENoaWxkKCJyY21sRGlyZWN0b3J5IikuZ2V0QXR0cmlidXRlKCJocmVmIikpOwotICAgICAgICBzZXRCYWNrdXBEaXJlY3RvcnkoY29uZmlndXJhdGlvbi5nZXRDaGlsZCgiYmFja3VwRGlyZWN0b3J5IikuZ2V0QXR0cmlidXRlKCJocmVmIikpOwotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJDT05GSUdVUkFUSU9OOlxuUkNNTCBEaXJlY3Rvcnk6IGhyZWY9IiArIGdldFJDTUxEaXJlY3RvcnkoKSk7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJDT05GSUdVUkFUSU9OOlxuQmFja3VwIERpcmVjdG9yeTogaHJlZj0iICsgZ2V0QmFja3VwRGlyZWN0b3J5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgUkNNTCBkaXJlY3RvcnkKLSAgICAgKiBAcmV0dXJuIFRoZSBSQ01MIGRpcmVjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UkNNTERpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmNtbERpcmVjdG9yeTsKLSAgICB9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJjbWwgZGlyZWN0b3J5Ci0JICogQHBhcmFtIHJjbWxEaXIgdGhlIHBhdGggdG8gdGhlIHJjbWwgZGlyZWN0b3J5Ci0JICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UkNNTERpcmVjdG9yeShTdHJpbmcgcmNtbERpcikgewotICAgICAgICB0aGlzLnJjbWxEaXJlY3RvcnkgPSByY21sRGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYmFja3VwIGRpcmVjdG9yeQotICAgICAqIEByZXR1cm4gVGhlIGJhY2t1cCBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhY2t1cERpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYmFja3VwRGlyZWN0b3J5OwotICAgIH0KLQotCS8qKgotCSAqIFNldCB0aGUgYmFja3VwIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBiYWNrdXBEaXIgcGF0aCB0byB0aGUgYmFja3VwIGRpcmVjdG9yeQotCSAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEJhY2t1cERpcmVjdG9yeShTdHJpbmcgYmFja3VwRGlyKSB7Ci0gICAgICAgIHRoaXMuYmFja3VwRGlyZWN0b3J5ID0gYmFja3VwRGlyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL1JDTUwuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL1JDTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5NDI0ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yYy9SQ01MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucmM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBoYW5kbGVzIHRoZSByZXZpc2lvbnMgb2YgYSBub2RlLiBUaGUgbm9kZSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgc28gYW4KLSAqIFJDTUwgb2JqZWN0IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBzZXNzaW9ucyBmb3Igc3luY2hyb25pemF0aW9uIHB1cnBvc2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJDTUwgewotCi0gICAgLyoqCi0gICAgICogPGNvZGU+Y288L2NvZGU+IENoZWNrb3V0Ci0gICAgICovCi0gICAgc2hvcnQgY28gPSAwOwotICAgIC8qKgotICAgICAqIDxjb2RlPmNpPC9jb2RlPiBDaGVja2luCi0gICAgICovCi0gICAgc2hvcnQgY2kgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIFJDTUwgaW4uCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUuCi0gICAgICogQHBhcmFtIGJhY2t1cCBJZiBhIGJhY2t1cCBzaGFsbCBiZSBjcmVhdGVkLgotICAgICAqIEBwYXJhbSBuZXdWZXJzaW9uIElmIHRoZSByZXZpc2lvbiBudW1iZXIgc2hvdWxkIGJlIGluY3JlYXNlZC4KLSAgICAgKiBAdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBjaGVja0luKE5vZGUgbm9kZSwgYm9vbGVhbiBiYWNrdXAsIGJvb2xlYW4gbmV3VmVyc2lvbikgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBSQ01MIG91dCB3aXRoIHJlc3RyaWN0aW9uIHRvIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUuCi0gICAgICogQHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgY2hlY2tPdXQoTm9kZSBub2RlKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIFJDTUwgb3V0LgotICAgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlLgotICAgICAqIEBwYXJhbSByZXN0cmljdGVkVG9TZXNzaW9uIElmIG9ubHkgdGhlIGN1cnJlbnQgc2Vzc2lvbiBtYXkgY2hlY2sgdGhlIG5vZGUgaW4sIG9yIGFsbCBzZXNzaW9ucwotICAgICAqICAgICAgICBiZWxvbmdpbmcgdG8gdGhpcyB1c2VyLgotICAgICAqIEB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGNoZWNrT3V0KE5vZGUgbm9kZSwgYm9vbGVhbiByZXN0cmljdGVkVG9TZXNzaW9uKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBsYXRlc3QgY2hlY2sgb3V0Ci0gICAgICogQHJldHVybiBDaGVja091dEVudHJ5IFRoZSBlbnRyeSBvZiB0aGUgY2hlY2sgb3V0Ci0gICAgICogQHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgQ2hlY2tPdXRFbnRyeSBnZXRMYXRlc3RDaGVja091dEVudHJ5KCkgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgbGF0ZXN0IGNoZWNrIGluCi0gICAgICogQHJldHVybiBDaGVja0luRW50cnkgVGhlIGVudHJ5IG9mIHRoZSBjaGVjayBpbgotICAgICAqIEB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIENoZWNrSW5FbnRyeSBnZXRMYXRlc3RDaGVja0luRW50cnkoKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBsYXRlc3QgZW50cnkgKGEgY2hlY2sgb3V0IG9yIGNoZWNrIGluKQotICAgICAqIEByZXR1cm4gUkNNTEVudHJ5IFRoZSBlbnRyeSBvZiB0aGUgY2hlY2sgb3V0L2luCi0gICAgICogQHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgUkNNTEVudHJ5IGdldExhdGVzdEVudHJ5KCkgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldCBhbGwgY2hlY2sgaW4gYW5kIGNoZWNrIG91dAotICAgICAqIEByZXR1cm4gVmVjdG9yIG9mIGFsbCBjaGVjayBvdXQgYW5kIGNoZWNrIGluIGVudHJpZXMgaW4gdGhpcyBSQ01MLWZpbGUKLSAgICAgKiBAdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBWZWN0b3IgZ2V0RW50cmllcygpIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYWxsIGJhY2t1cCBlbnRyaWVzCi0gICAgICogQHJldHVybiBWZWN0b3Igb2YgYWxsIGVudHJpZXMgaW4gdGhpcyBSQ01MLWZpbGUgd2l0aCBhIGJhY2t1cAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIFZlY3RvciBnZXRCYWNrdXBFbnRyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBiYWNrdXAuCi0gICAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUuCi0gICAgICogQHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24KLSAgICAgKi8KLSAgICB2b2lkIG1ha2VCYWNrdXAobG9uZyB0aW1lKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgYSBiYWNrdXAuCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gcmVzdG9yZSB0aGUgYmFja3VwIHRvLgotICAgICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lLgotICAgICAqIEB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uCi0gICAgICovCi0gICAgdm9pZCByZXN0b3JlQmFja3VwKE5vZGUgbm9kZSwgbG9uZyB0aW1lKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUHJ1bmUgdGhlIGxpc3Qgb2YgZW50cmllcyBhbmQgZGVsZXRlIHRoZSBjb3JyZXNwb25kaW5nIGJhY2t1cHMuIExpbWl0IHRoZSBudW1iZXIgb2YgZW50cmllcwotICAgICAqIHRvIHRoZSB2YWx1ZSBtYXhpbWFsTnVtYmVyT2ZFbnRyaWVzICgybWF4TnVtYmVyT2ZSb2xsYmFja3MoY29uZmlndXJlZCkrMSkKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICB2b2lkIHBydW5lRW50cmllcygpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgZG9jdW1lbnQgaXMgZGlydHkKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZGlydHkKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGlydHkoKTsKLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgdGltZSdzIHZhbHVlIG9mIHRoZSBiYWNrdXBzCi0gICAgICogQHJldHVybiBTdHJpbmdbXSB0aGUgdGltZXMKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRCYWNrdXBzVGltZSgpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBkZWxldGUgdGhlIFJDTUwgZmlsZSBhbmQgdGhlIGRpcmVjdG9yeSBpZiB0aGlzIG9uZSBpcyBlbXB0eQotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlLCBpZiB0aGUgZmlsZSB3YXMgZGVsZXRlZAotICAgICAqLwotICAgIGJvb2xlYW4gZGVsZXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgYWxsIHJldmlzaW9ucy4KLSAgICAgKiBAdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBkZWxldGVSZXZpc2lvbnMoKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIHRhcmdldCBub2RlLgotICAgICAqIEBwYXJhbSBvdGhlck5vZGUgVGhlIHNvdXJjZSBub2RlLgotICAgICAqIEB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGNvcHlGcm9tKE5vZGUgbm9kZSwgTm9kZSBvdGhlck5vZGUpIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBSQ01MIGlzIGNoZWNrZWQgb3V0LgotICAgICAqIEB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ2hlY2tlZE91dCgpIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgc2Vzc2lvbi4KLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBSQ01MIGlzIGNoZWNrZWQgb3V0IGJ5IHRoaXMgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0NoZWNrZWRPdXRCeVNlc3Npb24oU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yYy9SQ01MRW50cnkuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL1JDTUxFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjE4NzRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JjL1JDTUxFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucmM7Ci0KLS8qKgotICogQSBSQ01MIGVudHJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBSQ01MRW50cnkgewotCQotICAgIHByaXZhdGUgU3RyaW5nIGlkZW50aXR5ID0gbnVsbDsKLSAgICBwcml2YXRlIGxvbmcgdGltZSA9IDA7Ci0gICAgcHJpdmF0ZSBzaG9ydCB0eXBlID0gMDsKLSAgICBwcml2YXRlIFN0cmluZyBzZXNzaW9uSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFJDTUxFbnRyeSBvYmplY3QuCi0gICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBJRC4KLSAgICAgKiBAcGFyYW0gX2lkZW50aXR5IFRoZSBpZGVudGl0eSBvZiB0aGUgcGVyc29uIGZvciB0aGlzIFJDTUwKLSAgICAgKiBAcGFyYW0gX3RpbWUgVGhlIHRpbWUgb2YgdGhlIGNoZWNraW4gLyBjaGVja291dAotICAgICAqLwotICAgIHB1YmxpYyBSQ01MRW50cnkoU3RyaW5nIHNlc3Npb25JZCwgU3RyaW5nIF9pZGVudGl0eSwgbG9uZyBfdGltZSkgewotICAgICAgICB0aGlzLmlkZW50aXR5ID0gX2lkZW50aXR5OwotICAgICAgICB0aGlzLnRpbWUgPSBfdGltZTsKLSAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgaWRlbnRpdHkgb2YgdGhlIGNyZWF0b3IgKGkuZS4gdGhlIHVzZXIgbmFtZSkKLSAgICAgKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byBhbiBvLmEubC5hYy5JZGVudGl0eSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBpZGVudGl0eQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpdHkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkZW50aXR5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY3JlYXRpb24gdGltZS4KLSAgICAgKiBAcmV0dXJuIHRoZSB0aW1lCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGltZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHR5cGUgKGNoZWNraW4gb3IgY2hlY2tvdXQpLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucmMuUkNNTC5jaQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucmMuUkNNTC5jbwotICAgICAqIEByZXR1cm4gdGhlIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB0eXBlIChjaGVja2luIG9yIGNoZWNrb3V0KS4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnJjLlJDTUwuY2kKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnJjLlJDTUwuY28KLSAgICAgKiBAcGFyYW0gcyB0aGUgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFR5cGUoc2hvcnQgcykgewotICAgICAgICB0aGlzLnR5cGUgPSBzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbklkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmMvUmV2aXNpb25Db250cm9sRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yYy9SZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiZjM2MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yYy9SZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJjOwotCi0vKioKLSAqIEEgcmV2aXNpb24gY29udHJvbCBleGNlcHRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L0NvbnRlbnRIb2xkZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvQ29udGVudEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGRiMzVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvQ29udGVudEhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhT3duZXI7Ci0KLS8qKgotICogU3VwZXIgaW50ZXJmYWNlIGZvciBub2RlcyBhbmQgcmV2aXNpb25zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRIb2xkZXIgZXh0ZW5kcyBNZXRhRGF0YU93bmVyIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuIFRoZSBkYXRlIGlzIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcwotICAgICAqICAgICAgICAgc2luY2UgdGhlIGVwb2NoICgwMDowMDowMCBHTVQsIEphbnVhcnkgMSwgMTk3MCksIGFuZCBpcyAwIGlmIGl0J3MKLSAgICAgKiAgICAgICAgIHVua25vd24uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGxlbmd0aC4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBY2Nlc3NvciBmb3IgdGhlIHNvdXJjZSBVUkkgb2YgdGhpcyBub2RlCi0gICAgICogQHJldHVybiB0aGUgc291cmNlIFVSSQotICAgICAqLwotICAgIFN0cmluZyBnZXRTb3VyY2VVUkkoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgdGhlIGl0ZW0gZXhpc3RzLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgYm9vbGVhbiBleGlzdHMoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGlucHV0IHN0cmVhbS4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIE1JTUUgdHlwZS4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE1pbWVUeXBlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvSGlzdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9IaXN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZDc3NjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9IaXN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeTsKLQotLyoqCi0gKiBUaGUgcmV2aXNpb24gaGlzdG9yeSBvZiBhIG5vZGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSGlzdG9yeSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgYXZhaWxhYmxlIHJldmlzaW9uIG51bWJlcnMgaW4gZGVzY2VuZGluZyBvcmRlciAoc3RhcnRpbmcgd2l0aCB0aGUgbmV3ZXN0IG9uZSkuCi0gICAgICovCi0gICAgaW50W10gZ2V0UmV2aXNpb25OdW1iZXJzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbGF0ZXN0IHJldmlzaW9uLgotICAgICAqLwotICAgIFJldmlzaW9uIGdldExhdGVzdFJldmlzaW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG51bWJlciBBIHJldmlzaW9uIG51bWJlci4KLSAgICAgKiBAcmV0dXJuIEEgcmV2aXNpb24uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIG5vIHJldmlzaW9uIHdpdGggdGhpcyBudW1iZXIgZXhpc3RzLgotICAgICAqLwotICAgIFJldmlzaW9uIGdldFJldmlzaW9uKGludCBudW1iZXIpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L05vZGUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM1MzFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogQSByZXBvc2l0b3J5IG5vZGUgaXMgdXNlZCB0byBwZXJzaXN0IGEge0BsaW5rIFBlcnNpc3RhYmxlfS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBSZXBvc2l0b3J5SXRlbSwgQ29udGVudEhvbGRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzZXNzaW9uIHRoaXMgbm9kZSBiZWxvbmdzIHRvLgotICAgICAqLwotICAgIFNlc3Npb24gZ2V0U2Vzc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHByb3RvY29sIHdpdGggd2hpY2ggdG8gZmluZCBMZW55YSBub2RlcwotICAgICAqLwotICAgIFN0cmluZyBMRU5ZQV9QUk9UT0NPTCA9ICJsZW55YTovLyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaWRlbnRpZmlhYmxlIHR5cGUuCi0gICAgICovCi0gICAgU3RyaW5nIElERU5USUZJQUJMRV9UWVBFID0gIm5vZGUiOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiB0aGUgbm9kZSBleGlzdHMuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBib29sZWFuIGV4aXN0cygpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiB0aGUgbm9kZSBpcyBhIGNvbGxlY3Rpb24uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ29sbGVjdGlvbigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBjaGlsZHJlbgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG91dHB1dCBzdHJlYW0uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIExvY2tzIHRoZSBub2RlLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBsb2NrKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBVbmxvY2tzIHRoZSBub2RlLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCB1bmxvY2soKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBvdXQgdGhlIG5vZGUgd2l0aCByZXN0cmljdGlvbiB0byB0aGUgY3VycmVudCBzZXNzaW9uLi4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgY2hlY2tvdXQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBvdXQgdGhlIG5vZGUgd2l0aCB0aGUgcG9zc2liaWxpdHkgdG8gYWxsb3cgb3RoZXIgc2Vzc2lvbnMgdG8gY2hlY2sgaXQgaW4uCi0gICAgICogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBjdXJyZW50IFdZU0lXWUcgZWRpdG9yIGluZnJhc3RydWN0dXJlLCB3aGljaCBjYW4ndAotICAgICAqIHVzZSB0aGUgc2FtZSBzZXNzaW9uIGZvciBvcGVuaW5nIGFuZCBzYXZpbmcgYSBub2RlLgotICAgICAqIEBwYXJhbSByZXN0cmljdGVkVG9TZXNzaW9uIGlmIHRoZSBjaGVjay1vdXQgaXMgcmVzdHJpY3RlZCB0byB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBjaGVja291dChib29sZWFuIHJlc3RyaWN0ZWRUb1Nlc3Npb24pIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGluIHRoZSBub2RlLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiB0aGUgbm9kZSBpcyBub3QgY2hlY2tlZCBvdXQgb3IgaXMgY2hlY2tlZAotICAgICAqICAgICAgICAgb3V0IGJ5IGEgZGlmZmVyZW50IHNlc3Npb24uCi0gICAgICovCi0gICAgdm9pZCBjaGVja2luKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaW4gdGhlIG5vZGUgZXZlbiBpZiBpdCBpcyBjaGVja2VkIG91dCBieSBhIGRpZmZlcmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiB0aGUgbm9kZSBpcyBub3QgY2hlY2tlZCBvdXQuCi0gICAgICovCi0gICAgdm9pZCBmb3JjZUNoZWNrSW4oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyB0aGUgbm9kZSBhcyBkaXJ0eS4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgcmVnaXN0ZXJEaXJ0eSgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiB0aGUgbm9kZSBpcyBjaGVja2VkIG91dC4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNDaGVja2VkT3V0KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGUgdXNlciB3aG8gaGFzIGNoZWNrZWQgb3V0IHRoaXMgbm9kZS4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgdGhlIG5vZGUgaXMgbm90IGNoZWNrZWQgb3V0LgotICAgICAqLwotICAgIFN0cmluZyBnZXRDaGVja291dFVzZXJJZCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBub2RlIGlzIGNoZWNrZWQgb3V0IGJ5IGEgY2VydGFpbiBzZXNzaW9uLiBXZSBwYXNzIHRoZSBzZXNzaW9uCi0gICAgICogYXMgYSBwYXJhbWV0ZXIgdG8gYWxsb3cgdGhlIGNoZWNrIGZvciBub2RlcyBmcm9tIHRoZSBzaGFyZWQgaXRlbSBzdG9yZS4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgc2Vzc2lvbi4KLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBub2RlIGlzIGNoZWNrZWQgb3V0IGJ5IGEgc3BlY2lmaWMgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNDaGVja2VkT3V0QnlTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBub2RlIHRvIGNvcHkgdGhlIHJldmlzaW9ucyBmcm9tLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBjb3B5UmV2aXNpb25zRnJvbShOb2RlIHNvdXJjZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmV2aXNpb25OdW1iZXIgVGhlIHJldmlzaW9uIG51bWJlciB0byByb2xsIGJhY2suCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIHRoaXMgcmV2aXNpb24gZG9lc24ndCBleGlzdC4KLSAgICAgKi8KLSAgICB2b2lkIHJvbGxiYWNrKGludCByZXZpc2lvbk51bWJlcikgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBub2RlIGlzIGxvY2tlZC4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNMb2NrZWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyB0aGUgbm9kZSBhcyByZW1vdmVkLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCByZWdpc3RlclJlbW92ZWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJldmlzaW9uIGhpc3RvcnkuCi0gICAgICovCi0gICAgSGlzdG9yeSBnZXRIaXN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgdGhpcyBub2RlLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBkZWxldGUoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGVyc2lzdGFibGUgVGhlIG9iamVjdCB3aGljaCBpcyBwZXJzaXN0ZWQgdXNpbmcgdGhlIG5vZGUuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIHRoZSBub2RlIGFscmVhZHkgaGFzIGFuIGl0ZW0uCi0gICAgICovCi0gICAgdm9pZCBzZXRQZXJzaXN0YWJsZShQZXJzaXN0YWJsZSBwZXJzaXN0YWJsZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgb2JqZWN0IHdoaWNoIGlzIHBlcnNpc3RlZCB1c2luZyB0aGlzIG5vZGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiBubyBvYmplY3QgaXMgcmVnaXN0ZXJlZC4KLSAgICAgKi8KLSAgICBQZXJzaXN0YWJsZSBnZXRQZXJzaXN0YWJsZSgpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L05vZGVGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L05vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzhkMDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Ob2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLS8qKgotICogRmFjdG9yeSB0byBwcm9kdWNlIHJlcG9zaXRvcnkgbm9kZXMuCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGVGYWN0b3J5IGV4dGVuZHMgUmVwb3NpdG9yeUl0ZW1GYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIFRoZSByb2xlIG9mIHRoZSBzZXJ2aWNlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gTm9kZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9QZXJzaXN0YWJsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9QZXJzaXN0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzdiNGVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvUGVyc2lzdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi0vKioKLSAqIEFuIG9iamVjdCB3aGljaCBjYW4gYmUgcGVyc2lzdGVkIHRvIGEgbm9kZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50IG9mIHRoZSBwZXJzaXN0YWJsZSBvYmplY3QgdG8gdGhlIG5vZGUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbm9kZQotICAgICAqIGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjb21taXR0ZWQuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY291bGRuJ3QgYmUgc2F2ZWQuCi0gICAgICovCi0gICAgdm9pZCBzYXZlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiB0aGUgcGVyc2lzdGFibGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkLCBpLmUuIGlmIGl0IG5lZWRzIHRvIGJlIHNhdmVkLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNNb2RpZmllZCgpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRiYTU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlcG9zaXRvcnkgZXhjZXB0aW9uLgotICogQHZlcnNpb24gJElkOiQKLSAqLwotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5RXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKiBAcGFyYW0gYXJnMQotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5RXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotICAgICAgICBzdXBlcihhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gYXJnMAotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5RXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5SXRlbS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJiNWVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi0vKioKLSAqIE1hcmtlciBpbnRlcmZhY2UgZm9yIHJlcG9zaXRvcnkgaXRlbXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwb3NpdG9yeUl0ZW0gewotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gdGhpcyBpdGVtIGJlbG9uZ3MgdG8uCi0gICAgICovCi0gICAgU2Vzc2lvbiBnZXRTZXNzaW9uKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlJdGVtRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5SXRlbUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5OWQ2Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlJdGVtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciByZXBvc2l0b3J5IGl0ZW0gZmFjdG9yaWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9zaXRvcnlJdGVtRmFjdG9yeSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgaXRlbSB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRJdGVtVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNlc3Npb24gVGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCi0gICAgICogQHJldHVybiBBIHJlcG9zaXRvcnkgaXRlbS4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIFJlcG9zaXRvcnlJdGVtIGJ1aWxkSXRlbShTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBrZXkpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5SXRlbUZhY3RvcnlXcmFwcGVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlJdGVtRmFjdG9yeVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzNWMyZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlJdGVtRmFjdG9yeVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5JZGVudGlmaWFibGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uSWRlbnRpdHlNYXA7Ci0KLS8qKgotICogV3JhcHMgYSByZXBvc2l0b3J5IGl0ZW0gZmFjdG9yeSB0byByZXNlbWJsZSBhbiBpZGVudGlmaWFibGUgZmFjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlJdGVtRmFjdG9yeVdyYXBwZXIgaW1wbGVtZW50cyBJZGVudGlmaWFibGVGYWN0b3J5IHsKLSAgICAKLSAgICBwcml2YXRlIFJlcG9zaXRvcnlJdGVtRmFjdG9yeSBkZWxlZ2F0ZTsKLSAgICBwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgZmFjdG9yeSB0byB3cmFwLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5SXRlbUZhY3RvcnlXcmFwcGVyKFJlcG9zaXRvcnlJdGVtRmFjdG9yeSBkZWxlZ2F0ZSwgU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGJ1aWxkKElkZW50aXR5TWFwIG1hcCwgU3RyaW5nIGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5idWlsZEl0ZW0odGhpcy5zZXNzaW9uLCBrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0SXRlbVR5cGUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvUmVwb3NpdG9yeU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvUmVwb3NpdG9yeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjMwNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBtYW5hZ2VyLgotICogQHZlcnNpb24gJElkOiQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvc2l0b3J5TWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcm9sZSBvZiB0aGUgc2VydmljZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIGlkZW50aXR5IHRoZSBzZXNzaW9uIGJlbG9uZ3MgdG8uCi0gICAgICogQHBhcmFtIG1vZGlmaWFibGUgRGV0ZXJtaW5lcyBpZiB0aGUgcmVwb3NpdG9yeSBpdGVtcyBpbiB0aGlzIHNlc3Npb24gc2hvdWxkIGJlIG1vZGlmaWFibGUuCi0gICAgICogQHJldHVybiBBIHNlc3Npb24uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oSWRlbnRpdHkgaWRlbnRpdHksIGJvb2xlYW4gbW9kaWZpYWJsZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlNYW5hZ2VySW1wbC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5TWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4MjQ4ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uLgotICogQHZlcnNpb24gJElkOiQKLSAqLwotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlNYW5hZ2VySW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFJlcG9zaXRvcnlNYW5hZ2VyLAotICAgICAgICBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKElkZW50aXR5IGlkZW50aXR5LCBib29sZWFuIG1vZGlmaWFibGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uSW1wbChpZGVudGl0eSwgbW9kaWZpYWJsZSwgdGhpcy5tYW5hZ2VyLCBnZXRMb2dnZXIoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlVdGlsLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1JlcG9zaXRvcnlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYmQwMTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci0KLS8qKgotICogUmVwb3NpdG9yeSB1dGlsaXR5IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVV0aWwgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiBhdHRhY2hlZCB0byB0aGUgcmVxdWVzdCBvciBjcmVhdGVzIGEgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4gQSBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXNzaW9uIGdldFNlc3Npb24oU2VydmljZU1hbmFnZXIgbWFuYWdlciwgUmVxdWVzdCByZXF1ZXN0KQotICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbikgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoU2Vzc2lvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IGdldElkZW50aXR5KHJlcXVlc3QpOwotICAgICAgICAgICAgLy8gYXR0YWNoIGEgcmVhZC1vbmx5IHJlcG9zaXRvcnkgc2Vzc2lvbiB0byB0aGUgSFRUUCByZXF1ZXN0Ci0gICAgICAgICAgICBzZXNzaW9uID0gY3JlYXRlU2Vzc2lvbihtYW5hZ2VyLCBpZGVudGl0eSwgZmFsc2UpOwotICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoU2Vzc2lvbi5jbGFzcy5nZXROYW1lKCksIHNlc3Npb24pOwotICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb24uZ2V0SWRlbnRpdHkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IGdldElkZW50aXR5KHJlcXVlc3QpOwotICAgICAgICAgICAgaWYgKGlkZW50aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLnNldElkZW50aXR5KGlkZW50aXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIElkZW50aXR5IGdldElkZW50aXR5KFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5TZXNzaW9uIGNvY29vblNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKLSAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSAoSWRlbnRpdHkpIGNvY29vblNlc3Npb24uZ2V0QXR0cmlidXRlKElkZW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBpZGVudGl0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgaWRlbnRpdHkuCi0gICAgICogQHBhcmFtIG1vZGlmaWFibGUgRGV0ZXJtaW5lcyBpZiB0aGUgcmVwb3NpdG9yeSBpdGVtcyBpbiB0aGlzIHNlc3Npb24gc2hvdWxkIGJlIG1vZGlmaWFibGUuCi0gICAgICogQHJldHVybiBhIHNlc3Npb24uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBJZGVudGl0eSBpZGVudGl0eSwgYm9vbGVhbiBtb2RpZmlhYmxlKQotICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBSZXBvc2l0b3J5TWFuYWdlciByZXBvTWdyID0gbnVsbDsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVwb01nciA9IChSZXBvc2l0b3J5TWFuYWdlcikgbWFuYWdlci5sb29rdXAoUmVwb3NpdG9yeU1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBzZXNzaW9uID0gcmVwb01nci5jcmVhdGVTZXNzaW9uKGlkZW50aXR5LCBtb2RpZmlhYmxlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlcG9NZ3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHJlcG9zaXRvcnkgc2Vzc2lvbiBmcm9tIHRoZSBzZXJ2bGV0IHNlc3Npb24uCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY3VycmVudCByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVTZXNzaW9uKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShTZXNzaW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIC8qCi0gICAgICAgIG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0gICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKFNlc3Npb24uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAqLwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9SZXZpc2lvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9SZXZpc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA1YmFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvUmV2aXNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi0vKioKLSAqIEEgcmV2aXNpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmV2aXNpb24gZXh0ZW5kcyBDb250ZW50SG9sZGVyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByZXZpc2lvbiBudW1iZXIuCi0gICAgICovCi0gICAgaW50IGdldE51bWJlcigpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHRpbWUgd2hlbiB0aGlzIHJldmlzaW9uIHdhcyBjcmVhdGVkLgotICAgICAqLwotICAgIGxvbmcgZ2V0VGltZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIElEIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoaXMgcmV2aXNpb24uCi0gICAgICovCi0gICAgU3RyaW5nIGdldFVzZXJJZCgpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9TZXNzaW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1Nlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4MGY0OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1Nlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5RXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uUmVwb3NpdG9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlVuaXRPZldvcms7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBzZXNzaW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlc3Npb24gZXh0ZW5kcyBVbml0T2ZXb3JrIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGlkZW50aXR5IHRoaXMgc2Vzc2lvbiBiZWxvbmdzIHRvLgotICAgICAqLwotICAgIElkZW50aXR5IGdldElkZW50aXR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb21taXRzIHRoZSB0cmFuc2FjdGlvbi4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiBhIHRyYW5zYWN0aW9uYWJsZSBoYXMgYmVlbgotICAgICAqICAgICAgICAgbW9kaWZpZWQgYnkgYW5vdGhlciBzZXNzaW9uLgotICAgICAqLwotICAgIHZvaWQgY29tbWl0KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24sIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSb2xscyB0aGUgdHJhbnNhY3Rpb24gYmFjay4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgcm9sbGJhY2soKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5LgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleS4KLSAgICAgKiBAcmV0dXJuIFRoZSBpdGVtIGZvciB0aGUgc3BlY2lmaWMga2V5LgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgUmVwb3NpdG9yeUl0ZW0gZ2V0UmVwb3NpdG9yeUl0ZW0oUmVwb3NpdG9yeUl0ZW1GYWN0b3J5IGZhY3RvcnksIFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHZvaWQgYWRkTGlzdGVuZXIoUmVwb3NpdG9yeUxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lci4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTGlzdGVuZXJSZWdpc3RlcmVkKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGFkZCB0byB0aGUgcXVldWUuCi0gICAgICovCi0gICAgdm9pZCBlbnF1ZXVlRXZlbnQoUmVwb3NpdG9yeUV2ZW50IGV2ZW50KTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgaWRlbnRpdHkuCi0gICAgICovCi0gICAgdm9pZCBzZXRJZGVudGl0eShJZGVudGl0eSBpZGVudGl0eSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSByZXBvc2l0b3J5IGl0ZW1zIGluIHRoaXMgc2Vzc2lvbiBjYW4gYmUgbW9kaWZpZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc01vZGlmaWFibGUoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIElEIG9mIHRoaXMgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU2Vzc2lvbkltcGwuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU2Vzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QwZGVjMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1Nlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5PYnNlcnZhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uSWRlbnRpdHlNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5JZGVudGl0eU1hcEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5Mb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uTG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlVuaXRPZldvcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5Vbml0T2ZXb3JrSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIFJlcG9zaXRvcnkgc2Vzc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25JbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgU2Vzc2lvbiB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTk1PRElGSUFCTEVfU0VTU0lPTl9JRCA9ICJ1bm1vZGlmaWFibGUiOwotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLSAgICBwcml2YXRlIElkZW50aXR5IGlkZW50aXR5OwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIGlkZW50aXR5LgotICAgICAqIEBwYXJhbSBtb2RpZmlhYmxlIERldGVybWluZXMgaWYgdGhlIHJlcG9zaXRvcnkgaXRlbXMgaW4gdGhpcyBzZXNzaW9uIGNhbiBiZSBtb2RpZmllZC4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2Vzc2lvbkltcGwoSWRlbnRpdHkgaWRlbnRpdHksIGJvb2xlYW4gbW9kaWZpYWJsZSwgU2VydmljZU1hbmFnZXIgbWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgewotCi0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotCi0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJzZXJ2aWNlIG1hbmFnZXIiLCBtYW5hZ2VyKTsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQotICAgICAgICB0aGlzLmlkZW50aXR5TWFwID0gbmV3IElkZW50aXR5TWFwSW1wbChsb2dnZXIpOwotICAgICAgICB0aGlzLmlkZW50aXR5ID0gaWRlbnRpdHk7Ci0gICAgICAgIHRoaXMuaWQgPSBtb2RpZmlhYmxlID8gY3JlYXRlVXVpZCgpIDogVU5NT0RJRklBQkxFX1NFU1NJT05fSUQ7Ci0KLSAgICAgICAgT2JzZXJ2YXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWdpc3RyeSA9IChPYnNlcnZhdGlvblJlZ2lzdHJ5KSB0aGlzLm1hbmFnZXIubG9va3VwKE9ic2VydmF0aW9uUmVnaXN0cnkuUk9MRSk7Ci0gICAgICAgICAgICBhZGRMaXN0ZW5lcihyZWdpc3RyeSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVnaXN0cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGlmaWFibGUpIHsKLSAgICAgICAgICAgIHRoaXMudW5pdE9mV29yayA9IG5ldyBVbml0T2ZXb3JrSW1wbCh0aGlzLmlkZW50aXR5TWFwLCB0aGlzLmlkZW50aXR5LCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVV1aWQoKSB7Ci0gICAgICAgIFN0cmluZyBpZDsKLSAgICAgICAgVVVJREdlbmVyYXRvciBnZW5lcmF0b3IgPSBudWxsOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBnZW5lcmF0b3IgPSAoVVVJREdlbmVyYXRvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChVVUlER2VuZXJhdG9yLlJPTEUpOwotICAgICAgICAgICAgaWQgPSBnZW5lcmF0b3IubmV4dFVVSUQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoZ2VuZXJhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIElkZW50aXR5IGdldElkZW50aXR5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5pZGVudGl0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFVuaXRPZldvcmsgdW5pdE9mV29yazsKLSAgICBwcml2YXRlIFNoYXJlZEl0ZW1TdG9yZSBzaGFyZWRJdGVtU3RvcmU7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB1bml0IG9mIHdvcmsuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVuaXRPZldvcmsgZ2V0VW5pdE9mV29yaygpIHsKLSAgICAgICAgaWYgKHRoaXMudW5pdE9mV29yayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzZXNzaW9uIFsiICsgZ2V0SWQoKSArICJdIGlzIG5vdCBtb2RpZmlhYmxlISIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnVuaXRPZldvcms7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbW1pdHRpbmcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbW1pdHMgdGhlIHRyYW5zYWN0aW9uLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIGEgdHJhbnNhY3Rpb25hYmxlIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGFub3RoZXIKLSAgICAgKiAgICAgICAgIHNlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNvbW1pdCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uLCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBzYXZlUGVyc2lzdGFibGVzKCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbW1pdHRpbmcgPSB0cnVlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRyYW5zYWN0aW9uTG9jay5MT0NLKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZ2V0VW5pdE9mV29yaygpLmNvbW1pdCgpOwotICAgICAgICAgICAgICAgIGdldFNoYXJlZEl0ZW1TdG9yZSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNhY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLmV2ZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlcG9zaXRvcnlFdmVudCBldmVudCA9IChSZXBvc2l0b3J5RXZlbnQpIGkubmV4dCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBsID0gdGhpcy5saXN0ZW5lcnMuaXRlcmF0b3IoKTsgbC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgUmVwb3NpdG9yeUxpc3RlbmVyIGxpc3RlbmVyID0gKFJlcG9zaXRvcnlMaXN0ZW5lcikgbC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuZXZlbnRGaXJlZChldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5ldmVudHMuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5jb21taXR0aW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhbGwgcGVyc2lzdGFibGUgb2JqZWN0cyB0byB0aGVpciBub2Rlcy4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVQZXJzaXN0YWJsZXMoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBnZXRJZGVudGl0eU1hcCgpLmdldE9iamVjdHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0c1tpXSBpbnN0YW5jZW9mIE5vZGUpIHsKLSAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0c1tpXTsKLSAgICAgICAgICAgICAgICBQZXJzaXN0YWJsZSBwZXJzaXN0YWJsZSA9IG5vZGUuZ2V0UGVyc2lzdGFibGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocGVyc2lzdGFibGUgIT0gbnVsbCAmJiBwZXJzaXN0YWJsZS5pc01vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGFibGUuc2F2ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJvbGxzIHRoZSB0cmFuc2FjdGlvbiBiYWNrLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRyYW5zYWN0aW9uTG9jay5MT0NLKSB7Ci0gICAgICAgICAgICAgICAgZ2V0VW5pdE9mV29yaygpLnJvbGxiYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRyYW5zYWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZXZlbnRzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNoYXJlZEl0ZW1TdG9yZSBnZXRTaGFyZWRJdGVtU3RvcmUoKSB7Ci0gICAgICAgIGlmICh0aGlzLnNoYXJlZEl0ZW1TdG9yZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkSXRlbVN0b3JlID0gKFNoYXJlZEl0ZW1TdG9yZSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChTaGFyZWRJdGVtU3RvcmUuUk9MRSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zaGFyZWRJdGVtU3RvcmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb24jZ2V0UmVwb3NpdG9yeUl0ZW0ob3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5SXRlbUZhY3RvcnksCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5SXRlbSBnZXRSZXBvc2l0b3J5SXRlbShSZXBvc2l0b3J5SXRlbUZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgUmVwb3NpdG9yeUl0ZW1GYWN0b3J5V3JhcHBlciB3cmFwcGVyID0gbmV3IFJlcG9zaXRvcnlJdGVtRmFjdG9yeVdyYXBwZXIoZmFjdG9yeSwgdGhpcyk7Ci0gICAgICAgIHJldHVybiAoUmVwb3NpdG9yeUl0ZW0pIGdldElkZW50aXR5TWFwKCkuZ2V0KHdyYXBwZXIsIGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJOZXcoVHJhbnNhY3Rpb25hYmxlIG9iamVjdCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0VW5pdE9mV29yaygpLnJlZ2lzdGVyTmV3KG9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEaXJ0eShUcmFuc2FjdGlvbmFibGUgb2JqZWN0KSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICBnZXRVbml0T2ZXb3JrKCkucmVnaXN0ZXJEaXJ0eShvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVtb3ZlZChUcmFuc2FjdGlvbmFibGUgb2JqZWN0KSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICBnZXRVbml0T2ZXb3JrKCkucmVnaXN0ZXJSZW1vdmVkKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBpZGVudGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZGVudGl0eShJZGVudGl0eSBpZGVudGl0eSkgewotICAgICAgICB0aGlzLmlkZW50aXR5ID0gaWRlbnRpdHk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eShUcmFuc2FjdGlvbmFibGUgdHJhbnNhY3Rpb25hYmxlKSB7Ci0gICAgICAgIHJldHVybiBnZXRVbml0T2ZXb3JrKCkuaXNEaXJ0eSh0cmFuc2FjdGlvbmFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NrIGNyZWF0ZUxvY2soTG9ja2FibGUgbG9ja2FibGUsIGludCB2ZXJzaW9uKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0VW5pdE9mV29yaygpLmNyZWF0ZUxvY2sobG9ja2FibGUsIHZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxvY2soTG9ja2FibGUgbG9ja2FibGUpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFVuaXRPZldvcmsoKS5yZW1vdmVMb2NrKGxvY2thYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNldCBsaXN0ZW5lcnMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoUmVwb3NpdG9yeUxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJUaGUgbGlzdGVuZXIgWyIgKyBsaXN0ZW5lcgotICAgICAgICAgICAgICAgICAgICArICJdIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3Igbm9kZSBbIiArIHRoaXMgKyAiXSEiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJSZWdpc3RlcmVkKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBldmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBJZGVudGl0eU1hcCBpZGVudGl0eU1hcDsKLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbnF1ZXVlRXZlbnQoUmVwb3NpdG9yeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmICghaXNNb2RpZmlhYmxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBlbnF1ZXVlIGV2ZW50IGluIHVubW9kaWZpYWJsZSBzZXNzaW9uISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21taXR0aW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk5vIGV2ZW50cyBjYW4gYmUgcXVldWVkIHdoaWxlIHRoZSBzZXNzaW9uIGlzIGJlaW5nIGNvbW1pdHRlZC4gRXZlbnQ6IFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBldmVudC5nZXREZXNjcmlwdG9yKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIEFzc2VydC5pc1RydWUoImV2ZW50IGJlbG9uZ3MgdG8gc2Vzc2lvbiIsIGV2ZW50LmdldFNlc3Npb24oKSA9PSB0aGlzKTsKLSAgICAgICAgdGhpcy5ldmVudHMuYWRkKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSWRlbnRpdHlNYXAgZ2V0SWRlbnRpdHlNYXAoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkZW50aXR5TWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudW5pdE9mV29yayAhPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NoYXJlZEl0ZW1TdG9yZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9TaGFyZWRJdGVtU3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0ZTllZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NoYXJlZEl0ZW1TdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLS8qKgotICogU3RvcmUgZm9yIHJlYWQtb25seSBpdGVtcyB3aGljaCBhcmUgc2hhcmVkIGJ5IGFsbCBzZXNzaW9ucyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTaGFyZWRJdGVtU3RvcmUgZXh0ZW5kcyBTZXNzaW9uIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2aWNlIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBTaGFyZWRJdGVtU3RvcmUuY2xhc3MuZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgc3RvcmUgd2hlbiBhIHNlc3Npb24gaGFzIGJlZW4gY29tbWl0dGVkLgotICAgICAqLwotICAgIHZvaWQgY2xlYXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9VVUlER2VuZXJhdG9yLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1VVSURHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkYzk3Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1VVSURHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi0vKioKLSAqIFVVSUQgZ2VuZXJhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVVSURHZW5lcmF0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhlIHNlcnZpY2Ugcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IFVVSURHZW5lcmF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIG5ldyBVVUlELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgbmV4dFVVSUQoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvQWJzdHJhY3RMaW5rLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL0Fic3RyYWN0TGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjA5MzA2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvQWJzdHJhY3RMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qIEB2ZXJzaW9uICRJZCQgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci0KLS8qKgotICogVGhlIEFic3RyYWN0TGluayBjbGFzcyBlbmNhcHN1bGF0ZXMgYSBzdHJpbmcgbGFiZWwgYW5kIGEgYXNzb2NpYXRlZCBsYW5ndWFnZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGluayBpbXBsZW1lbnRzIExpbmsgewotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEFic3RyYWN0TGluayBvYmplY3QuCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIHNpdGUgbm9kZS4KLSAgICAgKiBAcGFyYW0gX2xhYmVsIHRoZSBhY3R1YWwgbGFiZWwKLSAgICAgKiBAcGFyYW0gX2xhbmd1YWdlIHRoZSBsYW5ndWFnZQotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdExpbmsoRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnksIFNpdGVOb2RlIG5vZGUsIFN0cmluZyBfbGFiZWwsIFN0cmluZyBfbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5sYWJlbCA9IF9sYWJlbDsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IF9sYW5ndWFnZTsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGFjdHVhbCBsYWJlbCBvZiB0aGUgQWJzdHJhY3RMaW5rIG9iamVjdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFjdHVhbCBsYWJlbCBhcyBhIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGFuZ3VhZ2Ugb2YgdGhpcyBBYnN0cmFjdExpbmsgb2JqZWN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGFuZ3VhZ2UKLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMYWJlbCgpICsgIiAiICsgZ2V0TGFuZ3VhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGJvb2xlYW4gZXF1YWxzID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGdldENsYXNzKCkuaXNJbnN0YW5jZShvYmopKSB7Ci0gICAgICAgICAgICBBYnN0cmFjdExpbmsgb3RoZXJMYWJlbCA9IChBYnN0cmFjdExpbmspIG9iajsKLSAgICAgICAgICAgIGVxdWFscyA9IGdldExhYmVsKCkuZXF1YWxzKG90aGVyTGFiZWwuZ2V0TGFiZWwoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMob3RoZXJMYWJlbC5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcXVhbHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldExhYmVsKCkuaGFzaENvZGUoKSArIGdldExhbmd1YWdlKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNpdGVOb2RlIG5vZGU7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeTsKLQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLSAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IGdldE5vZGUoKTsKLSAgICAgICAgU3RyaW5nIHV1aWQgPSBub2RlLmdldFV1aWQoKTsKLSAgICAgICAgaWYgKHV1aWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgbm9kZSBbIiArIG5vZGUgKyAiXSBoYXMgbm8gVVVJRC4iKTsKLSAgICAgICAgfQotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBub2RlLmdldFN0cnVjdHVyZSgpLmdldFB1YmxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhcmVhID0gbm9kZS5nZXRTdHJ1Y3R1cmUoKS5nZXRBcmVhKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5LmdldChwdWIsIGFyZWEsIHV1aWQsIGdldExhbmd1YWdlKCkpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlIGdldE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgICAgIHNhdmUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlKCkge30KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL0Fic3RyYWN0U2l0ZU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvQWJzdHJhY3RTaXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGFmMmY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvQWJzdHJhY3RTaXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc2l0ZSBtYW5hZ2Vycy4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTaXRlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFNpdGVNYW5hZ2VyLCBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdFNpdGVNYW5hZ2VyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNzb3J0QXNjZW5kaW5nKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRTZXQpCi0gICAgICovCi0gICAgcHVibGljIFNpdGVOb2RlW10gc29ydEFzY2VuZGluZyhTaXRlTm9kZVtdIG5vZGVzKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7Ci0KLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBub2Rlc1swXS5nZXRTdHJ1Y3R1cmUoKS5nZXRQdWJsaWNhdGlvbigpLmdldEZhY3RvcnkoKTsKLSAgICAgICAgICAgIGlmICghY2hlY2sobWFwLCBuZXcgTm9kZVNldCh0aGlzLm1hbmFnZXIsIG5vZGVzKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiVGhlIGRlcGVuZGVuY2UgcmVsYXRpb24gaXMgbm90IGEgc3RyaWN0IHBhcnRpYWwgb3JkZXIhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNpdGVOb2RlW10gc29ydGVkTm9kZXMgPSAoU2l0ZU5vZGVbXSkgQXJyYXlzLmFzTGlzdChub2RlcykudG9BcnJheShuZXcgU2l0ZU5vZGVbbm9kZXMubGVuZ3RoXSk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydChzb3J0ZWROb2RlcywgbmV3IE5vZGVDb21wYXJhdG9yKG1hcCkpOwotICAgICAgICAgICAgcmV0dXJuIHNvcnRlZE5vZGVzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICBub2RlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgZGVwZW5kZW5jZSByZWxhdGlvbiBpcyBhIHN0cmljdCBwYXJ0aWFsIG9yZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgVGhlIGlkZW50aXR5IG1hcCB0byBvcGVyYXRlIG9uLgotICAgICAqIEBwYXJhbSBzZXQgVGhlIGRvY3VtZW50IHNldCB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjayhEb2N1bWVudEZhY3RvcnkgbWFwLCBOb2RlU2V0IHNldCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzU3RyaWN0UGFydGlhbE9yZGVyID0gaXNJcnJlZmxleGl2ZShtYXAsIHNldCkgJiYgaXNBbnRpc3ltbWV0cmljKG1hcCwgc2V0KQotICAgICAgICAgICAgICAgICYmIGlzVHJhbnNpdGl2ZShtYXAsIHNldCk7Ci0gICAgICAgIHJldHVybiBpc1N0cmljdFBhcnRpYWxPcmRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIGRlcGVuZGVuY2UgcmVsYXRpb24gaXMgYW50aXN5bW1ldHJpYy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwIFRoZSBpZGVudGl0eSBtYXAgdG8gb3BlcmF0ZSBvbi4KLSAgICAgKiBAcGFyYW0gc2V0IFRoZSBkb2N1bWVudCBzZXQgdG8gY2hlY2suCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBbnRpc3ltbWV0cmljKERvY3VtZW50RmFjdG9yeSBtYXAsIE5vZGVTZXQgc2V0KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpdGVOb2RlW10gcmVzb3VyY2VzID0gc2V0LmdldE5vZGVzKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNBbnRpc3ltbWV0cmljID0gdHJ1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IHJlc291cmNlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlcyhtYXAsIHJlc291cmNlc1tpXSwgcmVzb3VyY2VzW2pdKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVxdWlyZXMobWFwLCByZXNvdXJjZXNbal0sIHJlc291cmNlc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICEocmVzb3VyY2VzW2ldID09IHJlc291cmNlc1tqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNBbnRpc3ltbWV0cmljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0FudGlzeW1tZXRyaWM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBkZXBlbmRlbmNlIHJlbGF0aW9uIGlzIHRyYW5zaXRpdmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCBUaGUgaWRlbnRpdHkgbWFwIHRvIG9wZXJhdGUgb24uCi0gICAgICogQHBhcmFtIHNldCBUaGUgZG9jdW1lbnQgc2V0IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVHJhbnNpdGl2ZShEb2N1bWVudEZhY3RvcnkgbWFwLCBOb2RlU2V0IHNldCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTaXRlTm9kZVtdIHJlc291cmNlcyA9IHNldC5nZXROb2RlcygpOwotICAgICAgICBib29sZWFuIGlzVHJhbnNpdGl2ZSA9IHRydWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCByZXNvdXJjZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gaiArIDE7IGsgPCByZXNvdXJjZXMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVzKG1hcCwgcmVzb3VyY2VzW2ldLCByZXNvdXJjZXNbal0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVxdWlyZXMobWFwLCByZXNvdXJjZXNbal0sIHJlc291cmNlc1trXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhcmVxdWlyZXMobWFwLCByZXNvdXJjZXNbaV0sIHJlc291cmNlc1trXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1RyYW5zaXRpdmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBkZXBlbmRlbmNlIHJlbGF0aW9uIGlzIGlycmVmbGV4aXZlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgVGhlIGlkZW50aXR5IG1hcCB0byBvcGVyYXRlIG9uLgotICAgICAqIEBwYXJhbSBzZXQgVGhlIGRvY3VtZW50IHNldC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZQotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSXJyZWZsZXhpdmUoRG9jdW1lbnRGYWN0b3J5IG1hcCwgTm9kZVNldCBzZXQpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZU5vZGVbXSByZXNvdXJjZXMgPSBzZXQuZ2V0Tm9kZXMoKTsKLSAgICAgICAgYm9vbGVhbiBpc0lycmVmbGV4aXZlID0gdHJ1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChyZXF1aXJlcyhtYXAsIHJlc291cmNlc1tpXSwgcmVzb3VyY2VzW2ldKSkgewotICAgICAgICAgICAgICAgIGlzSXJyZWZsZXhpdmUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNJcnJlZmxleGl2ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyBub2RlcyBhY2NvcmRpbmcgdG8gdGhlIGRlcGVuZGVuY2UgcmVsYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIE5vZGVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEN0b3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbWFwIFRoZSBpZGVudGl0eSBtYXAgdG8gb3BlcmF0ZSBvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBOb2RlQ29tcGFyYXRvcihEb2N1bWVudEZhY3RvcnkgbWFwKSB7Ci0gICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRG9jdW1lbnRGYWN0b3J5IG1hcDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIGlmIChhcmcwIGluc3RhbmNlb2YgU2l0ZU5vZGUgJiYgYXJnMSBpbnN0YW5jZW9mIFNpdGVOb2RlKSB7Ci0gICAgICAgICAgICAgICAgU2l0ZU5vZGUgZG9jMSA9IChTaXRlTm9kZSkgYXJnMDsKLSAgICAgICAgICAgICAgICBTaXRlTm9kZSBkb2MyID0gKFNpdGVOb2RlKSBhcmcxOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFic3RyYWN0U2l0ZU1hbmFnZXIudGhpcy5yZXF1aXJlcyhtYXAsIGRvYzEsIGRvYzIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChBYnN0cmFjdFNpdGVNYW5hZ2VyLnRoaXMucmVxdWlyZXMobWFwLCBkb2MyLCBkb2MxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvQWJzdHJhY3RTaXRlTm9kZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9BYnN0cmFjdFNpdGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzcyODEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9BYnN0cmFjdFNpdGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQWJzdHJhY3Qgc2l0ZSBub2RlIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTaXRlTm9kZSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFNpdGVOb2RlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7Ci0gICAgcHJpdmF0ZSBTaXRlU3RydWN0dXJlIHN0cnVjdHVyZTsKLSAgICBwcml2YXRlIFN0cmluZyB1dWlkOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U2l0ZU5vZGUoUHVibGljYXRpb24gcHVibGljYXRpb24sIFNpdGVTdHJ1Y3R1cmUgc3RydWN0dXJlLCBTdHJpbmcgcGF0aCwKLSAgICAgICAgICAgIFN0cmluZyB1dWlkLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIAotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodGhpcywgbG9nZ2VyKTsKLQotICAgICAgICBBc3NlcnQubm90TnVsbCgic3RydWN0dXJlIiwgc3RydWN0dXJlKTsKLSAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7Ci0KLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInBhdGgiLCBwYXRoKTsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZSgicGF0aCBzdGFydHMgd2l0aCAvIiwgcGF0aC5zdGFydHNXaXRoKCIvIikpOwotICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotCi0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJ1dWlkIiwgdXVpZCk7Ci0gICAgICAgIHRoaXMudXVpZCA9IHV1aWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZVN0cnVjdHVyZSBnZXRTdHJ1Y3R1cmUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBTaXRlTm9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdGhpc0tleSA9IGdldEtleShnZXRTdHJ1Y3R1cmUoKS5nZXRQdWJsaWNhdGlvbigpLAotICAgICAgICAgICAgICAgIGdldFN0cnVjdHVyZSgpLmdldEFyZWEoKSwKLSAgICAgICAgICAgICAgICBnZXRQYXRoKCkpOwotICAgICAgICBTaXRlTm9kZSBub2RlID0gKFNpdGVOb2RlKSBvYmo7Ci0gICAgICAgIFN0cmluZyBub2RlS2V5ID0gZ2V0S2V5KG5vZGUuZ2V0U3RydWN0dXJlKCkuZ2V0UHVibGljYXRpb24oKSwKLSAgICAgICAgICAgICAgICBub2RlLmdldFN0cnVjdHVyZSgpLmdldEFyZWEoKSwKLSAgICAgICAgICAgICAgICBub2RlLmdldFBhdGgoKSk7Ci0gICAgICAgIHJldHVybiB0aGlzS2V5LmVxdWFscyhub2RlS2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0S2V5KGdldFN0cnVjdHVyZSgpLmdldFB1YmxpY2F0aW9uKCksIGdldFN0cnVjdHVyZSgpLmdldEFyZWEoKSwgZ2V0UGF0aCgpKS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEtleShQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBhcmVhLCBTdHJpbmcgZG9jSWQpIHsKLSAgICAgICAgcmV0dXJuIHB1Yi5nZXRJZCgpICsgIjoiICsgYXJlYSArICI6IiArIGRvY0lkOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZSBnZXRQYXJlbnQoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGdldFBhdGgoKS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIFN0cmluZ1tdIHN0ZXBzID0gaWQuc3BsaXQoIi8iKTsKLSAgICAgICAgaWYgKHN0ZXBzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiVGhlIG5vZGUgWyIgKyBnZXRQYXRoKCkgKyAiXSBpcyBhIHRvcC1sZXZlbCBub2RlLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGxhc3RJbmRleCA9IGlkLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyZW50SWQgPSBpZC5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBnZXRTdHJ1Y3R1cmUoKS5nZXROb2RlKCIvIiArIHBhcmVudElkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcExldmVsKCkgewotICAgICAgICByZXR1cm4gZ2V0UGF0aCgpLmxhc3RJbmRleE9mKCIvIikgPT0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFV1aWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnV1aWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTGluayhTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0TGFuZ3VhZ2VzKCkpLmNvbnRhaW5zKGxhbmd1YWdlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvTGluay5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTNmMTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotCi0vKioKLSAqIEEgbGluayBpbiB0aGUgc2l0ZSBzdHJ1Y3R1cmUgcmVmZXJlbmNlcyBhIGRvY3VtZW50LgotICogQSBzaXRlIG5vZGUgY29udGFpbnMgYSBsaW5rIGZvciBlYWNoIHRyYW5zbGF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpbmsgewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbGFuZ3VhZ2Ugb2YgdGhpcyBsaW5rLgotICAgICAqLwotICAgIFN0cmluZyBnZXRMYW5ndWFnZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGRvY3VtZW50IHRoaXMgbGluayBwb2ludHMgdG8uCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG5vZGUgdGhpcyBsaW5rIGJlbG9uZ3MgdG8uCi0gICAgICovCi0gICAgU2l0ZU5vZGUgZ2V0Tm9kZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbGFiZWwgb2YgdGhpcyBsaW5rLgotICAgICAqLwotICAgIFN0cmluZyBnZXRMYWJlbCgpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbmV3IGxhYmVsLgotICAgICAqLwotICAgIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBsaW5rLgotICAgICAqLwotICAgIHZvaWQgZGVsZXRlKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL05vZGVJdGVyYXRvci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9Ob2RlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljMDVlOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL05vZGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogTm9kZSBpdGVyYXRvci4KLSAqLwotcHVibGljIGNsYXNzIE5vZGVJdGVyYXRvciB7Ci0KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGRlbGVnYXRlOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZUl0ZXJhdG9yKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotICAgICAgICBBc3NlcnQubm90TnVsbCgiY29sbGVjdGlvbiIsIGNvbGxlY3Rpb24pOwotICAgICAgICB0aGlzLmRlbGVnYXRlID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbm9kZXMgVGhlIG5vZGVzIHRvIGl0ZXJhdGUgb3Zlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZUl0ZXJhdG9yKFNpdGVOb2RlW10gbm9kZXMpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoIm5vZGVzIiwgbm9kZXMpOwotICAgICAgICB0aGlzLmRlbGVnYXRlID0gQXJyYXlzLmFzTGlzdChub2RlcykuaXRlcmF0b3IoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIHNpdGUgbm9kZS4KLSAgICAgKiBAc2VlIEl0ZXJhdG9yI25leHQoKQotICAgICAqLwotICAgIHB1YmxpYyBTaXRlTm9kZSBuZXh0KCkgewotICAgICAgICByZXR1cm4gKFNpdGVOb2RlKSB0aGlzLmRlbGVnYXRlLm5leHQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHNlZSBJdGVyYXRvciNoYXNOZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5oYXNOZXh0KCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9Ob2RlU2V0LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL05vZGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkMTFjMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL05vZGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51dGlsLkRvY3VtZW50U2V0OwotCi0vKioKLSAqIEEgc2V0IGNvbnRhaW5pbmcgbm9kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlU2V0IHsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZVNldChTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBfbm9kZXMgVGhlIGluaXRpYWwgbm9kZXMuCi0gICAgICovCi0gICAgcHVibGljIE5vZGVTZXQoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgU2l0ZU5vZGVbXSBfbm9kZXMpIHsKLSAgICAgICAgdGhpcyhtYW5hZ2VyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFkZChfbm9kZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnRzIFRoZSBjb3JyZXNwb25kaW5nIGRvY3VtZW50cyB0byBkZXJpdmUgbm9kZXMgZnJvbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZVNldChEb2N1bWVudFNldCBkb2N1bWVudHMpIHsKLSAgICAgICAgRG9jdW1lbnRbXSBkb2NzID0gZG9jdW1lbnRzLmdldERvY3VtZW50cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNpdGVOb2RlIG5vZGU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG5vZGUgPSBkb2NzW2ldLmdldExpbmsoKS5nZXROb2RlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNvbnRhaW5zKG5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgYWRkKG5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5vZGUgQSBub2RlLgotICAgICAqIEByZXR1cm4gSWYgdGhlIG5vZGUgaXMgY29udGFpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFNpdGVOb2RlIG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGdldFNldCgpLmNvbnRhaW5zKG5vZGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU2V0IG5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBkb2N1bWVudHMuCi0gICAgICogQHJldHVybiBBIGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNldCBnZXRTZXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50cyBjb250YWluZWQgaW4gdGhpcyBzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBkb2N1bWVudHMuCi0gICAgICovCi0gICAgcHVibGljIFNpdGVOb2RlW10gZ2V0Tm9kZXMoKSB7Ci0gICAgICAgIHJldHVybiAoU2l0ZU5vZGVbXSkgdGhpcy5ub2Rlcy50b0FycmF5KG5ldyBTaXRlTm9kZVt0aGlzLm5vZGVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBub2RlIHRvIHRoaXMgc2V0LgotICAgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGFkZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoU2l0ZU5vZGUgbm9kZSkgewotICAgICAgICBhc3NlcnQgbm9kZSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgIXRoaXMubm9kZXMuY29udGFpbnMobm9kZSk7Ci0gICAgICAgIHRoaXMubm9kZXMuYWRkKG5vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGlzIHNldCBpcyBlbXB0eS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gZ2V0U2V0KCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBub2RlLgotICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoU2l0ZU5vZGUgcmVzb3VyY2UpIHsKLSAgICAgICAgYXNzZXJ0IHJlc291cmNlICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBnZXRTZXQoKS5jb250YWlucyhyZXNvdXJjZSk7Ci0gICAgICAgIGdldFNldCgpLnJlbW92ZShyZXNvdXJjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbm9kZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGdldFNldCgpLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBbiBpdGVyYXRvciBpdGVyYXRpbmcgaW4gYXNjZW5kaW5nIG9yZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlSXRlcmF0b3IgYXNjZW5kaW5nKCkgewotICAgICAgICBTaXRlTm9kZVtdIG5vZGVzID0gZ2V0Tm9kZXNBc2NlbmRpbmcoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iobm9kZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQW4gaXRlcmF0b3IgaXRlcmF0aW5nIGluIGRlc2NlbmRpbmcgb3JkZXIuCi0gICAgICovCi0gICAgcHVibGljIE5vZGVJdGVyYXRvciBkZXNjZW5kaW5nKCkgewotICAgICAgICBTaXRlTm9kZVtdIG5vZGVzID0gZ2V0Tm9kZXNBc2NlbmRpbmcoKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdChub2Rlcyk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UobGlzdCk7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZUl0ZXJhdG9yKGxpc3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTaXRlTm9kZVtdIGdldE5vZGVzQXNjZW5kaW5nKCkgewotICAgICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNpdGVOb2RlWzBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTaXRlTm9kZVtdIG5vZGVzOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBTaXRlTWFuYWdlciBzaXRlTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIG1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3QoZ2V0Tm9kZXMoKVswXS5nZXRTdHJ1Y3R1cmUoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHVibGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotICAgICAgICAgICAgbm9kZXMgPSBzaXRlTWFuYWdlci5zb3J0QXNjZW5kaW5nKGdldE5vZGVzKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzaXRlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2Uoc2l0ZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub2RlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEFsbCBkb2N1bWVudHMgcmVmZXJlbmNlZCBieSB0aGlzIG5vZGUgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudFtdIGdldERvY3VtZW50cygpIHsKLSAgICAgICAgTGlzdCBkb2N1bWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoTm9kZUl0ZXJhdG9yIGkgPSBhc2NlbmRpbmcoKTsgaS5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nW10gbGFuZ3MgPSBub2RlLmdldExhbmd1YWdlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBsYW5ncy5sZW5ndGg7IGwrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cy5hZGQobm9kZS5nZXRMaW5rKGxhbmdzW2xdKS5nZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRG9jdW1lbnRbXSkgZG9jdW1lbnRzLnRvQXJyYXkobmV3IERvY3VtZW50W2RvY3VtZW50cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFsbCBub2RlcyBmcm9tIGEgbm9kZSBzZXQgdG8gdGhpcy4KLSAgICAgKiBAcGFyYW0gc2V0IFRoZSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQWxsKE5vZGVTZXQgc2V0KSB7Ci0gICAgICAgIHRoaXMubm9kZXMuYWRkQWxsKHNldC5nZXRTZXQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpdGVFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvU2l0ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGFjZmMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvU2l0ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogU2l0ZSBzdHJ1Y3R1cmUgbWFuYWdlbWVudCBleGNlcHRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFNpdGVFeGNlcHRpb24gZXh0ZW5kcyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFNpdGVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIFNpdGVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIFNpdGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpdGVNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpdGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjE2MTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9TaXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotCi0vKioKLSAqIDxwPgotICogQSBzaXRlIHN0cnVjdHVyZSBtYW5hZ2VtZW50IGNvbXBvbmVudC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBBIHNpdGUgbWFuYWdlciBoYXMgYSBkZXBlbmRlbmNlIHJlbGF0aW9uLCB3aGljaCBpcyBhbHdheXMgYXBwbGllZCB0byBkb2N1bWVudHMgb2YgYSBzaW5nbGUKLSAqIGxhbmd1YWdlLiBUaGlzIG1lYW5zIGEgZG9jdW1lbnQgbWF5IG5vdCByZXF1aXJlIGEgZG9jdW1lbnQgb2YgYW5vdGhlciBsYW5ndWFnZS4gRGVwZW5kZW5jZSBvbiBhCi0gKiBzZXQgb2YgcmVzb3VyY2VzIG11c3QgYmUgYSBzdHJpY3QgcGFydGlhbCBvcmRlciA8c3Ryb25nPiZsdDsgPC9zdHJvbmc+OgotICogPC9wPgotICogPHVsPgotICogPGxpPjxlbT5pcnJlZmxleGl2ZTo8L2VtPiBkIDxzdHJvbmc+Jmx0OyA8L3N0cm9uZz5kIGRvZXMgbm90IGhvbGQgZm9yIGFueSByZXNvdXJjZSBkPC9saT4KLSAqIDxsaT48ZW0+YW50aXN5bW1ldHJpYzo8L2VtPiBkIDxzdHJvbmc+Jmx0OyA8L3N0cm9uZz5lIGFuZCBlIDxzdHJvbmc+Jmx0OyA8L3N0cm9uZz5kIGltcGxpZXMKLSAqIGQ9ZTwvbGk+Ci0gKiA8bGk+PGVtPnRyYW5zaXRpdmU6PC9lbT4gZCA8c3Ryb25nPiZsdDsgPC9zdHJvbmc+ZSBhbmQgZSA8c3Ryb25nPiZsdDsgPC9zdHJvbmc+ZiBpbXBsaWVzIGQKLSAqIDxzdHJvbmc+Jmx0OyA8L3N0cm9uZz5mPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBTaXRlTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXZhbG9uIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBTaXRlTWFuYWdlci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSByZXNvdXJjZSByZXF1aXJlcyBhbm90aGVyIG9uZS4KLSAgICAgKiBAcGFyYW0gbWFwIFRoZSBpZGVudGl0eSBtYXAgdG8gb3BlcmF0ZSBvbi4KLSAgICAgKiBAcGFyYW0gZGVwZW5kaW5nUmVzb3VyY2UgVGhlIGRlcGVuZGluZyByZXNvdXJjZS4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZWRSZXNvdXJjZSBUaGUgcmVxdWlyZWQgcmVzb3VyY2UuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBib29sZWFuIHJlcXVpcmVzKERvY3VtZW50RmFjdG9yeSBtYXAsIFNpdGVOb2RlIGRlcGVuZGluZ1Jlc291cmNlLCBTaXRlTm9kZSByZXF1aXJlZFJlc291cmNlKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZXMgd2hpY2ggYXJlIHJlcXVpcmVkIGJ5IGEgY2VydGFpbiByZXNvdXJjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwIFRoZSBpZGVudGl0eSBtYXAgdG8gb3BlcmF0ZSBvbi4KLSAgICAgKiBAcGFyYW0gbG9jYXRvciBUaGUgZGVwZW5kaW5nIGxvY2F0b3IuCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiByZXNvdXJjZXMuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBEb2N1bWVudExvY2F0b3JbXSBnZXRSZXF1aXJlZFJlc291cmNlcyhEb2N1bWVudEZhY3RvcnkgbWFwLCBEb2N1bWVudExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIFNpdGVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZXMgd2hpY2ggcmVxdWlyZSBhIGNlcnRhaW4gcmVzb3VyY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCBUaGUgaWRlbnRpdHkgbWFwIHRvIG9wZXJhdGUgb24uCi0gICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXF1aXJlZCByZXNvdXJjZS4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHJlc291cmNlcy4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIFNpdGVOb2RlW10gZ2V0UmVxdWlyaW5nUmVzb3VyY2VzKERvY3VtZW50RmFjdG9yeSBtYXAsIFNpdGVOb2RlIHJlc291cmNlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb2N1bWVudCB0byB0aGUgc2l0ZSBzdHJ1Y3R1cmUuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGguCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byBhZGQuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyBhbHJlYWR5IGNvbnRhaW5lZC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZChTdHJpbmcgcGF0aCwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBTaXRlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRvY3VtZW50IHRvIHRoZSBzaXRlIHN0cnVjdHVyZS4KLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aC4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIGFkZC4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIGFscmVhZHkgY29udGFpbmVkIG9yIGlmIHRoZSBwYXRoIGRvZXNuJ3QgZXhpc3QuCi0gICAgICovCi0gICAgdm9pZCBzZXQoU3RyaW5nIHBhdGgsIERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgc2l0ZSBzdHJ1Y3R1cmUgY29udGFpbnMgYSBjZXJ0YWluIHJlc291cmNlIGluIGEgY2VydGFpbiBhcmVhLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBib29sZWFuIGNvbnRhaW5zKERvY3VtZW50IHJlc291cmNlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgc2l0ZSBzdHJ1Y3R1cmUgY29udGFpbnMgYW55IGxhbmd1YWdlIHZlcnNpb24gb2YgYSBjZXJ0YWluIHJlc291cmNlIGluIGEgY2VydGFpbgotICAgICAqIGFyZWEuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gY29udGFpbnNJbkFueUxhbmd1YWdlKERvY3VtZW50IHJlc291cmNlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvcGllcyBhIGRvY3VtZW50IGluIHRoZSBzaXRlIHN0cnVjdHVyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlRG9jdW1lbnQgVGhlIHNvdXJjZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Eb2N1bWVudCBUaGUgZGVzdGluYXRpb24gZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgdm9pZCBjb3B5KERvY3VtZW50IHNvdXJjZURvY3VtZW50LCBEb2N1bWVudCBkZXN0aW5hdGlvbkRvY3VtZW50KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbm9kZSBpbiB0aGUgbmF2aWdhdGlvbi4gSXQgaXMgbWVhbnQgdG8gaGlkZSBzcGVjaWZpYyBub2RlcyB3aXRoaW4KLSAgICAgKiB0aGUgInB1YmxpYyIgbmF2aWdhdGlvbiB3aGVyZWFzIHRoZSBub2RlIGlzIHZpc2libGUgd2l0aGluIHRoZSBpbmZvL3NpdGUgYXJlYS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSB2aXNpYmxlSW5OYXYgVGhlIHZpc2liaWxpdHkuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIHNldFZpc2libGVJbk5hdihEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiB2aXNpYmxlSW5OYXYpIHRocm93cyBTaXRlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5vZGUgaW4gdGhlIG5hdmlnYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWaXNpYmxlSW5OYXYoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBTaXRlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgZG9jdW1lbnRzIGluIGEgY2VydGFpbiBhcmVhLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZGVudGl0eU1hcCBUaGUgaWRlbnRpdHlNYXAgdG8gdXNlLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBkb2N1bWVudHMuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBEb2N1bWVudFtdIGdldERvY3VtZW50cyhEb2N1bWVudEZhY3RvcnkgaWRlbnRpdHlNYXAsIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTdHJpbmcgYXJlYSkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU29ydHMgYSBzZXQgb2Ygbm9kZXMgdXNpbmcgdGhlICJyZXF1aXJlcyIgcmVsYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGVzIFRoZSBzZXQuCi0gICAgICogQHJldHVybiBBIHNvcnRlZCBhcnJheSBvZiBub2Rlcy4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIFNpdGVOb2RlW10gc29ydEFzY2VuZGluZyhTaXRlTm9kZVtdIG5vZGVzKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtYXAgVGhlIGlkZW50aXR5IG1hcC4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBzaXRlIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIFNpdGVTdHJ1Y3R1cmUgZ2V0U2l0ZVN0cnVjdHVyZShEb2N1bWVudEZhY3RvcnkgbWFwLCBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgZG9jdW1lbnQgZG9lcyBhbHJlYWR5IGV4aXN0LiBJZiBpdCBkb2VzLCByZXR1cm5zIGEgbm9uLWV4aXN0aW5nIGRvY3VtZW50IHdpdGggYQotICAgICAqIHNpbWlsYXIgZG9jdW1lbnQgSUQuIElmIGl0IGRvZXMgbm90LCB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgaXMgcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICogQHBhcmFtIGxvY2F0b3IgVGhlIGxvY2F0b3IuCi0gICAgICogQHJldHVybiBBIGxvY2F0b3IuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIHRoZSBuZXcgZG9jdW1lbnQgY291bGQgbm90IGJlIGJ1aWx0LgotICAgICAqLwotICAgIERvY3VtZW50TG9jYXRvciBnZXRBdmFpbGFibGVMb2NhdG9yKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBEb2N1bWVudExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIFNpdGVFeGNlcHRpb247Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpdGVOb2RlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpdGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOTkzNmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9TaXRlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlOwotCi0vKioKLSAqIEEgbm9kZSBpbiB0aGUgc2l0ZSBzdHJ1Y3R1cmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2l0ZU5vZGUgewotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHNpdGUgc3RydWN0dXJlIHRoaXMgbm9kZSBiZWxvbmdzIHRvLgotICAgICAqLwotICAgIFNpdGVTdHJ1Y3R1cmUgZ2V0U3RydWN0dXJlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBwYXRoLgotICAgICAqLwotICAgIFN0cmluZyBnZXRQYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBwYXJlbnQgbm9kZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gSWYgdGhlIG5vZGUgaGFzIG5vIHBhcmVudC4KLSAgICAgKi8KLSAgICBTaXRlTm9kZSBnZXRQYXJlbnQoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIElmIHRoaXMgaXMgYSB0b3AgbGV2ZWwgbm9kZS4gVG9wIGxldmVsIG5vZGVzIGhhdmUgbm8gcGFyZW50cy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzVG9wTGV2ZWwoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBsYW5ndWFnZXMgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldExhbmd1YWdlcygpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBUaGUgbGluayBmb3IgdGhlIGxhbmd1YWdlLgotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiBpZiBubyBsaW5rIGlzIGNvbnRhaW5lZCBmb3IgdGhlIGxhbmd1YWdlLgotICAgICAqLwotICAgIExpbmsgZ2V0TGluayhTdHJpbmcgbGFuZ3VhZ2UpIHRocm93cyBTaXRlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgVVVJRCBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFV1aWQoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIGxpbmsgZm9yIGEgY2VydGFpbiBsYW5ndWFnZSBpcyBjb250YWluZWQuCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0xpbmsoU3RyaW5nIGxhbmd1YWdlKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUsIGkuZS4gdGhlIGxhc3QgcGF0aCBlbGVtZW50LgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIGluIHRoZSBuYXZpZ2F0aW9uLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWaXNpYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBub2RlIHZpc2liaWxpdHkgaW4gdGhlIG5hdmlnYXRpb24uCi0gICAgICogQHBhcmFtIHZpc2libGVJbk5hdiBpZiB0aGUgbm9kZSBzaG91bGQgYmUgdmlzaWJsZS4KLSAgICAgKi8KLSAgICB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlSW5OYXYpOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgdm9pZCBkZWxldGUoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBTaXRlTm9kZVtdIGdldENoaWxkcmVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBub2RlIGhhcyBhbiBleHRlcm5hbCBsaW5rLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzTGluaygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZXh0ZXJuYWwgbGluay4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SHJlZigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgc3VmZml4LgotICAgICAqLwotICAgIFN0cmluZyBnZXRTdWZmaXgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9TaXRlU3RydWN0dXJlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpdGVTdHJ1Y3R1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkMTcwMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpdGVTdHJ1Y3R1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtOwotCi0vKioKLSAqIE9iamVjdCB0byBob2xkIGEgc2l0ZSBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBTaXRlU3RydWN0dXJlIGV4dGVuZHMgUmVwb3NpdG9yeUl0ZW0gewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcmVwb3NpdG9yeSBub2RlIHRoZSBzaXRlIHN0cnVjdHVyZSBpcyBzdG9yZWQgaW4uCi0gICAgICovCi0gICAgTm9kZSBnZXRSZXBvc2l0b3J5Tm9kZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcHVibGljYXRpb24uCi0gICAgICovCi0gICAgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFyZWEuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEFyZWEoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWxsIG5vZGVzIGluIHRoaXMgc3RydWN0dXJlLgotICAgICAqLwotICAgIFNpdGVOb2RlW10gZ2V0Tm9kZXMoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoLgotICAgICAqIEByZXR1cm4gQSBzaXRlIG5vZGUuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIG5vIG5vZGUgaXMgY29udGFpbmVkIGZvciB0aGUgcGF0aC4KLSAgICAgKi8KLSAgICBTaXRlTm9kZSBnZXROb2RlKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIG5vZGUgaXMgY29udGFpbmVkIGZvciBhIGNlcnRhaW4gcGF0aC4KLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBwYXRoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIGxpbmsgaXMgY29udGFpbmVkIGZvciBhIGNlcnRhaW4gcGF0aCBhbmQgbGFuZ3VhZ2UuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGguCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBwYXRoLCBTdHJpbmcgbGFuZ3VhZ2UpOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBzdHJ1Y3R1cmUgY29udGFpbnMgYSBsaW5rIHdpdGggYSBjZXJ0YWluIFVVSUQgYW5kIGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBVVUlELgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBjb250YWluc0J5VXVpZChTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgc3RydWN0dXJlIGNvbnRhaW5zIGFueSBsYW5ndWFnZSB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHV1aWQgVGhlIHV1aWQuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBjb250YWluc0luQW55TGFuZ3VhZ2UoU3RyaW5nIHV1aWQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5vZGUgZm9yIGEgY2VydGFpbiBVVUlELgotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBVVUlELgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHJldHVybiBhIGxpbmsuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIG5vIG5vZGUgaXMgY29udGFpbmVkIGZvciB0aGUgVVVJRC4KLSAgICAgKi8KLSAgICBMaW5rIGdldEJ5VXVpZChTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsaW5rIHRvIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGguCi0gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBIGxpbmsuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyBhbHJlYWR5IGNvbnRhaW5lZCBvciB0aGUgbm9kZQotICAgICAqICAgICAgICAgZm9yIHRoaXMgcGF0aCBhbHJlYWR5IGNvbnRhaW5zIGEgbGluayBmb3IgdGhpcyBsYW5ndWFnZS4KLSAgICAgKi8KLSAgICBMaW5rIGFkZChTdHJpbmcgcGF0aCwgRG9jdW1lbnQgZG9jKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzaXRlIG5vZGUuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGguCi0gICAgICogQHJldHVybiBBIHNpdGUgbm9kZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgdGhlIHBhdGggaXMgYWxyZWFkeSBjb250YWluZWQuCi0gICAgICovCi0gICAgU2l0ZU5vZGUgYWRkKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzaXRlIG5vZGUgYmVmb3JlIGEgc3BlY2lmaWMgb3RoZXIgbm9kZS4KLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aC4KLSAgICAgKiBAcGFyYW0gZm9sbG93aW5nU2libGluZ1BhdGggVGhlIHBhdGggb2YgdGhlIG5vZGUgd2hpY2ggd2lsbCBiZSB0aGUKLSAgICAgKiAgICAgICAgZm9sbG93aW5nIHNpYmxpbmcgb2YgdGhlIG5vZGUgdG8gaW5zZXJ0LgotICAgICAqIEByZXR1cm4gQSBzaXRlIG5vZGUuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIHRoZSBwYXRoIGlzIGFscmVhZHkgY29udGFpbmVkLgotICAgICAqLwotICAgIFNpdGVOb2RlIGFkZChTdHJpbmcgcGF0aCwgU3RyaW5nIGZvbGxvd2luZ1NpYmxpbmdQYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB0b3AgbGV2ZWwgbm9kZXMuCi0gICAgICovCi0gICAgU2l0ZU5vZGVbXSBnZXRUb3BMZXZlbE5vZGVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvU2l0ZVV0aWwuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvU2l0ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5ZWRhMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL1NpdGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci0KLS8qKgotICogVXRpbGl0eSB0byBoYW5kbGUgc2l0ZSBzdHJ1Y3R1cmVzLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlVXRpbCB7Ci0KLSAgICBwcml2YXRlIFNpdGVVdGlsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdWItc2l0ZSBzdGFydGluZyB3aXRoIGEgY2VydGFpbiBub2RlLCB3aGljaCBpbmNsdWRlcyB0aGUgbm9kZQotICAgICAqIGl0c2VsZiBhbmQgYWxsIG5vZGVzIHdoaWNoIHJlcXVpcmUgdGhpcyBub2RlLCBpbiBwcmVvcmRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBub2RlIFRoZSB0b3AtbGV2ZWwgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50IHNldC4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTm9kZVNldCBnZXRTdWJTaXRlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFNpdGVOb2RlIG5vZGUpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgU2l0ZU1hbmFnZXIgc2l0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICBTaXRlTm9kZVtdIHN1YnNpdGU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIG1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3Qobm9kZS5nZXRTdHJ1Y3R1cmUoKS5nZXRQdWJsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTaXRlTWFuYWdlckhpbnQoKSk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBub2RlLmdldFN0cnVjdHVyZSgpLmdldFB1YmxpY2F0aW9uKCkuZ2V0RmFjdG9yeSgpOwotICAgICAgICAgICAgU2V0IG5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIG5vZGVzLmFkZChub2RlKTsKLQotICAgICAgICAgICAgU2l0ZU5vZGVbXSByZXF1aXJpbmdOb2RlcyA9IHNpdGVNYW5hZ2VyLmdldFJlcXVpcmluZ1Jlc291cmNlcyhtYXAsIG5vZGUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJpbmdOb2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG5vZGVzLmFkZChyZXF1aXJpbmdOb2Rlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN1YnNpdGUgPSAoU2l0ZU5vZGVbXSkgbm9kZXMudG9BcnJheShuZXcgU2l0ZU5vZGVbbm9kZXMuc2l6ZSgpXSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShzaXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2V0KG1hbmFnZXIsIHN1YnNpdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNnZXRBdmFpbGFibGVMb2NhdG9yKERvY3VtZW50RmFjdG9yeSwKLSAgICAgKiAgICAgIERvY3VtZW50TG9jYXRvcikKLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5LgotICAgICAqIEBwYXJhbSBsb2NhdG9yIFRoZSBsb2NhdG9yLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnRMb2NhdG9yIGdldEF2YWlsYWJsZUxvY2F0b3IoU2VydmljZU1hbmFnZXIgbWFuYWdlciwKLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBEb2N1bWVudExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBTaXRlTWFuYWdlciBzaXRlTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIG1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24obG9jYXRvci5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICAgICAgc2l0ZU1hbmFnZXIgPSAoU2l0ZU1hbmFnZXIpIHNlbGVjdG9yLnNlbGVjdChwdWIuZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotICAgICAgICAgICAgcmV0dXJuIHNpdGVNYW5hZ2VyLmdldEF2YWlsYWJsZUxvY2F0b3IoZmFjdG9yeSwgbG9jYXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShzaXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RvcGljbWFwL1RvcGljTWFwU2l0ZU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdG9waWNtYXAvVG9waWNNYXBTaXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmVkOGRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdG9waWNtYXAvVG9waWNNYXBTaXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRvcGljbWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkFic3RyYWN0U2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotCi0vKioKLSAqIFNpdGUgbWFuYWdlciB0byBzdXBwb3J0IHRvcGljIG1hcHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb3BpY01hcFNpdGVNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RTaXRlTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXIjcmVxdWlyZXMob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZSwgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlcyhEb2N1bWVudEZhY3RvcnkgbWFwLCBTaXRlTm9kZSBkZXBlbmRpbmdSZXNvdXJjZSwKLSAgICAgICAgICAgIFNpdGVOb2RlIHJlcXVpcmVkUmVzb3VyY2UpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2dldFJlcXVpcmluZ1Jlc291cmNlcyhvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3RvcnksCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlKQotICAgICAqLwotICAgIHB1YmxpYyBTaXRlTm9kZVtdIGdldFJlcXVpcmluZ1Jlc291cmNlcyhEb2N1bWVudEZhY3RvcnkgbWFwLCBTaXRlTm9kZSByZXNvdXJjZSkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXIjYWRkKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgcGF0aCwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2NvbnRhaW5zKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKERvY3VtZW50IHJlc291cmNlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNjb250YWluc0luQW55TGFuZ3VhZ2Uob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbkFueUxhbmd1YWdlKERvY3VtZW50IHJlc291cmNlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNjb3B5KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weShEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgRG9jdW1lbnQgZGVzdGluYXRpb25Eb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXIjc2V0VmlzaWJsZUluTmF2KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50LAotICAgICAqICAgICAgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlSW5OYXYoRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gdmlzaWJsZUluTmF2KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2dldERvY3VtZW50cyhvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3RvcnksCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiwgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRbXSBnZXREb2N1bWVudHMoRG9jdW1lbnRGYWN0b3J5IG1hcCwgUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBhcmVhKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNnZXRTaXRlU3RydWN0dXJlKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeSwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTaXRlU3RydWN0dXJlIGdldFNpdGVTdHJ1Y3R1cmUoRG9jdW1lbnRGYWN0b3J5IG1hcCwgUHVibGljYXRpb24gcHVibGlhdGlvbiwgU3RyaW5nIGFyZWEpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2dldEF2YWlsYWJsZURvY3VtZW50KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50KQotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0QXZhaWxhYmxlTG9jYXRvcihEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgRG9jdW1lbnRMb2NhdG9yIGRvY3VtZW50KQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlSW5OYXYoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBwYXRoLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50TG9jYXRvcltdIGdldFJlcXVpcmVkUmVzb3VyY2VzKERvY3VtZW50RmFjdG9yeSBtYXAsIERvY3VtZW50TG9jYXRvciBsb2NhdG9yKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50TG9jYXRvclswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlKFNpdGVOb2RlIHNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBbIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiXSEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGxhYmVsKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L0RvY3VtZW50V29ya2Zsb3dhYmxlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy9Eb2N1bWVudFdvcmtmbG93YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGNmNjhkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L0RvY3VtZW50V29ya2Zsb3dhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93OwotCi1pbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5RXZlbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGU7Ci0KLS8qKgotICogV29ya2Zsb3dhYmxlIGFyb3VuZCBhIENNUyBkb2N1bWVudC4KLSAqIAotICogQHZlcnNpb24gJElkOiBEb2N1bWVudFdvcmtmbG93YWJsZS5qYXZhIDQxNjY0OCAyMDA2LTA2LTIzIDA5OjE1OjI4WiBhbmRyZWFzICQKLSAqLwotY2xhc3MgRG9jdW1lbnRXb3JrZmxvd2FibGUgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBXb3JrZmxvd2FibGUgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSByZXBvc2l0b3J5IHNlc3Npb24uCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50V29ya2Zsb3dhYmxlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFNlc3Npb24gc2Vzc2lvbiwgRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKHRoaXMsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXNzaW9uIHNlc3Npb247Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VNYW5hZ2VyIGdldFNlcnZpY2VNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJlcG9zaXRvcnkgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERvY3VtZW50IGRvY3VtZW50OwotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldERvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdyBzY2hlbWEuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXb3JrZmxvd1NjaGVtYSgpIHsKLSAgICAgICAgU3RyaW5nIHdvcmtmbG93TmFtZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZXNvdXJjZVR5cGUgZG9jdHlwZSA9IGRvY3VtZW50LmdldFJlc291cmNlVHlwZSgpOwotICAgICAgICAgICAgaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSA9IGRvY3VtZW50LmdldFB1YmxpY2F0aW9uKCkuZ2V0V29ya2Zsb3dTY2hlbWEoZG9jdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd29ya2Zsb3dOYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgVmVyc2lvbltdIHZlcnNpb25zID0gbnVsbDsKLQotICAgIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQgPSAwOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL3dvcmtmbG93LzEuMCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfVkVSU0lPTiA9ICJ3b3JrZmxvd1ZlcnNpb24iOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZSNnZXRWZXJzaW9ucygpCi0gICAgICovCi0gICAgcHVibGljIFZlcnNpb25bXSBnZXRWZXJzaW9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGFEYXRhIG1ldGEgPSB0aGlzLmRvY3VtZW50LmdldE1ldGFEYXRhKE1FVEFEQVRBX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICBpZiAodGhpcy52ZXJzaW9ucyA9PSBudWxsIHx8IG1ldGEuZ2V0TGFzdE1vZGlmaWVkKCkgPiB0aGlzLmxhc3RNb2RpZmllZCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZlcnNpb25TdHJpbmdzID0gbWV0YS5nZXRWYWx1ZXMoTUVUQURBVEFfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgdGhpcy52ZXJzaW9ucyA9IG5ldyBWZXJzaW9uW3ZlcnNpb25TdHJpbmdzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU29ydGVkTWFwIG51bWJlcjJ2ZXJzaW9uID0gbmV3IFRyZWVNYXAoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25TdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHJpbmcgPSB2ZXJzaW9uU3RyaW5nc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNwYWNlSW5kZXggPSBzdHJpbmcuaW5kZXhPZigiICIpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnVtYmVyU3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBzcGFjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciA9IEludGVnZXIucGFyc2VJbnQobnVtYmVyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHNwYWNlSW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gZGVjb2RlVmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgbnVtYmVyMnZlcnNpb24ucHV0KG5ldyBJbnRlZ2VyKG51bWJlciksIHZlcnNpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpbnQgbnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBudW1iZXIydmVyc2lvbi5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiA9IChWZXJzaW9uKSBudW1iZXIydmVyc2lvbi5nZXQoaS5uZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb25zW251bWJlcl0gPSB2ZXJzaW9uOwotICAgICAgICAgICAgICAgICAgICBudW1iZXIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhpcy5sYXN0TW9kaWZpZWQgPSBtZXRhLmdldExhc3RNb2RpZmllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZSNnZXRMYXRlc3RWZXJzaW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgVmVyc2lvbiBnZXRMYXRlc3RWZXJzaW9uKCkgewotICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBudWxsOwotICAgICAgICBWZXJzaW9uW10gdmVyc2lvbnMgPSBnZXRWZXJzaW9ucygpOwotICAgICAgICBpZiAodmVyc2lvbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25zW3ZlcnNpb25zLmxlbmd0aCAtIDFdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGUjbmV3VmVyc2lvbihvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5ld1ZlcnNpb24oV29ya2Zsb3cgd29ya2Zsb3csIFZlcnNpb24gdmVyc2lvbikgewotICAgICAgICBWZXJzaW9uW10gbmV3VmVyc2lvbnMgPSBuZXcgVmVyc2lvbltnZXRWZXJzaW9ucygpLmxlbmd0aCArIDFdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldFZlcnNpb25zKCkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG5ld1ZlcnNpb25zW2ldID0gZ2V0VmVyc2lvbnMoKVtpXTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBudW1iZXIgPSBuZXdWZXJzaW9ucy5sZW5ndGggLSAxOwotICAgICAgICBuZXdWZXJzaW9uc1tudW1iZXJdID0gdmVyc2lvbjsKLQotICAgICAgICBTdHJpbmcgc3RyaW5nID0gbnVtYmVyICsgIiAiICsgZW5jb2RlVmVyc2lvbih3b3JrZmxvdywgdmVyc2lvbik7Ci0gICAgICAgIGFkZFRvTWV0YURhdGEoc3RyaW5nKTsKLSAgICAgICAgCi0gICAgICAgIFdvcmtmbG93RXZlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgV29ya2Zsb3dFdmVudERlc2NyaXB0b3IodmVyc2lvbik7Ci0gICAgICAgIFJlcG9zaXRvcnlFdmVudCBldmVudCA9IFJlcG9zaXRvcnlFdmVudEZhY3RvcnkuY3JlYXRlRXZlbnQoCi0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLCBnZXREb2N1bWVudCgpLCBnZXRMb2dnZXIoKSwgZGVzY3JpcHRvcik7Ci0gICAgICAgIGdldERvY3VtZW50KCkuZ2V0UmVwb3NpdG9yeU5vZGUoKS5nZXRTZXNzaW9uKCkuZW5xdWV1ZUV2ZW50KGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb01ldGFEYXRhKFN0cmluZyB2ZXJzaW9uU3RyaW5nKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmVhcyA9IGdldERvY3VtZW50KCkuZ2V0UHVibGljYXRpb24oKS5nZXRBcmVhTmFtZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJlYXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS5leGlzdHNBcmVhVmVyc2lvbihhcmVhc1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKS5nZXRBcmVhVmVyc2lvbihhcmVhc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhIG1ldGEgPSBkb2MuZ2V0TWV0YURhdGEoTUVUQURBVEFfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5hZGRWYWx1ZShNRVRBREFUQV9WRVJTSU9OLCB2ZXJzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZW5jb2RlVmVyc2lvbihXb3JrZmxvdyB3b3JrZmxvdywgVmVyc2lvbiB2ZXJzaW9uKSB7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoImV2ZW50OiIpLmFwcGVuZCh2ZXJzaW9uLmdldEV2ZW50KCkpOwotICAgICAgICBzdHJpbmdCdWYuYXBwZW5kKCIgc3RhdGU6IikuYXBwZW5kKHZlcnNpb24uZ2V0U3RhdGUoKSk7Ci0KLSAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSBnZXRTZXNzaW9uKCkuZ2V0SWRlbnRpdHkoKTsKLSAgICAgICAgVXNlciB1c2VyID0gaWRlbnRpdHkuZ2V0VXNlcigpOwotICAgICAgICBpZiAodXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdHJpbmdCdWYuYXBwZW5kKCIgdXNlcjoiKS5hcHBlbmQoaWRlbnRpdHkuZ2V0VXNlcigpLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZ0J1Zi5hcHBlbmQoIiBtYWNoaW5lOiIpLmFwcGVuZChpZGVudGl0eS5nZXRNYWNoaW5lKCkuZ2V0SXAoKSk7Ci0KLSAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZF9ISDptbTpzcyIpOwotICAgICAgICBzdHJpbmdCdWYuYXBwZW5kKCIgZGF0ZToiKS5hcHBlbmQoZm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKSk7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWVzW10gPSB3b3JrZmxvdy5nZXRWYXJpYWJsZU5hbWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IEJvb2xlYW4udG9TdHJpbmcodmVyc2lvbi5nZXRWYWx1ZShuYW1lc1tpXSkpOwotICAgICAgICAgICAgc3RyaW5nQnVmLmFwcGVuZCgiIHZhcjoiKS5hcHBlbmQobmFtZXNbaV0pOwotICAgICAgICAgICAgc3RyaW5nQnVmLmFwcGVuZCgiPSIpLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZ0J1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBWZXJzaW9uIGRlY29kZVZlcnNpb24oU3RyaW5nIHN0cmluZykgewotCi0gICAgICAgIFN0cmluZyBldmVudCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzdGF0ZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB1c2VyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1hY2hpbmUgPSBudWxsOwotICAgICAgICBEYXRlIGRhdGUgPSBudWxsOwotICAgICAgICBNYXAgdmFyaWFibGVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IHN0cmluZy5zcGxpdCgiICIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdGVwcyA9IHBhcnRzW2ldLnNwbGl0KCI6IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RlcHNbMF0uZXF1YWxzKCJldmVudCIpKSB7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBzdGVwc1sxXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcHNbMF0uZXF1YWxzKCJzdGF0ZSIpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzdGVwc1sxXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcHNbMF0uZXF1YWxzKCJ1c2VyIikpIHsKLSAgICAgICAgICAgICAgICB1c2VyID0gc3RlcHNbMV07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZXBzWzBdLmVxdWFscygiZGF0ZSIpKSB7Ci0gICAgICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZF9ISDptbTpzcyIsIExvY2FsZS5VUyk7Ci0gICAgICAgICAgICAgICAgZGF0ZSA9IHNkZi5wYXJzZShzdGVwc1sxXSwgbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGVwc1swXS5lcXVhbHMoIm1hY2hpbmUiKSkgewotICAgICAgICAgICAgICAgIG1hY2hpbmUgPSBzdGVwc1sxXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcHNbMF0uZXF1YWxzKCJ2YXIiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVWYWx1ZSA9IHN0ZXBzWzFdLnNwbGl0KCI9Iik7Ci0gICAgICAgICAgICAgICAgdmFyaWFibGVzLnB1dChuYW1lVmFsdWVbMF0sIG5hbWVWYWx1ZVsxXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBuZXcgTGVueWFWZXJzaW9uKGV2ZW50LCBzdGF0ZSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHZhcmlhYmxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSB2YXJpYWJsZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgdmVyc2lvbi5zZXRVc2VySWQodXNlcik7Ci0gICAgICAgICAgICB2ZXJzaW9uLnNldERhdGUoZGF0ZSk7Ci0gICAgICAgICAgICB2ZXJzaW9uLnNldElQQWRkcmVzcyhtYWNoaW5lKTsKLSAgICAgICAgICAgIHZlcnNpb24uc2V0VmFsdWUobmFtZSwgQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZSNnZXRXb3JrZmxvd1NjaGVtYVVSSSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXb3JrZmxvd1NjaGVtYVVSSSgpIHsKLSAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPSBnZXRXb3JrZmxvd1NjaGVtYSgpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKHNjaGVtYS5pbmRleE9mKCI6Ly8iKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzY2hlbWE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVyaSA9IHRoaXMuZG9jdW1lbnQuZ2V0UHVibGljYXRpb24oKS5nZXRTb3VyY2VVUkkoKSArICIvY29uZmlnL3dvcmtmbG93LyIgKyBzY2hlbWE7Ci0gICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZygibGVueWE6Ly8iLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB1cmkgPSAiY29udGV4dDovLyIgKyB1cmk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvTGVueWFWZXJzaW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy9MZW55YVZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5YjliYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy9MZW55YVZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkOiBWZXJzaW9uSW1wbC5qYXZhIDM3MjU2OCAyMDA2LTAxLTI2IDE2OjUxOjM4WiBhbmRyZWFzICQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotCi0vKioKLSAqIEEgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3cgaGlzdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIExlbnlhVmVyc2lvbiBpbXBsZW1lbnRzIFZlcnNpb24gewotCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXZlbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaXBBZGRyZXNzOwotICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJJZDsKLSAgICBwcml2YXRlIE1hcCB2YXJpYWJsZVZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlZlcnNpb24jZ2V0RXZlbnQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV2ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uI2dldFN0YXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGF0ZS4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBEYXRlIGdldERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRGF0ZSl0aGlzLmRhdGUuY2xvbmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRlLgotICAgICAqIEBwYXJhbSBfZGF0ZSBBIGRhdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZShEYXRlIF9kYXRlKSB7Ci0gICAgICAgIHRoaXMuZGF0ZSA9IChEYXRlKV9kYXRlLmNsb25lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXNlciBJRC4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcklkKCkgewotICAgICAgICByZXR1cm4gdGhpcy51c2VySWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdXNlciBJRC4KLSAgICAgKiBAcGFyYW0gX3VzZXJJZCBBIHVzZXIgSUQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcklkKFN0cmluZyBfdXNlcklkKSB7Ci0gICAgICAgIHRoaXMudXNlcklkID0gX3VzZXJJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpcCBhZGRyZXNzLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJUEFkZHJlc3MoKSB7Ci0gICAgCXJldHVybiB0aGlzLmlwQWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpcCBhZGRyZXNzLgotICAgICAqIEBwYXJhbSBfaXBhZGRyZXNzIEEgaXAgYWRkcmVzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJUEFkZHJlc3MoU3RyaW5nIF9pcGFkZHJlc3MpewotICAgIAl0aGlzLmlwQWRkcmVzcyA9IF9pcGFkZHJlc3M7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIF9ldmVudCBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhlIHZlcnNpb24gY2hhbmdlLgotICAgICAqIEBwYXJhbSBfc3RhdGUgVGhlIGRlc3RpbmF0aW9uIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyBMZW55YVZlcnNpb24oU3RyaW5nIF9ldmVudCwgU3RyaW5nIF9zdGF0ZSkgewotICAgICAgICB0aGlzLmV2ZW50ID0gX2V2ZW50OwotICAgICAgICB0aGlzLnN0YXRlID0gX3N0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uI2dldFZhbHVlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoU3RyaW5nIHZhcmlhYmxlTmFtZSkgewotICAgICAgICBCb29sZWFuIHZhbHVlID0gKEJvb2xlYW4pIHRoaXMudmFyaWFibGVWYWx1ZXMuZ2V0KHZhcmlhYmxlTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gdmFsdWUgc2V0IGZvciB2YXJpYWJsZSBbIiArIHZhcmlhYmxlTmFtZSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uI3NldFZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhcmlhYmxlTmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVzLnB1dCh2YXJpYWJsZU5hbWUsIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvUm9sZUNvbmRpdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvUm9sZUNvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjE4YmI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L1JvbGVDb25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dhYmxlOwotCi0vKioKLSAqIFJvbGUgY29uZGl0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlQ29uZGl0aW9uIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKLQotICAgIHByaXZhdGUgU2V0IHJvbGVJZHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIiwiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LkNvbmRpdGlvbiNzZXRFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQotICAgICAgICBTdHJpbmdbXSByb2xlcyA9IGV4cHJlc3Npb24uc3BsaXQoU0VQQVJBVE9SKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdGhpcy5yb2xlSWRzLmFkZChyb2xlc1tpXS50cmltKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgY29uZGl0aW9uIGlzIGNvbXBsaWVkIGluIGEgY2VydGFpbiBzaXR1YXRpb24uIFRoZQotICAgICAqIGNvbmRpdGlvbiBpcyBjb21wbGllZCB3aGVuIHRoZSBjdXJyZW50IHVzZXIgaGFzIHRoZSByb2xlIHRoYXQgaXMgcmVxdWlyZWQKLSAgICAgKiBieSB0aGUgUm9sZUNvbmRpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuaW1wbC5BYnN0cmFjdENvbmRpdGlvbiNpc0NvbXBsaWVkKFdvcmtmbG93LAotICAgICAqICAgICAgV29ya2Zsb3dhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxpZWQoV29ya2Zsb3cgd29ya2Zsb3csIFdvcmtmbG93YWJsZSBpbnN0YW5jZSkgewotCi0gICAgICAgIERvY3VtZW50V29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSA9IChEb2N1bWVudFdvcmtmbG93YWJsZSkgaW5zdGFuY2U7Ci0gICAgICAgIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIgPSB3b3JrZmxvd2FibGUuZ2V0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgU3RyaW5nIHVybCA9IHdvcmtmbG93YWJsZS5nZXREb2N1bWVudCgpLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpOwotCi0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciBhY1Jlc29sdmVyID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlciBhY2Nlc3NDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSBtYW5hZ2VyLmxvb2t1cChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgYWNSZXNvbHZlciA9IChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIpIHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLkRFRkFVTFRfUkVTT0xWRVIpOwotICAgICAgICAgICAgYWNjZXNzQ29udHJvbGxlciA9IGFjUmVzb2x2ZXIucmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIodXJsKTsKLQotICAgICAgICAgICAgUG9saWN5TWFuYWdlciBwb2xpY3lNYW5hZ2VyID0gYWNjZXNzQ29udHJvbGxlci5nZXRQb2xpY3lNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IHdvcmtmbG93YWJsZS5nZXRTZXNzaW9uKCkuZ2V0SWRlbnRpdHkoKTsKLSAgICAgICAgICAgIEFjY3JlZGl0YWJsZU1hbmFnZXIgYWNjcmVkaXRhYmxlTWdyID0gYWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKTsKLSAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBwb2xpY3lNYW5hZ2VyLmdldFBvbGljeShhY2NyZWRpdGFibGVNZ3IsIHVybCk7Ci0gICAgICAgICAgICBSb2xlTWFuYWdlciByb2xlTWFuYWdlciA9IGFjY3JlZGl0YWJsZU1nci5nZXRSb2xlTWFuYWdlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIGNvbXBsaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMucm9sZUlkcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJvbGVJZCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFJvbGUgcm9sZSA9IHJvbGVNYW5hZ2VyLmdldFJvbGUocm9sZUlkKTsKLSAgICAgICAgICAgICAgICBpZiAocG9saWN5LmNoZWNrKGlkZW50aXR5LCByb2xlKSA9PSBQb2xpY3kuUkVTVUxUX0dSQU5URUQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGxpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNvbXBsaWVkOwotCi0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY1Jlc29sdmVyLnJlbGVhc2UoYWNjZXNzQ29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShhY1Jlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBjb25kaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvV29ya2Zsb3dFdmVudERlc2NyaXB0b3IuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L1dvcmtmbG93RXZlbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmU3YjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvV29ya2Zsb3dFdmVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdzsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotCi0vKioKLSAqIERlc2NyaXB0b3IgZm9yIHdvcmtmbG93IGV2ZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtmbG93RXZlbnREZXNjcmlwdG9yIHsKLQotICAgIHByaXZhdGUgVmVyc2lvbiB2ZXJzaW9uOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24uCi0gICAgICovCi0gICAgcHVibGljIFdvcmtmbG93RXZlbnREZXNjcmlwdG9yKFZlcnNpb24gdmVyc2lvbikgewotICAgICAgICBBc3NlcnQubm90TnVsbCgidmVyc2lvbiIsIHZlcnNpb24pOwotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvV29ya2Zsb3dVdGlsLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy9Xb3JrZmxvd1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3MWYxZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy9Xb3JrZmxvd1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnV0aWwuRG9jdW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB3b3JrZmxvdyB0YXNrcy4KLSAqIAotICogQHZlcnNpb24gJElkOiQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtmbG93VXRpbCB7Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIGEgd29ya2Zsb3cgZXZlbnQgb24gYSBkb2N1bWVudC4gVGhpcyBpcyB0aGUgc2FtZSBhcwotICAgICAqIDxjb2RlPmludm9rZShEb2N1bWVudCwgU3RyaW5nLCB0cnVlKTwvY29kZT4uCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgcmVwb3NpdG9yeSBzZXNzaW9uLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiBpZiB0aGUgZXZlbnQgY291bGQgbm90IGJlIGludm9rZWQgaW4gdGhlIGN1cnJlbnQgc2l0dWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2UoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgU2Vzc2lvbiBzZXNzaW9uLCBMb2dnZXIgbG9nZ2VyLAotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBldmVudCkgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIHsKLSAgICAgICAgV29ya2Zsb3dNYW5hZ2VyIHdmTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3Zk1hbmFnZXIgPSAoV29ya2Zsb3dNYW5hZ2VyKSBtYW5hZ2VyLmxvb2t1cChXb3JrZmxvd01hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBXb3JrZmxvd2FibGUgd29ya2Zsb3dhYmxlID0gZ2V0V29ya2Zsb3dhYmxlKG1hbmFnZXIsIHNlc3Npb24sIGxvZ2dlciwgZG9jdW1lbnQpOwotICAgICAgICAgICAgd2ZNYW5hZ2VyLmludm9rZSh3b3JrZmxvd2FibGUsIGV2ZW50KTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAod2ZNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2Uod2ZNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyBhIHdvcmtmbG93IGV2ZW50IG9uIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgcmVwb3NpdG9yeSBzZXNzaW9uLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuCi0gICAgICogQHBhcmFtIGZvcmNlIElmIHRoaXMgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgZXhlY3V0aW9uIGlzIGZvcmNlZCwgd2hpY2ggbWVhbnMgYW4KLSAgICAgKiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIHdvcmtmbG93YWJsZSBpbiB0aGUgc2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGV2ZW50LiBJZgotICAgICAqICAgICAgICAgICAgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgbm9uLXN1cHBvcnRpbmcgZG9jdW1lbnRzIGFyZSBpZ25vcmVkLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgdGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBpbnZva2VkIGluIHRoZSBjdXJyZW50IHNpdHVhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFNlc3Npb24gc2Vzc2lvbiwgTG9nZ2VyIGxvZ2dlciwKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZXZlbnQsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdvcmtmbG93TWFuYWdlciB3Zk1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2ZNYW5hZ2VyID0gKFdvcmtmbG93TWFuYWdlcikgbWFuYWdlci5sb29rdXAoV29ya2Zsb3dNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSA9IGdldFdvcmtmbG93YWJsZShtYW5hZ2VyLCBzZXNzaW9uLCBsb2dnZXIsIGRvY3VtZW50KTsKLSAgICAgICAgICAgIHdmTWFuYWdlci5pbnZva2Uod29ya2Zsb3dhYmxlLCBldmVudCwgZm9yY2UpOwotICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3Zk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZSh3Zk1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIGEgd29ya2Zsb3cgZXZlbnQgb24gYSBkb2N1bWVudCBzZXQuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgcmVwb3NpdG9yeSBzZXNzaW9uLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnRTZXQgVGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQuCi0gICAgICogQHBhcmFtIGZvcmNlIElmIHRoaXMgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgZXhlY3V0aW9uIGlzIGZvcmNlZCwgd2hpY2ggbWVhbnMgYW4KLSAgICAgKiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgYSBkb2N1bWVudCBpbiB0aGUgc2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGV2ZW50LiBJZiBzZXQgdG8KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgbm9uLXN1cHBvcnRpbmcgZG9jdW1lbnRzIGFyZSBpZ25vcmVkLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgPGNvZGU+Zm9yY2U8L2NvZGU+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBhbmQgYQotICAgICAqICAgICAgICAgICAgIGRvY3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIHdvcmtmbG93IGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2UoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgU2Vzc2lvbiBzZXNzaW9uLCBMb2dnZXIgbG9nZ2VyLAotICAgICAgICAgICAgRG9jdW1lbnRTZXQgZG9jdW1lbnRTZXQsIFN0cmluZyBldmVudCwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIHsKLSAgICAgICAgV29ya2Zsb3dNYW5hZ2VyIHdmTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3Zk1hbmFnZXIgPSAoV29ya2Zsb3dNYW5hZ2VyKSBtYW5hZ2VyLmxvb2t1cChXb3JrZmxvd01hbmFnZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50W10gZG9jdW1lbnRzID0gZG9jdW1lbnRTZXQuZ2V0RG9jdW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBuZXcgRG9jdW1lbnRXb3JrZmxvd2FibGUobWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudHNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIpOwotICAgICAgICAgICAgICAgIHdmTWFuYWdlci5pbnZva2Uod29ya2Zsb3dhYmxlLCBldmVudCwgZm9yY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHdmTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHdmTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhbiBldmVudCBjYW4gYmUgaW52b2tlZCBvbiBhIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHNlc3Npb24gVGhlIHJlcG9zaXRvcnkgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuSW52b2tlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFNlc3Npb24gc2Vzc2lvbiwgTG9nZ2VyIGxvZ2dlciwKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZXZlbnQpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdvcmtmbG93TWFuYWdlciB3Zk1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2ZNYW5hZ2VyID0gKFdvcmtmbG93TWFuYWdlcikgbWFuYWdlci5sb29rdXAoV29ya2Zsb3dNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSA9IG5ldyBEb2N1bWVudFdvcmtmbG93YWJsZShtYW5hZ2VyLCBzZXNzaW9uLCBkb2N1bWVudCwgbG9nZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiB3Zk1hbmFnZXIuY2FuSW52b2tlKHdvcmtmbG93YWJsZSwgZXZlbnQpOwotICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3Zk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZSh3Zk1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYW4gZXZlbnQgY2FuIGJlIGludm9rZWQgb24gYWxsIGRvY3VtZW50cyBpbiBhIHNldC4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSByZXBvc2l0b3J5IHNlc3Npb24uCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEBwYXJhbSBkb2N1bWVudHMgVGhlIGRvY3VtZW50cy4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LgotICAgICAqIEByZXR1cm4gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuSW52b2tlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIFNlc3Npb24gc2Vzc2lvbiwgTG9nZ2VyIGxvZ2dlciwKLSAgICAgICAgICAgIERvY3VtZW50U2V0IGRvY3VtZW50cywgU3RyaW5nIGV2ZW50KSB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotICAgICAgICBXb3JrZmxvd01hbmFnZXIgd2ZNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdmTWFuYWdlciA9IChXb3JrZmxvd01hbmFnZXIpIG1hbmFnZXIubG9va3VwKFdvcmtmbG93TWFuYWdlci5ST0xFKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBjYW5JbnZva2UgPSB0cnVlOwotICAgICAgICAgICAgRG9jdW1lbnRbXSBkb2N1bWVudEFycmF5ID0gZG9jdW1lbnRzLmdldERvY3VtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSA9IG5ldyBEb2N1bWVudFdvcmtmbG93YWJsZShtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50QXJyYXlbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIpOwotICAgICAgICAgICAgICAgIGNhbkludm9rZSA9IGNhbkludm9rZSAmJiB3Zk1hbmFnZXIuY2FuSW52b2tlKHdvcmtmbG93YWJsZSwgZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNhbkludm9rZTsKLQotICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3Zk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZSh3Zk1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiBhIGRvY3VtZW50IGhhcyBhIHdvcmtmbG93LgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHNlc3Npb24gVGhlIHJlcG9zaXRvcnkgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzV29ya2Zsb3coU2VydmljZU1hbmFnZXIgbWFuYWdlciwgU2Vzc2lvbiBzZXNzaW9uLCBMb2dnZXIgbG9nZ2VyLAotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdvcmtmbG93TWFuYWdlciB3Zk1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2ZNYW5hZ2VyID0gKFdvcmtmbG93TWFuYWdlcikgbWFuYWdlci5sb29rdXAoV29ya2Zsb3dNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSA9IG5ldyBEb2N1bWVudFdvcmtmbG93YWJsZShtYW5hZ2VyLCBzZXNzaW9uLCBkb2N1bWVudCwgbG9nZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiB3Zk1hbmFnZXIuaGFzV29ya2Zsb3cod29ya2Zsb3dhYmxlKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAod2ZNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2Uod2ZNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtmbG93IHNjaGVtYSBvZiBhIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHNlc3Npb24gVGhlIHJlcG9zaXRvcnkgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgd29ya2Zsb3cgc2NoZW1hLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV29ya2Zsb3cgZ2V0V29ya2Zsb3dTY2hlbWEoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgTG9nZ2VyIGxvZ2dlciwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdvcmtmbG93TWFuYWdlciB3Zk1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2ZNYW5hZ2VyID0gKFdvcmtmbG93TWFuYWdlcikgbWFuYWdlci5sb29rdXAoV29ya2Zsb3dNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSA9IGdldFdvcmtmbG93YWJsZShtYW5hZ2VyLCBzZXNzaW9uLCBsb2dnZXIsIGRvY3VtZW50KTsKLSAgICAgICAgICAgIGlmICh3Zk1hbmFnZXIuaGFzV29ya2Zsb3cod29ya2Zsb3dhYmxlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB3Zk1hbmFnZXIuZ2V0V29ya2Zsb3dTY2hlbWEod29ya2Zsb3dhYmxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93RXhjZXB0aW9uKCJUaGUgZG9jdW1lbnQgWyIgKyBkb2N1bWVudCArICJdIGhhcyBubyB3b3JrZmxvdyEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAod2ZNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2Uod2ZNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB3b3JrZmxvd2FibGUgZm9yIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgd29ya2Zsb3dhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV29ya2Zsb3dhYmxlIGdldFdvcmtmbG93YWJsZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBTZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICBMb2dnZXIgbG9nZ2VyLCBEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICBXb3JrZmxvd2FibGUgd29ya2Zsb3dhYmxlID0gbmV3IERvY3VtZW50V29ya2Zsb3dhYmxlKG1hbmFnZXIsIHNlc3Npb24sIGRvY3VtZW50LCBsb2dnZXIpOwotICAgICAgICByZXR1cm4gd29ya2Zsb3dhYmxlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvbmV0L0luZXRBZGRyZXNzVXRpbC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9uZXQvSW5ldEFkZHJlc3NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDUyMjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9uZXQvSW5ldEFkZHJlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5uZXQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotCi0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyBmb3IgSW5ldEFkZHJlc3MuIEFsc28gc2VlIGh0dHA6Ly9qb2RpZXMuZGUvaXBjYWxjCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmV0QWRkcmVzc1V0aWwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIEluZXRBZGRyZXNzVXRpbChMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIGVuYWJsZUxvZ2dpbmcobG9nZ2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBzdWJuZXQgY29udGFpbnMgYSBzcGVjaWZpYyBJUCBhZGRyZXNzLgotICAgICAqIEBwYXJhbSBuZXR3b3JrIFRoZSBuZXR3b3JrIGFkZHJlc3MuCi0gICAgICogQHBhcmFtIG5ldG1hc2sgVGhlIHN1Ym5ldCBtYXNrLgotICAgICAqIEBwYXJhbSBpcCBUaGUgSVAgYWRkcmVzcyB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJbmV0QWRkcmVzcyBuZXR3b3JrLCBJbmV0QWRkcmVzcyBuZXRtYXNrLCBJbmV0QWRkcmVzcyBpcCkgewotICAgICAgICBpZihnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ2hlY2tpbmcgSVAgYWRkcmVzczogIiArIGlwICsgIiBpbiAiICsgbmV0d29yayArICIgLyAiICsgbmV0bWFzayk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJ5dGVbXSBuZXR3b3JrQnl0ZXMgPSBuZXR3b3JrLmdldEFkZHJlc3MoKTsKLSAgICAgICAgYnl0ZVtdIG5ldG1hc2tCeXRlcyA9IG5ldG1hc2suZ2V0QWRkcmVzcygpOwotICAgICAgICBieXRlW10gaXBCeXRlcyA9IGlwLmdldEFkZHJlc3MoKTsKLSAgICAgICAgCi0gICAgICAgIC8qIGNoZWNrIElQdjQvdjYtY29tcGF0aWJpbGl0eSBvciBwYXJhbWV0ZXJzOiAqLwotICAgICAgICBpZihuZXR3b3JrQnl0ZXMubGVuZ3RoICE9IG5ldG1hc2tCeXRlcy5sZW5ndGgKLSAgICAgICAgICAgIHx8IG5ldG1hc2tCeXRlcy5sZW5ndGggIT0gaXBCeXRlcy5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBGSVhNRTogSWYgbmV0d29yayBhbmQgbmV0bWFzayBoYXZlIHRoZSBzYW1lIHNpemUKLSAgICAgICAgICAgICAqIHNob3VsZCBhbHJlYWR5IGJlIGNoZWNrZWQgd2hlbmV2ZXIKLSAgICAgICAgICAgICAqIG9yZy5hcGFjaGUubGVueWEuYWMuKGltcGwuQWJzdHJhY3QpSVBSYW5nZQotICAgICAgICAgICAgICogaXMgc2V0LiBJbiB0aGF0IGNhc2UgdGhlIHVzZXIgc2hvdWxkIGJlIG5vdGlmaWVkCi0gICAgICAgICAgICAgKiBvZiB0aGlzIGNvbmZpZ3VyYXRpb24tZXJyb3IgaW5zdGVhZCBvZiBzaWxlbnRseQotICAgICAgICAgICAgICogYWNjZXB0aW5nIHRoZSBidWdneSBJUFJhbmdlIGFzIG9uZSBub3QgbWF0Y2hpbmcKLSAgICAgICAgICAgICAqIGFueSBob3N0IQotICAgICAgICAgICAgICogKE5vdGUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBwdWJsaWMgQVBJIG9mIElQUmFuZ2UKLSAgICAgICAgICAgICAqIGFuZCBvdGhlciBjbGFzc2VzIHdvdWxkIGJlIG5lY2Vzc2FyeSB0byBmaXggdGhpcwotICAgICAgICAgICAgICogcHJvYmxlbS4gVGhpcyBtZXRob2QgYW5kIHRoZXJlZm9yZSB0aGlzIHdob2xlCi0gICAgICAgICAgICAgKiBjbGFzcyB3b3VsZCBwcm9iYWJseSBiZSBvYnNvbGV0ZSBpbiB0aGF0IGNhc2UuKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZihnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcKLSAgICAgICAgICAgICAgICAgICAgKCJOZXR3b3JrIGFkZHJlc3MgIiArIG5ldHdvcmsgKyAiLCBzdWJuZXQgbWFzayAiCi0gICAgICAgICAgICAgICAgICAgICArIG5ldG1hc2sgKyAiIGFuZC9vciBob3N0IGFkZHJlc3MgIiArIGlwCi0gICAgICAgICAgICAgICAgICAgICArICIgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMhIChyZXR1cm4gZmFsc2UgLi4uKSIpOwotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hc2tlZCBuZXR3b3JrIGFuZCBpcCBhZGRyZXNzZXMgbWF0Y2g6ICovCi0gICAgICAgIGZvcihpbnQgaT0wOyBpPG5ldG1hc2tCeXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IG1hc2sgPSBuZXRtYXNrQnl0ZXNbaV0gJiAweGZmOwotICAgICAgICAgICAgaWYoKG5ldHdvcmtCeXRlc1tpXSAmIG1hc2spICE9IChpcEJ5dGVzW2ldICYgbWFzaykpIHsKLSAgICAgICAgICAgICAgICBpZihnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnCi0gICAgICAgICAgICAgICAgICAgICAgICAoaXAgKyAiIGlzIG5vdCBpbiAiICsgbmV0d29yayArICIgLyAiICsgbmV0bWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnCi0gICAgICAgICAgICAgICAgKGlwICsgIiBpcyBpbiAiICsgbmV0d29yayArICIgLyAiICsgbmV0bWFzayk7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbi10aCBwYXJ0IG9mIGFuIEluZXRBZGRyZXNzLgotICAgICAqIEBwYXJhbSBpcCBUaGUgYWRkcmVzcy4KLSAgICAgKiBAcGFyYW0gcGFydE51bWJlciBUaGUgbnVtYmVyIG9mIHRoZSBwYXJ0LgotICAgICAqIEByZXR1cm4gQW4gaW50ZWdlciB2YWx1ZS4KLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIHdhcyBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgdGhlCi0gICAgICogICAgICBtZXRob2Qge0BsaW5rICNjb250YWluc30gYW5kIHNob3VsZCBuZXZlciBoYXZlIGJlZW4KLSAgICAgKiAgICAgIG1hZGUgcHVibGljLiAoQW5kIGl0J3MgaW5lZmZpY2llbnQgYW5kIHVubmVjZXNzYXJ5Ci0gICAgICogICAgICB0b28sIGFzIHdlbGwgYXMgYnJva2VuIGZvciBJUHY2LiA7LSkKLSAgICAgKiAgICAgIFVzZSA8Y29kZT5pcC5nZXRBZGRyZXNzKClbcGFydE51bWJlcl08L2NvZGU+Ci0gICAgICogICAgICBpbnN0ZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENsYXNzUGFydChJbmV0QWRkcmVzcyBpcCwgaW50IHBhcnROdW1iZXIpIHsKLSAgICAgICAgU3RyaW5nW10gcGFydHMgPSBpcC5nZXRIb3N0QWRkcmVzcygpLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgU3RyaW5nIHBhcnQgPSBwYXJ0c1twYXJ0TnVtYmVyXTsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHBhcnQpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgbmV0bWFzaywgZS5nLiAyNTUuMjU1LjI1NS4yNDAgaXMgZmluZSwgMjU1LjI1NS4yNDAuMTYgaXMgaWxsZWdhbCAobmVlZHMgdG8gYmUgMjU1LjI1NS4yNDAuMCkKLSAgICAgKiBAcGFyYW0gbmV0bWFzayBUaGUgbmV0bWFzayBhZGRyZXNzLgotICAgICAqIEByZXR1cm4gQW4gaW50ZWdlciB2YWx1ZS4gLTEgaWYgaWxsZWdhbCBuZXRtYXNrLCBvdGhlcndpc2UgMCwgMSwgMiwgMwotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgd2FzIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB0aGUKLSAgICAgKiAgICAgIG1ldGhvZCB7QGxpbmsgI2NvbnRhaW5zfSBhbmQgc2hvdWxkIG5ldmVyIGhhdmUgYmVlbgotICAgICAqICAgICAgbWFkZSBwdWJsaWMuIEZ1cnRoZXJtb3JlIGl0J3MgYnJva2VuIGZvciBJUHY2LgotICAgICAqICAgICAgKEhvd2V2ZXIsIHRoZXJlIGlzIG5vIHJlYWwgcmVwbGFjZW1lbnQuIElmIHlvdQotICAgICAqICAgICAgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHksIHlvdSBzaG91bGQgcmV3cml0ZSBpdAotICAgICAqICAgICAgeW91cnNlbGYuKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY2hlY2tOZXRtYXNrKEluZXRBZGRyZXNzIG5ldG1hc2spIHsKLSAgICAgICAgU3RyaW5nW10gcGFydHMgPSBuZXRtYXNrLmdldEhvc3RBZGRyZXNzKCkuc3BsaXQoIlxcLiIpOwotICAgICAgICBJbnRlZ2VyW10gbnVtYmVycyA9IG5ldyBJbnRlZ2VyWzRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgbnVtYmVyc1tpXSA9IG5ldyBJbnRlZ2VyKHBhcnRzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiLmNoZWNrTmV0bWFzaygpOiBDaGVjayBwYXJ0OiAiICsgbnVtYmVyc1tpXSk7Ci0gICAgICAgICAgICBpZiAoMCA8PSBudW1iZXJzW2ldLmludFZhbHVlKCkgJiYgbnVtYmVyc1tpXS5pbnRWYWx1ZSgpIDw9IDI1NSkgewotICAgICAgICAgICAgICAgIGlmIChudW1iZXJzW2ldLmludFZhbHVlKCkgIT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBpICsgMTsgayA8IDQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlcnNba10uaW50VmFsdWUoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIi5jaGVja05ldG1hc2soKTogSWxsZWdhbCBOZXRtYXNrOiAiICsgbmV0bWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIG5vdCByZWFsbHkgYmUgbmVjZXNzYXJ5IGJlY2F1c2UgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBsb25nIHRpbWUgYmVmb3JlCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiLmNoZWNrTmV0bWFzaygpOiBJbGxlZ2FsIE5ldG1hc2s6ICIgKyBuZXRtYXNrKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkFsbCBwYXJ0cyBlcXVhbCAyNTU6ICIgKyBuZXRtYXNrKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhbiBJUCBhZGRyZXMuCi0gICAgICogQHBhcmFtIHN0cmluZyBUaGUgSVAgYWRkcmVzcywgcmVwcmVzZW50ZWQgYnkgYSBzdHJpbmcuCi0gICAgICogQHJldHVybiBBbiBJbmV0QWRkcmVzcyBvYmplY3QuCi0gICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgd2FzIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB0aGUKLSAgICAgKiAgICAgIG1ldGhvZCB7QGxpbmsgI2NvbnRhaW5zfSBhbmQgc2hvdWxkIG5ldmVyIGhhdmUgYmVlbgotICAgICAqICAgICAgbWFkZSBwdWJsaWMuIChBbmQgaXQncyB1bm5lY2Vzc2FyeQotICAgICAqICAgICAgdG9vLCBhcyB3ZWxsIGFzIGJyb2tlbiBmb3IgSVB2Ni4gOy0pCi0gICAgICogICAgICBVc2UgPGNvZGU+SW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHN0cmluZyk8L2NvZGU+Ci0gICAgICogICAgICBpbnN0ZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcyhTdHJpbmcgc3RyaW5nKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc3RyaW5nLnNwbGl0KCJcXC4iKTsKLQotICAgICAgICBJbmV0QWRkcmVzcyBhZGRyZXNzOwotICAgICAgICBieXRlW10gbnVtYmVycyA9IG5ldyBieXRlW3N0cmluZ3MubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgbnVtYmVyID0gSW50ZWdlci5wYXJzZUludChzdHJpbmdzW2ldKTsKLSAgICAgICAgICAgIGlmIChudW1iZXIgPiAxMjcpIHsKLSAgICAgICAgICAgICAgICBudW1iZXIgPSBudW1iZXIgLSAyNTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW1iZXJzW2ldID0gKGJ5dGUpIG51bWJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MobnVtYmVycyk7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9zZWFyY2gvR3JlcC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9zZWFyY2gvR3JlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTEwZTAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvc2VhcmNoL0dyZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkOiBHcmVwLmphdmEgMTUyNjgyIDIwMDUtMDItMDggMTg6MTM6MzlaIGdyZWdvciAkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkNvbnNvbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBwcm92aWRlIGEgc3Vic2V0IG9mIHRoZSBncmVwIGZ1bmN0aW9uYWxpdHkuIAotICovCi1wdWJsaWMgY2xhc3MgR3JlcCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXREZWNvZGVyIGRlY29kZXIgPSBjaGFyc2V0Lm5ld0RlY29kZXIoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWxlIGNvbnRhaW5zIHRoZSBwYXR0ZXJuCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgd2hpY2ggaXMgdG8gYmUgc2VhcmNoZWQgZm9yIHRoZSBwYXR0ZXJuCi0gICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdGhhdCBpcyBiZWluZyBzZWFyY2hlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgY29udGFpbnMgdGhlIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNQYXR0ZXJuKEZpbGUgZmlsZSwgUGF0dGVybiBwYXR0ZXJuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgTG9nZ2VyIGxvZyA9IG5ldyBDb25zb2xlTG9nZ2VyKCk7Ci0KLSAgICAgICAgRmlsZUNoYW5uZWwgZmMgPSBudWxsOwotCQkvLyBPcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGdldCBhIGNoYW5uZWwgZnJvbSB0aGUgc3RyZWFtCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJZmMgPSBmaXMuZ2V0Q2hhbm5lbCgpOwotCi0JCQkvLyBHZXQgdGhlIGZpbGUncyBzaXplIGFuZCB0aGVuIG1hcCBpdCBpbnRvIG1lbW9yeQotCQkJaW50IHN6ID0gKGludClmYy5zaXplKCk7Ci0JCQlNYXBwZWRCeXRlQnVmZmVyIGJiID0gZmMubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBzeik7Ci0KLQkJCS8vIERlY29kZSB0aGUgZmlsZSBpbnRvIGEgY2hhciBidWZmZXIKLQkJCUNoYXJCdWZmZXIgY2IgPSBkZWNvZGVyLmRlY29kZShiYik7Ci0KLQkJCS8vIFBlcmZvcm0gdGhlIHNlYXJjaAotCQkJTWF0Y2hlciBwbSA9IHBhdHRlcm4ubWF0Y2hlcihjYik7IC8vIFBhdHRlcm4gbWF0Y2hlcgotCi0JCQlyZXN1bHQgPSBwbS5maW5kKCk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2cuZXJyb3IoIkZpbGUgbm90IGZvdW5kOiAiICtlLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gZSkgewotCQkJbG9nLmVycm9yKCJQcm9ibGVtIHdpdGggZW5jb2Rpbmc6ICIgK2UudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZy5lcnJvcigiSU8gRXhjZXB0aW9uOiAiICtlLnRvU3RyaW5nKCkpOwotCQl9IGZpbmFsbHkgewotCSAgICAgICAgLy8gQ2xvc2UgdGhlIGNoYW5uZWwgYW5kIHRoZSBzdHJlYW0KLQkgICAgICAgIGlmIChmYyAhPSBudWxsKQotCSAgICAgICAgICAgIGZjLmNsb3NlKCk7Ci0JICAgICAgICBpZiAoZmlzICE9IG51bGwpCi0JICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGFsbCBvY2N1cmVuY2VzIG9mIHBhdHRlcm4gaW4gYSBmaWxlLgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIHNlYXJjaCBmb3Igb2NjdXJlbmNlcyBvZiBwYXR0ZXJuCi0gICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gc2VhcmNoIGZvcgotICAgICAqIEBwYXJhbSBncm91cCB3aGljaCBncm91cCBpbiB0aGUgcGF0dGVybiB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPmFycmF5PC9jb2RlPiBvZiBvY2N1cmVuY2VzIG9mIHBhdHRlcm4gCi0gICAgICogKGkuZS4gdGhlIGdyb3VwdGggZ3JvdXAgb2YgdGhlIG1hdGNoKQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBmaW5kUGF0dGVybihGaWxlIGZpbGUsIFBhdHRlcm4gcGF0dGVybiwgaW50IGdyb3VwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIExvZ2dlciBsb2cgPSBuZXcgQ29uc29sZUxvZ2dlcigpOwotCi0gICAgICAgIEFycmF5TGlzdCBvY2N1cmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgRmlsZUNoYW5uZWwgZmMgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBPcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGdldCBhIGNoYW5uZWwgZnJvbSB0aGUgc3RyZWFtCi0gICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgZmMgPSBmaXMuZ2V0Q2hhbm5lbCgpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGZpbGUncyBzaXplIGFuZCB0aGVuIG1hcCBpdCBpbnRvIG1lbW9yeQotICAgICAgICAgICAgaW50IHN6ID0gKGludClmYy5zaXplKCk7Ci0gICAgICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGJiID0gZmMubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBzeik7Ci0KLSAgICAgICAgICAgIC8vIERlY29kZSB0aGUgZmlsZSBpbnRvIGEgY2hhciBidWZmZXIKLSAgICAgICAgICAgIENoYXJCdWZmZXIgY2IgPSBkZWNvZGVyLmRlY29kZShiYik7Ci0KLSAgICAgICAgICAgIC8vIFBlcmZvcm0gdGhlIHNlYXJjaAotICAgICAgICAgICAgTWF0Y2hlciBwbSA9IHBhdHRlcm4ubWF0Y2hlcihjYik7IC8vIFBhdHRlcm4gbWF0Y2hlcgotCi0gICAgICAgICAgICB3aGlsZSAocG0uZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgb2NjdXJlbmNlcy5hZGQocG0uZ3JvdXAoZ3JvdXApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiZmlsZSBub3QgZm91bmQgIiArZS50b1N0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiZW5jb2RpbmcgcHJvYmxlbSAiICtlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIklPIGV4Y2VwdGlvbiIgK2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0JICAgICAgICAvLyBDbG9zZSB0aGUgY2hhbm5lbCBhbmQgdGhlIHN0cmVhbQotCSAgICAgICAgaWYgKGZjICE9IG51bGwpCi0JICAgICAgICAgICAgZmMuY2xvc2UoKTsKLQkgICAgICAgIGlmIChmaXMgIT0gbnVsbCkKLQkgICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKW9jY3VyZW5jZXMudG9BcnJheShuZXcgU3RyaW5nW29jY3VyZW5jZXMuc2l6ZSgpXSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGFsbCBmaWxlcyBiZWxvdyB0aGUgZ2l2ZW4gZmlsZSB3aGljaCBjb250YWluIHRoZSBnaXZlbiBwYXR0ZXJuLgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHdoZXJlIHRvIHN0YXJ0IHRoZSBzZWFyY2ggZm9yIHRoZSBwYXR0ZXJuLgotICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IuCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlcyB3aGljaCBjb250YWluIHRoZSBwYXR0ZXJuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGZpbGVzIGNvdWxkIG5vdCBiZSBvcGVuZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBmaW5kX2ludGVybmFsKEZpbGUgZmlsZSwgUGF0dGVybiBwYXR0ZXJuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gY2hpbGRyZW4gPSBmaWxlLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgIGZpbmRfaW50ZXJuYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBjaGlsZHJlbltpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5pc0ZpbGUoKSAmJiBjb250YWluc1BhdHRlcm4oZmlsZSwgcGF0dGVybikpIHsKLSAgICAgICAgICAgIGZpbGVMaXN0LmFkZChmaWxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhbGwgZmlsZXMgYmVsb3cgdGhlIGdpdmVuIGZpbGUgd2hpY2ggY29udGFpbiB0aGUgZ2l2ZW4gc2VhcmNoIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgd2hlcmUgdG8gc3RhcnQgdGhlIHNlYXJjaAotICAgICAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgdGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgd2hpY2ggY29udGFpbiB0aGUgc2VhcmNoIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgZmlsZXMgY291bGQgbm90IGJlIG9wZW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZpbGVbXSBmaW5kKEZpbGUgZmlsZSwgU3RyaW5nIHNlYXJjaFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHNlYXJjaFN0cmluZyk7Ci0gICAgICAgIExpc3QgZmlsZUxpc3QgPSBmaW5kX2ludGVybmFsKGZpbGUsIHBhdHRlcm4pOwotICAgICAgICByZXR1cm4gKEZpbGVbXSlmaWxlTGlzdC50b0FycmF5KG5ldyBGaWxlW2ZpbGVMaXN0LnNpemUoKV0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYjgyYTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIGlzIHRocm93biB3aGVuIGEgZGlmZmVyZW50IGlkZW50aXR5IGNoYW5nZWQgYSB0cmFuc2FjdGlvbmFibGUKLSAqIG9iamVjdCBpbiBhbiBvcHRpbWlzdGljIG9mZmxpbmUgbG9jayBzY2VuYXJpby4KLSAqLwotcHVibGljIGNsYXNzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIFRyYW5zYWN0aW9uYWJsZSB0cmFuc2FjdGlvbmFibGU7Ci0KLSAgICBwdWJsaWMgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbihUcmFuc2FjdGlvbmFibGUgdCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgidHJhbnNhY3Rpb25hYmxlIiwgdCk7Ci0gICAgICAgIHRoaXMudHJhbnNhY3Rpb25hYmxlID0gdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAiVGhlIG9iamVjdCBbIiArIHRoaXMudHJhbnNhY3Rpb25hYmxlICsgIl0gd2FzIG1vZGlmaWVkIGFmdGVyIGl0IGhhcyBiZWVuIGxvY2tlZC4iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHRyYW5zYWN0aW9uYWJsZSB0aGF0IHdhcyBtb2RpZmllZCBieSBhIGRpZmZlcmVudCBpZGVudGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNhY3Rpb25hYmxlIGdldFRyYW5zYWN0aW9uYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25hYmxlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9JZGVudGlmaWFibGVGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL0lkZW50aWZpYWJsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0YjZiOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL0lkZW50aWZpYWJsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGlkZW50aWZpYWJsZXMuCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZUZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuIGlkZW50aWZpYWJsZS4KLSAgICAgKiBAcGFyYW0gbWFwIFRoZSBpZGVudGl0eSBtYXAuCi0gICAgICogQHBhcmFtIGtleSBUaGUga2V5LgotICAgICAqIEByZXR1cm4gQW4gaWRlbnRpZmlhYmxlIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgT2JqZWN0IGJ1aWxkKElkZW50aXR5TWFwIG1hcCwgU3RyaW5nIGtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSBpZGVudGlmYWJsZXMgdG8gcHJvZHVjZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VHlwZSgpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9JZGVudGl0eU1hcC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9JZGVudGl0eU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTM1NGQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vSWRlbnRpdHlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uOwotCi0vKioKLSAqIElkZW50aXR5IG1hcC4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aXR5TWFwIHsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIGFuIGluc3RhbmNlIGZyb20gdGhlIG1hcC4gSWYgbm8gaW5zdGFuY2UgZXhpc3RzCi0gICAgICogZm9yIHRoZSBnaXZlbiBrZXksIHRoZSBmYWN0b3J5IGlzIHVzZWQgdG8gYnVpbGQgb25lLgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5IHRoYXQgcHJvZHVjZXMgdGhlIGlkZW50aWZhYmxlLgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIGlkZW50aWZpYWJsZS4KLSAgICAgKiBAcmV0dXJuIEFuIGlkZW50aWZpYWJsZS4KLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0KElkZW50aWZpYWJsZUZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGtleSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1bml0IG9mIHdvcmsuIFRoaXMgbWF5YmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlkZW50aXR5IG1hcCBpcyBub3QgaW52b2x2ZWQKLSAgICAgKiBpbiBhIHRyYW5zYWN0aW9uLgotICAgICAqIEByZXR1cm4gVGhlIHVuaXQgb2Ygd29yay4KLSAgICAgKi8KLSAgICBVbml0T2ZXb3JrIGdldFVuaXRPZldvcmsoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB1bml0IFRoZSB1bml0IG9mIHdvcmsgdG8gdXNlLgotICAgICAqLwotICAgIHZvaWQgc2V0VW5pdE9mV29yayhVbml0T2ZXb3JrIHVuaXQpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWxsIG9iamVjdHMgaW4gdGhpcyBtYXAuCi0gICAgICovCi0gICAgT2JqZWN0W10gZ2V0T2JqZWN0cygpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL0lkZW50aXR5TWFwSW1wbC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9JZGVudGl0eU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwNTQ5Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL0lkZW50aXR5TWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250YWluZXIuQ29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLQotLyoqCi0gKiBJZGVudGl0eSBtYXAgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElkZW50aXR5TWFwSW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIElkZW50aXR5TWFwIHsKLQotICAgIHByaXZhdGUgTWFwIG1hcHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBJZGVudGl0eU1hcEltcGwoTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodGhpcywgbG9nZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChJZGVudGlmaWFibGVGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBrZXkpIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBmYWN0b3J5LmdldFR5cGUoKTsKLSAgICAgICAgTWFwIG1hcCA9IChNYXApIHRoaXMubWFwcy5nZXQodHlwZSk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHRoaXMubWFwcy5wdXQodHlwZSwgbWFwKTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbWFwLmdldChrZXkpOwotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIklkZW50aXR5TWFwSW1wbDo6Z2V0KCkgbG9va2VkIHVwIHR5cGUgWyIgKyB0eXBlICsgIl0sIGtleSBbIiArIGtleQotICAgICAgICAgICAgICAgICAgICArICJdIGluIG1hcCwgaXMgaXQgdGhlcmUgPyAiICsgKG9iamVjdCAhPSBudWxsKSk7Ci0KLSAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IGZhY3RvcnkuYnVpbGQodGhpcywga2V5KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXAucHV0KGtleSwgb2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIHByaXZhdGUgVW5pdE9mV29yayB1bml0T2ZXb3JrOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLklkZW50aXR5TWFwI2dldFVuaXRPZldvcmsoKQotICAgICAqLwotICAgIHB1YmxpYyBVbml0T2ZXb3JrIGdldFVuaXRPZldvcmsoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnVuaXRPZldvcms7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLklkZW50aXR5TWFwI3NldFVuaXRPZldvcmsob3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5Vbml0T2ZXb3JrKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVuaXRPZldvcmsoVW5pdE9mV29yayB1bml0KSB7Ci0gICAgICAgIHRoaXMudW5pdE9mV29yayA9IHVuaXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLklkZW50aXR5TWFwI2dldE9iamVjdHMoKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRPYmplY3RzKCkgewotICAgICAgICBTZXQgb2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMubWFwcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChqLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChPYmplY3RbXSkgb2JqZWN0cy50b0FycmF5KG5ldyBPYmplY3Rbb2JqZWN0cy5zaXplKCldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vTG9jay5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Mb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTQzOTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Mb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbjsKLQotLyoqCi0gKiBBIGxvY2sgb24gYSB0cmFuc2FjdGlvbmFibGUuCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgTG9jayB7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSB0cmFuc2FjdGlvbmFibGUgd2hlbiBpdCB3YXMgbG9ja2VkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMb2NrKGludCB2ZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IHZlcnNpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgdmVyc2lvbiBudW1iZXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vTG9ja0V4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Mb2NrRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDZjYWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Mb2NrRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbjsKLQotLyoqCi0gKiBMb2NrIGV4Y2VwdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NrRXhjZXB0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9ja0V4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9ja0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBMb2NrRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIExvY2tFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL0xvY2thYmxlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL0xvY2thYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDg4NWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Mb2NrYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb247Ci0KLS8qKgotICogT2JqZWN0IHRoYXQgY2FuIGJlIGxvY2tlZC4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9ja2FibGUgewotICAgIAotICAgIC8qKgotICAgICAqIExvY2tzIHRoaXMgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgbG9jaygpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFVubG9ja3MgdGhpcyBvYmplY3QuCi0gICAgICogQHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCB1bmxvY2soKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoaXMgb2JqZWN0IGlzIGxvY2tlZC4KLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTG9ja2VkKCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbG9jayB3aGljaCBpcyBoZWxkIGJ5IHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIExvY2sgZ2V0TG9jaygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhmODQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uOwotCi0vKioKLSAqIFRyYW5zYWN0aW9uIGV4Y2VwdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc2FjdGlvbkV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNhY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNhY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNhY3Rpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uTG9jay5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjMjczYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uTG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb247Ci0KLS8qKgotICogR2xvYmFsIHRyYW5zYWN0aW9uIGxvY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2FjdGlvbkxvY2sgewotCi0gICAgLyoqCi0gICAgICogVGhlIGdsb2JhbCB0cmFuc2FjdGlvbiBsb2NrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPQ0sgPSBUcmFuc2FjdGlvbkxvY2suY2xhc3M7Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uYWJsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiZWNiMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb247Ci0KLS8qKgotICogT2JqZWN0IHRvIHRha2UgcGFydCBpbiBhIHRyYW5zYWN0aW9uLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2FjdGlvbmFibGUgZXh0ZW5kcyBWZXJzaW9uYWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgc2F2ZVRyYW5zYWN0aW9uYWJsZSgpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgdGhlIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGRlbGV0ZVRyYW5zYWN0aW9uYWJsZSgpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBvYmplY3QuCi0gICAgICogQHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBjcmVhdGVUcmFuc2FjdGlvbmFibGUoKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb247Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL1VuaXRPZldvcmsuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vVW5pdE9mV29yay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjVkMTNjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vVW5pdE9mV29yay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb247Ci0KLS8qKgotICogVGhpcyBpcyBhICJVbml0IG9mIFdvcmsiIG9iamVjdCAoc2VlICJVbml0IG9mIFdvcmsiIHBhdHRlcm4gYnkgTWFydGluIEZvd2xlciwgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcnRpbmZvd2xlci5jb20vZWFhQ2F0YWxvZy91bml0T2ZXb3JrLmh0bWwiPgotICogICBodHRwOi8vd3d3Lm1hcnRpbmZvd2xlci5jb20vZWFhQ2F0YWxvZy91bml0T2ZXb3JrLmh0bWwKLSAqIDwvYT46IHRoZSB1bml0IG9mIHdvcmsgIm1haW50YWlucyBhIGxpc3Qgb2Ygb2JqZWN0cyBhZmZlY3RlZCBieSBhIGJ1c2luZXNzIHRyYW5zYWN0aW9uIGFuZCBjb29yZGluYXRlcyB0aGUgd3JpdGluZyBvdXQgb2YgY2hhbmdlcyBhbmQgdGhlIHJlc29sdXRpb24gb2YgY29uY3VycmVuY3kgcHJvYmxlbXMiLgotICogCi0gKiA8cD5JbiB0aGUgY3VycmVudCBkZXNpZ24sIHRoaXMgaW50ZXJmYWNlIGFsbG93cyBhIHVzZSBjYXNlIHRvIGdlbmVyYXRlIGRvY3VtZW50cywgd2hpbGUgZW5zdXJpbmcgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBhIGRvY3VtZW50IGlzIGNyZWF0ZWQuIFRoaXMgYWNjZXNzIGlzIHByb3ZpZGVkIGJ5IHRoZSBEb2N1bWVudElkZW50aXR5TWFwJ3MgRG9jdW1lbnRGYWN0b3J5LjwvcD4KLSAqCi0gKiA8cD5UaGlzIGludGVyZmFjZSBtYXkgYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSB0byBhbGxvdyBmb3IgYWNjZXNzIHRvIGZ1cnRoZXIgdHlwZXMgb2YgYnVzaW5lc3Mgb2JqZWN0cy48L3A+Ci0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBVbml0T2ZXb3JrIHsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhbiBvYmplY3QgYXMgbmV3LgotICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIHJlZ2lzdGVyTmV3KFRyYW5zYWN0aW9uYWJsZSBvYmplY3QpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYW4gb2JqZWN0IGFzIG1vZGlmaWVkLgotICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIHJlZ2lzdGVyRGlydHkoVHJhbnNhY3Rpb25hYmxlIG9iamVjdCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhbiBvYmplY3QgYXMgcmVtb3ZlZC4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAgICogQHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCByZWdpc3RlclJlbW92ZWQoVHJhbnNhY3Rpb25hYmxlIG9iamVjdCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIENvbW1pdHMgdGhlIHRyYW5zYWN0aW9uLgotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgY29tbWl0KCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJvbGxzIHRoZSB0cmFuc2FjdGlvbiBiYWNrLgotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgcm9sbGJhY2soKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRyYW5zYWN0aW9uYWJsZSBBIHRyYW5zYWN0aW9uYWJsZS4KLSAgICAgKiBAcmV0dXJuIElmIHRoZSB0cmFuc2FjdGlvbmFibGUgaXMgcmVnaXN0ZXJlZCBhcyBkaXJ0eS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGlydHkoVHJhbnNhY3Rpb25hYmxlIHRyYW5zYWN0aW9uYWJsZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGxvY2suCi0gICAgICogQHBhcmFtIGxvY2thYmxlIFRoZSBsb2NrYWJsZS4KLSAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbi4KLSAgICAgKiBAcmV0dXJuIEEgbG9jay4KLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIGlmIGEgbG9jayBpcyBhbHJlYWR5IHBsYWNlZCBvbiB0aGlzIHRyYW5zYWN0aW9uYWJsZS4KLSAgICAgKi8KLSAgICBMb2NrIGNyZWF0ZUxvY2soTG9ja2FibGUgbG9ja2FibGUsIGludCB2ZXJzaW9uKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGxvY2suCi0gICAgICogQHBhcmFtIGxvY2thYmxlIFRoZSBsb2NrYWJsZS4KLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIGlmIG5vIGxvY2sgaXMgcGxhY2VkIG9uIHRoaXMgdHJhbnNhY3Rpb25hYmxlLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlTG9jayhMb2NrYWJsZSBsb2NrYWJsZSkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL1VuaXRPZldvcmtJbXBsLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3RyYW5zYWN0aW9uL1VuaXRPZldvcmtJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlY2VmN2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9Vbml0T2ZXb3JrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250YWluZXIuQ29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHVuaXQgb2Ygd29yay4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgVW5pdE9mV29ya0ltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBVbml0T2ZXb3JrIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG1hcCBUaGUgaWRlbnRpdHkgbWFwIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIGlkZW50aXR5LgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVW5pdE9mV29ya0ltcGwoSWRlbnRpdHlNYXAgbWFwLCBJZGVudGl0eSBpZGVudGl0eSwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodGhpcywgbG9nZ2VyKTsKLQotICAgICAgICBBc3NlcnQubm90TnVsbChtYXApOwotICAgICAgICB0aGlzLmlkZW50aXR5TWFwID0gbWFwOwotICAgICAgICB0aGlzLmlkZW50aXR5TWFwLnNldFVuaXRPZldvcmsodGhpcyk7Ci0KLSAgICAgICAgdGhpcy5pZGVudGl0eSA9IGlkZW50aXR5OwotICAgIH0KLQotICAgIHByaXZhdGUgSWRlbnRpdHlNYXAgaWRlbnRpdHlNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBpZGVudGl0eSBtYXAuCi0gICAgICovCi0gICAgcHVibGljIElkZW50aXR5TWFwIGdldElkZW50aXR5TWFwKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pZGVudGl0eU1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNldCBuZXdPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBwcml2YXRlIFNldCBtb2RpZmllZE9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgU2V0IHJlbW92ZWRPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5Vbml0T2ZXb3JrI3JlZ2lzdGVyTmV3KG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTmV3KFRyYW5zYWN0aW9uYWJsZSBvYmplY3QpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmV3T2JqZWN0cy5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBMb2NrRXhjZXB0aW9uCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlVuaXRPZldvcmsjcmVnaXN0ZXJEaXJ0eShvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRpcnR5KFRyYW5zYWN0aW9uYWJsZSBvYmplY3QpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubW9kaWZpZWRPYmplY3RzLmFkZChvYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5Vbml0T2ZXb3JrI3JlZ2lzdGVyUmVtb3ZlZChvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlbW92ZWQoVHJhbnNhY3Rpb25hYmxlIG9iamVjdCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5yZW1vdmVkT2JqZWN0cy5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21taXQgdGhlIHRyYW5zYWN0aW9uLiBXZSBsb2NrIHRoaXMgbWV0aG9kIGZvciB0aGUgd2hvbGUgY2xhc3MgdG8gYXZvaWQgc3luY2hyb25pemF0aW9uCi0gICAgICogcHJvYmxlbXMuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlVuaXRPZldvcmsjY29tbWl0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVuaXRPZldvcmtJbXBsOjpjb21taXQoKSBjYWxsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldCBsb2NrZWRPYmplY3RzID0gdGhpcy5sb2Nrcy5rZXlTZXQoKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsb2NrZWRPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgVHJhbnNhY3Rpb25hYmxlIHQgPSAoVHJhbnNhY3Rpb25hYmxlKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0Lmhhc0NoYW5nZWQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2V0IGludm9sdmVkT2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGludm9sdmVkT2JqZWN0cy5hZGRBbGwodGhpcy5uZXdPYmplY3RzKTsKLSAgICAgICAgaW52b2x2ZWRPYmplY3RzLmFkZEFsbCh0aGlzLm1vZGlmaWVkT2JqZWN0cyk7Ci0gICAgICAgIGludm9sdmVkT2JqZWN0cy5hZGRBbGwodGhpcy5yZW1vdmVkT2JqZWN0cyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGludm9sdmVkT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbmFibGUgdCA9IChUcmFuc2FjdGlvbmFibGUpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIHQuY2hlY2tvdXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdGhpcy5uZXdPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uYWJsZSB0ID0gKFRyYW5zYWN0aW9uYWJsZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgdC5jcmVhdGVUcmFuc2FjdGlvbmFibGUoKTsKLSAgICAgICAgICAgICAgICB0LnNhdmVUcmFuc2FjdGlvbmFibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMubW9kaWZpZWRPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uYWJsZSB0ID0gKFRyYW5zYWN0aW9uYWJsZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVuaXRPZldvcmtJbXBsOjpjb21taXQoKSBjYWxsaW5nIHNhdmUgb24gWyIgKyB0ICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdC5zYXZlVHJhbnNhY3Rpb25hYmxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLnJlbW92ZWRPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uYWJsZSB0ID0gKFRyYW5zYWN0aW9uYWJsZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgdC5kZWxldGVUcmFuc2FjdGlvbmFibGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGdldElkZW50aXR5TWFwKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBnZXRJZGVudGl0eU1hcCgpLmdldE9iamVjdHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdHNbaV0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uYWJsZSB0ID0gKFRyYW5zYWN0aW9uYWJsZSkgb2JqZWN0c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmlzQ2hlY2tlZE91dEJ5U2Vzc2lvbigpICYmICF0aGlzLnJlbW92ZWRPYmplY3RzLmNvbnRhaW5zKHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jaGVja2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5pc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc2V0VHJhbnNhY3Rpb24oKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0VHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIHRoaXMubW9kaWZpZWRPYmplY3RzLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMubmV3T2JqZWN0cy5jbGVhcigpOwotICAgICAgICB0aGlzLnJlbW92ZWRPYmplY3RzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJZGVudGl0eSBpZGVudGl0eTsKLQotICAgIHByb3RlY3RlZCBJZGVudGl0eSBnZXRJZGVudGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpdHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlVuaXRPZldvcmsjaXNEaXJ0eShvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KFRyYW5zYWN0aW9uYWJsZSB0cmFuc2FjdGlvbmFibGUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubW9kaWZpZWRPYmplY3RzLmNvbnRhaW5zKHRyYW5zYWN0aW9uYWJsZSkKLSAgICAgICAgICAgICAgICB8fCB0aGlzLm5ld09iamVjdHMuY29udGFpbnModHJhbnNhY3Rpb25hYmxlKQotICAgICAgICAgICAgICAgIHx8IHRoaXMucmVtb3ZlZE9iamVjdHMuY29udGFpbnModHJhbnNhY3Rpb25hYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24uIFdlIGxvY2sgdGhpcyBtZXRob2QgZm9yIHRoZSB3aG9sZSBjbGFzcyB0byBhdm9pZCBzeW5jaHJvbml6YXRpb24KLSAgICAgKiBwcm9ibGVtcy4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVW5pdE9mV29yayNyb2xsYmFjaygpCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJvbGxiYWNrKCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJVbml0T2ZXb3JrSW1wbDo6cm9sbGJhY2soKSBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0SWRlbnRpdHlNYXAoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SWRlbnRpdHlNYXAoKS5nZXRPYmplY3RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0c1tpXSBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbmFibGUgdCA9IChUcmFuc2FjdGlvbmFibGUpIG9iamVjdHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0LmlzQ2hlY2tlZE91dEJ5U2Vzc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LmNoZWNraW4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodC5pc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzZXRUcmFuc2FjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgbG9ja3MgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIExvY2sgY3JlYXRlTG9jayhMb2NrYWJsZSBsb2NrYWJsZSwgaW50IHZlcnNpb24pIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmxvY2tzLmNvbnRhaW5zS2V5KGxvY2thYmxlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tFeGNlcHRpb24oIkEgbG9jayBpcyBhbHJlYWR5IHBsYWNlZCBvbiBbIiArIGxvY2thYmxlCi0gICAgICAgICAgICAgICAgICAgICsgIl0uIEEgbmV3IGxvY2sgY291bGQgbGVhZCB0byBpbmNvbnNpc3RlbnQgZGF0YS4iKTsKLSAgICAgICAgfQotICAgICAgICBMb2NrIGxvY2sgPSBuZXcgTG9jayh2ZXJzaW9uKTsKLSAgICAgICAgdGhpcy5sb2Nrcy5wdXQobG9ja2FibGUsIGxvY2spOwotICAgICAgICByZXR1cm4gbG9jazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMb2NrKExvY2thYmxlIGxvY2thYmxlKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoIXRoaXMubG9ja3MuY29udGFpbnNLZXkobG9ja2FibGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTG9ja0V4Y2VwdGlvbigiTm8gbG9jayBpcyBhbHJlYWR5IHBsYWNlZCBvbiBbIiArIGxvY2thYmxlICsgIl0hIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5sb2Nrcy5yZW1vdmUobG9ja2FibGUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9WZXJzaW9uYWJsZS5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS90cmFuc2FjdGlvbi9WZXJzaW9uYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODk5MGI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdHJhbnNhY3Rpb24vVmVyc2lvbmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uOwotCi0vKioKLSAqIEEgdmVyc2lvbmFibGUgb2JqZWN0LgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBWZXJzaW9uYWJsZSBleHRlbmRzIExvY2thYmxlIHsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgb2JqZWN0IGluLgotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgY2hlY2tpbigpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgb2JqZWN0IG91dC4KLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGNoZWNrb3V0KCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiB0aGUgb2JqZWN0IGlzIGNoZWNrZWQgb3V0LgotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNDaGVja2VkT3V0KCkgdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgdGhlIG9iamVjdCBpcyBjaGVja2VkIG91dCBieSBpdHMgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ2hlY2tlZE91dEJ5U2Vzc2lvbigpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgaXQgaGFzIGJlZW4gbG9ja2VkLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzQ2hhbmdlZCgpIHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9Bc3NlcnQuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwN2Q5YS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3V0aWwvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS51dGlsOwotCi0vKioKLSAqIEFzc2VydGlvbiB1dGlsaXR5LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lIFRoZSBwYXJhbWV0ZXIgbmFtZSB0byB1c2UgaW4gdGhlIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgbm90TnVsbChTdHJpbmcgcGFyYW1ldGVyTmFtZSwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIFsiICsgcGFyYW1ldGVyTmFtZSArICJdIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSBUaGUgcGFyYW1ldGVyIG5hbWUgdG8gdXNlIGluIHRoZSBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGlzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG5vdE51bGwoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBub3ROdWxsKCJ1bmRlZmluZWQiLCBvYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGNoZWNrLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUuCi0gICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBub3QgdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgaXNUcnVlKFN0cmluZyBleHByZXNzaW9uLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgZXhwcmVzc2lvbiBbIiArIGV4cHJlc3Npb24gKyAiXSBpcyBub3QgdHJ1ZSEiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9DYWNoZU1hcC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL0NhY2hlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTgwNjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL0NhY2hlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotCi0vKioKLSAqIEEgbWFwIHdpdGggYSBtYXhpbXVtIGNhcGFjaXR5LiBXaGVuIHRoZSBtYXAgaXMgZnVsbCwgdGhlIG9sZGVzdCBlbnRyeSBpcyByZW1vdmVkLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVNYXAgZXh0ZW5kcyBIYXNoTWFwIGltcGxlbWVudHMgTG9nRW5hYmxlZCB7Ci0gICAgCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gX2NhcGFjaXR5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2FjaGVNYXAoaW50IF9jYXBhY2l0eSwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBlbmFibGVMb2dnaW5nKGxvZ2dlcik7Ci0gICAgICAgIGFzc2VydCBfY2FwYWNpdHkgPiAtMTsKLSAgICAgICAgdGhpcy5jYXBhY2l0eSA9IF9jYXBhY2l0eTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FwYWNpdHk7Ci0gICAgcHJpdmF0ZSBTb3J0ZWRNYXAgdGltZVRvS2V5ID0gbmV3IFRyZWVNYXAoKTsKLSAgICBwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI3B1dChPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChzaXplKCkgPT0gdGhpcy5jYXBhY2l0eSkgewotICAgICAgICAgICAgT2JqZWN0IG9sZGVzdEtleSA9IHRoaXMudGltZVRvS2V5LmdldCh0aGlzLnRpbWVUb0tleS5maXJzdEtleSgpKTsKLSAgICAgICAgICAgIHJlbW92ZShvbGRlc3RLZXkpOwotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ2xlYXJpbmcgY2FjaGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLnRpbWVUb0tleS5wdXQobmV3IERhdGUoKSwga2V5KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI2dldChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHN1cGVyLmdldChrZXkpOwotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVzaW5nIGNhY2hlZCBvYmplY3QgZm9yIGtleSBbIiArIGtleSArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiTm8gY2FjaGVkIG9iamVjdCBmb3Iga2V5IFsiICsga2V5ICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTG9nZ2VyIGdldExvZ2dlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUxvZ2dpbmcoTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9IVE1MLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3V0aWwvSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDkzMzc2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9IVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy50ZXh0Lmh0bWwucGFyc2VyLlBhcnNlckRlbGVnYXRvcjsKLQotCi0vKioKLSAqIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4vZGV2ZWxvcGVyL1RlY2hUaXBzLzE5OTkvdHQwOTIzLmh0bWwKLSAqLwotcHVibGljIGNsYXNzIEhUTUwgewotICAgIEhUTUxIYW5kbGVyIGh0bWxIYW5kbGVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBIVE1MIG9iamVjdCBmcm9tIGEgVVJJCi0gICAgICogQHBhcmFtIHVyaSBUaGUgVVJJCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIElPIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBIVE1MKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlckRlbGVnYXRvciBwZCA9IG5ldyBQYXJzZXJEZWxlZ2F0b3IoKTsKLSAgICAgICAgdGhpcy5odG1sSGFuZGxlciA9IG5ldyBIVE1MSGFuZGxlcigpOwotICAgICAgICBwZC5wYXJzZShnZXRSZWFkZXIodXJpKSwgdGhpcy5odG1sSGFuZGxlciwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tbWFuZCBsaW5lIGludGVyZmFjZQotICAgICAqIEBwYXJhbSBhcmdzIENvbW1hbmQgbGluZSBhcmdzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogSFRNTCB1cmkgKGZpbGUgb3IgdXJsKSIpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSFRNTCBodG1sID0gbmV3IEhUTUwoYXJnc1swXSk7Ci0KLSAgICAgICAgICAgIExpc3QgaW1nX3NyY19saXN0ID0gaHRtbC5nZXRJbWFnZVNyY3MoZmFsc2UpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8aW0gc3JjIik7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGltZ19zcmNfaXRlcmF0b3IgPSBpbWdfc3JjX2xpc3QuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGltZ19zcmNfaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKChTdHJpbmcpIGltZ19zcmNfaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdCBhX2hyZWZfbGlzdCA9IGh0bWwuZ2V0QW5jaG9ySFJlZnMoZmFsc2UpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8YSBocmVmIik7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGFfaHJlZl9pdGVyYXRvciA9IGFfaHJlZl9saXN0Lml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChhX2hyZWZfaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKChTdHJpbmcpIGFfaHJlZl9pdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0IGxpbmtfaHJlZl9saXN0ID0gaHRtbC5nZXRMaW5rSFJlZnMoZmFsc2UpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8bGluayBocmVmIik7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGxpbmtfaHJlZl9pdGVyYXRvciA9IGxpbmtfaHJlZl9saXN0Lml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChsaW5rX2hyZWZfaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKChTdHJpbmcpIGxpbmtfaHJlZl9pdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIGVycm9yIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEFuY2hvciBIcmVmcwotICAgICAqIEBwYXJhbSBkdXBsaWNhdGUgV2hldGhlciB5b3Ugd2FudCBkdXBsaWNhdGUgSFJFRlMKLSAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBIcmVmcwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldEFuY2hvckhSZWZzKGJvb2xlYW4gZHVwbGljYXRlKSB7Ci0gICAgICAgIGlmIChkdXBsaWNhdGUpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmh0bWxIYW5kbGVyLmdldEFsbEFIUmVmcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmh0bWxIYW5kbGVyLmdldEFIUmVmcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBMaW5rIGhyZWZzCi0gICAgICogQHBhcmFtIGR1cGxpY2F0ZSBXaGV0aGVyIHlvdSB3YW50IGR1cGxpY2F0ZSBIcmVmcwotICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIEhyZWZzCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0TGlua0hSZWZzKGJvb2xlYW4gZHVwbGljYXRlKSB7Ci0gICAgICAgIGlmIChkdXBsaWNhdGUpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmh0bWxIYW5kbGVyLmdldEFsbExpbmtIUmVmcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmh0bWxIYW5kbGVyLmdldExpbmtIUmVmcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBJbWFnZSBzcmMgYXR0cmlidXRlcwotICAgICAqIEBwYXJhbSBkdXBsaWNhdGUgV2hldGhlciB5b3Ugd2FudCBkdXBsaWNhdGVzCi0gICAgICogQHJldHVybiBBIGxpc3Qgb2Ygc3JjIEF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRJbWFnZVNyY3MoYm9vbGVhbiBkdXBsaWNhdGUpIHsKLSAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHRtbEhhbmRsZXIuZ2V0QWxsSW1hZ2VTcmNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaHRtbEhhbmRsZXIuZ2V0SW1hZ2VTcmNzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZWFkZXIgZ2V0UmVhZGVyKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgiaHR0cDoiKSkgewotICAgICAgICAgICAgLy8gdXJpIGlzIHVybAotICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IFVSTCh1cmkpLm9wZW5Db25uZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyB1cmkgaXMgZmlsZQotICAgICAgICByZXR1cm4gbmV3IEZpbGVSZWFkZXIodXJpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3V0aWwvSFRNTEhhbmRsZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9IVE1MSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWU0ZmY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9IVE1MSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy50ZXh0Lk11dGFibGVBdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5odG1sLkhUTUw7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5odG1sLkhUTUwuVGFnOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuaHRtbC5IVE1MRWRpdG9yS2l0LlBhcnNlckNhbGxiYWNrOwotCi0KLS8qKgotICogSFRNTCBoYW5kbGVyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MSGFuZGxlciBleHRlbmRzIFBhcnNlckNhbGxiYWNrIHsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBpbWdfc3JjOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGltZ19zcmNfYWxsOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGFfaHJlZjsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBhX2hyZWZfYWxsOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGxpbmtfaHJlZjsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBsaW5rX2hyZWZfYWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBIVE1MSGFuZGxlciBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIEhUTUxIYW5kbGVyKCkgewotICAgICAgICB0aGlzLmltZ19zcmNfYWxsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0aGlzLmltZ19zcmMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMuYV9ocmVmX2FsbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5hX2hyZWYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMubGlua19ocmVmX2FsbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5saW5rX2hyZWYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIHRoZSBzdGFydCB0YWcKLSAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMKLSAgICAgKiBAcGFyYW0gcG9zIFRoZSBwb3NpdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVN0YXJ0VGFnKFRhZyB0YWcsIE11dGFibGVBdHRyaWJ1dGVTZXQgYXR0cmlidXRlcywgaW50IHBvcykgewotICAgICAgICBpZiAodGFnLmVxdWFscyhIVE1MLlRhZy5BKSkgewotICAgICAgICAgICAgU3RyaW5nIGhyZWYgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShIVE1MLkF0dHJpYnV0ZS5IUkVGKTsKLQotICAgICAgICAgICAgaWYgKGhyZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuYV9ocmVmX2FsbC5hZGQoaHJlZik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYV9ocmVmLmNvbnRhaW5zKGhyZWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYV9ocmVmLmFkZChocmVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgYSBzaW1wbGUgdGFnCi0gICAgICogQHBhcmFtIHRhZyBUaGUgdGFnCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIHNldCBvZiBhdHRyaWJ1dGVzCi0gICAgICogQHBhcmFtIHBvcyBUaGUgcG9zaXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVTaW1wbGVUYWcoVGFnIHRhZywgTXV0YWJsZUF0dHJpYnV0ZVNldCBhdHRyaWJ1dGVzLCBpbnQgcG9zKSB7Ci0gICAgICAgIGlmICh0YWcuZXF1YWxzKEhUTUwuVGFnLklNRykpIHsKLSAgICAgICAgICAgIFN0cmluZyBzcmMgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShIVE1MLkF0dHJpYnV0ZS5TUkMpOwotCi0gICAgICAgICAgICBpZiAoc3JjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmltZ19zcmNfYWxsLmFkZChzcmMpOwotCi0gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmltZ19zcmMuY29udGFpbnMoc3JjKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmltZ19zcmMuYWRkKHNyYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhZy5lcXVhbHMoSFRNTC5UYWcuTElOSykpIHsKLSAgICAgICAgICAgIFN0cmluZyBocmVmID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGUoSFRNTC5BdHRyaWJ1dGUuSFJFRik7Ci0KLSAgICAgICAgICAgIGlmIChocmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxpbmtfaHJlZl9hbGwuYWRkKGhyZWYpOwotCi0gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmxpbmtfaHJlZi5jb250YWlucyhocmVmKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmtfaHJlZi5hZGQoaHJlZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIHNyYyBhdHRyaWJ1dGVzIGZvciBpbWFnZXMKLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHNyYyBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRJbWFnZVNyY3MoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmltZ19zcmM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIHNyYyBhdHRyaWJ1dGVzIGZvciBhbGwgaW1hZ2VzCi0gICAgICogQHJldHVybiAgVGhlIGxpc3Qgb2Ygc3JjIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEFsbEltYWdlU3JjcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW1nX3NyY19hbGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbGlzdCBvZiBsaW5rcwotICAgICAqIEByZXR1cm4gIFRoZSBsaXN0IG9mIGxpbmtzCi0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRMaW5rSFJlZnMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxpbmtfaHJlZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCBsaW5rcwotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbGlua3MKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEFsbExpbmtIUmVmcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlua19ocmVmX2FsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBsaXN0IG9mIGEgaHJlZj0KLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGEgaHJlZgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0QUhSZWZzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hX2hyZWY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbGlzdCBvZiBhbGwgYSBocmVmPQotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgYSBocmVmCi0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRBbGxBSFJlZnMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFfaHJlZl9hbGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL05hbWVzcGFjZU1hcC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL05hbWVzcGFjZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTBlYjA4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9OYW1lc3BhY2VNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLS8qKgotICogQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gYWNjZXNzCi0gKiBTdHJpbmdzIGluIGEgTWFwIHRoYXQgYXJlIHByZWZpeGVkIGxpa2UgInByZWZpeC5mb28iLgotICogVGhlIGFjdHVhbCBtYXAgd3JhcHBlZCBieSB0aGlzIG9iamVjdCBjYW4gY29udGFpbiBtb3JlCi0gKiBrZXktdmFsdWUtcGFpcnMsIGJ1dCB5b3UgY2FuIGFjY2VzcyBvbmx5IHRoZSBwcmVmaXhlZCBrZXlzCi0gKiB0aHJvdWdoIHRoZSBtYXBwZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VNYXAgewotICAgIC8qKgotICAgICAqIDxjb2RlPlNFUEFSQVRPUjwvY29kZT4gVGhlIHNlcGVyYXRvciBjaGFyYWN0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLiI7Ci0gICAgcHJpdmF0ZSBNYXAgbWFwOwotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgTmFtZXNwYWNlTWFwIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gX3ByZWZpeCBUaGUgcHJlZml4LgotICAgICAqLwotICAgIHB1YmxpYyBOYW1lc3BhY2VNYXAoU3RyaW5nIF9wcmVmaXgpIHsKLSAgICAgICAgdGhpcyhuZXcgSGFzaE1hcCgpLCBfcHJlZml4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IE5hbWVzcGFjZU1hcC4KLSAgICAgKiBAcGFyYW0gX21hcCBBIG1hcCBjb250YWluaW5nIHRoZSBwcmVmaXhlZCBrZXktdmFsdWUtcGFpcnMuCi0gICAgICogQHBhcmFtIF9wcmVmaXggVGhlIHByZWZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZXNwYWNlTWFwKE1hcCBfbWFwLCBTdHJpbmcgX3ByZWZpeCkgewotICAgICAgICB0aGlzLm1hcCA9IF9tYXA7Ci0gICAgICAgIHRoaXMucHJlZml4ID0gX3ByZWZpeDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmVmaXguCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXguCi0gICAgICogQHJldHVybiBUaGUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwIGdldE1hcE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtYXAgdGhhdCBjb250YWlucyBvbmx5IHRoZSB1bi1wcmVmaXhlZCBrZXktdmFsdWUtcGFpcnMuCi0gICAgICogQHJldHVybiBUaGUgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0TWFwKCkgewotICAgICAgICBNYXAgcmVzdWx0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBTZXQga2V5cyA9IGdldE1hcE9iamVjdCgpLmtleVNldCgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGtleXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5U3RyaW5nID0gKFN0cmluZykga2V5OwotCi0gICAgICAgICAgICAgICAgaWYgKGtleVN0cmluZy5zdGFydHNXaXRoKGdldFByZWZpeCgpICsgU0VQQVJBVE9SKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRNYXAucHV0KGdldFNob3J0TmFtZShnZXRQcmVmaXgoKSwga2V5U3RyaW5nKSwgZ2V0TWFwT2JqZWN0KCkuZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHRNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHV0cyBhIHZhbHVlIGZvciBwcmVmaXhlZCBrZXkgaW50byB0aGUgbWFwLgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB3aXRob3V0IHByZWZpeC4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgZ2V0TWFwT2JqZWN0KCkucHV0KGdldEZ1bGxOYW1lKGdldFByZWZpeCgpLCBrZXkpLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIGEgcHJlZml4ZWQga2V5LgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB3aXRob3V0IHByZWZpeC4KLSAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBnZXRNYXAoKS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIChwcmVmaXhlZCkga2V5IGZvciBhIHNob3J0ICh1bi1wcmVmaXhlZCkga2V5LgotICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeC4KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSB1bi1wcmVmaXhlZCBrZXkuCi0gICAgICogQHJldHVybiBBIHN0cmluZyAocHJlZml4ICsge0BsaW5rICNTRVBBUkFUT1J9ICsga2V5KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsTmFtZShTdHJpbmcgcHJlZml4LCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBwcmVmaXggKyBTRVBBUkFUT1IgKyBrZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hvcnQgKHVuLXByZWZpeGVkKSBrZXkgZm9yIGEgZnVsbCAocHJlZml4ZWQpIGtleS4KLSAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXguCi0gICAgICogQHBhcmFtIGtleSBUaGUgZnVsbCAocHJlZml4ZWQpIGtleS4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNob3J0TmFtZShTdHJpbmcgcHJlZml4LCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSArIFNFUEFSQVRPUi5sZW5ndGgoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFB1dHMgYWxsIHByZWZpeGVkIGtleS12YWx1ZS1wYWlycyBvZiBtYXAgaW50byB0aGlzIG1hcC4KLSAgICAgKiBAcGFyYW0gX21hcCBBIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIF9tYXApIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX21hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBwdXQoa2V5LCBfbWFwLmdldChrZXkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIHdpdGggcHJlZml4ZWQga2V5cy4KLSAgICAgKiBAcmV0dXJuIEEgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0UHJlZml4ZWRNYXAoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaE1hcChnZXRNYXBPYmplY3QoKSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL1F1ZXJ5LmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3V0aWwvUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwMjgzZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3V0aWwvUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiA8cD4KLSAqIFV0aWxpdHkgY2xhc3MgdG8gYW5hbHl6ZSBhIHF1ZXJ5IHN0cmluZyBvZiB0aGUgZm9ybQotICogPGNvZGU+a2V5MT12YWx1ZTEma2V5Mj12YWx1ZTImLi4uPC9jb2RlPi4KLSAqIEFjY2VzcyBpcyBub3QgdGhyZWFkLXNhZmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEludmFsaWQgcGFydHMgKG5vdCBhIHZhbGlkIGtleS12YWx1ZS1wYWlyKSBhcmUgb21pdHRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBSVJfREVMSU1JVEVSID0gIiYiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxVRV9ERUxJTUlURVIgPSAiPSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFpckRlbGltaXRlcjsKLSAgICBwcml2YXRlIFN0cmluZyBrZXlWYWx1ZURlbGltaXRlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBxdWVyeSBvYmplY3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHBhaXIgYW5kIGtleS12YWx1ZQotICAgICAqIGRlbGltaXRlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmluZyBUaGUgcXVlcnkgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBRdWVyeShTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHRoaXMoc3RyaW5nLCBQQUlSX0RFTElNSVRFUiwgS0VZX1ZBTFVFX0RFTElNSVRFUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcuCi0gICAgICogQHBhcmFtIHBhaXJEZWxpbWl0ZXIgVGhlIGRlbGltaXRlciBiZXR3ZWVuIGtleS12YWx1ZSBwYWlycy4KLSAgICAgKiBAcGFyYW0ga2V5VmFsdWVEZWxpbWl0ZXIgVGhlIGRlbGltaXRlciBiZXR3ZWVuIGtleSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIFF1ZXJ5KFN0cmluZyBzdHJpbmcsIFN0cmluZyBwYWlyRGVsaW1pdGVyLCBTdHJpbmcga2V5VmFsdWVEZWxpbWl0ZXIpIHsKLSAgICAgICAgdGhpcy5rZXkydmFsdWUgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLnBhaXJEZWxpbWl0ZXIgPSBwYWlyRGVsaW1pdGVyOwotICAgICAgICB0aGlzLmtleVZhbHVlRGVsaW1pdGVyID0ga2V5VmFsdWVEZWxpbWl0ZXI7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cmluZywgcGFpckRlbGltaXRlcik7Ci0gICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIga2V5VmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRva2VuLCBrZXlWYWx1ZURlbGltaXRlcik7Ci0gICAgICAgICAgICBpZiAoa2V5VmFsdWVUb2tlbml6ZXIuY291bnRUb2tlbnMoKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IGtleVZhbHVlVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGtleVZhbHVlVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIHRoaXMua2V5MnZhbHVlLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIGtleTJ2YWx1ZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgdGhpcy5rZXkydmFsdWUuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFZhbHVlKGtleSk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXlWYWx1ZURlbGltaXRlcigpIHsKLSAgICAgICAgcmV0dXJuIGtleVZhbHVlRGVsaW1pdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFpckRlbGltaXRlcigpIHsKLSAgICAgICAgcmV0dXJuIHBhaXJEZWxpbWl0ZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgdGhpcy5rZXkydmFsdWUucmVtb3ZlKGtleSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMua2V5MnZhbHVlLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHRoaXMua2V5MnZhbHVlLmdldChrZXkpOwotICAgICAgICAgICAgYnVmLmFwcGVuZChrZXkpOwotICAgICAgICAgICAgYnVmLmFwcGVuZCh0aGlzLmtleVZhbHVlRGVsaW1pdGVyKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmFsdWUpOwotICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh0aGlzLnBhaXJEZWxpbWl0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9TZXJ2bGV0SGVscGVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3V0aWwvU2VydmxldEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY1NGVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9TZXJ2bGV0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhBUEk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTZXJ2bGV0IHV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2bGV0SGVscGVyIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXJ2bGV0SGVscGVyKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJMIGluc2lkZSB0aGUgd2ViIGFwcGxpY2F0aW9uICh3aXRob3V0IHRoZSBjb250ZXh0IHByZWZpeCkuCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJhcHBVUkkoUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIFN0cmluZyBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOwotICAgICAgICBTdHJpbmcgcmVxdWVzdFVyaSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICByZXR1cm4gZ2V0V2ViYXBwVVJJKGNvbnRleHQsIHJlcXVlc3RVcmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFVSTCBpbnNpZGUgdGhlIHdlYiBhcHBsaWNhdGlvbiAod2l0aG91dCB0aGUgY29udGV4dCBwcmVmaXgpLgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHByZWZpeC4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdFVyaSBUaGUgY29tcGxldGUgcmVxdWVzdCBVUkkuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJhcHBVUkkoU3RyaW5nIGNvbnRleHQsIFN0cmluZyByZXF1ZXN0VXJpKSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdXJsID0gcmVxdWVzdFVyaS5zdWJzdHJpbmcoY29udGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgIGlmICh1cmwubGVuZ3RoKCkgPiAwICYmICF1cmwuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICB1cmwgPSAiLyIgKyB1cmw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gYSBtYXAuIElmIGEga2V5IGlzIG1hcHBlZCB0byBtdWx0aXBsZSBwYXJhbWV0ZXJzLCBhIHN0cmluZwotICAgICAqIGFycmF5IGlzIHVzZWQgYXMgdGhlIHZhbHVlLgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4gQSBtYXAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBNYXAgcmVxdWVzdFBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoa2V5KTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1swXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RQYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gdXBsb2FkRW5hYmxlZCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBlbmFibGUtdXBsb2FkcyBpbiB3ZWIueG1sCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIFNlcnZpY2UgTWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZW5hYmxlIHVwbG9hZCBpcyB0cnVlIG9yIG5vdCBzZXQgaW4gd2ViLnhtbCwgZWxzZSBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNVcGxvYWRFbmFibGVkKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpCi0gICAgICAgICAgICB0aHJvd3MgU291cmNlTm90Rm91bmRFeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKFNlcnZsZXRIZWxwZXIudXBsb2FkRW5hYmxlZCA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgIE5vZGUgbm9kZTsKLSAgICAgICAgICAgIFN0cmluZyB3ZWJhcHBVcmwgPSAiY29udGV4dDovL1dFQi1JTkYvd2ViLnhtbCI7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IFNvdXJjZVV0aWwucmVhZERPTSh3ZWJhcHBVcmwsIG1hbmFnZXIpOwotICAgICAgICAgICAgRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBub2RlID0gWFBhdGhBUEkuc2VsZWN0U2luZ2xlTm9kZShyb290LAotICAgICAgICAgICAgICAgICAgICAiL3dlYi1hcHAvc2VydmxldC9pbml0LXBhcmFtW3BhcmFtLW5hbWU9J2VuYWJsZS11cGxvYWRzJ10vcGFyYW0tdmFsdWUvdGV4dCgpIik7Ci0KLSAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTZXJ2bGV0SGVscGVyLnVwbG9hZEVuYWJsZWQgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGVuYWJsZWQgPSBub2RlLmdldE5vZGVWYWx1ZSgpLmVxdWFscygidHJ1ZSIpOwotICAgICAgICAgICAgICAgIFNlcnZsZXRIZWxwZXIudXBsb2FkRW5hYmxlZCA9IEJvb2xlYW4udmFsdWVPZihlbmFibGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU2VydmxldEhlbHBlci51cGxvYWRFbmFibGVkLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9TZXNzaW9uTGlzdGVuZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9TZXNzaW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZThjMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3V0aWwvU2Vzc2lvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnV0aWw7Ci0KLS8qKgotICogQSBMaXN0ZW5lciB3aGljaCBzdG9yZSB0aGUgc2Vzc2lvbiBvYmplY3QgaW4gYSBIYXNoTWFwIG9uIGNyZWF0aW9uIGFuZCAKLSAqIHJlbW92ZSBpdCBpZiB0aGUgc2Vzc2lvbiBpcyBkZXN0cm95ZWQuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyIGltcGxlbWVudHMgSHR0cFNlc3Npb25MaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBXZWFrSGFzaE1hcCBhbGxTZXNzaW9ucyA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCi0JcHVibGljIHZvaWQgc2Vzc2lvbkNyZWF0ZWQoSHR0cFNlc3Npb25FdmVudCBzZSkgewotCi0JCUh0dHBTZXNzaW9uIHNlc3Npb24gPSBzZS5nZXRTZXNzaW9uKCk7Ci0JCVN0cmluZyBzZXNzaW9uSUQgPSBzZXNzaW9uLmdldElkKCk7Ci0JCWFsbFNlc3Npb25zLnB1dChzZXNzaW9uSUQsc2Vzc2lvbik7CQkJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNlc3Npb25EZXN0cm95ZWQoSHR0cFNlc3Npb25FdmVudCBzZSkgewotCQlIdHRwU2Vzc2lvbiBzZXNzaW9uID0gc2UuZ2V0U2Vzc2lvbigpOwotCQlTdHJpbmcgc2Vzc2lvbklEID0gc2Vzc2lvbi5nZXRJZCgpOwotCQlpZiAoYWxsU2Vzc2lvbnMuY29udGFpbnNLZXkoc2Vzc2lvbklEKSkgewotCQkJYWxsU2Vzc2lvbnMucmVtb3ZlKHNlc3Npb25JRCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgV2Vha0hhc2hNYXAgZ2V0QWxsU2Vzc2lvbnMoKSB7Ci0JCXJldHVybiBhbGxTZXNzaW9uczsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9TdGFjay5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL1N0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGY4ODYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL1N0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgdG8gaW1wbGVtZW50IGEgc3RhY2suIFVubGlrZSBqYXZhLnV0aWwuU3RhY2ssIHRoaXMgc3RhY2sKLSAqIGRpc2NhcmRzIG9sZCBlbGVtZW50cyBvbmNlIG1heHNpemUgaXMgcmVhY2hlZC4KLSAqIEBzZWUgamF2YS51dGlsLlN0YWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFjayBleHRlbmRzIFZlY3RvciB7Ci0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JaW50IG1heHNpemUgPSAwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTdGFjayBvYmplY3QuCi0gICAgICogQHBhcmFtIF9tYXhzaXplIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHN0YWNrCi0gICAgICovCi0gICAgcHVibGljIFN0YWNrKGludCBfbWF4c2l6ZSkgewotICAgICAgICB0aGlzLm1heHNpemUgPSBfbWF4c2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoIGFuIG9iamVjdCBvbiB0aGUgc3RhY2sKLSAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXNoKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgMCk7Ci0KLSAgICAgICAgaWYgKHNpemUoKSA9PSAodGhpcy5tYXhzaXplICsgMSkpIHsKLSAgICAgICAgICAgIHJlbW92ZUVsZW1lbnRBdCh0aGlzLm1heHNpemUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL1N0cmluZ1V0aWwuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvdXRpbC9TdHJpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNmMyOGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS91dGlsL1N0cmluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnV0aWw7Ci0KLS8qKgotICogU3RyaW5nIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdVdGlsIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBKb2lucyBhbiBhcnJheSBvZiBvYmplY3RzIGludG8gYSBzdHJpbmcuCi0gICAgICogQHBhcmFtIG9iamVjdHMgVGhlIG9iamVjdHMuCi0gICAgICogQHBhcmFtIGRlbGltaXRlciBUaGUgZGVsaW1pdGVyIHRvIHVzZS4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGpvaW4oT2JqZWN0W10gb2JqZWN0cywgU3RyaW5nIGRlbGltaXRlcikgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQob2JqZWN0c1tpXS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L0FjdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViYmFjYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdzsKLQotCi0vKioKLSAqIFdvcmtmbG93IGFjdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpb24gewotCQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoaXMgYWN0aW9uIGZvciBhIGdpdmVuIHdvcmtmbG93IGluc3RhbmNlLgotICAgICAqIEBwYXJhbSByZXN1bHRpbmdWZXJzaW9uIFRoZSByZXN1bHRpbmcgdmVyc2lvbi4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIGlmIHRoZSBleGVjdXRpb24gZmFpbGVkCi0gICAgICovCi0gICAgdm9pZCBleGVjdXRlKFZlcnNpb24gcmVzdWx0aW5nVmVyc2lvbikgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Cb29sZWFuVmFyaWFibGUuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvQm9vbGVhblZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZDQ2NTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Cb29sZWFuVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3c7Ci0KLQotLyoqCi0gKiA8cD5Cb29sZWFuIHN0YXRlIHZhcmlhYmxlLjwvcD4KLSAqIDxwPgotICogQSB3b3JrZmxvdyBzY2hlbWEgY2FuIGNvbnRhaW4gYSBzZXQgb2Ygc3RhdGUgdmFyaWFibGVzLgotICogRm9yIGVhY2ggaW5zdGFuY2UsIHRoZSBzdGF0ZSB2YXJpYWJsZXMgaG9sZCBjZXJ0YWluIHZhbHVlcy4KLSAqIFZhbHVlcyBjYW4gYmUgYXNzaWduZWQgZHVyaW5nIHRyYW5zaXRpb25zLCBzbyBhIHZhcmlhYmxlIGNhbgotICogY2hhbmdlIGl0cyB2YWx1ZSB3aGVuIGEgdHJhbnNpdGlvbiBmaXJlcy4gQ3VycmVudGx5LAotICogdGhlIHdvcmtmbG93IHN1cHBvcnRzIG9ubHkgYm9vbGVhbiBzdGF0ZSB2YXJpYWJsZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQm9vbGVhblZhcmlhYmxlIHsKLQkKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgdmFyaWFibGUuCi0gICAgICogQHJldHVybiB0aGUgbmFtZQotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBnZXRJbml0aWFsVmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvQm9vbGVhblZhcmlhYmxlQXNzaWdubWVudC5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Cb29sZWFuVmFyaWFibGVBc3NpZ25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMjAyMWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Cb29sZWFuVmFyaWFibGVBc3NpZ25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93OwotCi0KLS8qKgotICogQm9vbGVhbiB2YXJpYWJsZSBhc3NpZ25tZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJvb2xlYW5WYXJpYWJsZUFzc2lnbm1lbnQgZXh0ZW5kcyBBY3Rpb24gewotICAgIC8vIGRvIG5vdGhpbmcKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvQ29uZGl0aW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L0NvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc1OGEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvQ29uZGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93OwotCi0vKioKLSAqIDxwPkEgY29uZGl0aW9uIGNhbiBwcmV2ZW50IGEgdHJhbnNpdGlvbiBmcm9tIGZpcmluZywKLSAqIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNpdHVhdGlvbi4gRXhhbXBsZXM6PC9wPgotICogPHVsPgotICogPGxpPkRvZXMgdGhlIGN1cnJlbnQgdXNlciBoYXZlIGEgY2VydGFpbiByb2xlIG9uIHRoZSBjdXJyZW50IFVSTD88L2xpPgotICogPGxpPkRvZXMgYSBjZXJ0YWluIHN0YXRlIHZhcmlhYmxlIGhhdmUgYSBjZXJ0YWluIHZhbHVlIChlLmcuLCBpcyB0aGUgZG9jdW1lbnQgcHVibGlzaGVkKT8gKEJvb2xlYW5WYXJpYWJsZUNvbmRpdGlvbik8bGk+Ci0gKiA8bGk+SXMgdGhlIHN1biBzaGluaW5nPyAoZS5nLiwgaWYgdGhlIHdlYXRoZXIgcmVwb3J0IG1heSBvbmx5IGJlIHB1Ymxpc2hlZCBvbiBzdW5ueSBkYXlzKTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmRpdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBjb25kaXRpb24gaXMgY29tcGxpZWQgaW4gYSBjZXJ0YWluIHNpdHVhdGlvbi4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3cgVGhlIHdvcmtmbG93IHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3dhYmxlIFRoZSB3b3JrZmxvd2FibGUgdG8gY2hlY2sgdGhlIGNvbmRpdGlvbiBvbi4KLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBjb25kaXRpb24gaXMgY29tcGxpZWQuCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB3aGVuIHRoZSBleHByZXNzaW9uIGNvdWxkIG5vdCBiZSBldmFsdWF0ZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0NvbXBsaWVkKFdvcmtmbG93IHdvcmtmbG93LCBXb3JrZmxvd2FibGUgd29ya2Zsb3dhYmxlKSB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb247Ci0KLSAgICAvKiogU2V0cyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhpcyBjb25kaXRpb24uCi0gICAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24uCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB3aGVuIHRoZSBleHByZXNzaW9uIGlzIG5vdCB2YWxpZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldEV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvVHJhbnNpdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9UcmFuc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjZlZTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9UcmFuc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93OwotCi0KLS8qKgotICogPHA+Ci0gKiBBIHRyYW5zaXRpb24gZGVzY3JpYmVzIHRoZSBzd2l0Y2hpbmcgb2YgYSB3b3JrZmxvdyBpbnN0YW5jZQotICogZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlci4gQSB0cmFuc2l0aW9uIGhhcwotICogPC9wPgotICogCi0gKiA8dWw+Ci0gKiA8bGk+YSBzb3VyY2Ugc3RhdGUsPC9saT4KLSAqIDxsaT5hIGRlc3RpbmF0aW9uIHN0YXRlLDwvbGk+Ci0gKiA8bGk+YW4gZXZlbnQsPC9saT4KLSAqIDxsaT5hIHNldCBvZiBjb25kaXRpb25zLDwvbGk+Ci0gKiA8bGk+YSBzZXQgb2YgYXNzaWdubWVudHMuPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIDxwPgotICogQWRkaXRpb25hbGx5LCBhIHRyYW5zaXRpb24gY2FuIGJlIG1hcmtlZCBhcyBzeW5jaHJvbml6ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNpdGlvbiB7Ci0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXZlbnQgb2YgdGhpcyB0cmFuc2l0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIGV2ZW50Ci0gICAgICovCi0gICAgU3RyaW5nIGdldEV2ZW50KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgc291cmNlIHN0YXRlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRTb3VyY2UoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXN0aW5hdGlvbiBzdGF0ZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVzdGluYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGlvbnMgb2YgdGhpcyB0cmFuc2l0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbnMKLSAgICAgKi8KLSAgICBBY3Rpb25bXSBnZXRBY3Rpb25zKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgY29uZGl0aW9ucy4KLSAgICAgKi8KLSAgICBDb25kaXRpb25bXSBnZXRDb25kaXRpb25zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgdHJhbnNpdGlvbiBpcyBzeW5jaHJvbml6ZWQuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9WZXJzaW9uLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L1ZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiZmNmOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L1ZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93OwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogQSB2ZXJzaW9uIG9mIHRoZSB3b3JrZmxvdyBoaXN0b3J5LgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmVyc2lvbiB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXZlbnQuCi0gICAgICogQHJldHVybiBBbiBldmVudC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RXZlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXRlLgotICAgICAqIEByZXR1cm4gQSBzdGF0ZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U3RhdGUoKTsKLSAgICAKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRhdGUuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBEYXRlIGdldERhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGUuCi0gICAgICogQHBhcmFtIF9kYXRlIEEgZGF0ZS4KLSAgICAgKi8KLSAgICB2b2lkIHNldERhdGUoRGF0ZSBfZGF0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIElELgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VySWQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHVzZXIgSUQuCi0gICAgICogQHBhcmFtIF91c2VySWQgQSB1c2VyIElELgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJJZChTdHJpbmcgX3VzZXJJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpcCBhZGRyZXNzLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJUEFkZHJlc3MoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGlwIGFkZHJlc3MuCi0gICAgICogQHBhcmFtIF9pcGFkZHJlc3MgQSBpcCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElQQWRkcmVzcyhTdHJpbmcgX2lwYWRkcmVzcyk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4KLSAgICAgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSB2YXJpYWJsZSBuYW1lLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIGJvb2xlYW4gZ2V0VmFsdWUoU3RyaW5nIHZhcmlhYmxlTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgdmFyaWFibGUgdmFsdWUuCi0gICAgICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgdmFyaWFibGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlLgotICAgICAqLwotICAgIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhcmlhYmxlTmFtZSwgYm9vbGVhbiB2YWx1ZSk7Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Xb3JrZmxvdy5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Xb3JrZmxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWE5YzAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvV29ya2Zsb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3c7Ci0KLS8qKgotICogPHA+QSB3b3JrZmxvdyBzY2hlbWEuPC9wPgotICogPHA+Ci0gKiBBIHdvcmtmbG93IHNjaGVtYSBkZWZpbmVzIGEgc3RhdGUgbWFjaGluZSAoZGV0ZXJtaW5pc3RpYyBmaW5pdGUKLSAqIGF1dG9tYXRvbiAtIERGQSksIGNvbnNpc3Rpbmcgb2YKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT5zdGF0ZXMsIGluY2x1ZGluZyBhIG1hcmtlZCBpbml0aWFsIHN0YXRlLDwvbGk+Ci0gKiA8bGk+dHJhbnNpdGlvbnMsIGFuZDwvbGk+Ci0gKiA8bGk+c3RhdGUgdmFyaWFibGVzLjwvbGk+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2Zsb3cgewotICAgIC8qKgotICAgICAqIDxjb2RlPk5BTUVTUEFDRTwvY29kZT4gV29ya2Zsb3cgbmFtZXNwYWNlIFVSSQotICAgICAqLwotICAgIFN0cmluZyBOQU1FU1BBQ0UgPSAiaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3dvcmtmbG93LzEuMCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+REVGQVVMVF9QUkVGSVg8L2NvZGU+IERlZmF1bHQgd29ya2Zsb3cgbmFtZXNwYWNlIHByZWZpeAotICAgICAqLwotICAgIFN0cmluZyBERUZBVUxUX1BSRUZJWCA9ICJ3ZiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGlzIHdvcmtmbG93LgotICAgICAqIEByZXR1cm4gVGhlIGluaXRpYWwgc3RhdGUKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SW5pdGlhbFN0YXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0cmFuc2l0aW9ucyB0aGF0IGxlYXZlIGEgc3RhdGUuCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCwgZS5nLiwgdG8gZGlzYWJsZSBtZW51IGl0ZW1zLgotICAgICAqIEBwYXJhbSBzdGF0ZSBBIHN0YXRlLgotICAgICAqIEByZXR1cm4gVGhlIHRyYW5zaXRpb25zIHRoYXQgbGVhdmUgdGhlIHN0YXRlLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgdGhlIHN0YXRlIGlzIG5vdCBjb250YWluZWQuCi0gICAgICovCi0gICAgVHJhbnNpdGlvbltdIGdldExlYXZpbmdUcmFuc2l0aW9ucyhTdHJpbmcgc3RhdGUpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBuYW1lcy4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGFycmF5LgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldFZhcmlhYmxlTmFtZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoaXMgd29ya2Zsb3cuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSB2YXJpYWJsZSBuYW1lLgotICAgICAqIEByZXR1cm4gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIGJvb2xlYW4gZ2V0SW5pdGlhbFZhbHVlKFN0cmluZyB2YXJpYWJsZU5hbWUpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBldmVudHMuCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0RXZlbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZXMuCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0U3RhdGVzKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L1dvcmtmbG93RW5naW5lLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L1dvcmtmbG93RW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTQ4MDcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Xb3JrZmxvd0VuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3c7Ci0KLS8qKgotICogV29ya2Zsb3cgZW5naW5lLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2Zsb3dFbmdpbmUgewotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGFuIGV2ZW50IGNhbiBiZSBpbnZva2VkLgotICAgICAqIEBwYXJhbSB3b3JrZmxvd2FibGUgVGhlIHdvcmtmbG93YWJsZS4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3cgVGhlIHdvcmtmbG93IHNjaGVtYS4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gY2FuSW52b2tlKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUsIFdvcmtmbG93IHdvcmtmbG93LCBTdHJpbmcgZXZlbnQpCi0gICAgICAgICAgICB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIGFuIGV2ZW50LgotICAgICAqIEBwYXJhbSB3b3JrZmxvd2FibGUgVGhlIHdvcmtmbG93YWJsZS4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3cgVGhlIHdvcmtmbG93LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQuCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBpbnZva2UoV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSwgV29ya2Zsb3cgd29ya2Zsb3csIFN0cmluZyBldmVudCkKLSAgICAgICAgICAgIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvV29ya2Zsb3dFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvV29ya2Zsb3dFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjOGFlYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L1dvcmtmbG93RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93OwotCi0KLS8qKgotICogV29ya2Zsb3cgZXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgV29ya2Zsb3dFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIC8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgV29ya2Zsb3dFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV29ya2Zsb3dFeGNlcHRpb24uCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFdvcmtmbG93RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFdvcmtmbG93RXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIFdvcmtmbG93RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFdvcmtmbG93RXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIFdvcmtmbG93RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Xb3JrZmxvd01hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvV29ya2Zsb3dNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYzMyYjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9Xb3JrZmxvd01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93OwotCi0vKioKLSAqIE1hbmFnZXIgZm9yIHdvcmtmbG93IGlzc3Vlcy4gVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IKLSAqIHdvcmtmbG93LXJlbGF0ZWQgdGFza3MuIFlvdSBjYW4gc2FmZWx5IGludm9rZSBhbGwgbWV0aG9kcyBmb3Igbm9uLXdvcmtmbG93Ci0gKiBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogV29ya2Zsb3dNYW5hZ2VyLmphdmEgMTc5NzUxIDIwMDUtMDYtMDMgMDk6MTM6MzVaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtmbG93TWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXZhbG9uIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBXb3JrZmxvd01hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyBhIHdvcmtmbG93IGV2ZW50IG9uIGEgZG9jdW1lbnQuIFRoaXMgaXMgdGhlIHNhbWUgYXMKLSAgICAgKiA8Y29kZT5pbnZva2UoRG9jdW1lbnQsIFN0cmluZywgdHJ1ZSk8L2NvZGU+LgotICAgICAqIEBwYXJhbSB3b3JrZmxvd2FibGUgVGhlIHdvcmtmbG93YWJsZS4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgdGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBpbnZva2VkIGluIHRoZQotICAgICAqICAgICAgICAgICAgIGN1cnJlbnQgc2l0dWF0aW9uLgotICAgICAqLwotICAgIHZvaWQgaW52b2tlKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUsIFN0cmluZyBldmVudCkgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyBhIHdvcmtmbG93IGV2ZW50IG9uIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHdvcmtmbG93YWJsZSBUaGUgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGV2ZW50IFRoZSBuYW1lIG9mIHRoZSBldmVudC4KLSAgICAgKiBAcGFyYW0gZm9yY2UgSWYgdGhpcyBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBleGVjdXRpb24gaXMKLSAgICAgKiAgICAgICAgICAgIGZvcmNlZCwgd2hpY2ggbWVhbnMgYW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgd29ya2Zsb3dhYmxlIGluCi0gICAgICogICAgICAgICAgICB0aGUgc2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGV2ZW50LiBJZiBzZXQgdG8KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgbm9uLXN1cHBvcnRpbmcgZG9jdW1lbnRzIGFyZSBpZ25vcmVkLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgdGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBpbnZva2VkIGluIHRoZQotICAgICAqICAgICAgICAgICAgIGN1cnJlbnQgc2l0dWF0aW9uLgotICAgICAqLwotICAgIHZvaWQgaW52b2tlKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUsIFN0cmluZyBldmVudCwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGFuIGV2ZW50IGNhbiBiZSBpbnZva2VkIG9uIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHdvcmtmbG93YWJsZSBUaGUgd29ya2Zsb3dhYmxlLgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBjYW5JbnZva2UoV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSwgU3RyaW5nIGV2ZW50KTsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIHdvcmtmbG93YWJsZSBoYXMgYSB3b3JrZmxvdy4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3dhYmxlIFRoZSB3b3JrZmxvd2FibGUuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNXb3JrZmxvdyhXb3JrZmxvd2FibGUgd29ya2Zsb3dhYmxlKTsKLQotICAgIC8qKgotICAgICAqIFJlc29sdmVzIHRoZSB3b3JrZmxvdyBzY2hlbWEgb2YgYSB3b3JrZmxvd2FibGUuCi0gICAgICogQHBhcmFtIHdvcmtmbG93YWJsZSBUaGUgd29ya2Zsb3dhYmxlLgotICAgICAqIEByZXR1cm4gQSB3b3JrZmxvdyBzY2hlbWEuCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgaGFzIG5vIHdvcmtmbG93LgotICAgICAqLwotICAgIFdvcmtmbG93IGdldFdvcmtmbG93U2NoZW1hKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvV29ya2Zsb3dhYmxlLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L1dvcmtmbG93YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzM1ZmFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvV29ya2Zsb3dhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdzsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgd2hpY2ggY2FuIGJlIHdvcmtmbG93ZWQuCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtmbG93YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB2ZXJzaW9ucyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLgotICAgICAqLwotICAgIFZlcnNpb25bXSBnZXRWZXJzaW9ucygpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxhdGVzdCB2ZXJzaW9uLgotICAgICAqLwotICAgIFZlcnNpb24gZ2V0TGF0ZXN0VmVyc2lvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgdmVyc2lvbi4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3cgVGhlIHdvcmtmbG93LgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uLgotICAgICAqLwotICAgIHZvaWQgbmV3VmVyc2lvbihXb3JrZmxvdyB3b3JrZmxvdywgVmVyc2lvbiB2ZXJzaW9uKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBVUkkgdG8gcmVzb2x2ZSB0aGUgc2NoZW1hIGNvbmZpZ3VyYXRpb24gZnJvbS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0V29ya2Zsb3dTY2hlbWFVUkkoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL0RvY3VtZW50SGVscGVyLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3htbC9Eb2N1bWVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI3ZDU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL0RvY3VtZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci50b29scy5DYXRhbG9nUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVmFyaW91cyB1dGlsaXR5IG1ldGhvZHMgdG8gd29yayB3aXRoIEpBWFAuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEhlbHBlciB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5vbi12YWxpZGF0aW5nIGFuZCBuYW1lc3BhY2UtYXdhcmUgRG9jdW1lbnRCdWlsZGVyLgotICAgICAqIEByZXR1cm4gQSBuZXcgRG9jdW1lbnRCdWlsZGVyIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgY3JlYXRlQnVpbGRlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0KLSAgICAgICAgQ2F0YWxvZ1Jlc29sdmVyIGNyID0gbmV3IENhdGFsb2dSZXNvbHZlcigpOwotICAgICAgICBidWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGNyKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRvY3VtZW50LiBBIHhtbG5zOnByZWZpeD0ibmFtZXNwYWNlVXJpIiBhdHRyaWJ1dGUgaXMgYWRkZWQgdG8KLSAgICAgKiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgVVJMIG9mIHRoZSByb290IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUgVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGRvY3VtZW50VHlwZSBUaGUgdHlwZSBvZiBkb2N1bWVudCB0byBiZSBjcmVhdGVkIG9yIG51bGwuIFdoZW4KLSAgICAgKiAgICAgICAgICAgIGRvY3R5cGUgaXMgbm90IG51bGwsIGl0cyBOb2RlLm93bmVyRG9jdW1lbnQgYXR0cmlidXRlIGlzIHNldAotICAgICAqICAgICAgICAgICAgdG8gdGhlIGRvY3VtZW50IGJlaW5nIGNyZWF0ZWQuCi0gICAgICogQHJldHVybiBBIG5ldyBEb2N1bWVudCBvYmplY3QuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEBzZWUgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb24jY3JlYXRlRG9jdW1lbnQoU3RyaW5nLCBTdHJpbmcsCi0gICAgICogICAgICBEb2N1bWVudFR5cGUpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwKLSAgICAgICAgICAgIERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUpIHRocm93cyBET01FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQobmFtZXNwYWNlVXJpLAotICAgICAgICAgICAgICAgIHF1YWxpZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgZG9jdW1lbnRUeXBlKTsKLQotICAgICAgICAvLyBhZGQgeG1sbnM6cHJlZml4IGF0dHJpYnV0ZQotICAgICAgICBTdHJpbmcgbmFtZSA9ICJ4bWxucyI7Ci0gICAgICAgIGludCBpbmRleCA9IHF1YWxpZmllZE5hbWUuaW5kZXhPZigiOiIpOwotCi0gICAgICAgIGlmIChpbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICBuYW1lICs9ICgiOiIgKyBxdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwKLSAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVyaSk7Ci0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGEgZG9jdW1lbnQgZnJvbSBhIGZpbGUuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGxvYWQgdGhlIGRvY3VtZW50IGZyb20uCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCByZWFkRG9jdW1lbnQoRmlsZSBmaWxlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIoKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIucGFyc2UoZmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBkb2N1bWVudCBmcm9tIGEgVVJMLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgdG8gbG9hZCB0aGUgZG9jdW1lbnQgZnJvbS4KLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IHJlYWREb2N1bWVudChVUkwgdXJsKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIoKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIucGFyc2UodXJsLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGEgZG9jdW1lbnQgZnJvbSBhIFVSSS4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIGxvYWQgdGhlIGRvY3VtZW50IGZyb20uCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCByZWFkRG9jdW1lbnQoVVJJIHVyaSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKCk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnBhcnNlKHVyaS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBhIGRvY3VtZW50IGZyb20gYSBzdHJpbmcuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBsb2FkIHRoZSBkb2N1bWVudCBmcm9tLgotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgd2hpY2ggaXMgdXNlZCBieSB0aGUgc3RyaW5nLgotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcmVhZERvY3VtZW50KFN0cmluZyBzdHJpbmcsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKCk7Ci0gICAgICAgIGJ5dGUgYnl0ZXNbXSA9IHN0cmluZy5nZXRCeXRlcyhlbmNvZGluZyk7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnBhcnNlKHN0cmVhbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBkb2N1bWVudCBmcm9tIGFuIGlucHV0IHN0cmVhbS4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtIHRvIGxvYWQgdGhlIGRvY3VtZW50IGZyb20uCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCByZWFkRG9jdW1lbnQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIoKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIucGFyc2Uoc3RyZWFtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBkb2N1bWVudCB0byBhIGZpbGUuIEEgbmV3IGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIHNhdmUuCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gc2F2ZSB0aGUgZG9jdW1lbnQgdG8uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURvY3VtZW50KERvY3VtZW50IGRvY3VtZW50LCBGaWxlIGZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBzYW5pdHkgY2hlY2tzCi0gICAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCB1c2FnZSwgcGFyYW1ldGVyIGRvY3VtZW50IG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCB1c2FnZSwgcGFyYW1ldGVyIGZpbGUgbWF5IG5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCi0gICAgICAgIERPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50KTsKLSAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoZmlsZSk7Ci0gICAgICAgIGdldFRyYW5zZm9ybWVyKGRvY3VtZW50LmdldERvY3R5cGUoKSkudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBkb2N1bWVudCB0byBhIHdyaXRlci4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIHdyaXRlLgotICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciB0byB3cml0ZSB0aGUgZG9jdW1lbnQgdG8uCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCwgV3JpdGVyIHdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBzYW5pdHkgY2hlY2tzCi0gICAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCB1c2FnZSBvZiBEb2N1bWVudEhlbHBlcjo6d3JpdGVEb2N1bWVudCgpLCBwYXJhbWV0ZXIgZG9jdW1lbnQgbWF5IG5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpOwotICAgICAgICBnZXRUcmFuc2Zvcm1lcihkb2N1bWVudC5nZXREb2N0eXBlKCkpLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgZG9jdW1lbnQgdG8gYW4gb3V0cHV0IHN0cmVhbS4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIHdyaXRlLgotICAgICAqIEBwYXJhbSBvdXRwdXRTdHJlYW0gVGhlIHN0cmVhbSB0byB3cml0ZSB0aGUgZG9jdW1lbnQgdG8uCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBzYW5pdHkgY2hlY2tzCi0gICAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCB1c2FnZSBvZiBEb2N1bWVudEhlbHBlcjo6d3JpdGVEb2N1bWVudCgpLCBwYXJhbWV0ZXIgZG9jdW1lbnQgbWF5IG5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0VHJhbnNmb3JtZXIoZG9jdW1lbnQuZ2V0RG9jdHlwZSgpKS50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHJhbnNmb3JtZXIuCi0gICAgICogQHBhcmFtIGRvY3VtZW50VHlwZSB0aGUgZG9jdW1lbnQgdHlwZQotICAgICAqIEByZXR1cm4gYSB0cmFuc2Zvcm1lcgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgVHJhbnNmb3JtZXIgZ2V0VHJhbnNmb3JtZXIoRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSkKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLQotICAgICAgICBpZiAoZG9jdW1lbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudFR5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGRvY3VtZW50VHlwZS5nZXRQdWJsaWNJZCgpKTsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudFR5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0sIGRvY3VtZW50VHlwZS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdHlwZS4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRvY3VtZW50IHR5cGUuCi0gICAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBwdWJsaWMgaWRlbnRpZmllci4KLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZGVudGlmaWVyLgotICAgICAqIEByZXR1cm4gdGhlIGRvY3VtZW50IHR5cGUKLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQHNlZSBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbiNjcmVhdGVEb2N1bWVudFR5cGUoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50VHlwZSBjcmVhdGVEb2N1bWVudFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIoKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50VHlwZShxdWFsaWZpZWROYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgYW4gZWxlbWVudCB0aGF0IGJlbG9uZyB0byBhIGNlcnRhaW4KLSAgICAgKiBuYW1lc3BhY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdHMuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHBhcmVudCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVcmkgVGhlIG5hbWVzcGFjZSB0aGF0IHRoZSBjaGlsZGVuIG11c3QgYmVsb25nIHRvLgotICAgICAqIEByZXR1cm4gVGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEZpcnN0Q2hpbGQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlVXJpKSB7Ci0gICAgICAgIHJldHVybiBnZXRGaXJzdENoaWxkKGVsZW1lbnQsIG5hbWVzcGFjZVVyaSwgIioiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBiZWxvbmdzIHRvIGEgY2VydGFpbgotICAgICAqIG5hbWVzcGFjZSBhbmQgaGFzIGEgY2VydGFpbiBsb2NhbCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKiBleGlzdHMuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHBhcmVudCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVcmkgVGhlIG5hbWVzcGFjZSB0aGF0IHRoZSBjaGlsZGVuIG11c3QgYmVsb25nIHRvLgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGNoaWxkcmVuLgotICAgICAqIEByZXR1cm4gVGhlIGNoaWxkIGVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEZpcnN0Q2hpbGQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIEVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQsIG5hbWVzcGFjZVVyaSwgbG9jYWxOYW1lKTsKLQotICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuWzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNoaWxkIGVsZW1lbnRzIG9mIGFuIGVsZW1lbnQsIHJlZ2FyZGxlc3Mgb2YgdGhlIG5hbWVzcGFjZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcGFyZW50IGVsZW1lbnQuCi0gICAgICogQHJldHVybiBUaGUgY2hpbGQgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50W10gZ2V0Q2hpbGRyZW4oRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIExpc3QgY2hpbGRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXRQYXJlbnROb2RlKCkgPT0gZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKGNoaWxkcmVuLml0ZW0oaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChFbGVtZW50W10pIGNoaWxkRWxlbWVudHMudG9BcnJheShuZXcgRWxlbWVudFtjaGlsZEVsZW1lbnRzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNoaWxkIGVsZW1lbnRzIG9mIGFuIGVsZW1lbnQgdGhhdCBiZWxvbmcgdG8gYSBjZXJ0YWluCi0gICAgICogbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBwYXJlbnQgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgdGhhdCB0aGUgY2hpbGRlbiBtdXN0IGJlbG9uZyB0by4KLSAgICAgKiBAcmV0dXJuIFRoZSBjaGlsZCBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnRbXSBnZXRDaGlsZHJlbihFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2VVcmkpIHsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQsIG5hbWVzcGFjZVVyaSwgIioiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBjaGlsZCBlbGVtZW50cyBvZiBhbiBlbGVtZW50IHRoYXQgYmVsb25nIHRvIGEgY2VydGFpbgotICAgICAqIG5hbWVzcGFjZSBhbmQgaGF2ZSBhIGNlcnRhaW4gbG9jYWwgbmFtZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcGFyZW50IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVyaSBUaGUgbmFtZXNwYWNlIHRoYXQgdGhlIGNoaWxkZW4gbXVzdCBiZWxvbmcgdG8uCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgY2hpbGRyZW4uCi0gICAgICogQHJldHVybiBUaGUgY2hpbGQgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50W10gZ2V0Q2hpbGRyZW4oRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIExpc3QgY2hpbGRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobmFtZXNwYWNlVXJpLCBsb2NhbE5hbWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGNoaWxkcmVuLml0ZW0oaSkuZ2V0UGFyZW50Tm9kZSgpID09IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRzLmFkZChjaGlsZHJlbi5pdGVtKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoRWxlbWVudFtdKSBjaGlsZEVsZW1lbnRzLnRvQXJyYXkobmV3IEVsZW1lbnRbY2hpbGRFbGVtZW50cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGluc2lkZSBhbiBlbGVtZW50LiBPbmx5IHRoZSBjaGlsZCB0ZXh0IG5vZGVzIG9mIHRoaXMKLSAgICAgKiBlbGVtZW50IGFyZSBjb2xsZWN0ZWQuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQuCi0gICAgICogQHJldHVybiBUaGUgdGV4dCBpbnNpZGUgdGhlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlRWxlbWVudFRleHQoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2VzIGFsbCBjaGlsZCBub2RlcyBvZiBhbiBlbGVtZW50IGJ5IGEgc2luZ2xlIHRleHQgbm9kZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBpbnNlcnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFNpbXBsZUVsZW1lbnRUZXh0KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlIHRleHROb2RlID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGZvbGxvd2luZyBzaWJsaW5nIGVsZW1lbnRzIG9mIGFuIGVsZW1lbnQgdGhhdCBiZWxvbmcgdG8gYQotICAgICAqIGNlcnRhaW4gbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBwYXJlbnQgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgdGhhdCB0aGUgY2hpbGRlbiBtdXN0IGJlbG9uZyB0by4KLSAgICAgKiBAcmV0dXJuIFRoZSBmb2xsb3dpbmcgc2libGluZyBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnRbXSBnZXROZXh0U2libGluZ3MoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlVXJpKSB7Ci0gICAgICAgIHJldHVybiBnZXROZXh0U2libGluZ3MoZWxlbWVudCwgbmFtZXNwYWNlVXJpLCAiKiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGZvbGxvd2luZyBzaWJsaW5nIGVsZW1lbnRzIG9mIGFuIGVsZW1lbnQgdGhhdCBiZWxvbmcgdG8gYQotICAgICAqIGNlcnRhaW4gbmFtZXNwYWNlLiBhbmQgaGF2ZSBhIGNlcnRhaW4gbG9jYWwgbmFtZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcGFyZW50IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVyaSBUaGUgbmFtZXNwYWNlIHRoYXQgdGhlIGNoaWxkZW4gbXVzdCBiZWxvbmcgdG8uCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgY2hpbGRyZW4uCi0gICAgICogQHJldHVybiBUaGUgZm9sbG93aW5nIHNpYmxpbmcgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50W10gZ2V0TmV4dFNpYmxpbmdzKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZVVyaSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBMaXN0IGNoaWxkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEVsZW1lbnQgcGFyZW50ID0gKEVsZW1lbnQpIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihwYXJlbnQsIG5hbWVzcGFjZVVyaSwgbG9jYWxOYW1lKTsKLQotICAgICAgICBpbnQgbCA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBsID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpID4gbCkgewotICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKGNoaWxkcmVuW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoRWxlbWVudFtdKSBjaGlsZEVsZW1lbnRzLnRvQXJyYXkobmV3IEVsZW1lbnRbY2hpbGRFbGVtZW50cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBwcmVjZWRpbmcgc2libGluZyBlbGVtZW50cyBvZiBhbiBlbGVtZW50IHRoYXQgYmVsb25nIHRvIGEKLSAgICAgKiBjZXJ0YWluIG5hbWVzcGFjZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcGFyZW50IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVyaSBUaGUgbmFtZXNwYWNlIHRoYXQgdGhlIGNoaWxkZW4gbXVzdCBiZWxvbmcgdG8uCi0gICAgICogQHJldHVybiBUaGUgcHJlY2VkaW5nIHNpYmxpbmcgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50W10gZ2V0UHJlY2VkaW5nU2libGluZ3MoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlVXJpKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcmVjZWRpbmdTaWJsaW5ncyhlbGVtZW50LCBuYW1lc3BhY2VVcmksICIqIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgcHJlY2VkaW5nIHNpYmxpbmcgZWxlbWVudHMgb2YgYW4gZWxlbWVudCB0aGF0IGJlbG9uZyB0byBhCi0gICAgICogY2VydGFpbiBuYW1lc3BhY2UuIGFuZCBoYXZlIGEgY2VydGFpbiBsb2NhbCBuYW1lLgotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBwYXJlbnQgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgdGhhdCB0aGUgY2hpbGRlbiBtdXN0IGJlbG9uZyB0by4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBjaGlsZHJlbi4KLSAgICAgKiBAcmV0dXJuIFRoZSBwcmVjZWRpbmcgc2libGluZyBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnRbXSBnZXRQcmVjZWRpbmdTaWJsaW5ncyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2VVcmksCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIExpc3QgY2hpbGRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCkgZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIEVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHBhcmVudCwgbmFtZXNwYWNlVXJpLCBsb2NhbE5hbWUpOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGNoaWxkcmVuW2ldICE9IGVsZW1lbnQgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aCkgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQoY2hpbGRyZW5baV0pOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChFbGVtZW50W10pIGNoaWxkRWxlbWVudHMudG9BcnJheShuZXcgRWxlbWVudFtjaGlsZEVsZW1lbnRzLnNpemUoKV0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL05hbWVzcGFjZUhlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS94bWwvTmFtZXNwYWNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWYwNWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS94bWwvTmFtZXNwYWNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBBIE5hbWVzcGFjZUhlbHBlciBvYmplY3Qgc2ltcGxpZmllcyB0aGUgY3JlYXRpb24gb2YgZWxlbWVudHMgaW4gYSBjZXJ0YWluCi0gKiBuYW1lc3BhY2UuIEFsbCBlbGVtZW50cyBhcmUgb3duZWQgYnkgYSBkb2N1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUKLSAqIHtAbGluayAjTmFtZXNwYWNlSGVscGVyKFN0cmluZywgU3RyaW5nLCBEb2N1bWVudCl9IGNvbnN0cnVjdG9yIG9yIGNyZWF0ZWQKLSAqIHVzaW5nIHRoZSB7QGxpbmsgI05hbWVzcGFjZUhlbHBlcihTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0gY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VIZWxwZXIgewotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVyaTsKLSAgICBwcml2YXRlIFN0cmluZyBwcmVmaXg7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTmFtZXNwYWNlSGVscGVyIHVzaW5nIGFuIGV4aXN0aW5nIGRvY3VtZW50LiBUaGUKLSAgICAgKiBkb2N1bWVudCBpcyBub3QgYWZmZWN0ZWQuIElmIHRoZSBwcmVmaXggaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAqIGlzIHVzZWQuCi0gICAgICogQHBhcmFtIF9kb2N1bWVudCBUaGUgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIF9uYW1lc3BhY2VVcmkgVGhlIG5hbWVzcGFjZSBVUkkuCi0gICAgICogQHBhcmFtIF9wcmVmaXggVGhlIG5hbWVzcGFjZSBwcmVmaXguCi0gICAgICovCi0gICAgcHVibGljIE5hbWVzcGFjZUhlbHBlcihTdHJpbmcgX25hbWVzcGFjZVVyaSwgU3RyaW5nIF9wcmVmaXgsIERvY3VtZW50IF9kb2N1bWVudCkgewotCi0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJuYW1lc3BhY2UgVVJJIiwgX25hbWVzcGFjZVVyaSk7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJET00iLCBfZG9jdW1lbnQpOwotCi0gICAgICAgIHRoaXMubmFtZXNwYWNlVXJpID0gX25hbWVzcGFjZVVyaTsKLSAgICAgICAgdGhpcy5wcmVmaXggPSBfcHJlZml4OwotICAgICAgICB0aGlzLmRvY3VtZW50ID0gX2RvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTmFtZXNwYWNlSGVscGVyLiBBIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkCi0gICAgICogdXNpbmcgYSBkb2N1bWVudCBlbGVtZW50IGluIHRoZSBnaXZlbiBuYW1lc3BhY2Ugd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LiBJZgotICAgICAqIHRoZSBwcmVmaXggaXMgbnVsbCwgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGlzIHVzZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5hbWVzcGFjZUhlbHBlcigiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAic3ZnIiwgInN2ZyIpOjxici8+Ci0gICAgICogJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiZndDs8YnIvPiAmbHQ7c3ZnOnN2ZwotICAgICAqIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciJmd0Ozxici8+ICZsdDsvc3ZnOnN2ZyZndDsKLSAgICAgKiA8L3A+Ci0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gX25hbWVzcGFjZVVyaSBUaGUgbmFtZXNwYWNlIFVSSS4KLSAgICAgKiBAcGFyYW0gX3ByZWZpeCBUaGUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZAotICAgICAqLwotICAgIHB1YmxpYyBOYW1lc3BhY2VIZWxwZXIoU3RyaW5nIF9uYW1lc3BhY2VVcmksIFN0cmluZyBfcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzKF9uYW1lc3BhY2VVcmksIF9wcmVmaXgsIERvY3VtZW50SGVscGVyLmNyZWF0ZURvY3VtZW50KF9uYW1lc3BhY2VVcmksIGdldFF1YWxpZmllZE5hbWUoCi0gICAgICAgICAgICAgICAgX3ByZWZpeCwgbG9jYWxOYW1lKSwgbnVsbCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhpcyBOYW1lc3BhY2VIZWxwZXIuCi0gICAgICogQHJldHVybiBUaGUgbmFtZXNwYWNlIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlVXJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXggdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBlbGVtZW50cy4KLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lc3BhY2UgcHJlZml4LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIGEgbG9jYWwgbmFtZSB1c2luZyB0aGUgcHJlZml4IG9mIHRoaXMKLSAgICAgKiBOYW1lc3BhY2VIZWxwZXIuCi0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lLgotICAgICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lLCBpLmUuIHByZWZpeDpsb2NhbE5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXguZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYW4gZWxlbWVudCB3aXRoaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGlzIE5hbWVzcGFjZUhlbHBlciBvYmplY3QKLSAgICAgKiB3aXRoIGEgZ2l2ZW4gbG9jYWwgbmFtZSBjb250YWluaW5nIGEgdGV4dCBub2RlLjxici8+Ci0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIDxjb2RlPmNyZWF0ZUVsZW1lbnQoInRleHQiKTwvY29kZT46IDxjb2RlPiZsdDtwcmVmaXg6dGV4dC8mZ3Q7PGNvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgICAqIEByZXR1cm4gQSBuZXcgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKGdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgIGdldFF1YWxpZmllZE5hbWUoZ2V0UHJlZml4KCksIGxvY2FsTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYW4gZWxlbWVudCB3aXRoaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGlzIE5hbWVzcGFjZUhlbHBlciBvYmplY3QKLSAgICAgKiB3aXRoIGEgZ2l2ZW4gbG9jYWwgbmFtZSBjb250YWluaW5nIGEgdGV4dCBub2RlLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiA8Y29kZT5jcmVhdGVFbGVtZW50KCJ0ZXh0IiwgIkhlbGxvIFdvcmxkISIpPC9jb2RlPjoKLSAgICAgKiA8Y29kZT4mbHQ7cHJlZml4OnRleHQmZ3Q7SGVsbG8gV29ybGQhJmx0Oy9wcmVmaXg6dGV4dCZndDs8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IGZvciB0aGUgdGV4dCBub2RlIGluc2lkZSB0aGUgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IGVsZW1lbnQgY29udGFpbmluZyBhIHRleHQgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotCi0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNoaWxkcmVuIG9mIGFuIGVsZW1lbnQgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGlzCi0gICAgICogTmFtZXNwYWNlSGVscGVyLgotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBwYXJlbnQgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudFtdIGdldENoaWxkcmVuKEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCwgZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNoaWxkcmVuIG9mIGFuIGVsZW1lbnQgd2l0aCBhIGxvY2FsIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSBvZgotICAgICAqIHRoaXMgTmFtZXNwYWNlSGVscGVyLgotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBwYXJlbnQgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBjaGlsZHJlbiB0byByZXR1cm4uCi0gICAgICogQHJldHVybiB0aGUgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnRbXSBnZXRDaGlsZHJlbihFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmdldENoaWxkcmVuKGVsZW1lbnQsIGdldE5hbWVzcGFjZVVSSSgpLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkciBvZiBhbiBlbGVtZW50IHdpdGggYSBsb2NhbCBuYW1lIGluIHRoZSBuYW1lc3BhY2UKLSAgICAgKiBvZiB0aGlzIE5hbWVzcGFjZUhlbHBlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGV4aXN0cy4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcGFyZW50IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgY2hpbGRyZW4gdG8gcmV0dXJuLgotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IGdldEZpcnN0Q2hpbGQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5nZXRGaXJzdENoaWxkKGVsZW1lbnQsIGdldE5hbWVzcGFjZVVSSSgpLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgc2libGluZ3Mgb2YgYW4gZWxlbWVudCB3aXRoIGEgbG9jYWwgbmFtZSBpbiB0aGUKLSAgICAgKiBuYW1lc3BhY2Ugb2YgdGhpcyBOYW1lc3BhY2VIZWxwZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdHMuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHBhcmVudCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGNoaWxkcmVuIHRvIHJldHVybi4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHNpYmxpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50W10gZ2V0TmV4dFNpYmxpbmdzKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuZ2V0TmV4dFNpYmxpbmdzKGVsZW1lbnQsIGdldE5hbWVzcGFjZVVSSSgpLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWNlZGluZyBzaWJsaW5ncyBvZiBhbiBlbGVtZW50IHdpdGggYSBsb2NhbCBuYW1lIGluIHRoZQotICAgICAqIG5hbWVzcGFjZSBvZiB0aGlzIE5hbWVzcGFjZUhlbHBlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGV4aXN0cy4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcGFyZW50IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgY2hpbGRyZW4gdG8gcmV0dXJuLgotICAgICAqIEByZXR1cm4gdGhlIHByZWNlZGluZyBzaWJsaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudFtdIGdldFByZWNlZGluZ1NpYmxpbmdzKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuZ2V0UHJlY2VkaW5nU2libGluZ3MoZWxlbWVudCwgZ2V0TmFtZXNwYWNlVVJJKCksIGxvY2FsTmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBYTUwuCi0gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRIZWxwZXIud3JpdGVEb2N1bWVudChnZXREb2N1bWVudCgpLCBzdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3htbC9TY2hlbWEuamF2YSBiL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL1NjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODZjYTAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL1NjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS54bWw7Ci0KLS8qKgotICogVmFsaWRhdGlvbiBzY2hlbWEuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWEgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlLCBhcyBkZWZpbmVkIGJ5Ci0gICAgICogICAgICAgICAgICBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnZhbGlkYXRpb24uVmFsaWRhdG9yLgotICAgICAqIEBwYXJhbSBzY2hlbWFVcmkgVGhlIHNjaGVtYSBVUkkuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnZhbGlkYXRpb24uVmFsaWRhdG9yCi0gICAgICovCi0gICAgcHVibGljIFNjaGVtYShTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBzY2hlbWFVcmkpIHsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgICAgICB0aGlzLnVyaSA9IHNjaGVtYVVyaTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxhbmd1YWdlLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy52YWxpZGF0aW9uLlZhbGlkYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIFVSSSB0byByZWFkIHRoZSBzY2hlbWEgZnJvbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXJpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL1ZhbGlkYXRpb25VdGlsLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3htbC9WYWxpZGF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2VhMDJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL1ZhbGlkYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLnhtbC5kb20uRE9NU3RyZWFtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotCi0vKioKLSAqIFZhbGlkYXRpb24gdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25VdGlsIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byB2YWxpZGF0ZS4KLSAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgU0FYIGVycm9yIGhhbmRsZXIuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBEb2N1bWVudCBkb2N1bWVudCwgRXJyb3JIYW5kbGVyIGhhbmRsZXIpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCB4bWxEb2MgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoZG9jdW1lbnQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgIHZhbGlkYXRlKG1hbmFnZXIsIHhtbERvYywgZG9jdW1lbnQuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0U2NoZW1hKCksIGhhbmRsZXIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0geG1sRG9jIFRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHNjaGVtYSBUaGUgc2NoZW1hIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgU0FYIGVycm9yIGhhbmRsZXIuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBvcmcudzNjLmRvbS5Eb2N1bWVudCB4bWxEb2MsIFNjaGVtYSBzY2hlbWEsCi0gICAgICAgICAgICBFcnJvckhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yKSBtYW5hZ2VyLmxvb2t1cChWYWxpZGF0b3IuUk9MRSk7Ci0gICAgICAgICAgICBDb250ZW50SGFuZGxlciB2YWxpZGF0b3JIYW5kbGVyID0gdmFsaWRhdG9yLmdldFZhbGlkYXRpb25IYW5kbGVyKHNjaGVtYS5nZXRVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcik7Ci0KLSAgICAgICAgICAgIERPTVN0cmVhbWVyIHN0cmVhbWVyID0gbmV3IERPTVN0cmVhbWVyKHZhbGlkYXRvckhhbmRsZXIpOwotICAgICAgICAgICAgc3RyZWFtZXIuc3RyZWFtKHhtbERvYyk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZSh2YWxpZGF0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3htbC9YTGluay5qYXZhIGIvdHJ1bmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS94bWwvWExpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyNTcwMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3htbC9YTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEueG1sOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgWExpbmtzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTGluayB7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT50eXBlPC9jb2RlPiBUaGUgWGxpbmsgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdHlwZSA9IG51bGw7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+aHJlZjwvY29kZT4gVGhlIFhMaW5rIGhyZWYKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGhyZWYgPSBudWxsOwotICAgIC8qKgotICAgICAqIDxjb2RlPnNob3c8L2NvZGU+IFRoZSB2YWx1ZSBvZiB0aGUgc2hvdyBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNob3cgPSBudWxsOwotICAgIC8qKgotICAgICAqIDxjb2RlPm5hbWU8L2NvZGU+IFRoZSBYbGluayBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5lbGVtZW50PC9jb2RlPiBUaGUgWGxpbmsgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgIC8qKgotICAgICAqIDxjb2RlPlhMSU5LX05BTUVTUEFDRTwvY29kZT4gVGhlIFhMaW5rIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhMSU5LX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5BVFRSSUJVVEVfSFJFRjwvY29kZT4gVGhlIGhyZWYgYXR0cmlidGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSFJFRiA9ICJocmVmIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5BVFRSSUJVVEVfU0hPVzwvY29kZT4gVGhlIHNob3cgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1NIT1cgPSAic2hvdyI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+QVRUUklCVVRFX1RZUEU8L2NvZGU+IFRoZSB0eXBlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFID0gInR5cGUiOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgWExpbmsoKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9ICJzaW1wbGUiOwotICAgICAgICB0aGlzLnNob3cgPSAidW5kZWZpbmVkIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBfZWxlbWVudCBUaGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBYTGluayhFbGVtZW50IF9lbGVtZW50KSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gX2VsZW1lbnQ7Ci0KLSAgICAgICAgdGhpcy5uYW1lID0gX2VsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQotICAgICAgICBBdHRyIGhyZWZBdHRyaWJ1dGUgPSBfZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlTlMoWExJTktfTkFNRVNQQUNFLCBBVFRSSUJVVEVfSFJFRik7Ci0gICAgICAgIGlmIChocmVmQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuaHJlZiA9IGhyZWZBdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQXR0ciB0eXBlQXR0cmlidXRlID0gX2VsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZU5TKFhMSU5LX05BTUVTUEFDRSwgQVRUUklCVVRFX1RZUEUpOwotICAgICAgICBpZiAodHlwZUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlQXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIEF0dHIgc2hvd0F0dHJpYnV0ZSA9IF9lbGVtZW50LmdldEF0dHJpYnV0ZU5vZGVOUyhYTElOS19OQU1FU1BBQ0UsIEFUVFJJQlVURV9TSE9XKTsKLSAgICAgICAgaWYgKHNob3dBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5zaG93ID0gc2hvd0F0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByaW50b3V0IG9mIHRoZSBYTGluayB2YWx1ZXMKLSAgICAgKiBAcmV0dXJuIFRoZSBwcmludG91dAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiWExpbms6IHR5cGU9XCIiCi0gICAgICAgICAgICArIHRoaXMudHlwZQotICAgICAgICAgICAgKyAiXCIsIGhyZWY9XCIiCi0gICAgICAgICAgICArIHRoaXMuaHJlZgotICAgICAgICAgICAgKyAiXCIsIHNob3c9XCIiCi0gICAgICAgICAgICArIHRoaXMuc2hvdwotICAgICAgICAgICAgKyAiXCIsIG5hbWU9XCIiCi0gICAgICAgICAgICArIHRoaXMubmFtZQotICAgICAgICAgICAgKyAiXCIiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL1hQYXRoLmphdmEgYi90cnVuay9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL3htbC9YUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGFiNzllLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEveG1sL1hQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIFhQYXRoIG9wZXJhdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIFhQYXRoIHsKLSAgICBTdHJpbmcgeHBhdGggPSBudWxsOwotICAgIFN0cmluZ1tdIHBhcnRzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIF94cGF0aCBUaGUgWHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgWFBhdGgoU3RyaW5nIF94cGF0aCkgewotICAgICAgICB0aGlzLnhwYXRoID0gX3hwYXRoOwotCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoX3hwYXRoLCAiLyIpOwotICAgICAgICBpbnQgbGVuZ3RoID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgdGhpcy5wYXJ0cyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcnRzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBhcmVudCBwYXRoCi0gICAgICogQHJldHVybiBUaGUgcGFyZW50IHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgWFBhdGggZ2V0UGFyZW50KCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHRoaXMucGFydHMubGVuZ3RoIC0gMSk7IGkrKykgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgiLyIgKyB0aGlzLnBhcnRzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgWFBhdGgoYnVmLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHlwZSBvZiBhIG5vZGUuIE9ubHkgc3VwcG9ydHMgYXR0cmlidXRlIGFuZCBlbGVtZW50IG5vZGVzCi0gICAgICogQHJldHVybiBUaGUgbm9kZSB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0gICAgICAgIGlmICh0aGlzLnBhcnRzW3RoaXMucGFydHMubGVuZ3RoIC0gMV0uaW5kZXhPZigiQCIpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOb2RlLkFUVFJJQlVURV9OT0RFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOb2RlLkVMRU1FTlRfTk9ERTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFhQYXRoCi0gICAgICogQHJldHVybiBUaGUgWHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGhpcy54cGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICBpZiAoZ2V0VHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnRzW3RoaXMucGFydHMubGVuZ3RoIC0gMV0uc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcnRzW3RoaXMucGFydHMubGVuZ3RoIC0gMV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50Ci0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIGlmIChnZXRUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFydHNbdGhpcy5wYXJ0cy5sZW5ndGggLSAyXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5wYXJ0c1t0aGlzLnBhcnRzLmxlbmd0aCAtIDFdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSB3aXRob3V0IHByZWRpY2F0ZXMKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIHdpdGhvdXQgcHJlZGljYXRlcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZVdpdGhvdXRQcmVkaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gcmVtb3ZlUHJlZGljYXRlcyhnZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBwcmVkaWNhdGVzIChzcXVhcmUgYnJhY2tldHMpLCBodHRwOi8vd3d3LnczLm9yZy9UUi94cGF0aAotICAgICAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gcmVtb3ZlIHByZWRpY2F0ZXMgZnJvbQotICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyB3aXRob3V0IHByZWRpY2F0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlbW92ZVByZWRpY2F0ZXMoU3RyaW5nIHMpIHsKLSAgICAgICAgaW50IGluZGV4ID0gcy5pbmRleE9mKCJbIik7Ci0KLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2NvbmZpZy9jb2Nvb24teGNvbmYvYWNjZXNzLWNvbnRyb2wtaW5wdXQtbW9kdWxlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9jb25maWcvY29jb29uLXhjb25mL2FjY2Vzcy1jb250cm9sLWlucHV0LW1vZHVsZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiYWJjZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2NvbmZpZy9jb2Nvb24teGNvbmYvYWNjZXNzLWNvbnRyb2wtaW5wdXQtbW9kdWxlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWNjZXNzLWNvbnRyb2wnXSI+DQotICA8Y29tcG9uZW50LWluc3RhbmNlIGxvZ2dlcj0iY29yZS5tb2R1bGVzLmlucHV0LmFjY2Vzcy1jb250cm9sIiBuYW1lPSJhY2Nlc3MtY29udHJvbCINCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuQWNjZXNzQ29udHJvbE1vZHVsZSIvPg0KLTwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9jb25maWcvY29jb29uLXhjb25mL2FjY2Vzcy1jb250cm9sbGVyLXJlc29sdmVycy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9hY2Nlc3MtY29udHJvbGxlci1yZXNvbHZlcnMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZmU5MTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9jb25maWcvY29jb29uLXhjb25mL2FjY2Vzcy1jb250cm9sbGVyLXJlc29sdmVycy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9hY2Nlc3MtY29udHJvbGxlci1yZXNvbHZlcnMiPg0KLSAgPGFjY2Vzcy1jb250cm9sbGVyLXJlc29sdmVycz4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJwdWJsaWNhdGlvbiINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUHVibGljYXRpb25BY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIiDQotICAgICAgbG9nZ2VyPSJsZW55YS5hYy5hY2Nlc3Njb250cm9sbGVycmVzb2x2ZXIucHVibGljYXRpb24iPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJnbG9iYWwiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5Db25maWd1cmFibGVBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIiDQotICAgICAgbG9nZ2VyPSJsZW55YS5hYy5hY2Nlc3Njb250cm9sbGVycmVzb2x2ZXIuZ2xvYmFsIj4NCi0gICAgICA8YWNjZXNzLWNvbnRyb2xsZXIgdHlwZT0iZ2xvYmFsIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImNvbXBvc2FibGUiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5Db21wb3NhYmxlQWNjZXNzQ29udHJvbGxlclJlc29sdmVyIg0KLSAgICAgIGxvZ2dlcj0ibGVueWEuYWMuYWNjZXNzY29udHJvbGxlcnJlc29sdmVyLmNvbXBvc2FibGUiPg0KLSAgICAgIDxyZXNvbHZlciB0eXBlPSJwdWJsaWNhdGlvbiIvPg0KLSAgICAgIDwhLS0gICAgICA8cmVzb2x2ZXIgdHlwZT0iZ2xvYmFsIi8+LS0+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC9hY2Nlc3MtY29udHJvbGxlci1yZXNvbHZlcnM+DQotPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2NvbmZpZy9jb2Nvb24teGNvbmYvYWNjcmVkaXRhYmxlLW1hbmFnZXItZmFjdG9yeS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9hY2NyZWRpdGFibGUtbWFuYWdlci1mYWN0b3J5Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmY0ZTEyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9hY2NyZWRpdGFibGUtbWFuYWdlci1mYWN0b3J5Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL2NvbXBvbmVudFtAcm9sZSA9ICdvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5J10iPgotICA8Y29tcG9uZW50IGxvZ2dlcj0ibGVueWEuYWMuYWNjcmVkaXRhYmxlbWFuYWdlciIKLSAgICByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5IgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5Ii8+DQotPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2NvbmZpZy9jb2Nvb24teGNvbmYvYXV0aGVudGljYXRvci54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9hdXRoZW50aWNhdG9yLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJmNGMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9hdXRoZW50aWNhdG9yLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL2NvbXBvbmVudFtAcm9sZSA9ICdvcmcuYXBhY2hlLmxlbnlhLmFjLkF1dGhlbnRpY2F0b3InXSI+DQotICA8Y29tcG9uZW50IGxvZ2dlcj0ibGVueWEuYWMuYXV0aGVudGljYXRvciINCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5Vc2VyQXV0aGVudGljYXRvciINCi0gICAgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5hYy5BdXRoZW50aWNhdG9yIi8+DQotICAgIA0KLSAgPCEtLQ0KLSAgICBFbmFibGUgdGhpcyBhdXRoZW50aWNhdG9yIGFuZCBkaXNhYmxlIHRoZSBVc2VyQXV0aGVudGljYXRvciBmb3IgYW5vbnltb3VzIGF1dGhlbnRpY2F0aW9uICh1c2VmdWwgZm9yIGNsaWVudCBjZXJ0cywgZm9yIGluc3RhbmNlKQ0KLSAgICANCi0gICAgPGNvbXBvbmVudCBsb2dnZXI9ImxlbnlhLmFjLmF1dGhlbnRpY2F0b3IiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5Bbm9ueW1vdXNBdXRoZW50aWNhdG9yIg0KLSAgICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEuYWMuQXV0aGVudGljYXRvciIvPiAgICAgIA0KLSAgLS0+DQotICANCi08L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9hdXRob3JpemVycy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9hdXRob3JpemVycy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0Mzc3MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2NvbmZpZy9jb2Nvb24teGNvbmYvYXV0aG9yaXplcnMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vYXV0aG9yaXplcnMiPg0KLSAgPGF1dGhvcml6ZXJzLz4NCi08L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9ieXBhc3NhYmxlLWFjY2Vzcy1jb250cm9sbGVyLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9jb25maWcvY29jb29uLXhjb25mL2J5cGFzc2FibGUtYWNjZXNzLWNvbnRyb2xsZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWE2NTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9jb25maWcvY29jb29uLXhjb25mL2J5cGFzc2FibGUtYWNjZXNzLWNvbnRyb2xsZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlci9ieXBhc3NhYmxlJ10iPg0KLSAgPGNvbXBvbmVudCBsb2dnZXI9ImxlbnlhLmFjLmFjY2Vzc2NvbnRyb2xsZXIuYnlwYXNzYWJsZSINCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5CeXBhc3NhYmxlQWNjZXNzQ29udHJvbGxlciINCi0gICAgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyL2J5cGFzc2FibGUiPgotICAgIAotICAgIDxwdWJsaWMtZXh0ZW5zaW9ucz5jc3MsanBnLGdpZixwbmcscm5nLHhzbDwvcHVibGljLWV4dGVuc2lvbnM+Ci0gICAgCi0gICAgPCEtLSBiYWQgcGVyZm9ybWFuY2UsIHVzZSBvbmx5IGZvciBjb21wbGV4IHBhdHRlcm5zCi0gICAgICA8cHVibGljPi4qWy5dY3NzfC4qWy5danBnfC4qWy5dZ2lmfC4qWy5dcG5nfC4qWy5dcm5nfC4qWy5deHNsPC9wdWJsaWM+Ci0gICAgLS0+Ci0gICAgCi0gIDwvY29tcG9uZW50Pg0KLTwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9jb25maWcvY29jb29uLXhjb25mL3BvbGljeS1tYW5hZ2Vycy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL2NvY29vbi14Y29uZi9wb2xpY3ktbWFuYWdlcnMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTNiMDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9jb25maWcvY29jb29uLXhjb25mL3BvbGljeS1tYW5hZ2Vycy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9wb2xpY3ktbWFuYWdlcnMiPg0KLSAgPHBvbGljeS1tYW5hZ2Vycz4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJkb2N1bWVudCINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuRG9jdW1lbnRQb2xpY3lNYW5hZ2VyV3JhcHBlciINCi0gICAgICBsb2dnZXI9ImxlbnlhLmFjLnBvbGljeW1hbmFnZXIuZG9jdW1lbnQiLz4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJmaWxlIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZVBvbGljeU1hbmFnZXIiDQotICAgICAgbG9nZ2VyPSJsZW55YS5hYy5wb2xpY3ltYW5hZ2VyLmZpbGUiLz4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJzaXRlbWFwIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy5TaXRlbWFwUG9saWN5TWFuYWdlciINCi0gICAgICBsb2dnZXI9ImxlbnlhLmFjLnBvbGljeW1hbmFnZXIuc2l0ZW1hcCIvPg0KLSAgPC9wb2xpY3ktbWFuYWdlcnM+DQotICANCi08L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjljMWU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5hYzwvaWQ+Ci0gIDxleHBvcnQgcGFja2FnZT0ib3JnLmFwYWNoZS5sZW55YS5hYy5maWxlIi8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmNhY2hlIi8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmxpbmtpbmciLz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5BY2Nlc3MgY29udHJvbDwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+QWNjZXNzIGNvbnRyb2w8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2NvbmZpZy9zaXRlbWFwL2FjdGlvbnMueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL3NpdGVtYXAvYWN0aW9ucy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU4NzI5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvY29uZmlnL3NpdGVtYXAvYWN0aW9ucy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogYWN0aW9ucy54bWFwIDI4MDA2MCAyMDA1LTA5LTExIDAxOjU2OjMxWiBjaGVzdG51dCAkICAtLT4KLQotPHhtYXAgeHBhdGg9Ii9zaXRlbWFwL2NvbXBvbmVudHMvYWN0aW9ucyIgdW5sZXNzPSIvc2l0ZW1hcC9jb21wb25lbnRzL2FjdGlvbnMvYWN0aW9uW0BuYW1lID0gJ2F1dGhlbnRpY2F0b3InXSIKLSAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICA8bWFwOmFjdGlvbiBuYW1lPSJhdXRoZW50aWNhdG9yIiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3RpbmcuRGVsZWdhdGluZ0F1dGhlbnRpY2F0b3JBY3Rpb24iIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC5hY3Rpb24uYXV0aGVudGljYXRvciIvPgotICA8bWFwOmFjdGlvbiBuYW1lPSJhdXRob3JpemVyIiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3RpbmcuRGVsZWdhdGluZ0F1dGhvcml6ZXJBY3Rpb24iIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC5hY3Rpb24uYXV0aG9yaXplciIvPgotICA8bWFwOmFjdGlvbiBuYW1lPSJzc2wtcmVkaXJlY3QiIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZy5Tc2xSZWRpcmVjdEFjdGlvbiIgbG9nZ2VyPSJsZW55YS5zaXRlbWFwLmFjdGlvbi5zc2wtcmVkaXJlY3QiLz4KLTwveG1hcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvY2lmcy9DSUZTVXNlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2NpZnMvQ0lGU1VzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4Zjg5OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvY2lmcy9DSUZTVXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCi0gKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICogIAotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5jaWZzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLQotaW1wb3J0IGpjaWZzLnNtYi5OdGxtUGFzc3dvcmRBdXRoZW50aWNhdGlvbjsKLWltcG9ydCBqY2lmcy5zbWIuU21iQXV0aEV4Y2VwdGlvbjsKLWltcG9ydCBqY2lmcy5zbWIuU21iRXhjZXB0aW9uOwotaW1wb3J0IGpjaWZzLnNtYi5TbWJTZXNzaW9uOwotCi1pbXBvcnQgamNpZnMuVW5pQWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDSUZTIHVzZXIuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDSUZTVXNlciBleHRlbmRzIEZpbGVVc2VyIHsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBkZWZhdWx0UHJvcGVydGllcyA9IG51bGw7Ci0KLSAgICAvLyBUaGUgbmFtZSBmb3IgdGhlIGNpZnMucHJvcGVydGllcyBkb21haW4gY29udHJvbGxlciBsb29rdXAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOX0NPTlRST0xMRVIgPSAiZG9tYWluLWNvbnRyb2xsZXIiOwotCi0gICAgLy8gVGhlIG5hbWUgZm9yIHRoZSBjaWZzLnByb3BlcnRpZXMgZG9tYWluIG5hbWUgbG9va3VwCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPTUFJTiA9ICJkb21haW4iOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBDSUZTVXNlciBvYmplY3QuCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBDSUZTVXNlcihJdGVtTWFuYWdlciBpdGVtTWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBzdXBlcihpdGVtTWFuYWdlciwgbG9nZ2VyKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIENJRlNVc2VyCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEBwYXJhbSBpZCBUaGUgdXNlciBJRC4KLSAgICAgKiBAcGFyYW0gZnVsbE5hbWUgVGhlIHVzZXIncyBuYW1lLgotICAgICAqIEBwYXJhbSBlbWFpbCBUaGUgZS1tYWlsIGFkZHJlc3MuCi0gICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ0lGU1VzZXIoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIsIFN0cmluZyBpZCwgU3RyaW5nIGZ1bGxOYW1lLAotICAgICAgICAgICAgU3RyaW5nIGVtYWlsLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlciwgaWQsIGZ1bGxOYW1lLCBlbWFpbCwgcGFzc3dvcmQpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhpcyB1c2VyLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkUHJvcGVydGllcyhzdXBlci5nZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCkpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJSZWFkaW5nIGNpZnMucHJvcGVydGllcyBmaWxlIGluIFsiCi0gICAgICAgICAgICAgICAgICAgICsgc3VwZXIuZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpICsgIl0gZmFpbGVkIiwgaW9lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDSUZTVXNlciBmcm9tIGEgY29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IHNwZWNpZnlpbmcgdGhlIHVzZXIKLSAgICAgKiAgICAgICAgZGV0YWlscwotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgdXNlciBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZShjb25maWcpOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0aGVudGljYXRlIGEgdXNlci4gVGhpcyBpcyBkb25lIGJ5IE5URG9tYWluIEF1dGhlbnRpY2F0aW9uIHVzaW5nIGpjaWZzCi0gICAgICogQHBhcmFtIHBhc3N3b3JkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBwYXNzd29yZCBtYXRjaGVzIHRoZSBwYXNzd29yZCBmb3IgdGhpcyB1c2VyCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKFN0cmluZyBwYXNzd29yZCkgewotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamNpZnMuc21iLmNsaWVudC5kaXNhYmxlUGxhaW5UZXh0UGFzc3dvcmRzIiwgInRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVuaUFkZHJlc3MgbXlkb21haW5jb250cm9sbGVyID0gVW5pQWRkcmVzcy5nZXRCeU5hbWUoZ2V0RG9tYWluQ29udHJvbGxlcigpKTsKLSAgICAgICAgICAgIE50bG1QYXNzd29yZEF1dGhlbnRpY2F0aW9uIG15Y3JlZHMgPSBuZXcgTnRsbVBhc3N3b3JkQXV0aGVudGljYXRpb24oZ2V0RG9tYWluTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBzdXBlci5nZXRJZCgpLCBwYXNzd29yZCk7Ci0gICAgICAgICAgICBTbWJTZXNzaW9uLmxvZ29uKG15ZG9tYWluY29udHJvbGxlciwgbXljcmVkcyk7Ci0gICAgICAgICAgICAvLyBTVUNDRVNTCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgU21iQXV0aEV4Y2VwdGlvbiBzYWUpIHsKLSAgICAgICAgICAgIC8vIEFVVEhFTlRJQ0FUSU9OIEZBSUxVUkUKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0luZm9FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIGFnYWluc3QgWyIgKyBnZXREb21haW5Db250cm9sbGVyKCkgKyAiXSIgKyAiIGZhaWxlZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldERvbWFpbk5hbWUoKSArICIvIiArIHN1cGVyLmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBTbWJFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgIC8vIE5FVFdPUksgUFJPQkxFTVM/Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVua25vd25Ib3N0RXhjZXB0aW9uIHVuaG8pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgcHJvcGVydGllcwotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uRGlyZWN0b3J5IFRoZSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZFByb3BlcnRpZXMoRmlsZSBjb25maWd1cmF0aW9uRGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBjcmVhdGUgYW5kIGxvYWQgZGVmYXVsdCBwcm9wZXJ0aWVzCi0gICAgICAgIEZpbGUgcHJvcGVydGllc0ZpbGUgPSBuZXcgRmlsZShjb25maWd1cmF0aW9uRGlyZWN0b3J5LCAiY2lmcy5wcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRQcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BlcnRpZXNGaWxlKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0UHJvcGVydGllcy5sb2FkKGluKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZG9tYWluIGNvbnRyb2xsZXIgd2Ugd2FudCB0byBhdXRoZW50aWNhdGUgYWdhaW5zdAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRvbWFpbiBjb250cm9sbGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RG9tYWluQ29udHJvbGxlcigpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGRlZmF1bHRQcm9wZXJ0aWVzLmdldChET01BSU5fQ09OVFJPTExFUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkb21haW4gbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGRvbWFpbiBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RG9tYWluTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGRlZmF1bHRQcm9wZXJ0aWVzLmdldChET01BSU4pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVBY2NyZWRpdGFibGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzNjZjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24udXRpbC5OZXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JUFJhbmdlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2NyZWRpdGFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogRmlsZS1iYXNlZCBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVBY2NyZWRpdGFibGVNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RBY2NyZWRpdGFibGVNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRmlsZUFjY2Vzc0NvbnRyb2xsZXIgYmFzZWQgb24gYSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvblVyaSBUaGUgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgVVJJLgotICAgICAqIEBwYXJhbSBfdXNlclR5cGVzIFRoZSBzdXBwb3J0ZWQgdXNlciB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXIoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgTG9nZ2VyIGxvZ2dlciwKLSAgICAgICAgICAgIFN0cmluZyBjb25maWd1cmF0aW9uVXJpLCBVc2VyVHlwZVtdIF91c2VyVHlwZXMpIHsKLSAgICAgICAgc3VwZXIobG9nZ2VyKTsKLQotICAgICAgICBBc3NlcnQubm90TnVsbCgic2VydmljZSBtYW5hZ2VyIiwgbWFuYWdlcik7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0KLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IiwgY29uZmlndXJhdGlvblVyaSk7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkRpcmVjdG9yeVVyaSA9IGNvbmZpZ3VyYXRpb25Vcmk7Ci0KLSAgICAgICAgdGhpcy51c2VyVHlwZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KF91c2VyVHlwZXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY29uZmlndXJhdGlvbkRpcmVjdG9yeTsKLSAgICBwcml2YXRlIFNldCB1c2VyVHlwZXM7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgdXNlciB0eXBlcy4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHVzZXIgdHlwZXMuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlclR5cGVbXSBnZXRVc2VyVHlwZXMoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLnVzZXJUeXBlcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIlVzZXIgdHlwZXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiAoVXNlclR5cGVbXSkgdGhpcy51c2VyVHlwZXMudG9BcnJheShuZXcgVXNlclR5cGVbdGhpcy51c2VyVHlwZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0gICAgICogQHJldHVybiBUaGUgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uRGlyZWN0b3J5ID09IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbkRpcmVjdG9yeVVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IG5vdCBzZXQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICAgICAgRmlsZSBkaXJlY3Rvcnk7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ29uZmlndXJhdGlvbiBkaXJlY3RvcnkgUGF0aDogWyIgKyB0aGlzLmNvbmZpZ3VyYXRpb25EaXJlY3RvcnlVcmkgKyAiXSIpOwotCi0gICAgICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIGdldE1hbmFnZXIoKS5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSSh0aGlzLmNvbmZpZ3VyYXRpb25EaXJlY3RvcnlVcmkpOwotCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IFVSSTogIiArIHNvdXJjZS5nZXRVUkkoKSk7Ci0gICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gbmV3IEZpbGUobmV3IFVSSShOZXRVdGlscy5lbmNvZGVQYXRoKHNvdXJjZS5nZXRVUkkoKSkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25EaXJlY3RvcnkgPSBkaXJlY3Rvcnk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uRGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8vIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VU0VSX1RZUEVfQ0xBU1MgPSBGaWxlVXNlci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VU0VSX1RZUEVfS0VZID0gIkxvY2FsIFVzZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUl9DUkVBVEVfVVNFX0NBU0UgPSAidXNlckFkZFVzZXIiOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB1c2VyIHR5cGUuCi0gICAgICogQHJldHVybiBBIHVzZXIgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFVzZXJUeXBlIGdldERlZmF1bHRVc2VyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVc2VyVHlwZShERUZBVUxUX1VTRVJfVFlQRV9LRVksIERFRkFVTFRfVVNFUl9UWVBFX0NMQVNTLAotICAgICAgICAgICAgICAgIERFRkFVTFRfVVNFUl9DUkVBVEVfVVNFX0NBU0UpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbmZpZ3VyYXRpb25EaXJlY3RvcnlVcmk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY3JlZGl0YWJsZU1hbmFnZXIjaW5pdGlhbGl6ZUdyb3VwTWFuYWdlcigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEdyb3VwTWFuYWdlciBpbml0aWFsaXplR3JvdXBNYW5hZ2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBGaWxlR3JvdXBNYW5hZ2VyIF9tYW5hZ2VyID0gRmlsZUdyb3VwTWFuYWdlci5pbnN0YW5jZSh0aGlzLCBnZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCksCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkpOwotICAgICAgICByZXR1cm4gX21hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2NyZWRpdGFibGVNYW5hZ2VyI2luaXRpYWxpemVJUFJhbmdlTWFuYWdlcigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElQUmFuZ2VNYW5hZ2VyIGluaXRpYWxpemVJUFJhbmdlTWFuYWdlcigpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlQUmFuZ2VNYW5hZ2VyIF9tYW5hZ2VyID0gRmlsZUlQUmFuZ2VNYW5hZ2VyLmluc3RhbmNlKHRoaXMsCi0gICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIHJldHVybiBfbWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY3JlZGl0YWJsZU1hbmFnZXIjaW5pdGlhbGl6ZVJvbGVNYW5hZ2VyKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUm9sZU1hbmFnZXIgaW5pdGlhbGl6ZVJvbGVNYW5hZ2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBGaWxlUm9sZU1hbmFnZXIgX21hbmFnZXIgPSBGaWxlUm9sZU1hbmFnZXIuaW5zdGFuY2UodGhpcywgZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpKTsKLSAgICAgICAgcmV0dXJuIF9tYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjcmVkaXRhYmxlTWFuYWdlciNpbml0aWFsaXplVXNlck1hbmFnZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBVc2VyTWFuYWdlciBpbml0aWFsaXplVXNlck1hbmFnZXIoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVVc2VyTWFuYWdlciBfbWFuYWdlciA9IEZpbGVVc2VyTWFuYWdlci5pbnN0YW5jZSh0aGlzLCBnZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCksCi0gICAgICAgICAgICAgICAgZ2V0VXNlclR5cGVzKCksIGdldExvZ2dlcigpKTsKLSAgICAgICAgcmV0dXJuIF9tYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbkNvbGxlY3Rpb25VcmkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gImZpbGU6Ly8iICsgZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFzc2VydC5ub3ROdWxsKCJjb25maWd1cmF0aW9uIGRpcmVjdG9yeSIsIHRoaXMuZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVBY2NyZWRpdGFibGVNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTMwOTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay50aHJlYWQuVGhyZWFkU2FmZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXJUeXBlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGZpbGUtYmFzZWQgYWNjcmVkaXRhYmxlIG1hbmFnZXJzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMKLSAgICAgICAgQWNjcmVkaXRhYmxlTWFuYWdlckZhY3RvcnksIFRocmVhZFNhZmUsIFNlcnZpY2VhYmxlIHsKLQotICAgIHByaXZhdGUgTWFwIGlkMm1hbmFnZXIgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVV9NX0NISUxEX1RBRyA9ICJ1c2VyLW1hbmFnZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVfVF9DSElMRF9UQUcgPSAidXNlci10eXBlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVX1RfQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVX1RfQ1JFQVRFX0FUVFJJQlVURSA9ICJjcmVhdGUtdXNlLWNhc2UiOwotCi0gICAgcHVibGljIEFjY3JlZGl0YWJsZU1hbmFnZXIgZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcihDb25maWd1cmF0aW9uIGNvbmZpZykKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ1VyaSA9IG51bGw7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uW10gcGFyYW1Db25maWdzID0gY29uZmlnLmdldENoaWxkcmVuKCJwYXJhbWV0ZXIiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1Db25maWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKS5lcXVhbHMoImRpcmVjdG9yeSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1VyaSA9IHBhcmFtQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29uZmlnVXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gPHBhcmFtZXRlciBuYW1lPVwiZGlyZWN0b3J5XCI+IGVsZW1lbnQgZm91bmQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmlkMm1hbmFnZXIuY29udGFpbnNLZXkoY29uZmlnVXJpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoQWNjcmVkaXRhYmxlTWFuYWdlcikgdGhpcy5pZDJtYW5hZ2VyLmdldChjb25maWdVcmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTZXQgdXNlclR5cGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHVtQ29uZiA9IGNvbmZpZy5nZXRDaGlsZChVX01fQ0hJTERfVEFHLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVtQ29uZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25bXSB0eXBlQ29uZnMgPSB1bUNvbmYuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQ29uZnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJUeXBlcy5hZGQobmV3IFVzZXJUeXBlKHR5cGVDb25mc1tpXS5nZXRWYWx1ZSgpLCB0eXBlQ29uZnNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShVX1RfQ0xBU1NfQVRUUklCVVRFKSwgdHlwZUNvbmZzW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoVV9UX0NSRUFURV9BVFRSSUJVVEUpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXI6IHVzaW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdXNlciB0eXBlcyIpOwotICAgICAgICAgICAgICAgICAgICAvLyBubyAidXNlci1tYW5hZ2VyIiBibG9jayBpbiBhY2Nlc3MgY29udHJvbDogcHJvdmlkZQotICAgICAgICAgICAgICAgICAgICAvLyBhIGRlZmF1bHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgICAgICAgICAgdXNlclR5cGVzLmFkZChGaWxlQWNjcmVkaXRhYmxlTWFuYWdlci5nZXREZWZhdWx0VXNlclR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFVzZXJUeXBlW10gdHlwZXMgPSAoVXNlclR5cGVbXSkgdXNlclR5cGVzLnRvQXJyYXkobmV3IFVzZXJUeXBlW3VzZXJUeXBlcy5zaXplKCldKTsKLSAgICAgICAgICAgICAgICBBY2NyZWRpdGFibGVNYW5hZ2VyIG1nciA9IG5ldyBGaWxlQWNjcmVkaXRhYmxlTWFuYWdlcih0aGlzLm1hbmFnZXIsIGdldExvZ2dlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnVXJpLCB0eXBlcyk7Ci0gICAgICAgICAgICAgICAgdGhpcy5pZDJtYW5hZ2VyLnB1dChjb25maWdVcmksIG1ncik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ncjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUdyb3VwLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzYzk0ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuSXRlbUNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogRmlsZS1iYXNlZCBncm91cCBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVHcm91cCBleHRlbmRzIEFic3RyYWN0R3JvdXAgaW1wbGVtZW50cyBJdGVtIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cCNkZWxldGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZGVsZXRlKCk7Ci0gICAgICAgIGdldEZpbGUoKS5kZWxldGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZpbGVHcm91cCBvYmplY3QuCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlR3JvdXAoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkZpbGVHcm91cDwvY29kZT4KLSAgICAgKiBAcGFyYW0gaXRlbU1hbmFnZXIgVGhlIGl0ZW0gbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGlkIHRoZSBJRCBvZiB0aGUgZ3JvdXAKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUdyb3VwKEl0ZW1NYW5hZ2VyIGl0ZW1NYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlciwgaWQpOwotICAgICAgICBGaWxlSXRlbU1hbmFnZXIgZmlsZUl0ZW1NYW5hZ2VyID0gKEZpbGVJdGVtTWFuYWdlcikgaXRlbU1hbmFnZXI7Ci0gICAgICAgIHNldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoZmlsZUl0ZW1NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlcyB0aGlzIGZpbGUgZ3JvdXAuCi0gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgY29uZmlndXJhdGlvbi4KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IEl0ZW1Db25maWd1cmF0aW9uKCkuY29uZmlndXJlKHRoaXMsIGNvbmZpZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqIEByZXR1cm4gQSBmaWxlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlKCkgewotICAgICAgICBGaWxlIHhtbFBhdGggPSBnZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCk7Ci0gICAgICAgIEZpbGUgeG1sRmlsZSA9IG5ldyBGaWxlKHhtbFBhdGgsIGdldElkKCkgKyBGaWxlR3JvdXBNYW5hZ2VyLlNVRkZJWCk7Ci0gICAgICAgIHJldHVybiB4bWxGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhpcyBncm91cAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiB0aGUgc2F2ZSBmYWlsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvblNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvblNlcmlhbGl6ZXIoKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjcmVhdGVDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEZpbGUgeG1sZmlsZSA9IGdldEZpbGUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemVUb0ZpbGUoeG1sZmlsZSwgY29uZmlnKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3JvdXAgY29uZmlndXJhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQID0gImdyb3VwIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gY29udGFpbmluZyB0aGUgZ3JvdXAgZGV0YWlscwotICAgICAqIEByZXR1cm4gYSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKCkgewotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oR1JPVVApOwotICAgICAgICBuZXcgSXRlbUNvbmZpZ3VyYXRpb24oKS5zYXZlKHRoaXMsIGNvbmZpZyk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY29uZmlndXJhdGlvbkRpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LgotICAgICAqIEByZXR1cm4gQSBmaWxlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uRGlyZWN0b3J5OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoRmlsZSBfY29uZmlndXJhdGlvbkRpcmVjdG9yeSkgewotICAgICAgICBhc3NlcnQgKF9jb25maWd1cmF0aW9uRGlyZWN0b3J5ICE9IG51bGwpICYmIF9jb25maWd1cmF0aW9uRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkRpcmVjdG9yeSA9IF9jb25maWd1cmF0aW9uRGlyZWN0b3J5OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlR3JvdXBNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlR3JvdXBNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YTk2Y2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUdyb3VwTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXBNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbTsKLQotLyoqCi0gKiBGaWxlLWJhc2VkIGdyb3VwIG1hbmFnZXIuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlR3JvdXBNYW5hZ2VyIGV4dGVuZHMgRmlsZUl0ZW1NYW5hZ2VyIGltcGxlbWVudHMgR3JvdXBNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBpbnN0YW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWdyIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVHcm91cE1hbmFnZXIoQWNjcmVkaXRhYmxlTWFuYWdlciBtZ3IpIHsKLSAgICAgICAgc3VwZXIobWdyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkdyb3VwTWFuYWdlcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBwdWJsaWNhdGlvbi4gVGhlCi0gICAgICogPGNvZGU+R3JvdXBNYW5hZ2VyPC9jb2RlPiBpcyBhIHNpbmdsZXRvbi4KLSAgICAgKiBAcGFyYW0gbWdyIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkRpcmVjdG9yeSBmb3Igd2hpY2ggdGhlIEdyb3VwTWFuYWdlciBpcyByZXF1ZXN0ZWQKLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHJldHVybiBhIDxjb2RlPkdyb3VwTWFuYWdlcjwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgbm8gR3JvdXBNYW5hZ2VyIGNvdWxkIGJlIGluc3RhbmNpYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmlsZUdyb3VwTWFuYWdlciBpbnN0YW5jZShBY2NyZWRpdGFibGVNYW5hZ2VyIG1nciwgRmlsZSBjb25maWd1cmF0aW9uRGlyZWN0b3J5LAotICAgICAgICAgICAgTG9nZ2VyIGxvZ2dlcikgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgY29uZmlndXJhdGlvbkRpcmVjdG9yeSAhPSBudWxsOwotCi0gICAgICAgIGlmICghaW5zdGFuY2VzLmNvbnRhaW5zS2V5KGNvbmZpZ3VyYXRpb25EaXJlY3RvcnkpKSB7Ci0gICAgICAgICAgICBGaWxlR3JvdXBNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRmlsZUdyb3VwTWFuYWdlcihtZ3IpOwotICAgICAgICAgICAgbWFuYWdlci5lbmFibGVMb2dnaW5nKGxvZ2dlcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGluc3RhbmNlcy5wdXQoY29uZmlndXJhdGlvbkRpcmVjdG9yeSwgbWFuYWdlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKEZpbGVHcm91cE1hbmFnZXIpIGluc3RhbmNlcy5nZXQoY29uZmlndXJhdGlvbkRpcmVjdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBncm91cHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGdyb3Vwcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JvdXBbXSBnZXRHcm91cHMoKSB7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IHN1cGVyLmdldEl0ZW1zKCk7Ci0gICAgICAgIEdyb3VwW10gZ3JvdXBzID0gbmV3IEdyb3VwW2l0ZW1zLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBncm91cHNbaV0gPSAoR3JvdXApIGl0ZW1zW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBncm91cHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwTWFuYWdlciNhZGQoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JvdXAgYWRkKFN0cmluZyBpZCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBGaWxlR3JvdXAodGhpcywgZ2V0TG9nZ2VyKCksIGlkKTsKLSAgICAgICAgc3VwZXIuYWRkKGdyb3VwKTsKLSAgICAgICAgcmV0dXJuIGdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIGdyb3VwIGZyb20gdGhpcyBtYW5hZ2VyCi0gICAgICogCi0gICAgICogQHBhcmFtIGdyb3VwIHRoZSBncm91cCB0byBiZSByZW1vdmVkCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKEdyb3VwIGdyb3VwKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnJlbW92ZShncm91cCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBncm91cCB3aXRoIHRoZSBnaXZlbiBncm91cCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBncm91cElkIHRoZSBpZCBvZiB0aGUgcmVxdWVzdGVkIGdyb3VwCi0gICAgICogQHJldHVybiBhIDxjb2RlPkdyb3VwPC9jb2RlPiBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGdyb3VwIHdpdGggdGhlCi0gICAgICogICAgICAgICBnaXZlbiBuYW1lCi0gICAgICovCi0gICAgcHVibGljIEdyb3VwIGdldEdyb3VwKFN0cmluZyBncm91cElkKSB7Ci0gICAgICAgIHJldHVybiAoR3JvdXApIGdldEl0ZW0oZ3JvdXBJZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VGRklYID0gIi5nbWwiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZUl0ZW1NYW5hZ2VyI2dldFN1ZmZpeCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0gICAgICAgIHJldHVybiBTVUZGSVg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlSVBSYW5nZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUlQUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3MGQ0NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlSVBSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvblNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Db25zb2xlTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuTWFjaGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RJUFJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5JdGVtQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5ldC5JbmV0QWRkcmVzc1V0aWw7Ci0KLS8qKgotICogSVAgcmFuZ2UgdGhhdCBpcyBzdG9yZWQgaW4gYSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUlQUmFuZ2UgZXh0ZW5kcyBBYnN0cmFjdElQUmFuZ2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBNYWluIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gYXJncyBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBhIEpVbml0IHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiVXNhZ2U6IG5ldHdvcmssIG5ldG1hc2ssIGlwIChlLmcuIDE5Mi4xNjguMC42NCAyNTUuMjU1LjI1NS4yNDAgMTkyLjE2OC4wLjcwKSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbmV0QWRkcmVzcyBuZXR3b3JrQWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShhcmdzWzBdKTsKLSAgICAgICAgICAgIEluZXRBZGRyZXNzIHN1Ym5ldE1hc2sgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYXJnc1sxXSk7Ci0gICAgICAgICAgICBNYWNoaW5lIG1hY2hpbmUgPSBuZXcgTWFjaGluZShhcmdzWzJdKTsKLQotICAgICAgICAgICAgSW5ldEFkZHJlc3NVdGlsIHV0aWwgPSBuZXcgSW5ldEFkZHJlc3NVdGlsKG5ldyBDb25zb2xlTG9nZ2VyKCkpOwotICAgICAgICAgICAgaWYgKHV0aWwuY29udGFpbnMobmV0d29ya0FkZHJlc3MsIHN1Ym5ldE1hc2ssIG1hY2hpbmUuZ2V0QWRkcmVzcygpKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidHJ1ZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZhbHNlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBpdGVtTWFuYWdlciBUaGUgaXRlbSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUlQUmFuZ2UoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gaXRlbU1hbmFnZXIgVGhlIGl0ZW0gbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGlkIFRoZSBJUCByYW5nZSBJRC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUlQUmFuZ2UoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIsIFN0cmluZyBpZCkgewotICAgICAgICBzdXBlcihpdGVtTWFuYWdlciwgbG9nZ2VyLCBpZCk7Ci0gICAgICAgIEZpbGVJdGVtTWFuYWdlciBmaWxlSXRlbU1hbmFnZXIgPSAoRmlsZUl0ZW1NYW5hZ2VyKSBpdGVtTWFuYWdlcjsKLSAgICAgICAgc2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeShmaWxlSXRlbU1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdElQUmFuZ2Ujc2F2ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb25TZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb25TZXJpYWxpemVyKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY3JlYXRlQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvRmlsZShnZXRGaWxlKCksIGNvbmZpZyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKiBAcmV0dXJuIEEgZmlsZSBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgRmlsZSB4bWxQYXRoID0gZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpOwotICAgICAgICBGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZSh4bWxQYXRoLCBnZXRJZCgpICsgRmlsZUlQUmFuZ2VNYW5hZ2VyLlNVRkZJWCk7Ci0gICAgICAgIHJldHVybiB4bWxGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBuZXcgSXRlbUNvbmZpZ3VyYXRpb24oKS5jb25maWd1cmUodGhpcywgY29uZmlnKTsKLQotICAgICAgICBTdHJpbmcgbmV0d29ya0FkZHJlc3MgPSBjb25maWcuZ2V0Q2hpbGQoRUxFTUVOVF9ORVRXT1JLX0FERFJFU1MpLmdldFZhbHVlKCk7Ci0gICAgICAgIFN0cmluZyBzdWJuZXRNYXNrID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfU1VCTkVUX01BU0spLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldE5ldHdvcmtBZGRyZXNzKG5ldHdvcmtBZGRyZXNzKTsKLSAgICAgICAgICAgIHNldFN1Ym5ldE1hc2soc3VibmV0TWFzayk7Ci0gICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkNvbmZpZ3VyaW5nIElQIHJhbmdlIFsiICsgZ2V0SWQoKSArICJdIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElQX1JBTkdFID0gImlwLXJhbmdlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05FVFdPUktfQUREUkVTUyA9ICJuZXR3b3JrLWFkZHJlc3MiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU1VCTkVUX01BU0sgPSAic3VibmV0LW1hc2siOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBjdXJyZW50IHVzZXIgZGV0YWlscy4gQ2FuIGJlIHVzZWQgZm9yIHNhdmluZy4KLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKCkgewotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oSVBfUkFOR0UpOwotICAgICAgICBuZXcgSXRlbUNvbmZpZ3VyYXRpb24oKS5zYXZlKHRoaXMsIGNvbmZpZyk7Ci0KLSAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb24gbmV0d29ya0FkZHJlc3NDb25maWcgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgRUxFTUVOVF9ORVRXT1JLX0FERFJFU1MpOwotICAgICAgICBuZXR3b3JrQWRkcmVzc0NvbmZpZy5zZXRWYWx1ZShnZXROZXR3b3JrQWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkpOwotICAgICAgICBjb25maWcuYWRkQ2hpbGQobmV0d29ya0FkZHJlc3NDb25maWcpOwotCi0gICAgICAgIERlZmF1bHRDb25maWd1cmF0aW9uIHN1Ym5ldE1hc2tDb25maWcgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oRUxFTUVOVF9TVUJORVRfTUFTSyk7Ci0gICAgICAgIHN1Ym5ldE1hc2tDb25maWcuc2V0VmFsdWUoZ2V0U3VibmV0TWFzaygpLmdldEhvc3RBZGRyZXNzKCkpOwotICAgICAgICBjb25maWcuYWRkQ2hpbGQoc3VibmV0TWFza0NvbmZpZyk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUlQUmFuZ2VNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlSVBSYW5nZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1ZDUzYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlSVBSYW5nZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JUFJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSVBSYW5nZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtOwotCi0vKioKLSAqIE1hbmFnZXIgZm9yIElQIGFkZHJlc3MgcmFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUlQUmFuZ2VNYW5hZ2VyIGV4dGVuZHMgRmlsZUl0ZW1NYW5hZ2VyIGltcGxlbWVudHMgSVBSYW5nZU1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWdyIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVJUFJhbmdlTWFuYWdlcihBY2NyZWRpdGFibGVNYW5hZ2VyIG1ncikgewotICAgICAgICBzdXBlcihtZ3IpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICIuaXBtbCI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlSXRlbU1hbmFnZXIjZ2V0U3VmZml4KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLSAgICAgICAgcmV0dXJuIFNVRkZJWDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgaW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBGaWxlSVBSYW5nZU1hbmFnZXIKLSAgICAgKiBAcGFyYW0gbWdyIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkRpcmVjdG9yeSBhIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPklQUmFuZ2VNYW5hZ2VyPC9jb2RlPiB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZpbGVJUFJhbmdlTWFuYWdlciBpbnN0YW5jZShBY2NyZWRpdGFibGVNYW5hZ2VyIG1nciwgRmlsZSBjb25maWd1cmF0aW9uRGlyZWN0b3J5LCBMb2dnZXIgbG9nZ2VyKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydCBjb25maWd1cmF0aW9uRGlyZWN0b3J5ICE9IG51bGw7Ci0gICAgICAgIGlmICghY29uZmlndXJhdGlvbkRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBkaXJlY3RvcnkgWyIgKyBjb25maWd1cmF0aW9uRGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICsgIl0gZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWluc3RhbmNlcy5jb250YWluc0tleShjb25maWd1cmF0aW9uRGlyZWN0b3J5KSkgewotICAgICAgICAgICAgRmlsZUlQUmFuZ2VNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRmlsZUlQUmFuZ2VNYW5hZ2VyKG1ncik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmVuYWJsZUxvZ2dpbmcobG9nZ2VyKTsKLSAgICAgICAgICAgIG1hbmFnZXIuY29uZmlndXJlKGNvbmZpZ3VyYXRpb25EaXJlY3RvcnkpOwotICAgICAgICAgICAgaW5zdGFuY2VzLnB1dChjb25maWd1cmF0aW9uRGlyZWN0b3J5LCBtYW5hZ2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoRmlsZUlQUmFuZ2VNYW5hZ2VyKSBpbnN0YW5jZXMuZ2V0KGNvbmZpZ3VyYXRpb25EaXJlY3RvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgSVAgcmFuZ2VzLgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSVAgcmFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBJUFJhbmdlW10gZ2V0SVBSYW5nZXMoKSB7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IHN1cGVyLmdldEl0ZW1zKCk7Ci0gICAgICAgIElQUmFuZ2VbXSByYW5nZXMgPSBuZXcgSVBSYW5nZVtpdGVtcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmFuZ2VzW2ldID0gKElQUmFuZ2UpIGl0ZW1zW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByYW5nZXM7Ci0gICAgfQotCi0gICAgcHVibGljIElQUmFuZ2UgYWRkKFN0cmluZyBpZCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBJUFJhbmdlIHJhbmdlID0gbmV3IEZpbGVJUFJhbmdlKHRoaXMsIGdldExvZ2dlcigpLCBpZCk7Ci0gICAgICAgIHN1cGVyLmFkZChyYW5nZSk7Ci0gICAgICAgIHJldHVybiByYW5nZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIElQIHJhbmdlCi0gICAgICogQHBhcmFtIHJhbmdlIElQIHJhbmdlIHRoYXQgaXMgdG8gYmUgcmVtb3ZlZAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHRoZSBub3RpZmljYXRpb24gZmFpbGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShJUFJhbmdlIHJhbmdlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnJlbW92ZShyYW5nZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBJUFJhbmdlIHdpdGggdGhlIGdpdmVuIGlkLgotICAgICAqIEBwYXJhbSByYW5nZUlkIHVzZXIgaWQgb2YgcmVxdWVzdGVkIElQIHJhbmdlCi0gICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIElQIHJhbmdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gSVAgcmFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBSYW5nZSBnZXRJUFJhbmdlKFN0cmluZyByYW5nZUlkKSB7Ci0gICAgICAgIHJldHVybiAoSVBSYW5nZSkgZ2V0SXRlbShyYW5nZUlkKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlSXRlbU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVJdGVtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmRjMWY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVJdGVtTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1NYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkl0ZW1Db25maWd1cmF0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGNsYXNzZXMgdGhhdCBtYW5hZ2UgaXRlbXMgbG9hZGVkIGZyb20gY29uZmlndXJhdGlvbgotICogZmlsZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlSXRlbU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBJdGVtTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIE1hcCBpdGVtcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBGaWxlIGNvbmZpZ3VyYXRpb25EaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBEaXJlY3RvcnlDaGFuZ2VOb3RpZmllciBub3RpZmllcjsKLQotICAgIHByaXZhdGUgQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEl0ZW1NYW5hZ2VyLgotICAgICAqIEBwYXJhbSBhY2NyZWRpdGFibGVNYW5hZ2VyIFRoZSB7QGxpbmsgQWNjcmVkaXRhYmxlTWFuYWdlcn0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGVJdGVtTWFuYWdlcihBY2NyZWRpdGFibGVNYW5hZ2VyIGFjY3JlZGl0YWJsZU1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyID0gYWNjcmVkaXRhYmxlTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIF9jb25maWd1cmF0aW9uRGlyZWN0b3J5IHdoZXJlIHRoZSBpdGVtcyBhcmUgZmV0Y2hlZCBmcm9tCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSBpdGVtIG1hbmFnZXIgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShGaWxlIF9jb25maWd1cmF0aW9uRGlyZWN0b3J5KSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCBfY29uZmlndXJhdGlvbkRpcmVjdG9yeSAhPSBudWxsOwotCi0gICAgICAgIGlmICghX2NvbmZpZ3VyYXRpb25EaXJlY3RvcnkuZXhpc3RzKCkgfHwgIV9jb25maWd1cmF0aW9uRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKCJUaGUgZGlyZWN0b3J5IFsiCi0gICAgICAgICAgICAgICAgICAgICsgX2NvbmZpZ3VyYXRpb25EaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkRpcmVjdG9yeSA9IF9jb25maWd1cmF0aW9uRGlyZWN0b3J5OwotICAgICAgICB0aGlzLm5vdGlmaWVyID0gbmV3IERpcmVjdG9yeUNoYW5nZU5vdGlmaWVyKF9jb25maWd1cmF0aW9uRGlyZWN0b3J5LCBnZXRGaWxlRmlsdGVyKCkpOwotICAgICAgICB0aGlzLm5vdGlmaWVyLmVuYWJsZUxvZ2dpbmcoZ2V0TG9nZ2VyKCkpOwotICAgICAgICBsb2FkSXRlbXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxvYWRzIHRoZSBpdGVtcyBpZiBhbiBpdGVtIHdhcyBjaGFuZ2VkIC8gYWRkZWQgLyByZW1vdmVkLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvYWRJdGVtcygpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIGNoYW5nZWQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5ub3RpZmllci5oYXNDaGFuZ2VkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoYW5nZWQpIHsKLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiSXRlbSBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkIC0gcmVsb2FkaW5nLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlW10gYWRkZWRGaWxlcyA9IHRoaXMubm90aWZpZXIuZ2V0QWRkZWRGaWxlcygpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkRmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJdGVtIGl0ZW0gPSBsb2FkSXRlbShhZGRlZEZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICBhZGQoaXRlbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZpbGVbXSByZW1vdmVkRmlsZXMgPSB0aGlzLm5vdGlmaWVyLmdldFJlbW92ZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVkRmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSByZW1vdmVkRmlsZXNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtIGdldFN1ZmZpeCgpLmxlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIEl0ZW0gaXRlbSA9IChJdGVtKSB0aGlzLml0ZW1zLmdldChpZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHcm91cGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoR3JvdXBhYmxlKSBpdGVtKS5yZW1vdmVGcm9tQWxsR3JvdXBzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHcm91cCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChHcm91cCkgaXRlbSkucmVtb3ZlQWxsTWVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZVtdIGNoYW5nZWRGaWxlcyA9IHRoaXMubm90aWZpZXIuZ2V0Q2hhbmdlZEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWRGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEl0ZW0gaXRlbSA9IGxvYWRJdGVtKGNoYW5nZWRGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKGl0ZW0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGFuIGl0ZW0gZnJvbSBhIGZpbGUuCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUuCi0gICAgICogQHJldHVybiBBbiBpdGVtLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVtIGxvYWRJdGVtKEZpbGUgZmlsZSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldEl0ZW1Db25maWd1cmF0aW9uKGZpbGUpOwotCi0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgaWQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSBnZXRTdWZmaXgoKS5sZW5ndGgoKSk7Ci0gICAgICAgIEl0ZW0gaXRlbSA9IChJdGVtKSB0aGlzLml0ZW1zLmdldChpZCk7Ci0KLSAgICAgICAgU3RyaW5nIGtsYXNzID0gSXRlbUNvbmZpZ3VyYXRpb24uZ2V0SXRlbUNsYXNzKGNvbmZpZyk7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbVR5cGVzID0geyBJdGVtTWFuYWdlci5jbGFzcywgTG9nZ2VyLmNsYXNzIH07Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY3RvciA9IENsYXNzLmZvck5hbWUoa2xhc3MpLmdldENvbnN0cnVjdG9yKHBhcmFtVHlwZXMpOwotICAgICAgICAgICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IHsgdGhpcywgZ2V0TG9nZ2VyKCkgfTsKLSAgICAgICAgICAgICAgICBpdGVtID0gKEl0ZW0pIGN0b3IubmV3SW5zdGFuY2UocGFyYW1zKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gIkV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBpbnN0YW5jaWF0ZTogIiArIGtsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBleGNlcHRpb246ICIgKyBlLmZpbGxJblN0YWNrVHJhY2UoKTsKLQotICAgICAgICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIGluc3RhbmNpYXRlCi0gICAgICAgICAgICAgICAgLy8gYSB1c2VyLgotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKGVycm9yTXNnKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXRlbS5jb25maWd1cmUoY29uZmlnKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPSAiRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvbmZpZ3VyZTogIiArIGtsYXNzOwotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZXJyb3JNc2csIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRlaCBjb25maWd1cmF0aW9uIG9mIGFuIGl0ZW0gZnJvbSBhIGZpbGUuCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUuCi0gICAgICogQHJldHVybiBBIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gZ2V0SXRlbUNvbmZpZ3VyYXRpb24oRmlsZSBmaWxlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIERlZmF1bHRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uQnVpbGRlcigpOwotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydCBmaWxlLmV4aXN0cygpOwotICAgICAgICAgICAgY29uZmlnID0gYnVpbGRlci5idWlsZEZyb21GaWxlKGZpbGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gIkV4Y2VwdGlvbiB3aGVuIHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZmlsZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIGlkZW50aXR5IGZpbGUuCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcihlcnJvck1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtKEZpbGUgZmlsZSkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVtIGZvciBhIGdpdmVuIElELgotICAgICAqIEBwYXJhbSBpZCBUaGUgaWQuCi0gICAgICogQHJldHVybiBBbiBpdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVtIGdldEl0ZW0oU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2FkSXRlbXMoKTsKLSAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKEl0ZW0pIHRoaXMuaXRlbXMuZ2V0KGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYWxsIGl0ZW1zCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBpdGVtcwotICAgICAqLwotICAgIHB1YmxpYyBJdGVtW10gZ2V0SXRlbXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2FkSXRlbXMoKTsKLSAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKEl0ZW1bXSkgdGhpcy5pdGVtcy52YWx1ZXMoKS50b0FycmF5KG5ldyBJdGVtW3RoaXMuaXRlbXMudmFsdWVzKCkuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIEl0ZW0gdG8gdGhpcyBtYW5hZ2VyCi0gICAgICogQHBhcmFtIGl0ZW0gdG8gYmUgYWRkZWQKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiB0aGUgbm90aWZpY2F0aW9uIHRocmV3IHRoaXMKLSAgICAgKiAgICAgICAgIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoSXRlbSBpdGVtKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCBpdGVtICE9IG51bGw7Ci0gICAgICAgIHRoaXMuaXRlbXMucHV0KGl0ZW0uZ2V0SWQoKSwgaXRlbSk7Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiSXRlbSBbIiArIGl0ZW0gKyAiXSBhZGRlZC4iKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlBZGRlZChpdGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYW4gaXRlbSBmcm9tIHRoaXMgbWFuYWdlcgotICAgICAqIEBwYXJhbSBpdGVtIHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiB0aGUgbm90aWZpY2F0aW9uIHRocmV3IHRoaXMKLSAgICAgKiAgICAgICAgIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoSXRlbSBpdGVtKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuaXRlbXMucmVtb3ZlKGl0ZW0uZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiSXRlbSBbIiArIGl0ZW0gKyAiXSByZW1vdmVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVJlbW92ZWQoaXRlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIGFuIGl0ZW0uCi0gICAgICogQHBhcmFtIG5ld0l0ZW0gVGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBpdGVtLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHRoZSBub3RpZmljYXRpb24gdGhyZXcgdGhpcwotICAgICAqICAgICAgICAgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShJdGVtIG5ld0l0ZW0pIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5pdGVtcy5yZW1vdmUobmV3SXRlbS5nZXRJZCgpKTsKLSAgICAgICAgdGhpcy5pdGVtcy5wdXQobmV3SXRlbS5nZXRJZCgpLCBuZXdJdGVtKTsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJJdGVtIFsiICsgbmV3SXRlbSArICJdIHVwZGF0ZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBJdGVtTWFuYWdlciBjb250YWlucyBhbiBvYmplY3QuCi0gICAgICogQHBhcmFtIGl0ZW0gVGhlIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJdGVtIGl0ZW0pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvYWRJdGVtcygpOwotICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmNvbnRhaW5zVmFsdWUoaXRlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGl0ZW1zIGFyZSBsb2NhdGVkLgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5GaWxlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25EaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgZmlsZSBmaWx0ZXIgd2hpY2ggZmlsdGVycyBmb3IgZmlsZXMgY29udGFpbmluZyBpdGVtcy4KLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+RmlsZUZpbHRlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZUZpbHRlciBnZXRGaWxlRmlsdGVyKCkgewotICAgICAgICBGaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aChnZXRTdWZmaXgoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHJldHVybiBmaWx0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZSBleHRlbnNpb24gdG8gYmUgdXNlZC4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U3VmZml4KCk7Ci0KLSAgICBwcml2YXRlIExpc3QgaXRlbU1hbmFnZXJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRhY2hlcyBhbiBpdGVtIG1hbmFnZXIgbGlzdGVuZXIgdG8gdGhpcyBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIEFuIGl0ZW0gbWFuYWdlciBsaXN0ZW5lci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJdGVtTWFuYWdlckxpc3RlbmVyKEl0ZW1NYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBZGRpbmcgbGlzdGVuZXI6IFsiICsgbGlzdGVuZXIgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdGhpcy5pdGVtTWFuYWdlckxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgIHRoaXMuaXRlbU1hbmFnZXJMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW4gaXRlbSBtYW5hZ2VyIGxpc3RlbmVyIGZyb20gdGhpcyBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIEFuIGl0ZW0gbWFuYWdlciBsaXN0ZW5lci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVJdGVtTWFuYWdlckxpc3RlbmVyKEl0ZW1NYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZW1vdmluZyBsaXN0ZW5lcjogWyIgKyBsaXN0ZW5lciArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5pdGVtTWFuYWdlckxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lcnMgdGhhdCBhbiBpdGVtIHdhcyBhZGRlZC4KLSAgICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0aGF0IHdhcyBhZGRlZC4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUFkZGVkKEl0ZW0gaXRlbSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkl0ZW0gd2FzIGFkZGVkOiBbIiArIGl0ZW0gKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3QgY2xvbmUgPSBuZXcgQXJyYXlMaXN0KHRoaXMuaXRlbU1hbmFnZXJMaXN0ZW5lcnMpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjbG9uZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEl0ZW1NYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIgPSAoSXRlbU1hbmFnZXJMaXN0ZW5lcikgaS5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0ZW5lci5pdGVtQWRkZWQoaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXJzIHRoYXQgYW4gaXRlbSB3YXMgcmVtb3ZlZC4KLSAgICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0aGF0IHdhcyByZW1vdmVkLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVtb3ZlZChJdGVtIGl0ZW0pIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJJdGVtIHdhcyByZW1vdmVkOiBbIiArIGl0ZW0gKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3QgY2xvbmUgPSBuZXcgQXJyYXlMaXN0KHRoaXMuaXRlbU1hbmFnZXJMaXN0ZW5lcnMpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjbG9uZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEl0ZW1NYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIgPSAoSXRlbU1hbmFnZXJMaXN0ZW5lcikgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJOb3RpZnlpbmcgbGlzdGVuZXI6IFsiICsgbGlzdGVuZXIgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGlzdGVuZXIuaXRlbVJlbW92ZWQoaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgY2xhc3MgdG8gb2JzZXJ2ZSBhIGRpcmVjdG9yeSBmb3IgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpcmVjdG9yeUNoYW5nZU5vdGlmaWVyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3Rvci4KLSAgICAgICAgICogQHBhcmFtIF9kaXJlY3RvcnkgVGhlIGRpcmVjdG9yeSB0byBvYnNlcnZlLgotICAgICAgICAgKiBAcGFyYW0gX2ZpbHRlciBBIGZpbHRlciB0byBzcGVjaWZ5IHRoZSBmaWxlIHR5cGUgdG8gb2JzZXJ2ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEaXJlY3RvcnlDaGFuZ2VOb3RpZmllcihGaWxlIF9kaXJlY3RvcnksIEZpbGVGaWx0ZXIgX2ZpbHRlcikgewotICAgICAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBfZGlyZWN0b3J5OwotICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBfZmlsdGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBGaWxlIGRpcmVjdG9yeTsKLSAgICAgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIGZpbHRlcjsKLSAgICAgICAgcHJpdmF0ZSBNYXAgY2Fub25pY2FsUGF0aDJMYXN0TW9kaWZpZWQgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHByaXZhdGUgU2V0IGFkZGVkRmlsZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBwcml2YXRlIFNldCByZW1vdmVkRmlsZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBwcml2YXRlIFNldCBjaGFuZ2VkRmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGRpcmVjdG9yeSBoYXMgY2hhbmdlZCAoYSBuZXcgZmlsZSB3YXMgYWRkZWQsIGEgZmlsZSB3YXMKLSAgICAgICAgICogcmVtb3ZlZCwgYSBmaWxlIGhhcyBjaGFuZ2VkKS4KLSAgICAgICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoYW5nZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgICAgICB0aGlzLmFkZGVkRmlsZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIHRoaXMucmVtb3ZlZEZpbGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICB0aGlzLmNoYW5nZWRGaWxlcy5jbGVhcigpOwotCi0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSB0aGlzLmRpcmVjdG9yeS5saXN0RmlsZXModGhpcy5maWx0ZXIpOwotCi0gICAgICAgICAgICBTZXQgbmV3UGF0aFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2Fub25pY2FsUGF0aCA9IGZpbGVzW2ldLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgICAgICBuZXdQYXRoU2V0LmFkZChjYW5vbmljYWxQYXRoKTsKLQotICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYW5vbmljYWxQYXRoMkxhc3RNb2RpZmllZC5jb250YWluc0tleShjYW5vbmljYWxQYXRoKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZGVkRmlsZXMuYWRkKG5ldyBGaWxlKGNhbm9uaWNhbFBhdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIk5ldyBmaWxlOiBbIiArIGNhbm9uaWNhbFBhdGggKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb25nIGxhc3RNb2RpZmllZE9iamVjdCA9IChMb25nKSB0aGlzLmNhbm9uaWNhbFBhdGgyTGFzdE1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChjYW5vbmljYWxQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWRPYmplY3QubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPCBmaWxlc1tpXS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkRmlsZXMuYWRkKGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkZpbGUgaGFzIGNoYW5nZWQ6IFsiICsgY2Fub25pY2FsUGF0aCArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTG9uZyBsYXN0TW9kaWZpZWQgPSBuZXcgTG9uZyhmaWxlc1tpXS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5jYW5vbmljYWxQYXRoMkxhc3RNb2RpZmllZC5wdXQoY2Fub25pY2FsUGF0aCwgbGFzdE1vZGlmaWVkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU2V0IG9sZFBhdGhTZXQgPSB0aGlzLmNhbm9uaWNhbFBhdGgyTGFzdE1vZGlmaWVkLmtleVNldCgpOwotICAgICAgICAgICAgU3RyaW5nW10gb2xkUGF0aHMgPSAoU3RyaW5nW10pIG9sZFBhdGhTZXQudG9BcnJheShuZXcgU3RyaW5nW29sZFBhdGhTZXQuc2l6ZSgpXSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZFBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFuZXdQYXRoU2V0LmNvbnRhaW5zKG9sZFBhdGhzW2ldKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZWRGaWxlcy5hZGQobmV3IEZpbGUob2xkUGF0aHNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5vbmljYWxQYXRoMkxhc3RNb2RpZmllZC5yZW1vdmUob2xkUGF0aHNbaV0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkZpbGUgcmVtb3ZlZDogWyIgKyBvbGRQYXRoc1tpXSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAhdGhpcy5hZGRlZEZpbGVzLmlzRW1wdHkoKSB8fCAhdGhpcy5yZW1vdmVkRmlsZXMuaXNFbXB0eSgpCi0gICAgICAgICAgICAgICAgICAgIHx8ICF0aGlzLmNoYW5nZWRGaWxlcy5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgYWRkZWQgZmlsZXMuCi0gICAgICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgZmlsZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRmlsZVtdIGdldEFkZGVkRmlsZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEZpbGVbXSkgdGhpcy5hZGRlZEZpbGVzLnRvQXJyYXkobmV3IEZpbGVbdGhpcy5hZGRlZEZpbGVzLnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHJlbW92ZWQgZmlsZXMuCi0gICAgICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgZmlsZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRmlsZVtdIGdldFJlbW92ZWRGaWxlcygpIHsKLSAgICAgICAgICAgIHJldHVybiAoRmlsZVtdKSB0aGlzLnJlbW92ZWRGaWxlcy50b0FycmF5KG5ldyBGaWxlW3RoaXMucmVtb3ZlZEZpbGVzLnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGNoYW5nZWQgZmlsZXMuCi0gICAgICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgZmlsZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRmlsZVtdIGdldENoYW5nZWRGaWxlcygpIHsKLSAgICAgICAgICAgIHJldHVybiAoRmlsZVtdKSB0aGlzLmNoYW5nZWRGaWxlcy50b0FycmF5KG5ldyBGaWxlW3RoaXMuY2hhbmdlZEZpbGVzLnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNjcmVkaXRhYmxlTWFuYWdlciBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZVBvbGljeU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVQb2xpY3lNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZGNmNGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZVBvbGljeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi51dGlsLk5ldFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5DcmVkZW50aWFsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Jbmhlcml0aW5nUG9saWN5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLk1vZGlmaWFibGVQb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGUuQ2FjaGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmNhY2hlLlNvdXJjZUNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5DcmVkZW50aWFsSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuRGVmYXVsdFBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuUG9saWN5QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuUmVtb3ZlZEFjY3JlZGl0YWJsZVBvbGljeUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLlVSTFBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBIFBvbGljeUJ1aWxkZXIgaXMgdXNlZCB0byBidWlsZCBwb2xpY2llcy4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVQb2xpY3lNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgSW5oZXJpdGluZ1BvbGljeU1hbmFnZXIsCi0gICAgICAgIFBhcmFtZXRlcml6YWJsZSwgRGlzcG9zYWJsZSwgU2VydmljZWFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3VidHJlZUZpbGVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlRmlsdGVyIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdWJ0cmVlOwotCi0gICAgICAgIHByaXZhdGUgU3VidHJlZUZpbGVGaWx0ZXIoU3RyaW5nIF9zdWJ0cmVlKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5zdWJ0cmVlID0gX3N1YnRyZWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGVGaWx0ZXIjYWNjZXB0KGphdmEuaW8uRmlsZSkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKS5lcXVhbHModGhpcy5zdWJ0cmVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIElzRGlyZWN0b3J5RmlsZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVGaWx0ZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGVGaWx0ZXIjYWNjZXB0KGphdmEuaW8uRmlsZSkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZpbGVQb2xpY3lNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlUG9saWN5TWFuYWdlcigpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBjYWNoZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgc291cmNlIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTb3VyY2VDYWNoZSBnZXRDYWNoZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTb3VyY2VDYWNoZSBjYWNoZTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlRSRUVfRklMRU5BTUUgPSAic3VidHJlZS1wb2xpY3kuYWNtbCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBzdWJ0cmVlIHBvbGljeSBmcm9tIGEgZmlsZS4gV2hlbiB0aGUgZmlsZSBpcyBub3QgcHJlc2VudCwgYW4KLSAgICAgKiBlbXB0eSBwb2xpY3kgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGFjY2VzcyBjb250cm9sbGVyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgaW5zaWRlIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICogQHJldHVybiBBIHBvbGljeS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUG9saWN5IGJ1aWxkU3VidHJlZVBvbGljeShBY2NyZWRpdGFibGVNYW5hZ2VyIGNvbnRyb2xsZXIsIFN0cmluZyB1cmwpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBidWlsZFBvbGljeShjb250cm9sbGVyLCB1cmwsIFNVQlRSRUVfRklMRU5BTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIHBvbGljeSBmcm9tIGEgZmlsZS4gV2hlbiB0aGUgZmlsZSBpcyBub3QgcHJlc2VudCwgYW4gZW1wdHkKLSAgICAgKiBwb2xpY3kgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGFjY2VzcyBjb250cm9sbGVyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwuCi0gICAgICogQHBhcmFtIHBvbGljeUZpbGVuYW1lIFRoZSBwb2xpY3kgZmlsZW5hbWUuCi0gICAgICogQHJldHVybiBBIHBvbGljeS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGVmYXVsdFBvbGljeSBidWlsZFBvbGljeShBY2NyZWRpdGFibGVNYW5hZ2VyIGNvbnRyb2xsZXIsIFN0cmluZyB1cmwsCi0gICAgICAgICAgICBTdHJpbmcgcG9saWN5RmlsZW5hbWUpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkJ1aWxkaW5nIHBvbGljeSBmb3IgVVJMIFsiICsgdXJsICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIERlZmF1bHRQb2xpY3kgcG9saWN5ID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgcG9saWN5VXJpID0gZ2V0UG9saWN5U291cmNlVVJJKHVybCwgcG9saWN5RmlsZW5hbWUpOwotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlBvbGljeSBzb3VyY2UgVVJJIHJlc29sdmVkIHRvOiAiICsgcG9saWN5VXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQb2xpY3lCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUG9saWN5QnVpbGRlcihjb250cm9sbGVyKTsKLSAgICAgICAgICAgIHBvbGljeSA9IChEZWZhdWx0UG9saWN5KSBnZXRDYWNoZSgpLmdldChwb2xpY3lVcmksIGJ1aWxkZXIpOwotICAgICAgICB9IGNhdGNoIChDYWNoaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJQb2xpY3kgZXhpc3RzOiBbIiArIChwb2xpY3kgIT0gbnVsbCkgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwb2xpY3kgPSBuZXcgRGVmYXVsdFBvbGljeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb2xpY3k7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9saWN5IGZpbGUgVVJJIGZvciBhIFVSTCBhbmQgYSBwb2xpY3kgZmlsZW5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGdldCB0aGUgZmlsZSBmb3IuCi0gICAgICogQHBhcmFtIHBvbGljeUZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBwb2xpY3kgZmlsZS4KLSAgICAgKiBAcmV0dXJuIEEgU3RyaW5nLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBvbGljeVNvdXJjZVVSSShTdHJpbmcgdXJsLCBTdHJpbmcgcG9saWN5RmlsZW5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyByZW1vdmUgcHVibGljYXRpb24gSUQKLSAgICAgICAgaWYgKHVybC5pbmRleE9mKCIvIikgPiAtMSkgewotICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZigiLyIpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB1cmwgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBwb2xpY3lVcmkgPSB0aGlzLnBvbGljaWVzRGlyZWN0b3J5VXJpICsgIi8iICsgdXJsICsgIi8iICsgcG9saWN5RmlsZW5hbWU7Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ29tcHV0aW5nIHBvbGljeSBVUkkgWyIgKyBwb2xpY3lVcmkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb2xpY3lVcmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9saWN5IGZpbGUgZm9yIGEgY2VydGFpbiBVUkwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIHRvIGdldCB0aGUgcG9saWN5IGZvci4KLSAgICAgKiBAcGFyYW0gcG9saWN5RmlsZW5hbWUgVGhlIHBvbGljeSBmaWxlbmFtZS4KLSAgICAgKiBAcmV0dXJuIEEgZmlsZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0UG9saWN5RmlsZShTdHJpbmcgdXJsLCBTdHJpbmcgcG9saWN5RmlsZW5hbWUpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGVVcmkgPSBnZXRQb2xpY3lTb3VyY2VVUkkodXJsLCBwb2xpY3lGaWxlbmFtZSk7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5zZXJ2aWNlTWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKGZpbGVVcmkpOwotICAgICAgICAgICAgcmV0dXJuIFNvdXJjZVV0aWwuZ2V0RmlsZShzb3VyY2UpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZU1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyBhIFN1YnRyZWUgcG9saWN5LgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBzYXZlIHRoZSBwb2xpY3kgZm9yLgotICAgICAqIEBwYXJhbSBwb2xpY3kgVGhlIHBvbGljeSB0byBzYXZlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdWJ0cmVlUG9saWN5KFN0cmluZyB1cmwsIFBvbGljeSBwb2xpY3kpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlNhdmluZyBzdWJ0cmVlIHBvbGljeSBmb3IgVVJMIFsiICsgdXJsICsgIl0iKTsKLSAgICAgICAgc2F2ZVBvbGljeSh1cmwsIHBvbGljeSwgU1VCVFJFRV9GSUxFTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgYSBwb2xpY3kgdG8gYSBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0byBzYXZlIHRoZSBwb2xpY3kgZm9yLgotICAgICAqIEBwYXJhbSBwb2xpY3kgVGhlIHBvbGljeS4KLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGUuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVQb2xpY3koU3RyaW5nIHVybCwgUG9saWN5IHBvbGljeSwgU3RyaW5nIGZpbGVuYW1lKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIEZpbGUgZmlsZSA9IGdldFBvbGljeUZpbGUodXJsLCBmaWxlbmFtZSk7Ci0gICAgICAgIHNhdmVQb2xpY3kocG9saWN5LCBmaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyBhIHBvbGljeSB0byBhIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvbGljeSBUaGUgcG9saWN5IHRvIHNhdmUuCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVQb2xpY3koUG9saWN5IHBvbGljeSwgRmlsZSBmaWxlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gUG9saWN5QnVpbGRlci5zYXZlUG9saWN5KHBvbGljeSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgICAgIGlmICghZmlsZS5jcmVhdGVOZXdGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIkZpbGUgWyIgKyBmaWxlICsgIl0gY291bGQgbm90IGJlIGNyZWF0ZWQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRG9jdW1lbnRIZWxwZXIud3JpdGVEb2N1bWVudChkb2N1bWVudCwgZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKCJQYXRoOiBbIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeU1hbmFnZXIjZ2V0UG9saWN5KG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFBvbGljeSBnZXRQb2xpY3koQWNjcmVkaXRhYmxlTWFuYWdlciBjb250cm9sbGVyLCBTdHJpbmcgdXJsKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIHJldHVybiBuZXcgVVJMUG9saWN5KGNvbnRyb2xsZXIsIHVybCwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX1BBUkFNRVRFUiA9ICJkaXJlY3RvcnkiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9saWNpZXNEaXJlY3RvcnlVcmk7Ci0KLSAgICBwcml2YXRlIEZpbGUgcG9saWNpZXNEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcml6YWJsZSNwYXJhbWV0ZXJpemUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVycykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJhbWV0ZXJpemUoUGFyYW1ldGVycyBwYXJhbWV0ZXJzKSB0aHJvd3MgUGFyYW1ldGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmFtZXRlcnMuaXNQYXJhbWV0ZXIoRElSRUNUT1JZX1BBUkFNRVRFUikpIHsKLSAgICAgICAgICAgIHRoaXMucG9saWNpZXNEaXJlY3RvcnlVcmkgPSBwYXJhbWV0ZXJzLmdldFBhcmFtZXRlcihESVJFQ1RPUllfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlBvbGljaWVzIGRpcmVjdG9yeSBVUkk6ICIgKyB0aGlzLnBvbGljaWVzRGlyZWN0b3J5VXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcGF0aCB0byB0aGUgcG9saWNpZXMgZGlyZWN0b3J5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIHBvbGljaWVzIGRpcmVjdG9yeQotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRQb2xpY2llc0RpcmVjdG9yeSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodGhpcy5wb2xpY2llc0RpcmVjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgICAgIEZpbGUgZGlyZWN0b3J5OwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBnZXRTZXJ2aWNlTWFuYWdlcigpLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHRoaXMucG9saWNpZXNEaXJlY3RvcnlVcmkpOwotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJQb2xpY2llcyBkaXJlY3Rvcnkgc291cmNlOiBbIiArIHNvdXJjZS5nZXRVUkkoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gbmV3IEZpbGUobmV3IFVSSShOZXRVdGlscy5lbmNvZGVQYXRoKHNvdXJjZS5nZXRVUkkoKSkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIlJlc29sdmluZyBwb2xpY2llcyBkaXJlY3RvcnkgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZU1hbmFnZXIoKS5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiUG9saWNpZXMgZGlyZWN0b3J5IHJlc29sdmVkIHRvIFsiICsgZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpICsgIl0iKTsKLSAgICAgICAgICAgIHNldFBvbGljaWVzRGlyZWN0b3J5KGRpcmVjdG9yeSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5wb2xpY2llc0RpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2VydmljZU1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB0aGlzLmNhY2hlID0gKFNvdXJjZUNhY2hlKSBtYW5hZ2VyLmxvb2t1cChTb3VyY2VDYWNoZS5ST0xFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwb2xpY2llcyBkaXJlY3RvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpcmVjdG9yeSBUaGUgZGlyZWN0b3J5LgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCBhIGRpcmVjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljaWVzRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJTZXR0aW5nIHBvbGljaWVzIGRpcmVjdG9yeSBbIiArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIik7Ci0gICAgICAgIGlmICghZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKCJQb2xpY2llcyBkaXJlY3RvcnkgaW52YWxpZDogWyIKLSAgICAgICAgICAgICAgICAgICAgKyBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucG9saWNpZXNEaXJlY3RvcnkgPSBkaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkluaGVyaXRpbmdQb2xpY3lNYW5hZ2VyI2dldFBvbGljaWVzKG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFBvbGljeVtdIGdldFBvbGljaWVzKEFjY3JlZGl0YWJsZU1hbmFnZXIgY29udHJvbGxlciwgU3RyaW5nIHVybCkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFVSTCBbIiArIHVybCArICJdIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHNsYXNoISIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgIExpc3QgcG9saWNpZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgICAgICBIYXNoTWFwIG9yZGVyZWRQb2xpY2llcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGludCBwb3NpdGlvbiA9IDE7Ci0gICAgICAgIFBvbGljeSBwb2xpY3k7Ci0gICAgICAgIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gdXJsLnNwbGl0KCIvIik7Ci0gICAgICAgIHVybCA9IGRpcmVjdG9yaWVzWzBdICsgIi8iOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZGlyZWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHVybCArPSBkaXJlY3Rvcmllc1tpXSArICIvIjsKLSAgICAgICAgICAgIHBvbGljeSA9IGJ1aWxkU3VidHJlZVBvbGljeShjb250cm9sbGVyLCB1cmwpOwotICAgICAgICAgICAgb3JkZXJlZFBvbGljaWVzLnB1dChTdHJpbmcudmFsdWVPZihwb3NpdGlvbiksIHBvbGljeSk7Ci0gICAgICAgICAgICBwb3NpdGlvbisrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSBvcmRlcmVkUG9saWNpZXMuc2l6ZSgpOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgICAgICBwb2xpY2llcy5hZGQob3JkZXJlZFBvbGljaWVzLmdldChTdHJpbmcudmFsdWVPZihpKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRGVmYXVsdFBvbGljeVtdKSBwb2xpY2llcy50b0FycmF5KG5ldyBEZWZhdWx0UG9saWN5W3BvbGljaWVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGUjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotICAgICAgICBpZiAoZ2V0Q2FjaGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRTZXJ2aWNlTWFuYWdlcigpLnJlbGVhc2UoZ2V0Q2FjaGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRpc3Bvc2luZyBbIiArIHRoaXMgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBhY2NyZWRpdGFibGUgZnJvbSBhbGwgcG9saWNpZXMgd2l0aGluIGEgY2VydGFpbiBkaXJlY3RvcnkKLSAgICAgKiB0cmVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlciB3aGljaCBvd25zIHRoZSBhY2NyZWRpdGFibGUuCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZSBUaGUgYWNjcmVkaXRhYmxlIHRvIHJlbW92ZS4KLSAgICAgKiBAcGFyYW0gcG9saWN5RGlyZWN0b3J5IFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHBvbGljaWVzIGFyZSBsb2NhdGVkLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBY2NyZWRpdGFibGUoQWNjcmVkaXRhYmxlTWFuYWdlciBtYW5hZ2VyLCBBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlLAotICAgICAgICAgICAgRmlsZSBwb2xpY3lEaXJlY3RvcnkpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBGaWxlW10gcG9saWN5RmlsZXMgPSBwb2xpY3lEaXJlY3RvcnkubGlzdEZpbGVzKG5ldyBTdWJ0cmVlRmlsZUZpbHRlcihTVUJUUkVFX0ZJTEVOQU1FKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlbW92ZWRBY2NyZWRpdGFibGVQb2xpY3lCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVtb3ZlZEFjY3JlZGl0YWJsZVBvbGljeUJ1aWxkZXIobWFuYWdlcik7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFJlbW92ZWRBY2NyZWRpdGFibGUoYWNjcmVkaXRhYmxlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9saWN5RmlsZXMubGVuZ3RoOyBpKyspIHsKLQotICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZW1vdmluZyByb2xlcyIpOwotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiICAgIEFjY3JlZGl0YWJsZTogWyIgKyBhY2NyZWRpdGFibGUgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEZpbGU6ICAgICAgICAgWyIgKyBwb2xpY3lGaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwb2xpY3lGaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgTW9kaWZpYWJsZVBvbGljeSBwb2xpY3kgPSBidWlsZGVyLmJ1aWxkUG9saWN5KHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgcG9saWN5LnJlbW92ZVJvbGVzKGFjY3JlZGl0YWJsZSk7Ci0gICAgICAgICAgICAgICAgc2F2ZVBvbGljeShwb2xpY3ksIHBvbGljeUZpbGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlW10gZGlyZWN0b3JpZXMgPSBwb2xpY3lEaXJlY3RvcnkubGlzdEZpbGVzKG5ldyBJc0RpcmVjdG9yeUZpbGVGaWx0ZXIoKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rvcmllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmVtb3ZlQWNjcmVkaXRhYmxlKG1hbmFnZXIsIGFjY3JlZGl0YWJsZSwgZGlyZWN0b3JpZXNbaV0pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlciNhY2NyZWRpdGFibGVSZW1vdmVkKG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjY3JlZGl0YWJsZVJlbW92ZWQoQWNjcmVkaXRhYmxlTWFuYWdlciBtYW5hZ2VyLCBBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQW4gYWNjcmVkaXRhYmxlIHdhcyByZW1vdmVkOiBbIiArIGFjY3JlZGl0YWJsZSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZW1vdmVBY2NyZWRpdGFibGUobWFuYWdlciwgYWNjcmVkaXRhYmxlLCBnZXRQb2xpY2llc0RpcmVjdG9yeSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIHNlcnZpY2VNYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIGdldFNlcnZpY2VNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlciNhY2NyZWRpdGFibGVBZGRlZChvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXIsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY2NyZWRpdGFibGVBZGRlZChBY2NyZWRpdGFibGVNYW5hZ2VyIG1hbmFnZXIsIEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIENyZWRlbnRpYWxbXSBnZXRDcmVkZW50aWFscyhBY2NyZWRpdGFibGVNYW5hZ2VyIGNvbnRyb2xsZXIsIFN0cmluZyB1cmwpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgVVJMIFsiICsgdXJsICsgIl0gZG9lc24ndCBzdGFydCB3aXRoIGEgc2xhc2ghIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgSGFzaE1hcCBvcmRlcmVkQ3JlZGVudGlhbCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIGludCBwb3NpdGlvbiA9IDE7Ci0KLSAgICAgICAgU3RyaW5nW10gZGlyZWN0b3JpZXMgPSB1cmwuc3BsaXQoIi8iKTsKLSAgICAgICAgdXJsID0gZGlyZWN0b3JpZXNbMF0gKyAiLyI7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBkaXJlY3Rvcmllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdXJsICs9IGRpcmVjdG9yaWVzW2ldICsgIi8iOwotICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IGJ1aWxkU3VidHJlZVBvbGljeShjb250cm9sbGVyLCB1cmwpOwotICAgICAgICAgICAgQ3JlZGVudGlhbFtdIHRtcCA9IHBvbGljeS5nZXRDcmVkZW50aWFscygpOwotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZXZlcnQgdGhlIG9yZGVyIG9mIHRoZSBjcmVkZW50aWFscwotICAgICAgICAgICAgLy8gdG8ga2VlcCB0aGUgbW9zdCBpbXBvcnRhbnQgcG9saWN5IG9uIHRvcAotICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRtcC5sZW5ndGggLSAxOyBqID49IDA7IGotLSkgewotICAgICAgICAgICAgICAgIENyZWRlbnRpYWwgY3JlZGVudGlhbCA9IHRtcFtqXTsKLSAgICAgICAgICAgICAgICBvcmRlcmVkQ3JlZGVudGlhbC5wdXQoU3RyaW5nLnZhbHVlT2YocG9zaXRpb24pLCBjcmVkZW50aWFsKTsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENyZWRlbnRpYWxbXSByZXR1cm5DcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWxJbXBsW29yZGVyZWRDcmVkZW50aWFsLnNpemUoKV07Ci0gICAgICAgIGludCB5ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IG9yZGVyZWRDcmVkZW50aWFsLnNpemUoKTsgaSA+IDA7IGktLSkgewotICAgICAgICAgICAgcmV0dXJuQ3JlZGVudGlhbFt5XSA9IChDcmVkZW50aWFsKSBvcmRlcmVkQ3JlZGVudGlhbC5nZXQoU3RyaW5nLnZhbHVlT2YoaSkpOwotICAgICAgICAgICAgeSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybkNyZWRlbnRpYWw7Ci0gICAgfQotCi0gICAgcHVibGljIFJvbGVbXSBnZXRHcmFudGVkUm9sZXMoQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyLCBJZGVudGl0eSBpZGVudGl0eSwKLSAgICAgICAgICAgIFN0cmluZyB1cmwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgUm9sZVtdIHJvbGVzID0gYWNjcmVkaXRhYmxlTWFuYWdlci5nZXRSb2xlTWFuYWdlcigpLmdldFJvbGVzKCk7Ci0gICAgICAgIFNldCBncmFudGVkUm9sZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBQb2xpY3kgcG9saWN5ID0gZ2V0UG9saWN5KGFjY3JlZGl0YWJsZU1hbmFnZXIsIHVybCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwb2xpY3kuY2hlY2soaWRlbnRpdHksIHJvbGVzW2ldKSA9PSBQb2xpY3kuUkVTVUxUX0dSQU5URUQpIHsKLSAgICAgICAgICAgICAgICBncmFudGVkUm9sZXMuYWRkKHJvbGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFJvbGVbXSkgZ3JhbnRlZFJvbGVzLnRvQXJyYXkobmV3IFJvbGVbZ3JhbnRlZFJvbGVzLnNpemUoKV0pOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVSb2xlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODI2ZjFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0Um9sZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuSXRlbUNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogRmlsZS1iYXNlZCByb2xlIGltcGxlbWVudGF0aW9uLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVJvbGUgZXh0ZW5kcyBBYnN0cmFjdFJvbGUgaW1wbGVtZW50cyBJdGVtIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVNTSUdOQUJMRSA9ICJhc3NpZ25hYmxlIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsZSByb2xlLgotICAgICAqIEBwYXJhbSBpdGVtTWFuYWdlciBUaGUgaXRlbSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcGFyYW0gaWQgVGhlIHJvbGUgSUQuCi0gICAgICovCi0gICAgcHVibGljIEZpbGVSb2xlKEl0ZW1NYW5hZ2VyIGl0ZW1NYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcyhpdGVtTWFuYWdlciwgbG9nZ2VyKTsKLSAgICAgICAgc2V0SWQoaWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEUgPSAicm9sZSI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZpbGVSb2xlIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gaXRlbU1hbmFnZXIgVGhlIGl0ZW0gbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIEZpbGVSb2xlKEl0ZW1NYW5hZ2VyIGl0ZW1NYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIHN1cGVyKGl0ZW1NYW5hZ2VyLCBsb2dnZXIpOwotICAgICAgICBGaWxlSXRlbU1hbmFnZXIgZmlsZUl0ZW1NYW5hZ2VyID0gKEZpbGVJdGVtTWFuYWdlcikgaXRlbU1hbmFnZXI7Ci0gICAgICAgIHNldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoZmlsZUl0ZW1NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIHRoaXMgaW5zdGFuY2Ugb2YgPGNvZGU+RmlsZVJvbGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIGNvbmZpZyBjb250YWluaW5nIHRoZSByb2xlIGRldGFpbHMKLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgdGhlIDxjb2RlPkZpbGVSb2xlPC9jb2RlPiBjb3VsZCBub3QKLSAgICAgKiAgICAgICAgIGJlIGNvbmZpZ3VyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IEl0ZW1Db25maWd1cmF0aW9uKCkuY29uZmlndXJlKHRoaXMsIGNvbmZpZyk7Ci0gICAgICAgIHRoaXMuaXNBc3NpZ25hYmxlID0gY29uZmlnLmdldEF0dHJpYnV0ZUFzQm9vbGVhbihBVFRSX0FTU0lHTkFCTEUsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIHJvbGUKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgdGhlIHNhdmUgZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvblNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvblNlcmlhbGl6ZXIoKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjcmVhdGVDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEZpbGUgeG1sUGF0aCA9IGdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKTsKLSAgICAgICAgRmlsZSB4bWxmaWxlID0gbmV3IEZpbGUoeG1sUGF0aCwgZ2V0SWQoKSArIEZpbGVSb2xlTWFuYWdlci5TVUZGSVgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvRmlsZSh4bWxmaWxlLCBjb25maWcpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb25maWd1cmF0aW9uIGNvbnRhaW5pbmcgdGhlIHJvbGUgZGV0YWlscwotICAgICAqIEByZXR1cm4gYSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKCkgewotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oUk9MRSk7Ci0gICAgICAgIG5ldyBJdGVtQ29uZmlndXJhdGlvbigpLnNhdmUodGhpcywgY29uZmlnKTsKLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY29uZmlndXJhdGlvbkRpcmVjdG9yeTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBc3NpZ25hYmxlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0gICAgICogQHJldHVybiBBIGZpbGUgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25EaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeShGaWxlIGZpbGUpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uRGlyZWN0b3J5ID0gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlzQXNzaWduYWJsZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZVJvbGVNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlUm9sZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5MDQyZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlUm9sZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGVNYW5hZ2VyOwotCi0vKioKLSAqIEZpbGUtYmFzZWQgcm9sZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmlsZVJvbGVNYW5hZ2VyIGV4dGVuZHMgRmlsZUl0ZW1NYW5hZ2VyIGltcGxlbWVudHMgUm9sZU1hbmFnZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICIucm1sIjsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgaW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgPGNvZGU+Um9sZU1hbmFnZXI8L2NvZGU+IGZvciB0aGlzIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LiBUaGUKLSAgICAgKiA8Y29kZT5Sb2xlTWFuYWdlcjwvY29kZT4gaXMgYSBzaW5nbGV0b24uCi0gICAgICogQHBhcmFtIG1nciBUaGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGVSb2xlTWFuYWdlcihBY2NyZWRpdGFibGVNYW5hZ2VyIG1ncikgewotICAgICAgICBzdXBlcihtZ3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvbGUgbWFuYWdlciBmb3IgdGhpcyBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKiBAcGFyYW0gbWdyIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkRpcmVjdG9yeSBUaGUgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEByZXR1cm4gQSByb2xlIG1hbmFnZXIuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGaWxlUm9sZU1hbmFnZXIgaW5zdGFuY2UoQWNjcmVkaXRhYmxlTWFuYWdlciBtZ3IsIEZpbGUgY29uZmlndXJhdGlvbkRpcmVjdG9yeSwgTG9nZ2VyIGxvZ2dlcikKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpbnN0YW5jZXMuY29udGFpbnNLZXkoY29uZmlndXJhdGlvbkRpcmVjdG9yeSkpIHsKLSAgICAgICAgICAgIEZpbGVSb2xlTWFuYWdlciBtYW5hZ2VyID0gbmV3IEZpbGVSb2xlTWFuYWdlcihtZ3IpOwotICAgICAgICAgICAgbWFuYWdlci5lbmFibGVMb2dnaW5nKGxvZ2dlcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGluc3RhbmNlcy5wdXQoY29uZmlndXJhdGlvbkRpcmVjdG9yeSwgbWFuYWdlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKEZpbGVSb2xlTWFuYWdlcikgaW5zdGFuY2VzLmdldChjb25maWd1cmF0aW9uRGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHJvbGUgZm9yIHRoZSBnaXZlbiBJRC4KLSAgICAgKiBAcGFyYW0gcm9sZUlkIFRoZSBuYW1lIG9mIHRoZSByb2xlIHJlcXVlc3RlZC4KLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Um9sZTwvY29kZT4gb3IgbnVsbCBpZiBubyByb2xlIHdpdGggdGhlIGdpdmVuIG5hbWUgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgUm9sZSBnZXRSb2xlKFN0cmluZyByb2xlSWQpIHsKLSAgICAgICAgcmV0dXJuIChSb2xlKSBnZXRJdGVtKHJvbGVJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZUl0ZW1NYW5hZ2VyI2dldFN1ZmZpeCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0gICAgICAgIHJldHVybiBTVUZGSVg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCByb2xlcwotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygcm9sZXMuCi0gICAgICovCi0gICAgcHVibGljIFJvbGVbXSBnZXRSb2xlcygpIHsKLSAgICAgICAgSXRlbVtdIGl0ZW1zID0gc3VwZXIuZ2V0SXRlbXMoKTsKLSAgICAgICAgUm9sZVtdIHJvbGVzID0gbmV3IFJvbGVbaXRlbXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcm9sZXNbaV0gPSAoUm9sZSkgaXRlbXNbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHJvbGUKLSAgICAgKiBAcGFyYW0gcm9sZSBUaGUgcm9sZSB0byBhZGQuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoUm9sZSByb2xlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmFkZChyb2xlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSByb2xlCi0gICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUgdG8gcmVtb3ZlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFJvbGUgcm9sZSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBzdXBlci5yZW1vdmUocm9sZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEl0ZW0gY3JlYXRlSXRlbSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlUm9sZSh0aGlzLCBnZXRMb2dnZXIoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVVc2VyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjcwYmNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVVc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5JdGVtQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBGaWxlLWJhc2VkIHVzZXIgaW1wbGVtZW50YXRpb24uCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXNlciBleHRlbmRzIEFic3RyYWN0VXNlciBpbXBsZW1lbnRzIEl0ZW0sIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZGVudGl0eSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUwgPSAiZW1haWwiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfTE9DQUxFID0gImRlZmF1bHQtbWVudS1sb2NhbGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0xPQ0FMRSA9ICJkZWZhdWx0LWRvY3VtZW50LWxvY2FsZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAicGFzc3dvcmQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQUyA9ICJncm91cHMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQID0gImdyb3VwIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9BVFRSSUJVVEUgPSAidHlwZSI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZpbGVVc2VyIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gaXRlbU1hbmFnZXIgVGhlIGl0ZW0gbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIEZpbGVVc2VyKEl0ZW1NYW5hZ2VyIGl0ZW1NYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIHN1cGVyKGl0ZW1NYW5hZ2VyLCBsb2dnZXIpOwotICAgICAgICBGaWxlSXRlbU1hbmFnZXIgZmlsZUl0ZW1NYW5hZ2VyID0gKEZpbGVJdGVtTWFuYWdlcikgaXRlbU1hbmFnZXI7Ci0gICAgICAgIHNldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoZmlsZUl0ZW1NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgRmlsZVVzZXIKLSAgICAgKiBAcGFyYW0gaXRlbU1hbmFnZXIgVGhlIGl0ZW0gbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGlkIHRoZSB1c2VyIGlkCi0gICAgICogQHBhcmFtIGZ1bGxOYW1lIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gZW1haWwgdGhlIHVzZXJzIGVtYWlsIGFkZHJlc3MKLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQgdGhlIHVzZXJzIHBhc3N3b3JkCi0gICAgICovCi0gICAgcHVibGljIEZpbGVVc2VyKEl0ZW1NYW5hZ2VyIGl0ZW1NYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgaWQsIFN0cmluZyBmdWxsTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBlbWFpbCwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIHN1cGVyKGl0ZW1NYW5hZ2VyLCBsb2dnZXIsIGlkLCBmdWxsTmFtZSwgZW1haWwsIHBhc3N3b3JkKTsKLSAgICAgICAgRmlsZUl0ZW1NYW5hZ2VyIGZpbGVJdGVtTWFuYWdlciA9IChGaWxlSXRlbU1hbmFnZXIpIGl0ZW1NYW5hZ2VyOwotICAgICAgICBzZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KGZpbGVJdGVtTWFuYWdlci5nZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSB0aGlzIEZpbGVVc2VyLgotICAgICAqIEBwYXJhbSBjb25maWcgd2hlcmUgdGhlIHVzZXIgZGV0YWlscyBhcmUgc3BlY2lmaWVkCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBuZWNlc3NhcnkgZGV0YWlscyBhcmVuJ3Qgc3BlY2lmaWVkCi0gICAgICogICAgICAgICBpbiB0aGUgY29uZmlnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJdGVtQ29uZmlndXJhdGlvbigpLmNvbmZpZ3VyZSh0aGlzLCBjb25maWcpOwotICAgICAgICBzZXRFbWFpbChjb25maWcuZ2V0Q2hpbGQoRU1BSUwpLmdldFZhbHVlKCIiKSk7Ci0gICAgICAgIHNldERlZmF1bHRNZW51TG9jYWxlKGNvbmZpZy5nZXRDaGlsZChNRU5VX0xPQ0FMRSkuZ2V0VmFsdWUoIiIpKTsKLSAgICAgICAgc2V0RGVmYXVsdERvY3VtZW50TG9jYWxlKGNvbmZpZy5nZXRDaGlsZChET0NVTUVOVF9MT0NBTEUpLmdldFZhbHVlKCIiKSk7Ci0gICAgICAgIHNldEVuY3J5cHRlZFBhc3N3b3JkKGNvbmZpZy5nZXRDaGlsZChQQVNTV09SRCkuZ2V0VmFsdWUobnVsbCkpOwotCi0gICAgICAgIHJlbW92ZUZyb21BbGxHcm91cHMoKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbltdIGdyb3VwcyA9IGNvbmZpZy5nZXRDaGlsZHJlbihHUk9VUFMpOwotCi0gICAgICAgIGlmIChncm91cHMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIGdyb3VwcyA9IGdyb3Vwc1swXS5nZXRDaGlsZHJlbihHUk9VUCk7Ci0KLSAgICAgICAgICAgIEdyb3VwTWFuYWdlciBtYW5hZ2VyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyID0gZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldEdyb3VwTWFuYWdlcigpOwotICAgICAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oImNvbmZpZ3VyYXRpb24gZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXBJZCA9IGdyb3Vwc1tpXS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gbWFuYWdlci5nZXRHcm91cChncm91cElkKTsKLQotICAgICAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJDb3VsZG4ndCBmaW5kIEdyb3VwIGZvciBncm91cCBuYW1lIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBncm91cElkICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWdyb3VwLmNvbnRhaW5zKHRoaXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZCh0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0cmFuZ2UsIGl0IHNob3VsZCBoYXZlIGdyb3VwcwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIlVzZXIgIiArIGdldElkKCkgKyAiIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGFueSBncm91cHMiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgY3VycmVudCB1c2VyIGRldGFpbHMuIENhbiBiZSB1c2VkIGZvcgotICAgICAqIHNhdmluZy4KLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKCkgewotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oSUQpOwotICAgICAgICBuZXcgSXRlbUNvbmZpZ3VyYXRpb24oKS5zYXZlKHRoaXMsIGNvbmZpZyk7Ci0KLSAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb24gY2hpbGQgPSBudWxsOwotCi0gICAgICAgIC8vIGFkZCBlbWFpbCBub2RlCi0gICAgICAgIGNoaWxkID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uKEVNQUlMKTsKLSAgICAgICAgY2hpbGQuc2V0VmFsdWUoZ2V0RW1haWwoKSk7Ci0gICAgICAgIGNvbmZpZy5hZGRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgLy8gYWRkIGRlZmF1bHRNZW51TG9jYWxlIG5vZGUKLSAgICAgICAgY2hpbGQgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oTUVOVV9MT0NBTEUpOwotICAgICAgICBjaGlsZC5zZXRWYWx1ZShnZXREZWZhdWx0TWVudUxvY2FsZSgpKTsKLSAgICAgICAgY29uZmlnLmFkZENoaWxkKGNoaWxkKTsKLQotICAgICAgICAvLyBhZGQgZGVmYXVsdERvY3VtZW50TG9jYWxlIG5vZGUKLSAgICAgICAgY2hpbGQgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oRE9DVU1FTlRfTE9DQUxFKTsKLSAgICAgICAgY2hpbGQuc2V0VmFsdWUoZ2V0RGVmYXVsdERvY3VtZW50TG9jYWxlKCkpOwotICAgICAgICBjb25maWcuYWRkQ2hpbGQoY2hpbGQpOwotCi0gICAgICAgIC8vIGFkZCBwYXNzd29yZCBub2RlCi0gICAgICAgIGNoaWxkID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uKFBBU1NXT1JEKTsKLSAgICAgICAgY2hpbGQuc2V0VmFsdWUoZ2V0RW5jcnlwdGVkUGFzc3dvcmQoKSk7Ci0gICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShQQVNTV09SRF9BVFRSSUJVVEUsICJtZDUiKTsKLSAgICAgICAgY29uZmlnLmFkZENoaWxkKGNoaWxkKTsKLQotICAgICAgICAvLyBhZGQgZ3JvdXAgbm9kZXMKLSAgICAgICAgY2hpbGQgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oR1JPVVBTKTsKLSAgICAgICAgY29uZmlnLmFkZENoaWxkKGNoaWxkKTsKLQotICAgICAgICBHcm91cFtdIGdyb3VwcyA9IGdldEdyb3VwcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbiBncm91cE5vZGUgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oR1JPVVApOwotICAgICAgICAgICAgZ3JvdXBOb2RlLnNldFZhbHVlKGdyb3Vwc1tpXS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGNoaWxkLmFkZENoaWxkKGdyb3VwTm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyI3NhdmUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIERlZmF1bHRDb25maWd1cmF0aW9uU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uU2VyaWFsaXplcigpOwotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemVUb0ZpbGUoZ2V0RmlsZSgpLCBjb25maWcpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuVXNlciNkZWxldGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZGVsZXRlKCk7Ci0gICAgICAgIGdldEZpbGUoKS5kZWxldGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICogQHJldHVybiBBIGZpbGUgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIEZpbGUgeG1sUGF0aCA9IGdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKTsKLSAgICAgICAgRmlsZSB4bWxGaWxlID0gbmV3IEZpbGUoeG1sUGF0aCwgZ2V0SWQoKSArIEZpbGVVc2VyTWFuYWdlci5TVUZGSVgpOwotICAgICAgICByZXR1cm4geG1sRmlsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY29uZmlndXJhdGlvbkRpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LgotICAgICAqIEByZXR1cm4gQSBmaWxlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uRGlyZWN0b3J5OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoRmlsZSBfY29uZmlndXJhdGlvbkRpcmVjdG9yeSkgewotICAgICAgICBhc3NlcnQgKF9jb25maWd1cmF0aW9uRGlyZWN0b3J5ICE9IG51bGwpICYmIF9jb25maWd1cmF0aW9uRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkRpcmVjdG9yeSA9IF9jb25maWd1cmF0aW9uRGlyZWN0b3J5OwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVVc2VyTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZVVzZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTdkYmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZVVzZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyVHlwZTsKLQotLyoqCi0gKiBGaWxlLWJhc2VkIHVzZXIgbWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEZpbGVVc2VyTWFuYWdlciBleHRlbmRzIEZpbGVJdGVtTWFuYWdlciBpbXBsZW1lbnRzIFVzZXJNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBpbnN0YW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgU2V0IHVzZXJUeXBlczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFVzZXJNYW5hZ2VyCi0gICAgICogCi0gICAgICogQHBhcmFtIG1nciBUaGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIF91c2VyVHlwZXMgVGhlIHN1cHBvcnRlZCB1c2VyIHR5cGVzLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiB0aGUgVXNlck1hbmFnZXIgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVVc2VyTWFuYWdlcihBY2NyZWRpdGFibGVNYW5hZ2VyIG1nciwgVXNlclR5cGVbXSBfdXNlclR5cGVzKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBzdXBlcihtZ3IpOwotICAgICAgICB0aGlzLnVzZXJUeXBlcyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoX3VzZXJUeXBlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlc2NyaWJlIDxjb2RlPmluc3RhbmNlPC9jb2RlPiBtZXRob2QgaGVyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWdyIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkRpcmVjdG9yeSBhIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSB1c2VyVHlwZXMgVGhlIHN1cHBvcnRlZCB1c2VyIHR5cGVzLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPlVzZXJNYW5hZ2VyPC9jb2RlPiB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZpbGVVc2VyTWFuYWdlciBpbnN0YW5jZShBY2NyZWRpdGFibGVNYW5hZ2VyIG1nciwgRmlsZSBjb25maWd1cmF0aW9uRGlyZWN0b3J5LCBVc2VyVHlwZVtdIHVzZXJUeXBlcywgTG9nZ2VyIGxvZ2dlcikKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBhc3NlcnQgY29uZmlndXJhdGlvbkRpcmVjdG9yeSAhPSBudWxsOwotICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25EaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IFsiICsgY29uZmlndXJhdGlvbkRpcmVjdG9yeQotICAgICAgICAgICAgICAgICAgICArICJdIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpbnN0YW5jZXMuY29udGFpbnNLZXkoY29uZmlndXJhdGlvbkRpcmVjdG9yeSkpIHsKLSAgICAgICAgICAgIEZpbGVVc2VyTWFuYWdlciBtYW5hZ2VyID0gbmV3IEZpbGVVc2VyTWFuYWdlcihtZ3IsIHVzZXJUeXBlcyk7Ci0gICAgICAgICAgICBtYW5hZ2VyLmVuYWJsZUxvZ2dpbmcobG9nZ2VyKTsKLSAgICAgICAgICAgIG1hbmFnZXIuY29uZmlndXJlKGNvbmZpZ3VyYXRpb25EaXJlY3RvcnkpOwotICAgICAgICAgICAgaW5zdGFuY2VzLnB1dChjb25maWd1cmF0aW9uRGlyZWN0b3J5LCBtYW5hZ2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoRmlsZVVzZXJNYW5hZ2VyKSBpbnN0YW5jZXMuZ2V0KGNvbmZpZ3VyYXRpb25EaXJlY3RvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgdXNlcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciB0byBpdGVyYXRlIG92ZXIgYWxsIHVzZXJzCi0gICAgICovCi0gICAgcHVibGljIFVzZXJbXSBnZXRVc2VycygpIHsKLSAgICAgICAgSXRlbVtdIGl0ZW1zID0gc3VwZXIuZ2V0SXRlbXMoKTsKLSAgICAgICAgVXNlcltdIHVzZXJzID0gbmV3IFVzZXJbaXRlbXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdXNlcnNbaV0gPSAoVXNlcikgaXRlbXNbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVzZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyTWFuYWdlciNhZGQob3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChVc2VyIHVzZXIpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuYWRkKHVzZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyTWFuYWdlciNyZW1vdmUob3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShVc2VyIHVzZXIpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIucmVtb3ZlKHVzZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdXNlciB3aXRoIHRoZSBnaXZlbiB1c2VyIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VySWQgdXNlciBpZCBvZiByZXF1ZXN0ZWQgdXNlcgotICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCB1c2VyIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gdXNlciB3aXRoIHRoZSBnaXZlbiB1c2VyIGlkCi0gICAgICovCi0gICAgcHVibGljIFVzZXIgZ2V0VXNlcihTdHJpbmcgdXNlcklkKSB7Ci0gICAgICAgIHJldHVybiAoVXNlcikgZ2V0SXRlbSh1c2VySWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyTWFuYWdlciNnZXRVc2VyVHlwZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBVc2VyVHlwZVtdIGdldFVzZXJUeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIChVc2VyVHlwZVtdKSB0aGlzLnVzZXJUeXBlcy50b0FycmF5KG5ldyBVc2VyVHlwZVt0aGlzLnVzZXJUeXBlcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUZGSVggPSAiLmltbCI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlSXRlbU1hbmFnZXIjZ2V0U3VmZml4KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLSAgICAgICAgcmV0dXJuIFNVRkZJWDsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyMWI0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnRocmVhZC5UaHJlYWRTYWZlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlclJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGUuVVJMS2V5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQ2FjaGVNYXA7Ci0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gZm9yIGFjY2VzcyBjb250cm9sbGVyIHJlc29sdmVycy4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWNjZXNzQ29udHJvbGxlclJlc29sdmVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQKLSAgICBpbXBsZW1lbnRzIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciwgU2VydmljZWFibGUsIFRocmVhZFNhZmUgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUNJVFkgPSAxMDAwOwotICAgIHByaXZhdGUgQ2FjaGVNYXAgY2FjaGU7Ci0gICAgCi0gICAgcHJvdGVjdGVkIENhY2hlTWFwIGdldENhY2hlKCkgewotICAgICAgICBpZiAodGhpcy5jYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmNhY2hlID0gbmV3IENhY2hlTWFwKENBUEFDSVRZLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciNyZXNvbHZlQWNjZXNzQ29udHJvbGxlcihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBBY2Nlc3NDb250cm9sbGVyIHJlc29sdmVBY2Nlc3NDb250cm9sbGVyKFN0cmluZyB3ZWJhcHBVcmwpCi0gICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIgY29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgIE9iamVjdCBrZXkgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIGtleSA9IGdlbmVyYXRlQ2FjaGVLZXkod2ViYXBwVXJsLCByZXNvbHZlcik7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQWNjZXNzIGNvbnRyb2xsZXIgY2FjaGUga2V5OiBbIiArIGtleSArICJdIik7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENhY2hlTWFwIGNhY2hlID0gZ2V0Q2FjaGUoKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlKSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gKEFjY2Vzc0NvbnRyb2xsZXIpIGNhY2hlLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJObyBhY2Nlc3MgY29udHJvbGxlciBpbiBjYWNoZS4iKTsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyID0gZG9SZXNvbHZlQWNjZXNzQ29udHJvbGxlcih3ZWJhcHBVcmwpOwotICAgICAgICAgICAgICAgIGNhY2hlLnB1dChrZXksIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiR2V0dGluZyBhY2Nlc3MgY29udHJvbGxlciBmcm9tIGNhY2hlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgY2FjaGUga2V5IGZvciB0aGUgYWNjZXNzIGNvbnRyb2xsZXIuCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgd2ViYXBwIFVSTC4KLSAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgVGhlIHNvdXJjZSByZXNvbHZlci4KLSAgICAgKiBAcmV0dXJuIEFuIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdlbmVyYXRlQ2FjaGVLZXkoU3RyaW5nIHdlYmFwcFVybCwgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGtleTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGtleSA9IFVSTEtleVV0aWwuZ2VuZXJhdGVLZXkocmVzb2x2ZXIsIHdlYmFwcFVybCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBhY3R1YWwgcmVzb2x2aW5nIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSBVUkwgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICogQHJldHVybiBBbiBhY2Nlc3MgY29udHJvbGxlci4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWNjZXNzQ29udHJvbGxlciBkb1Jlc29sdmVBY2Nlc3NDb250cm9sbGVyKFN0cmluZyB3ZWJhcHBVcmwpCi0gICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciNyZWxlYXNlKG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKEFjY2Vzc0NvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICAvKgotICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgICAgICAqLwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgX21hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlNlcnZpY2luZyBbIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iKTsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gX21hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VydmljZSBtYW5hZ2VyIG9mIHRoaXMgU2VydmljZWFibGUuCi0gICAgICogQHJldHVybiBBIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0Fic3RyYWN0QWNjcmVkaXRhYmxlTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RBY2NyZWRpdGFibGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMTI4MmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RBY2NyZWRpdGFibGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklQUmFuZ2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1NYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXJNYW5hZ2VyOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFjY3JlZGl0YWJsZSBtYW5hZ2Vycy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWNjcmVkaXRhYmxlTWFuYWdlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkCi0gICAgaW1wbGVtZW50cyBBY2NyZWRpdGFibGVNYW5hZ2VyLCBJdGVtTWFuYWdlckxpc3RlbmVyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0QWNjcmVkaXRhYmxlTWFuYWdlcihMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSBudWxsOwotICAgIHByaXZhdGUgR3JvdXBNYW5hZ2VyIGdyb3VwTWFuYWdlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBJUFJhbmdlTWFuYWdlciBpcFJhbmdlTWFuYWdlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBSb2xlTWFuYWdlciByb2xlTWFuYWdlciA9IG51bGw7Ci0KLSAgICBwcml2YXRlIExpc3QgaXRlbU1hbmFnZXJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLQkgKiBBdHRhY2hlcyBhbiBpdGVtIG1hbmFnZXIgbGlzdGVuZXIgdG8gdGhpcyBhY2NyZWRpdGFibGUgbWFuYWdlci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIgQW4gaXRlbSBtYW5hZ2VyIGxpc3RlbmVyLgotCSAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEl0ZW1NYW5hZ2VyTGlzdGVuZXIoSXRlbU1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAoIXRoaXMuaXRlbU1hbmFnZXJMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkFkZGluZyBsaXN0ZW5lcjogWyIgKyBsaXN0ZW5lciArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuaXRlbU1hbmFnZXJMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotCSAqIFJlbW92ZXMgYW4gaXRlbSBtYW5hZ2VyIGxpc3RlbmVyIGZyb20gdGhpcyBhY2NyZWRpdGFibGUgbWFuYWdlci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIgQW4gaXRlbSBtYW5hZ2VyIGxpc3RlbmVyLgotCSAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW1NYW5hZ2VyTGlzdGVuZXIoSXRlbU1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlbW92aW5nIGxpc3RlbmVyOiBbIiArIGxpc3RlbmVyICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIHRoaXMuaXRlbU1hbmFnZXJMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXJzIHRoYXQgYW4gaXRlbSB3YXMgYWRkZWQuCi0JICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCB3YXMgYWRkZWQuCi0JICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gYSBub3RpZmllZCBsaXN0ZW5lciB0aHJldyB0aGlzIGV4Y2VwdGlvbi4KLQkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlBZGRlZChJdGVtIGl0ZW0pIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBjbG9uZSA9IG5ldyBBcnJheUxpc3QodGhpcy5pdGVtTWFuYWdlckxpc3RlbmVycyk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNsb25lLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSXRlbU1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lciA9IChJdGVtTWFuYWdlckxpc3RlbmVyKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLml0ZW1BZGRlZChpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotCSAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lcnMgdGhhdCBhbiBpdGVtIHdhcyByZW1vdmVkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIHJlbW92ZWQuCi0JICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gYSBub3RpZmllZCBsaXN0ZW5lciB0aHJldyB0aGlzIGV4Y2VwdGlvbi4KLQkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlSZW1vdmVkKEl0ZW0gaXRlbSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBMaXN0IGNsb25lID0gbmV3IEFycmF5TGlzdCh0aGlzLml0ZW1NYW5hZ2VyTGlzdGVuZXJzKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY2xvbmUuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJdGVtTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKEl0ZW1NYW5hZ2VyTGlzdGVuZXIpIGkubmV4dCgpOwotICAgICAgICAgICAgbGlzdGVuZXIuaXRlbVJlbW92ZWQoaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXJMaXN0ZW5lciNpdGVtQWRkZWQob3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIGl0ZW1BZGRlZChJdGVtIGl0ZW0pIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJJdGVtIHdhcyBhZGRlZDogWyIgKyBpdGVtICsgIl0gLSBub3RpZnlpbmcgbGlzdGVuZXJzIik7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5QWRkZWQoaXRlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1NYW5hZ2VyTGlzdGVuZXIjaXRlbVJlbW92ZWQob3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIGl0ZW1SZW1vdmVkKEl0ZW0gaXRlbSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkl0ZW0gd2FzIHJlbW92ZWQ6IFsiICsgaXRlbSArICJdIC0gbm90aWZ5aW5nIGxpc3RlbmVycyIpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVJlbW92ZWQoaXRlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXIjZ2V0VXNlck1hbmFnZXIoKQotCSAqLwotICAgIHB1YmxpYyBVc2VyTWFuYWdlciBnZXRVc2VyTWFuYWdlcigpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMudXNlck1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy51c2VyTWFuYWdlciA9IGluaXRpYWxpemVVc2VyTWFuYWdlcigpOwotICAgICAgICAgICAgdGhpcy51c2VyTWFuYWdlci5hZGRJdGVtTWFuYWdlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnVzZXJNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyI2dldEdyb3VwTWFuYWdlcigpCi0JICovCi0gICAgcHVibGljIEdyb3VwTWFuYWdlciBnZXRHcm91cE1hbmFnZXIoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmdyb3VwTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmdyb3VwTWFuYWdlciA9IGluaXRpYWxpemVHcm91cE1hbmFnZXIoKTsKLSAgICAgICAgICAgIHRoaXMuZ3JvdXBNYW5hZ2VyLmFkZEl0ZW1NYW5hZ2VyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyI2dldFJvbGVNYW5hZ2VyKCkKLQkgKi8KLSAgICBwdWJsaWMgUm9sZU1hbmFnZXIgZ2V0Um9sZU1hbmFnZXIoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLnJvbGVNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucm9sZU1hbmFnZXIgPSBpbml0aWFsaXplUm9sZU1hbmFnZXIoKTsKLSAgICAgICAgICAgIHRoaXMucm9sZU1hbmFnZXIuYWRkSXRlbU1hbmFnZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yb2xlTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciNnZXRJUFJhbmdlTWFuYWdlcigpCi0JICovCi0gICAgcHVibGljIElQUmFuZ2VNYW5hZ2VyIGdldElQUmFuZ2VNYW5hZ2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5pcFJhbmdlTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmlwUmFuZ2VNYW5hZ2VyID0gaW5pdGlhbGl6ZUlQUmFuZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB0aGlzLmlwUmFuZ2VNYW5hZ2VyLmFkZEl0ZW1NYW5hZ2VyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaXBSYW5nZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGdyb3VwIG1hbmFnZXIuCi0JICogCi0gICAgICogQHJldHVybiBBIGdyb3VwIG1hbmFnZXIuCi0JICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0JICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEdyb3VwTWFuYWdlciBpbml0aWFsaXplR3JvdXBNYW5hZ2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgSVAgcmFuZ2UgbWFuYWdlci4KLQkgKiAKLSAgICAgKiBAcmV0dXJuIEFuIElQIHJhbmdlIG1hbmFnZXIuCi0JICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0JICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IElQUmFuZ2VNYW5hZ2VyIGluaXRpYWxpemVJUFJhbmdlTWFuYWdlcigpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHJvbGUgbWFuYWdlci4KLQkgKiAKLSAgICAgKiBAcmV0dXJuIEEgcm9sZSBtYW5hZ2VyLgotCSAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotCSAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSb2xlTWFuYWdlciBpbml0aWFsaXplUm9sZU1hbmFnZXIoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB1c2VyIG1hbmFnZXIuCi0JICogCi0gICAgICogQHJldHVybiBBIHVzZXIgbWFuYWdlci4KLQkgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLQkgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVXNlck1hbmFnZXIgaW5pdGlhbGl6ZVVzZXJNYW5hZ2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0Fic3RyYWN0R3JvdXAuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0Fic3RyYWN0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzZTA0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXBhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXI7Ci0KLQotLyoqCi0gKiBBIGdyb3VwIGlzIGEgc2V0IG9mIHtAbGluayBHcm91cGFibGV9cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R3JvdXAgZXh0ZW5kcyBBYnN0cmFjdEl0ZW0gaW1wbGVtZW50cyBBY2NyZWRpdGFibGUsIEdyb3VwIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGdyb3VwLgotICAgICAqIEBwYXJhbSBpdGVtTWFuYWdlciBUaGUgaXRlbSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RHcm91cChJdGVtTWFuYWdlciBpdGVtTWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBzdXBlcihpdGVtTWFuYWdlciwgbG9nZ2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGdyb3VwLgotICAgICAqIEBwYXJhbSBpdGVtTWFuYWdlciBUaGUgaXRlbSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcGFyYW0gaWQgVGhlIGdyb3VwIElELgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEdyb3VwKEl0ZW1NYW5hZ2VyIGl0ZW1NYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNldCBtZW1iZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbWJlcnMgb2YgdGhpcyBncm91cC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHtAbGluayBHcm91cGFibGV9cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JvdXBhYmxlW10gZ2V0TWVtYmVycygpIHsKLSAgICAgICAgcmV0dXJuIChHcm91cGFibGVbXSkgdGhpcy5tZW1iZXJzLnRvQXJyYXkobmV3IEdyb3VwYWJsZVt0aGlzLm1lbWJlcnMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBZGRzIGEgbWVtYmVyIHRvIHRoaXMgZ3JvdXAuCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHRvIGFkZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoR3JvdXBhYmxlIG1lbWJlcikgewotICAgICAgICBhc3NlcnQgKG1lbWJlciAhPSBudWxsKSAmJiAhdGhpcy5tZW1iZXJzLmNvbnRhaW5zKG1lbWJlcik7Ci0gICAgICAgIHRoaXMubWVtYmVycy5hZGQobWVtYmVyKTsKLSAgICAgICAgbWVtYmVyLmFkZGVkVG9Hcm91cCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbWVtYmVyIGZyb20gdGhpcyBncm91cC4KLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgdG8gcmVtb3ZlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShHcm91cGFibGUgbWVtYmVyKSB7Ci0gICAgICAgIGFzc2VydCAobWVtYmVyICE9IG51bGwpICYmIHRoaXMubWVtYmVycy5jb250YWlucyhtZW1iZXIpOwotICAgICAgICB0aGlzLm1lbWJlcnMucmVtb3ZlKG1lbWJlcik7Ci0gICAgICAgIG1lbWJlci5yZW1vdmVkRnJvbUdyb3VwKHRoaXMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBtZW1iZXJzIGZyb20gdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxNZW1iZXJzKCkgewotICAgICAgICBHcm91cGFibGVbXSBfbWVtYmVycyA9IGdldE1lbWJlcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWVtYmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmVtb3ZlKF9tZW1iZXJzW2ldKTsgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoaXMgZ3JvdXAgY29udGFpbnMgdGhpcyBtZW1iZXIuCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKEdyb3VwYWJsZSBtZW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWVtYmVycy5jb250YWlucyhtZW1iZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGUjZ2V0QWNjcmVkaXRhYmxlcygpCi0gICAgICovCi0gICAgcHVibGljIEFjY3JlZGl0YWJsZVtdIGdldEFjY3JlZGl0YWJsZXMoKSB7Ci0gICAgICAgIEFjY3JlZGl0YWJsZVtdIGFjY3JlZGl0YWJsZXMgPSB7IHRoaXMgfTsKLSAgICAgICAgcmV0dXJuIGFjY3JlZGl0YWJsZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERlbGV0ZSBhIGdyb3VwCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSBkZWxldGUgZmFpbGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZW1vdmVBbGxNZW1iZXJzKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdEdyb3VwYWJsZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RHcm91cGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmODQzZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdEdyb3VwYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtTWFuYWdlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBmb3IgZ3JvdXAgbWVtYmVycy4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R3JvdXBhYmxlIGV4dGVuZHMgQWJzdHJhY3RJdGVtIGltcGxlbWVudHMgR3JvdXBhYmxlLCBBY2NyZWRpdGFibGUgewotICAgIAotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEdyb3VwYWJsZShJdGVtTWFuYWdlciBpdGVtTWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBzdXBlcihpdGVtTWFuYWdlciwgbG9nZ2VyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNldCBncm91cHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwYWJsZSNhZGRlZFRvR3JvdXAob3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRlZFRvR3JvdXAoR3JvdXAgZ3JvdXApIHsKLSAgICAgICAgYXNzZXJ0IGdyb3VwICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBncm91cC5jb250YWlucyh0aGlzKTsKLSAgICAgICAgdGhpcy5ncm91cHMuYWRkKGdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXBhYmxlI3JlbW92ZWRGcm9tR3JvdXAob3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVkRnJvbUdyb3VwKEdyb3VwIGdyb3VwKSB7Ci0gICAgICAgIGFzc2VydCBncm91cCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgIWdyb3VwLmNvbnRhaW5zKHRoaXMpOwotICAgICAgICB0aGlzLmdyb3Vwcy5yZW1vdmUoZ3JvdXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cGFibGUjZ2V0R3JvdXBzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JvdXBbXSBnZXRHcm91cHMoKSB7Ci0gICAgICAgIHJldHVybiAoR3JvdXBbXSkgdGhpcy5ncm91cHMudG9BcnJheShuZXcgR3JvdXBbdGhpcy5ncm91cHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGlzIGdyb3VwYWJsZSBmcm9tIGFsbCBpdHMgZ3JvdXBzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZyb21BbGxHcm91cHMoKSB7Ci0gICAgICAgIEdyb3VwW10gX2dyb3VwcyA9IGdldEdyb3VwcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2dyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgX2dyb3Vwc1tpXS5yZW1vdmUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlI2dldEFjY3JlZGl0YWJsZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBBY2NyZWRpdGFibGVbXSBnZXRBY2NyZWRpdGFibGVzKCkgewotICAgICAgICBTZXQgYWNjcmVkaXRhYmxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGFjY3JlZGl0YWJsZXMuYWRkKHRoaXMpOwotCi0gICAgICAgIEdyb3VwW10gX2dyb3VwcyA9IGdldEdyb3VwcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2dyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQWNjcmVkaXRhYmxlW10gZ3JvdXBBY2NyZWRpdGFibGVzID0gX2dyb3Vwc1tpXS5nZXRBY2NyZWRpdGFibGVzKCk7Ci0gICAgICAgICAgICBhY2NyZWRpdGFibGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdyb3VwQWNjcmVkaXRhYmxlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChBY2NyZWRpdGFibGVbXSkgYWNjcmVkaXRhYmxlcy50b0FycmF5KG5ldyBBY2NyZWRpdGFibGVbYWNjcmVkaXRhYmxlcy5zaXplKCldKTsKLSAgICB9Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RJUFJhbmdlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdElQUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwYjkxYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdElQUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklQUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLk1hY2hpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5uZXQuSW5ldEFkZHJlc3NVdGlsOwotCi0vKioKLSAqIDxwPgotICogQSByYW5nZSBvZiBJUCBhZGRyZXNzZXMsIGV4cHJlc3NlZCBieSBhIG5ldHdvcmsgYWRkcmVzcyBhbmQgYSBzdWJuZXQgbWFzay4KLSAqIDwvcD4KLSAqIDxwPgotICogTm90ZTogdGhpcyBjbGFzcyBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIG5ldHdvcmsgYWRkcmVzcyBhbmQgdGhlIHN1Ym5ldCBtYXNrIGhhdmUgdGhlIHNhbWUgc2l6ZQotICogKGkuZS4gZWl0aGVyIGJvdGggSVB2NCBvciBib3RoIElQdjYgYWRkcmVzc2VzKS4gSWYgdGhlIHRoZSBuZXR3b3JrIGFkZHJlc3MgYW5kIHN1Ym5ldCBtYXNrIGhhdmUKLSAqIGRpZmZlcmVudCBzaXplcywgdGhlIHJhbmdlIGRvZXMgbm90IGNvbnRhaW4gYW55IGhvc3RzLCB0aGF0IGlzIHtAbGluayAjY29udGFpbnMoTWFjaGluZSl9IHdpbGwKLSAqIGFsd2F5cyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJUFJhbmdlIGV4dGVuZHMgQWJzdHJhY3RHcm91cGFibGUgaW1wbGVtZW50cyBJUFJhbmdlIHsKLSAgICAvKgotICAgICAqIEZJWE1FIGJ5IHppc2NoQGRhbHMuY2g6IEZpeGVkIHRoaXMgY2xhc3MgZm9yIElQdjYuIEhvd2V2ZXIgdGhlcmUgYXJlIHN0aWxsIHNvbWUgZ2VuZXJhbAotICAgICAqIGZsYXdzLCBwYXJ0bHkgY29taW5nIGZyb20gdGhlIElQUmFuZ2UgaW50ZXJmYWNlLiBBIHJlZGVzaWduIG9mIChBYnN0cmFjdC9GaWxlKUlQUmFuZ2UgYW5kCi0gICAgICogaXQncyBoZWxwZXIgY2xhc3Mgb3JnLmFwYWNoZS5sZW55YS5uZXQuSW5ldEFkZHJlc3NVdGlsIHdvdWxkIGJlIGEgZ29vZCBpZGVhLiBTb21lIHByb2JsZW1zIG9mCi0gICAgICogdGhpcyBpbXBsZW1lbnRhdGlvbiBhcmU6Ci0gICAgICogIC0gVGhlIHdob2xlIGluaXRpYWxpemF0aW9uIHNlZW1zIGZsYXdlZC4gT2JqZWN0cyBjYW4gYmUgaW4gYW4gdW5pdGlhbGl6ZWQgc3RhdGUgYW5kIHRoZQotICAgICAqIGNsYXNzIHNlZW1zIG5vdCB0byBiZSBhd2FyZSBvZiB0aGlzLgotICAgICAqICAtIE5ldHdvcmstYWRkcmVzcyBhbmQgLW1hc2sgY2FuIGJlIHNldCBpbmRlcGVuZGVudGx5LiBUaGVyZWZvcmUgaXQgY2Fubm90IGJlIGVuZm9yY2VkIHRoYXQKLSAgICAgKiB0aGVzZSBoYXZlIHRoZSBzYW1lIHNpemUgKGkuZS4gdGhhdCBib3RoIGFyZSBJUHY0IG9yIGJvdGggYXJlIElQdjYpLiBUaGlzIHNob3dzIHVwIGluCi0gICAgICogSW5ldEFkZHJlc3NVdGlsLmNvbnRhaW5zKC4uLiksIHdoZXJlIGluIGEgY2FzZSBvZiBtaXNtYXRjaCB0aGVyZSBpcyBubyBnb29kIHdheSB0byBpbmZvcm0gdGhlCi0gICAgICogdXNlciBhYm91dCB0aGUgcHJvYmxlbS4gVGhpcyBzaG91bGQgYmUgZG9uZSBvbmNlIHdoZW4gdGhlIEFic3RyYWN0SVBSYW5nZSBvYmplY3QgaXMKLSAgICAgKiBpbml0aWFsaXplZC4KLSAgICAgKiAgLSBVbmxlc3MgdGhpcyBmdW5jdGlvbmFsaXR5IHdvdWxkIGJlIG5lZWRlZCBieSBvdGhlciBwYXJ0cyBvZiBMZW55YSBvciBleHRlcm5hbCBzb2Z0d2FyZQotICAgICAqICh3aGljaCBzZWVtcyBub3QgdG8gYmUgdGhlIGNhc2UgOy0pLCBJbmV0QWRkcmVzc1V0aWwgc2hvdWxkIGJlIHJlbW92ZWQgKHJlc3AuIGRlcHJlY2F0ZWQpCi0gICAgICogYWx0b2dldGhlciwgYmVjYXVzZSBpdCdzIG1vc3RseSBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgQWJzdHJhY3RJUFJhbmdlLgotICAgICAqIEFic3RyYWN0SVBSYW5nZSBzaG91bGQgaW1wbGVtZW50IHRoZSBjb250YWlucyguLi4pLW1ldGhvZCBpbnRlcm5hbGx5IHRvIG1ha2UgdXNlIG9mIHRoZSBmYWN0Ci0gICAgICogdGhhdCB0aGUgbmV0d29yay0gYWRkcmVzc2VzIGFuZCAtbWFza3MgdmFsaWRpdHkgYW5kIGNvbXBhdGliaWxpdHkgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkCi0gICAgICogd2hlbiBzZXR0aW5nIHRoZXNlLiAoT25jZSB0aGUgYWJvdmUgcHJvYmxlbXMgaGF2ZSBiZWVuIGZpeGVkLiA7LSkKLSAgICAgKiAgLSBFc3BlY2lhbGx5IGZvciBJUHY2IGl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc3BlY2lmeSB0aGUgbmV0bWFzayBhcyB0aGUKLSAgICAgKiBudW1iZXIgb2YgYml0cyAoYXMgaW4gIjo6MS8xMjgiIG9yICIxMjcuMC4wLjEvMjQiKS4KLSAgICAgKiAKLSAgICAgKiBGSVhNRSBJSSAoZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbik6IHdoeSBhcmUgd2UgaW4gdGhlIGJ1c2luZXNzIG9mIGltcGxlbWVudGluZyBJUCByYW5nZXM/PwotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBJbml0aWFsaXplcyB0aGUgdGhlIElQIHJhbmdlIHdpdGggdGhlIGxvY2FsIGhvc3QgKDEyNy4wLjAuMS8yNCBmb3IgSVB2NCwgOjoxLzEyOCBmb3IgSVB2NikuCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdElQUmFuZ2UoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLm5ldHdvcmtBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0gICAgICAgICAgICBieXRlW10gbWFzayA9IG51bGw7Ci0gICAgICAgICAgICBpbnQgbWFza2xlbiA9IHRoaXMubmV0d29ya0FkZHJlc3MuZ2V0QWRkcmVzcygpLmxlbmd0aDsKLSAgICAgICAgICAgIGlmIChtYXNrbGVuID09IDQpIHsKLSAgICAgICAgICAgICAgICAvKiBJUHY0OiAqLwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRklYTUU/IGJ5IHppc2NoQGRhbHMuY2g6IFNob3VsZCB0aGlzIGJlIHsgLTEsIDAsIDAsIDAgfT8/Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbWFzayA9IG5ldyBieXRlW10geyAtMSwgLTEsIC0xLCAwIH07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIElQdjYgKGFuZCBvdGhlcnMgOy0pOiAqLwotICAgICAgICAgICAgICAgIG1hc2sgPSBuZXcgYnl0ZVttYXNrbGVuXTsKLSAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChtYXNrLCAoYnl0ZSkgLTEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdWJuZXRNYXNrID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKG1hc2spOwotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBGSVhNRT8gYnkgemlzY2hAZGFscy5jaDogSXMgaXQgc2FmZSB0byBpZ25vcmUgdGhlIGV4Y2VwdGlvbiBhbmQganVzdCBsZWF2ZSB0aGUKLSAgICAgICAgICAgICAqIElQUmFuZ2UgdW5pbml0aWFsaXplZCE/Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEBwYXJhbSBpZCBUaGUgSVAgcmFuZ2UgSUQuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0SVBSYW5nZShJdGVtTWFuYWdlciBpdGVtTWFuYWdlciwgTG9nZ2VyIGxvZ2dlciwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHN1cGVyKGl0ZW1NYW5hZ2VyLCBsb2dnZXIpOwotICAgICAgICBzZXRJZChpZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIGNvbmZpZ3VyYXRpb25EaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKiBAcmV0dXJuIEEgZmlsZSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbkRpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KEZpbGUgX2NvbmZpZ3VyYXRpb25EaXJlY3RvcnkpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uRGlyZWN0b3J5ID0gX2NvbmZpZ3VyYXRpb25EaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgSVAgcmFuZ2UKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgdGhlIHNhdmUgZmFpbGVkCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlIGFuIElQIHJhbmdlCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSBkZWxldGUgZmFpbGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZW1vdmVGcm9tQWxsR3JvdXBzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBuZXR3b3JrQWRkcmVzczsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5ldHdvcmsgYWRkcmVzcy4gVGhpcyBtZXRob2QgYWNjZXB0cyBudW1lcmljIElQdjQgYWRkcmVzc2VzIGxpa2UKLSAgICAgKiA8Y29kZT4iMTI5LjE2OC4wLjMyIjwvY29kZT4sIG51bWVyaWMgSVB2NiBhZGRyZXNzZXMgbGlrZQotICAgICAqIDxjb2RlPiIxMDgwOjo4OjgwMDoyMDBDOjQxN0EiPC9jb2RlPiBhcyB3ZWxsIGFzIGhvc3RuYW1lcyAoaWYgRE5TIHJlc29sdXRpb24gaXMgYXZhaWxhYmxlKQotICAgICAqIGxpa2UgPGNvZGU+ImxvY2FsaG9zdCI8L2NvZGU+IG9yIDxjb2RlPiJ3d3cuYXBhY2hlLmNvbSI8L2NvZGU+LgotICAgICAqIEBwYXJhbSBhZGRyZXNzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBsaWtlIDxjb2RlPiIxOTIuMTY4LjAuMzIiPC9jb2RlPiwKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPiI6OjEiPC9jb2RlPiwgLi4uCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIGNvbnZlcnNpb24gb2YgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYW4KLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5JbmV0QWRkcmVzczwvY29kZT4gZmFpbGVkCi0gICAgICogQHNlZSAjc2V0TmV0d29ya0FkZHJlc3MoYnl0ZVtdKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5ldHdvcmtBZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLm5ldHdvcmtBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFkZHJlc3MpOwotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNvbnZlcnQgYWRkcmVzcyBbIiArIGFkZHJlc3MgKyAiXTogIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuZXR3b3JrIGFkZHJlc3MuIFRoZSBtZXRob2QgYWNjZXB0cyBudW1lcmljIElQdjQgYWRkcmVzc2VzIChzcGVjaWZpZWQgYnkgYnl0ZSBhcnJheXMKLSAgICAgKiBvZiBsZW5ndGggNCkgb3IgSVB2NiBhZGRyZXNzZXMgKHNwZWNpZmllZCBieSBieXRlIGFycmF5cyBvZiBsZW5ndGggMTYpLgotICAgICAqIEBwYXJhbSBhZGRyZXNzIGEgYnl0ZSBhcnJheSBvZiB0aGUgbGVuZ3RoIDQgb3IgMTYKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiB0aGUgY29udmVyc2lvbiBvZiB0aGUgYnl0ZSBhcnJheSB0byBhbiBJbmV0QWRkcmVzcwotICAgICAqICAgICAgICAgICAgIGZhaWxlZC4KLSAgICAgKiBAc2VlICNzZXROZXR3b3JrQWRkcmVzcyhTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmV0d29ya0FkZHJlc3MoYnl0ZVtdIGFkZHJlc3MpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMubmV0d29ya0FkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKCJGYWlsZWQgdG8gY29udmVydCBhZGRyZXNzIFsiICsgYWRkcjJzdHJpbmcoYWRkcmVzcykKLSAgICAgICAgICAgICAgICAgICAgKyAiXTogIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXR3b3JrIGFkZHJlc3MuCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5JbmV0QWRkcmVzczwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBuZXR3b3JrIGFkZHJlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0TmV0d29ya0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtBZGRyZXNzOwotICAgIH0KLQotICAgIHByaXZhdGUgSW5ldEFkZHJlc3Mgc3VibmV0TWFzazsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN1Ym5ldCBtYXNrLiBTZWUge0BsaW5rICNzZXROZXR3b3JrQWRkcmVzcyhTdHJpbmcpfSBmb3IgdGhlIGFsbG93ZWQgZm9ybWF0cyBvZiB0aGUKLSAgICAgKiA8Y29kZT5tYXNrPC9jb2RlPiBzdHJpbmcuIChIb3dldmVyLCB0aGUgaG9zdG5hbWUgZm9ybWF0IHdpbGwgdXN1YWxseSBub3QgYmUgb2YgbXVjaCB1c2UgZm9yCi0gICAgICogc2V0dGluZyB0aGUgbWFzay4pCi0gICAgICogPHA+Ci0gICAgICogT25seSB2YWxpZCBzdWJuZXQgbWFza3MgYXJlIGFjY2VwdGVkLCBmb3Igd2hpY2ggdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyBhIHNlcXVlbmNlIG9mCi0gICAgICogMS1iaXRzIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgMC1iaXRzLiBGb3IgZXhhbXBsZSA8Y29kZT4iMjU1LjEyOC4wLjAiPC9jb2RlPiBpcyB2YWxpZAotICAgICAqIHdoaWxlIDxjb2RlPiIyNTUuMTI4LjAuMSI8L2NvZGU+IGlzIG5vdC4KLSAgICAgKiBAcGFyYW0gbWFzayBhIDxjb2RlPlN0cmluZzwvY29kZT4gbGlrZSA8Y29kZT4iMjU1LjI1NS4yNTUuMCI8L2NvZGU+Ci0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIGNvbnZlcnNpb24gb2YgdGhlIFN0cmluZyB0byBhbgotICAgICAqICAgICAgICAgICAgIDxjb2RlPkluZXRBZGRyZXNzPC9jb2RlPiBmYWlsZWQuCi0gICAgICogQHNlZSAjc2V0U3VibmV0TWFzayhieXRlW10pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3VibmV0TWFzayhTdHJpbmcgbWFzaykgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLyogdXNlIHNldFN1Ym5ldE1hc2soLi4uKSB0byBjaGVjayB0aGUgbWFzay1mb3JtYXQ6ICovCi0gICAgICAgICAgICBzZXRTdWJuZXRNYXNrKEluZXRBZGRyZXNzLmdldEJ5TmFtZShtYXNrKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNvbnZlcnQgbWFzayBbIiArIG1hc2sgKyAiXTogIiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN1Ym5ldCBtYXNrLgotICAgICAqIDxwPgotICAgICAqIE9ubHkgdmFsaWQgc3VibmV0IG1hc2tzIGFyZSBhY2NlcHRlZCwgZm9yIHdoaWNoIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaXMgYSBzZXF1ZW5jZSBvZgotICAgICAqIDEtYml0cyBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mIDAtYml0cy4gRm9yIGV4YW1wbGUgPGNvZGU+eyAyNTUsIDEyOCwgMCwgMCB9PC9jb2RlPiBpcwotICAgICAqIHZhbGlkIHdoaWxlIDxjb2RlPnsgMjU1LCAxMjgsIDAsIDEgfTwvY29kZT4gaXMgbm90LgotICAgICAqIEBwYXJhbSBtYXNrIEEgYnl0ZSBhcnJheSBvZiB0aGUgbGVuZ3RoIDQuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gdGhlIGNvbnZlcnNpb24gb2YgdGhlIGJ5dGUgYXJyYXkgdG8gYW4gSW5ldEFkZHJlc3MKLSAgICAgKiAgICAgICAgICAgICBmYWlsZWQuCi0gICAgICogQHNlZSAjc2V0U3VibmV0TWFzayhTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3VibmV0TWFzayhieXRlW10gbWFzaykgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICAvKgotICAgICAgICAgKiBjaGVjayBmb3IgY29ycmVjdCBuZXRtYXNrIChpLmUuIGFueSBudW1iZXIgb2YgMS1iaXRzIGZvbGxvd2VkIGJ5IDAtYml0cyBmaWxsaW5nIHRoZSByaWdodAotICAgICAgICAgKiBwYXJ0IG9mIHRoZSBtYXNrKSAuLi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZJWE1FOiBUaGlzICJhbGdvcml0aG0iIGlzIHJhdGhlciB1bmVsZWdhbnQuIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8gZG8gaXQhIDstKQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJDSEVDS19ORVRNQVNLOiBjaGVjayAiICsgYWRkcjJzdHJpbmcobWFzaykpOwotICAgICAgICB9Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgQ0hFQ0tfTkVUTUFTSzogd2hpbGUgKGkgPCBtYXNrLmxlbmd0aCkgewotICAgICAgICAgICAgaW50IGIgPSBtYXNrW2krK10gJiAweGZmOwotICAgICAgICAgICAgLyogdGhlIGluaXRpYWwgYnl0ZShzKSBtdXN0IGJlIDI1NTogKi8KLSAgICAgICAgICAgIGlmIChiICE9IDB4ZmYpIHsKLSAgICAgICAgICAgICAgICAvKiBmaXJzdCBieXRlICE9IDI1NSwgdGVzdCBhbGwgcG9zc2liaWxpdGllczogKi8KLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ0hFQ0tfTkVUTUFTSzogZmlyc3QgYnl0ZSAhPSAyNTU6IGlkeDogIiArIChpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1hc2tbaWR4XTogMHgiICsgYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIDA6ICovCi0gICAgICAgICAgICAgICAgaWYgKGIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhayBDSEVDS19ORVRNQVNLOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCB0c3QgPSAweGZlOyB0c3QgIT0gMDsgdHN0ID0gKHRzdCA8PCAxKSAmIDB4ZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkNIRUNLX05FVE1BU0s6IHRzdCA9PSAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRzdCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSB0c3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIENIRUNLX05FVE1BU0s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJbnZhbGlkIGJ5dGUgZm91bmQsIGkuZS4gb25lIHdoaWNoIGlzIG5vdCBlbGVtZW50IG9mIHsgMTExMTExMTEsIDExMTExMTEwLAotICAgICAgICAgICAgICAgICAqIDExMTExMTAwLCAxMTExMTAwMCwgLi4uLCAwMDAwMDAwMCB9Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIkludmFsaWQgYnl0ZSBpbiBtYXNrIFsiICsgYWRkcjJzdHJpbmcobWFzaykgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIHRoZSByZW1haW5pbmcgYnl0ZShzKSAoaWYgYW55KSBtdXN0IGJlIDA6ICovCi0gICAgICAgIHdoaWxlICgrK2kgPCBtYXNrLmxlbmd0aCkgewotICAgICAgICAgICAgaWYgKG1hc2tbaV0gIT0gMCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSW52YWxpZCBieXRlIGZvdW5kLCBpLmUuIHNvbWUgbm9uLXplcm8gYnl0ZSByaWdodCBvZiB0aGUgZmlyc3Qgbm9uLXplcm8gYnl0ZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiSW52YWxpZCBub24temVybyBieXRlIGluIG1hc2sgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYWRkcjJzdHJpbmcobWFzaykgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29udmVydCB0aGUgY2hlY2tlZCBtYXNrIHRvIEluZXRBZGRyZXNzOiAqLwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5zdWJuZXRNYXNrID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKG1hc2spOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb252ZXJ0IG1hc2sgWyIgKyBhZGRyMnN0cmluZyhtYXNrKSArICJdOiAiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1Ym5ldCBtYXNrLgotICAgICAqIEByZXR1cm4gQW4gSW5ldEFkZHJlc3MgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIEluZXRBZGRyZXNzIGdldFN1Ym5ldE1hc2soKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN1Ym5ldE1hc2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgbmV0d29yayBhZGRyZXNzIC8gc3VibmV0IG1hc2sgY29tYmluYXRpb24gZGVzY3JpYmVzIGEgdmFsaWQgc3VibmV0LgotICAgICAqIEBwYXJhbSBuZXR3b3JrQWRkcmVzcyBUaGUgbmV0d29yayBhZGRyZXNzLgotICAgICAqIEBwYXJhbSBzdWJuZXRNYXNrIFRoZSBzdWJuZXQgbWFzay4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkLCBwcm9iYWJseSBub3QgbmVjZXNzYXJ5LmFuZCBjb3VsZCBiZQotICAgICAqICAgICAgICAgICAgIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gVGhlcmVmb3JlIGl0IHNob3VsZCBub3QgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFN1Ym5ldChJbmV0QWRkcmVzcyBuZXR3b3JrQWRkcmVzcywgSW5ldEFkZHJlc3Mgc3VibmV0TWFzaykgewotICAgICAgICAvKgotICAgICAgICAgKiBGSVhNRT8gYnkgemlzY2hAZGFscy5jaDogSXMgdGhpcyBtZXRob2QgcmVhbGx5IG5lY2Vzc2FyeSAod2hhdCBmb3I/KSBhbmQgKGlmIHNvKQotICAgICAgICAgKiBzaG91bGRuJ3QgaXQgYmUgYW4gaW50ZXJuYWwgKHByaXZhdGUpIHV0aWxpdHktbWV0aG9kPz8KLSAgICAgICAgICovCi0gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGNsYXNzCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhpcyBJUCByYW5nZSBjb250YWlucyBhIGNlcnRhaW4gbWFjaGluZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBpZiB0aGUgbmV0d29yayBhZGRyZXNzIGFuZCB0aGUgc3VibmV0IG1hc2sgb2YgdGhpcyBJUCByYW5nZSBoYXZlIGRpZmZlcmVudCBzaXplcyAoaS5lLgotICAgICAqIG9uZSBpcyBJUHY0IGFuZCBvbmUgaXMgSVB2NiksIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4sIG5vIG1hdHRlcgotICAgICAqIHdoYXQgbWFjaGluZSBoYXMgYmVlbiBzcGVjaWZpZWQhCi0gICAgICogPHA+Ci0gICAgICogRnVydGhlciwgaWYgdGhlIG1hY2hpbmUgYWRkcmVzcyBhbmQgdGhlIElQIHJhbmdlIChpLmUuIG5ldHdvcmsgYWRkcmVzcyBhbmQgc3VibmV0IG1hc2spIGhhdmUKLSAgICAgKiBkaWZmZXJlbnQgc2l6ZXMsIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LiAoSW4gb3RoZXIgd29yZHM6IGFuIElQdjQgcmFuZ2UKLSAgICAgKiBuZXZlciBjb250YWlucyBhbiBJUHY2IGFkZHJlc3MgYW5kIHRoZSBvdGhlciB3YXkgcm91bmQuKQotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgYWJvdmUgY2FuIGxlYWQgdG8gY29uZnVzaW9uLiBGb3IgZXhhbXBsZSB0aGUgbG9jYWwgc3VibmV0IGluIElQdjQgKAotICAgICAqIDxjb2RlPjEyNy4wLjAuMC84PC9jb2RlPikgd2lsbCA8Yj5ub3QgPC9iPiBjb250YWluIHRoZSBsb2NhbGhvc3QgaW4gSVB2NiAoCi0gICAgICogPGNvZGU+OjoxPC9jb2RlPiksIGFuZCB0aGUgbG9jYWxob3N0IGluIElQdjQgKDxjb2RlPjEyNy4wLjAuMTwvY29kZT4pIHdpbGwgPGI+bm90IDwvYj4KLSAgICAgKiBiZSBjb250YWluZWQgaW4gdGhlIGxvY2FsIHN1Ym5ldCBpbiBJUHY2ICg8Y29kZT46OjEvMTI4PC9jb2RlPikuCi0gICAgICogQHBhcmFtIG1hY2hpbmUgdGhlIG1hY2hpbmUgdG8gY2hlY2sgZm9yCi0gICAgICogQHJldHVybiBhIGJvb2xlYW4gdmFsdWUKLSAgICAgKiBAc2VlIEluZXRBZGRyZXNzVXRpbCNjb250YWlucwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE1hY2hpbmUgbWFjaGluZSkgewotICAgICAgICAvKgotICAgICAgICAgKiBGSVhNRT8gYnkgemlzY2hAZGFscy5jaDogTWF5YmUgc29tZSBtYXBwaW5nIGJldHdlZW4gSVB2NC92NiBzaG91bGQgYmUgZG9uZSBoZXJlLCBwLmUuIGZvcgotICAgICAgICAgKiB0aGUgbG9jYWxob3N0IChzZWUgdGhlIGphdmRvYyBjb21tZW50IGFib3ZlKT8gKEknbSBub3QgYSBUQ1AvSVAtZ3VydSwgc28gSSdtIG5vdCBzdXJlCi0gICAgICAgICAqIGFib3V0IHRoaXMuIDstKQotICAgICAgICAgKi8KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkNoZWNraW5nIElQIHJhbmdlOiBbIiArIGdldElkKCkgKyAiXSIpOwotICAgICAgICBJbmV0QWRkcmVzc1V0aWwgdXRpbCA9IG5ldyBJbmV0QWRkcmVzc1V0aWwoZ2V0TG9nZ2VyKCkpOwotICAgICAgICByZXR1cm4gdXRpbC5jb250YWlucyh0aGlzLm5ldHdvcmtBZGRyZXNzLCB0aGlzLnN1Ym5ldE1hc2ssIG1hY2hpbmUuZ2V0QWRkcmVzcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXQgdGhlIHNwZWNpZmllZCBudW1lcmljIElQIGFkZHJlc3MuCi0gICAgICogQHBhcmFtIGFkZHIgdGhlIHJhdyBudW1lcmljIElQIGFkZHJlc3MKLSAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgYWRkcmVzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRyMnN0cmluZyhieXRlW10gYWRkcikgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiAoYWRkci5sZW5ndGggPiA0KSB7Ci0gICAgICAgICAgICAvKiBJUHY2LWZvcm1hdCBpZiBtb3JlIHRoYW4gNCBieXRlczogKi8KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiAoaSAmIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnOicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhhZGRyW2ldICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgaWYgKGhleC5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChoZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogSVB2NC1mb3JtYXQ6ICovCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZHIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnLicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGFkZHJbaV0gJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0Fic3RyYWN0SXRlbS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiN2FkMjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgYWxsIGFjY2VzcyBjb250cm9sIG9iamVjdHMgdGhhdCBjYW4gYmUgbWFuYWdlZCBieSBhbgotICoge0BsaW5rIG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXJ9LiBJdCBpcyBvbmx5IHVzZWQgZm9yIGNvZGUgcmV1c2UuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEl0ZW0gZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBJdGVtLCBDb21wYXJhYmxlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOwotCi0gICAgcHJpdmF0ZSBJdGVtTWFuYWdlciBpdGVtTWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIgdGhpcyBpdGVtIGJlbG9uZ3MgdG8uCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEl0ZW0oSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoIml0ZW0gbWFuYWdlciIsIGl0ZW1NYW5hZ2VyKTsKLSAgICAgICAgdGhpcy5pdGVtTWFuYWdlciA9IGl0ZW1NYW5hZ2VyOwotCi0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJsb2dnZXIiLCBsb2dnZXIpOwotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodGhpcywgbG9nZ2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjcmVkaXRhYmxlTWFuYWdlciBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gZ2V0SXRlbU1hbmFnZXIoKS5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSUQuCi0gICAgICogQHBhcmFtIHN0cmluZyBUaGUgSUQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0SWQoU3RyaW5nIHN0cmluZykgewotICAgICAgICBhc3NlcnQgSXRlbVV0aWwuaXNWYWxpZElkKHN0cmluZyk7Ci0gICAgICAgIHRoaXMuaWQgPSBzdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSUQuCi0gICAgICogQHJldHVybiBUaGUgSUQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gX2Rlc2NyaXB0aW9uIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBfZGVzY3JpcHRpb24pIHsKLSAgICAgICAgYXNzZXJ0IF9kZXNjcmlwdGlvbiAhPSBudWxsOwotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldElkKCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZ1bGwgbmFtZQotICAgICAqIEBwYXJhbSBfbmFtZSB0aGUgbmV3IGZ1bGwgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIF9uYW1lKSB7Ci0gICAgICAgIGFzc2VydCBfbmFtZSAhPSBudWxsOwotICAgICAgICB0aGlzLm5hbWUgPSBfbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyT2JqZWN0KSB7Ci0gICAgICAgIGJvb2xlYW4gZXF1YWxzID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGdldENsYXNzKCkuaXNJbnN0YW5jZShvdGhlck9iamVjdCkpIHsKLSAgICAgICAgICAgIEFic3RyYWN0SXRlbSBvdGhlck1hbmFnZWFibGUgPSAoQWJzdHJhY3RJdGVtKSBvdGhlck9iamVjdDsKLSAgICAgICAgICAgIFN0cmluZyB0aGlzTWdySWQgPSBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0SWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBvdGhlck1ncklkID0gb3RoZXJNYW5hZ2VhYmxlLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRJZCgpOwotICAgICAgICAgICAgZXF1YWxzID0gZ2V0SWQoKS5lcXVhbHMob3RoZXJNYW5hZ2VhYmxlLmdldElkKCkpICYmIHRoaXNNZ3JJZC5lcXVhbHMob3RoZXJNZ3JJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWFsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJZCgpLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBYnN0cmFjdEl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJZCgpLmNvbXBhcmVUbygoKEFic3RyYWN0SXRlbSkgb2JqKS5nZXRJZCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbU1hbmFnZXIgZ2V0SXRlbU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLml0ZW1NYW5hZ2VyOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0Fic3RyYWN0Um9sZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RSb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNDUxNTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWJzdHJhY3RSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogQSBSb2xlIGVtYm9kaWVzIHRoZSBwcml2aWxlZ2UgdG8gZG8gY2VydGFpbiB0aGluZ3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJvbGUgZXh0ZW5kcyBBYnN0cmFjdEl0ZW0gaW1wbGVtZW50cyBSb2xlIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFJvbGUuCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdFJvbGUoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSb2xlLgotICAgICAqIEBwYXJhbSBpdGVtTWFuYWdlciBUaGUgaXRlbSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcm9sZSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdFJvbGUoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMoaXRlbU1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJuYW1lIiwgbmFtZSk7Ci0gICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BYnN0cmFjdFVzZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0Fic3RyYWN0VXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTNlODEwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0Fic3RyYWN0VXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUGFzc3dvcmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotCi0vKioKLSAqIEFic3RyYWN0IHVzZXIgaW1wbGVtZW50YXRpb24uCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFVzZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwYWJsZSBpbXBsZW1lbnRzIFVzZXIgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jcnlwdGVkUGFzc3dvcmQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE1lbnVMb2NhbGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdERvY3VtZW50TG9jYWxlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBVc2VyLgotICAgICAqIEBwYXJhbSBpdGVtTWFuYWdlciBUaGUgaXRlbSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RVc2VyKEl0ZW1NYW5hZ2VyIGl0ZW1NYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIHN1cGVyKGl0ZW1NYW5hZ2VyLCBsb2dnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFVzZXIgaW5zdGFuY2UKLSAgICAgKiBAcGFyYW0gaXRlbU1hbmFnZXIgVGhlIGl0ZW0gbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHBhcmFtIGlkIHRoZSB1c2VyIGlkCi0gICAgICogQHBhcmFtIGZ1bGxOYW1lIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gX2VtYWlsIHRoZSB1c2VycyBlbWFpbCBhZGRyZXNzCi0gICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSB1c2VycyBwYXNzd29yZAotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdFVzZXIoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIsIFN0cmluZyBpZCwgU3RyaW5nIGZ1bGxOYW1lLAotICAgICAgICAgICAgU3RyaW5nIF9lbWFpbCwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIHRoaXMoaXRlbU1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgc2V0TmFtZShmdWxsTmFtZSk7Ci0gICAgICAgIHRoaXMuZW1haWwgPSBfZW1haWw7Ci0gICAgICAgIHNldFBhc3N3b3JkKHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGVtYWlsIGFkZHJlc3MKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmVtYWlsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW1haWwgYWRkcmVzcwotICAgICAqIEBwYXJhbSBfZW1haWwgdGhlIG5ldyBlbWFpbCBhZGRyZXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIF9lbWFpbCkgewotICAgICAgICB0aGlzLmVtYWlsID0gX2VtYWlsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhc3N3b3JkLgotICAgICAqIEBwYXJhbSBwbGFpblRleHRQYXNzd29yZCBUaGUgcGxhaW4gdGV4dCBwYXNzd3JvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGxhaW5UZXh0UGFzc3dvcmQpIHsKLSAgICAgICAgdGhpcy5lbmNyeXB0ZWRQYXNzd29yZCA9IFBhc3N3b3JkLmVuY3J5cHQocGxhaW5UZXh0UGFzc3dvcmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBzdWJjbGFzc2VzIHRvIHNldCB0aGUgcGFzc3dvcmQgd2l0aG91dCBpdAotICAgICAqIGJlaW5nIGVuY3J5cHRlZCBhZ2Fpbi4gU29tZSBzdWJjbGFzcyBtaWdodCBoYXZlIGtub3dsZWRnZSBvZiB0aGUKLSAgICAgKiBlbmNyeXB0ZWQgcGFzc3dvcmQgYW5kIG5lZWRzIHRvIGJlIGFibGUgdG8gc2V0IGl0LgotICAgICAqIEBwYXJhbSBfZW5jcnlwdGVkUGFzc3dvcmQgdGhlIGVuY3J5cHRlZCBwYXNzd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEVuY3J5cHRlZFBhc3N3b3JkKFN0cmluZyBfZW5jcnlwdGVkUGFzc3dvcmQpIHsKLSAgICAgICAgdGhpcy5lbmNyeXB0ZWRQYXNzd29yZCA9IF9lbmNyeXB0ZWRQYXNzd29yZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGVuY3J5cHRlZCBwYXNzd29yZAotICAgICAqIEByZXR1cm4gdGhlIGVuY3J5cHRlZCBwYXNzd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RW5jcnlwdGVkUGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRlZFBhc3N3b3JkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBzdXBwb3J0IGZvciBjaGFuZ2luZyBwYXNzd29yZAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwYXNzd29yZCBjaGFuZ2UgaXMgc3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuQ2hhbmdlUGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdERvY3VtZW50TG9jYWxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERvY3VtZW50TG9jYWxlKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdERvY3VtZW50TG9jYWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkZWZhdWx0RG9jdW1lbnRMb2NhbGUgVGhlIGRlZmF1bHREb2N1bWVudExvY2FsZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdERvY3VtZW50TG9jYWxlKFN0cmluZyBkZWZhdWx0RG9jdW1lbnRMb2NhbGUpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0RG9jdW1lbnRMb2NhbGUgPSBkZWZhdWx0RG9jdW1lbnRMb2NhbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0TWVudUxvY2FsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRNZW51TG9jYWxlKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdE1lbnVMb2NhbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRlZmF1bHRNZW51TG9jYWxlIFRoZSBkZWZhdWx0TWVudUxvY2FsZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE1lbnVMb2NhbGUoU3RyaW5nIGRlZmF1bHRNZW51TG9jYWxlKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdE1lbnVMb2NhbGUgPSBkZWZhdWx0TWVudUxvY2FsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSB1c2VyCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSBzYXZlIGZhaWxlZAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBhIHVzZXIKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgdGhlIGRlbGV0ZSBmYWlsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlbW92ZUZyb21BbGxHcm91cHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRoZW50aWNhdGUgYSB1c2VyLiBUaGlzIGlzIGRvbmUgYnkgZW5jcnlwdGluZyB0aGUgZ2l2ZW4gcGFzc3dvcmQgYW5kCi0gICAgICogY29tcGFyaW5nIHRoaXMgdG8gdGhlIGVuY3J5cHRlZFBhc3N3b3JkLgotICAgICAqIEBwYXJhbSBwYXNzd29yZCB0byBhdXRoZW50aWNhdGUgd2l0aAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcGFzc3dvcmQgbWF0Y2hlcyB0aGUgcGFzc3dvcmQgZm9yIHRoaXMgdXNlcgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkxEQVAgUGFzc3dvcmQ6ICIgKyBwYXNzd29yZCk7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJMREFQIHB3IGVuY3lwdGVkOiAiICsgUGFzc3dvcmQuZW5jcnlwdChwYXNzd29yZCkpOwotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiTERBUCBvcmlnIGVuY3J5cHRlZCBwdzogIiArIHRoaXMuZW5jcnlwdGVkUGFzc3dvcmQpOwotCi0gICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRlZFBhc3N3b3JkLmVxdWFscyhQYXNzd29yZC5lbmNyeXB0KHBhc3N3b3JkKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Bbm9ueW1vdXNBdXRoZW50aWNhdG9yLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Bbm9ueW1vdXNBdXRoZW50aWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTY3NzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQW5vbnltb3VzQXV0aGVudGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKLSAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKiAgCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BdXRoZW50aWNhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotCi0KLS8qKgotICogVGhlIGFub255bW91cyBhdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0ZXMgdG8gYW4gYW5vbnltb3VzIHVzZXIgd2l0aCBubyBwYXNzd29yZCAKLSAqICh5b3UganVzdCBoYXZlIHRvIGFkZCBhIHVzZXIgbmFtZWQgJ2Fub255bW91cycgd2l0aCBhbiBhcmJpdHJhcnkgcGFzc3dvcmQgYW5kIHRoZSBwZXJtaXNzaW9ucwotICogeW91J2QgbGlrZSB2aWEgdGhlIGFkbWluIHNjcmVlbikuIFRoaXMgaXMgdXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggY2xpZW50IGNlcnRpZmljYXRlcy4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEFub255bW91c0F1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBBdXRoZW50aWNhdG9yIHsKLQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5BdXRoZW50aWNhdG9yI2F1dGhlbnRpY2F0ZShvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXIsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShBY2NyZWRpdGFibGVNYW5hZ2VyIGFjY3JlZGl0YWJsZU1hbmFnZXIsIFJlcXVlc3QgcmVxdWVzdCkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotCVN0cmluZyB1c2VybmFtZSA9ICJhbm9ueW1vdXMiOwotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW5nIHVzZXJuYW1lIFsiICsgdXNlcm5hbWUgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSAoSWRlbnRpdHkpIHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSkuZ2V0QXR0cmlidXRlKElkZW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgVXNlciB1c2VyID0gYWNjcmVkaXRhYmxlTWFuYWdlci5nZXRVc2VyTWFuYWdlcigpLmdldFVzZXIodXNlcm5hbWUpOwotCi0gICAgICAgIGJvb2xlYW4gYXV0aGVudGljYXRlZCA9IGZhbHNlOwotICAgICAgICBpZiAodXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJVc2VyIFsiICsgdXNlciArICJdIGF1dGhlbnRpY2F0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaWRlbnRpdHkuY29udGFpbnModXNlcikpIHsKLSAgICAgICAgICAgICAgICBVc2VyIG9sZFVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlbW92aW5nIHVzZXIgWyIgKyBvbGRVc2VyICsgIl0gZnJvbSBpZGVudGl0eS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZGVudGl0eS5yZW1vdmVJZGVudGlmaWFibGUob2xkVXNlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlkZW50aXR5LmFkZElkZW50aWZpYWJsZSh1c2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJObyBzdWNoIHVzZXI6IFsiICsgdXNlcm5hbWUgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiVXNlciBbIiArIHVzZXJuYW1lICsgIl0gbm90IGF1dGhlbnRpY2F0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF1dGhlbnRpY2F0ZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQnlwYXNzYWJsZUFjY2Vzc0NvbnRyb2xsZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0J5cGFzc2FibGVBY2Nlc3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjN2Q0ZTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQnlwYXNzYWJsZUFjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uc2l0ZW1hcC5QYXR0ZXJuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnJlZ2V4cC5SRTsKLWltcG9ydCBvcmcuYXBhY2hlLnJlZ2V4cC5SRUNvbXBpbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUucmVnZXhwLlJFUHJvZ3JhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnJlZ2V4cC5SRVN5bnRheEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBY2Nlc3NDb250cm9sbGVyIHRoYXQgY2FuIGJlIGJ5cGFzc2VkIGZvciBjZXJ0YWluIFVSTCBwYXR0ZXJucy4KLSAqLwotcHVibGljIGNsYXNzIEJ5cGFzc2FibGVBY2Nlc3NDb250cm9sbGVyIGV4dGVuZHMgRGVmYXVsdEFjY2Vzc0NvbnRyb2xsZXIgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnlwYXNzYWJsZUFjY2Vzc0NvbnRyb2xsZXIoKSB7Ci0JICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgcHVibGljTWF0Y2hlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBMaXN0IHB1YmxpY0V4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZSNjb25maWd1cmUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25mKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZShjb25mKTsKLSAgICAgICAgCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJDb25maWd1cmluZyBieXBhc3MgcGF0dGVybnMiKTsKLSAgICAgICAgCi0gICAgICAgIENvbmZpZ3VyYXRpb25bXSBwdWJsaWNzID0gY29uZi5nZXRDaGlsZHJlbigicHVibGljIik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJsaWNzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHVibGljSHJlZiA9IHB1YmxpY3NbaV0uZ2V0VmFsdWUobnVsbCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wdWJsaWNNYXRjaGVycy5hZGQocHJlcGFyZVBhdHRlcm4ocHVibGljSHJlZikpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGF0dGVybkV4Y2VwdGlvbiBwZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJpbnZhbGlkIHBhdHRlcm4gZm9yIHB1YmxpYyBocmVmcyIsIHBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ09ORklHVVJBVElPTjogcHVibGljOiAiICsgcHVibGljSHJlZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENvbmZpZ3VyYXRpb25bXSBleHRlbnNpb25Db25maWdzID0gY29uZi5nZXRDaGlsZHJlbigicHVibGljLWV4dGVuc2lvbnMiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25Db25maWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uU3RyaW5nID0gZXh0ZW5zaW9uQ29uZmlnc1tpXS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgU3RyaW5nW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblN0cmluZy5zcGxpdCgiLCIpOwotICAgICAgICAgICAgZm9yIChpbnQgZSA9IDA7IGUgPCBleHRlbnNpb25zLmxlbmd0aDsgZSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV4dCA9IGV4dGVuc2lvbnNbZV0udHJpbSgpOwotICAgICAgICAgICAgICAgIGlmICghZXh0LnN0YXJ0c1dpdGgoIi4iKSkgewotICAgICAgICAgICAgICAgICAgICBleHQgPSAiLiIgKyBleHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMucHVibGljRXh0ZW5zaW9ucy5hZGQoZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGlsZSB0aGUgcGF0dGVybiBpbiBhIDxjb2RlPm9yZy5hcGFjaGUucmVnZXhwLlJFUHJvZ3JhbTwvY29kZT4uCi0gICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gY29tcGlsZS4KLSAgICAgKiBAcmV0dXJuIEEgUkUgcHJvZ3JhbSByZXByZXNlbnRpbmcgdGhlIHBhdHRlcm4uCi0gICAgICogQHRocm93cyBQYXR0ZXJuRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJFUHJvZ3JhbSBwcmVwYXJlUGF0dGVybihTdHJpbmcgcGF0dGVybikKLSAgICAgICAgdGhyb3dzIFBhdHRlcm5FeGNlcHRpb24gewotICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGF0dGVybkV4Y2VwdGlvbigibnVsbCBwYXNzZWQgYXMgYSBwYXR0ZXJuIiwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGF0dGVybi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBwYXR0ZXJuID0gIl4kIjsKLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzV2FybkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oIlRoZSBlbXB0eSBwYXR0ZXJuIHN0cmluZyB3YXMgcmV3cml0dGVuIHRvICdeJCciICsKLSAgICAgICAgICAgICAgICAgICAgIiB0byBtYXRjaCBmb3IgZW1wdHkgc3RyaW5ncy4gIElmIHlvdSBpbnRlbmRlZCIgKwotICAgICAgICAgICAgICAgICAgICAiIHRvIG1hdGNoIGFsbCBzdHJpbmdzLCBwbGVhc2UgY2hhbmdlIHlvdXIiICsgIiBwYXR0ZXJuIHRvICcuKiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSRUNvbXBpbGVyIGNvbXBpbGVyID0gbmV3IFJFQ29tcGlsZXIoKTsKLSAgICAgICAgICAgIFJFUHJvZ3JhbSBwcm9ncmFtID0gY29tcGlsZXIuY29tcGlsZShwYXR0ZXJuKTsKLQotICAgICAgICAgICAgcmV0dXJuIHByb2dyYW07Ci0gICAgICAgIH0gY2F0Y2ggKFJFU3ludGF4RXhjZXB0aW9uIHJzZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkZhaWxlZCB0byBjb21waWxlIHRoZSBwYXR0ZXJuICciICsgcGF0dGVybiArICInIiwgcnNlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXR0ZXJuRXhjZXB0aW9uKHJzZS5nZXRNZXNzYWdlKCksIHJzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXRjaGVzIGEgc3RyaW5nIHVzaW5nIGEgcHJlcGFyZWQgcGF0dGVybiBwcm9ncmFtLgotICAgICAqIEBwYXJhbSBwcmVwYXJlZFBhdHRlcm4gVGhlIHBhdHRlcm4gcHJvZ3JhbS4KLSAgICAgKiBAcGFyYW0gbWF0Y2ggVGhlIHN0cmluZyB0byBtYXRjaC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJpbmcgbWF0Y2hlZCB0aGUgcGF0dGVybiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlZE1hdGNoKFJFUHJvZ3JhbSBwcmVwYXJlZFBhdHRlcm4sIFN0cmluZyBtYXRjaCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJFIHJlID0gbmV3IFJFKHByZXBhcmVkUGF0dGVybik7Ci0gICAgICAgICAgICByZXN1bHQgPSByZS5tYXRjaChtYXRjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlciNhdXRob3JpemUob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhdXRob3JpemUoUmVxdWVzdCByZXF1ZXN0KQotICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcmVzb2x2ZVJvbGVzKHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBhdXRob3JpemVkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdXJpID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgICAgIFN0cmluZyBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOwotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZyhjb250ZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHB1YmxpYyB1cmlzIGZyb20gY29uZmlndXJhdGlvbiBhYm92ZS4gU2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgYmVmb3JlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbmNyZXRlIGF1dGhvcml6ZXIuCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKCFhdXRob3JpemVkICYmIGkgPCB0aGlzLnB1YmxpY01hdGNoZXJzLnNpemUoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlRyeWluZyBwYXR0ZXJuOiBbIiArIHRoaXMucHVibGljTWF0Y2hlcnMuZ2V0KGkpICsgIl0gd2l0aCBVUkwgWyIgKyB1cmkgKyAiXSIpOwotICAgICAgICAgICAgaWYgKHByZXBhcmVkTWF0Y2goKFJFUHJvZ3JhbSkgdGhpcy5wdWJsaWNNYXRjaGVycy5nZXQoaSksIHVyaSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUGVybWlzc2lvbiBncmFudGVkIGZvciBmcmVlOiBbIiArIHVyaSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF1dGhvcml6ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKCFhdXRob3JpemVkICYmIGkgPCB0aGlzLnB1YmxpY0V4dGVuc2lvbnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0ID0gKFN0cmluZykgdGhpcy5wdWJsaWNFeHRlbnNpb25zLmdldChpKTsKLSAgICAgICAgICAgIGF1dGhvcml6ZWQgPSB1cmkuZW5kc1dpdGgoZXh0KTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFhdXRob3JpemVkKSB7Ci0gICAgICAgICAgICBhdXRob3JpemVkID0gc3VwZXIuYXV0aG9yaXplKHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYXV0aG9yaXplZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0NvbXBvc2FibGVBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0NvbXBvc2FibGVBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkY2IyYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Db21wb3NhYmxlQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcjsKLQotLyoqCi0gKiBBY2Nlc3MgY29udHJvbGxlciByZXNvbHZlciBjb21wb3NlZCBvZiBvdGhlciBhY2Nlc3MgY29udHJvbGxlciByZXNvbHZlcnMuCi0gKiBUaGUgbWVtYmVyIHJlc29sdmVycyBhcmUgY2FsbGVkIG9uZSBhZnRlciB0aGUgb3RoZXIgdG8gcmVzb2x2ZSB0aGUgYWNjZXNzIGNvbnRyb2xsZXJzLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NhYmxlQWNjZXNzQ29udHJvbGxlclJlc29sdmVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcgotICAgIGltcGxlbWVudHMgQ29uZmlndXJhYmxlLCBEaXNwb3NhYmxlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbGxlclJlc29sdmVyI2RvUmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjZXNzQ29udHJvbGxlciBkb1Jlc29sdmVBY2Nlc3NDb250cm9sbGVyKFN0cmluZyB1cmwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBBY2Nlc3NDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2VTZWxlY3RvcikgZ2V0TWFuYWdlcigpLmxvb2t1cChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdbXSB0eXBlcyA9IGdldFJlc29sdmVyVHlwZXMoKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChjb250cm9sbGVyID09IG51bGwgJiYgaSA8IHR5cGVzLmxlbmd0aCkgewotCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlRyeWluZyB0byByZXNvbHZlIEFDIHJlc29sdmVyIGZvciB0eXBlIFsiICsgdHlwZXNbaV0gKyAiXSIpOwotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciByZXNvbHZlciA9Ci0gICAgICAgICAgICAgICAgICAgIChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIpIHRoaXMuc2VsZWN0b3Iuc2VsZWN0KHR5cGVzW2ldKTsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyID0gcmVzb2x2ZXIucmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIodXJsKTsKLSAgICAgICAgICAgICAgICBzZXRSZXNvbHZlcihjb250cm9sbGVyLCByZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlc29sdmVkIGFjY2VzcyBjb250cm9sbGVyIFsiICsgY29udHJvbGxlciArICJdIik7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCBjb250cm9sbGVyVG9SZXNvbHZlciA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlclJlc29sdmVyI3JlbGVhc2Uob3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoQWNjZXNzQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIGFzc2VydCBjb250cm9sbGVyICE9IG51bGw7Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciByZXNvbHZlciA9IGdldFJlc29sdmVyKGNvbnRyb2xsZXIpOwotICAgICAgICByZXNvbHZlci5yZWxlYXNlKGNvbnRyb2xsZXIpOwotICAgICAgICB0aGlzLnNlbGVjdG9yLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjY2VzcyBjb250cm9sbGVyIHJlc29sdmVyIHRoYXQgd2FzIHVzZWQgdG8gcmVzb2x2ZSBhCi0gICAgICogc3BlY2lmaWMgYWNjZXNzIGNvbnRyb2xsZXIuCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqIEByZXR1cm4gQW4gQUMgcmVzb2x2ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciBnZXRSZXNvbHZlcihBY2Nlc3NDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlclJlc29sdmVyIHJlc29sdmVyID0KLSAgICAgICAgICAgIChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIpIHRoaXMuY29udHJvbGxlclRvUmVzb2x2ZXIuZ2V0KGNvbnRyb2xsZXIpOwotICAgICAgICByZXR1cm4gcmVzb2x2ZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjY2VzcyBjb250cm9sbGVyIHJlc29sdmVyIHRoYXQgd2FzIHVzZWQgdG8gcmVzb2x2ZSBhCi0gICAgICogc3BlY2lmaWMgYWNjZXNzIGNvbnRyb2xsZXIuCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqIEBwYXJhbSByZXNvbHZlciBBbiBBQyByZXNvbHZlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNvbHZlcihBY2Nlc3NDb250cm9sbGVyIGNvbnRyb2xsZXIsIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICB0aGlzLmNvbnRyb2xsZXJUb1Jlc29sdmVyLnB1dChjb250cm9sbGVyLCByZXNvbHZlcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT0xWRVJfRUxFTUVOVCA9ICJyZXNvbHZlciI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9BVFRSSUJVVEUgPSAidHlwZSI7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHJlc29sdmVyVHlwZXM7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZSNjb25maWd1cmUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25bXSBhY2Nlc3NDb250cm9sbGVyQ29uZmlncyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGRyZW4oUkVTT0xWRVJfRUxFTUVOVCk7Ci0gICAgICAgIHRoaXMucmVzb2x2ZXJUeXBlcyA9IG5ldyBTdHJpbmdbYWNjZXNzQ29udHJvbGxlckNvbmZpZ3MubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY2Nlc3NDb250cm9sbGVyQ29uZmlncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdGhpcy5yZXNvbHZlclR5cGVzW2ldID0gYWNjZXNzQ29udHJvbGxlckNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKFRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjY2VzcyBjb250cm9sbGVyIHR5cGVzLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgYXJyYXkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJlc29sdmVyVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyVHlwZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAodGhpcy5zZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZSh0aGlzLnNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQ29uZmlndXJhYmxlQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Db25maWd1cmFibGVBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3NmNhZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Db25maWd1cmFibGVBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsKLQotLyoqCi0gKiBDb25maWd1cmFibGUgYWNjZXNzIGNvbnRyb2xsZXIgcmVzb2x2ZXIuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmFibGVBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIKLSAgICBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbGxlclJlc29sdmVyCi0gICAgaW1wbGVtZW50cyBDb25maWd1cmFibGUgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIjZG9SZXNvbHZlQWNjZXNzQ29udHJvbGxlcihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBBY2Nlc3NDb250cm9sbGVyIGRvUmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIoU3RyaW5nIHdlYmFwcFVybCkKLSAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBBY2Nlc3NDb250cm9sbGVyIGFjY2Vzc0NvbnRyb2xsZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhY2Nlc3NDb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAoQWNjZXNzQ29udHJvbGxlcikgZ2V0TWFuYWdlcigpLmxvb2t1cCgKLSAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5ST0xFICsgIi8iICsgdGhpcy5hY2Nlc3NDb250cm9sbGVyVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmIChhY2Nlc3NDb250cm9sbGVyIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlKSB7Ci0gICAgICAgICAgICAgICAgKChDb25maWd1cmFibGUpIGFjY2Vzc0NvbnRyb2xsZXIpLmNvbmZpZ3VyZSh0aGlzLmFjY2Vzc0NvbnRyb2xsZXJDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWNjZXNzQ29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1NfQ09OVFJPTExFUl9FTEVNRU5UID0gImFjY2Vzcy1jb250cm9sbGVyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURSA9ICJ0eXBlIjsKLSAgICBwcml2YXRlIFN0cmluZyBhY2Nlc3NDb250cm9sbGVyVHlwZTsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBhY2Nlc3NDb250cm9sbGVyQ29uZmlndXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5hY2Nlc3NDb250cm9sbGVyQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGQoQUNDRVNTX0NPTlRST0xMRVJfRUxFTUVOVCk7Ci0gICAgICAgIHRoaXMuYWNjZXNzQ29udHJvbGxlclR5cGUgPSB0aGlzLmFjY2Vzc0NvbnRyb2xsZXJDb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9DcmVkZW50aWFsSW1wbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQ3JlZGVudGlhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxNDY5NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9DcmVkZW50aWFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQ3JlZGVudGlhbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBDcmVkZW50aWFsIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ3JlZGVudGlhbEltcGwgaW1wbGVtZW50cyBDcmVkZW50aWFsIHsKLSAgICBwcml2YXRlIEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGU7Ci0gICAgcHJpdmF0ZSBSb2xlIHJvbGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kID0gREVOWTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY3JlZGVudGlhbCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZSBUaGUgYWNjcmVkaXRhYmxlLgotICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlLgotICAgICAqLwotICAgIHB1YmxpYyBDcmVkZW50aWFsSW1wbChBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlLCBSb2xlIHJvbGUpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImFjY3JlZGl0YWJsZSIsIGFjY3JlZGl0YWJsZSk7Ci0gICAgICAgIHRoaXMuYWNjcmVkaXRhYmxlID0gYWNjcmVkaXRhYmxlOwotICAgICAgICBBc3NlcnQubm90TnVsbCgicm9sZSIsIHJvbGUpOwotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvbGUgb2YgdGhpcyBjcmVkZW50aWFsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQSByb2xlLgotICAgICAqLwotICAgIHB1YmxpYyBSb2xlIGdldFJvbGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJvbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNjcmVkaXRhYmxlIG9mIHRoaXMgY3JlZGVudGlhbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFjY3JlZGl0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjcmVkaXRhYmxlIGdldEFjY3JlZGl0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWNjcmVkaXRhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJbIiArIGdldEFjY3JlZGl0YWJsZSgpICsgIjoiICsgZ2V0Um9sZSgpICsgIiAoIiArIGdldE1ldGhvZCgpICsgIildIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1ldGhvZCBvZiB0aGUgY3JlZGVudGlhbCwgZ3JhbnQgb3IgZGVueQotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRob2QgQSBzdHJpbmcgZ3JhbnQgb3IgZGVueQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7Ci0gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgewotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgdGhlIG1ldGhvZCBpcyB7QGxpbmsgQ3JlZGVudGlhbCNHUkFOVH0uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHcmFudGVkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QuZXF1YWxzKEdSQU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSBtZXRob2QgaXMge0BsaW5rIENyZWRlbnRpYWwjREVOWX0uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZW5pZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZC5lcXVhbHMoREVOWSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCFnZXRDbGFzcygpLmlzSW5zdGFuY2Uob2JqKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIENyZWRlbnRpYWwgY3JlZCA9IChDcmVkZW50aWFsKSBvYmo7Ci0gICAgICAgIHJldHVybiBjcmVkLmdldEFjY3JlZGl0YWJsZSgpLmVxdWFscyhnZXRBY2NyZWRpdGFibGUoKSkgJiYgY3JlZC5nZXRSb2xlKCkuZXF1YWxzKGdldFJvbGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRBY2NyZWRpdGFibGUoKS5oYXNoQ29kZSgpICsgZ2V0Um9sZSgpLmhhc2hDb2RlKCkpLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvRGVmYXVsdEFjY2Vzc0NvbnRyb2xsZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0RlZmF1bHRBY2Nlc3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDgwMTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvRGVmYXVsdEFjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKiAgCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcml6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQXV0aGVudGljYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkF1dGhvcml6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JUFJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLk1hY2hpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Qb2xpY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFjY2VzcyBjb250cm9sbGVyIGltcGxlbWVudGF0aW9uLgotICogQHZlcnNpb24gJElkOiBEZWZhdWx0QWNjZXNzQ29udHJvbGxlci5qYXZhIDU2MzQ1OSAyMDA3LTA4LTA3IDEyOjAwOjIwWgotICogICAgICAgICAgbmV0dGluZ3MgJAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFjY2Vzc0NvbnRyb2xsZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBBY2Nlc3NDb250cm9sbGVyLAotICAgICAgICBDb25maWd1cmFibGUsIFNlcnZpY2VhYmxlLCBEaXNwb3NhYmxlLCBJdGVtTWFuYWdlckxpc3RlbmVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklaRVJfRUxFTUVOVCA9ICJhdXRob3JpemVyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURSA9ICJ0eXBlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NSRURJVEFCTEVfTUFOQUdFUl9FTEVNRU5UID0gImFjY3JlZGl0YWJsZS1tYW5hZ2VyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xJQ1lfTUFOQUdFUl9FTEVNRU5UID0gInBvbGljeS1tYW5hZ2VyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9JUCA9ICIoWzAtOV17MSwzfVxcLil7M31bMC05XXsxLDN9IjsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlU2VsZWN0b3IgYXV0aG9yaXplclNlbGVjdG9yOwotICAgIHByaXZhdGUgU2VydmljZVNlbGVjdG9yIHBvbGljeU1hbmFnZXJTZWxlY3RvcjsKLSAgICBwcml2YXRlIEFjY3JlZGl0YWJsZU1hbmFnZXIgYWNjcmVkaXRhYmxlTWFuYWdlcjsKLSAgICBwcml2YXRlIFBvbGljeU1hbmFnZXIgcG9saWN5TWFuYWdlcjsKLSAgICBwcml2YXRlIE1hcCBhdXRob3JpemVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBMaXN0IGF1dGhvcml6ZXJLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXIjYXV0aGVudGljYXRlKG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gYXV0aGVudGljYXRlZCA9IGdldEF1dGhlbnRpY2F0b3IoKS5hdXRoZW50aWNhdGUoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLCByZXF1ZXN0KTsKLQotICAgICAgICByZXR1cm4gYXV0aGVudGljYXRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlciNhdXRob3JpemUob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhdXRob3JpemUoUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0KLSAgICAgICAgYm9vbGVhbiBhdXRob3JpemVkID0gZmFsc2U7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQmVnaW5uaW5nIGF1dGhvcml6YXRpb24uIik7Ci0KLSAgICAgICAgcmVzb2x2ZVJvbGVzKHJlcXVlc3QpOwotCi0gICAgICAgIGlmIChoYXNBdXRob3JpemVycygpKSB7Ci0gICAgICAgICAgICBBdXRob3JpemVyW10gX2F1dGhvcml6ZXJzID0gZ2V0QXV0aG9yaXplcnMoKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGF1dGhvcml6ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICB3aGlsZSAoKGkgPCBfYXV0aG9yaXplcnMubGVuZ3RoKSAmJiBhdXRob3JpemVkKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJJbnZva2luZyBhdXRob3JpemVyIFsiICsgX2F1dGhvcml6ZXJzW2ldICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhdXRob3JpemVkID0gYXV0aG9yaXplZCAmJiBfYXV0aG9yaXplcnNbaV0uYXV0aG9yaXplKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhvcml6ZXIgWyIgKyBfYXV0aG9yaXplcnNbaV0gKyAiXSByZXR1cm5lZCBbIiArIGF1dGhvcml6ZWQgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQXV0aG9yaXphdGlvbiBjb21wbGV0ZSwgcmVzdWx0OiBbIiArIGF1dGhvcml6ZWQgKyAiXSIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZVJvbGVzKFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgd2ViYXBwVXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkocmVxdWVzdCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbih0cnVlKTsKLSAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSAoSWRlbnRpdHkpIHNlc3Npb24uZ2V0QXR0cmlidXRlKElkZW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgUm9sZVtdIHJvbGVzOwotICAgICAgICBpZiAoaWRlbnRpdHkuYmVsb25nc1RvKHRoaXMuYWNjcmVkaXRhYmxlTWFuYWdlcikpIHsKLSAgICAgICAgICAgIHJvbGVzID0gdGhpcy5wb2xpY3lNYW5hZ2VyLmdldEdyYW50ZWRSb2xlcyh0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIsIGlkZW50aXR5LCB3ZWJhcHBVcmwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcm9sZXMgPSBuZXcgUm9sZVswXTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiTm8gcm9sZXMgcmVzb2x2ZWQgZm9yIGlkZW50aXR5IFsiICsgaWRlbnRpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIC0gYmVsb25ncyB0byB3cm9uZyBhY2NyZWRpdGFibGUgbWFuYWdlci4iKTsKLSAgICAgICAgfQotICAgICAgICBzYXZlUm9sZXMocmVxdWVzdCwgcm9sZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSByb2xlcyBvZiB0aGUgY3VycmVudCBpZGVudGl0eSB0byB0aGUgcmVxdWVzdC4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKiBAcGFyYW0gcm9sZXMgVGhlIHJvbGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVSb2xlcyhSZXF1ZXN0IHJlcXVlc3QsIFJvbGVbXSByb2xlcykgewotICAgICAgICAgaWYoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJvbGVzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgcm9sZXNCdWZmZXIuYXBwZW5kKCIgIikuYXBwZW5kKHJvbGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBZGRpbmcgcm9sZXMgWyIgKyByb2xlc0J1ZmZlciArICIgXSB0byByZXF1ZXN0IFsiICsgcmVxdWVzdCArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoUm9sZS5jbGFzcy5nZXROYW1lKCksIEFycmF5cy5hc0xpc3Qocm9sZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIG9yIHBhcmFtZXRlcml6ZXMgYSBjb21wb25lbnQsIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24KLSAgICAgKiBhcyBDb25maWd1cmFibGUgb3IgUGFyYW1ldGVyaXphYmxlLgotICAgICAqIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiB0byB1c2UuCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBjb25maWd1cmF0aW9uLgotICAgICAqIEB0aHJvd3MgUGFyYW1ldGVyRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwYXJhbWV0ZXJpemF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVPclBhcmFtZXRlcml6ZShDb21wb25lbnQgY29tcG9uZW50LCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgUGFyYW1ldGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZSkgewotICAgICAgICAgICAgKChDb25maWd1cmFibGUpIGNvbXBvbmVudCkuY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemFibGUpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IFBhcmFtZXRlcnMuZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICAoKFBhcmFtZXRlcml6YWJsZSkgY29tcG9uZW50KS5wYXJhbWV0ZXJpemUocGFyYW1ldGVycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZSNjb25maWd1cmUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25mKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldHVwQWNjcmVkaXRhYmxlTWFuYWdlcihjb25mKTsKLSAgICAgICAgICAgIHNldHVwQXV0aG9yaXplcnMoY29uZik7Ci0gICAgICAgICAgICBzZXR1cFBvbGljeU1hbmFnZXIoY29uZik7Ci0gICAgICAgICAgICBzZXR1cEF1dGhlbnRpY2F0b3IoKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjY3JlZGl0YWJsZSBtYW5hZ2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBhY2Nlc3MgY29udHJvbGxlciBjb25maWd1cmF0aW9uLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGZhaWxlZC4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKiBAdGhyb3dzIFBhcmFtZXRlckV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwQWNjcmVkaXRhYmxlTWFuYWdlcihDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiwgUGFyYW1ldGVyRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWd1cmF0aW9uLmdldENoaWxkKEFDQ1JFRElUQUJMRV9NQU5BR0VSX0VMRU1FTlQsIGZhbHNlKTsKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBY2NyZWRpdGFibGVNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IChBY2NyZWRpdGFibGVNYW5hZ2VyRmFjdG9yeSkgdGhpcy5tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAubG9va3VwKEFjY3JlZGl0YWJsZU1hbmFnZXJGYWN0b3J5LlJPTEUpOwotICAgICAgICAgICAgICAgIHRoaXMuYWNjcmVkaXRhYmxlTWFuYWdlciA9IGZhY3RvcnkuZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcihjb25maWcpOwotICAgICAgICAgICAgICAgIHRoaXMuYWNjcmVkaXRhYmxlTWFuYWdlci5hZGRJdGVtTWFuYWdlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGF1dGhvcml6ZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBhY2Nlc3MgY29udHJvbGxlciBjb25maWd1cmF0aW9uLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGZhaWxlZC4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKiBAdGhyb3dzIFBhcmFtZXRlckV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwQXV0aG9yaXplcnMoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFBhcmFtZXRlckV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25bXSBhdXRob3JpemVyQ29uZmlndXJhdGlvbnMgPSBjb25maWd1cmF0aW9uLmdldENoaWxkcmVuKEFVVEhPUklaRVJfRUxFTUVOVCk7Ci0gICAgICAgIGlmIChhdXRob3JpemVyQ29uZmlndXJhdGlvbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgdGhpcy5hdXRob3JpemVyU2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKEF1dGhvcml6ZXIuUk9MRQotICAgICAgICAgICAgICAgICAgICArICJTZWxlY3RvciIpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1dGhvcml6ZXJDb25maWd1cmF0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gYXV0aG9yaXplckNvbmZpZ3VyYXRpb25zW2ldLmdldEF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkFkZGluZyBhdXRob3JpemVyIFsiICsgdHlwZSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQXV0aG9yaXplciBhdXRob3JpemVyID0gKEF1dGhvcml6ZXIpIHRoaXMuYXV0aG9yaXplclNlbGVjdG9yLnNlbGVjdCh0eXBlKTsKLSAgICAgICAgICAgICAgICB0aGlzLmF1dGhvcml6ZXJLZXlzLmFkZCh0eXBlKTsKLSAgICAgICAgICAgICAgICB0aGlzLmF1dGhvcml6ZXJzLnB1dCh0eXBlLCBhdXRob3JpemVyKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmVPclBhcmFtZXRlcml6ZShhdXRob3JpemVyLCBhdXRob3JpemVyQ29uZmlndXJhdGlvbnNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcG9saWN5IG1hbmFnZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gVGhlIGFjY2VzcyBjb250cm9sbGVyIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkLgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqIEB0aHJvd3MgUGFyYW1ldGVyRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBQb2xpY3lNYW5hZ2VyKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24sCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBQYXJhbWV0ZXJFeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uIHBvbGljeU1hbmFnZXJDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5nZXRDaGlsZChQT0xJQ1lfTUFOQUdFUl9FTEVNRU5ULAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgaWYgKHBvbGljeU1hbmFnZXJDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwb2xpY3lNYW5hZ2VyVHlwZSA9IHBvbGljeU1hbmFnZXJDb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBZGRpbmcgcG9saWN5IG1hbmFnZXIgdHlwZTogWyIgKyBwb2xpY3lNYW5hZ2VyVHlwZSArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnBvbGljeU1hbmFnZXJTZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoUG9saWN5TWFuYWdlci5ST0xFCi0gICAgICAgICAgICAgICAgICAgICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICB0aGlzLnBvbGljeU1hbmFnZXIgPSAoUG9saWN5TWFuYWdlcikgdGhpcy5wb2xpY3lNYW5hZ2VyU2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChwb2xpY3lNYW5hZ2VyVHlwZSk7Ci0gICAgICAgICAgICBjb25maWd1cmVPclBhcmFtZXRlcml6ZSh0aGlzLnBvbGljeU1hbmFnZXIsIHBvbGljeU1hbmFnZXJDb25maWd1cmF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgdGhlIGF1dGhlbnRpY2F0b3IuCi0gICAgICogQHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBBdXRoZW50aWNhdG9yKCkgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLmF1dGhlbnRpY2F0b3IgPSAoQXV0aGVudGljYXRvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChBdXRoZW50aWNhdG9yLlJPTEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZ2xvYmFsIGNvbXBvbmVudCBtYW5hZ2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBfbWFuYWdlciBUaGUgZ2xvYmFsIGNvbXBvbmVudCBtYW5hZ2VyCi0gICAgICogQHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBfbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBfbWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpemVycyBvZiB0aGlzIGFjdGlvbi4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGF1dGhvcml6ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBBdXRob3JpemVyW10gZ2V0QXV0aG9yaXplcnMoKSB7Ci0KLSAgICAgICAgQXV0aG9yaXplcltdIGF1dGhvcml6ZXJBcnJheSA9IG5ldyBBdXRob3JpemVyW3RoaXMuYXV0aG9yaXplcnMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmF1dGhvcml6ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgdGhpcy5hdXRob3JpemVyS2V5cy5nZXQoaSk7Ci0gICAgICAgICAgICBhdXRob3JpemVyQXJyYXlbaV0gPSAoQXV0aG9yaXplcikgdGhpcy5hdXRob3JpemVycy5nZXQoa2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXV0aG9yaXplckFycmF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhpcyBhY3Rpb24gaGFzIGF1dGhvcml6ZXJzLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0F1dGhvcml6ZXJzKCkgewotICAgICAgICByZXR1cm4gIXRoaXMuYXV0aG9yaXplcnMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGUjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotICAgICAgIGlmICh0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyLnJlbW92ZUl0ZW1NYW5hZ2VyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhpcy5wb2xpY3lNYW5hZ2VyU2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRoaXMucG9saWN5TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wb2xpY3lNYW5hZ2VyU2VsZWN0b3IucmVsZWFzZSh0aGlzLnBvbGljeU1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UodGhpcy5wb2xpY3lNYW5hZ2VyU2VsZWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMuYXV0aG9yaXplclNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF1dGhvcml6ZXJbXSBfYXV0aG9yaXplcnMgPSBnZXRBdXRob3JpemVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXV0aG9yaXplcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLmF1dGhvcml6ZXJTZWxlY3Rvci5yZWxlYXNlKF9hdXRob3JpemVyc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZSh0aGlzLmF1dGhvcml6ZXJTZWxlY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhpcy5hdXRoZW50aWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKHRoaXMuYXV0aGVudGljYXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRpc3Bvc2luZyBbIiArIHRoaXMgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBbiBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjcmVkaXRhYmxlTWFuYWdlciBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvbGljeSBtYW5hZ2VyLgotICAgICAqIEByZXR1cm4gQSBwb2xpY3kgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUG9saWN5TWFuYWdlciBnZXRQb2xpY3lNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wb2xpY3lNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGF1dGhlbnRpY2F0b3IuCi0gICAgICogQHJldHVybiBUaGUgYXV0aGVudGljYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXV0aGVudGljYXRvciBnZXRBdXRoZW50aWNhdG9yKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGlzIGlkZW50aXR5IHdhcyBpbml0aWFsaXplZCBieSB0aGlzIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZGVudGl0eSBBbiBpZGVudGl0eS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBvd25zSWRlbml0eShJZGVudGl0eSBpZGVudGl0eSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gaWRlbnRpdHkuYmVsb25nc1RvKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXIjc2V0dXBJZGVudGl0eShvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldHVwSWRlbnRpdHkoUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbih0cnVlKTsKLSAgICAgICAgaWYgKCFoYXNWYWxpZElkZW50aXR5KHNlc3Npb24pKSB7Ci0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IG5ldyBJZGVudGl0eShnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICBpZGVudGl0eS5pbml0aWFsaXplKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVtb3RlQWRkcmVzcyA9IHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpOwotICAgICAgICAgICAgU3RyaW5nIGNsaWVudEFkZHJlc3MgPSByZXF1ZXN0LmdldEhlYWRlcigieC1mb3J3YXJkZWQtZm9yIik7Ci0KLSAgICAgICAgICAgIGlmIChjbGllbnRBZGRyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoVkFMSURfSVApOwotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IHAubWF0Y2hlcihjbGllbnRBZGRyZXNzKTsKLQotICAgICAgICAgICAgICAgIGlmIChtLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyZXNzID0gbS5ncm91cCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiUmVtb3RlIEFkZHJlc3MgdG8gdXNlOiBbIiArIHJlbW90ZUFkZHJlc3MgKyAiXSIpOwotCi0gICAgICAgICAgICBNYWNoaW5lIG1hY2hpbmUgPSBuZXcgTWFjaGluZShyZW1vdGVBZGRyZXNzKTsKLSAgICAgICAgICAgIElQUmFuZ2VbXSByYW5nZXMgPSB0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIuZ2V0SVBSYW5nZU1hbmFnZXIoKS5nZXRJUFJhbmdlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VzW2ldLmNvbnRhaW5zKG1hY2hpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hY2hpbmUuYWRkSVBSYW5nZShyYW5nZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWRlbnRpdHkuYWRkSWRlbnRpZmlhYmxlKG1hY2hpbmUpOwotICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpLCBpZGVudGl0eSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIHNlc3Npb24gY29udGFpbnMgYW4gaWRlbnRpdHkgdGhhdCBpcyBub3QgbnVsbCBhbmQgYmVsb25ncwotICAgICAqIHRvIHRoZSB1c2VkIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzVmFsaWRJZGVudGl0eShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0gICAgICAgIElkZW50aXR5IGlkZW50aXR5ID0gKElkZW50aXR5KSBzZXNzaW9uLmdldEF0dHJpYnV0ZShJZGVudGl0eS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBpZiAoaWRlbnRpdHkgPT0gbnVsbCB8fCAhb3duc0lkZW5pdHkoaWRlbnRpdHkpKSB7Ci0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWxpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXJMaXN0ZW5lciNpdGVtQWRkZWQob3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGl0ZW1BZGRlZChJdGVtIGl0ZW0pIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJJdGVtIHdhcyBhZGRlZDogWyIgKyBpdGVtICsgIl0iKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJOb3RpZnlpbmcgcG9saWN5IG1hbmFnZXIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjY3JlZGl0YWJsZSkgewotICAgICAgICAgICAgZ2V0UG9saWN5TWFuYWdlcigpLmFjY3JlZGl0YWJsZUFkZGVkKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgKEFjY3JlZGl0YWJsZSkgaXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXJMaXN0ZW5lciNpdGVtUmVtb3ZlZChvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaXRlbVJlbW92ZWQoSXRlbSBpdGVtKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiSXRlbSB3YXMgcmVtb3ZlZDogWyIgKyBpdGVtICsgIl0iKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJOb3RpZnlpbmcgcG9saWN5IG1hbmFnZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKGl0ZW0gaW5zdGFuY2VvZiBSb2xlKSkgewotICAgICAgICAgICAgZ2V0UG9saWN5TWFuYWdlcigpLmFjY3JlZGl0YWJsZVJlbW92ZWQoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLCAoQWNjcmVkaXRhYmxlKSBpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvRGVmYXVsdFBvbGljeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvRGVmYXVsdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTdkMzZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0RlZmF1bHRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5DcmVkZW50aWFsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Nb2RpZmlhYmxlUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZTsKLQotLyoqCi0gKiBBIERlZmF1bHRQb2xpY3kgaXMgdGhlIG93biBwb2xpY3kgb2YgYSBjZXJ0YWluIFVSTCAobm90IG1lcmdlZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UG9saWN5IGltcGxlbWVudHMgTW9kaWZpYWJsZVBvbGljeSB7Ci0KLSAgICBwcml2YXRlIExpc3QgY3JlZGVudGlhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY3JlZGVudGlhbCB0byB0aGlzIHBvbGljeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3JlZGVudGlhbCBBIGNyZWRlbnRpYWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ3JlZGVudGlhbChDcmVkZW50aWFsIGNyZWRlbnRpYWwpIHsKLSAgICAgICAgYXNzZXJ0IGNyZWRlbnRpYWwgIT0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuY3JlZGVudGlhbHMuY29udGFpbnMoY3JlZGVudGlhbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjcmVkZW50aWFsIFsiICsgY3JlZGVudGlhbAotICAgICAgICAgICAgICAgICAgICArICJdIGlzIGFscmVhZHkgY29udGFpbmVkISIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscy5hZGQoY3JlZGVudGlhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcm9sZSB0byB0aGlzIHBvbGljeSBmb3IgYSBjZXJ0YWluIGFjY3JlZGl0YWJsZSBhbmQgYSBjZXJ0YWluIHJvbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZSBBbiBhY2NyZWRpdGFibGUuCi0gICAgICogQHBhcmFtIHJvbGUgQSByb2xlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJvbGUoQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSwgUm9sZSByb2xlLCBTdHJpbmcgbWV0aG9kKSB7Ci0gICAgICAgIGFzc2VydCBhY2NyZWRpdGFibGUgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHJvbGUgIT0gbnVsbDsKLSAgICAgICAgQ3JlZGVudGlhbEltcGwgY3JlZCA9IG5ldyBDcmVkZW50aWFsSW1wbChhY2NyZWRpdGFibGUsIHJvbGUpOwotICAgICAgICBjcmVkLnNldE1ldGhvZChtZXRob2QpOwotICAgICAgICBhZGRDcmVkZW50aWFsKGNyZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSByb2xlIGZyb20gdGhpcyBwb2xpY3kgZm9yIGEgY2VydGFpbiBhY2NyZWRpdGFibGUgYW5kIGEgY2VydGFpbgotICAgICAqIHJvbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZSBBbiBhY2NyZWRpdGFibGUuCi0gICAgICogQHBhcmFtIHJvbGUgQSByb2xlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiB0aGUgYWNjcmVkaXRhYmxlLXJvbGUgcGFpciBpcyBub3QKLSAgICAgKiAgICAgICAgIGNvbnRhaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlKEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUsIFJvbGUgcm9sZSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgYWNjcmVkaXRhYmxlICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCByb2xlICE9IG51bGw7Ci0gICAgICAgIHJlbW92ZUNyZWRlbnRpYWwoZ2V0Q3JlZGVudGlhbChhY2NyZWRpdGFibGUsIHJvbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjcmVkZW50aWFscyBvZiB0aGlzIHBvbGljeSBpbiB0b3AtZG93biBvcmRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGNyZWRlbnRpYWxzLgotICAgICAqLwotICAgIHB1YmxpYyBDcmVkZW50aWFsW10gZ2V0Q3JlZGVudGlhbHMoKSB7Ci0gICAgICAgIHJldHVybiAoQ3JlZGVudGlhbFtdKSB0aGlzLmNyZWRlbnRpYWxzLnRvQXJyYXkobmV3IENyZWRlbnRpYWxbdGhpcy5jcmVkZW50aWFscy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjcmVkZW50aWFscyBmb3IgYSBjZXJ0YWluIGFjY3JlZGl0YWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWNjcmVkaXRhYmxlIEFuIGFjY3JlZGl0YWJsZS4KLSAgICAgKiBAcGFyYW0gcm9sZQotICAgICAqIEByZXR1cm4gQSBjcmVkZW50aWFsLgotICAgICAqLwotICAgIHB1YmxpYyBDcmVkZW50aWFsIGdldENyZWRlbnRpYWwoQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSwgUm9sZSByb2xlKSB7Ci0gICAgICAgIENyZWRlbnRpYWwgY3JlZGVudGlhbCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMuY3JlZGVudGlhbHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBDcmVkZW50aWFsIGNyZWQgPSAoQ3JlZGVudGlhbCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY3JlZC5nZXRBY2NyZWRpdGFibGUoKS5lcXVhbHMoYWNjcmVkaXRhYmxlKSAmJiBjcmVkLmdldFJvbGUoKS5lcXVhbHMocm9sZSkpIHsKLSAgICAgICAgICAgICAgICBjcmVkZW50aWFsID0gY3JlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlZGVudGlhbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTU0w7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5I2lzU1NMUHJvdGVjdGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NTTFByb3RlY3RlZCgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaXNTU0w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBpZiB0aGlzIHBvbGljeSByZXF1aXJlcyBTU0wgcHJvdGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3NsIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTU0woYm9vbGVhbiBzc2wpIHsKLSAgICAgICAgdGhpcy5pc1NTTCA9IHNzbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5I2lzRW1wdHkoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRDcmVkZW50aWFscygpLmxlbmd0aCA9PSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBjcmVkZW50aWFsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjcmVkZW50aWFsIFRoZSBjcmVkZW50aWFsIHRvIHJlbW92ZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gSWYgdGhlIGNyZWRlbnRpYWwgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ3JlZGVudGlhbChDcmVkZW50aWFsIGNyZWRlbnRpYWwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuY3JlZGVudGlhbHMuY29udGFpbnMoY3JlZGVudGlhbCkpIHsKLSAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHMucmVtb3ZlKGNyZWRlbnRpYWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgcm9sZXMgZm9yIGEgY2VydGFpbiBhY2NyZWRpdGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZSBUaGUgYWNjcmVkaXRhYmxlIHRvIHJlbW92ZSBhbGwgcm9sZXMgZm9yLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBJZiBubyBjcmVkZW50aWFsIGV4aXN0cyBmb3IgdGhpcwotICAgICAqICAgICAgICAgYWNjcmVkaXRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGVzKEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgQ3JlZGVudGlhbFtdIGNyZWRlbnRpYWxzID0gZ2V0Q3JlZGVudGlhbHMoKTsKLSAgICAgICAgZm9yIChpbnQgY3JlZEluZGV4ID0gMDsgY3JlZEluZGV4IDwgY3JlZGVudGlhbHMubGVuZ3RoOyBjcmVkSW5kZXgrKykgewotICAgICAgICAgICAgQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gY3JlZGVudGlhbHNbY3JlZEluZGV4XTsKLSAgICAgICAgICAgIGlmIChjcmVkZW50aWFsLmdldEFjY3JlZGl0YWJsZSgpLmVxdWFscyhhY2NyZWRpdGFibGUpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscy5yZW1vdmUoY3JlZGVudGlhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ3JlZGVudGlhbFtdIGdldENyZWRlbnRpYWxzKElkZW50aXR5IGlkZW50aXR5KSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFjY3JlZGl0YWJsZVtdIGFjY3JlZGl0YWJsZXMgPSBpZGVudGl0eS5nZXRBY2NyZWRpdGFibGVzKCk7Ci0gICAgICAgIENyZWRlbnRpYWxbXSBjcmVkZW50aWFscyA9IGdldENyZWRlbnRpYWxzKCk7Ci0gICAgICAgIFNldCByZXR1cm5DcmVkZW50aWFsID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLSAgICAgICAgZm9yIChpbnQgY3JlZEluZGV4ID0gMDsgY3JlZEluZGV4IDwgY3JlZGVudGlhbHMubGVuZ3RoOyBjcmVkSW5kZXgrKykgewotICAgICAgICAgICAgQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gY3JlZGVudGlhbHNbY3JlZEluZGV4XTsKLSAgICAgICAgICAgIGZvciAoaW50IGFjY3JJbmRleCA9IDA7IGFjY3JJbmRleCA8IGFjY3JlZGl0YWJsZXMubGVuZ3RoOyBhY2NySW5kZXgrKykgewotICAgICAgICAgICAgICAgIEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUgPSBhY2NyZWRpdGFibGVzW2FjY3JJbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKGNyZWRlbnRpYWwuZ2V0QWNjcmVkaXRhYmxlKCkuZXF1YWxzKGFjY3JlZGl0YWJsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ3JlZGVudGlhbC5hZGQoY3JlZGVudGlhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoQ3JlZGVudGlhbFtdKSByZXR1cm5DcmVkZW50aWFsLnRvQXJyYXkobmV3IENyZWRlbnRpYWxbcmV0dXJuQ3JlZGVudGlhbC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlUm9sZURvd24oQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSwgUm9sZSByb2xlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vdmVSb2xlKGFjY3JlZGl0YWJsZSwgcm9sZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVSb2xlKEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUsIFJvbGUgcm9sZSwgYm9vbGVhbiBkb3duKSB7Ci0KLSAgICAgICAgQ3JlZGVudGlhbCBjcmVkID0gZ2V0Q3JlZGVudGlhbChhY2NyZWRpdGFibGUsIHJvbGUpOwotICAgICAgICBpbnQgcG9zaXRpb24gPSB0aGlzLmNyZWRlbnRpYWxzLmluZGV4T2YoY3JlZCk7Ci0KLSAgICAgICAgaWYgKCFkb3duICYmIHBvc2l0aW9uID4gMCkgewotICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscy5yZW1vdmUoY3JlZCk7Ci0gICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzLmFkZChwb3NpdGlvbiAtIDEsIGNyZWQpOwotICAgICAgICB9IGVsc2UgaWYgKGRvd24gJiYgcG9zaXRpb24gPCB0aGlzLmNyZWRlbnRpYWxzLnNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHMucmVtb3ZlKGNyZWQpOwotICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscy5hZGQocG9zaXRpb24gKyAxLCBjcmVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmVSb2xlVXAoQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSwgUm9sZSByb2xlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vdmVSb2xlKGFjY3JlZGl0YWJsZSwgcm9sZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY2hlY2soSWRlbnRpdHkgaWRlbnRpdHksIFJvbGUgcm9sZSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBDcmVkZW50aWFsW10gY3JlZGVudGlhbHMgPSBnZXRDcmVkZW50aWFscygpOwotICAgICAgICBmb3IgKGludCBpID0gY3JlZGVudGlhbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChtYXRjaGVzKGlkZW50aXR5LCBjcmVkZW50aWFsc1tpXS5nZXRBY2NyZWRpdGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgY3JlZGVudGlhbHNbaV0uZ2V0Um9sZSgpLmVxdWFscyhyb2xlKSkgewotICAgICAgICAgICAgICAgIGlmIChjcmVkZW50aWFsc1tpXS5nZXRNZXRob2QoKS5lcXVhbHMoQ3JlZGVudGlhbEltcGwuR1JBTlQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQb2xpY3kuUkVTVUxUX0dSQU5URUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBvbGljeS5SRVNVTFRfREVOSUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUG9saWN5LlJFU1VMVF9OT1RfTUFUQ0hFRDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKElkZW50aXR5IGlkZW50aXR5LCBBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlKSB7Ci0gICAgICAgIEFjY3JlZGl0YWJsZVtdIGFjY3JzID0gaWRlbnRpdHkuZ2V0QWNjcmVkaXRhYmxlcygpOwotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChhY2NycykuY29udGFpbnMoYWNjcmVkaXRhYmxlKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9JdGVtQ29uZmlndXJhdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvSXRlbUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhMDQzNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9JdGVtQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLS8qKgotICogVXNlIHRoaXMgY2xhc3MgdG8gY3JlYXRlIGNvbmZpZ3VyYXRpb25zIGZyb20ge0BsaW5rIEFic3RyYWN0SXRlbX1zIG9yCi0gKiB0byBidWlsZCB7QGxpbmsgQWJzdHJhY3RJdGVtfXMgZnJvbSBjb25maWd1cmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Db25maWd1cmF0aW9uIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVtQ29uZmlndXJhdGlvbigpIHsKLQkgICAgLy8gZG8gbm90aGluZwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgSUQsIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBNYW5hZ2VhYmxlIHRvIHRoZSBjb25maWd1cmF0aW9uLgotICAgICAqIEBwYXJhbSBtYW5hZ2VhYmxlIEEgbWFuYWdlYWJsZS4KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBBIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZShBYnN0cmFjdEl0ZW0gbWFuYWdlYWJsZSwgRGVmYXVsdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfQ0xBU1MsIG1hbmFnZWFibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQsIG1hbmFnZWFibGUuZ2V0SWQoKSk7Ci0KLSAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb24gY2hpbGQgPSBudWxsOwotCi0gICAgICAgIC8vIGFkZCBuYW1lIG5vZGUKLSAgICAgICAgY2hpbGQgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb24oRUxFTUVOVF9OQU1FKTsKLSAgICAgICAgY2hpbGQuc2V0VmFsdWUobWFuYWdlYWJsZS5nZXROYW1lKCkpOwotICAgICAgICBjb25maWd1cmF0aW9uLmFkZENoaWxkKGNoaWxkKTsKLQotICAgICAgICAvLyBhZGQgZGVzY3JpcHRpb24gbm9kZQotICAgICAgICBjaGlsZCA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbihFTEVNRU5UX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgY2hpbGQuc2V0VmFsdWUobWFuYWdlYWJsZS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5hZGRDaGlsZChjaGlsZCk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05BTUUgPSAibmFtZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lEID0gImlkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQ0xBU1MgPSAiY2xhc3MiOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlcyBhIE1hbmFnZWFibGUuCi0gICAgICogQHBhcmFtIG1hbmFnZWFibGUgVGhlIG1hbmFnZWFibGUuCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovICAgIAotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShBYnN0cmFjdEl0ZW0gbWFuYWdlYWJsZSwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIG1hbmFnZWFibGUuc2V0SWQoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0lEKSk7Ci0gICAgICAgIG1hbmFnZWFibGUuc2V0TmFtZShjb25maWd1cmF0aW9uLmdldENoaWxkKEVMRU1FTlRfTkFNRSkuZ2V0VmFsdWUoIiIpKTsKLSAgICAgICAgbWFuYWdlYWJsZS5zZXREZXNjcmlwdGlvbihjb25maWd1cmF0aW9uLmdldENoaWxkKEVMRU1FTlRfREVTQ1JJUFRJT04pLmdldFZhbHVlKCIiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xhc3MgbmFtZSBvZiBhbiBpdGVtLgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGl0ZW0gY29uZmlndXJhdGlvbi4KLSAgICAgKiBAcmV0dXJuIFRoZSBjbGFzcyBuYW1lLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEl0ZW1DbGFzcyhDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcga2xhc3MgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBrbGFzcyA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoSXRlbUNvbmZpZ3VyYXRpb24uQVRUUklCVVRFX0NMQVNTKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPQotICAgICAgICAgICAgICAgICJFeGNlcHRpb24gd2hlbiBleHRyYWN0aW5nIGNsYXNzIG5hbWUgZnJvbSBpZGVudGl0eSBmaWxlOiAiCi0gICAgICAgICAgICAgICAgICAgICsga2xhc3MKLSAgICAgICAgICAgICAgICAgICAgKyBjb25maWcuZ2V0QXR0cmlidXRlTmFtZXMoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGVycm9yTXNnLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4ga2xhc3M7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Qb2xpY3lCdWlsZGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Qb2xpY3lCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYTUwMDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvUG9saWN5QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5DcmVkZW50aWFsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuTW9kaWZpYWJsZVBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuV29ybGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZS5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmNhY2hlLklucHV0U3RyZWFtQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBCdWlsZHMgcG9saWNpZXMgZnJvbSBpbnB1dCBzdHJlYW1zLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgUG9saWN5QnVpbGRlciBpbXBsZW1lbnRzIElucHV0U3RyZWFtQnVpbGRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBfYWNjcmVkaXRhYmxlTWFuYWdlciBBbiBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUG9saWN5QnVpbGRlcihBY2NyZWRpdGFibGVNYW5hZ2VyIF9hY2NyZWRpdGFibGVNYW5hZ2VyKSB7Ci0gICAgICAgIGFzc2VydCBfYWNjcmVkaXRhYmxlTWFuYWdlciAhPSBudWxsOwotICAgICAgICB0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIgPSBfYWNjcmVkaXRhYmxlTWFuYWdlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBbiBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjcmVkaXRhYmxlTWFuYWdlciBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyOwotICAgIH0KLQotICAgIHByaXZhdGUgQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9MSUNZX0VMRU1FTlQgPSAicG9saWN5IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9FTEVNRU5UID0gImdyb3VwIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0VMRU1FTlQgPSAidXNlciI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9FTEVNRU5UID0gInJvbGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUkxEX0VMRU1FTlQgPSAid29ybGQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElQX1JBTkdFX0VMRU1FTlQgPSAiaXAtcmFuZ2UiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQlVURSA9ICJpZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NMX0FUVFJJQlVURSA9ICJzc2wiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9BVFRSSUJVVEUgPSAibWV0aG9kIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBwb2xpY3kgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCi0gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgdGhlIHBvbGljeSBmcm9tLgotICAgICAqIEByZXR1cm4gQSBwb2xpY3kuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIE1vZGlmaWFibGVQb2xpY3kgYnVpbGRQb2xpY3koSW5wdXRTdHJlYW0gc3RyZWFtKQotICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KHN0cmVhbSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZFBvbGljeShkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgcG9saWN5IGZyb20gYW4gWE1MIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgWE1MIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQSBwb2xpY3kuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIE1vZGlmaWFibGVQb2xpY3kgYnVpbGRQb2xpY3koRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBEZWZhdWx0UG9saWN5IHBvbGljeSA9IG5ldyBEZWZhdWx0UG9saWN5KCk7Ci0gICAgICAgIEVsZW1lbnQgcG9saWN5RWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBhc3NlcnQgcG9saWN5RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoUE9MSUNZX0VMRU1FTlQpOwotCi0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPQotICAgICAgICAgICAgbmV3IE5hbWVzcGFjZUhlbHBlcigKLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLk5BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLkRFRkFVTFRfUFJFRklYLAotICAgICAgICAgICAgICAgIGRvY3VtZW50KTsKLQotICAgICAgICBFbGVtZW50W10gY3JlZGVudGlhbEVsZW1lbnRzID0gaGVscGVyLmdldENoaWxkcmVuKHBvbGljeUVsZW1lbnQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3JlZGVudGlhbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlID0gbnVsbDsKLQotICAgICAgICAgICAgU3RyaW5nIGlkID0gY3JlZGVudGlhbEVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgYWNjcmVkaXRhYmxlID0gZ2V0QWNjcmVkaXRhYmxlKGNyZWRlbnRpYWxFbGVtZW50c1tpXS5nZXRMb2NhbE5hbWUoKSwgaWQpOwotCi0gICAgICAgICAgICBFbGVtZW50W10gcm9sZUVsZW1lbnRzID0gaGVscGVyLmdldENoaWxkcmVuKGNyZWRlbnRpYWxFbGVtZW50c1tpXSwgUk9MRV9FTEVNRU5UKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByb2xlRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcm9sZUlkID0gcm9sZUVsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICAgIFJvbGUgcm9sZSA9IGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRSb2xlTWFuYWdlcigpLmdldFJvbGUocm9sZUlkKTsKLSAgICAgICAgICAgICAgICBDcmVkZW50aWFsSW1wbCBjcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWxJbXBsKGFjY3JlZGl0YWJsZSwgcm9sZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJvbGVFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoTUVUSE9EX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgICAgLy8gSWYgbWV0aG9kIGlzIG5vdCBzZXQsIHdlIGFzc3VtZSBERU5ZIAotICAgICAgICAgICAgICAgIGlmIChtZXRob2QubGVuZ3RoKCkgPT0gMCkgbWV0aG9kID0gQ3JlZGVudGlhbEltcGwuREVOWTsKLSAgICAgICAgICAgICAgICBjcmVkZW50aWFsLnNldE1ldGhvZChtZXRob2QpOwotICAgICAgICAgICAgICAgIHBvbGljeS5hZGRDcmVkZW50aWFsKGNyZWRlbnRpYWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gc3NsID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzc2xTdHJpbmcgPSBwb2xpY3lFbGVtZW50LmdldEF0dHJpYnV0ZShTU0xfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKHNzbFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzc2wgPSBCb29sZWFuLnZhbHVlT2Yoc3NsU3RyaW5nKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBwb2xpY3kuc2V0U1NMKHNzbCk7Ci0KLSAgICAgICAgcmV0dXJuIHBvbGljeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGFjY3JlZHRpYWJsZSBmb3IgYW4gZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgVGhlIGVsbWVudCBuYW1lLgotICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIGFjY3JlZGl0YWJsZS4KLSAgICAgKiBAcmV0dXJuIEFuIGFjY3JlZGl0YWJsZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWNjcmVkaXRhYmxlIGdldEFjY3JlZGl0YWJsZSgKLSAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLAotICAgICAgICBTdHJpbmcgaWQpCi0gICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhVU0VSX0VMRU1FTlQpKSB7Ci0gICAgICAgICAgICBhY2NyZWRpdGFibGUgPSBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0VXNlck1hbmFnZXIoKS5nZXRVc2VyKGlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoR1JPVVBfRUxFTUVOVCkpIHsKLSAgICAgICAgICAgIGFjY3JlZGl0YWJsZSA9IGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRHcm91cE1hbmFnZXIoKS5nZXRHcm91cChpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFdPUkxEX0VMRU1FTlQpKSB7Ci0gICAgICAgICAgICBhY2NyZWRpdGFibGUgPSBXb3JsZC5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhJUF9SQU5HRV9FTEVNRU5UKSkgewotICAgICAgICAgICAgYWNjcmVkaXRhYmxlID0gZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldElQUmFuZ2VNYW5hZ2VyKCkuZ2V0SVBSYW5nZShpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWNjcmVkaXRhYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJVbmtub3duIGFjY3JlZGl0YWJsZSBbIiArIGVsZW1lbnROYW1lICsgIl0gd2l0aCBJRCBbIiArIGlkICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhY2NyZWRpdGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgYSBwb2xpY3kgdG8gYW4gWE1MIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBwb2xpY3kgVGhlIHBvbGljeSB0byBzYXZlLgotICAgICAqIEByZXR1cm4gQSBET00gZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBzYXZlUG9saWN5KFBvbGljeSBwb2xpY3kpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgTmFtZXNwYWNlSGVscGVyIGhlbHBlcjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGVscGVyID0KLSAgICAgICAgICAgICAgICBuZXcgTmFtZXNwYWNlSGVscGVyKAotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLk5BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5ERUZBVUxUX1BSRUZJWCwKLSAgICAgICAgICAgICAgICAgICAgUE9MSUNZX0VMRU1FTlQpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ3JlZGVudGlhbFtdIGNyZWRlbnRpYWxzID0gKChEZWZhdWx0UG9saWN5KSBwb2xpY3kpLmdldENyZWRlbnRpYWxzKCk7Ci0gICAgICAgIEVsZW1lbnQgcG9saWN5RWxlbWVudCA9IGhlbHBlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3JlZGVudGlhbHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUgPSBjcmVkZW50aWFsc1tpXS5nZXRBY2NyZWRpdGFibGUoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgYWNjcmVkaXRhYmxlRWxlbWVudCA9IHNhdmUoYWNjcmVkaXRhYmxlLCBoZWxwZXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBSb2xlIHJvbGUgPSBjcmVkZW50aWFsc1tpXS5nZXRSb2xlKCk7Ci0gICAgICAgICAgICBFbGVtZW50IHJvbGVFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoUk9MRV9FTEVNRU5UKTsKLSAgICAgICAgICAgIHJvbGVFbGVtZW50LnNldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIHJvbGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICByb2xlRWxlbWVudC5zZXRBdHRyaWJ1dGUoTUVUSE9EX0FUVFJJQlVURSwgY3JlZGVudGlhbHNbaV0uZ2V0TWV0aG9kKCkpOwotICAgICAgICAgICAgYWNjcmVkaXRhYmxlRWxlbWVudC5hcHBlbmRDaGlsZChyb2xlRWxlbWVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHBvbGljeUVsZW1lbnQuYXBwZW5kQ2hpbGQoYWNjcmVkaXRhYmxlRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHBvbGljeUVsZW1lbnQuc2V0QXR0cmlidXRlKFNTTF9BVFRSSUJVVEUsIEJvb2xlYW4udG9TdHJpbmcocG9saWN5LmlzU1NMUHJvdGVjdGVkKCkpKTsKLQotICAgICAgICByZXR1cm4gaGVscGVyLmdldERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgYW4gYWNjcmVkaXRhYmxlIHRvIGFuIFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBhY2NyZWRpdGFibGUgVGhlIGFjY3JlZGl0YWJsZS4KLSAgICAgKiBAcGFyYW0gaGVscGVyIFRoZSBuYW1lc3BhY2UgaGVscGVyIHRvIGJlIHVzZWQuCi0gICAgICogQHJldHVybiBBbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEVsZW1lbnQgc2F2ZShBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlLCBOYW1lc3BhY2VIZWxwZXIgaGVscGVyKQotICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotCi0gICAgICAgIGlmIChhY2NyZWRpdGFibGUgaW5zdGFuY2VvZiBVc2VyKSB7Ci0gICAgICAgICAgICBsb2NhbE5hbWUgPSBVU0VSX0VMRU1FTlQ7Ci0gICAgICAgICAgICBpZCA9ICgoVXNlcikgYWNjcmVkaXRhYmxlKS5nZXRJZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGFjY3JlZGl0YWJsZSBpbnN0YW5jZW9mIEFic3RyYWN0R3JvdXApIHsKLSAgICAgICAgICAgIGxvY2FsTmFtZSA9IEdST1VQX0VMRU1FTlQ7Ci0gICAgICAgICAgICBpZCA9ICgoQWJzdHJhY3RHcm91cCkgYWNjcmVkaXRhYmxlKS5nZXRJZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGFjY3JlZGl0YWJsZSBpbnN0YW5jZW9mIFdvcmxkKSB7Ci0gICAgICAgICAgICBsb2NhbE5hbWUgPSBXT1JMRF9FTEVNRU5UOwotICAgICAgICB9IGVsc2UgaWYgKGFjY3JlZGl0YWJsZSBpbnN0YW5jZW9mIEFic3RyYWN0SVBSYW5nZSkgewotICAgICAgICAgICAgbG9jYWxOYW1lID0gSVBfUkFOR0VfRUxFTUVOVDsKLSAgICAgICAgICAgIGlkID0gKChBYnN0cmFjdElQUmFuZ2UpIGFjY3JlZGl0YWJsZSkuZ2V0SWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NhbE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIkNvdWxkIG5vdCBzYXZlIGFjY3JlZGl0YWJsZSBbIiArIGFjY3JlZGl0YWJsZSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudChsb2NhbE5hbWUpOwotCi0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIGlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZS5JbnB1dFN0cmVhbUJ1aWxkZXIjYnVpbGQoamF2YS5pby5JbnB1dFN0cmVhbSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGJ1aWxkKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbHVlID0gYnVpbGRQb2xpY3koc3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvUmVtb3ZlZEFjY3JlZGl0YWJsZVBvbGljeUJ1aWxkZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1JlbW92ZWRBY2NyZWRpdGFibGVQb2xpY3lCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYmVhMzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvUmVtb3ZlZEFjY3JlZGl0YWJsZVBvbGljeUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklQUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotCi0vKioKLSAqIEEgUG9saWN5QnVpbGRlciB3aGljaCBjYW4gYmUgdXNlZCBhZnRlciBhbiBhY2NyZWRpdGFibGUgd2FzIHJlbW92ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVkQWNjcmVkaXRhYmxlUG9saWN5QnVpbGRlciBleHRlbmRzIFBvbGljeUJ1aWxkZXIgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gYWNjcmVkaXRhYmxlTWFuYWdlciBUaGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIFJlbW92ZWRBY2NyZWRpdGFibGVQb2xpY3lCdWlsZGVyKEFjY3JlZGl0YWJsZU1hbmFnZXIgYWNjcmVkaXRhYmxlTWFuYWdlcikgewotICAgICAgICBzdXBlcihhY2NyZWRpdGFibGVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFjY3JlZGl0YWJsZSByZW1vdmVkQWNjcmVkaXRhYmxlOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVtb3ZlZCBhY2NyZWRpdGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZSBBbiBhY2NyZWRpdGFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlZEFjY3JlZGl0YWJsZShBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlKSB7Ci0gICAgICAgIHRoaXMucmVtb3ZlZEFjY3JlZGl0YWJsZSA9IGFjY3JlZGl0YWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5Qb2xpY3lCdWlsZGVyI2dldEFjY3JlZGl0YWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHByb3RlY3RlZCBBY2NyZWRpdGFibGUgZ2V0QWNjcmVkaXRhYmxlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGlkKQotICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZTsKLQotICAgICAgICBpZiAodGhpcy5yZW1vdmVkQWNjcmVkaXRhYmxlIGluc3RhbmNlb2YgVXNlcgotICAgICAgICAgICAgJiYgZWxlbWVudE5hbWUuZXF1YWxzKFVTRVJfRUxFTUVOVCkKLSAgICAgICAgICAgICYmICgoVXNlcikgdGhpcy5yZW1vdmVkQWNjcmVkaXRhYmxlKS5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgIGFjY3JlZGl0YWJsZSA9IHRoaXMucmVtb3ZlZEFjY3JlZGl0YWJsZTsKLSAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgIHRoaXMucmVtb3ZlZEFjY3JlZGl0YWJsZSBpbnN0YW5jZW9mIEdyb3VwCi0gICAgICAgICAgICAgICAgJiYgZWxlbWVudE5hbWUuZXF1YWxzKEdST1VQX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgJiYgKChHcm91cCkgdGhpcy5yZW1vdmVkQWNjcmVkaXRhYmxlKS5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgIGFjY3JlZGl0YWJsZSA9IHRoaXMucmVtb3ZlZEFjY3JlZGl0YWJsZTsKLSAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgIHRoaXMucmVtb3ZlZEFjY3JlZGl0YWJsZSBpbnN0YW5jZW9mIElQUmFuZ2UKLSAgICAgICAgICAgICAgICAmJiBlbGVtZW50TmFtZS5lcXVhbHMoSVBfUkFOR0VfRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAmJiAoKElQUmFuZ2UpIHRoaXMucmVtb3ZlZEFjY3JlZGl0YWJsZSkuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICBhY2NyZWRpdGFibGUgPSB0aGlzLnJlbW92ZWRBY2NyZWRpdGFibGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGFjY3JlZGl0YWJsZSA9IHN1cGVyLmdldEFjY3JlZGl0YWJsZShlbGVtZW50TmFtZSwgaWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY2NyZWRpdGFibGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9VUkxQb2xpY3kuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1VSTFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWM4MTFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1VSTFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQ3JlZGVudGlhbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSW5oZXJpdGluZ1BvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotCi0vKioKLSAqIEEgcG9saWN5IGF0IGEgY2VydGFpbiBVUkwuIFRoZSBmaW5hbCBwb2xpY3kgaXMgY29tcHV0ZWQgYnkgbWVyZ2luZyB0aGUKLSAqIHN1YnRyZWUgcG9saWNpZXMgb2YgYWxsIGFuY2VzdG9yLW9yLXNlbGYgZGlyZWN0b3JpZXMgd2l0aCB0aGUgVVJMIHBvbGljeSBvZgotICogdGhlIGFjdHVhbCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxQb2xpY3kgaW1wbGVtZW50cyBQb2xpY3kgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0aW5nIHBvbGljeSBmb3IgYSBjZXJ0YWluIFVSTC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udHJvbGxlcgotICAgICAqICAgICAgICAgICAgVGhlIGFjY2Nlc3MgY29udHJvbGxlci4KLSAgICAgKiBAcGFyYW0gX3VybAotICAgICAqICAgICAgICAgICAgVGhlIFVSTC4KLSAgICAgKiBAcGFyYW0gbWFuYWdlcgotICAgICAqICAgICAgICAgICAgVGhlIHBvbGljeSBtYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBVUkxQb2xpY3koQWNjcmVkaXRhYmxlTWFuYWdlciBjb250cm9sbGVyLCBTdHJpbmcgX3VybCwKLSAgICAgICAgICAgIEluaGVyaXRpbmdQb2xpY3lNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgYXNzZXJ0IF91cmwgIT0gbnVsbDsKLSAgICAgICAgdGhpcy51cmwgPSBfdXJsOwotCi0gICAgICAgIGFzc2VydCBtYW5hZ2VyICE9IG51bGw7Ci0gICAgICAgIHRoaXMucG9saWN5TWFuYWdlciA9IG1hbmFnZXI7Ci0KLSAgICAgICAgYXNzZXJ0IGNvbnRyb2xsZXIgIT0gbnVsbDsKLSAgICAgICAgdGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyID0gY29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyB1cmw7Ci0KLSAgICBwcml2YXRlIEluaGVyaXRpbmdQb2xpY3lNYW5hZ2VyIHBvbGljeU1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIEFjY3JlZGl0YWJsZU1hbmFnZXIgYWNjcmVkaXRhYmxlTWFuYWdlcjsKLQotICAgIHByaXZhdGUgUG9saWN5W10gcG9saWNpZXMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBDcmVkZW50aWFsW10gY3JlZGVudGlhbHMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogT2J0YWlucyB0aGUgcG9saWNpZXMgZnJvbSB0aGUgcG9saWN5IG1hbmFnZXIuIFRoaXMgbWV0aG9kIGlzIGV4cGVuc2l2ZQotICAgICAqIGFuZCB0aGVyZWZvcmUgb25seSBjYWxsZWQgd2hlbiBuZWVkZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvYnRhaW5Qb2xpY2llcygpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMucG9saWNpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wb2xpY2llcyA9IGdldFBvbGljeU1hbmFnZXIoKS5nZXRQb2xpY2llcygKLSAgICAgICAgICAgICAgICAgICAgZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLCBnZXRVcmwoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW5zIHRoZSBjcmVkZW50aWFscyBmcm9tIHRoZSBwb2xpY3kgbWFuYWdlci4gVGhpcyBtZXRob2QgaXMgZXhwZW5zaXZlCi0gICAgICogYW5kIHRoZXJlZm9yZSBvbmx5IGNhbGxlZCB3aGVuIG5lZWRlZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9idGFpbkNyZWRlbnRpYWxzKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5jcmVkZW50aWFscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gZ2V0UG9saWN5TWFuYWdlcigpLmdldENyZWRlbnRpYWxzKAotICAgICAgICAgICAgICAgICAgICBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCksIGdldFVybCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWSVNJVE9SX1JPTEVTID0geyAidmlzaXRvciIsICJ2aXNpdCIgfTsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBRE1JTklTVFJBVE9SX1JPTEVTID0geyAiYWRtaW5pc3RyYXRvciIsICJhZG1pbiIsCi0gICAgICAgICAgICAib3JnYW5pemUiIH07Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVVUSE9SX1JPTEVTID0geyAiYXV0aG9yIiwgImVkaXQiIH07Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5I2NoZWNrKG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHksIG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZSkKLSAgICAgKiBJdGVyYXRlIHRoZSBwb2xpY3kgdHJlZSBib3R0b20tdXAuCi0gICAgICovCi0gICAgcHVibGljIGludCBjaGVjayhJZGVudGl0eSBpZGVudGl0eSwgUm9sZSByb2xlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIG9idGFpblBvbGljaWVzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucG9saWNpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSB0aGlzLnBvbGljaWVzW2ldLmNoZWNrKGlkZW50aXR5LCByb2xlKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUG9saWN5LlJFU1VMVF9HUkFOVEVEIHx8IHJlc3VsdCA9PSBQb2xpY3kuUkVTVUxUX0RFTklFRCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBvbGljeS5SRVNVTFRfTk9UX01BVENIRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmlzaXRvciByb2xlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYW5hZ2VyCi0gICAgICogICAgICAgICAgICBUaGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBIHJvbGUuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJvbGUgZ2V0VmlzaXRvclJvbGUoQWNjcmVkaXRhYmxlTWFuYWdlciBtYW5hZ2VyKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBSb2xlIHZpc2l0b3JSb2xlID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWSVNJVE9SX1JPTEVTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBSb2xlIHJvbGUgPSBtYW5hZ2VyLmdldFJvbGVNYW5hZ2VyKCkuZ2V0Um9sZShWSVNJVE9SX1JPTEVTW2ldKTsKLSAgICAgICAgICAgIGlmIChyb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aXNpdG9yUm9sZSA9IHJvbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZpc2l0b3JSb2xlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFkbWluaXN0cmF0b3Igcm9sZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFuYWdlcgotICAgICAqICAgICAgICAgICAgVGhlIGFjY3JlZGl0YWJsZSBtYW5hZ2VyLgotICAgICAqIEByZXR1cm4gQSByb2xlLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSb2xlIGdldEFkbWluaXN0cmF0b3JSb2xlKEFjY3JlZGl0YWJsZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgUm9sZSBhZG1pbmlzdHJhdG9yUm9sZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQURNSU5JU1RSQVRPUl9ST0xFUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUm9sZSByb2xlID0gbWFuYWdlci5nZXRSb2xlTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSb2xlKEFETUlOSVNUUkFUT1JfUk9MRVNbaV0pOwotICAgICAgICAgICAgaWYgKHJvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkbWluaXN0cmF0b3JSb2xlID0gcm9sZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWRtaW5pc3RyYXRvclJvbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXV0aG9yIHJvbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hbmFnZXIKLSAgICAgKiAgICAgICAgICAgIFRoZSBhY2NyZWRpdGFibGUgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIEEgcm9sZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUm9sZSBnZXRBdXRob3JSb2xlKEFjY3JlZGl0YWJsZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgUm9sZSBhZG1pbmlzdHJhdG9yUm9sZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVUSE9SX1JPTEVTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBSb2xlIHJvbGUgPSBtYW5hZ2VyLmdldFJvbGVNYW5hZ2VyKCkuZ2V0Um9sZShBVVRIT1JfUk9MRVNbaV0pOwotICAgICAgICAgICAgaWYgKHJvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkbWluaXN0cmF0b3JSb2xlID0gcm9sZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWRtaW5pc3RyYXRvclJvbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJMIG9mIHRoaXMgcG9saWN5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIFVSTCBvZiB0aGlzIHBvbGljeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXJsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvbGljeSBidWlsZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBwb2xpY3kgYnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5oZXJpdGluZ1BvbGljeU1hbmFnZXIgZ2V0UG9saWN5TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucG9saWN5TWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY2Nlc3MgY29udHJvbGxlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqLwotICAgIHB1YmxpYyBBY2NyZWRpdGFibGVNYW5hZ2VyIGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIFVSTCBwb2xpY3kgcmVxdWlyZXMgU1NMIHByb3RlY3Rpb24gaWYgb25lIG9mIGl0cyBtZW1iZXIgcG9saWNpZXMKLSAgICAgKiByZXF1aXJlcyBTU0wgcHJvdGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5I2lzU1NMUHJvdGVjdGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NTTFByb3RlY3RlZCgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgb2J0YWluUG9saWNpZXMoKTsKLQotICAgICAgICBib29sZWFuIHNzbCA9IGZhbHNlOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKCFzc2wgJiYgaSA8IHRoaXMucG9saWNpZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBzc2wgPSBzc2wgfHwgdGhpcy5wb2xpY2llc1tpXS5pc1NTTFByb3RlY3RlZCgpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNzbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5I2lzRW1wdHkoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gZW1wdHkgPSB0cnVlOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGVtcHR5ICYmIGkgPCB0aGlzLnBvbGljaWVzLmxlbmd0aCkgewotICAgICAgICAgICAgZW1wdHkgPSBlbXB0eSAmJiB0aGlzLnBvbGljaWVzW2ldLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbXB0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ3JlZGVudGlhbFtdIGdldENyZWRlbnRpYWxzKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBvYnRhaW5DcmVkZW50aWFscygpOwotICAgICAgICBTZXQgY3JlZGVudGlhbHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0gICAgICAgIGZvciAoaW50IGFjY3JJbmRleCA9IDA7IGFjY3JJbmRleCA8IHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoOyBhY2NySW5kZXgrKykgewotICAgICAgICAgICAgY3JlZGVudGlhbHMuYWRkKHRoaXMuY3JlZGVudGlhbHNbYWNjckluZGV4XSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChDcmVkZW50aWFsW10pIGNyZWRlbnRpYWxzLnRvQXJyYXkobmV3IENyZWRlbnRpYWxbY3JlZGVudGlhbHMKLSAgICAgICAgICAgICAgICAuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIENyZWRlbnRpYWxbXSBnZXRDcmVkZW50aWFscyhJZGVudGl0eSBpZGVudGl0eSkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgQWNjcmVkaXRhYmxlW10gYWNjcmVkaXRhYmxlcyA9IGlkZW50aXR5LmdldEFjY3JlZGl0YWJsZXMoKTsKLSAgICAgICAgQ3JlZGVudGlhbFtdIGNyZWRlbnRpYWxzID0gZ2V0Q3JlZGVudGlhbHMoKTsKLSAgICAgICAgU2V0IHJldHVybkNyZWRlbnRpYWwgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0gICAgICAgIGZvciAoaW50IGNyZWRJbmRleCA9IDA7IGNyZWRJbmRleCA8IGNyZWRlbnRpYWxzLmxlbmd0aDsgY3JlZEluZGV4KyspIHsKLSAgICAgICAgICAgIENyZWRlbnRpYWwgY3JlZGVudGlhbCA9IGNyZWRlbnRpYWxzW2NyZWRJbmRleF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaW50IGFjY3JJbmRleCA9IDA7IGFjY3JJbmRleCA8IGFjY3JlZGl0YWJsZXMubGVuZ3RoOyBhY2NySW5kZXgrKykgewotICAgICAgICAgICAgICAgIEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUgPSBhY2NyZWRpdGFibGVzW2FjY3JJbmRleF07Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3JlZGVudGlhbC5nZXRBY2NyZWRpdGFibGUoKS5lcXVhbHMoYWNjcmVkaXRhYmxlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5DcmVkZW50aWFsLmFkZChjcmVkZW50aWFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKENyZWRlbnRpYWxbXSkgcmV0dXJuQ3JlZGVudGlhbAotICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBDcmVkZW50aWFsW3JldHVybkNyZWRlbnRpYWwuc2l6ZSgpXSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Vc2VyQXV0aGVudGljYXRvci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvVXNlckF1dGhlbnRpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5OTMyYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Vc2VyQXV0aGVudGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCi0gKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICogIAotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQXV0aGVudGljYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLQotLyoqCi0gKiBVc2VyIGF1dGhlbnRpY2F0b3IuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyQXV0aGVudGljYXRvciBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIEF1dGhlbnRpY2F0b3IgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLkF1dGhlbnRpY2F0b3IjYXV0aGVudGljYXRlKG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3QpIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGZpcnN0IGNoZWNrcyBpZiB0aGUKLSAgICAgKiAgICAgIHVzZXIgaGFzIGF1dGhlbnRpY2F0ZWQgb3ZlciBiYXNpYyBIVFRQIGF1dGhlbnRpY2F0aW9uLiBJZiB5ZXMsIGl0IHVzZXMgdGhlc2UKLSAgICAgKiAgICAgIGNyZWRlbnRpYWxzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShBY2NyZWRpdGFibGVNYW5hZ2VyIGFjY3JlZGl0YWJsZU1hbmFnZXIsIFJlcXVlc3QgcmVxdWVzdCkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZW5jb2RlZCA9ICIiOwotICAgICAgICBTdHJpbmcgdW5lbmNvZGVkID0gIiI7Ci0gICAgICAgIFN0cmluZyB1c2VybmFtZSA9ICIiOwotICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSAiIjsKLSAgICAgICAgaWYgKHJlcXVlc3QuZ2V0SGVhZGVyKCJBdXRob3JpemF0aW9uIikgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5jb2RlZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJBdXRob3JpemF0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuY29kZWQuaW5kZXhPZigiQmFzaWMiKSA+IC0xKSB7Ci0gICAgICAgICAgICBlbmNvZGVkID0gZW5jb2RlZC50cmltKCk7Ci0gICAgICAgICAgICBlbmNvZGVkID0gZW5jb2RlZC5zdWJzdHJpbmcoZW5jb2RlZC5pbmRleE9mKCcgJykgKyAxKTsKLSAgICAgICAgICAgIHVuZW5jb2RlZCA9IG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZUJhc2U2NChlbmNvZGVkLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodW5lbmNvZGVkLmluZGV4T2YoIjoiKSAtIDEgPiAtMSkgewotICAgICAgICAgICAgdXNlcm5hbWUgPSB1bmVuY29kZWQuc3Vic3RyaW5nKDAsIHVuZW5jb2RlZC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgcGFzc3dvcmQgPSB1bmVuY29kZWQuc3Vic3RyaW5nKHVuZW5jb2RlZC5pbmRleE9mKCI6IikgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmNvZGVkLmxlbmd0aCgpID09IDAgJiYgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInVzZXJuYW1lIikgIT0gbnVsbCkgewotICAgICAgICAgICAgdXNlcm5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigidXNlcm5hbWUiKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgcGFzc3dvcmQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFzc3dvcmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW5nIHVzZXJuYW1lIFsiICsgdXNlcm5hbWUgKyAiXSB3aXRoIHBhc3N3b3JkIFsiICsgcGFzc3dvcmQgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVzZXJuYW1lID09IG51bGwgfHwgcGFzc3dvcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIlVzZXJuYW1lIG9yIHBhc3N3b3JkIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IChJZGVudGl0eSkgcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKS5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZiAoaWRlbnRpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIlRoZSBzZXNzaW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIGlkZW50aXR5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBhdXRoZW50aWNhdGVkID0gYXV0aGVudGljYXRlKGFjY3JlZGl0YWJsZU1hbmFnZXIsIHVzZXJuYW1lLCBwYXNzd29yZCwgaWRlbnRpdHkpOwotICAgICAgICByZXR1cm4gYXV0aGVudGljYXRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRoZW50aWNhdGVzIGEgdXNlciB3aXRoIGEgZ2l2ZW4gdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiBXaGVuIHRoZSBhdXRoZW50aWNhdGlvbiBpcwotICAgICAqIHN1Y2Nlc3NmdWwsIHRoZSB1c2VyIGlzIGFkZGVkIHRvIHRoZSBpZGVudGl0eS4KLSAgICAgKiBAcGFyYW0gYWNjcmVkaXRhYmxlTWFuYWdlciBUaGUgYWNjcmVkaXRhYmxlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSB1c2VybmFtZS4KLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLgotICAgICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgaWRlbnRpdHkgdG8gYWRkIHRoZSB1c2VyIHRvLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXV0aGVudGljYXRlKEFjY3JlZGl0YWJsZU1hbmFnZXIgYWNjcmVkaXRhYmxlTWFuYWdlciwgU3RyaW5nIHVzZXJuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkLCBJZGVudGl0eSBpZGVudGl0eSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIFVzZXIgdXNlciA9IGFjY3JlZGl0YWJsZU1hbmFnZXIuZ2V0VXNlck1hbmFnZXIoKS5nZXRVc2VyKHVzZXJuYW1lKTsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBdXRoZW50aWNhdGluZyB1c2VyOiBbIiArIHVzZXIgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBhdXRoZW50aWNhdGVkID0gZmFsc2U7Ci0gICAgICAgIGlmICh1c2VyICE9IG51bGwgJiYgdXNlci5hdXRoZW50aWNhdGUocGFzc3dvcmQpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJVc2VyIFsiICsgdXNlciArICJdIGF1dGhlbnRpY2F0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaWRlbnRpdHkuY29udGFpbnModXNlcikpIHsKLSAgICAgICAgICAgICAgICBVc2VyIG9sZFVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlbW92aW5nIHVzZXIgWyIgKyBvbGRVc2VyICsgIl0gZnJvbSBpZGVudGl0eS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZGVudGl0eS5yZW1vdmVJZGVudGlmaWFibGUob2xkVXNlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlkZW50aXR5LmFkZElkZW50aWZpYWJsZSh1c2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJObyBzdWNoIHVzZXI6IFsiICsgdXNlcm5hbWUgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiVXNlciBbIiArIHVzZXJuYW1lICsgIl0gbm90IGF1dGhlbnRpY2F0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYXV0aGVudGljYXRlZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvRG9jdW1lbnRQb2xpY3lNYW5hZ2VyV3JhcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy9Eb2N1bWVudFBvbGljeU1hbmFnZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NWRkM2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy9Eb2N1bWVudFBvbGljeU1hbmFnZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5DcmVkZW50aWFsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Jbmhlcml0aW5nUG9saWN5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5EZWZhdWx0QWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5jb250ZXh0LkNvbnRleHRVdGlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotCi0vKioKLSAqIEEgUG9saWN5TWFuYWdlciB3aGljaCBpcyBjYXBhYmxlIG9mIG1hcHBpbmcgYWxsIFVSTHMgb2YgYSBkb2N1bWVudCB0byB0aGUKLSAqIGFwcHJvcHJpYXRlIGNhbm9uaWNhbCBVUkwsIGUuZy4gPGNvZGU+L2Zvby9iYXJfZGUucHJpbnQuaHRtbDwvY29kZT4gaXMKLSAqIG1hcHBlZCB0byA8Y29kZT4vZm9vL2JhcjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFBvbGljeU1hbmFnZXJXcmFwcGVyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMKLSAgICAgICAgSW5oZXJpdGluZ1BvbGljeU1hbmFnZXIsIFNlcnZpY2VhYmxlLCBDb25maWd1cmFibGUsIERpc3Bvc2FibGUgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRQb2xpY3lNYW5hZ2VyV3JhcHBlcigpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHByaXZhdGUgSW5oZXJpdGluZ1BvbGljeU1hbmFnZXIgcG9saWN5TWFuYWdlcjsKLSAgICBwcml2YXRlIFNlcnZpY2VTZWxlY3RvciBwb2xpY3lNYW5hZ2VyU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkkgd2hpY2ggaXMgdXNlZCB0byBvYnRhaW4gdGhlIHBvbGljeSBmb3IgYSB3ZWJhcHAgVVJMLgotICAgICAqIEBwYXJhbSB3ZWJhcHBVcmwgVGhlIHdlYiBhcHBsaWNhdGlvbiBVUkwuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBvbGljeVVSTChTdHJpbmcgd2ViYXBwVXJsKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UG9saWN5VXJsQ29ycmVjdCh3ZWJhcHBVcmwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkkgd2hpY2ggaXMgdXNlZCB0byBvYnRhaW4gdGhlIHBvbGljeSBmb3IgYSB3ZWJhcHAgVVJMLgotICAgICAqIEBwYXJhbSB3ZWJhcHBVcmwgVGhlIHdlYiBhcHBsaWNhdGlvbiBVUkwuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBvbGljeVVybENvcnJlY3QoU3RyaW5nIHdlYmFwcFVybCkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlc29sdmluZyBwb2xpY3kgZm9yIHdlYmFwcCBVUkwgWyIgKyB3ZWJhcHBVcmwgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHVybCA9IG51bGw7Ci0gICAgICAgIENvbnRleHRVdGlsaXR5IGNvbnRleHRVdGlsaXR5ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRleHRVdGlsaXR5ID0gKENvbnRleHRVdGlsaXR5KSBzZXJ2aWNlTWFuYWdlci5sb29rdXAoQ29udGV4dFV0aWxpdHkuUk9MRSk7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMuc2VydmljZU1hbmFnZXIsIGNvbnRleHRVdGlsaXR5Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXF1ZXN0KCkpOwotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IG1hcCA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5zZXJ2aWNlTWFuYWdlciwgc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIGFsd2F5cyBjaGVjayBmb3IgYXV0aG9yaW5nIFVSTCBzaW5jZSB0aGUgbGl2ZSBkb2N1bWVudCBkb2Vzbid0Ci0gICAgICAgICAgICAvLyBoYXZlIHRvIGV4aXN0Ci0KLSAgICAgICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24od2ViYXBwVXJsKTsKLSAgICAgICAgICAgIC8vIERhbmdlciwgV2lsbCBSb2JpbnNvbiEgSWYgYXJlYSBvciBwdWJJZCBpcyBudWxsLCB3ZWJhcHBVcmwuc3Vic3RyaW5nKCkKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgb3V0IG9mIGJvdW5kcywgYmVjYXVzZSBudWxsIGJlY29tZXMgIm51bGwiIGluIHN0cmluZyBjb25jYXRlbmF0aW9uCi0gICAgICAgICAgICBTdHJpbmcgcHViSWQgPSBpbmZvLmdldFB1YmxpY2F0aW9uSWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBhcmVhID0gaW5mby5nZXRBcmVhKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIi8iICsgKChwdWJJZCAhPSBudWxsKSA/IHB1YklkICsgIi8iIDogIiIpOwotICAgICAgICAgICAgLy8gU3RyaW5nIHByZWZpeCA9ICIvIiArIHB1YklkICsgIi8iOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeFdpdGhBcmVhID0gcHJlZml4ICsgKChhcmVhICE9IG51bGwpID8gYXJlYSA6ICIiKTsKLSAgICAgICAgICAgIC8vIFN0cmluZyBwcmVmaXhXaXRoQXJlYSA9IHByZWZpeCArIGFyZWE7Ci0gICAgICAgICAgICBTdHJpbmcgYXV0aG9yaW5nVXJsID0gcHJlZml4ICsgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEKLSAgICAgICAgICAgICAgICAgICAgKyAoKHdlYmFwcFVybC5sZW5ndGgoKT5wcmVmaXhXaXRoQXJlYS5sZW5ndGgoKSk/d2ViYXBwVXJsLnN1YnN0cmluZyhwcmVmaXhXaXRoQXJlYS5sZW5ndGgoKSk6Ii8iKTsKLQotICAgICAgICAgICAgaWYgKG1hcC5pc0RvY3VtZW50KGF1dGhvcmluZ1VybCkpIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBhdXRob3JpbmdEb2MgPSBtYXAuZ2V0RnJvbVVSTChhdXRob3JpbmdVcmwpOwotICAgICAgICAgICAgICAgIHVybCA9ICIvIiArIGF1dGhvcmluZ0RvYy5nZXRQdWJsaWNhdGlvbigpLmdldElkKCkgKyAiLyIgKyBhcmVhCi0gICAgICAgICAgICAgICAgICAgICAgICArIGF1dGhvcmluZ0RvYy5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBEb2N1bWVudCBleGlzdHMiKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBEb2N1bWVudCBwYXRoOiBbIiArIGF1dGhvcmluZ0RvYy5nZXRQYXRoKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiRXJyb3IgbG9va2luZyB1cCBDb250ZXh0VXRpbGl0eSBjb21wb25lbnQiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbnRleHRVdGlsaXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlTWFuYWdlci5yZWxlYXNlKGNvbnRleHRVdGlsaXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiICAgIERvY3VtZW50IGRvZXMgbm90IGV4aXN0LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXJsID0gd2ViYXBwVXJsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIgICAgVXNpbmcgVVJMOiBbIiArIHVybCArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBvbGljeVVybEZhc3QoU3RyaW5nIHdlYmFwcFVybCkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0cmlwcGVkVXJsID0gc3RyaXAoc3RyaXAod2ViYXBwVXJsLCAnLicpLCAnXycpOwotICAgICAgICByZXR1cm4gc3RyaXBwZWRVcmw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzdHJpcChTdHJpbmcgc3RyaXBwZWRVcmwsIGNoYXIgZGVsaW1pdGVyKSB7Ci0gICAgICAgIGludCBsYXN0RG90SW5kZXggPSBzdHJpcHBlZFVybC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpOwotICAgICAgICBpZiAobGFzdERvdEluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBzdHJpcHBlZFVybCA9IHN0cmlwcGVkVXJsLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJpcHBlZFVybDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNhdGlvbiBmb3IgYSBjZXJ0YWluIFVSTC4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSB3ZWJhcHAgdXJsLgotICAgICAqIEByZXR1cm4gQSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiB0aGUgcHVibGljYXRpb24gY291bGQgbm90IGJlIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKFN0cmluZyB1cmwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkJ1aWxkaW5nIHB1YmxpY2F0aW9uIik7Ci0KLSAgICAgICAgQ29udGV4dFV0aWxpdHkgdXRpbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1dGlsID0gKENvbnRleHRVdGlsaXR5KSB0aGlzLnNlcnZpY2VNYW5hZ2VyLmxvb2t1cChDb250ZXh0VXRpbGl0eS5ST0xFKTsKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IHV0aWwuZ2V0UmVxdWVzdCgpOwotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudFV0aWwuZ2V0RG9jdW1lbnRGYWN0b3J5KHRoaXMuc2VydmljZU1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgcmV0dXJuIFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5zZXJ2aWNlTWFuYWdlciwgZmFjdG9yeSwgdXJsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHV0aWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZU1hbmFnZXIucmVsZWFzZSh1dGlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgc2VydmljZU1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgZ2V0U2VydmljZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwb2xpY3lNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBJbmhlcml0aW5nUG9saWN5TWFuYWdlciBnZXRQb2xpY3lNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wb2xpY3lNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBfcG9saWN5TWFuYWdlciBUaGUgcG9saWN5TWFuYWdlciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9saWN5TWFuYWdlcihJbmhlcml0aW5nUG9saWN5TWFuYWdlciBfcG9saWN5TWFuYWdlcikgewotICAgICAgICB0aGlzLnBvbGljeU1hbmFnZXIgPSBfcG9saWN5TWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9saWN5IGJ1aWxkU3VidHJlZVBvbGljeShBY2NyZWRpdGFibGVNYW5hZ2VyIGNvbnRyb2xsZXIsIFN0cmluZyB1cmwpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQb2xpY3lNYW5hZ2VyKCkuYnVpbGRTdWJ0cmVlUG9saWN5KGNvbnRyb2xsZXIsIGdldFBvbGljeVVSTCh1cmwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9saWN5W10gZ2V0UG9saWNpZXMoQWNjcmVkaXRhYmxlTWFuYWdlciBjb250cm9sbGVyLCBTdHJpbmcgdXJsKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UG9saWN5TWFuYWdlcigpLmdldFBvbGljaWVzKGNvbnRyb2xsZXIsIGdldFBvbGljeVVSTCh1cmwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlU3VidHJlZVBvbGljeShTdHJpbmcgdXJsLCBQb2xpY3kgcG9saWN5KSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFBvbGljeU1hbmFnZXIoKS5zYXZlU3VidHJlZVBvbGljeShnZXRQb2xpY3lVUkwodXJsKSwgcG9saWN5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlciNnZXRQb2xpY3kob3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgUG9saWN5IGdldFBvbGljeShBY2NyZWRpdGFibGVNYW5hZ2VyIGNvbnRyb2xsZXIsIFN0cmluZyB1cmwpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQb2xpY3lNYW5hZ2VyKCkuZ2V0UG9saWN5KGNvbnRyb2xsZXIsIGdldFBvbGljeVVSTCh1cmwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlciNhY2NyZWRpdGFibGVSZW1vdmVkKG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjY3JlZGl0YWJsZVJlbW92ZWQoQWNjcmVkaXRhYmxlTWFuYWdlciBtYW5hZ2VyLCBBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBnZXRQb2xpY3lNYW5hZ2VyKCkuYWNjcmVkaXRhYmxlUmVtb3ZlZChtYW5hZ2VyLCBhY2NyZWRpdGFibGUpOwotCi0gICAgfQotCi0gICAgU3RyaW5nIEVMRU1FTlRfUE9MSUNZX01BTkFHRVIgPSAicG9saWN5LW1hbmFnZXIiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfVFlQRSA9ICJ0eXBlIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBwb2xpY3lNYW5hZ2VyQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGQoCi0gICAgICAgICAgICAgICAgdGhpcy5FTEVNRU5UX1BPTElDWV9NQU5BR0VSLCBmYWxzZSk7Ci0gICAgICAgIGlmIChwb2xpY3lNYW5hZ2VyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBwb2xpY3lNYW5hZ2VyQ29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUodGhpcy5BVFRSSUJVVEVfVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICB0aGlzLnBvbGljeU1hbmFnZXJTZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIGdldFNlcnZpY2VNYW5hZ2VyKCkubG9va3VwKAotICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5TWFuYWdlci5ST0xFICsgIlNlbGVjdG9yIik7Ci0KLSAgICAgICAgICAgICAgICBQb2xpY3lNYW5hZ2VyIF9wb2xpY3lNYW5hZ2VyID0gKFBvbGljeU1hbmFnZXIpIHRoaXMucG9saWN5TWFuYWdlclNlbGVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KHR5cGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKCEoX3BvbGljeU1hbmFnZXIgaW5zdGFuY2VvZiBJbmhlcml0aW5nUG9saWN5TWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIlRoZSAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEluaGVyaXRpbmdQb2xpY3lNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICIuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRGVmYXVsdEFjY2Vzc0NvbnRyb2xsZXIuY29uZmlndXJlT3JQYXJhbWV0ZXJpemUoX3BvbGljeU1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNYW5hZ2VyQ29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgc2V0UG9saWN5TWFuYWdlcigoSW5oZXJpdGluZ1BvbGljeU1hbmFnZXIpIF9wb2xpY3lNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiT2J0YWluaW5nIHBvbGljeSBtYW5hZ2VyIGZvciB0eXBlIFsiICsgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBmYWlsZWQ6ICIsIGUxKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNlcnZpY2VFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiT2J0YWluaW5nIHBvbGljeSBtYW5hZ2VyIGZvciB0eXBlIFsiICsgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBmYWlsZWQ6ICIsIGUxKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcmFtZXRlckV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJPYnRhaW5pbmcgcG9saWN5IG1hbmFnZXIgZm9yIHR5cGUgWyIgKyB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIGZhaWxlZDogIiwgZTEpOwotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJPYnRhaW5pbmcgcG9saWN5IG1hbmFnZXIgZm9yIHR5cGUgWyIgKyB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIGZhaWxlZDogIiwgZTEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAodGhpcy5wb2xpY3lNYW5hZ2VyU2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldFBvbGljeU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wb2xpY3lNYW5hZ2VyU2VsZWN0b3IucmVsZWFzZShnZXRQb2xpY3lNYW5hZ2VyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2VydmljZU1hbmFnZXIoKS5yZWxlYXNlKHRoaXMucG9saWN5TWFuYWdlclNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRpc3Bvc2luZyBbIiArIHRoaXMgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlciNhY2NyZWRpdGFibGVBZGRlZChvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZU1hbmFnZXIsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY2NyZWRpdGFibGVBZGRlZChBY2NyZWRpdGFibGVNYW5hZ2VyIG1hbmFnZXIsIEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFBvbGljeU1hbmFnZXIoKS5hY2NyZWRpdGFibGVBZGRlZChtYW5hZ2VyLCBhY2NyZWRpdGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDcmVkZW50aWFsW10gZ2V0Q3JlZGVudGlhbHMoQWNjcmVkaXRhYmxlTWFuYWdlciBjb250cm9sbGVyLCBTdHJpbmcgdXJsKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UG9saWN5TWFuYWdlcigpLmdldENyZWRlbnRpYWxzKGNvbnRyb2xsZXIsIGdldFBvbGljeVVSTCh1cmwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUm9sZVtdIGdldEdyYW50ZWRSb2xlcyhBY2NyZWRpdGFibGVNYW5hZ2VyIGFjY3JlZGl0YWJsZU1hbmFnZXIsIElkZW50aXR5IGlkZW50aXR5LAotICAgICAgICAgICAgU3RyaW5nIHVybCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UG9saWN5TWFuYWdlcigpLmdldEdyYW50ZWRSb2xlcyhhY2NyZWRpdGFibGVNYW5hZ2VyLCBpZGVudGl0eSwgZ2V0UG9saWN5VVJMKHVybCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL1B1YmxpY2F0aW9uQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL1B1YmxpY2F0aW9uQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYmNiZDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy9QdWJsaWNhdGlvbkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMuY29udGV4dC5Db250ZXh0VXRpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotCi0vKioKLSAqIFJlc29sdmVzIHRoZSBhY2Nlc3MgY29udHJvbGxlciBhY2NvcmRpbmcgdG8gdGhlIDxjb2RlPmFjY2Vzcy1jb250cm9sLnhtbDwvY29kZT4gZmlsZSBvZiBhIHB1YmxpY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHVibGljYXRpb25BY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciBpbXBsZW1lbnRzCi0gICAgICAgIEluaXRpYWxpemFibGUgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNfQ09ORklHVVJBVElPTl9GSUxFCi0gICAgICAgID0gImNvbmZpZy9hY2Nlc3MtY29udHJvbC9hY2Nlc3MtY29udHJvbC54bWwiLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQVRUUklCVVRFID0gInR5cGUiOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBwdWJsaWNhdGlvbiBJRCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBjb250ZXh0IHBhdGggYXMgY2FjaGUKLSAgICAgKiBrZXkuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIjZ2VuZXJhdGVDYWNoZUtleShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyKQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZ2VuZXJhdGVDYWNoZUtleShTdHJpbmcgd2ViYXBwVXJsLCBTb3VyY2VSZXNvbHZlciByZXNvbHZlcikKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKHdlYmFwcFVybCk7Ci0KLSAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uSWQgPSBpbmZvLmdldFB1YmxpY2F0aW9uSWQoKTsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJVc2luZyBmaXJzdCBVUkwgc3RlcCAobWlnaHQgYmUgcHVibGljYXRpb24gSUQpIGFzIGNhY2hlIGtleTogWyIKLSAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNhdGlvbklkICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5nZW5lcmF0ZUNhY2hlS2V5KHB1YmxpY2F0aW9uSWQsIHJlc29sdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciNkb1Jlc29sdmVBY2Nlc3NDb250cm9sbGVyKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIEFjY2Vzc0NvbnRyb2xsZXIgZG9SZXNvbHZlQWNjZXNzQ29udHJvbGxlcihTdHJpbmcgd2ViYXBwVXJsKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUmVzb2x2aW5nIGNvbnRyb2xsZXIgZm9yIFVSTCBbIiArIHdlYmFwcFVybCArICJdIik7Ci0KLSAgICAgICAgQWNjZXNzQ29udHJvbGxlciBjb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBnZXRQdWJsaWNhdGlvbih3ZWJhcHBVcmwpOwotCi0gICAgICAgIGlmIChwdWJsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHVibGljYXRpb25VcmwgPSB3ZWJhcHBVcmwuc3Vic3RyaW5nKCgiLyIgKyBwdWJsaWNhdGlvbi5nZXRJZCgpKS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gcmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIocHVibGljYXRpb24sIHB1YmxpY2F0aW9uVXJsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNhdGlvbiBmb3IgdGhlIHdlYmFwcCBVUkwgb3IgbnVsbCBpZiB0aGUgVVJMIGlzIG5vdCBpbmNsdWRlZCBpbiBhCi0gICAgICogcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgd2ViYXBwIFVSTC4KLSAgICAgKiBAcmV0dXJuIEEgcHVibGljYXRpb24uCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKFN0cmluZyB3ZWJhcHBVcmwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBudWxsOwotCi0gICAgICAgIGFzc2VydCB3ZWJhcHBVcmwuc3RhcnRzV2l0aCgiLyIpOwotICAgICAgICAvLyByZW1vdmUgbGVhZGluZyBzbGFzaAotICAgICAgICBTdHJpbmcgdXJsID0gd2ViYXBwVXJsLnN1YnN0cmluZygxKTsKLQotICAgICAgICBpZiAodXJsLmxlbmd0aCgpID4gMCkgewotCi0gICAgICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKHdlYmFwcFVybCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHViSWQgPSBpbmZvLmdldFB1YmxpY2F0aW9uSWQoKTsKLQotICAgICAgICAgICAgQ29udGV4dFV0aWxpdHkgdXRpbCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHV0aWwgPSAoQ29udGV4dFV0aWxpdHkpIHRoaXMubWFuYWdlci5sb29rdXAoQ29udGV4dFV0aWxpdHkuUk9MRSk7Ci0gICAgICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gdXRpbC5nZXRSZXF1ZXN0KCk7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudFV0aWwuZ2V0RG9jdW1lbnRGYWN0b3J5KG1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgICAgIGlmIChwdWJJZCAhPSBudWxsICYmIGZhY3RvcnkuZXhpc3RzUHVibGljYXRpb24ocHViSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHV0aWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZSh1dGlsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHVibGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJQdWJsaWNhdGlvbiBbIiArIHB1YklkICsgIl0gZXhpc3RzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwdWJsaWNhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2bGV0IGNvbnRleHQuCi0gICAgICogQHJldHVybiBBIGZpbGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYWNjZXNzIGNvbnRyb2wgY29uZmlndXJhdGlvbiBvZiBhIHNwZWNpZmljIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHJldHVybiBDb25maWd1cmF0aW9uCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBGaWxlIGNvbmZpZ3VyYXRpb25GaWxlID0gbmV3IEZpbGUocHVibGljYXRpb24uZ2V0RGlyZWN0b3J5KCksIEFDX0NPTkZJR1VSQVRJT05fRklMRSk7Ci0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25GaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXIoKS5idWlsZEZyb21GaWxlKGNvbmZpZ3VyYXRpb25GaWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeTogIiArIGNvbmZpZ3VyYXRpb25GaWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZSBjb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZXMgYW4gYWNjZXNzIGNvbnRyb2xsZXIgZm9yIGEgY2VydGFpbiBVUkwgd2l0aGluIGEgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgd2l0aGluIHRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIEFuIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBBY2Nlc3NDb250cm9sbGVyIHJlc29sdmVBY2Nlc3NDb250cm9sbGVyKFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTdHJpbmcgdXJsKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydCBwdWJsaWNhdGlvbiAhPSBudWxsOwotCi0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIgYWNjZXNzQ29udHJvbGxlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldENvbmZpZ3VyYXRpb24ocHVibGljYXRpb24pOwotICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSk7Ci0KLSAgICAgICAgICAgIGFjY2Vzc0NvbnRyb2xsZXIgPSAoQWNjZXNzQ29udHJvbGxlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChBY2Nlc3NDb250cm9sbGVyLlJPTEUgKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgKyB0eXBlKTsKLQotICAgICAgICAgICAgaWYgKGFjY2Vzc0NvbnRyb2xsZXIgaW5zdGFuY2VvZiBDb25maWd1cmFibGUpIHsKLSAgICAgICAgICAgICAgICAoKENvbmZpZ3VyYWJsZSkgYWNjZXNzQ29udHJvbGxlcikuY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhY2Nlc3NDb250cm9sbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkluaXRpYWxpemFibGUjaW5pdGlhbGl6ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFNvdXJjZSBjb250ZXh0U291cmNlID0gbnVsbDsKLSAgICAgICAgRmlsZSBjb250ZXh0RGlyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIGdldE1hbmFnZXIoKS5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBjb250ZXh0U291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSSgiY29udGV4dDovLy8iKTsKLSAgICAgICAgICAgIGNvbnRleHREaXIgPSBTb3VyY2VVdGlsLmdldEZpbGUoY29udGV4dFNvdXJjZSk7Ci0KLSAgICAgICAgICAgIGlmIChjb250ZXh0RGlyID09IG51bGwgfHwgIWNvbnRleHREaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKCJUaGUgc2VydmxldCBjb250ZXh0IGlzIG5vdCBhIGRpcmVjdG9yeSEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dFNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2UoY29udGV4dFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0RGlyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy9TaXRlbWFwUG9saWN5TWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy9TaXRlbWFwUG9saWN5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQzOGE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvU2l0ZW1hcFBvbGljeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkNyZWRlbnRpYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5Qb2xpY3lCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQb2xpY3kgbWFuYWdlciBiYXNlZCBvbiBDb2Nvb24gc2l0ZW1hcHMuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlbWFwUG9saWN5TWFuYWdlciBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFBvbGljeU1hbmFnZXIsIFNlcnZpY2VhYmxlIHsKLQotICAgIHByaXZhdGUgQ3JlZGVudGlhbFtdIGNyZWRlbnRpYWxzOwotCi0JLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeU1hbmFnZXIjZ2V0UG9saWN5KG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFBvbGljeSBnZXRQb2xpY3koQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyLCBTdHJpbmcgdXJsKQotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgaW50IHNsYXNoSW5kZXggPSB1cmwuaW5kZXhPZigiLyIpOwotICAgICAgICBpZiAoc2xhc2hJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgc2xhc2hJbmRleCA9IHVybC5sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwdWJsaWNhdGlvbklkID0gdXJsLnN1YnN0cmluZygwLCBzbGFzaEluZGV4KTsKLSAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZyhwdWJsaWNhdGlvbklkLmxlbmd0aCgpKTsKLQotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFBvbGljeSBwb2xpY3kgPSBudWxsOwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBnZXRNYW5hZ2VyKCkubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotCi0gICAgICAgICAgICBTdHJpbmcgcG9saWN5VXJsID0gcHVibGljYXRpb25JZCArICIvcG9saWNpZXMiICsgdXJsICsgIi5hY21sIjsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJQb2xpY3kgVVJMOiAiICsgcG9saWN5VXJsKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoImNvY29vbjovLyIgKyBwb2xpY3lVcmwpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoc291cmNlLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgcG9saWN5ID0gbmV3IFBvbGljeUJ1aWxkZXIoYWNjcmVkaXRhYmxlTWFuYWdlcikuYnVpbGRQb2xpY3koZG9jdW1lbnQpOwotICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscz1wb2xpY3kuZ2V0Q3JlZGVudGlhbHMoKTsKLSAgICAgICAgfSBjYXRjaCAoU291cmNlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBvbGljeTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBfbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBfbWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBBIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlciNhY2NyZWRpdGFibGVSZW1vdmVkKG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjY3JlZGl0YWJsZVJlbW92ZWQoQWNjcmVkaXRhYmxlTWFuYWdlciBfbWFuYWdlciwgQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQkgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5Qb2xpY3lNYW5hZ2VyI2FjY3JlZGl0YWJsZUFkZGVkKG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlciwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjY3JlZGl0YWJsZUFkZGVkKEFjY3JlZGl0YWJsZU1hbmFnZXIgX21hbmFnZXIsIEFjY3JlZGl0YWJsZSBhY2NyZWRpdGFibGUpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0JICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLQlwdWJsaWMgQ3JlZGVudGlhbFtdIGdldENyZWRlbnRpYWxzKEFjY3JlZGl0YWJsZU1hbmFnZXIgY29udHJvbGxlciwgU3RyaW5nIHVybCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCQlDcmVkZW50aWFsW10gY29weSA9IG5ldyBDcmVkZW50aWFsW2NyZWRlbnRpYWxzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3JlZGVudGlhbHMubGVuZ3RoOyBpKyspIHsKLQkJCWNvcHlbaV09Y3JlZGVudGlhbHNbaV07Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0gICAgcHVibGljIFJvbGVbXSBnZXRHcmFudGVkUm9sZXMoQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyLCBJZGVudGl0eSBpZGVudGl0eSwKLSAgICAgICAgICAgIFN0cmluZyB1cmwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgUm9sZVtdIHJvbGVzID0gYWNjcmVkaXRhYmxlTWFuYWdlci5nZXRSb2xlTWFuYWdlcigpLmdldFJvbGVzKCk7Ci0gICAgICAgIFNldCBncmFudGVkUm9sZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBQb2xpY3kgcG9saWN5ID0gZ2V0UG9saWN5KGFjY3JlZGl0YWJsZU1hbmFnZXIsIHVybCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwb2xpY3kuY2hlY2soaWRlbnRpdHksIHJvbGVzW2ldKSA9PSBQb2xpY3kuUkVTVUxUX0dSQU5URUQpIHsKLSAgICAgICAgICAgICAgICBncmFudGVkUm9sZXMuYWRkKHJvbGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFJvbGVbXSkgZ3JhbnRlZFJvbGVzLnRvQXJyYXkobmV3IFJvbGVbZ3JhbnRlZFJvbGVzLnNpemUoKV0pOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9BY2Nlc3NDb250cm9sQWN0aW9uLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvQWNjZXNzQ29udHJvbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzdlODNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9BY2Nlc3NDb250cm9sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uYWN0aW5nLkNvbmZpZ3VyYWJsZVNlcnZpY2VhYmxlQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci0KLS8qKgotICogU3VwZXIgY2xhc3MgZm9yIGFjY2VzcyBjb250cm9sIGFjdGlvbnMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFjY2Vzc0NvbnRyb2xBY3Rpb24gZXh0ZW5kcyBDb25maWd1cmFibGVTZXJ2aWNlYWJsZUFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIEFjY2Vzc0NvbnRyb2xsZXIgYWNjZXNzQ29udHJvbGxlcjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEludm9rZXMgdGhlIGFjY2VzcyBjb250cm9sIGZ1bmN0aW9uYWxpdHkuCi0gICAgICogSWYgbm8gYWNjZXNzIGNvbnRyb2xsZXIgd2FzIGZvdW5kIGZvciB0aGUgcmVxdWVzdGVkIFVSTCwgYW4gZW1wdHkgbWFwIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgdGVtcGxhdGUgbWV0aG9kLiBJbXBsZW1lbnQgZG9BY3QoKSB0byBhZGQgeW91ciBmdW5jdGlvbmFsaXR5LgotICAgICAqIDwvcD4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmFjdGluZy5BY3Rpb24jYWN0KG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3IsIG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLCBqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgYWN0KAotICAgICAgICBSZWRpcmVjdG9yIHJlZGlyZWN0b3IsCi0gICAgICAgIFNvdXJjZVJlc29sdmVyIHNvdXJjZVJlc29sdmVyLAotICAgICAgICBNYXAgb2JqZWN0TW9kZWwsCi0gICAgICAgIFN0cmluZyBzb3VyY2UsCi0gICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlclJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgdGhpcy5hY2Nlc3NDb250cm9sbGVyID0gbnVsbDsKLQotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLQotICAgICAgICBNYXAgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPQotICAgICAgICAgICAgICAgIChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZXNvbHZpbmcgQUMgcmVzb2x2ZXIgZm9yIHR5cGUgWyIgKyBBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuREVGQVVMVF9SRVNPTFZFUiArICJdIik7Ci0gICAgICAgICAgICByZXNvbHZlciA9Ci0gICAgICAgICAgICAgICAgKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcikgc2VsZWN0b3Iuc2VsZWN0KAotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuREVGQVVMVF9SRVNPTFZFUik7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUmVzb2x2ZWQgQUMgcmVzb2x2ZXIgWyIgKyByZXNvbHZlciArICJdIik7Ci0KLSAgICAgICAgICAgIFN0cmluZyB3ZWJhcHBVcmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgICAgIHRoaXMuYWNjZXNzQ29udHJvbGxlciA9IHJlc29sdmVyLnJlc29sdmVBY2Nlc3NDb250cm9sbGVyKHdlYmFwcFVybCk7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmFjY2Vzc0NvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NDb250cm9sbGVyLnNldHVwSWRlbnRpdHkocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZG9BY3QocmVkaXJlY3Rvciwgc291cmNlUmVzb2x2ZXIsIG9iamVjdE1vZGVsLCBzb3VyY2UsIHBhcmFtZXRlcnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIGFjdCBtZXRob2QuCi0gICAgICogQHBhcmFtIHJlZGlyZWN0b3IgIFRoZSA8Y29kZT5SZWRpcmVjdG9yPC9jb2RlPiBpbiBjaGFyZ2UKLSAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgICAgVGhlIDxjb2RlPlNvdXJjZVJlc29sdmVyPC9jb2RlPiBpbiBjaGFyZ2UKLSAgICAgKiBAcGFyYW0gb2JqZWN0TW9kZWwgVGhlIDxjb2RlPk1hcDwvY29kZT4gd2l0aCBvYmplY3Qgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgZW52aXJvbm1lbnQgd2hpY2ggY2FuIGJlIHVzZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgdG8gc2VsZWN0IHZhbHVlcyB0aGlzIGNvbnRyb2xsZXIgbWF5IG5lZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgKGllIFJlcXVlc3QsIFJlc3BvbnNlKS4KLSAgICAgKiBAcGFyYW0gc291cmNlICAgICAgQSBzb3VyY2UgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byB0aGUgQWN0aW9uCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgIFRoZSA8Y29kZT5QYXJhbWV0ZXJzPC9jb2RlPiBmb3IgdGhpcyBpbnZvY2F0aW9uCi0gICAgICogQHJldHVybiBNYXAgICAgICAgIFRoZSByZXR1cm5lZCA8Y29kZT5NYXA8L2NvZGU+IG9iamVjdCB3aXRoCi0gICAgICogICAgICAgICAgICAgICAgICAgIHNpdGVtYXAgc3Vic3RpdHV0aW9uIHZhbHVlcyB3aGljaCBjYW4gYmUgdXNlZAotICAgICAqICAgICAgICAgICAgICAgICAgICBpbiBzdWJzZXF1ZW50IGVsZW1lbnRzIGF0dHJpYnV0ZXMgbGlrZSBzcmM9Ci0gICAgICogICAgICAgICAgICAgICAgICAgIHVzaW5nIGEgeHBhdGggbGlrZSBleHByZXNzaW9uOiBzcmM9Im15ZGlyL3tteXZhbH0vZm9vIgotICAgICAqICAgICAgICAgICAgICAgICAgICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG51bGwgdGhlIHByb2Nlc3NpbmcgaW5zaWRlCi0gICAgICogICAgICAgICAgICAgICAgICAgIHRoZSA8bWFwOmFjdD4gZWxlbWVudCBvZiB0aGUgc2l0ZW1hcCB3aWxsCi0gICAgICogICAgICAgICAgICAgICAgICAgIGJlIHNraXBwZWQuCi0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gSW5kaWNhdGVzIHNvbWV0aGluZyBpcyB0b3RhbGx5IHdyb25nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1hcCBkb0FjdCgKLSAgICAgICAgUmVkaXJlY3RvciByZWRpcmVjdG9yLAotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciwKLSAgICAgICAgTWFwIG9iamVjdE1vZGVsLAotICAgICAgICBTdHJpbmcgc291cmNlLAotICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY2Nlc3MgY29udHJvbGxlci4KLSAgICAgKiBAcmV0dXJuIEFuIGFjY2VzcyBjb250cm9sbGVyLgotICAgICAqLwotICAgIHB1YmxpYyBBY2Nlc3NDb250cm9sbGVyIGdldEFjY2Vzc0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc0NvbnRyb2xsZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvRGVsZWdhdGluZ0F1dGhlbnRpY2F0b3JBY3Rpb24uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9EZWxlZ2F0aW5nQXV0aGVudGljYXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMwYjAzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9EZWxlZ2F0aW5nQXV0aGVudGljYXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKg0KLSAqLw0KLQ0KLS8qICRJZDogRGVsZWdhdGluZ0F1dGhlbnRpY2F0b3JBY3Rpb24uamF2YSA0MjYxNiAyMDA0LTAzLTAzIDEyOjU2OjMzWiBncmVnb3IgJCAgKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3Rpbmc7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyOw0KLQ0KLS8qKg0KLSAqIEF1dGhlbnRpY2F0b3IgYWN0aW9uIHRoYXQgZGVsZWdhdGVzIHRoZSBhdXRoZW50aWNhdGlvbiB0byBhbiBhY2Nlc3MgY29udHJvbGxlci4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ0F1dGhlbnRpY2F0b3JBY3Rpb24gZXh0ZW5kcyBBY2Nlc3NDb250cm9sQWN0aW9uIHsNCi0NCi0gICAgLyoqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZy5BY2Nlc3NDb250cm9sQWN0aW9uI2RvQWN0KG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3IsIG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLCBqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzKQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIE1hcCBkb0FjdCgNCi0gICAgICAgIFJlZGlyZWN0b3IgcmVkaXJlY3RvciwNCi0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLA0KLSAgICAgICAgTWFwIG9iamVjdE1vZGVsLA0KLSAgICAgICAgU3RyaW5nIHNvdXJjZSwNCi0gICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycykNCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkF1dGhlbnRpY2F0aW5nIHJlcXVlc3QiKTsNCi0NCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOw0KLSAgICAgICAgTWFwIHJlc3VsdCA9IG51bGw7DQotICAgICAgICBpZiAoZ2V0QWNjZXNzQ29udHJvbGxlcigpLmF1dGhlbnRpY2F0ZShyZXF1ZXN0KSkgew0KLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBdXRoZW50aWNhdGlvbiBzdWNjZXNzZnVsLiIpOw0KLSAgICAgICAgICAgIHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQuIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9EZWxlZ2F0aW5nQXV0aG9yaXplckFjdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL0RlbGVnYXRpbmdBdXRob3JpemVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDU1NTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL0RlbGVnYXRpbmdBdXRob3JpemVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnBvb2wuUG9vbGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZWRpcmVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogQXV0aG9yaXplckFjdGlvbiB0aGF0IGRlbGVnYXRlcyB0aGUgYXV0aG9yaXppbmcgdG8gYW4gQWNjZXNzQ29udHJvbGxlci4KLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdBdXRob3JpemVyQWN0aW9uIGV4dGVuZHMgQWNjZXNzQ29udHJvbEFjdGlvbiBpbXBsZW1lbnRzIFBvb2xhYmxlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uYWN0aW5nLkFjdGlvbiNhY3Qob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVkaXJlY3Rvciwgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXIsIGphdmEudXRpbC5NYXAsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnMpCi0gICAgICovCi0gICAgcHVibGljIE1hcCBhY3QoCi0gICAgICAgIFJlZGlyZWN0b3IgcmVkaXJlY3RvciwKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsCi0gICAgICAgIE1hcCBvYmplY3RNb2RlbCwKLSAgICAgICAgU3RyaW5nIHNyYywKLSAgICAgICAgUGFyYW1ldGVycyBwYXJhbWV0ZXJzKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICByZXR1cm4gc3VwZXIuYWN0KHJlZGlyZWN0b3IsIHJlc29sdmVyLCBvYmplY3RNb2RlbCwgc3JjLCBwYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3RpbmcuQWNjZXNzQ29udHJvbEFjdGlvbiNkb0FjdChvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZWRpcmVjdG9yLCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlciwgamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVycykKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwIGRvQWN0KAotICAgICAgICBSZWRpcmVjdG9yIHJlZGlyZWN0b3IsCi0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLAotICAgICAgICBNYXAgb2JqZWN0TW9kZWwsCi0gICAgICAgIFN0cmluZyBzb3VyY2UsCi0gICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIAotICAgICAgICBzZXRIaXN0b3J5KHJlcXVlc3QpOwotCi0gICAgICAgIGJvb2xlYW4gYXV0aG9yaXplZCA9IGdldEFjY2Vzc0NvbnRyb2xsZXIoKS5hdXRob3JpemUocmVxdWVzdCk7Ci0KLSAgICAgICAgTWFwIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChhdXRob3JpemVkKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxjb2RlPkhJU1RPUlk8L2NvZGU+IE5hbWUgb2YgdGhlIHNlc3Npb24gYXR0cmlidXRlIHRoYXQgaG9sZHMgdGhlIGhpc3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISVNUT1JZID0KLSAgICAgICAgRGVsZWdhdGluZ0F1dGhvcml6ZXJBY3Rpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuSGlzdG9yeSI7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBjdXJyZW50IFVSTCB0byB0aGUgaGlzdG9yeS4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRIaXN0b3J5KFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7Ci0KLSAgICAgICAgU3RhY2sgaGlzdG9yeSA9IChTdGFjaykgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoSElTVE9SWSk7Ci0KLSAgICAgICAgaWYgKGhpc3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgaGlzdG9yeSA9IG5ldyBTdGFjaygxMCk7Ci0gICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShISVNUT1JZLCBoaXN0b3J5KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICBTdHJpbmcgY29udGV4dCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoY29udGV4dC5sZW5ndGgoKSk7Ci0KLSAgICAgICAgaGlzdG9yeS5wdXNoKHVybCk7Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvU3NsUmVkaXJlY3RBY3Rpb24uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9Tc2xSZWRpcmVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQ1Nzk3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9Tc2xSZWRpcmVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uYWN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5hY3RpbmcuQ29uZmlndXJhYmxlU2VydmljZWFibGVBY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVkaXJlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rUmV3cml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5PdXRnb2luZ0xpbmtSZXdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiBSZXR1cm5zIGEgbWFwIGlmIHRoZSBjdXJyZW50IHJlcXVlc3QgbmVlZHMgYSByZWRpcmVjdCB0byB0aGUgPGNvZGU+aHR0cHM6Ly88L2NvZGU+IHByb3RvY29sLgotICogVGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgcG9saWN5IHJlcXVpcmVzIFNTTCBwcm90ZWN0aW9uIGFuZCB0aGUgY3VycmVudCByZXF1ZXN0IGlzIG5vdCBzZWN1cmUuIFRoZQotICogbWFwIGNvbnRhaW5zIHRoZSByZWRpcmVjdCBVUkkgYXMgdmFsdWUgZm9yIHRoZSBrZXkgPGVtPnJlZGlyZWN0VXJpPC9lbT4uIE90aGVyd2lzZSwKLSAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotICovCi1wdWJsaWMgY2xhc3MgU3NsUmVkaXJlY3RBY3Rpb24gZXh0ZW5kcyBDb25maWd1cmFibGVTZXJ2aWNlYWJsZUFjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUga2V5IHRvIG9idGFpbiB0aGUgcmVkaXJlY3QgVVJJIGZyb20gdGhlIHJldHVybmVkIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVESVJFQ1RfVVJJID0gInJlZGlyZWN0VXJpIjsKLQotICAgIHB1YmxpYyBNYXAgYWN0KFJlZGlyZWN0b3IgcmVkaXJlY3RvciwgU291cmNlUmVzb2x2ZXIgc291cmNlUmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwKLSAgICAgICAgICAgIFN0cmluZyBzb3VyY2UsIFBhcmFtZXRlcnMgcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlclJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlciBhY2Nlc3NDb250cm9sbGVyID0gbnVsbDsKLQotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcmVxdWVzdC5pc1NlY3VyZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuUk9MRQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiU2VsZWN0b3IiKTsKLSAgICAKLSAgICAgICAgICAgICAgICByZXNvbHZlciA9IChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIpIHNlbGVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5ERUZBVUxUX1JFU09MVkVSKTsKLSAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgYWNjZXNzQ29udHJvbGxlciA9IHJlc29sdmVyLnJlc29sdmVBY2Nlc3NDb250cm9sbGVyKHVybCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBQb2xpY3lNYW5hZ2VyIHBvbGljeU1hbmFnZXIgPSBhY2Nlc3NDb250cm9sbGVyLmdldFBvbGljeU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IHBvbGljeU1hbmFnZXIuZ2V0UG9saWN5KGFjY2Vzc0NvbnRyb2xsZXIuZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb2xpY3kuaXNTU0xQcm90ZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbih0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgTGlua1Jld3JpdGVyIHJld3JpdGVyID0gbmV3IE91dGdvaW5nTGlua1Jld3JpdGVyKHRoaXMubWFuYWdlciwgc2Vzc2lvbiwgdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNzbFVyaSA9IHJld3JpdGVyLnJld3JpdGUodXJsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoS0VZX1JFRElSRUNUX1VSSSwgc3NsVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKGFjY2Vzc0NvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvQWNjZXNzQ29udHJvbE1vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0FjY2Vzc0NvbnRyb2xNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5NTM1MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvQWNjZXNzQ29udHJvbE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5BYnN0cmFjdElucHV0TW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlclJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5NYWNoaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiA8cD4KLSAqIElucHV0IG1vZHVsZSBmb3IgYWNjZXNzIGNvbnRyb2wgYXR0cmlidXRlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogQXR0cmlidXRlczoKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPnVzZXItaWQ8L2NvZGU+PC9zdHJvbmc+IC0gdGhlIElEIG9mIHRoZSBjdXJyZW50bHkgbG9nZ2VkLWluIHVzZXI8L2xpPgotICogPGxpPjxzdHJvbmc+PGNvZGU+dXNlci1uYW1lPC9jb2RlPjwvc3Ryb25nPiAtIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBsb2dnZWQtaW4gdXNlcjwvbGk+Ci0gKiA8bGk+PHN0cm9uZz48Y29kZT51c2VyLW5hbWU6e3VzZXItaWR9PC9jb2RlPjwvc3Ryb25nPiAtIHRoZSBmdWxsIG5hbWUgb2YgYSBzcGVjaWZpYyB1c2VyPC9saT4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPnVzZXItZW1haWw8L2NvZGU+PC9zdHJvbmc+IC0gdGhlIGUtbWFpbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50bHkgbG9nZ2VkLWluIHVzZXI8L2xpPgotICogPGxpPjxzdHJvbmc+PGNvZGU+dXNlci1lbWFpbDp7dXNlci1pZH08L2NvZGU+PC9zdHJvbmc+IC0gdGhlIGUtbWFpbCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgdXNlcjwvbGk+Ci0gKiA8bGk+PHN0cm9uZz48Y29kZT5pcC1hZGRyZXNzPC9jb2RlPjwvc3Ryb25nPiAtIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgbWFjaGluZTwvbGk+Ci0gKiA8bGk+PHN0cm9uZz48Y29kZT5yb2xlLWlkczwvY29kZT48L3N0cm9uZz4gLSB0aGUgcm9sZSBJRHMgd2hpY2ggYXJlIGdyYW50ZWQgdG8gdGhlIGN1cnJlbnQgaWRlbnRpdHk8L2xpPgotICogPGxpPjxzdHJvbmc+PGNvZGU+dXNlci1tYW5hZ2VyPC9jb2RlPjwvc3Ryb25nPiAtIHRoZSB1c2VyIG1hbmFnZXIgb2JqZWN0PC9saT4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPmdyb3VwLW1hbmFnZXI8L2NvZGU+PC9zdHJvbmc+IC0gdGhlIGdyb3VwIG1hbmFnZXIgb2JqZWN0PC9saT4KLSAqIDxsaT48c3Ryb25nPjxjb2RlPmlwcmFuZ2UtbWFuYWdlcjwvY29kZT48L3N0cm9uZz4gLSB0aGUgSVAgcmFuZ2UgbWFuYWdlciBvYmplY3Q8L2xpPgotICogPGxpPjxzdHJvbmc+PGNvZGU+cm9sZS1tYW5hZ2VyPC9jb2RlPjwvc3Ryb25nPiAtIHRoZSByb2xlIG1hbmFnZXIgb2JqZWN0PC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdElucHV0TW9kdWxlIGltcGxlbWVudHMgU2VydmljZWFibGUgewotCi0gICAgLyoqCi0gICAgICogPGNvZGU+VVNFUl9JRDwvY29kZT4gVGhlIHVzZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0lEID0gInVzZXItaWQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlVTRVJfTkFNRTwvY29kZT4gVGhlIHVzZXIgbmFtZSwgb3B0aW9uYWw6IHByb3ZpZGUgdGhlIHVzZXIgSUQgYWZ0ZXIgYSBjb2xvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfTkFNRSA9ICJ1c2VyLW5hbWUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlVTRVJfRU1BSUw8L2NvZGU+IFRoZSB1c2VyIGVtYWlsLCBvcHRpb25hbDogcHJvdmlkZSB0aGUgdXNlciBJRCBhZnRlciBhIGNvbG9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9FTUFJTCA9ICJ1c2VyLWVtYWlsIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5JUF9BRERSRVNTPC9jb2RlPiBUaGUgSVAgYWRkcmVzcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElQX0FERFJFU1MgPSAiaXAtYWRkcmVzcyI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+Uk9MRV9JRFM8L2NvZGU+IFRoZSByb2xlIGlkcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfSURTID0gInJvbGUtaWRzIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5VU0VSX01BTkFHRVI8L2NvZGU+IFRoZSB1c2VyIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX01BTkFHRVIgPSAidXNlci1tYW5hZ2VyIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5HUk9VUF9NQU5BR0VSPC9jb2RlPiBUaGUgZ3JvdXAgbWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX01BTkFHRVIgPSAiZ3JvdXAtbWFuYWdlciI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+Uk9MRV9NQU5BR0VSPC9jb2RlPiBUaGUgcm9sZSBtYW5hZ2VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9NQU5BR0VSID0gInJvbGUtbWFuYWdlciI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+SVBfUkFOR0VfTUFOQUdFUjwvY29kZT4gVGhlIElQIHJhbmdlIG1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJUF9SQU5HRV9NQU5BR0VSID0gImlwcmFuZ2UtbWFuYWdlciI7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIFNTTCBwcm90ZWN0ZWQgKHRydWV8ZmFsc2UpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTCA9ICJzc2wiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWVzIG9mIHRoZSBBY2Nlc3NDb250cm9sTW9kdWxlIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBBUkFNRVRFUl9OQU1FUyA9IHsgSVBfQUREUkVTUywgVVNFUl9JRCwgVVNFUl9OQU1FLCBVU0VSX0VNQUlMLCBST0xFX0lEUywKLSAgICAgICAgICAgIFVTRVJfTUFOQUdFUiwgR1JPVVBfTUFOQUdFUiwgUk9MRV9NQU5BR0VSLCBJUF9SQU5HRV9NQU5BR0VSLCBTU0wgfTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotCi0gICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBhdHRyaWJ1dGUuc3BsaXQoIjoiLCAyKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJhbWV0ZXJzWzBdOwotCi0gICAgICAgIGlmICghQXJyYXlzLmFzTGlzdChQQVJBTUVURVJfTkFNRVMpLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVGhlIGF0dHJpYnV0ZSBbIiArIG5hbWUgKyAiXSBpcyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWRlbnRpdHkgPSAoSWRlbnRpdHkpIHNlc3Npb24uZ2V0QXR0cmlidXRlKElkZW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgVXNlciB1c2VyID0gZ2V0VXNlcihyZXF1ZXN0LCBwYXJhbWV0ZXJzLCBpZGVudGl0eSk7Ci0KLSAgICAgICAgaWYgKHVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFVTRVJfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHVzZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhVU0VSX0VNQUlMKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gdXNlci5nZXRFbWFpbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlkZW50aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhVU0VSX0lEKSkgewotICAgICAgICAgICAgICAgIFVzZXIgY3VycmVudFVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRVc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjdXJyZW50VXNlci5nZXRJZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoSVBfQUREUkVTUykpIHsKLSAgICAgICAgICAgICAgICBNYWNoaW5lIG1hY2hpbmUgPSBpZGVudGl0eS5nZXRNYWNoaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hY2hpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hY2hpbmUuZ2V0SXAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFJPTEVfSURTKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFJvbGVbXSByb2xlcyA9IFBvbGljeVV0aWwuZ2V0Um9sZXMocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQocm9sZXNbaV0uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIk9idGFpbmluZyB2YWx1ZSBmb3IgYXR0cmlidXRlIFsiICsgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoVVNFUl9NQU5BR0VSKSB8fCBuYW1lLmVxdWFscyhHUk9VUF9NQU5BR0VSKSB8fCBuYW1lLmVxdWFscyhST0xFX01BTkFHRVIpCi0gICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHMoSVBfUkFOR0VfTUFOQUdFUikpIHsKLSAgICAgICAgICAgIHZhbHVlID0gZ2V0SXRlbU1hbmFnZXIocmVxdWVzdCwgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChuYW1lLmVxdWFscyhTU0wpKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlclJlc29sdmVyIGFjUmVzb2x2ZXIgPSBudWxsOwotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlciBhY2Nlc3NDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5ST0xFCi0gICAgICAgICAgICAgICAgICAgICAgICArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgICAgIGFjUmVzb2x2ZXIKLSAgICAgICAgICAgICAgICAgICAgPSAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyKSBzZWxlY3Rvci5zZWxlY3QoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLkRFRkFVTFRfUkVTT0xWRVIpOwotICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICBhY2Nlc3NDb250cm9sbGVyID0gYWNSZXNvbHZlci5yZXNvbHZlQWNjZXNzQ29udHJvbGxlcih1cmwpOwotICAgICAgICAgICAgICAgIEFjY3JlZGl0YWJsZU1hbmFnZXIgYWNjcmVkaXRhYmxlTWFuYWdlciA9IGFjY2Vzc0NvbnRyb2xsZXIuZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpOwotICAgICAgICAgICAgICAgIFBvbGljeU1hbmFnZXIgcG9saWN5TWFuYWdlciA9IGFjY2Vzc0NvbnRyb2xsZXIuZ2V0UG9saWN5TWFuYWdlcigpOwotICAgIAotICAgICAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBwb2xpY3lNYW5hZ2VyLmdldFBvbGljeShhY2NyZWRpdGFibGVNYW5hZ2VyLCB1cmwpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbi50b1N0cmluZyhwb2xpY3kuaXNTU0xQcm90ZWN0ZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiUmVzb2x2aW5nIGF0dHJpYnV0ZSBbIiArIG5hbWUgKyAiXSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjUmVzb2x2ZXIucmVsZWFzZShhY2Nlc3NDb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2UoYWNSZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIHNwZWNpZmllZCB3aXRoIHBhcmFtZXRlclsxXSwgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIuCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBsb2dnZWQgaW4gaWRlbnRpdHkuCi0gICAgICogQHJldHVybiBBIHVzZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdXNlciBpcyBzcGVjaWZpZWQgb3IgbG9nZ2VkIGluLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVzZXIgZ2V0VXNlcihSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZ1tdIHBhcmFtZXRlcnMsIElkZW50aXR5IGlkZW50aXR5KQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBVc2VyIHVzZXIgPSBudWxsOwotICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgaWYgKGlkZW50aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VyID0gaWRlbnRpdHkuZ2V0VXNlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHVzZXJJZCA9IHBhcmFtZXRlcnNbMV07Ci0gICAgICAgICAgICBpZiAoIXVzZXJJZC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSAoVXNlck1hbmFnZXIpIGdldEl0ZW1NYW5hZ2VyKHJlcXVlc3QsIFVTRVJfTUFOQUdFUik7Ci0gICAgICAgICAgICAgICAgdXNlciA9IHVzZXJNYW5hZ2VyLmdldFVzZXIodXNlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZSNnZXRBdHRyaWJ1dGVOYW1lcyhvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLAotICAgICAqICAgICAgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QXR0cmlidXRlTmFtZXMoQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChQQVJBTUVURVJfTkFNRVMpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlVmFsdWVzKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBdHRyaWJ1dGVWYWx1ZXMoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IHsgZ2V0QXR0cmlidXRlKG5hbWUsIG1vZGVDb25mLCBvYmplY3RNb2RlbCkgfTsKLQotICAgICAgICByZXR1cm4gb2JqZWN0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIG1hbmFnZXIgZm9yIGEgY2VydGFpbiBuYW1lLgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtYW5hZ2VyICh7QGxpbmsgI1VTRVJfTUFOQUdFUn0sIHtAbGluayAjUk9MRV9NQU5BR0VSfSwKLSAgICAgKiAgICAgICAgICAgIHtAbGluayAjR1JPVVBfTUFOQUdFUn0sIG9yIHtAbGluayAjSVBfUkFOR0VfTUFOQUdFUn0KLSAgICAgKiBAcmV0dXJuIEFuIGl0ZW0gbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSXRlbU1hbmFnZXIgZ2V0SXRlbU1hbmFnZXIoUmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgbmFtZSkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlciBhY2Nlc3NDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlclJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLlJPTEUKLSAgICAgICAgICAgICAgICAgICAgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcikgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuREVGQVVMVF9SRVNPTFZFUik7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGV4dCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0ID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdXJsID0gcmVxdWVzdFVSSS5zdWJzdHJpbmcoY29udGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBhY2Nlc3NDb250cm9sbGVyID0gcmVzb2x2ZXIucmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIodXJsKTsKLQotICAgICAgICAgICAgQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyID0gYWNjZXNzQ29udHJvbGxlci5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCk7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhVU0VSX01BTkFHRVIpKSB7Ci0gICAgICAgICAgICAgICAgaXRlbU1hbmFnZXIgPSBhY2NyZWRpdGFibGVNYW5hZ2VyLmdldFVzZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEdST1VQX01BTkFHRVIpKSB7Ci0gICAgICAgICAgICAgICAgaXRlbU1hbmFnZXIgPSBhY2NyZWRpdGFibGVNYW5hZ2VyLmdldEdyb3VwTWFuYWdlcigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhST0xFX01BTkFHRVIpKSB7Ci0gICAgICAgICAgICAgICAgaXRlbU1hbmFnZXIgPSBhY2NyZWRpdGFibGVNYW5hZ2VyLmdldFJvbGVNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKElQX1JBTkdFX01BTkFHRVIpKSB7Ci0gICAgICAgICAgICAgICAgaXRlbU1hbmFnZXIgPSBhY2NyZWRpdGFibGVNYW5hZ2VyLmdldElQUmFuZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJPYnRhaW5pbmcgaXRlbSBtYW5hZ2VyIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2UoYWNjZXNzQ29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpdGVtTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBfbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBfbWFuYWdlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlR3JvdXBUZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZUdyb3VwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzI1YzdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXBhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0IGZvciBmaWxlLWJhc2VkIGdyb3VwcwotICovCi1wdWJsaWMgY2xhc3MgRmlsZUdyb3VwVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgLyoqCi0gICAgICogPGNvZGU+R1JPVVBfSUQ8L2NvZGU+IFRoZSBncm91cCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0lEID0gInRlc3RHcm91cCI7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSB0ZXN0Ci0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIEFDIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciB3aXRoIHRoZSBjb25maWd1cmF0aW9uIG9jY3VycwotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RGaWxlR3JvdXAoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIEZpbGVHcm91cCBncm91cCA9IGdldEdyb3VwKCk7Ci0gICAgICAgIGdyb3VwLnNhdmUoKTsKLQotICAgICAgICBGaWxlIGdyb3VwRmlsZSA9IG5ldyBGaWxlKGdldEFjY3JlZGl0YWJsZXNEaXJlY3RvcnkoKSwgR1JPVVBfSUQgKyBGaWxlR3JvdXBNYW5hZ2VyLlNVRkZJWCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ3JvdXBGaWxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShncm91cEZpbGUuZXhpc3RzKCkpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uQnVpbGRlcigpLmJ1aWxkRnJvbUZpbGUoZ3JvdXBGaWxlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWcpOwotCi0gICAgICAgIEZpbGVHcm91cCBuZXdHcm91cCA9IG51bGw7Ci0gICAgICAgIG5ld0dyb3VwID0gbmV3IEZpbGVHcm91cChnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0R3JvdXBNYW5hZ2VyKCksIGdldExvZ2dlcigpKTsKLSAgICAgICAgbmV3R3JvdXAuc2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeShnZXRBY2NyZWRpdGFibGVzRGlyZWN0b3J5KCkpOwotICAgICAgICBuZXdHcm91cC5jb25maWd1cmUoY29uZmlnKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXdHcm91cCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdHcm91cC5nZXRJZCgpLmVxdWFscyhHUk9VUF9JRCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBnZXRHcm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gYSA8Y29kZT5GaWxlR3JvdXA8L2NvZGU+Ci0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGVHcm91cCBnZXRHcm91cCgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBjb25maWd1cmF0aW9uRGlyZWN0b3J5ID0gZ2V0QWNjcmVkaXRhYmxlc0RpcmVjdG9yeSgpOwotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJDb25maWd1cmF0aW9uIGRpcmVjdG9yeTogIiArIGNvbmZpZ3VyYXRpb25EaXJlY3RvcnkpOwotICAgICAgICBGaWxlR3JvdXAgZ3JvdXAgPSBuZXcgRmlsZUdyb3VwKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRHcm91cE1hbmFnZXIoKSwgZ2V0TG9nZ2VyKCksCi0gICAgICAgICAgICAgICAgR1JPVVBfSUQpOwotICAgICAgICByZXR1cm4gZ3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHJlbW92ZUFsbE1lbWJlcnMoKSBtZXRob2QuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE1lbWJlcnMoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb3VwIGdyb3VwID0gZ2V0R3JvdXAoKTsKLSAgICAgICAgR3JvdXBhYmxlIG1lbWJlcnNbXSA9IGdyb3VwLmdldE1lbWJlcnMoKTsKLSAgICAgICAgZ3JvdXAucmVtb3ZlQWxsTWVtYmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGdyb3VwLmNvbnRhaW5zKG1lbWJlcnNbaV0pKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVSb2xlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9maWxlL0ZpbGVSb2xlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmE3ZjA3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlUm9sZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCi0gKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICogIAotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotCi0vKioKLSAqIEZpbGUgcm9sZSB0ZXN0LgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEZpbGVSb2xlVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotICAgIAotICAgIC8qKgotICAgICAqIERPQ1VNRU5UIE1FIQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBET0NVTUVOVCBNRSEKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0RmlsZVJvbGUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gInRlc3QiOwotICAgICAgICBGaWxlIGNvbmZpZ0RpciA9IGdldEFjY3JlZGl0YWJsZXNEaXJlY3RvcnkoKTsKLSAgICAgICAgRmlsZVJvbGUgcm9sZSA9IG5ldyBGaWxlUm9sZShnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0Um9sZU1hbmFnZXIoKSwgZ2V0TG9nZ2VyKCksIG5hbWUpOwotICAgICAgICByb2xlLnNhdmUoKTsKLQotICAgICAgICBGaWxlIHBhdGggPSBudWxsOwotICAgICAgICBwYXRoID0gRmlsZVJvbGVNYW5hZ2VyLmluc3RhbmNlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgY29uZmlnRGlyLCBnZXRMb2dnZXIoKSkKLSAgICAgICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpOwotCi0gICAgICAgIEZpbGUgcm9sZUZpbGUgPSBuZXcgRmlsZShwYXRoLCBuYW1lICsgRmlsZVJvbGVNYW5hZ2VyLlNVRkZJWCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocm9sZUZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKHJvbGVGaWxlLmV4aXN0cygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBET0NVTUVOVCBNRSEKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gRE9DVU1FTlQgTUUhCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdFNhdmUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgY29uZmlnRGlyID0gZ2V0QWNjcmVkaXRhYmxlc0RpcmVjdG9yeSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJ0ZXN0IjsKLSAgICAgICAgRmlsZVJvbGUgcm9sZSA9IG5ldyBGaWxlUm9sZShnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0Um9sZU1hbmFnZXIoKSwgZ2V0TG9nZ2VyKCksIG5hbWUpOwotICAgICAgICByb2xlLnNhdmUoKTsKLQotICAgICAgICBGaWxlIHBhdGggPSBudWxsOwotICAgICAgICBwYXRoID0gRmlsZVJvbGVNYW5hZ2VyLmluc3RhbmNlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgY29uZmlnRGlyLCBnZXRMb2dnZXIoKSkKLSAgICAgICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvbkRpcmVjdG9yeSgpOwotCi0gICAgICAgIEZpbGUgcm9sZUZpbGUgPSBuZXcgRmlsZShwYXRoLCBuYW1lICsgRmlsZVJvbGVNYW5hZ2VyLlNVRkZJWCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocm9sZUZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKHJvbGVGaWxlLmV4aXN0cygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBET0NVTUVOVCBNRSEKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEdldElkKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaWQgPSAidGVzdCI7Ci0gICAgICAgIEZpbGVSb2xlIHJvbGUgPSBuZXcgRmlsZVJvbGUoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldFJvbGVNYW5hZ2VyKCksIGdldExvZ2dlcigpLCBpZCk7Ci0gICAgICAgIGFzc2VydFRydWUocm9sZS5nZXRJZCgpLmVxdWFscyhpZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIGJvb2xlYW4gZXF1YWxzKE9iamVjdCkKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAidGVzdCI7Ci0gICAgICAgIEZpbGVSb2xlIHJvbGUxID0gbmV3IEZpbGVSb2xlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRSb2xlTWFuYWdlcigpLCBnZXRMb2dnZXIoKSwgbmFtZSk7Ci0gICAgICAgIEZpbGVSb2xlIHJvbGUyID0gbmV3IEZpbGVSb2xlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRSb2xlTWFuYWdlcigpLCBnZXRMb2dnZXIoKSwgbmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlMSwgcm9sZTIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlVXNlclRlc3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvZmlsZS9GaWxlVXNlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2NzRjMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ZpbGUvRmlsZVVzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotCi0vKioKLSAqIEZpbGUgdXNlciB0ZXN0LgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXNlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLSAgICBwcml2YXRlIEhhc2hNYXAgZ3JvdXBzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIEdyb3VwcwotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgdGhlIGdyb3VwcwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyBNYXAgZ2V0R3JvdXBzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ncm91cHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBzYXZlIGEgdXNlcgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyTmFtZSBUaGUgdXNlciBuYW1lCi0gICAgICogQHBhcmFtIGZ1bGxOYW1lIFRoZSBmdWxsIG5hbWUKLSAgICAgKiBAcGFyYW0gZW1haWwgVGhlIGVtYWlsCi0gICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZAotICAgICAqIAotICAgICAqIEByZXR1cm4gYSA8Y29kZT5GaWxlVXNlcjwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIEZpbGVVc2VyIGNyZWF0ZUFuZFNhdmVVc2VyKFN0cmluZyB1c2VyTmFtZSwgU3RyaW5nIGZ1bGxOYW1lLCBTdHJpbmcgZW1haWwsCi0gICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZWRpdG9yR3JvdXBOYW1lID0gImVkaXRvckdyb3VwIjsKLSAgICAgICAgU3RyaW5nIGFkbWluR3JvdXBOYW1lID0gImFkbWluR3JvdXAiOwotCi0gICAgICAgIEZpbGVHcm91cCBlZGl0b3JHcm91cCA9IG5ldyBGaWxlR3JvdXAoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldEdyb3VwTWFuYWdlcigpLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLCBlZGl0b3JHcm91cE5hbWUpOwotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcoZWRpdG9yR3JvdXAsIGdldExvZ2dlcigpKTsKLSAgICAgICAgRmlsZUdyb3VwIGFkbWluR3JvdXAgPSBuZXcgRmlsZUdyb3VwKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRHcm91cE1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSwgYWRtaW5Hcm91cE5hbWUpOwotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcoYWRtaW5Hcm91cCwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB0aGlzLmdyb3Vwcy5wdXQoZWRpdG9yR3JvdXBOYW1lLCBlZGl0b3JHcm91cCk7Ci0gICAgICAgIHRoaXMuZ3JvdXBzLnB1dChhZG1pbkdyb3VwTmFtZSwgYWRtaW5Hcm91cCk7Ci0KLSAgICAgICAgRmlsZVVzZXIgdXNlciA9IG5ldyBGaWxlVXNlcihnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0VXNlck1hbmFnZXIoKSwgZ2V0TG9nZ2VyKCksCi0gICAgICAgICAgICAgICAgdXNlck5hbWUsIGZ1bGxOYW1lLCBlbWFpbCwgcGFzc3dvcmQpOwotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodXNlciwgZ2V0TG9nZ2VyKCkpOwotCi0gICAgICAgIGVkaXRvckdyb3VwLmFkZCh1c2VyKTsKLSAgICAgICAgYWRtaW5Hcm91cC5hZGQodXNlcik7Ci0KLSAgICAgICAgZWRpdG9yR3JvdXAuc2F2ZSgpOwotICAgICAgICBhZG1pbkdyb3VwLnNhdmUoKTsKLSAgICAgICAgdXNlci5zYXZlKCk7Ci0KLSAgICAgICAgRmlsZVVzZXJNYW5hZ2VyIF9tYW5hZ2VyID0gZ2V0VXNlck1hbmFnZXIoKTsKLSAgICAgICAgX21hbmFnZXIuYWRkKHVzZXIpOwotCi0gICAgICAgIHJldHVybiB1c2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgdXNlciBtYW5hZ2VyLgotICAgICAqIEByZXR1cm4gQSBmaWxlIHVzZXIgbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlVXNlck1hbmFnZXIgZ2V0VXNlck1hbmFnZXIoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVzZXJUeXBlW10gdXNlclR5cGVzID0geyBGaWxlQWNjcmVkaXRhYmxlTWFuYWdlci5nZXREZWZhdWx0VXNlclR5cGUoKSB9OwotICAgICAgICBGaWxlVXNlck1hbmFnZXIgX21hbmFnZXIgPSBGaWxlVXNlck1hbmFnZXIuaW5zdGFuY2UoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLAotICAgICAgICAgICAgICAgIGdldEFjY3JlZGl0YWJsZXNEaXJlY3RvcnkoKSwgdXNlclR5cGVzLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIHJldHVybiBfbWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIGEgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlck5hbWUgdGhlIG5hbWUgb2YgdGhlIHVzZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+RmlsZVVzZXI8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyBGaWxlVXNlciBsb2FkVXNlcihTdHJpbmcgdXNlck5hbWUpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVVzZXJNYW5hZ2VyIF9tYW5hZ2VyID0gZ2V0VXNlck1hbmFnZXIoKTsKLSAgICAgICAgcmV0dXJuIChGaWxlVXNlcikgX21hbmFnZXIuZ2V0VXNlcih1c2VyTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBzYXZlCi0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RTYXZlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdXNlck5hbWUgPSAiYWxpY2VUZXN0IjsKLSAgICAgICAgY3JlYXRlQW5kU2F2ZVVzZXIodXNlck5hbWUsICJBbGljZSBXb25kZXJsYW5kIiwgImFsaWNlQHdvbmRlcmxhbmQub3JnIiwgInNlY3JldCIpOwotCi0gICAgICAgIEZpbGUgY29uZmlnRGlyID0gZ2V0QWNjcmVkaXRhYmxlc0RpcmVjdG9yeSgpOwotICAgICAgICBGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZShjb25maWdEaXIsIHVzZXJOYW1lICsgIi5pbWwiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWxGaWxlLmV4aXN0cygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGdldEVtYWlsCi0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RHZXRFbWFpbCgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHVzZXJJRCA9ICJhbGljZVRlc3QiOwotICAgICAgICBTdHJpbmcgZW1haWwgPSAiYWxpY2VAd29uZGVybGFuZC5vcmciOwotICAgICAgICBVc2VyIHVzZXIgPSBjcmVhdGVBbmRTYXZlVXNlcih1c2VySUQsICJBbGljZSBXb25kZXJsYW5kIiwgZW1haWwsICJzZWNyZXQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh1c2VyLmdldEVtYWlsKCkuZXF1YWxzKGVtYWlsKSk7Ci0gICAgICAgIHVzZXIgPSBsb2FkVXNlcih1c2VySUQpOwotICAgICAgICBhc3NlcnRUcnVlKHVzZXIuZ2V0RW1haWwoKS5lcXVhbHMoZW1haWwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGdldE5hbWUKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB1c2VySUQgPSAiYWxpY2VUZXN0IjsKLSAgICAgICAgU3RyaW5nIHVzZXJOYW1lID0gIkFsaWNlIFdvbmRlcmxhbmQiOwotICAgICAgICBGaWxlVXNlciB1c2VyID0gY3JlYXRlQW5kU2F2ZVVzZXIodXNlcklELCB1c2VyTmFtZSwgImFsaWNlQHdvbmRlcmxhbmQub3JnIiwgInNlY3JldCIpOwotICAgICAgICBhc3NlcnRUcnVlKHVzZXIuZ2V0TmFtZSgpLmVxdWFscyh1c2VyTmFtZSkpOwotICAgICAgICB1c2VyID0gbG9hZFVzZXIodXNlcklEKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh1c2VyLmdldE5hbWUoKS5lcXVhbHModXNlck5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGdldEdyb3VwcwotICAgICAqIAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0R2V0R3JvdXBzKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBGaWxlVXNlciB1c2VyID0gY3JlYXRlQW5kU2F2ZVVzZXIoImFsaWNlVGVzdCIsICJBbGljZSBXb25kZXJsYW5kIiwgImFsaWNlQHdvbmRlcmxhbmQub3JnIiwKLSAgICAgICAgICAgICAgICAic2VjcmV0Iik7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0R3JvdXBzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGdyb3VwLmNvbnRhaW5zKHVzZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZ2V0SWQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEdldElkKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaWQgPSAiYWxpY2VUZXN0IjsKLSAgICAgICAgRmlsZVVzZXIgdXNlciA9IGNyZWF0ZUFuZFNhdmVVc2VyKGlkLCAiQWxpY2UgV29uZGVybGFuZCIsICJhbGljZUB3b25kZXJsYW5kLm9yZyIsICJzZWNyZXQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh1c2VyLmdldElkKCkuZXF1YWxzKGlkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBkZWxldGUKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGlkID0gImFsYmVydCI7Ci0gICAgICAgIEZpbGVVc2VyIHVzZXIgPSBjcmVhdGVBbmRTYXZlVXNlcihpZCwgIkFsYmVydCBFaW5zdGVpbiIsICJhbGJlcnRAcGh5c2ljcy5vcmciLCAic2VjcmV0Iik7Ci0gICAgICAgIEZpbGVVc2VyTWFuYWdlciBfbWFuYWdlciA9IGdldFVzZXJNYW5hZ2VyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoX21hbmFnZXIpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoX21hbmFnZXIuZ2V0VXNlcihpZCkpOwotICAgICAgICB1c2VyLmRlbGV0ZSgpOwotICAgICAgICBfbWFuYWdlci5yZW1vdmUodXNlcik7Ci0gICAgICAgIGFzc2VydE51bGwoX21hbmFnZXIuZ2V0VXNlcihpZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgYXV0aGVudGljYXRlCi0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RBdXRoZW50aWNhdGUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9ICJkYWlzeSI7Ci0gICAgICAgIEZpbGVVc2VyIHVzZXIgPSBjcmVhdGVBbmRTYXZlVXNlcigibWlja2V5IiwgIk1pY2tleSBNb3VzZSIsICJtaWNrZXlAbW91c2UuY29tIiwgcGFzc3dvcmQpOwotICAgICAgICBhc3NlcnRUcnVlKHVzZXIuYXV0aGVudGljYXRlKHBhc3N3b3JkKSk7Ci0KLSAgICAgICAgRmlsZVVzZXJNYW5hZ2VyIF9tYW5hZ2VyID0gZ2V0VXNlck1hbmFnZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChfbWFuYWdlcik7Ci0KLSAgICAgICAgVXNlciBsZW55YSA9IF9tYW5hZ2VyLmdldFVzZXIoImxlbnlhIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobGVueWEpOwotICAgICAgICBhc3NlcnRUcnVlKGxlbnlhLmF1dGhlbnRpY2F0ZSgibGV2aSIpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0FjY2Vzc0NvbnRyb2xsZXJUZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWNjZXNzQ29udHJvbGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmNjYzNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvQWNjZXNzQ29udHJvbGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotLyoqCi0gKiBBY2Nlc3MgY29udHJvbGxlciB0ZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sbGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgLyoqCi0gICAgICogVGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2V0QWNjZXNzQ29udHJvbGxlcigpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9BY2NyZWRpdGFibGVNYW5hZ2VyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0FjY3JlZGl0YWJsZU1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZmYxZDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0FjY3JlZGl0YWJsZU1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLQotLyoqCi0gKiBUZXN0IGNsYXNzIGZvciB0aGUgQWNjcmVkaXRhYmxlIE1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIEFjY3JlZGl0YWJsZU1hbmFnZXJUZXN0IGV4dGVuZHMgQWNjZXNzQ29udHJvbGxlclRlc3QgewotCi0gICAgcHJpdmF0ZSBBY2NyZWRpdGFibGVNYW5hZ2VyIGFjY3JlZGl0YWJsZU1hbmFnZXI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElOVCA9ICJmaWxlIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBKVW5pdCBzZXR1cCBtZXRob2QuIExvb2t1cCB0aGUgcmVzb2x2ZXIgcm9sZS4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gIEV4Y2VwdGlvbiAgRGVzY3JpcHRpb24gb2YgRXhjZXB0aW9uCi0gICAgICogQHNpbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgICAgICB0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIgPSBnZXRBY2Nlc3NDb250cm9sbGVyKCkuZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQWNjcmVkaXRhYmxlTWFuYWdlciBpcyBudWxsIiwgdGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdC4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjcmVkaXRhYmxlTWFuYWdlcigpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIuZ2V0VXNlck1hbmFnZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyLmdldEdyb3VwTWFuYWdlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIuZ2V0Um9sZU1hbmFnZXIoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvR3JvdXBNYW5hZ2VyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL0dyb3VwTWFuYWdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmNTFiNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvR3JvdXBNYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlR3JvdXBNYW5hZ2VyOwotCi0vKioKLSAqIEdyb3VwIG1hbmFnZXIgdGVzdC4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cE1hbmFnZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0SW5zdGFuY2UoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVHcm91cE1hbmFnZXIgX21hbmFnZXIgPSBudWxsOwotICAgICAgICBGaWxlIGNvbmZpZ0RpciA9IGdldEFjY3JlZGl0YWJsZXNEaXJlY3RvcnkoKTsKLSAgICAgICAgX21hbmFnZXIgPSBGaWxlR3JvdXBNYW5hZ2VyLmluc3RhbmNlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgY29uZmlnRGlyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoX21hbmFnZXIpOwotCi0gICAgICAgIEZpbGVHcm91cE1hbmFnZXIgYW5vdGhlck1hbmFnZXIgPSBudWxsOwotICAgICAgICBhbm90aGVyTWFuYWdlciA9IEZpbGVHcm91cE1hbmFnZXIuaW5zdGFuY2UoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLCBjb25maWdEaXIsIGdldExvZ2dlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm90aGVyTWFuYWdlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhfbWFuYWdlciwgYW5vdGhlck1hbmFnZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9JZGVudGl0eVRlc3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9JZGVudGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5ZDdhZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvSWRlbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgaWRlbnRpdHkKLSAqLwotcHVibGljIGNsYXNzIElkZW50aXR5VGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgLyoqCi0gICAgICogPGNvZGU+VVNFUl9JRDwvY29kZT4gVGhlIHVzZXIgaWQgdG8gdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfSUQgPSAibGVueWEiOwotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGlkZW50aXR5LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHkoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIElkZW50aXR5IGlkZW50aXR5ID0gbmV3IElkZW50aXR5KGdldExvZ2dlcigpKTsKLSAgICAgICAgVXNlciB1c2VyID0gZ2V0QWNjZXNzQ29udHJvbGxlcigpLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpLmdldFVzZXIoVVNFUl9JRCk7Ci0gICAgICAgIGdldExvZ2dlcigpLmluZm8oIkFkZGluZyB1c2VyIHRvIGlkZW50aXR5OiBbIiArIHVzZXIgKyAiXSIpOwotICAgICAgICBpZGVudGl0eS5hZGRJZGVudGlmaWFibGUodXNlcik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRTYW1lKHVzZXIsIGlkZW50aXR5LmdldFVzZXIoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIHtAbGluayBJZGVudGl0eSNiZWxvbmdzVG8ob3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyKX0gbWV0aG9kLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmVsb25nc1RvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFjY3JlZGl0YWJsZU1hbmFnZXIgdGVzdE1nciA9IGdldEFjY2Vzc0NvbnRyb2xsZXIoZ2V0U2Vzc2lvbigpLCAidGVzdCIpLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKTsKLSAgICAgICAgQWNjcmVkaXRhYmxlTWFuYWdlciBkZWZhdWx0TWdyID0gZ2V0QWNjZXNzQ29udHJvbGxlcihnZXRTZXNzaW9uKCksICJkZWZhdWx0IikuZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHVzZXJJZCA9ICJsZW55YSI7Ci0gICAgICAgIFVzZXIgdGVzdFVzZXIgPSB0ZXN0TWdyLmdldFVzZXJNYW5hZ2VyKCkuZ2V0VXNlcih1c2VySWQpOwotICAgICAgICBVc2VyIGRlZmF1bHRVc2VyID0gZGVmYXVsdE1nci5nZXRVc2VyTWFuYWdlcigpLmdldFVzZXIodXNlcklkKTsKLSAgICAgICAgCi0gICAgICAgIElkZW50aXR5IHRlc3RJZGVudGl0eSA9IG5ldyBJZGVudGl0eShnZXRMb2dnZXIoKSk7Ci0gICAgICAgIHRlc3RJZGVudGl0eS5hZGRJZGVudGlmaWFibGUodGVzdFVzZXIpOwotICAgICAgICAKLSAgICAgICAgSWRlbnRpdHkgZGVmYXVsdElkZW50aXR5ID0gbmV3IElkZW50aXR5KGdldExvZ2dlcigpKTsKLSAgICAgICAgZGVmYXVsdElkZW50aXR5LmFkZElkZW50aWZpYWJsZShkZWZhdWx0VXNlcik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKHRlc3RJZGVudGl0eS5iZWxvbmdzVG8odGVzdE1ncikpOwotICAgICAgICBhc3NlcnRUcnVlKGRlZmF1bHRJZGVudGl0eS5iZWxvbmdzVG8oZGVmYXVsdE1ncikpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0SWRlbnRpdHkuYmVsb25nc1RvKGRlZmF1bHRNZ3IpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkZWZhdWx0SWRlbnRpdHkuYmVsb25nc1RvKHRlc3RNZ3IpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Qb2xpY3lNYW5hZ2VyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1BvbGljeU1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWJiMzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1BvbGljeU1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUG9saWN5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUG9saWN5VXRpbDsKLQotLyoqCi0gKiBUZXN0IGZvciB0aGUgUG9saWN5IE1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIFBvbGljeU1hbmFnZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBVUkxTID0geyAiL2RlZmF1bHQvYXV0aG9yaW5nL2luZGV4Lmh0bWwiIH07Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdC4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9saWN5TWFuYWdlcigpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIERlZmF1bHRBY2Nlc3NDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBnZXRBY2Nlc3NDb250cm9sbGVyKCk7IAotICAgICAgICBQb2xpY3lNYW5hZ2VyIHBvbGljeU1hbmFnZXIgPSBjb250cm9sbGVyLmdldFBvbGljeU1hbmFnZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwb2xpY3lNYW5hZ2VyKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVVJMUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IHBvbGljeU1hbmFnZXIuZ2V0UG9saWN5KGNvbnRyb2xsZXIuZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLCBVUkxTW2ldKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocG9saWN5KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUm9sZVtdIHJvbGVzID0gcG9saWN5TWFuYWdlci5nZXRHcmFudGVkUm9sZXMoY29udHJvbGxlci5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCksIGdldElkZW50aXR5KCksIFVSTFNbaV0pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyb2xlcy5sZW5ndGggPiAwKTsKLQotICAgICAgICAgICAgVXNlcltdIHVzZXJzID0gUG9saWN5VXRpbC5nZXRVc2Vyc1dpdGhSb2xlKGdldE1hbmFnZXIoKSwgVVJMU1tpXSwgInJldmlldyIsIGdldExvZ2dlcigpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSBjb250cm9sbGVyLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpOwotICAgICAgICAgICAgVXNlciBsZW55YSA9IHVzZXJNYW5hZ2VyLmdldFVzZXIoImxlbnlhIik7Ci0gICAgICAgICAgICBVc2VyIGFsaWNlID0gdXNlck1hbmFnZXIuZ2V0VXNlcigiYWxpY2UiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCB1c2Vyc0xpc3QgPSBBcnJheXMuYXNMaXN0KHVzZXJzKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHVzZXJzTGlzdC5jb250YWlucyhsZW55YSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh1c2Vyc0xpc3QuY29udGFpbnMoYWxpY2UpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1BvbGljeVRlc3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Qb2xpY3lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODlhOTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1BvbGljeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5DcmVkZW50aWFsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSW5oZXJpdGluZ1BvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIFBvbGljeSBUZXN0Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBvbGljeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAiL3Rlc3QvYXV0aG9yaW5nL2luZGV4Lmh0bWwiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9VUkwgPSAiL3Rlc3QvYXV0aG9yaW5nL3R1dG9yaWFsLmh0bWwiOwotCi0gICAgLyoqCi0gICAgICogQSB0ZXN0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFBvbGljeSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uLCBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIFN0cmluZyB1cmwgPSAiLyIgKyBwdWIuZ2V0SWQoKSArIFVSTDsKLSAgICAgICAgUG9saWN5IHBvbGljeSA9IGdldFBvbGljeSh1cmwpOwotICAgICAgICAKLSAgICAgICAgUm9sZVtdIGFsbFJvbGVzID0gZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldFJvbGVNYW5hZ2VyKCkuZ2V0Um9sZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGdldExvZ2dlcigpLmluZm8oIlJvbGVzOiAiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxSb2xlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHJlc3VsdCA9IHBvbGljeS5jaGVjayhnZXRJZGVudGl0eSgpLCBhbGxSb2xlc1tpXSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IFBvbGljeS5SRVNVTFRfR1JBTlRFRCkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmluZm8oYWxsUm9sZXNbaV0uZ2V0SWQoKSArICI6IGdyYW50ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmluZm8oYWxsUm9sZXNbaV0uZ2V0SWQoKSArICI6IGRlbmllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9saWN5IGZvciBhIFVSTC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwuCi0gICAgICogQHJldHVybiBUaGUgcG9saWN5LgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBQb2xpY3kgZ2V0UG9saWN5KFN0cmluZyB1cmwpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgUG9saWN5IHBvbGljeSA9IGdldFBvbGljeU1hbmFnZXIoKS5nZXRQb2xpY3koCi0gICAgICAgICAgICAgICAgZ2V0QWNjZXNzQ29udHJvbGxlcigpLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgdXJsKTsKLQotICAgICAgICByZXR1cm4gcG9saWN5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdGVzdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZVBvbGljeSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgSW5oZXJpdGluZ1BvbGljeU1hbmFnZXIgcG9saWN5TWFuYWdlciA9IChJbmhlcml0aW5nUG9saWN5TWFuYWdlcikgZ2V0UG9saWN5TWFuYWdlcigpOwotICAgICAgICBEZWZhdWx0UG9saWN5IHN1YnRyZWVQb2xpY3kgPSAoRGVmYXVsdFBvbGljeSkgcG9saWN5TWFuYWdlci5idWlsZFN1YnRyZWVQb2xpY3koCi0gICAgICAgICAgICAgICAgZ2V0QWNjZXNzQ29udHJvbGxlcigpLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgVVJMKTsKLSAgICAgICAgRGVmYXVsdFBvbGljeSBuZXdQb2xpY3kgPSBuZXcgRGVmYXVsdFBvbGljeSgpOwotCi0gICAgICAgIENyZWRlbnRpYWxbXSBjcmVkZW50aWFscyA9IHN1YnRyZWVQb2xpY3kuZ2V0Q3JlZGVudGlhbHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyZWRlbnRpYWxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBSb2xlIHJvbGUgPSBjcmVkZW50aWFsc1tpXS5nZXRSb2xlKCk7Ci0gICAgICAgICAgICBDcmVkZW50aWFsSW1wbCBjcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWxJbXBsKGNyZWRlbnRpYWxzW2ldLmdldEFjY3JlZGl0YWJsZSgpLCByb2xlKTsKLSAgICAgICAgICAgIGNyZWRlbnRpYWwuc2V0TWV0aG9kKGNyZWRlbnRpYWxzW2ldLmdldE1ldGhvZCgpKTsKLSAgICAgICAgICAgIG5ld1BvbGljeS5hZGRDcmVkZW50aWFsKGNyZWRlbnRpYWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1YnRyZWVQb2xpY3kuZ2V0Q3JlZGVudGlhbHMoKS5sZW5ndGgsIG5ld1BvbGljeS5nZXRDcmVkZW50aWFscygpLmxlbmd0aCk7Ci0KLSAgICAgICAgcG9saWN5TWFuYWdlci5zYXZlU3VidHJlZVBvbGljeShTQVZFX1VSTCwgbmV3UG9saWN5KTsKLQotICAgICAgICBuZXdQb2xpY3kgPSAoRGVmYXVsdFBvbGljeSkgcG9saWN5TWFuYWdlci5idWlsZFN1YnRyZWVQb2xpY3koZ2V0QWNjZXNzQ29udHJvbGxlcigpCi0gICAgICAgICAgICAgICAgLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgU0FWRV9VUkwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3VidHJlZVBvbGljeS5nZXRDcmVkZW50aWFscygpLmxlbmd0aCwgbmV3UG9saWN5LmdldENyZWRlbnRpYWxzKCkubGVuZ3RoKTsKLQotICAgICAgICBDcmVkZW50aWFsW10gbmV3Q3JlZGVudGlhbHMgPSBuZXdQb2xpY3kuZ2V0Q3JlZGVudGlhbHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyZWRlbnRpYWxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBSb2xlIHJvbGUgPSBjcmVkZW50aWFsc1tpXS5nZXRSb2xlKCk7Ci0gICAgICAgICAgICBDcmVkZW50aWFsSW1wbCBjcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWxJbXBsKGNyZWRlbnRpYWxzW2ldLmdldEFjY3JlZGl0YWJsZSgpLCByb2xlKTsKLSAgICAgICAgICAgIGNyZWRlbnRpYWwuc2V0TWV0aG9kKGNyZWRlbnRpYWwuZ2V0TWV0aG9kKCkpOwotICAgICAgICAgICAgQ3JlZGVudGlhbCBuZXdDcmVkZW50aWFsID0gbnVsbDsKLQotICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBuZXdDcmVkZW50aWFscy5sZW5ndGg7IGsrKykgewotICAgICAgICAgICAgICAgIGlmIChuZXdDcmVkZW50aWFsc1trXS5nZXRBY2NyZWRpdGFibGUoKS5lcXVhbHMoY3JlZGVudGlhbC5nZXRBY2NyZWRpdGFibGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q3JlZGVudGlhbCA9IG5ld0NyZWRlbnRpYWxzW2tdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiQWNjcmVkaXRhYmxlOiBbIiArIGNyZWRlbnRpYWwuZ2V0QWNjcmVkaXRhYmxlKCkgKyAiXSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXdDcmVkZW50aWFsKTsKLQotICAgICAgICAgICAgUm9sZSBvbGRSb2xlID0gY3JlZGVudGlhbC5nZXRSb2xlKCk7Ci0gICAgICAgICAgICBSb2xlIG5ld1JvbGUgPSBuZXdDcmVkZW50aWFsLmdldFJvbGUoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhvbGRSb2xlLCBuZXdSb2xlKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIGZvciAoaW50IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyBqKyspIHsgYXNzZXJ0RXF1YWxzKHJvbGVzW2pdLAotICAgICAgICAgICAgICogbmV3Um9sZXNbal0pOyBnZXRMb2dnZXIoKS5pbmZvKCIgUm9sZTogWyIgKyByb2xlc1tqXSArICJdIik7IH0KLSAgICAgICAgICAgICAqLwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1JvbGVNYW5hZ2VyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9pbXBsL1JvbGVNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2FjNmM0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Sb2xlTWFuYWdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQotICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqICAKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVSb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlUm9sZU1hbmFnZXI7Ci0KLS8qKgotICogUm9sZSBtYW5hZ2VyIHRlc3QuCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU1hbmFnZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBSdW4gdGhlIHRlc3QKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBGaWxlIGNvbmZpZ0RpciA9IGdldEFjY3JlZGl0YWJsZXNEaXJlY3RvcnkoKTsKLSAgICAgICAgRmlsZVJvbGVNYW5hZ2VyIF9tYW5hZ2VyID0gRmlsZVJvbGVNYW5hZ2VyLmluc3RhbmNlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgY29uZmlnRGlyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoX21hbmFnZXIpOwotCi0gICAgICAgIEZpbGVSb2xlTWFuYWdlciBhbm90aGVyTWFuYWdlciA9IEZpbGVSb2xlTWFuYWdlci5pbnN0YW5jZShnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCksIGNvbmZpZ0RpciwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFub3RoZXJNYW5hZ2VyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKF9tYW5hZ2VyLCBhbm90aGVyTWFuYWdlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBnZXRSb2xlcygpCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEdldFJvbGVzKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBhZGQoUm9sZSkKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEFkZFJvbGUoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgY29uZmlnRGlyID0gZ2V0QWNjcmVkaXRhYmxlc0RpcmVjdG9yeSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJ0ZXN0IjsKLSAgICAgICAgRmlsZVJvbGVNYW5hZ2VyIF9tYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgX21hbmFnZXIgPSBGaWxlUm9sZU1hbmFnZXIuaW5zdGFuY2UoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLCBjb25maWdEaXIsIGdldExvZ2dlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChfbWFuYWdlcik7Ci0gICAgICAgIFJvbGUgcm9sZSA9IG5ldyBGaWxlUm9sZShnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0Um9sZU1hbmFnZXIoKSwgZ2V0TG9nZ2VyKCksIG5hbWUpOwotICAgICAgICBfbWFuYWdlci5hZGQocm9sZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShfbWFuYWdlci5nZXRSb2xlcygpLmxlbmd0aCA+IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHZvaWQgcmVtb3ZlKFJvbGUpCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUm9sZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBjb25maWdEaXIgPSBnZXRBY2NyZWRpdGFibGVzRGlyZWN0b3J5KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gInRlc3QyIjsKLSAgICAgICAgUm9sZSByb2xlID0gbmV3IEZpbGVSb2xlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRSb2xlTWFuYWdlcigpLCBnZXRMb2dnZXIoKSwgbmFtZSk7Ci0gICAgICAgIEZpbGVSb2xlTWFuYWdlciBfbWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIF9tYW5hZ2VyID0gRmlsZVJvbGVNYW5hZ2VyLmluc3RhbmNlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgY29uZmlnRGlyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoX21hbmFnZXIpOwotCi0gICAgICAgIFJvbGVbXSByb2xlcyA9IF9tYW5hZ2VyLmdldFJvbGVzKCk7Ci0gICAgICAgIGludCByb2xlQ291bnRCZWZvcmUgPSByb2xlcy5sZW5ndGg7Ci0KLSAgICAgICAgX21hbmFnZXIuYWRkKHJvbGUpOwotICAgICAgICBfbWFuYWdlci5yZW1vdmUocm9sZSk7Ci0KLSAgICAgICAgcm9sZXMgPSBfbWFuYWdlci5nZXRSb2xlcygpOwotICAgICAgICBpbnQgcm9sZUNvdW50QWZ0ZXIgPSByb2xlcy5sZW5ndGg7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGVDb3VudEJlZm9yZSwgcm9sZUNvdW50QWZ0ZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Vc2VyTWFuYWdlclRlc3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWMvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvaW1wbC9Vc2VyTWFuYWdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3MGM5Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2FjL2ltcGwvVXNlck1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZUdyb3VwTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZVJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlck1hbmFnZXI7Ci0KLS8qKgotICogVXNlciBtYW5hZ2VyIHRlc3QuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFVzZXJNYW5hZ2VyVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVuIHRoZSB0ZXN0Ci0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgVXNlck1hbmFnZXIgX21hbmFnZXIgPSBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0VXNlck1hbmFnZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChfbWFuYWdlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRlc3QKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdExvYWRDb25maWcoKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVBY2NyZWRpdGFibGVNYW5hZ2VyIGFjY3JlZGl0YWJsZU1hbmFnZXIgPSAoRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXIpIGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKTsKLSAgICAgICAgRmlsZSBjb25maWdEaXIgPSBhY2NyZWRpdGFibGVNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKTsKLQotICAgICAgICBTdHJpbmcgdXNlck5hbWUgPSAiYWxpY2VUZXN0IjsKLSAgICAgICAgU3RyaW5nIGVkaXRvckdyb3VwSWQgPSAiZWRpdG9yR3JvdXAiOwotICAgICAgICBTdHJpbmcgYWRtaW5Hcm91cElkID0gImFkbWluR3JvdXAiOwotICAgICAgICBTdHJpbmcgZWRpdG9yUm9sZUlkID0gImVkaXRvclJvbGUiOwotICAgICAgICBTdHJpbmcgYWRtaW5Sb2xlSWQgPSAiYWRtaW5Sb2xlIjsKLQotICAgICAgICBGaWxlUm9sZSBlZGl0b3JSb2xlID0gbmV3IEZpbGVSb2xlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRSb2xlTWFuYWdlcigpLCBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICBlZGl0b3JSb2xlSWQpOwotICAgICAgICBGaWxlUm9sZSBhZG1pblJvbGUgPSBuZXcgRmlsZVJvbGUoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldFJvbGVNYW5hZ2VyKCksIGdldExvZ2dlcigpLAotICAgICAgICAgICAgICAgIGFkbWluUm9sZUlkKTsKLQotICAgICAgICBVc2VyIHVzZXIgPSBuZXcgRmlsZVVzZXIoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldFVzZXJNYW5hZ2VyKCksIGdldExvZ2dlcigpLCB1c2VyTmFtZSwKLSAgICAgICAgICAgICAgICAiQWxpY2UgaW4gV29uZGVybGFuZCIsICJhbGljZUB0ZXN0LmNvbSIsICJzZWNyZXQiKTsKLQotICAgICAgICBlZGl0b3JSb2xlLnNhdmUoKTsKLSAgICAgICAgYWRtaW5Sb2xlLnNhdmUoKTsKLQotICAgICAgICBHcm91cCBlZGl0b3JHcm91cCA9IG5ldyBGaWxlR3JvdXAoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldEdyb3VwTWFuYWdlcigpLCBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICBlZGl0b3JHcm91cElkKTsKLQotICAgICAgICAvLyBlZGl0b3JHcm91cC5hZGRSb2xlKGVkaXRvclJvbGUpOwotICAgICAgICBlZGl0b3JHcm91cC5hZGQodXNlcik7Ci0KLSAgICAgICAgRmlsZUdyb3VwIGFkbWluR3JvdXAgPSBuZXcgRmlsZUdyb3VwKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRHcm91cE1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSwgYWRtaW5Hcm91cElkKTsKLQotICAgICAgICAvLyBhZG1pbkdyb3VwLmFkZFJvbGUoZWRpdG9yUm9sZSk7Ci0gICAgICAgIC8vIGFkbWluR3JvdXAuYWRkUm9sZShhZG1pblJvbGUpOwotICAgICAgICBlZGl0b3JHcm91cC5zYXZlKCk7Ci0gICAgICAgIGFkbWluR3JvdXAuc2F2ZSgpOwotICAgICAgICBhZG1pbkdyb3VwLmFkZCh1c2VyKTsKLSAgICAgICAgdXNlci5zYXZlKCk7Ci0KLSAgICAgICAgRmlsZUdyb3VwTWFuYWdlciBncm91cE1hbmFnZXIgPSBudWxsOwotICAgICAgICBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9IGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXJNYW5hZ2VyKTsKLQotICAgICAgICBncm91cE1hbmFnZXIgPSBGaWxlR3JvdXBNYW5hZ2VyLmluc3RhbmNlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgY29uZmlnRGlyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ3JvdXBNYW5hZ2VyKTsKLQotICAgICAgICBHcm91cCBmZXRjaGVkR3JvdXAgPSBncm91cE1hbmFnZXIuZ2V0R3JvdXAoZWRpdG9yR3JvdXBJZCk7Ci0gICAgICAgIGFzc2VydFRydWUoZWRpdG9yR3JvdXAuZXF1YWxzKGZldGNoZWRHcm91cCkpOwotCi0gICAgICAgIGZldGNoZWRHcm91cCA9IGdyb3VwTWFuYWdlci5nZXRHcm91cChhZG1pbkdyb3VwSWQpOwotICAgICAgICBhc3NlcnRUcnVlKGFkbWluR3JvdXAuZXF1YWxzKGZldGNoZWRHcm91cCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZ2V0VXNlcigpCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RHZXRVc2VyKCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBGaWxlQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyTWdyID0gKEZpbGVBY2NyZWRpdGFibGVNYW5hZ2VyKSBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCk7Ci0gICAgICAgIEZpbGUgY29uZmlnRGlyID0gYWNjck1nci5nZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCk7Ci0gICAgICAgIFN0cmluZyB1c2VyTmFtZSA9ICJhbGljZVRlc3QiOwotICAgICAgICBGaWxlVXNlciB1c2VyID0gbmV3IEZpbGVVc2VyKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpLCBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICB1c2VyTmFtZSwgIkFsaWNlIGluIFdvbmRlcmxhbmQiLCAiYWxpY2VAd29uZGVybGFuZC5jb20iLCAic2VjcmV0Iik7Ci0gICAgICAgIFVzZXJUeXBlW10gdXNlclR5cGVzID0geyBGaWxlQWNjcmVkaXRhYmxlTWFuYWdlci5nZXREZWZhdWx0VXNlclR5cGUoKSB9OwotICAgICAgICBGaWxlVXNlck1hbmFnZXIgX21hbmFnZXIgPSBGaWxlVXNlck1hbmFnZXIuaW5zdGFuY2UoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLCBjb25maWdEaXIsCi0gICAgICAgICAgICAgICAgdXNlclR5cGVzLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoX21hbmFnZXIpOwotICAgICAgICBfbWFuYWdlci5hZGQodXNlcik7Ci0KLSAgICAgICAgVXNlciBvdGhlclVzZXIgPSBfbWFuYWdlci5nZXRVc2VyKHVzZXJOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXIsIG90aGVyVXNlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh1c2VyLmdldERlc2NyaXB0aW9uKCksIG90aGVyVXNlci5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXIuZ2V0RW1haWwoKSwgb3RoZXJVc2VyLmdldEVtYWlsKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModXNlci5nZXRFbmNyeXB0ZWRQYXNzd29yZCgpLCAoKEFic3RyYWN0VXNlcikgb3RoZXJVc2VyKS5nZXRFbmNyeXB0ZWRQYXNzd29yZCgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hYy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvTG9naW5UZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Mb2dpblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkZTBhZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Mb2dpblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZVRlc3Q7Ci0KLS8qKgotICogTG9naW4gdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2luVGVzdCBleHRlbmRzIEFic3RyYWN0VXNlY2FzZVRlc3QgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9JRCA9ICJsZW55YSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAibGV2aSI7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldFJlcXVlc3RQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVycygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTWFwIGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwYXJhbXMucHV0KExvZ2luLlVTRVJOQU1FLCBVU0VSX0lEKTsKLSAgICAgICAgcGFyYW1zLnB1dChMb2dpbi5QQVNTV09SRCwgUEFTU1dPUkQpOwotICAgICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlY2FzZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiYWMubG9naW4iOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUG9zdGNvbmRpdGlvbnMoKSB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldFJlcXVlc3QoKS5nZXRTZXNzaW9uKCk7Ci0gICAgICAgIElkZW50aXR5IGlkZW50aXR5ID0gKElkZW50aXR5KSBzZXNzaW9uLmdldEF0dHJpYnV0ZShJZGVudGl0eS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBVc2VyIHVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodXNlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh1c2VyLmdldElkKCksIFVTRVJfSUQpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dpbigpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0QWNjZXNzQ29udHJvbGxlcigpLnNldHVwSWRlbnRpdHkoZ2V0UmVxdWVzdCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWMtbG9naW4ueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFjLWxvZ2luLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg2OGZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWMtbG9naW4ueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWMubG9naW4nXSI+DQotDQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYWMubG9naW4iIGxvZ2dlcj0ibGVueWEuYWMiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5Mb2dpbiI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2FjdXNlY2FzZXMvdXNlY2FzZXMvbG9naW4uangiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICAgIA0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFjLWxvZ291dC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWMtbG9nb3V0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmJjZjlmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWMtbG9nb3V0Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2FjLmxvZ291dCddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJhYy5sb2dvdXQiIGxvZ2dlcj0ibGVueWEuYWMiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5Mb2dvdXQiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hY3VzZWNhc2VzL3VzZWNhc2VzL2xvZ291dC5qeCIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gICAgDQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjZTg0Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5hY3VzZWNhc2VzPC9pZD4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcyIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy51c2VjYXNlIi8+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPG5hbWU+QWNjZXNzIGNvbnRyb2wgdXNlY2FzZXM8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPkFjY2VzcyBjb250cm9sIHVzZWNhc2VzPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hY3VzZWNhc2VzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0FjY2Vzc0NvbnRyb2xVc2VjYXNlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQWNjZXNzQ29udHJvbFVzZWNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwMTQxNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQWNjZXNzQ29udHJvbFVzZWNhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlclJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklQUmFuZ2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZTsKLQotLyoqCi0gKiBTdXBlciBjbGFzcyBmb3IgYWNjZXNzLWNvbnRyb2wgcmVsYXRlZCB1c2VjYXNlcy4KLSAqIAotICogQHZlcnNpb24gJElkOiBBY2Nlc3NDb250cm9sVXNlY2FzZS5qYXZhIDQwNzMwNSAyMDA2LTA1LTE3IDE2OjIxOjQ5WiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIGV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFjY2Vzc0NvbnRyb2xVc2VjYXNlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgVXNlck1hbmFnZXIgdXNlck1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBHcm91cE1hbmFnZXIgZ3JvdXBNYW5hZ2VyOwotICAgIHByaXZhdGUgSVBSYW5nZU1hbmFnZXIgaXBSYW5nZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBSb2xlTWFuYWdlciByb2xlTWFuYWdlcjsKLSAgICBwcml2YXRlIEFjY2Vzc0NvbnRyb2xsZXIgYWNjZXNzQ29udHJvbGxlcjsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBhY2NyZWRpdGFibGUgbWFuYWdlcnMuIEZJWE1FOiBUaGlzIG1ldGhvZCByZXNvbHZlcyB0aGUKLSAgICAgKiBBY2Nlc3NDb250cm9sbGVyLCBpdCBoYXMgdG8gYmUgcmVsZWFzZWQgYWZ0ZXIgaXQgaXMgdXNlZCEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWNjZXNzQ29udHJvbGxlcigpIHsKLSAgICAgICAgc3VwZXIuZG9Jbml0aWFsaXplKCk7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiaW5pdGlhbGl6ZUFjY2Vzc0NvbnRyb2xsZXIoKSBjYWxsZWQiKTsKLQotICAgICAgICB0aGlzLmFjY2Vzc0NvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLlJPTEUKLSAgICAgICAgICAgICAgICAgICAgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcikgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuREVGQVVMVF9SRVNPTFZFUik7Ci0KLSAgICAgICAgICAgIHRoaXMuYWNjZXNzQ29udHJvbGxlciA9IHJlc29sdmVyLnJlc29sdmVBY2Nlc3NDb250cm9sbGVyKGdldFNvdXJjZVVSTCgpKTsKLQotICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXNzQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIGFjY2VzcyBjb250cm9sbGVyIGNvdWxkIGJlIHJlc29sdmVkIGZvciBVUkwgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0U291cmNlVVJMKCkgKyAiXS4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyID0gdGhpcy5hY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCk7Ci0KLSAgICAgICAgICAgIHRoaXMudXNlck1hbmFnZXIgPSBhY2NyZWRpdGFibGVNYW5hZ2VyLmdldFVzZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB0aGlzLmdyb3VwTWFuYWdlciA9IGFjY3JlZGl0YWJsZU1hbmFnZXIuZ2V0R3JvdXBNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB0aGlzLnJvbGVNYW5hZ2VyID0gYWNjcmVkaXRhYmxlTWFuYWdlci5nZXRSb2xlTWFuYWdlcigpOwotICAgICAgICAgICAgdGhpcy5pcFJhbmdlTWFuYWdlciA9IGFjY3JlZGl0YWJsZU1hbmFnZXIuZ2V0SVBSYW5nZU1hbmFnZXIoKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluaXRpYWxpemF0aW9uIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZ3JvdXBNYW5hZ2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBHcm91cE1hbmFnZXIgZ2V0R3JvdXBNYW5hZ2VyKCkgewotICAgICAgICBpZiAodGhpcy5ncm91cE1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdGlhbGl6ZUFjY2Vzc0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5ncm91cE1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpcFJhbmdlTWFuYWdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSVBSYW5nZU1hbmFnZXIgZ2V0SXBSYW5nZU1hbmFnZXIoKSB7Ci0gICAgICAgIGlmICh0aGlzLmlwUmFuZ2VNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVBY2Nlc3NDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaXBSYW5nZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByb2xlTWFuYWdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUm9sZU1hbmFnZXIgZ2V0Um9sZU1hbmFnZXIoKSB7Ci0gICAgICAgIGlmICh0aGlzLnJvbGVNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVBY2Nlc3NDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucm9sZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1c2VyTWFuYWdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVXNlck1hbmFnZXIgZ2V0VXNlck1hbmFnZXIoKSB7Ci0gICAgICAgIGlmICh0aGlzLnVzZXJNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRVc2VyTWFuYWdlcigpIGFjY2Vzc2VkLCBpcyBudWxsLCBzbyBjYWxsaW5nIGluaXRpYWxpemVBY2Nlc3NDb250cm9sbGVyIik7Ci0gICAgICAgICAgICBpbml0aWFsaXplQWNjZXNzQ29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnVzZXJNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWNjZXNzQ29udHJvbGxlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWNjZXNzQ29udHJvbGxlciBnZXRBY2Nlc3NDb250cm9sbGVyKCkgewotICAgICAgICBpZiAodGhpcy5hY2Nlc3NDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVBY2Nlc3NDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzQ29udHJvbGxlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvTG9naW4uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Mb2dpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTkwMzczLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Mb2dpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci0KLS8qKgotICogVXNlY2FzZSB0byBsb2dpbiBhIHVzZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogTG9naW4uamF2YSA0MDczMDUgMjAwNi0wNS0xNyAxNjoyMTo0OVogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dpbiBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhJU1RPUllfU0VTU0lPTl9BVFRSSUJVVEUgPSAib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZy5IaXN0b3J5IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJwYXNzd29yZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUk5BTUUgPSAidXNlcm5hbWUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSUkVSX1FVRVJZX1NUUklORyA9ICJyZWZlcnJlclF1ZXJ5U3RyaW5nIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNBVElPTiA9ICJwdWJsaWNhdGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9VU0VSID0gImN1cnJlbnRVc2VyIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLCBnZXREb2N1bWVudEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlVVJMKCkpOwotICAgICAgICAgICAgaWYgKHB1YmxpY2F0aW9uLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFBVQkxJQ0FUSU9OLCBwdWJsaWNhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IHRoaXMuZ2V0U2Vzc2lvbigpLmdldElkZW50aXR5KCk7Ci0gICAgICAgICAgICBpZiAoaWRlbnRpdHkgIT0gbnVsbCAmJiBpZGVudGl0eS5nZXRVc2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihDVVJSRU5UX1VTRVIsIHRoaXMuZ2V0U2Vzc2lvbigpLmdldElkZW50aXR5KCkuZ2V0VXNlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9naW4oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuCi0gICAgICogQHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB1c2VySWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVU0VSTkFNRSk7Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFBBU1NXT1JEKTsKLQotICAgICAgICBpZiAodXNlcklkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiUGxlYXNlIGVudGVyIGEgdXNlciBuYW1lLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXNzd29yZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlBsZWFzZSBlbnRlciBhIHBhc3N3b3JkLiIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIE1hcCBvYmplY3RNb2RlbCA9IENvbnRleHRIZWxwZXIuZ2V0T2JqZWN0TW9kZWwoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKHRydWUpOwotICAgICAgICAgICAgaWYgKGdldEFjY2Vzc0NvbnRyb2xsZXIoKS5hdXRoZW50aWNhdGUocmVxdWVzdCkpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpLnJlbW92ZUF0dHJpYnV0ZShISVNUT1JZX1NFU1NJT05fQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICBzZXREZWZhdWx0VGFyZ2V0VVJMKHJlcXVlc3QuZ2V0UGF0aEluZm8oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiQXV0aGVudGljYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldEV4aXRRdWVyeVN0cmluZygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFeGl0UXVlcnlTdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFJFRkVSUkVSX1FVRVJZX1NUUklORyk7Ci0gICAgICAgIGlmIChxdWVyeVN0cmluZyAhPSBudWxsICYmICFxdWVyeVN0cmluZy5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBxdWVyeVN0cmluZyA9ICI/IiArIHF1ZXJ5U3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBxdWVyeVN0cmluZzsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hY3VzZWNhc2VzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0xvZ291dC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hY3VzZWNhc2VzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0xvZ291dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZkOTg3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Mb2dvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5TZXNzaW9uOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gbG9nIGEgdXNlciBvdXQuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogTG9nb3V0LmphdmEgNDA3MzA1IDIwMDYtMDUtMTcgMTY6MjE6NDlaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgTG9nb3V0IGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIE1hcCBvYmplY3RNb2RlbCA9IENvbnRleHRIZWxwZXIuZ2V0T2JqZWN0TW9kZWwoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0KLSAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgVmVjdG9yIGhpc3RvcnkgPSAoVmVjdG9yKSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoTG9naW4uSElTVE9SWV9TRVNTSU9OX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoImhpc3RvcnkiLCBoaXN0b3J5LnRvQXJyYXkoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE1hcCBvYmplY3RNb2RlbCA9IENvbnRleHRIZWxwZXIuZ2V0T2JqZWN0TW9kZWwoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0KLSAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFJlcG9zaXRvcnlVdGlsLnJlbW92ZVNlc3Npb24obWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShMb2dpbi5ISVNUT1JZX1NFU1NJT05fQVRUUklCVVRFKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hY3VzZWNhc2VzL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4ZjNkZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDY1NjQgMjAwNi0wOS0xNSAxMDoxMzoxNlogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotDQotICA8bWVzc2FnZSBrZXk9IlBsZWFzZSBlbnRlciBhIHVzZXIgbmFtZS4iPlBsZWFzZSBlbnRlciBhIHVzZXIgbmFtZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGxlYXNlIGVudGVyIGEgcGFzc3dvcmQuIj5QbGVhc2UgZW50ZXIgYSBwYXNzd29yZC48L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmJmZTNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWlfZGUueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0iUGxlYXNlIGVudGVyIGEgdXNlciBuYW1lLiI+Qml0dGUgZ2ViZW4gU2llIGVpbmVuIEJlbnV0emVybmFtZW4gZWluLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQbGVhc2UgZW50ZXIgYSBwYXNzd29yZC4iPkJpdHRlIGdlYmVuIFNpZSBlaW4gUGFzc3dvcnQgZWluLjwvbWVzc2FnZT4KLSAgCi08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvdGVzdC9jYW5vby90ZXN0LnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy90ZXN0L2Nhbm9vL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODc5NWNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy90ZXN0L2Nhbm9vL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCFET0NUWVBFIHByb2plY3QgU1lTVEVNICIuLi8uLi8uLi8uLi9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vbGVueWFfd2VidGVzdC5kdGQiPgotCi08cHJvamVjdCBuYW1lPSJBQyB1c2VjYXNlcyB0ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIj4KLSAgCi0gIDxpbXBvcnQgZmlsZT0iLi4vLi4vLi4vLi4vbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2Nhbm9vL21hY3Jvcy54bWwiLz4KLSAgCi0gIDx0YXJnZXQgbmFtZT0ibWFpbiI+Ci0gICAgPHdlYnRlc3QgbmFtZT0iYWN1c2VjYXNlcyI+Ci0gICAgICAmZG9Db25maWc7Ci0gICAgICA8c3RlcHM+Ci0gICAgICAgIDwhLS0gbG9naW4gcGFnZSAtLT4KLSAgICAgICAgPGludm9rZSB1cmw9ImluZGV4Lmh0bWwiIC8+Ci0gICAgICAgIDx2ZXJpZnlUaXRsZSB0ZXh0PSJMb2dpbiB0byB0aGUgRGVmYXVsdCBQdWJsaWNhdGlvbiIgLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gbWlzc2luZyBmaWVsZHMgLS0+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9InVzZXJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9InBhc3N3b3JkIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxjbGlja0J1dHRvbiBuYW1lPSJzdWJtaXQiLz4KLSAgICAgICAgPHZlcmlmeVRleHQgdGV4dD0iUGxlYXNlIGVudGVyIi8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIHdyb25nIGxvZ2luIC0tPgotICAgICAgICA8c2V0SW5wdXRGaWVsZCBuYW1lPSJ1c2VybmFtZSIgdmFsdWU9ImZvbyIvPgotICAgICAgICA8c2V0SW5wdXRGaWVsZCBuYW1lPSJwYXNzd29yZCIgdmFsdWU9ImJhciIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9IkF1dGhlbnRpY2F0aW9uIGZhaWxlZCIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBjb3JyZWN0IGxvZ2luIC0tPgotICAgICAgICA8c2V0SW5wdXRGaWVsZCBuYW1lPSJ1c2VybmFtZSIgdmFsdWU9ImxlbnlhIi8+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9InBhc3N3b3JkIiB2YWx1ZT0ibGV2aSIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9IldlbGNvbWUgdG8gdGhlIERlZmF1bHQgUHVibGljYXRpb24gZnJvbSB0aGUgTGVueWEgY29tbXVuaXR5ISIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBsb2dvdXQgLS0+Ci0gICAgICAgIDxpbnZva2UgdXJsPSJpbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9YWMubG9nb3V0Ii8+Ci0gICAgICAgIDx2ZXJpZnlUaXRsZSB0ZXh0PSJMb2dvdXQgZnJvbSB0aGUgUHVibGljYXRpb24iIC8+Ci0gICAgICAgIDxjbGlja0J1dHRvbiBuYW1lPSJzdWJtaXQiLz4KLSAgICAgICAgPHZlcmlmeVRpdGxlIHRleHQ9IkxvZ2luIHRvIHRoZSBEZWZhdWx0IFB1YmxpY2F0aW9uIiAvPgotICAgICAgICAKLSAgICAgIDwvc3RlcHM+Ci0gICAgPC93ZWJ0ZXN0PgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy91c2VjYXNlcy9sb2dpbi5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWN1c2VjYXNlcy91c2VjYXNlcy9sb2dpbi5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5ZGNiMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvdXNlY2FzZXMvbG9naW4uangKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLQotICA8ang6c2V0IHZhcj0icHViIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncHVibGljYXRpb24nKX0iLz4KLQotICA8cGFnZTp0aXRsZT4KLSAgICA8ang6Y2hvb3NlPgotICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignY3VycmVudFVzZXInKSAhPSBudWxsfSI+Ci0gICAgICAgIDxpMThuOnRleHQ+QWNjZXNzIERlbmllZDwvaTE4bjp0ZXh0PgotICAgICAgPC9qeDp3aGVuPgotICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgIDxpMThuOnRleHQgaTE4bjprZXk9ImxvZ2luLXRvLXB1YiIvPgotICAgICAgICAgIDxpMThuOnBhcmFtPjxqeDpvdXQgdmFsdWU9IiR7cHViLmdldE5hbWUoKX0iLz48L2kxOG46cGFyYW0+Ci0gICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICA8L2p4OmNob29zZT4KLSAgPC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxqeDppZiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdjdXJyZW50VXNlcicpICE9IG51bGx9Ij4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICAgICAgPGkxOG46dGV4dD5BY2Nlc3MgRGVuaWVkPC9pMThuOnRleHQ+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0idXNlci1ub3QtYXV0aG9yaXplZCIvPgotICAgICAgICAgICAgPGkxOG46cGFyYW0+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignY3VycmVudFVzZXInKS5nZXRJZCgpfSIvPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgIDxpMThuOnBhcmFtPjxqeDpvdXQgdmFsdWU9IiR7cmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCl9Ii8+PC9pMThuOnBhcmFtPgotICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgPGJyLz4KLSAgICAgICAgICA8YnIvPgotICAgICAgICAgIDxpMThuOnRleHQ+aGF2ZS1hbm90aGVyLWFjY291bnQ8L2kxOG46dGV4dD4KLSAgICAgICAgPC9kaXY+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2p4OmlmPgotICAgIAotICAgIDxqeDpjaG9vc2U+Ci0gICAgICA8ang6d2hlbiB0ZXN0PSIke3B1Yi5nZXRJZCgpLmVxdWFscygnZGVmYXVsdCcpfSI+Ci0gICAgICAgIDxwPgotICAgICAgICAgIDxzdHJvbmc+IDxpMThuOnRleHQ+Tk9URTwvaTE4bjp0ZXh0PjogPC9zdHJvbmc+Ci0gICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0idHJ5LXVzZXItbGVueWEtYWxpY2UiIC8+Ci0gICAgICAgICAgICA8aTE4bjpwYXJhbT4ibGVueWEiPC9pMThuOnBhcmFtPgotICAgICAgICAgICAgPGkxOG46cGFyYW0+ImxldmkiPC9pMThuOnBhcmFtPgotICAgICAgICAgICAgPGkxOG46cGFyYW0+ImFsaWNlIjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgIDxpMThuOnBhcmFtPiJsZXZpIjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICA8L3A+Ci0gICAgICA8L2p4OndoZW4+Ci0gICAgICA8ang6d2hlbiB0ZXN0PSIke3B1Yi5nZXRJZCgpLmVxdWFscygnYmxvZycpfSI+Ci0gICAgICAgIDxwPgotICAgICAgICAgIDxzdHJvbmc+IDxpMThuOnRleHQ+Tk9URTwvaTE4bjp0ZXh0PjogPC9zdHJvbmc+Ci0gICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0idHJ5LXVzZXItbGVueWEiIC8+Ci0gICAgICAgICAgICA8aTE4bjpwYXJhbT4ibGVueWEiPC9pMThuOnBhcmFtPgotICAgICAgICAgICAgPGkxOG46cGFyYW0+ImxldmkiPC9pMThuOnBhcmFtPgotICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgIDwvcD4KLSAgICAgIDwvang6d2hlbj4KLSAgICA8L2p4OmNob29zZT4KLSAgICAKLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD5Mb2dpbjwvaTE4bjp0ZXh0PgotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICA8Zm9ybSBuYW1lPSJsb2dpbiIgaWQ9ImxvZ2luIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iP2xlbnlhLmNvbnRpbnVhdGlvbj0ke2NvbnRpbnVhdGlvbi5pZH0mYW1wO2xlbnlhLnVzZWNhc2U9JHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSI+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD48bGFiZWwgZm9yPSJuYW1lIj48aTE4bjp0ZXh0PlVzZXJuYW1lPC9pMThuOnRleHQ+OiA8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgbmFtZT0idXNlcm5hbWUiIHR5cGU9InRleHQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1c2VybmFtZScpfSIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPjxsYWJlbCBmb3I9InBhc3N3b3JkIj4gPGkxOG46dGV4dD5QYXNzd29yZDwvaTE4bjp0ZXh0PjogPC9sYWJlbD48L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCAvPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9mb3JtPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvdXNlY2FzZXMvbG9nb3V0Lmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hY3VzZWNhc2VzL3VzZWNhc2VzL2xvZ291dC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmNWU1MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FjdXNlY2FzZXMvdXNlY2FzZXMvbG9nb3V0Lmp4CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLQotICA8cGFnZTp0aXRsZT4KLSAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICA8aTE4bjp0ZXh0IGkxOG46a2V5PSJsb2dvdXQtZnJvbS1wdWIiLz4KLSAgICAgIDxpMThuOnBhcmFtPjwvaTE4bjpwYXJhbT4KLSAgICA8L2kxOG46dHJhbnNsYXRlPgotICA8L3BhZ2U6dGl0bGU+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICAgIDxpMThuOnRleHQ+TG9nb3V0PC9pMThuOnRleHQ+Ci0gICAgICA8L2Rpdj4KLQotICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgCi0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDxmb3JtIGlkPSJmb3JtLWxvZ291dCI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ291dCIgLz4KLSAgICAgICAgICAgICAgICAmIzE2MDsKLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgbmFtZT0iY2FuY2VsIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDYW5jZWwiIC8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZm9ybT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PllvdXIgSGlzdG9yeTwvaTE4bjp0ZXh0PgotICAgICAgPC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InVybCIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2hpc3RvcnknKX0iPgotICAgICAgICAgICAgPGxpPjxqeDpvdXQgdmFsdWU9IiR7dXJsfSIvPjwvbGk+Ci0gICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICA8L3VsPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdGFicy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi90YWJzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM2ZTA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi90YWJzLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL2d1aS1tYW5hZ2VyIiB1bmxlc3M9Ii9jb2Nvb24vZ3VpLW1hbmFnZXIvdGFiLWdyb3VwW0BuYW1lID0gJ2FkbWluJ10iPg0KLSAgICA8dGFiLWdyb3VwIG5hbWU9ImFkbWluIj4NCi0gICAgICA8dGFiIG5hbWU9InVzZXJzIiBsYWJlbD0iVXNlcnMiIHVzZWNhc2U9ImFkbWluLnVzZXJzIi8+DQotICAgICAgPHRhYiBuYW1lPSJncm91cHMiIGxhYmVsPSJHcm91cHMiIHVzZWNhc2U9ImFkbWluLmdyb3VwcyIvPg0KLSAgICAgIDx0YWIgbmFtZT0iaXBSYW5nZXMiIGxhYmVsPSJJUCBSYW5nZXMiIHVzZWNhc2U9ImFkbWluLmlwUmFuZ2VzIi8+DQotICAgICAgPHRhYiBuYW1lPSJ1c2VjYXNlcyIgbGFiZWw9IlVzZWNhc2VzIiB1c2VjYXNlPSJhZG1pbi51c2VjYXNlcyIvPgotICAgICAgPHRhYiBuYW1lPSJ0cmFzaCIgbGFiZWw9IkRlbGV0ZSBUcmFzaCIgdXNlY2FzZT0iYWRtaW4uZW1wdHlUcmFzaCIvPg0KLSAgICAgIDx0YWIgbmFtZT0ic2VydmVyU3RhdHVzIiBsYWJlbD0iU2VydmVyIFN0YXR1cyIgdXNlY2FzZT0iYWRtaW4uc2VydmVyU3RhdHVzIi8+DQotICAgICAgPHRhYiBuYW1lPSJzZXNzaW9ucyIgbGFiZWw9IlNlc3Npb25zIiB1c2VjYXNlPSJhZG1pbi5zZXNzaW9ucyIvPg0KLSAgICAgIDx0YWIgbmFtZT0ic2l0ZU92ZXJ2aWV3IiBsYWJlbD0iT3ZlcnZpZXciIHVzZWNhc2U9ImFkbWluLnNpdGVPdmVydmlldyIvPg0KLSAgICA8L3RhYi1ncm91cD4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tYWJvdXRMZW55YS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWFib3V0TGVueWEueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzBlOTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tYWJvdXRMZW55YS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4uZ3JvdXBzJ10iPgotCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYWRtaW4uYWJvdXRMZW55YSIgbG9nZ2VyPSJsZW55YS5hZG1pbiIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRHVtbXlVc2VjYXNlIj4KLSAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvYWJvdXRMZW55YS5qeCIgbWVudT0idHJ1ZSIvPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLSAgCi08L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWFkZEdyb3VwLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tYWRkR3JvdXAueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDAyMDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tYWRkR3JvdXAueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4uZ3JvdXBzJ10iPg0KLQ0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmFkZEdyb3VwIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuQWRkR3JvdXAiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9hZGRHcm91cC5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iZ3JvdXBzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLmdyb3VwIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tYWRkSVBSYW5nZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWFkZElQUmFuZ2UueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjFkOWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tYWRkSVBSYW5nZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi5hZGRJUFJhbmdlJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmFkZElQUmFuZ2UiIGxvZ2dlcj0ibGVueWEuYWRtaW4iIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5BZGRJUFJhbmdlIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvYWRkSVBSYW5nZS5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iaXBSYW5nZXMiLz4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPGV4aXQgdXNlY2FzZT0iYWRtaW4uaXBSYW5nZXMiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWFkZFVzZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1hZGRVc2VyLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjhmNDRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWFkZFVzZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4uYWRkVXNlciddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJhZG1pbi5hZGRVc2VyIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuQWRkVXNlciI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2FkZFVzZXIuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9InVzZXJzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLnVzZXIiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICAgIA0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1jaGFuZ2VQYXNzd29yZC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWNoYW5nZVBhc3N3b3JkLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRkZTU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWNoYW5nZVBhc3N3b3JkLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2FkbWluLmNoYW5nZVBhc3N3b3JkJ10iPg0KLQ0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmNoYW5nZVBhc3N3b3JkIiBsb2dnZXI9ImxlbnlhLmFkbWluIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5DaGFuZ2VQYXNzd29yZCI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2NoYW5nZVBhc3N3b3JkLmp4Ij4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iY2hlY2tQYXNzd29yZCIgdmFsdWU9InRydWUiLz4NCi0gICAgICA8L3ZpZXc+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tY2hhbmdlUGFzc3dvcmRBZG1pbi54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWNoYW5nZVBhc3N3b3JkQWRtaW4ueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZGVkM2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tY2hhbmdlUGFzc3dvcmRBZG1pbi54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi5jaGFuZ2VQYXNzd29yZEFkbWluJ10iPg0KLQ0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmNoYW5nZVBhc3N3b3JkQWRtaW4iIGxvZ2dlcj0ibGVueWEuYWRtaW4iIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5DaGFuZ2VQYXNzd29yZEFkbWluIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvY2hhbmdlUGFzc3dvcmRBZG1pbi5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0idXNlcnMiLz4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iY2hlY2tQYXNzd29yZCIgdmFsdWU9ImZhbHNlIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLnVzZXIiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICAgIA0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1kZWxldGVHcm91cC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWRlbGV0ZUdyb3VwLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEwOTFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWRlbGV0ZUdyb3VwLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2FkbWluLmRlbGV0ZUdyb3VwJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmRlbGV0ZUdyb3VwIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuRGVsZXRlR3JvdXAiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9kZWxldGVHcm91cC5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iZ3JvdXBzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLmdyb3VwcyIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tZGVsZXRlSVBSYW5nZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWRlbGV0ZUlQUmFuZ2UueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDlhNmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tZGVsZXRlSVBSYW5nZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi5pcFJhbmdlR3JvdXBzJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmRlbGV0ZUlQUmFuZ2UiIGxvZ2dlcj0ibGVueWEuYWRtaW4iIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5EZWxldGVJUFJhbmdlIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZGVsZXRlSVBSYW5nZS5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iaXBSYW5nZXMiLz4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPGV4aXQgdXNlY2FzZT0iYWRtaW4uaXBSYW5nZXMiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWRlbGV0ZVVzZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1kZWxldGVVc2VyLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmZmMWQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWRlbGV0ZVVzZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4uZGVsZXRlVXNlciddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJhZG1pbi5kZWxldGVVc2VyIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuRGVsZXRlVXNlciI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2RlbGV0ZVVzZXIuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9InVzZXJzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLnVzZXJzIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tZW1wdHlUcmFzaC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWVtcHR5VHJhc2gueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDIzNTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tZW1wdHlUcmFzaC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi5lbXB0eVRyYXNoJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmVtcHR5VHJhc2giIGxvZ2dlcj0ibGVueWEuYWRtaW4iIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLkVtcHR5VHJhc2giPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9lbXB0eVRyYXNoLmp4IiBtZW51PSJ0cnVlIj4NCi0gICAgICAgIDx0YWIgZ3JvdXA9ImFkbWluIiBuYW1lPSJ0cmFzaCIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJhZG1pbi5lbXB0eVRyYXNoIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1ncm91cC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWdyb3VwLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjllNjk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWdyb3VwLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2FkbWluLmdyb3VwJ10iPg0KLQ0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmdyb3VwIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuR3JvdXAiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9ncm91cC5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iZ3JvdXBzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLmdyb3VwcyIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gICAgDQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWdyb3VwTWVtYmVycy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWdyb3VwTWVtYmVycy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwMDlmMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1ncm91cE1lbWJlcnMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4uZ3JvdXBNZW1iZXJzJ10iPg0KLQ0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmdyb3VwTWVtYmVycyIgbG9nZ2VyPSJsZW55YS5hZG1pbiIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzLkdyb3VwTWVtYmVycyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2dyb3VwTWVtYmVycy5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iZ3JvdXBzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLmdyb3VwIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBJZCIvPg0KLSAgICAgIDwvZXhpdD4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICAgIA0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1ncm91cFByb2ZpbGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1ncm91cFByb2ZpbGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTM0NDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tZ3JvdXBQcm9maWxlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2FkbWluLmdyb3VwUHJvZmlsZSddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJhZG1pbi5ncm91cFByb2ZpbGUiIGxvZ2dlcj0ibGVueWEuYWRtaW4iIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5Hcm91cFByb2ZpbGUiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9ncm91cFByb2ZpbGUuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9Imdyb3VwcyIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJhZG1pbi5ncm91cCI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Imdyb3VwSWQiLz4NCi0gICAgICA8L2V4aXQ+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tZ3JvdXBzLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tZ3JvdXBzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWZkOTYwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWdyb3Vwcy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi5ncm91cHMnXSI+DQotDQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYWRtaW4uZ3JvdXBzIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuR3JvdXBzIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZ3JvdXBzLmp4IiBtZW51PSJ0cnVlIj4NCi0gICAgICAgIDx0YWIgZ3JvdXA9ImFkbWluIiBuYW1lPSJncm91cHMiLz4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPGV4aXQgdXNlY2FzZT0iYWRtaW4uZ3JvdXBzIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4taXBSYW5nZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWlwUmFuZ2UueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWFkZmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4taXBSYW5nZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi5pcFJhbmdlJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmlwUmFuZ2UiIGxvZ2dlcj0ibGVueWEuYWRtaW4iIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5JUFJhbmdlIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvaXBSYW5nZS5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iaXBSYW5nZXMiLz4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPGV4aXQgdXNlY2FzZT0iYWRtaW4uaXBSYW5nZXMiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWlwUmFuZ2VHcm91cHMueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1pcFJhbmdlR3JvdXBzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQyYmI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWlwUmFuZ2VHcm91cHMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4uaXBSYW5nZUdyb3VwcyddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJhZG1pbi5pcFJhbmdlR3JvdXBzIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuSVBSYW5nZUdyb3VwcyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2VHcm91cHMuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9ImlwUmFuZ2VzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLmlwUmFuZ2UiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJpcFJhbmdlSWQiLz4NCi0gICAgICA8L2V4aXQ+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1pcFJhbmdlUHJvZmlsZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWlwUmFuZ2VQcm9maWxlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmMxMjNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWlwUmFuZ2VQcm9maWxlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2FkbWluLmlwUmFuZ2VQcm9maWxlJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLmlwUmFuZ2VQcm9maWxlIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuSVBSYW5nZVByb2ZpbGUiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9pcFJhbmdlUHJvZmlsZS5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iaXBSYW5nZXMiLz4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPGV4aXQgdXNlY2FzZT0iYWRtaW4uaXBSYW5nZSI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImlwUmFuZ2VJZCIvPg0KLSAgICAgIDwvZXhpdD4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLWlwUmFuZ2VzLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4taXBSYW5nZXMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkM2UxNTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4taXBSYW5nZXMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4uaXBSYW5nZXMnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYWRtaW4uaXBSYW5nZXMiIGxvZ2dlcj0ibGVueWEuYWRtaW4iIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5JUFJhbmdlcyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2VzLmp4IiBtZW51PSJ0cnVlIj4NCi0gICAgICAgIDx0YWIgZ3JvdXA9ImFkbWluIiBuYW1lPSJpcFJhbmdlcyIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJhZG1pbi5pcFJhbmdlcyIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tc2VydmVyU3RhdHVzLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tc2VydmVyU3RhdHVzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmExZjQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXNlcnZlclN0YXR1cy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi5zZXJ2ZXJTdGF0dXMnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYWRtaW4uc2VydmVyU3RhdHVzIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5EdW1teVVzZWNhc2UiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9zZXJ2ZXJTdGF0dXMuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9InNlcnZlclN0YXR1cyIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJhZG1pbi5zZXJ2ZXJTdGF0dXMiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXNlc3Npb25zLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tc2Vzc2lvbnMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNmYwZmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tc2Vzc2lvbnMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+Ci08IS0tCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcwotLS0+Ci0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2FkbWluLnNlc3Npb25zJ10iPgotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYWRtaW4uc2Vzc2lvbnMiIGxvZ2dlcj0ibGVueWEuYWRtaW4iIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5TZXNzaW9uVmlld2VyIj4KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9zZXNzaW9ucy5qeCIgbWVudT0idHJ1ZSI+Ci0gICAgICAgIDx0YWIgZ3JvdXA9ImFkbWluIiBuYW1lPSJzZXNzaW9ucyIvPgotICAgICAgPC92aWV3PgotICAgICAgPGV4aXQgdXNlY2FzZT0iYWRtaW4uc2Vzc2lvbnMiLz4KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLSAgPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXNpdGVPdmVydmlldy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXNpdGVPdmVydmlldy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0ZGJkNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi1zaXRlT3ZlcnZpZXcueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4uc2l0ZU92ZXJ2aWV3J10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLnNpdGVPdmVydmlldyIgbG9nZ2VyPSJsZW55YS5hZG1pbiIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuU2l0ZU92ZXJ2aWV3Ij4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvc2l0ZU92ZXJ2aWV3Lmp4IiBtZW51PSJ0cnVlIj4NCi0gICAgICAgIDx0YWIgZ3JvdXA9ImFkbWluIiBuYW1lPSJzaXRlT3ZlcnZpZXciLz4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPGV4aXQgdXNlY2FzZT0iYWRtaW4uc2l0ZU92ZXJ2aWV3Ii8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi11c2VjYXNlcy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXVzZWNhc2VzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGIzNDliLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXVzZWNhc2VzLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2FkbWluLnVzZWNhc2VzJ10iPg0KLQ0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImFkbWluLnVzZWNhc2VzIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuVXNlY2FzZXMiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy91c2VjYXNlcy5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0idXNlY2FzZXMiLz4NCi0gICAgICA8L3ZpZXc+Ci0gICAgICA8ZXhpdCB1c2VjYXNlPSJhZG1pbi51c2VjYXNlcyIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gICAgDQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXVzZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi11c2VyLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDVhZTc3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXVzZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4udXNlcnMnXSI+DQotDQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYWRtaW4udXNlciIgbG9nZ2VyPSJsZW55YS5hZG1pbiIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzLlVzZXIiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy91c2VyLmp4IiBtZW51PSJ0cnVlIj4NCi0gICAgICAgIDx0YWIgZ3JvdXA9ImFkbWluIiBuYW1lPSJ1c2VycyIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJhZG1pbi51c2VycyIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gICAgDQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXVzZXJHcm91cHMueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi11c2VyR3JvdXBzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTg4OTg0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWFkbWluLXVzZXJHcm91cHMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWRtaW4udXNlckdyb3VwcyddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJhZG1pbi51c2VyR3JvdXBzIiBsb2dnZXI9ImxlbnlhLmFkbWluIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuVXNlckdyb3VwcyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3VzZXJHcm91cHMuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9InVzZXJzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLnVzZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VySWQiLz4NCi0gICAgICA8L2V4aXQ+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tdXNlclByb2ZpbGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi11c2VyUHJvZmlsZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwMTgwYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi11c2VyUHJvZmlsZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi51c2VyUHJvZmlsZSddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJhZG1pbi51c2VyUHJvZmlsZSIgbG9nZ2VyPSJsZW55YS5hZG1pbiIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzLlVzZXJQcm9maWxlIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvdXNlclByb2ZpbGUuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9InVzZXJzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLnVzZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VySWQiLz4NCi0gICAgICA8L2V4aXQ+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYWRtaW4tdXNlcnMueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi11c2Vycy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjNDZiZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hZG1pbi11c2Vycy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdhZG1pbi51c2VycyddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJhZG1pbi51c2VycyIgbG9nZ2VyPSJsZW55YS5hZG1pbiIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzLlVzZXJzIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvdXNlcnMuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9InVzZXJzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9ImFkbWluLnVzZXJzIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTY3YjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmFkbWluaXN0cmF0aW9uPC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5hYyIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5hY3VzZWNhc2VzIi8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmxkYXAiLz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5BZG1pbmlzdHJhdGlvbjwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+QWRtaW5pc3RyYXRpb24gdXNlY2FzZXM8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0Fic3RyYWN0Q2hhbmdlUGFzc3dvcmQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQWJzdHJhY3RDaGFuZ2VQYXNzd29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWM3NGViLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQWJzdHJhY3RDaGFuZ2VQYXNzd29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotCi0KLS8qKgotICogVXNlY2FzZSB0byBjaGFuZ2UgYSB1c2VyJ3MgcGFzc3dvcmQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoYW5nZVBhc3N3b3JkIGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BBU1NXT1JEID0gIm5ld1Bhc3N3b3JkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSVJNX1BBU1NXT1JEID0gImNvbmZpcm1QYXNzd29yZCI7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVXNlciBnZXRVc2VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotICAgICAgICBjaGVja05ld1Bhc3N3b3JkKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgICAgIGdldFVzZXIoKS5zZXRQYXNzd29yZChnZXRQYXJhbWV0ZXJBc1N0cmluZyhORVdfUEFTU1dPUkQpKTsKLSAgICAgICAgZ2V0VXNlcigpLnNhdmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgYSBwYXNzd29yZCBhbmQgYSBjb25maXJtZWQgcGFzc3dvcmQuCi0gICAgICogQHBhcmFtIHVzZWNhc2UgVGhlIHVzZWNhc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNoZWNrTmV3UGFzc3dvcmQoQWNjZXNzQ29udHJvbFVzZWNhc2UgdXNlY2FzZSkgewotICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSB1c2VjYXNlLmdldFBhcmFtZXRlckFzU3RyaW5nKE5FV19QQVNTV09SRCk7Ci0gICAgICAgIFN0cmluZyBjb25maXJtUGFzc3dvcmQgPSB1c2VjYXNlLmdldFBhcmFtZXRlckFzU3RyaW5nKENPTkZJUk1fUEFTU1dPUkQpOwotCi0gICAgICAgIGlmICghcGFzc3dvcmQuZXF1YWxzKGNvbmZpcm1QYXNzd29yZCkpIHsKLSAgICAgICAgICAgIHVzZWNhc2UuYWRkRXJyb3JNZXNzYWdlKCJQYXNzd29yZCBhbmQgY29uZmlybWVkIHBhc3N3b3JkIGFyZSBub3QgZXF1YWwuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoKCkgPCA2KSB7Ci0gICAgICAgICAgICB1c2VjYXNlLmFkZEVycm9yTWVzc2FnZSgiVGhlIHBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3Qgc2l4IGNoYXJhY3RlcnMgbG9uZy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGFzc3dvcmQubWF0Y2hlcygiLipcXGQuKiIpKSB7Ci0gICAgICAgICAgICB1c2VjYXNlLmFkZEVycm9yTWVzc2FnZSgiVGhlIHBhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgbnVtYmVyLiIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0FjY2Vzc0NvbnRyb2wuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQWNjZXNzQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMyNzQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQWNjZXNzQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLlByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSVBSYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkNyZWRlbnRpYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Nb2RpZmlhYmxlUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSW5oZXJpdGluZ1BvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Xb3JsZDsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGRpc3BsYXkgdGhlIEFjY2Vzc0NvbnRyb2wgdGFiIGluIHRoZSBzaXRlIGFyZWEgZm9yIGEgZG9jdW1lbnQuCi0gKiBUaGlzIGlzIGEgbWl4LWluIGNsYXNzIHRoYXQgaWRlYWxseSB3b3VsZCBpbmhlcml0IGJvdGggZnJvbQotICogQWNjZXNzQ29udHJvbFVzZWNhc2UgYW5kIERvY3VtZW50VXNlY2FzZS4gRklYTUUgaSBqdXN0IHRvb2sgdGhlIGFwcHJvcHJpYXRlCi0gKiBjb2RlIGZyb20gRG9jdW1lbnRVc2VjYXNlLCBtYXliZSBpdHMgcG9zc2libGUgdG8gaGF2ZSBhIHNhbmVyIGluaGVyaXRhbmNlPwotICogCi0gKiBAdmVyc2lvbiAkSWQ6IEFjY2Vzc0NvbnRyb2wuamF2YSA0MDg3MDIgMjAwNi0wNS0yMiAxNjowMzo0OVogYW5kcmVhcyAkCi0gKi8KLQotcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2wgZXh0ZW5kcyBBY2Nlc3NDb250cm9sVXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ19BUkVBID0gImFjQXJlYSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gImRlbGV0ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVAgPSAidXAiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPV04gPSAiZG93biI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJ1c2VyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUCA9ICJncm91cCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBSQU5HRSA9ICJpcFJhbmdlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JMRCA9ICJ3b3JsZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRSA9ICJyb2xlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVVNFUiA9ICJzdWJ1c2VyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfR1JPVVAgPSAic3ViZ3JvdXAiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9JUFJBTkdFID0gInN1YmlwUmFuZ2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdHlwZXMgPSB7IFVTRVIsIEdST1VQLCBJUFJBTkdFLCBTVUJfVVNFUiwgU1VCX0dST1VQLCBTVUJfSVBSQU5HRSwgV09STEQgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBvcGVyYXRpb25zID0geyBBREQsIERFTEVURSwgRE9XTiwgVVAgfTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTCA9ICJzc2wiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQ0VTVE9SX1NTTCA9ICJhbmNlc3RvclNzbCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlQgPSAiZG9jdW1lbnQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9DUkVERU5USUFMUyA9ICJzdWJDcmVkZW50aWFscyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0NSRURFTlRJQUxTID0gInBhcmVudENyZWRlbnRpYWxzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EID0gIm1ldGhvZCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgQ09NUExFVEVfQVJFQSA9ICJwcml2YXRlLmNvbXBsZXRlQXJlYSI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2luaXRQYXJhbWV0ZXJzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBVUkxJbmZvcm1hdGlvbihnZXRTb3VyY2VVUkwoKSk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoQ09NUExFVEVfQVJFQSwgaW5mby5nZXRDb21wbGV0ZUFyZWEoKSk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBnZXREb2N1bWVudEZhY3RvcnkoKTsKLSAgICAgICAgICAgIGlmIChtYXAuaXNEb2N1bWVudChnZXRTb3VyY2VVUkwoKSkpIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBzb3VyY2VEb2N1bWVudCA9IG1hcC5nZXRGcm9tVVJMKGdldFNvdXJjZVVSTCgpKTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRE9DVU1FTlQsIHNvdXJjZURvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFNTTCwgQm9vbGVhbi50b1N0cmluZyhpc1NTTFByb3RlY3RlZCgpKSk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoQU5DRVNUT1JfU1NMLCBCb29sZWFuLnRvU3RyaW5nKGlzQW5jZXN0b3JTU0xQcm90ZWN0ZWQoKSkpOwotCi0gICAgICAgICAgICBVc2VyW10gdXNlcnMgPSBnZXRVc2VyTWFuYWdlcigpLmdldFVzZXJzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB1c2VySWRzID0gbmV3IFN0cmluZ1t1c2Vycy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHVzZXJJZHNbaV0gPSB1c2Vyc1tpXS5nZXRJZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXJyYXlzLnNvcnQodXNlcklkcyk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoInVzZXJzIiwgdXNlcklkcyk7Ci0KLSAgICAgICAgICAgIEdyb3VwW10gZ3JvdXBzID0gZ2V0R3JvdXBNYW5hZ2VyKCkuZ2V0R3JvdXBzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBncm91cElkcyA9IG5ldyBTdHJpbmdbZ3JvdXBzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGdyb3VwSWRzW2ldID0gZ3JvdXBzW2ldLmdldElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBcnJheXMuc29ydChncm91cElkcyk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoImdyb3VwcyIsIGdyb3VwSWRzKTsKLQotICAgICAgICAgICAgSVBSYW5nZVtdIGlwUmFuZ2VzID0gZ2V0SXBSYW5nZU1hbmFnZXIoKS5nZXRJUFJhbmdlcygpOwotICAgICAgICAgICAgU3RyaW5nW10gaXBSYW5nZUlkcyA9IG5ldyBTdHJpbmdbaXBSYW5nZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXBSYW5nZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpcFJhbmdlSWRzW2ldID0gaXBSYW5nZXNbaV0uZ2V0SWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5cy5zb3J0KGlwUmFuZ2VJZHMpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJpcFJhbmdlcyIsIGlwUmFuZ2VJZHMpOwotCi0gICAgICAgICAgICBSb2xlW10gcm9sZXMgPSBnZXRSb2xlTWFuYWdlcigpLmdldFJvbGVzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmlzaXRvclJvbGUgPSAiIjsKLSAgICAgICAgICAgIFNldCByb2xlSWRzID0gbmV3IFRyZWVTZXQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocm9sZXNbaV0uaXNBc3NpZ25hYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcm9sZUlkcy5hZGQocm9sZXNbaV0uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlc1tpXS5nZXRJZCgpLmVxdWFscygidmlzaXQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRvclJvbGUgPSByb2xlc1tpXS5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJyb2xlcyIsIHJvbGVJZHMudG9BcnJheShuZXcgU3RyaW5nW3JvbGVJZHMuc2l6ZSgpXSkpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJ2aXNpdG9yUm9sZSIsIHZpc2l0b3JSb2xlKTsKLQotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFNVQl9DUkVERU5USUFMUywgZ2V0U3VidHJlZUNyZWRlbnRpYWxzKCkpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFBBUkVOVF9DUkVERU5USUFMUywgZ2V0UGFyZW50Q3JlZGVudGlhbHMoKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiQ291bGQgbm90IHJlYWQgYSB2YWx1ZS4iKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJDb3VsZCBub3QgcmVhZCB2YWx1ZSBmb3IgQWNjZXNzQ29udHJvbCB1c2VjYXNlLiAiLCBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgVVJMSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBVUkxJbmZvcm1hdGlvbihnZXRTb3VyY2VVUkwoKSk7Ci0gICAgICAgIFN0cmluZyBhY0FyZWEgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhBQ19BUkVBKTsKLSAgICAgICAgaWYgKCFhY0FyZWEuZXF1YWxzKFB1YmxpY2F0aW9uLkxJVkVfQVJFQSkgJiYgIWluZm8uZ2V0QXJlYSgpLmVxdWFscyhhY0FyZWEpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgdXNlY2FzZSBjYW4gb25seSBiZSBpbnZva2VkIGluIHRoZSBjb25maWd1cmVkIGFyZWEuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9wZXJhdGlvbnMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHR5cGVzW2ldOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBvcGVyYXRpb25zW2pdICsgIkNyZWRlbnRpYWxfIiArIHR5cGU7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFBhcmFtZXRlckFzU3RyaW5nKHBhcmFtTmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm9sZUlkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoUk9MRSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICBBY2NyZWRpdGFibGUgaXRlbSA9IGdldEFjY3JlZGl0YWJsZSh0eXBlLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgibm9fc3VjaF9hY2NyZWRpdGFibGUiLCBuZXcgU3RyaW5nW10geyB0eXBlLCBpZCB9KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvbGUgcm9sZSA9IGdldFJvbGVNYW5hZ2VyKCkuZ2V0Um9sZShyb2xlSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgicm9sZV9ub19zdWNoX3JvbGUiLCBuZXcgU3RyaW5nW10geyByb2xlSWQgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvbGUuaXNBc3NpZ25hYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoImNhbm5vdC1hc3NpZ24tcm9sZSIsIG5ldyBTdHJpbmdbXSB7IHJvbGVJZCB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25zW2pdLmVxdWFscyhBREQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVBvbGljeSBwb2xpY3kgPSBnZXRQb2xpY3koKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNDcmVkZW50aWFsKHBvbGljeSwgaXRlbSwgcm9sZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJjcmVkZW50aWFsLWFscmVhZHktY29udGFpbmVkIiwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEl0ZW0pIGl0ZW0pLmdldElkKCksIHJvbGUuZ2V0SWQoKSB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIocGFyYW1OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgICAgIGlmIChnZXRQYXJhbWV0ZXJBc1N0cmluZygiY2hhbmdlX3NzbCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzc2wgPSBnZXRCb29sZWFuQ2hlY2tib3hQYXJhbWV0ZXIoInNzbCIpOwotICAgICAgICAgICAgc2V0U1NMUHJvdGVjdGVkKEJvb2xlYW4udmFsdWVPZihzc2wpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgb3BlcmF0aW9ucy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gdHlwZXNbaV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IG9wZXJhdGlvbnNbal0gKyAiQ3JlZGVudGlhbF8iICsgdHlwZTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0UGFyYW1ldGVyQXNTdHJpbmcocGFyYW1OYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByb2xlSWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhST0xFKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKE1FVEhPRCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICBBY2NyZWRpdGFibGUgaXRlbSA9IGdldEFjY3JlZGl0YWJsZSh0eXBlLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIFJvbGUgcm9sZSA9IGdldFJvbGVNYW5hZ2VyKCkuZ2V0Um9sZShyb2xlSWQpOwotICAgICAgICAgICAgICAgICAgICBtYW5pcHVsYXRlQ3JlZGVudGlhbChpdGVtLCByb2xlLCBvcGVyYXRpb25zW2pdLCBtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoU1VCX0NSRURFTlRJQUxTLCBnZXRTdWJ0cmVlQ3JlZGVudGlhbHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVBhcmFtZXRlcihwYXJhbU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBBY2NyZWRpdGFibGUgZ2V0QWNjcmVkaXRhYmxlKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgQWNjcmVkaXRhYmxlIGl0ZW0gPSBudWxsOwotICAgICAgICBpZiAodHlwZS5lcXVhbHMoVVNFUikpIHsKLSAgICAgICAgICAgIGl0ZW0gPSBnZXRVc2VyTWFuYWdlcigpLmdldFVzZXIoaWQpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEdST1VQKSkgewotICAgICAgICAgICAgaXRlbSA9IGdldEdyb3VwTWFuYWdlcigpLmdldEdyb3VwKGlkKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhJUFJBTkdFKSkgewotICAgICAgICAgICAgaXRlbSA9IGdldElwUmFuZ2VNYW5hZ2VyKCkuZ2V0SVBSYW5nZShpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoV09STEQpKSB7Ci0gICAgICAgICAgICBpdGVtID0gV29ybGQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIG9uZSBvZiB0aGUgYW5jZXN0b3JzIG9mIHRoaXMgVVJMIGlzIFNTTCBwcm90ZWN0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBbmNlc3RvclNTTFByb3RlY3RlZCgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBzc2w7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgYW5jZXN0b3JVcmwgPSAiIjsKLSAgICAgICAgICAgIGludCBsYXN0U2xhc2hJbmRleCA9IGdldFBvbGljeVVSTCgpLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhbmNlc3RvclVybCA9IGdldFBvbGljeVVSTCgpLnN1YnN0cmluZygwLCBsYXN0U2xhc2hJbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBnZXRQb2xpY3lNYW5hZ2VyKCkuZ2V0UG9saWN5KGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwgYW5jZXN0b3JVcmwpOwotICAgICAgICAgICAgc3NsID0gcG9saWN5LmlzU1NMUHJvdGVjdGVkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIlJlc29sdmluZyBwb2xpY3kgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3NsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgb25lIG9mIHRoZSBhbmNlc3RvcnMgb2YgdGhpcyBVUkwgaXMgU1NMIHByb3RlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NTTFByb3RlY3RlZCgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBzc2w7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQb2xpY3kgcG9saWN5ID0gZ2V0UG9saWN5TWFuYWdlcigpLmdldFBvbGljeShnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCksIGdldFBvbGljeVVSTCgpKTsKLSAgICAgICAgICAgIHNzbCA9IHBvbGljeS5pc1NTTFByb3RlY3RlZCgpOwotICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJSZXNvbHZpbmcgcG9saWN5IGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNzbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGlmIHRoaXMgVVJMIGlzIFNTTCBwcm90ZWN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNzbCBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U1NMUHJvdGVjdGVkKGJvb2xlYW4gc3NsKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNb2RpZmlhYmxlUG9saWN5IHBvbGljeSA9IGdldFBvbGljeSgpOwotICAgICAgICAgICAgcG9saWN5LnNldFNTTChzc2wpOwotICAgICAgICAgICAgZ2V0UG9saWN5TWFuYWdlcigpLnNhdmVTdWJ0cmVlUG9saWN5KGdldFBvbGljeVVSTCgpLCBwb2xpY3kpOwotICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJSZXNvbHZpbmcgcG9saWN5IGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW5oZXJpdGluZ1BvbGljeU1hbmFnZXIgZ2V0UG9saWN5TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIChJbmhlcml0aW5nUG9saWN5TWFuYWdlcikgZ2V0QWNjZXNzQ29udHJvbGxlcigpLmdldFBvbGljeU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQWNjcmVkaXRhYmxlTWFuYWdlciBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gZ2V0QWNjZXNzQ29udHJvbGxlcigpLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2VzIGEgY3JlZGVudGlhbCBieSBhZGRpbmcgb3IgZGVsZXRpbmcgYW4gaXRlbSBmb3IgYSByb2xlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY2NyZWRpdGFibGUgVGhlIGFjY3JlZGl0YWJsZSB0byBhZGQgb3IgZGVsZXRlLgotICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlLgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiwgZWl0aGVyIHtAbGluayAjQUREfW9yIHtAbGluayAjREVMRVRFfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFuaXB1bGF0ZUNyZWRlbnRpYWwoQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSwgUm9sZSByb2xlLCBTdHJpbmcgb3BlcmF0aW9uLAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTW9kaWZpYWJsZVBvbGljeSBwb2xpY3kgPSBnZXRQb2xpY3koKTsKLQotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5lcXVhbHMoQUREKSkgewotICAgICAgICAgICAgICAgIHBvbGljeS5hZGRSb2xlKGFjY3JlZGl0YWJsZSwgcm9sZSwgbWV0aG9kKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLmVxdWFscyhERUxFVEUpKSB7Ci0gICAgICAgICAgICAgICAgcG9saWN5LnJlbW92ZVJvbGUoYWNjcmVkaXRhYmxlLCByb2xlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLmVxdWFscyhVUCkpIHsKLSAgICAgICAgICAgICAgICBwb2xpY3kubW92ZVJvbGVVcChhY2NyZWRpdGFibGUsIHJvbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24uZXF1YWxzKERPV04pKSB7Ci0gICAgICAgICAgICAgICAgcG9saWN5Lm1vdmVSb2xlRG93bihhY2NyZWRpdGFibGUsIHJvbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0UG9saWN5TWFuYWdlcigpLnNhdmVTdWJ0cmVlUG9saWN5KGdldFBvbGljeVVSTCgpLCBwb2xpY3kpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiTWFuaXB1bGF0aW5nIGNyZWRlbnRpYWwgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNb2RpZmlhYmxlUG9saWN5IGdldFBvbGljeSgpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChNb2RpZmlhYmxlUG9saWN5KSBnZXRQb2xpY3lNYW5hZ2VyKCkuYnVpbGRTdWJ0cmVlUG9saWN5KGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBnZXRQb2xpY3lVUkwoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNDcmVkZW50aWFsKE1vZGlmaWFibGVQb2xpY3kgcG9saWN5LCBBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlLAotICAgICAgICAgICAgUm9sZSByb2xlKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIENyZWRlbnRpYWxbXSBjcmVkZW50aWFscyA9IHBvbGljeS5nZXRDcmVkZW50aWFscygpOwotICAgICAgICBib29sZWFuIGNvbnRhaW5zID0gZmFsc2U7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKCFjb250YWlucyAmJiBpIDwgY3JlZGVudGlhbHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBBY2NyZWRpdGFibGUgY3JlZEFjY3IgPSBjcmVkZW50aWFsc1tpXS5nZXRBY2NyZWRpdGFibGUoKTsKLSAgICAgICAgICAgIFJvbGUgY3JlZFJvbGUgPSBjcmVkZW50aWFsc1tpXS5nZXRSb2xlKCk7Ci0gICAgICAgICAgICBjb250YWlucyA9IGNyZWRBY2NyLmVxdWFscyhhY2NyZWRpdGFibGUpICYmIGNyZWRSb2xlLmVxdWFscyhyb2xlKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGFpbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3JlZGVudGlhbCB3cmFwcGVycyBmb3IgdGhlIHJlcXVlc3Qgb2YgdGhpcyBvYmplY3QgbW9kZWwuCi0gICAgICogCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBDcmVkZW50aWFsV3JhcHBlcnMuCi0gICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIENyZWRlbnRpYWxXcmFwcGVyW10gZ2V0U3VidHJlZUNyZWRlbnRpYWxzKCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0Q3JlZGVudGlhbHModHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3JlZGVudGlhbCB3cmFwcGVycyBmb3IgdGhlIHBhcmVudCBVUkkgb2YgdGhlIFVSTCBiZWxvbmdpbmcKLSAgICAgKiB0byB0aGUgcmVxdWVzdCBvZiB0aGlzIG9iamVjdCBtb2RlbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIENyZWRlbnRpYWxXcmFwcGVycy4KLSAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3JlZGVudGlhbFdyYXBwZXJbXSBnZXRQYXJlbnRDcmVkZW50aWFscygpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldENyZWRlbnRpYWxzKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjcmVkZW50aWFscyBvZiB0aGUgcG9saWN5IG9mIHRoZSBzZWxlY3RlZCBVUkwuCi0gICAgICogCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBDcmVkZW50aWFsV3JhcHBlcnMuCi0gICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIENyZWRlbnRpYWxXcmFwcGVyW10gZ2V0Q3JlZGVudGlhbHMoYm9vbGVhbiBpbmhlcml0KSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTGlzdCBjcmVkZW50aWFscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBNb2RpZmlhYmxlUG9saWN5IHBvbGljaWVzW10gPSBnZXRQb2xpY2llcyhpbmhlcml0KTsKLSAgICAgICAgTGlzdCBwb2xpY3lDcmVkZW50aWFscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2xpY2llcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ3JlZGVudGlhbFtdIGNyZWRzOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjcmVkcyA9IHBvbGljaWVzW2ldLmdldENyZWRlbnRpYWxzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjcmVkcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBwb2xpY3lDcmVkZW50aWFscy5hZGQoY3JlZHNbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gLSByZWNlaXZpbmcgY3JlZGVudGlhbCBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvbGljeUNyZWRlbnRpYWxzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gKENyZWRlbnRpYWwpIGkubmV4dCgpOwotICAgICAgICAgICAgQWNjcmVkaXRhYmxlIGFjY3JlZGl0YWJsZSA9IGNyZWRlbnRpYWwuZ2V0QWNjcmVkaXRhYmxlKCk7Ci0gICAgICAgICAgICBSb2xlIHJvbGUgPSBjcmVkZW50aWFsLmdldFJvbGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSBjcmVkZW50aWFsLmdldE1ldGhvZCgpOwotICAgICAgICAgICAgY3JlZGVudGlhbHMuYWRkKG5ldyBDcmVkZW50aWFsV3JhcHBlcihhY2NyZWRpdGFibGUsIHJvbGUsIG1ldGhvZCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoQ3JlZGVudGlhbFdyYXBwZXJbXSkgY3JlZGVudGlhbHMudG9BcnJheShuZXcgQ3JlZGVudGlhbFdyYXBwZXJbY3JlZGVudGlhbHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9saWNpZXMgZm9yIGEgY2VydGFpbiBVUkwuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluaGVyaXQgSWYgdHJ1ZSwgYWxsIGFuY2VzdG9yIHBvbGljaWVzIGFyZSByZXR1cm5lZC4gT3RoZXJ3aXNlLAotICAgICAqICAgICAgICAgICAgb25seSB0aGUgVVJMIHBvbGljaWVzIGFyZSByZXR1cm5lZC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIERlZmF1bHRQb2xpY3kgb2JqZWN0cy4KLSAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTW9kaWZpYWJsZVBvbGljeVtdIGdldFBvbGljaWVzKGJvb2xlYW4gaW5oZXJpdCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gewotCi0gICAgICAgIE1vZGlmaWFibGVQb2xpY3lbXSBwb2xpY2llczsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGluaGVyaXQpIHsKLSAgICAgICAgICAgICAgICBwb2xpY2llcyA9IG5ldyBNb2RpZmlhYmxlUG9saWN5WzFdOwotICAgICAgICAgICAgICAgIEFjY3JlZGl0YWJsZU1hbmFnZXIgcG9saWN5TWFuYWdlciA9IGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICBwb2xpY2llc1swXSA9IChNb2RpZmlhYmxlUG9saWN5KSBnZXRQb2xpY3lNYW5hZ2VyKCkuYnVpbGRTdWJ0cmVlUG9saWN5KAotICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWFuYWdlciwgZ2V0UG9saWN5VVJMKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5jZXN0b3JVcmwgPSAiIjsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VXJsID0gZ2V0UG9saWN5VVJMKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRVcmwuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VXJsID0gY3VycmVudFVybC5zdWJzdHJpbmcoMCwgY3VycmVudFVybC5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2hJbmRleCA9IGN1cnJlbnRVcmwubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JVcmwgPSBjdXJyZW50VXJsLnN1YnN0cmluZygwLCBsYXN0U2xhc2hJbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFBvbGljeVtdIHBBcnJheSA9IGdldFBvbGljeU1hbmFnZXIoKS5nZXRQb2xpY2llcyhnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvclVybCk7Ci0gICAgICAgICAgICAgICAgcG9saWNpZXMgPSBuZXcgTW9kaWZpYWJsZVBvbGljeVtwQXJyYXkubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBwb2xpY2llc1twb2xpY2llcy5sZW5ndGggLSAxIC0gaV0gPSAoTW9kaWZpYWJsZVBvbGljeSkgcEFycmF5W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwb2xpY2llczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBvbGljeVVSTCgpIHsKLSAgICAgICAgU3RyaW5nIGluZm9VcmwgPSBnZXRTb3VyY2VVUkwoKTsKLSAgICAgICAgVVJMSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBVUkxJbmZvcm1hdGlvbihpbmZvVXJsKTsKLQotICAgICAgICBTdHJpbmcgYXJlYSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKEFDX0FSRUEpOwotICAgICAgICBTdHJpbmcgdXJsID0gIi8iICsgaW5mby5nZXRQdWJsaWNhdGlvbklkKCkgKyAiLyIgKyBhcmVhICsgaW5mby5nZXREb2N1bWVudFVybCgpOwotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9BZGRHcm91cC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9BZGRHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTJiNDIzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQWRkR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW1VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGFkZCBhIGdyb3VwLgotICoKLSAqIEB2ZXJzaW9uICRJZDogQWRkR3JvdXAuamF2YSA0MDczMDUgMjAwNi0wNS0xNyAxNjoyMTo0OVogYW5kcmVhcyAkIAotICovCi1wdWJsaWMgY2xhc3MgQWRkR3JvdXAgZXh0ZW5kcyBBY2Nlc3NDb250cm9sVXNlY2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzLgotICAgICAqIEB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZ3JvdXBJZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKEdyb3VwUHJvZmlsZS5JRCk7Ci0KLSAgICAgICAgR3JvdXAgZXhpc3RpbmdHcm91cCA9IGdldEdyb3VwTWFuYWdlcigpLmdldEdyb3VwKGdyb3VwSWQpOwotCi0gICAgICAgIGlmIChleGlzdGluZ0dyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhpcyBncm91cCBhbHJlYWR5IGV4aXN0cy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghSXRlbVV0aWwuaXNWYWxpZElkKGdyb3VwSWQpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgaXMgbm90IGEgdmFsaWQgZ3JvdXAgSUQuIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoR3JvdXBQcm9maWxlLklEKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhHcm91cFByb2ZpbGUuTkFNRSk7Ci0gICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGdldFBhcmFtZXRlckFzU3RyaW5nKEdyb3VwUHJvZmlsZS5ERVNDUklQVElPTik7Ci0KLSAgICAgICAgR3JvdXAgZ3JvdXAgPSBnZXRHcm91cE1hbmFnZXIoKS5hZGQoaWQpOwotICAgICAgICBncm91cC5zZXROYW1lKG5hbWUpOwotICAgICAgICBncm91cC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIAotICAgICAgICBncm91cC5zYXZlKCk7Ci0gICAgICAgIAotICAgICAgICBzZXRFeGl0UGFyYW1ldGVyKEdyb3VwUHJvZmlsZS5JRCwgaWQpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQWRkSVBSYW5nZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9BZGRJUFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzk2NTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9BZGRJUFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250YWluZXIuQ29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklQUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JdGVtVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5JUFJhbmdlUHJvZmlsZS5QYXJ0OwotCi0vKioKLSAqIFVzZWNhc2UgdG8gYWRkIGFuIElQIHJhbmdlLgotICovCi1wdWJsaWMgY2xhc3MgQWRkSVBSYW5nZSBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKElQUmFuZ2VQcm9maWxlLklEKTsKLQotICAgICAgICBJUFJhbmdlIGV4aXN0aW5nSVBSYW5nZSA9IGdldElwUmFuZ2VNYW5hZ2VyKCkuZ2V0SVBSYW5nZShpZCk7Ci0KLSAgICAgICAgaWYgKGV4aXN0aW5nSVBSYW5nZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgSVAgcmFuZ2UgYWxyZWFkeSBleGlzdHMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIUl0ZW1VdGlsLmlzVmFsaWRJZChpZCkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhpcyBpcyBub3QgYSB2YWxpZCBJUCByYW5nZSBJRC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIElQUmFuZ2VQcm9maWxlLnZhbGlkYXRlQWRkcmVzc2VzKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhJUFJhbmdlUHJvZmlsZS5JRCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoSVBSYW5nZVByb2ZpbGUuTkFNRSk7Ci0gICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGdldFBhcmFtZXRlckFzU3RyaW5nKElQUmFuZ2VQcm9maWxlLkRFU0NSSVBUSU9OKTsKLQotICAgICAgICBJUFJhbmdlIGlwUmFuZ2UgPSBnZXRJcFJhbmdlTWFuYWdlcigpLmFkZChpZCk7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyhpcFJhbmdlLCBnZXRMb2dnZXIoKSk7Ci0KLSAgICAgICAgaXBSYW5nZS5zZXROYW1lKG5hbWUpOwotICAgICAgICBpcFJhbmdlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgbmV0d29ya0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN1Ym5ldEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbmV0d29ya0J1ZmZlci5hcHBlbmQoIi4iKTsKLSAgICAgICAgICAgICAgICBzdWJuZXRCdWZmZXIuYXBwZW5kKCIuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYXJ0IG5ldFBhcnQgPSAoUGFydCkgZ2V0UGFyYW1ldGVyKElQUmFuZ2VQcm9maWxlLk5FVFdPUktfQUREUkVTUyArICItIiArIGkpOwotICAgICAgICAgICAgbmV0d29ya0J1ZmZlci5hcHBlbmQobmV0UGFydC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIFBhcnQgc3ViUGFydCA9IChQYXJ0KSBnZXRQYXJhbWV0ZXIoSVBSYW5nZVByb2ZpbGUuU1VCTkVUX01BU0sgKyAiLSIgKyBpKTsKLSAgICAgICAgICAgIHN1Ym5ldEJ1ZmZlci5hcHBlbmQoc3ViUGFydC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEluZXRBZGRyZXNzIG5ldHdvcmtBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG5ldHdvcmtCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlwUmFuZ2Uuc2V0TmV0d29ya0FkZHJlc3MobmV0d29ya0FkZHJlc3MuZ2V0QWRkcmVzcygpKTsKLQotICAgICAgICBJbmV0QWRkcmVzcyBzdWJuZXRNYXNrID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHN1Ym5ldEJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgaXBSYW5nZS5zZXRTdWJuZXRNYXNrKHN1Ym5ldE1hc2suZ2V0QWRkcmVzcygpKTsKLQotICAgICAgICBpcFJhbmdlLnNhdmUoKTsKLSAgICAgICAgCi0gICAgICAgIHNldEV4aXRQYXJhbWV0ZXIoSVBSYW5nZVByb2ZpbGUuSUQsIGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2luaXRQYXJhbWV0ZXJzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgTGlzdCBwYXJ0TnVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChieXRlIGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoSVBSYW5nZVByb2ZpbGUuTkVUV09SS19BRERSRVNTICsgIi0iICsgaSwgbmV3IFBhcnQoaSkpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKElQUmFuZ2VQcm9maWxlLlNVQk5FVF9NQVNLICsgIi0iICsgaSwgbmV3IFBhcnQoaSkpOwotICAgICAgICAgICAgcGFydE51bWJlcnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgfQotICAgICAgICBzZXRQYXJhbWV0ZXIoSVBSYW5nZVByb2ZpbGUuUEFSVF9OVU1CRVJTLCBwYXJ0TnVtYmVycyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9BZGRVc2VyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0FkZFVzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1YmJkMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0FkZFVzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5sZGFwLkxEQVBVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGFkZCBhIHVzZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogQWRkVXNlci5qYXZhIDQwNzI0OCAyMDA2LTA1LTE3IDEzOjIwOjAxWiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIEFkZFVzZXIgZXh0ZW5kcyBBY2Nlc3NDb250cm9sVXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImNsYXNzTmFtZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERBUF9JRCA9ICJsZGFwSWQiOwotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuCi0gICAgICogQHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB1c2VySWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVc2VyUHJvZmlsZS5VU0VSX0lEKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgZW1haWwgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVc2VyUHJvZmlsZS5FTUFJTCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhDTEFTU19OQU1FKTsKLSAgICAgICAgU3RyaW5nIGxkYXBJZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKExEQVBfSUQpOwotCi0gICAgICAgIFVzZXIgZXhpc3RpbmdVc2VyID0gZ2V0VXNlck1hbmFnZXIoKS5nZXRVc2VyKHVzZXJJZCk7Ci0KLSAgICAgICAgaWYgKGV4aXN0aW5nVXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgdXNlciBhbHJlYWR5IGV4aXN0cy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghSXRlbVV0aWwuaXNWYWxpZElkKHVzZXJJZCkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhpcyBpcyBub3QgYSB2YWxpZCB1c2VyIElELiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFJdGVtVXRpbC5pc1ZhbGlkRW1haWwoZW1haWwpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlBsZWFzZSBlbnRlciBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiSW50ZXJuYWwgZXJyb3IgLSB0aGUgdXNlciBjbGFzcyBuYW1lIGhhcyBub3QgYmVlbiBwcm92aWRlZC4gIiArIAotICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGNvbnN1bHQgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvci4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGFzc05hbWUuZXF1YWxzKExEQVBVc2VyLmNsYXNzLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIExEQVBVc2VyIGxkYXBVc2VyID0gbmV3IExEQVBVc2VyKGdldFVzZXJNYW5hZ2VyKCksIGdldExvZ2dlcigpKTsKLSAgICAgICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyhsZGFwVXNlciwgZ2V0TG9nZ2VyKCkpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghbGRhcFVzZXIuZXhpc3RzVXNlcihsZGFwSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgibGRhcF9ub19zdWNoX3VzZXIiLCBuZXcgU3RyaW5nW117bGRhcElkfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZWNhc2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIENoYW5nZVBhc3N3b3JkLmNoZWNrTmV3UGFzc3dvcmQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkFkZFVzZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSBjYWxsZWQiKTsKLQotICAgICAgICB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSAoRmlsZVVzZXJNYW5hZ2VyKSBnZXRVc2VyTWFuYWdlcigpOwotCi0gICAgICAgIFN0cmluZyB1c2VySWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVc2VyUHJvZmlsZS5VU0VSX0lEKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVc2VyUHJvZmlsZS5GVUxMX05BTUUpOwotICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVc2VyUHJvZmlsZS5ERVNDUklQVElPTik7Ci0gICAgICAgIFN0cmluZyBlbWFpbCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFVzZXJQcm9maWxlLkVNQUlMKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKENMQVNTX05BTUUpOwotCi0gICAgICAgIFVzZXIgdXNlcjsKLSAgICAgICAgaWYgKGNsYXNzTmFtZS5lcXVhbHMoTERBUFVzZXIuY2xhc3MuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgU3RyaW5nIGxkYXBJZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKExEQVBfSUQpOwotICAgICAgICAgICAgdXNlciA9IG5ldyBMREFQVXNlcih1c2VyTWFuYWdlciwgZ2V0TG9nZ2VyKCksIHVzZXJJZCwgZW1haWwsIGxkYXBJZCwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoQWJzdHJhY3RDaGFuZ2VQYXNzd29yZC5ORVdfUEFTU1dPUkQpOwotICAgICAgICAgICAgdXNlciA9IG5ldyBGaWxlVXNlcih1c2VyTWFuYWdlciwgZ2V0TG9nZ2VyKCksIHVzZXJJZCwgZnVsbE5hbWUsIGVtYWlsLCAiIik7Ci0gICAgICAgICAgICB1c2VyLnNldE5hbWUoZnVsbE5hbWUpOwotICAgICAgICAgICAgdXNlci5zZXRQYXNzd29yZChwYXNzd29yZCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKHVzZXIsIGdldExvZ2dlcigpKTsKLSAgICAgICAgdXNlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIHVzZXIuc2F2ZSgpOwotICAgICAgICBnZXRVc2VyTWFuYWdlcigpLmFkZCh1c2VyKTsKLSAgICAgICAgCi0gICAgICAgIHNldEV4aXRQYXJhbWV0ZXIoVXNlclByb2ZpbGUuVVNFUl9JRCwgdXNlcklkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0NoYW5nZVBhc3N3b3JkLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0NoYW5nZVBhc3N3b3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Y2I2YWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9DaGFuZ2VQYXNzd29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gY2hhbmdlIGEgdXNlcidzIHBhc3N3b3JkLiBUaGUgb2xkIHBhc3N3b3JkIGlzIGNoZWNrZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VQYXNzd29yZCBleHRlbmRzIEFic3RyYWN0Q2hhbmdlUGFzc3dvcmQgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX1BBU1NXT1JEID0gIm9sZFBhc3N3b3JkIjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWx3YXlzIHJldHVybnMgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVXNlciBnZXRVc2VyKCkgewotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpLmdldElkZW50aXR5KCkuZ2V0VXNlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCk7Ci0gICAgICAgIGNoZWNrT2xkUGFzc3dvcmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2ZXJpZmllcyB0aGF0IHRoZSB1c2VyIGtub3dzIHRoZSBjdXJyZW50IHBhc3N3b3JkIGJlZm9yZSBzL2hlIGlzIGFsbG93ZWQgdG8gY2hhbmdlIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja09sZFBhc3N3b3JkKCkgewotICAgICAgICBTdHJpbmcgb2xkUGFzc3dvcmQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhPTERfUEFTU1dPUkQpOwotICAgICAgICBib29sZWFuIGF1dGhlbnRpY2F0ZWQgPSBnZXRVc2VyKCkuYXV0aGVudGljYXRlKG9sZFBhc3N3b3JkKTsKLSAgICAgICAgaWYgKCFhdXRoZW50aWNhdGVkKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoZSBvbGQgcGFzc3dvcmQgaXMgbm90IGNvcnJlY3QuIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0NoYW5nZVBhc3N3b3JkQWRtaW4uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQ2hhbmdlUGFzc3dvcmRBZG1pbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU3ODQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQ2hhbmdlUGFzc3dvcmRBZG1pbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gY2hhbmdlIGEgdXNlcidzIHBhc3N3b3JkLgotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlUGFzc3dvcmRBZG1pbiBleHRlbmRzIEFic3RyYWN0Q2hhbmdlUGFzc3dvcmQgewotCi0gICAgcHJpdmF0ZSBVc2VyIHVzZXI7Ci0KLSAgICBwcm90ZWN0ZWQgVXNlciBnZXRVc2VyKCkgewotICAgICAgICBpZiAodGhpcy51c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB1c2VySWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVc2VyUHJvZmlsZS5VU0VSX0lEKTsKLSAgICAgICAgICAgIHRoaXMudXNlciA9IGdldFVzZXJNYW5hZ2VyKCkuZ2V0VXNlcih1c2VySWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnVzZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKGdldFVzZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoZSAiICsgVXNlclByb2ZpbGUuVVNFUl9JRCAKLSAgICAgICAgICAgICAgICArICIgcGFyYW1ldGVyIGhhcyB0byBiZSBwcm92aWRlZCB3aGVuIGV4ZWN1dGluZyB0aGlzIHVzZWNhc2UuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotICAgICAgICBzZXRFeGl0UGFyYW1ldGVyKFVzZXJQcm9maWxlLlVTRVJfSUQsIGdldFBhcmFtZXRlckFzU3RyaW5nKFVzZXJQcm9maWxlLlVTRVJfSUQpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQ3JlZGVudGlhbFdyYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvQ3JlZGVudGlhbFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwN2RiYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0NyZWRlbnRpYWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY3JlZGl0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSVBSYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLQotLyoqCi0gKiBXcmFwcGVyIGNsYXNzIGZvciBjcmVkZW50aWFscy4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIENyZWRlbnRpYWxXcmFwcGVyIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGhvZCBvZiB0aGUgQ3JlZGVudGlhbAotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdGhhdCBpcyBlaXRoZXIgImRlbnkiIG9yICJncmFudCIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNjcmVkaXRhYmxlIElELgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBY2NyZWRpdGFibGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWNjcmVkaXRhYmxlSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNjcmVkaXRhYmxlIG5hbWUuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjY3JlZGl0YWJsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFjY3JlZGl0YWJsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm9sZSBJRC4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZUlkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yb2xlSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm9sZSBuYW1lLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucm9sZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNjcmVkaXRhYmxlIHR5cGUgKHtAbGluayAjVVNFUn0sIHtAbGluayAjR1JPVVB9LCBvciB7QGxpbmsgI0lQUkFOR0V9KQotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGFjY3JlZGl0YWJsZSBUaGUgYWNjcmVkaXRhYmxlIG9mIHRoZSBjcmVkZW50aWFsIHRvIHdyYXAuCi0gICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUgb2YgdGhlIGNyZWRlbnRpYWwgdG8gd3JhcC4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIAotICAgICAqLwotICAgIHB1YmxpYyBDcmVkZW50aWFsV3JhcHBlcihBY2NyZWRpdGFibGUgYWNjcmVkaXRhYmxlLCBSb2xlIHJvbGUsIFN0cmluZyBtZXRob2QpIHsKLSAgICAgICAgaWYgKGFjY3JlZGl0YWJsZSBpbnN0YW5jZW9mIEl0ZW0pIHsKLSAgICAgICAgICAgIEl0ZW0gaXRlbSA9IChJdGVtKSBhY2NyZWRpdGFibGU7Ci0gICAgICAgICAgICB0aGlzLmFjY3JlZGl0YWJsZUlkID0gaXRlbS5nZXRJZCgpOwotICAgICAgICAgICAgdGhpcy5hY2NyZWRpdGFibGVOYW1lID0gaXRlbS5nZXROYW1lKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBVc2VyKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gVVNFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHcm91cCkgewotICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IEdST1VQOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIElQUmFuZ2UpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBJUFJBTkdFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhpcy5hY2NyZWRpdGFibGVJZCA9ICJ3b3JsZCI7Ci0gICAgICAgICAgICB0aGlzLmFjY3JlZGl0YWJsZU5hbWUgPSAidGhlIHdvcmxkIjsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9ICJ3b3JsZCI7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5yb2xlSWQgPSByb2xlLmdldElkKCk7Ci0gICAgICAgIHRoaXMucm9sZU5hbWUgPSByb2xlLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSID0gInVzZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQID0gImdyb3VwIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJUFJBTkdFID0gImlwUmFuZ2UiOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYWNjcmVkaXRhYmxlSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYWNjcmVkaXRhYmxlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyByb2xlSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0RlbGV0ZUdyb3VwLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0RlbGV0ZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NjYyY2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9EZWxldGVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cDsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGRlbGV0ZSBhIGdyb3VwLgotICoKLSAqIEB2ZXJzaW9uICRJZDogRGVsZXRlR3JvdXAuamF2YSA0MDczMDUgMjAwNi0wNS0xNyAxNjoyMTo0OVogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVHcm91cCBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGdyb3VwSWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhHcm91cFByb2ZpbGUuSUQpOwotICAgICAgICBHcm91cCBncm91cCA9IGdldEdyb3VwTWFuYWdlcigpLmdldEdyb3VwKGdyb3VwSWQpOwotICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkdyb3VwIFsiICsgZ3JvdXBJZCArICJdIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZ2V0R3JvdXBNYW5hZ2VyKCkucmVtb3ZlKGdyb3VwKTsKLSAgICAgICAgZ3JvdXAuZGVsZXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9EZWxldGVJUFJhbmdlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0RlbGV0ZUlQUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1YzNkZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0RlbGV0ZUlQUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotLyoqCi0gKiBEZWxldGUgYW4gSVAgcmFuZ2UuCi0gKgotICogQHZlcnNpb24gJElkOiBEZWxldGVJUFJhbmdlLmphdmEgNDA3MzA1IDIwMDYtMDUtMTcgMTY6MjE6NDlaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlSVBSYW5nZSBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoSVBSYW5nZVByb2ZpbGUuSUQpOwotICAgICAgICBvcmcuYXBhY2hlLmxlbnlhLmFjLklQUmFuZ2UgaXBSYW5nZSA9IGdldElwUmFuZ2VNYW5hZ2VyKCkuZ2V0SVBSYW5nZShpZCk7Ci0gICAgICAgIGlmIChpcFJhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJUCByYW5nZSBbIiArIGlkICsgIl0gbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBnZXRJcFJhbmdlTWFuYWdlcigpLnJlbW92ZShpcFJhbmdlKTsKLSAgICAgICAgaXBSYW5nZS5kZWxldGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0RlbGV0ZVVzZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvRGVsZXRlVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzUwMjhlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvRGVsZXRlVXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gZGVsZXRlIGEgdXNlci4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6IERlbGV0ZVVzZXIuamF2YSA0MDczMDUgMjAwNi0wNS0xNyAxNjoyMTo0OVogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVVc2VyIGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLQotICAgICAgICBTdHJpbmcgdXNlcklkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVXNlclByb2ZpbGUuVVNFUl9JRCk7Ci0gICAgICAgIFVzZXIgdXNlciA9IGdldFVzZXJNYW5hZ2VyKCkuZ2V0VXNlcih1c2VySWQpOwotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVXNlciBbIiArIHVzZXJJZCArICJdIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZ2V0VXNlck1hbmFnZXIoKS5yZW1vdmUodXNlcik7Ci0gICAgICAgIHVzZXIuZGVsZXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Hcm91cC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmEzMjliLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotLyoqCi0gKiBEaXNwbGF5IGdyb3VwIGluZm9ybWF0aW9uLgotICoKLSAqIEB2ZXJzaW9uICRJZDogR3JvdXAuamF2YSA0MDczMDUgMjAwNi0wNS0xNyAxNjoyMTo0OVogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cCBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0lEID0gImdyb3VwSWQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQID0gImdyb3VwIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI3NldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKEdST1VQX0lEKSkgewotICAgICAgICAgICAgU3RyaW5nIGdyb3VwSWQgPSAoU3RyaW5nKSB2YWx1ZTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXAgZ3JvdXAgPSBnZXRHcm91cE1hbmFnZXIoKS5nZXRHcm91cChncm91cElkKTsKLSAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJncm91cF9ub19zdWNoX2VudHJ5IiwgbmV3IFN0cmluZ1tde2dyb3VwSWR9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKEdST1VQLCBncm91cCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0dyb3VwTWVtYmVycy5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Hcm91cE1lbWJlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyZmU3MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0dyb3VwTWVtYmVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gY2hhbmdlIHRoZSBtZW1iZXJzIG9mIGEgZ3JvdXAuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogR3JvdXBNZW1iZXJzLmphdmEgNDA3MzA1IDIwMDYtMDUtMTcgMTY6MjE6NDlaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBNZW1iZXJzIGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfVVNFUlMgPSAiZ3JvdXBVc2VycyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfVVNFUlMgPSAib3RoZXJVc2VycyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfVVNFUiA9ICJncm91cFVzZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9USEVSX1VTRVIgPSAib3RoZXJVc2VyIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICAKLSAgICAgICAgR3JvdXBhYmxlW10gbWVtYmVycyA9IGdldEdyb3VwKCkuZ2V0TWVtYmVycygpOwotICAgICAgICBMaXN0IGdyb3VwVXNlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG1lbWJlcnNbaV0gaW5zdGFuY2VvZiBVc2VyKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBVc2Vycy5hZGQobWVtYmVyc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0UGFyYW1ldGVyKEdST1VQX1VTRVJTLCBncm91cFVzZXJzKTsKLQotICAgICAgICBVc2VyW10gYWxsVXNlcnMgPSBnZXRVc2VyTWFuYWdlcigpLmdldFVzZXJzKCk7Ci0KLSAgICAgICAgTGlzdCBvdGhlclVzZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFVzZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWdyb3VwVXNlcnMuY29udGFpbnMoYWxsVXNlcnNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgb3RoZXJVc2Vycy5hZGQoYWxsVXNlcnNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihPVEhFUl9VU0VSUywgb3RoZXJVc2Vycyk7Ci0gICAgICAgIAotICAgICAgICBzZXRFeGl0UGFyYW1ldGVyKEdyb3VwUHJvZmlsZS5JRCwgZ2V0UGFyYW1ldGVyQXNTdHJpbmcoR3JvdXBQcm9maWxlLklEKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLQotICAgICAgICBmaW5hbCBHcm91cCBncm91cCA9IGdldEdyb3VwKCk7Ci0gICAgICAgIGdyb3VwLnJlbW92ZUFsbE1lbWJlcnMoKTsKLQotICAgICAgICBMaXN0IGdyb3VwVXNlcnMgPSAoTGlzdCkgZ2V0UGFyYW1ldGVyKEdST1VQX1VTRVJTKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ3JvdXBVc2Vycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGdyb3VwLmFkZCh1c2VyKTsKLSAgICAgICAgICAgIHVzZXIuc2F2ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjYWR2YW5jZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWR2YW5jZSgpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuYWR2YW5jZSgpOwotCi0gICAgICAgIFN0cmluZyBhZGQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhBREQpOwotICAgICAgICBTdHJpbmcgcmVtb3ZlID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoUkVNT1ZFKTsKLSAgICAgICAgaWYgKGFkZCAhPSBudWxsIHx8IHJlbW92ZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIExpc3QgZ3JvdXBVc2VycyA9IChMaXN0KSBnZXRQYXJhbWV0ZXIoR1JPVVBfVVNFUlMpOwotICAgICAgICAgICAgTGlzdCBvdGhlclVzZXJzID0gKExpc3QpIGdldFBhcmFtZXRlcihPVEhFUl9VU0VSUyk7Ci0KLSAgICAgICAgICAgIGlmIChhZGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VySWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhPVEhFUl9VU0VSKTsKLSAgICAgICAgICAgICAgICBpZiAodXNlcklkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJhZGQgdXNlciBbIiArIHVzZXJJZCArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgVXNlciB1c2VyID0gZ2V0VXNlck1hbmFnZXIoKS5nZXRVc2VyKHVzZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwVXNlcnMuYWRkKHVzZXIpOwotICAgICAgICAgICAgICAgICAgICBvdGhlclVzZXJzLnJlbW92ZSh1c2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZW1vdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VySWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhHUk9VUF9VU0VSKTsKLSAgICAgICAgICAgICAgICBpZiAodXNlcklkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJyZW1vdmUgdXNlciBbIiArIHVzZXJJZCArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgVXNlciB1c2VyID0gZ2V0VXNlck1hbmFnZXIoKS5nZXRVc2VyKHVzZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyVXNlcnMuYWRkKHVzZXIpOwotICAgICAgICAgICAgICAgICAgICBncm91cFVzZXJzLnJlbW92ZSh1c2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlbGV0ZVBhcmFtZXRlcihBREQpOwotICAgICAgICAgICAgZGVsZXRlUGFyYW1ldGVyKFJFTU9WRSk7Ci0gICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoR1JPVVBfVVNFUik7Ci0gICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoT1RIRVJfVVNFUik7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgR3JvdXAgZ2V0R3JvdXAoKSB7Ci0gICAgICAgIFN0cmluZyBncm91cElkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoR3JvdXBQcm9maWxlLklEKTsKLSAgICAgICAgR3JvdXAgZ3JvdXAgPSBnZXRHcm91cE1hbmFnZXIoKS5nZXRHcm91cChncm91cElkKTsKLSAgICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJHcm91cCBbIiArIGdyb3VwSWQgKyAiXSBub3QgZm91bmQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdyb3VwOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvR3JvdXBQcm9maWxlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0dyb3VwUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTY1ZGM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvR3JvdXBQcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gY2hhbmdlIHRoZSBwcm9maWxlIG9mIGEgZ3JvdXAuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogR3JvdXBQcm9maWxlLmphdmEgNDA3MzA1IDIwMDYtMDUtMTcgMTY6MjE6NDlaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBQcm9maWxlIGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiZ3JvdXBJZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7Ci0KLSAgICBwcml2YXRlIEdyb3VwIGdyb3VwOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoTkFNRSk7Ci0gICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGdldFBhcmFtZXRlckFzU3RyaW5nKERFU0NSSVBUSU9OKTsKLQotICAgICAgICB0aGlzLmdyb3VwLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHRoaXMuZ3JvdXAuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCi0gICAgICAgIHRoaXMuZ3JvdXAuc2F2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI3NldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKElEKSkgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICB0aGlzLmdyb3VwID0gZ2V0R3JvdXBNYW5hZ2VyKCkuZ2V0R3JvdXAoaWQpOwotICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJHcm91cCBbIiArIGlkICsgIl0gbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoREVTQ1JJUFRJT04sIHRoaXMuZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoTkFNRSwgdGhpcy5ncm91cC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvR3JvdXBzLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0dyb3Vwcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg3NDJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvR3JvdXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cDsKLQotLyoqCi0gKiBNYW5hZ2UgZ3JvdXBzLgotICogCi0gKiBAdmVyc2lvbiAkSWQ6IEdyb3Vwcy5qYXZhIDQwNzMwNSAyMDA2LTA1LTE3IDE2OjIxOjQ5WiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwcyBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUFMgPSAiZ3JvdXBzIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICAKLSAgICAgICAgR3JvdXBbXSBncm91cHMgPSBnZXRHcm91cE1hbmFnZXIoKS5nZXRHcm91cHMoKTsKLSAgICAgICAgTGlzdCBncm91cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGdyb3VwTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChncm91cHMpKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChncm91cExpc3QpOwotICAgICAgICBzZXRQYXJhbWV0ZXIoR1JPVVBTLCBncm91cExpc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvSVBSYW5nZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9JUFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmY2NjMTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9JUFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXM7Ci0KLS8qKgotICogU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBhbiBJUCByYW5nZS4KLSAqIAotICogQHZlcnNpb24gJElkOiBJUFJhbmdlLmphdmEgNDA3MzA1IDIwMDYtMDUtMTcgMTY6MjE6NDlaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgSVBSYW5nZSBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElQX1JBTkdFX0lEID0gImlwUmFuZ2VJZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBfUkFOR0UgPSAiaXBSYW5nZSI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNzZXRQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotCi0gICAgICAgIGlmIChuYW1lLmVxdWFscyhJUF9SQU5HRV9JRCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBpcFJhbmdlSWQgPSAoU3RyaW5nKSB2YWx1ZTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubGVueWEuYWMuSVBSYW5nZSBpcFJhbmdlID0gZ2V0SXBSYW5nZU1hbmFnZXIoKS5nZXRJUFJhbmdlKGlwUmFuZ2VJZCk7Ci0gICAgICAgICAgICBpZiAoaXBSYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJpcHJhbmdlX25vX3N1Y2hfaXByYW5nZSIsIG5ldyBTdHJpbmdbXSB7IGlwUmFuZ2VJZCB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKElQX1JBTkdFLCBpcFJhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0lQUmFuZ2VHcm91cHMuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvSVBSYW5nZUdyb3Vwcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGU3ZjI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvSVBSYW5nZUdyb3Vwcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSVBSYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci0KLS8qKgotICogVXNlY2FzZSB0byBlZGl0IGEgSVAgcmFuZ2UncyBncm91cCBhZmZpbGlhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIElQUmFuZ2VHcm91cHMgZXh0ZW5kcyBBY2Nlc3NDb250cm9sVXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJUF9SQU5HRV9HUk9VUFMgPSAiaXBSYW5nZUdyb3VwcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfR1JPVVBTID0gIm90aGVyR3JvdXBzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJUF9SQU5HRV9HUk9VUCA9ICJpcFJhbmdlR3JvdXAiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9USEVSX0dST1VQID0gIm90aGVyR3JvdXAiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgCi0gICAgICAgIElQUmFuZ2UgaXBSYW5nZSA9IGdldElwUmFuZ2UoKTsKLSAgICAgICAgaXBSYW5nZS5yZW1vdmVGcm9tQWxsR3JvdXBzKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IGlwUmFuZ2VHcm91cHMgPSAoTGlzdCkgZ2V0UGFyYW1ldGVyKElQX1JBTkdFX0dST1VQUyk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGlwUmFuZ2VHcm91cHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgR3JvdXAgZ3JvdXAgPSAoR3JvdXApIGkubmV4dCgpOwotICAgICAgICAgICAgZ3JvdXAuYWRkKGlwUmFuZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGlwUmFuZ2Uuc2F2ZSgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSVBSYW5nZSBnZXRJcFJhbmdlKCkgewotICAgICAgICBTdHJpbmcgaXBSYW5nZUlkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoSVBSYW5nZVByb2ZpbGUuSUQpOwotICAgICAgICBJUFJhbmdlIGlwUmFuZ2UgPSBnZXRJcFJhbmdlTWFuYWdlcigpLmdldElQUmFuZ2UoaXBSYW5nZUlkKTsKLSAgICAgICAgaWYgKGlwUmFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIklQIHJhbmdlIFsiICsgaXBSYW5nZUlkICsgIl0gbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpcFJhbmdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI2FkdmFuY2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkdmFuY2UoKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmFkdmFuY2UoKTsKLQotICAgICAgICBTdHJpbmcgYWRkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoQUREKTsKLSAgICAgICAgU3RyaW5nIHJlbW92ZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFJFTU9WRSk7Ci0gICAgICAgIGlmIChhZGQgIT0gbnVsbCB8fCByZW1vdmUgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBMaXN0IGlwUmFuZ2VHcm91cHMgPSAoTGlzdCkgZ2V0UGFyYW1ldGVyKElQX1JBTkdFX0dST1VQUyk7Ci0gICAgICAgICAgICBMaXN0IG90aGVyR3JvdXBzID0gKExpc3QpIGdldFBhcmFtZXRlcihPVEhFUl9HUk9VUFMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYWRkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXBJZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKE9USEVSX0dST1VQKTsKLSAgICAgICAgICAgICAgICBpZiAoZ3JvdXBJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiYWRkIGdyb3VwIFsiICsgZ3JvdXBJZCArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgR3JvdXAgZ3JvdXAgPSBnZXRHcm91cE1hbmFnZXIoKS5nZXRHcm91cChncm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgaXBSYW5nZUdyb3Vwcy5hZGQoZ3JvdXApOwotICAgICAgICAgICAgICAgICAgICBvdGhlckdyb3Vwcy5yZW1vdmUoZ3JvdXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlbW92ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGdyb3VwSWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhJUF9SQU5HRV9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoInJlbW92ZSBncm91cCBbIiArIGdyb3VwSWQgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gZ2V0R3JvdXBNYW5hZ2VyKCkuZ2V0R3JvdXAoZ3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyR3JvdXBzLmFkZChncm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIGlwUmFuZ2VHcm91cHMucmVtb3ZlKGdyb3VwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRlbGV0ZVBhcmFtZXRlcihBREQpOwotICAgICAgICAgICAgZGVsZXRlUGFyYW1ldGVyKFJFTU9WRSk7Ci0gICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoSVBfUkFOR0VfR1JPVVApOwotICAgICAgICAgICAgZGVsZXRlUGFyYW1ldGVyKE9USEVSX0dST1VQKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIEdyb3VwW10gaXBSYW5nZUdyb3VwQXJyYXkgPSBnZXRJcFJhbmdlKCkuZ2V0R3JvdXBzKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IGlwUmFuZ2VHcm91cHMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoaXBSYW5nZUdyb3VwQXJyYXkpKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKElQX1JBTkdFX0dST1VQUywgaXBSYW5nZUdyb3Vwcyk7Ci0KLSAgICAgICAgR3JvdXBbXSBhbGxHcm91cHMgPSBnZXRHcm91cE1hbmFnZXIoKS5nZXRHcm91cHMoKTsKLSAgICAgICAgTGlzdCBvdGhlckdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxHcm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXBSYW5nZUdyb3Vwcy5jb250YWlucyhhbGxHcm91cHNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgb3RoZXJHcm91cHMuYWRkKGFsbEdyb3Vwc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0UGFyYW1ldGVyKE9USEVSX0dST1VQUywgb3RoZXJHcm91cHMpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvSVBSYW5nZVByb2ZpbGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvSVBSYW5nZVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxYmNlMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0lQUmFuZ2VQcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSVBSYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZTsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGNoYW5nZSB0aGUgcHJvZmlsZSBvZiBhbiBJUCByYW5nZS4KLSAqLwotcHVibGljIGNsYXNzIElQUmFuZ2VQcm9maWxlIGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaXBSYW5nZUlkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX0FERFJFU1MgPSAibmV0d29ya0FkZHJlc3MiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQk5FVF9NQVNLID0gInN1Ym5ldE1hc2siOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfTlVNQkVSUyA9ICJwYXJ0TnVtYmVycyI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJUFJhbmdlUHJvZmlsZS52YWxpZGF0ZUFkZHJlc3Nlcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoTkFNRSk7Ci0gICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGdldFBhcmFtZXRlckFzU3RyaW5nKERFU0NSSVBUSU9OKTsKLQotICAgICAgICBJUFJhbmdlIGlwUmFuZ2UgPSBnZXRJUFJhbmdlKCk7Ci0KLSAgICAgICAgaXBSYW5nZS5zZXROYW1lKG5hbWUpOwotICAgICAgICBpcFJhbmdlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgbmV0d29ya0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN1Ym5ldEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbmV0d29ya0J1ZmZlci5hcHBlbmQoIi4iKTsKLSAgICAgICAgICAgICAgICBzdWJuZXRCdWZmZXIuYXBwZW5kKCIuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYXJ0IG5ldFBhcnQgPSAoUGFydCkgZ2V0UGFyYW1ldGVyKElQUmFuZ2VQcm9maWxlLk5FVFdPUktfQUREUkVTUyArICItIiArIGkpOwotICAgICAgICAgICAgbmV0d29ya0J1ZmZlci5hcHBlbmQobmV0UGFydC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIFBhcnQgc3ViUGFydCA9IChQYXJ0KSBnZXRQYXJhbWV0ZXIoSVBSYW5nZVByb2ZpbGUuU1VCTkVUX01BU0sgKyAiLSIgKyBpKTsKLSAgICAgICAgICAgIHN1Ym5ldEJ1ZmZlci5hcHBlbmQoc3ViUGFydC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEluZXRBZGRyZXNzIG5ldHdvcmtBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG5ldHdvcmtCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlwUmFuZ2Uuc2V0TmV0d29ya0FkZHJlc3MobmV0d29ya0FkZHJlc3MuZ2V0QWRkcmVzcygpKTsKLQotICAgICAgICBJbmV0QWRkcmVzcyBzdWJuZXRNYXNrID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHN1Ym5ldEJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgaXBSYW5nZS5zZXRTdWJuZXRNYXNrKHN1Ym5ldE1hc2suZ2V0QWRkcmVzcygpKTsKLQotICAgICAgICBpcFJhbmdlLnNhdmUoKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgSVBSYW5nZSBpcFJhbmdlOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgSVAgcmFuZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElQUmFuZ2UgZ2V0SVBSYW5nZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaXBSYW5nZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNzZXRQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIuc2V0UGFyYW1ldGVyKG5hbWUsIHZhbHVlKTsKLQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoSUQpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSAoU3RyaW5nKSB2YWx1ZTsKLSAgICAgICAgICAgIHRoaXMuaXBSYW5nZSA9IGdldElwUmFuZ2VNYW5hZ2VyKCkuZ2V0SVBSYW5nZShpZCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5pcFJhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSVAgcmFuZ2UgWyIgKyBpZCArICJdIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKE5BTUUsIHRoaXMuaXBSYW5nZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKERFU0NSSVBUSU9OLCB0aGlzLmlwUmFuZ2UuZ2V0RGVzY3JpcHRpb24oKSk7Ci0KLSAgICAgICAgICAgIEluZXRBZGRyZXNzIG5ldHdvcmtBZGRyZXNzID0gdGhpcy5pcFJhbmdlLmdldE5ldHdvcmtBZGRyZXNzKCk7Ci0gICAgICAgICAgICBJbmV0QWRkcmVzcyBzdWJuZXRNYXNrID0gdGhpcy5pcFJhbmdlLmdldFN1Ym5ldE1hc2soKTsKLQotICAgICAgICAgICAgTGlzdCBwYXJ0TnVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoYnl0ZSBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyUGFydCA9IEludGVnZXIudG9TdHJpbmcoMHhGRiAmIG5ldHdvcmtBZGRyZXNzLmdldEFkZHJlc3MoKVtpXSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKE5FVFdPUktfQUREUkVTUyArICItIiArIGksIG5ldyBQYXJ0KGksIGFkZHJQYXJ0KSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1hc2tQYXJ0ID0gSW50ZWdlci50b1N0cmluZygweEZGICYgc3VibmV0TWFzay5nZXRBZGRyZXNzKClbaV0pOwotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihTVUJORVRfTUFTSyArICItIiArIGksIG5ldyBQYXJ0KGksIG1hc2tQYXJ0KSk7Ci0gICAgICAgICAgICAgICAgcGFydE51bWJlcnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihJUFJhbmdlUHJvZmlsZS5QQVJUX05VTUJFUlMsIHBhcnROdW1iZXJzKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHZhbGlkYXRlQWRkcmVzc2VzKEFic3RyYWN0VXNlY2FzZSB1c2VjYXNlKSB7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzID0geyAibmV0d29yayBhZGRyZXNzIiwgInN1Ym5ldCBtYXNrIiB9OwotICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IElQUmFuZ2VQcm9maWxlLk5FVFdPUktfQUREUkVTUywgSVBSYW5nZVByb2ZpbGUuU1VCTkVUX01BU0sgfTsKLQotICAgICAgICBmb3IgKGJ5dGUgdHlwZSA9IDA7IHR5cGUgPCBuYW1lcy5sZW5ndGg7IHR5cGUrKykgewotICAgICAgICAgICAgZm9yIChieXRlIGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtc1t0eXBlXSArICItIiArIGk7Ci0gICAgICAgICAgICAgICAgUGFydCBwYXJ0ID0gbmV3IFBhcnQoaSk7Ci0gICAgICAgICAgICAgICAgcGFydC5zZXRWYWx1ZSh1c2VjYXNlLmdldFBhcmFtZXRlckFzU3RyaW5nKHBhcmFtTmFtZSkpOwotICAgICAgICAgICAgICAgIGlmICghcGFydC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAJU3RyaW5nW10gcGFyYW1ldGVycyA9IHsgSW50ZWdlci50b1N0cmluZyhpICsgMSksIG5hbWVzW3R5cGVdIH07Ci0gICAgICAgICAgICAgICAgICAgIHVzZWNhc2UuYWRkRXJyb3JNZXNzYWdlKCJpbnZhbGlkLWlwLWFkZHJlc3MtcGFydCIsIHBhcmFtZXRlcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1c2VjYXNlLnNldFBhcmFtZXRlcihwYXJhbU5hbWUsIHBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSVAgYWRkcmVzcyBwYXJ0IGhvbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcnQgewotICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgcHJpdmF0ZSBieXRlIHBvc2l0aW9uOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDdG9yLgotICAgICAgICAgKiBAcGFyYW0gX3Bvc2l0aW9uIFRoZSBwb3NpdGlvbi4KLSAgICAgICAgICogQHBhcmFtIF92YWx1ZSBUaGUgdmFsdWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUGFydChieXRlIF9wb3NpdGlvbiwgU3RyaW5nIF92YWx1ZSkgewotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IF92YWx1ZTsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBfcG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3Rvci4KLSAgICAgICAgICogQHBhcmFtIF9wb3NpdGlvbiBUaGUgcG9zaXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUGFydChieXRlIF9wb3NpdGlvbikgewotICAgICAgICAgICAgdGhpcyhfcG9zaXRpb24sICIwIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24KLSAgICAgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBieXRlIGdldFBvc2l0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUKLSAgICAgICAgICogQHJldHVybiBUaGUgdmFsdWUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gX3ZhbHVlIFRoZSB2YWx1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBfdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBfdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBwYXJ0IGlzIHZhbGlkLgotICAgICAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IEludGVnZXIucGFyc2VJbnQodGhpcy52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEoMCA8PSBpICYmIGkgPD0gMjU1KSkgewotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvSVBSYW5nZXMuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvSVBSYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllOTI1Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL0lQUmFuZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JUFJhbmdlOwotCi0vKioKLSAqIE1hbmFnZSBJUCByYW5nZXMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogSVBSYW5nZXMuamF2YSA0MDczMDUgMjAwNi0wNS0xNyAxNjoyMTo0OVogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBJUFJhbmdlcyBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElQX1JBTkdFUyA9ICJpcFJhbmdlcyI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2luaXRQYXJhbWV0ZXJzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgCi0gICAgICAgIElQUmFuZ2VbXSBpcFJhbmdlcyA9IGdldElwUmFuZ2VNYW5hZ2VyKCkuZ2V0SVBSYW5nZXMoKTsKLSAgICAgICAgTGlzdCBpcFJhbmdlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaXBSYW5nZUxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoaXBSYW5nZXMpKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChpcFJhbmdlTGlzdCk7Ci0gICAgICAgIHNldFBhcmFtZXRlcihJUF9SQU5HRVMsIGlwUmFuZ2VMaXN0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL1Nlc3Npb25WaWV3ZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvU2Vzc2lvblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDI0MzIxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvU2Vzc2lvblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzLkFjY2Vzc0NvbnRyb2xVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXNzaW9uTGlzdGVuZXI7Ci0KLS8qKgotICogU2Vzc2lvblZpZXdlciB1c2VjYXNlIHdoaWNoIGdldHMgYWxsIHNlc3Npb24gb2JqZWN0cyBmcm9tIHRoZSBTZXNzaW9uTGlzdGVuZXIgYW5kIGV4dHJhY3QgdGhlCi0gKiBuZWNlc3NhcnkgaW5mb3JtYXRpb25zLgotICogCi0gKiBAdmVyc2lvbiAkSWQ6IFNlc3Npb25WaWV3ZXIuamF2YSA0MDczMDUgMjAwNi0wNS0xNyAxNjoyMTo0OVogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uVmlld2VyIGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZID0gSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhJU1RPUlkgPSAib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZy5IaXN0b3J5IjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJTID0gInVzZXJzIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICB0aGlzLmdldFNvdXJjZVVSTCgpOwotCi0gICAgICAgIFNlc3Npb25MaXN0ZW5lciBzZXNzaW9ucyA9IG5ldyBTZXNzaW9uTGlzdGVuZXIoKTsKLSAgICAgICAgV2Vha0hhc2hNYXAgYWxsU2Vzc2lvbnMgPSBzZXNzaW9ucy5nZXRBbGxTZXNzaW9ucygpOwotICAgICAgICBMaXN0IHVzZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIEl0ZXJhdG9yIHVzZXJpdCA9IGFsbFNlc3Npb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHVzZXJpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIHVzZXJpdC5uZXh0KCk7Ci0gICAgICAgICAgICBIdHRwU2Vzc2lvbiBuZXh0c2Vzc2lvbiA9IChIdHRwU2Vzc2lvbikgZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSAoSWRlbnRpdHkpIG5leHRzZXNzaW9uLmdldEF0dHJpYnV0ZShJREVOVElUWSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKGlkZW50aXR5ID09IG51bGwpIHsgCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9ICAgCi0gICAgICAgICAgCi0gICAgICAgICAgICBVc2VyIHVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICBpZiAodXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVmVjdG9yIGhpc3RvcnkgPSAoVmVjdG9yKSBuZXh0c2Vzc2lvbi5nZXRBdHRyaWJ1dGUoSElTVE9SWSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uSUQgPSBnZXRQdWJsaWNhdGlvbklEZnJvbUhpc3RvcnkoaGlzdG9yeSk7Ci0gICAgICAgICAgICAgICAgaWYgKHB1YmxpY2F0aW9uSUQuZXF1YWxzKGdldFB1YmxpY2F0aW9uSURmcm9tVVJMKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzZXJMaXN0LmFkZChpZGVudGl0eS5nZXRVc2VyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRQYXJhbWV0ZXIoVVNFUlMsIHVzZXJMaXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IHRoZSBwdWJsaWNhdGlvbklEIGZyb20gdGhlIGhpc3RvcnkgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBzZXNzaW9uCi0gICAgICogCi0gICAgICogQHBhcmFtIGhpc3RvcnkgVGhlIGhpc3Rvcnkgc3RvcmVkIGluIHRoZSBzZXNzaW9uLi4gQW4gZW50cnkgbG9va3MgbGlrZSBcLwotICAgICAqICAgICAgICAgICAgPHB1YmxpY2F0aW9uLWlkPi9hdXRob3JpbmcvaW5kZXguaHRtbAotICAgICAqIEByZXR1cm4gQSBwdWJsaWNhdGlvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQdWJsaWNhdGlvbklEZnJvbUhpc3RvcnkoVmVjdG9yIGhpc3RvcnkpIHsKLQotICAgICAgICBTdHJpbmcgZmlyc3RFbGVtZW50ID0gaGlzdG9yeS5maXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgcHVibGljYXRpb25JRCA9IGZpcnN0RWxlbWVudC5zdWJzdHJpbmcoMSwgZmlyc3RFbGVtZW50LmluZGV4T2YoIi8iLCAxKSk7Ci0KLSAgICAgICAgcmV0dXJuIHB1YmxpY2F0aW9uSUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcHVibGljYXRpb25JRCBmcm9tIGFuIFVSTC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQdWJsaWNhdGlvbklEZnJvbVVSTCgpIHsKLSAgICAgICAgVVJMSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBVUkxJbmZvcm1hdGlvbihnZXRTb3VyY2VVUkwoKSk7Ci0gICAgICAgIHJldHVybiBpbmZvLmdldFB1YmxpY2F0aW9uSWQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL1VzZWNhc2VzLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL1VzZWNhc2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjkzZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Vc2VjYXNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQXV0aG9yaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZS5Vc2VjYXNlQXV0aG9yaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5VUkxJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VSZXNvbHZlcjsKLQotLyoqCi0gKiBFZGl0IHVzZWNhc2UgcG9saWNpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VjYXNlcyBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIFVzZWNhc2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChVc2VjYXNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoVXNlY2FzZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgU3RyaW5nW10gYWxsVXNlY2FzZXMgPSByZXNvbHZlci5nZXRVc2VjYXNlTmFtZXMoKTsKLSAgICAgICAgICAgIFNvcnRlZFNldCByb290VXNlY2FzZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxVc2VjYXNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChhbGxVc2VjYXNlc1tpXS5pbmRleE9mKCIvIikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcm9vdFVzZWNhc2VzLmFkZChhbGxVc2VjYXNlc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmdbXSB1c2VjYXNlcyA9IChTdHJpbmdbXSkgcm9vdFVzZWNhc2VzLnRvQXJyYXkobmV3IFN0cmluZ1tyb290VXNlY2FzZXMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcigidXNlY2FzZXMiLCB1c2VjYXNlcyk7Ci0KLSAgICAgICAgICAgIFJvbGVbXSByb2xlcyA9IGdldEFjY2Vzc0NvbnRyb2xsZXIoKS5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0Um9sZU1hbmFnZXIoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Um9sZXMoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHJvbGVOYW1lcyA9IG5ldyBTdHJpbmdbcm9sZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgcm9sZXMubGVuZ3RoOyByKyspIHsKLSAgICAgICAgICAgICAgICByb2xlTmFtZXNbcl0gPSByb2xlc1tyXS5nZXRJZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXJyYXlzLnNvcnQocm9sZU5hbWVzKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcigicm9sZXMiLCByb2xlTmFtZXMpOwotCi0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbigpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJwdWJsaWNhdGlvbklkIiwgcHViLmdldElkKCkpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJ0ZW1wbGF0ZXMiLCBwdWIuZ2V0VGVtcGxhdGVJZHMoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IHUgPSAwOyB1IDwgdXNlY2FzZXMubGVuZ3RoOyB1KyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHJvbGVzLmxlbmd0aDsgcisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUgPSBnZXRVc2VjYXNlQXV0aG9yaXplcigpLmlzUGVybWl0dGVkKHVzZWNhc2VzW3VdLCBwdWIsIHJvbGVzW3JdKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKHVzZWNhc2VzW3VdICsgIjoiICsgcm9sZXNbcl0sIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHB1YklkID0gbmV3IFVSTEluZm9ybWF0aW9uKGdldFNvdXJjZVVSTCgpKS5nZXRQdWJsaWNhdGlvbklkKCk7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldERvY3VtZW50RmFjdG9yeSgpLmdldFB1YmxpY2F0aW9uKHB1YklkKTsKLSAgICAgICAgcmV0dXJuIHB1YjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nW10gdXNlY2FzZXMgPSAoU3RyaW5nW10pIGdldFBhcmFtZXRlcigidXNlY2FzZXMiKTsKLSAgICAgICAgU3RyaW5nW10gcm9sZU5hbWVzID0gKFN0cmluZ1tdKSBnZXRQYXJhbWV0ZXIoInJvbGVzIik7Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZ2V0UHVibGljYXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgdSA9IDA7IHUgPCB1c2VjYXNlcy5sZW5ndGg7IHUrKykgewotICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByb2xlTmFtZXMubGVuZ3RoOyByKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gdXNlY2FzZXNbdV0gKyAiOiIgKyByb2xlTmFtZXNbcl07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gZ2V0Qm9vbGVhbkNoZWNrYm94UGFyYW1ldGVyKGtleSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZihzdHJpbmdWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgUm9sZSByb2xlID0gZ2V0QWNjZXNzQ29udHJvbGxlcigpLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRSb2xlTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Um9sZShyb2xlTmFtZXNbcl0pOwotICAgICAgICAgICAgICAgIGdldFVzZWNhc2VBdXRob3JpemVyKCkuc2V0UGVybWlzc2lvbih1c2VjYXNlc1t1XSwgcHViLCByb2xlLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgVXNlY2FzZUF1dGhvcml6ZXIgYXV0aG9yaXplcjsKLQotICAgIHByb3RlY3RlZCBVc2VjYXNlQXV0aG9yaXplciBnZXRVc2VjYXNlQXV0aG9yaXplcigpIHsKLSAgICAgICAgaWYgKHRoaXMuYXV0aG9yaXplciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBdXRob3JpemVyW10gYXV0aG9yaXplcnMgPSBnZXRBY2Nlc3NDb250cm9sbGVyKCkuZ2V0QXV0aG9yaXplcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXV0aG9yaXplcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXV0aG9yaXplcnNbaV0gaW5zdGFuY2VvZiBVc2VjYXNlQXV0aG9yaXplcikgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhvcml6ZXIgPSAoVXNlY2FzZUF1dGhvcml6ZXIpIGF1dGhvcml6ZXJzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5hdXRob3JpemVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Vc2VyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL1VzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwOTI5ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL1VzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlczsKLQotLyoqCi0gKiBEaXNwbGF5IHVzZXIgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogVXNlci5qYXZhIDQwNzMwNSAyMDA2LTA1LTE3IDE2OjIxOjQ5WiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIFVzZXIgZXh0ZW5kcyBBY2Nlc3NDb250cm9sVXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0lEID0gInVzZXJJZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJ1c2VyIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI3NldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFVTRVJfSUQpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXIgdXNlciA9IGdldFVzZXJNYW5hZ2VyKCkuZ2V0VXNlcih1c2VySWQpOwotICAgICAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgidXNlcl9ub19zdWNoX3VzZXIiLCBuZXcgU3RyaW5nW117dXNlcklkfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihVU0VSLCB1c2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvVXNlckdyb3Vwcy5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Vc2VyR3JvdXBzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzQyYWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlcy9Vc2VyR3JvdXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGVkaXQgYSB1c2VyJ3MgZ3JvdXAgYWZmaWxpYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyR3JvdXBzIGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9HUk9VUFMgPSAidXNlckdyb3VwcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfR1JPVVBTID0gIm90aGVyR3JvdXBzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0dST1VQID0gInVzZXJHcm91cCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfR1JPVVAgPSAib3RoZXJHcm91cCI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotCi0gICAgICAgIFVzZXIgdXNlciA9IGdldFVzZXIoKTsKLSAgICAgICAgdXNlci5yZW1vdmVGcm9tQWxsR3JvdXBzKCk7Ci0KLSAgICAgICAgTGlzdCB1c2VyR3JvdXBzID0gKExpc3QpIGdldFBhcmFtZXRlcihVU0VSX0dST1VQUyk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHVzZXJHcm91cHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBncm91cC5hZGQodXNlcik7Ci0gICAgICAgIH0KLSAgICAgICAgdXNlci5zYXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjYWR2YW5jZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWR2YW5jZSgpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuYWR2YW5jZSgpOwotCi0gICAgICAgIFN0cmluZyBhZGQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhBREQpOwotICAgICAgICBTdHJpbmcgcmVtb3ZlID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoUkVNT1ZFKTsKLSAgICAgICAgaWYgKGFkZCAhPSBudWxsIHx8IHJlbW92ZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIExpc3QgdXNlckdyb3VwcyA9IChMaXN0KSBnZXRQYXJhbWV0ZXIoVVNFUl9HUk9VUFMpOwotICAgICAgICAgICAgTGlzdCBvdGhlckdyb3VwcyA9IChMaXN0KSBnZXRQYXJhbWV0ZXIoT1RIRVJfR1JPVVBTKTsKLQotICAgICAgICAgICAgaWYgKGFkZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGdyb3VwSWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhPVEhFUl9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImFkZCBncm91cCBbIiArIGdyb3VwSWQgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gZ2V0R3JvdXBNYW5hZ2VyKCkuZ2V0R3JvdXAoZ3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHVzZXJHcm91cHMuYWRkKGdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJHcm91cHMucmVtb3ZlKGdyb3VwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZW1vdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBncm91cElkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVVNFUl9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoInJlbW92ZSBncm91cCBbIiArIGdyb3VwSWQgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gZ2V0R3JvdXBNYW5hZ2VyKCkuZ2V0R3JvdXAoZ3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyR3JvdXBzLmFkZChncm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIHVzZXJHcm91cHMucmVtb3ZlKGdyb3VwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlbGV0ZVBhcmFtZXRlcihBREQpOwotICAgICAgICAgICAgZGVsZXRlUGFyYW1ldGVyKFJFTU9WRSk7Ci0gICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoVVNFUl9HUk9VUCk7Ci0gICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoT1RIRVJfR1JPVVApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVXNlciBnZXRVc2VyKCkgewotICAgICAgICBTdHJpbmcgdXNlcklkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVXNlclByb2ZpbGUuVVNFUl9JRCk7Ci0gICAgICAgIFVzZXIgdXNlciA9IGdldFVzZXJNYW5hZ2VyKCkuZ2V0VXNlcih1c2VySWQpOwotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVXNlciBbIiArIHVzZXJJZCArICJdIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgCi0gICAgICAgIEdyb3VwW10gdXNlckdyb3VwQXJyYXkgPSBnZXRVc2VyKCkuZ2V0R3JvdXBzKCk7Ci0gICAgICAgIExpc3QgdXNlckdyb3VwcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh1c2VyR3JvdXBBcnJheSkpOwotICAgICAgICBzZXRQYXJhbWV0ZXIoVVNFUl9HUk9VUFMsIHVzZXJHcm91cHMpOwotICAgICAgICAKLSAgICAgICAgR3JvdXBbXSBhbGxHcm91cHMgPSBnZXRHcm91cE1hbmFnZXIoKS5nZXRHcm91cHMoKTsKLSAgICAgICAgTGlzdCBvdGhlckdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxHcm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghdXNlckdyb3Vwcy5jb250YWlucyhhbGxHcm91cHNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgb3RoZXJHcm91cHMuYWRkKGFsbEdyb3Vwc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0UGFyYW1ldGVyKE9USEVSX0dST1VQUywgb3RoZXJHcm91cHMpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvVXNlclByb2ZpbGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvVXNlclByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyOWQ1Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL1VzZXJQcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbVV0aWw7Ci0KLS8qKgotICogVXNlY2FzZSB0byBlZGl0IGEgdXNlcidzIHByb2ZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyUHJvZmlsZSBleHRlbmRzIEFjY2Vzc0NvbnRyb2xVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfSUQgPSAidXNlcklkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX05BTUUgPSAiZnVsbE5hbWUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVV9MT0NBTEUgPSAiZGVmYXVsdE1lbnVMb2NhbGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0xPQ0FMRSA9ICJkZWZhdWx0RG9jdW1lbnRMb2NhbGUiOwotICAgIAotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFVzZXJQcm9maWxlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgZW1haWwgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVc2VyUHJvZmlsZS5FTUFJTCk7Ci0gICAgICAgIGlmICghSXRlbVV0aWwuaXNWYWxpZEVtYWlsKGVtYWlsKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVXNlclByb2ZpbGUuRlVMTF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVXNlclByb2ZpbGUuREVTQ1JJUFRJT04pOwotICAgICAgICBTdHJpbmcgZW1haWwgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVc2VyUHJvZmlsZS5FTUFJTCk7Ci0gICAgICAgIFN0cmluZyBkZWZhdWx0TWVudUxvY2FsZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFVzZXJQcm9maWxlLk1FTlVfTE9DQUxFKTsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHREb2N1bWVudExvY2FsZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFVzZXJQcm9maWxlLkRPQ1VNRU5UX0xPQ0FMRSk7Ci0gICAgICAgIAotICAgICAgICBnZXRVc2VyKCkuc2V0RW1haWwoZW1haWwpOwotICAgICAgICBnZXRVc2VyKCkuc2V0TmFtZShmdWxsTmFtZSk7Ci0gICAgICAgIGdldFVzZXIoKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIGdldFVzZXIoKS5zZXREZWZhdWx0TWVudUxvY2FsZShkZWZhdWx0TWVudUxvY2FsZSk7Ci0gICAgICAgIGdldFVzZXIoKS5zZXREZWZhdWx0RG9jdW1lbnRMb2NhbGUoZGVmYXVsdERvY3VtZW50TG9jYWxlKTsKLSAgICAgICAgZ2V0VXNlcigpLnNhdmUoKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgVXNlciB1c2VyOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBlZGl0ZWQgdXNlci4KLSAgICAgKiBAcmV0dXJuIEEgdXNlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVXNlciBnZXRVc2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy51c2VyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNzZXRQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotICAgICAgICAKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFVTRVJfSUQpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICB0aGlzLnVzZXIgPSBnZXRVc2VyTWFuYWdlcigpLmdldFVzZXIodXNlcklkKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnVzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVc2VyIFsiICsgdXNlcklkICsgIl0gbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRU1BSUwsIHRoaXMudXNlci5nZXRFbWFpbCgpKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihERVNDUklQVElPTiwgdGhpcy51c2VyLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKE1FTlVfTE9DQUxFLCB0aGlzLnVzZXIuZ2V0RGVmYXVsdE1lbnVMb2NhbGUoKSk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRE9DVU1FTlRfTE9DQUxFLCB0aGlzLnVzZXIuZ2V0RGVmYXVsdERvY3VtZW50TG9jYWxlKCkpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKEZVTExfTkFNRSwgdGhpcy51c2VyLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvVXNlcnMuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZXMvVXNlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2MTU3MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2VzL1VzZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXJUeXBlOwotCi0vKioKLSAqIE1hbmFnZSB1c2Vycy4KLSAqIAotICogQHZlcnNpb24gJElkOiBVc2Vycy5qYXZhIDQwNzMwNSAyMDA2LTA1LTE3IDE2OjIxOjQ5WiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIFVzZXJzIGV4dGVuZHMgQWNjZXNzQ29udHJvbFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUlMgPSAidXNlcnMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVVNFUiA9ICJjdXJyZW50VXNlciI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9UWVBFUyA9ICJ1c2VyVHlwZXMiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIAotICAgICAgICBVc2VyW10gdXNlcnMgPSBnZXRVc2VyTWFuYWdlcigpLmdldFVzZXJzKCk7Ci0gICAgICAgIExpc3QgdXNlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHVzZXJMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHVzZXJzKSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodXNlckxpc3QpOwotICAgICAgICBzZXRQYXJhbWV0ZXIoVVNFUlMsIHVzZXJMaXN0KTsKLSAgICAgICAgCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdChnZXRDb250ZXh0KCkpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IChJZGVudGl0eSkgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChpZGVudGl0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKENVUlJFTlRfVVNFUiwgaWRlbnRpdHkuZ2V0VXNlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgVXNlclR5cGVbXSB0eXBlcyA9IGdldFVzZXJNYW5hZ2VyKCkuZ2V0VXNlclR5cGVzKCk7Ci0gICAgICAgIHNldFBhcmFtZXRlcihVU0VSX1RZUEVTLCBBcnJheXMuYXNMaXN0KHR5cGVzKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTllMGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnRzIGluIHRyYXNoIj5Eb2N1bWVudHMgaW4gdHJhc2g8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGhlIHRyYXNoIGlzIGVtcHR5LiI+VGhlIHRyYXNoIGlzIGVtcHR5LjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTZXNzaW9ucyI+U2Vzc2lvbnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGF0aCI+UGF0aDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbmJveCI+SW5ib3g8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXNlY2FzZS1wb2xpY2llcy1tZXNzYWdlIj5IZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIHVzZWNhc2VzIHNob3VsZCBiZSBleGVjdXRhYmxlIGJ5IHdoaWNoIHJvbGVzLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTZXJ2ZXIgU3RhdHVzIj5TZXJ2ZXIgU3RhdHVzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImUtbWFpbCI+RS1NYWlsPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5vIGdyb3VwcyBhc3NpZ25lZCI+Tm8gZ3JvdXBzIGFzc2lnbmVkPC9tZXNzYWdlPgotICAKLSAgPG1lc3NhZ2Uga2V5PSJMb2NhbCBVc2VyIj5Mb2NhbCBVc2VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImFkZC11c2VyIj5BZGQgezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoaXMgaXMgbm90IGEgdmFsaWQgdXNlciBJRC4iPlRoaXMgaXMgbm90IGEgdmFsaWQgdXNlciBJRC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGxlYXNlIGVudGVyIGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuIj5QbGVhc2UgZW50ZXIgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGFzc3dvcmQgYW5kIGNvbmZpcm1lZCBwYXNzd29yZCBhcmUgbm90IGVxdWFsLiI+UGFzc3dvcmQgYW5kIGNvbmZpcm1lZCBwYXNzd29yZCBhcmUgbm90IGVxdWFsLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGlzIGlzIG5vdCBhIHZhbGlkIGdyb3VwIElELiI+VGhpcyBpcyBub3QgYSB2YWxpZCBncm91cCBJRC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAgVXNlcnMiPkdyb3VwIFVzZXJzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFsbCBVc2VycyI+QWxsIFVzZXJzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoaXMgaXMgbm90IGEgdmFsaWQgSVAgcmFuZ2UgSUQuIj5UaGlzIGlzIG5vdCBhIHZhbGlkIElQIHJhbmdlIElELjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJpbnZhbGlkLWlwLWFkZHJlc3MtcGFydCI+UGFydCB7MH0gb2YgdGhlIHsxfSBpcyBub3QgdmFsaWQuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBvbGQgcGFzc3dvcmQgaXMgbm90IGNvcnJlY3QuIj5UaGUgb2xkIHBhc3N3b3JkIGlzIG5vdCBjb3JyZWN0LjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgcGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCBzaXggY2hhcmFjdGVycyBsb25nLiI+VGhlIHBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3Qgc2l4IGNoYXJhY3RlcnMgbG9uZy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGhlIHBhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgbnVtYmVyLiI+VGhlIHBhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgbnVtYmVyLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSBHcm91cHMiPklQIFJhbmdlIEdyb3VwczwvbWVzc2FnZT4KLSAgCi0gIDxtZXNzYWdlIGtleT0iY2Fubm90LWFzc2lnbi1yb2xlIj5UaGUgcm9sZSA8eGh0bWw6cT57MH08L3hodG1sOnE+IGNhbm5vdCBiZSBhc3NpZ25lZC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY3JlZGVudGlhbC1hbHJlYWR5LWNvbnRhaW5lZCI+Ci0gICAgVGhlIHJvbGUgPHhodG1sOnE+ezF9PC94aHRtbDpxPiBpcyBhbHJlYWR5IGFzc2lnbmVkIHRvIHRoZSBvYmplY3QgPHhodG1sOnE+ezB9PC94aHRtbDpxPi4KLSAgPC9tZXNzYWdlPgotICANCi08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU5NjJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpX2RlLnhtbCA0NDY1NjQgMjAwNi0wOS0xNSAxMDoxMzoxNlogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImRlIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotDQotICA8bWVzc2FnZSBrZXk9IkRvY3VtZW50cyBpbiB0cmFzaCI+RG9rdW1lbnRlIGltIFBhcGllcmtvcmI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGhlIHRyYXNoIGlzIGVtcHR5LiI+RGVyIFBhcGllcmtvcmIgaXN0IGxlZXIuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNlc3Npb25zIj5TaXR6dW5nZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGF0aCI+UGZhZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbmJveCI+UG9zdGVpbmdhbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXNlY2FzZS1wb2xpY2llcy1tZXNzYWdlIj5IaWVyIGvDtm5uZW4gU2llIGZlc3RsZWdlbiwgd2VsY2hlIFVzZWNhc2VzIGR1cmNoIHdlbGNoZSBSb2xsZW4gYXVzZ2Vmw7xocnQgd2VyZGVuIGTDvHJmZW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNlcnZlciBTdGF0dXMiPlNlcnZlci1TdGF0dXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZS1tYWlsIj5FLU1haWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gZ3JvdXBzIGFzc2lnbmVkIj5LZWluZSBHcnVwcGVuIHp1Z2VvcmRuZXQ8L21lc3NhZ2U+Ci0gIAotICA8bWVzc2FnZSBrZXk9IkxvY2FsIFVzZXIiPkxva2FsZW4gQmVudXR6ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYWRkLXVzZXIiPnswfSBoaW56dWbDvGdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGlzIGlzIG5vdCBhIHZhbGlkIHVzZXIgSUQuIj5EaWUgQmVudXR6ZXItSUQgaXN0IHVuZ8O8bHRpZy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGxlYXNlIGVudGVyIGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuIj5CaXR0ZSBnZWJlbiBTaWUgZWluZSBnw7xsdGlnZSBFLU1haWwtQWRyZXNzZSBlaW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhc3N3b3JkIGFuZCBjb25maXJtZWQgcGFzc3dvcmQgYXJlIG5vdCBlcXVhbC4iPlBhc3N3b3J0IHVuZCBQYXNzd29ydGJlc3TDpHRpZ3VuZyBzdGltbWVuIG5pY2h0IMO8YmVyZWluLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGlzIGlzIG5vdCBhIHZhbGlkIGdyb3VwIElELiI+RGllIEdydXBwZW4tSUQgaXN0IHVuZ8O8bHRpZy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAgVXNlcnMiPkdydXBwZW4tQmVudXR6ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWxsIFVzZXJzIj5BbGxlIEJlbnV0emVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoaXMgaXMgbm90IGEgdmFsaWQgSVAgcmFuZ2UgSUQuIj5EaWUgSVAtQmVyZWljaHMtSUQgaXN0IHVuZ8O8bHRpZy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iaW52YWxpZC1pcC1hZGRyZXNzLXBhcnQiPkFic2Nobml0dCB7MH0gZGVzIEZlbGRlcyAiezF9IiBpc3QgdW5nw7xsdGlnLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgb2xkIHBhc3N3b3JkIGlzIG5vdCBjb3JyZWN0LiI+RGFzIGJlc3RlaGVuZGUgUGFzc3dvcnQgd3VyZGUgbmljaHQga29ycmVrdCBlaW5nZWdlYmVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgcGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCBzaXggY2hhcmFjdGVycyBsb25nLiI+RGFzIFBhc3N3b3J0IG11c3MgbWluZGVzdGVucyA2IFplaWNoZW4gbGFuZyBzZWluLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgcGFzc3dvcmQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBudW1iZXIuIj5EYXMgUGFzc3dvcnQgbXVzcyBtaW5kZXN0ZW5zIGVpbmUgWmlmZmVyIGVudGhhbHRlbi48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgR3JvdXBzIj5HcnVwcGVuIGRlczxici8+SVAtQmVyZWljaHM8L21lc3NhZ2U+Ci0gIAotICA8bWVzc2FnZSBrZXk9ImNhbm5vdC1hc3NpZ24tcm9sZSI+RGllIFJvbGxlIDx4aHRtbDpxPnswfTwveGh0bWw6cT4ga2FubiBuaWNodCB6dWdlb3JkbmV0IHdlcmRlbi48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY3JlZGVudGlhbC1hbHJlYWR5LWNvbnRhaW5lZCI+Ci0gICAgRGllIFJvbGxlIDx4aHRtbDpxPnsxfTwveGh0bWw6cT4gd3VyZGUgZGVtIE9iamVrdCA8eGh0bWw6cT57MH08L3hodG1sOnE+IGJlcmVpdHMgenVnZW9yZG5ldC4KLSAgPC9tZXNzYWdlPgotICANCi08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDhmMmViLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBhZG1pbi54bWFwIDE2MDY3MCAyMDA1LTA0LTA5IDA5OjEyOjEyWiBhbmRyZWFzICQgLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgPG1hcDpwaXBlbGluZT4KLQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJzdGF0dXMueG1sIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9InN0YXR1cyIgdHlwZT0ic3RhdHVzIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L2FkbWluL3N0YXR1czJodG1sLnhzbCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICA8L21hcDpwaXBlbGluZXM+Ci0gIAotPC9tYXA6c2l0ZW1hcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3Rlc3QvY2Fub28vdGVzdC54bWwgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3Rlc3QvY2Fub28vdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZmM0ZjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi90ZXN0L2Nhbm9vL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhRE9DVFlQRSBwcm9qZWN0IFNZU1RFTSAiLi4vLi4vLi4vLi4vbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2Nhbm9vL2xlbnlhX3dlYnRlc3QuZHRkIj4KLQotPHByb2plY3QgbmFtZT0iYWRtaW5pc3RyYXRpb24iIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Im1haW4iPgotICAKLSAgPGltcG9ydCBmaWxlPSIuLi8uLi8uLi8uLi9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vbWFjcm9zLnhtbCIvPgotCi0gIDx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0iYWRtaW4udXNlcnMsIGdyb3VwYWZmaWxpYXRpb24iLz4KLQotICA8dGFyZ2V0IG5hbWU9ImFkbWluLnVzZXJzIj4KLSAgICA8d2VidGVzdCBuYW1lPSJhZG1pbi51c2VycyI+Ci0gICAgICAmZG9Db25maWc7Ci0gICAgICA8c3RlcHM+Ci0gICAgICAgIDxkb0xvZ2luIHVzZXJuYW1lPSJsZW55YSIgcGFzc3dvcmQ9ImxldmkiLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gYWRkIHVzZXIgLS0+Ci0gICAgICAgIDxpbnZva2UgdXJsPSJpbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9YWRtaW4udXNlcnMiLz4KLSAgICAgICAgPHZlcmlmeVRleHQgdGV4dD0iQWRkIFVzZXI6Ii8+Ci0gICAgICAgIDxjbGlja0J1dHRvbiBuYW1lPSJpbnB1dC1hZGRfdXNlciIvPgotICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0iaDEiIHRleHQ9IkFkZCBMb2NhbCBVc2VyIi8+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9InVzZXJJZCIgdmFsdWU9IndlYlRlc3RVc2VyIi8+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9ImZ1bGxOYW1lIiB2YWx1ZT0iV2ViVGVzdCBVc2VyIi8+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9ImRlc2NyaXB0aW9uIiB2YWx1ZT0iV2ViVGVzdCBVc2VyIGRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9ImVtYWlsIiB2YWx1ZT0id2ViVGVzdFVzZXJAYXBhY2hlLm9yZyIvPgotICAgICAgICA8c2V0SW5wdXRGaWVsZCBuYW1lPSJuZXdQYXNzd29yZCIgdmFsdWU9IndlYlRlc3QxMjMiLz4KLSAgICAgICAgPHNldElucHV0RmllbGQgbmFtZT0iY29uZmlybVBhc3N3b3JkIiB2YWx1ZT0id2ViVGVzdDEyMyIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0KLSAgICAgICAgPHZlcmlmeVRleHQgdGV4dD0iVXNlciBQcm9maWxlIi8+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9IndlYlRlc3RVc2VyQGFwYWNoZS5vcmciLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gYmFjayB0byB1c2VycyBsaXN0IC0tPgotICAgICAgICA8aW52b2tlIHVybD0iaW5kZXguaHRtbD9sZW55YS51c2VjYXNlPWFkbWluLnVzZXJzIi8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIHVzZXIgSURzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgLS0+Ci0gICAgICAgIDx2ZXJpZnlYUGF0aCB4cGF0aD0iLy9hW25vcm1hbGl6ZS1zcGFjZSguKSA9ICd3ZWJ0ZXN0dXNlciddIi8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIGRlbGV0ZSB1c2VyIC0tPgotICAgICAgICA8Y2xpY2tCdXR0b24geHBhdGg9Ii8vZm9ybVtpbnB1dFtAdmFsdWUgPSAnd2VidGVzdHVzZXInXV0vaW5wdXRbQHR5cGUgPSAnc3VibWl0J10iLz4KLSAgICAgICAgPHZlcmlmeVRleHQgdGV4dD0iRGVsZXRlIFVzZXIiLz4KLSAgICAgICAgPHZlcmlmeVRleHQgdGV4dD0id2VidGVzdHVzZXIiLz4KLSAgICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJBZGQgVXNlcjoiLz4KLSAgICAgICAgPG5vdD4KLSAgICAgICAgICA8dmVyaWZ5WFBhdGggeHBhdGg9Ii8vYVtub3JtYWxpemUtc3BhY2UoLikgPSAnd2VidGVzdHVzZXInXSIvPgotICAgICAgICA8L25vdD4KLSAgICAgICAgCi0gICAgICAgIDxkb0xvZ291dC8+Ci0gICAgICA8L3N0ZXBzPgotICAgIDwvd2VidGVzdD4KLSAgPC90YXJnZXQ+Ci0KLSAgPG1hY3JvZGVmIG5hbWU9ImNoZWNrR3JvdXAiCi0gICAgICAgICAgIGRlc2NyaXB0aW9uPSJjaGVjayBpZiBpdGVtICdncm91cCcgaXMgaW4gbGlzdGJveCAnbGlzdC1pbicgYW5kIG5vdCBpbiAnbGlzdC1ub3QnIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Imdyb3VwIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJsaXN0LWluIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJsaXN0LW5vdCIvPgotICAgIDxzZXF1ZW50aWFsPgotICAgICAgPHZlcmlmeVhQYXRoIHhwYXRoPSIvL3NlbGVjdFtAbmFtZSA9ICdAe2xpc3QtaW59J10vb3B0aW9uW0B2YWx1ZSA9ICdAe2dyb3VwfSddIi8+Ci0gICAgICA8bm90PgotICAgICAgICA8dmVyaWZ5WFBhdGggeHBhdGg9Ii8vc2VsZWN0W0BuYW1lID0gJ0B7bGlzdC1ub3R9J10vb3B0aW9uW0B2YWx1ZSA9ICdAe2dyb3VwfSddIi8+Ci0gICAgICA8L25vdD4KLSAgICA8L3NlcXVlbnRpYWw+Ci0gIDwvbWFjcm9kZWY+Ci0gIDxtYWNyb2RlZiBuYW1lPSJjaGVja1VzZXJQcm9maWxlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249ImNoZWNrIGlmIHVzZXIgcHJvZmlsZSBsb29rcyByaWdodCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhZG1pbiIvPgotICAgIDxzZXF1ZW50aWFsPgotICAgICAgPHZlcmlmeVRleHQgdGV4dD0iVXNlciBQcm9maWxlIi8+Ci0gICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJhbGljZUBsZW55YS5vcmciLz4KLSAgICAgIDxpZlN0ZXAgdGVzdD0iQHthZG1pbn0iIGRlc2NyaXB0aW9uPSJhZG1pbiBhZmZpbGlhdGlvbiI+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9Imdyb3VwSWQ9YWRtaW4iLz4KLSAgICAgIDwvaWZTdGVwPgotICAgICAgPGlmU3RlcCB1bmxlc3M9IkB7YWRtaW59IiBkZXNjcmlwdGlvbj0ibm8gYWRtaW4gYWZmaWxpYXRpb24iPgotICAgICAgICA8bm90Pjx2ZXJpZnlUZXh0IHRleHQ9Imdyb3VwSWQ9YWRtaW4iLz48L25vdD4KLSAgICAgIDwvaWZTdGVwPgotICAgIDwvc2VxdWVudGlhbD4KLSAgPC9tYWNyb2RlZj4KLQotICA8dGFyZ2V0IG5hbWU9Imdyb3VwYWZmaWxpYXRpb24iPgotICAgIDx3ZWJ0ZXN0IG5hbWU9Imdyb3VwYWZmaWxpYXRpb24iPgotICAgICAgJmRvQ29uZmlnOwotICAgICAgPHN0ZXBzPgotICAgICAgICA8ZG9Mb2dpbiB1c2VybmFtZT0ibGVueWEiIHBhc3N3b3JkPSJsZXZpIi8+Ci0KLSAgICAgICAgPCEtLSByZXF1ZXN0IHVzZXIgcHJvZmlsZSBvZiB1c2VyIGFsaWNlIC0tPgotICAgICAgICA8aW52b2tlIHVybD0iaW5kZXguaHRtbD9sZW55YS51c2VjYXNlPWFkbWluLnVzZXImYW1wO3VzZXJJZD1hbGljZSIvPgotICAgICAgIDxjaGVja1VzZXJQcm9maWxlIGFkbWluPSJmYWxzZSIvPgotCi0gICAgICAgIDwhLS0gcmVxdWVzdCBncm91cCBhZmZpbGlhdGlvbiBwYWdlIC0tPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0iaW5wdXQtZWRpdF9ncm91cF9hZmZpbGlhdGlvbiIvPgotICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0iaDEiIHRleHQ9Ikdyb3VwIEFmZmlsaWF0aW9uIi8+Ci0gICAgICAgPGNoZWNrR3JvdXAgZ3JvdXA9ImFkbWluIiBsaXN0LWluPSJvdGhlckdyb3VwIiBsaXN0LW5vdD0idXNlckdyb3VwIi8+Ci0KLSAgICAgICAgPCEtLSBhZGQgdXNlciBhbGljZSB0byBncm91cCBhZG1pbiAtLT4KLSAgICAgICA8Y2xpY2tFbGVtZW50IHhwYXRoPSIvL3NlbGVjdFtAbmFtZSA9ICdvdGhlckdyb3VwJ10vb3B0aW9uW0B2YWx1ZSA9ICdhZG1pbiddIi8+Ci0gICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9ImFkZCIvPgotICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iR3JvdXAgQWZmaWxpYXRpb24iLz4KLSAgICAgICAgPGNoZWNrR3JvdXAgZ3JvdXA9ImFkbWluIiBsaXN0LWluPSJ1c2VyR3JvdXAiIGxpc3Qtbm90PSJvdGhlckdyb3VwIi8+Ci0KLSAgICAgICA8IS0tIHNhdmUgYW5kIGJhY2sgdG8gdXNlciBwcm9maWxlIC0tPgotICAgICAgIDxjbGlja0J1dHRvbiBuYW1lPSJzdWJtaXQiLz4KLSAgICAgICAgPGNoZWNrVXNlclByb2ZpbGUgYWRtaW49InRydWUiLz4KLQotICAgICAgIDwhLS0gcmVxdWVzdCBncm91cCBhZmZpbGlhdGlvbiBwYWdlIC0tPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0iaW5wdXQtZWRpdF9ncm91cF9hZmZpbGlhdGlvbiIvPgotICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0iaDEiIHRleHQ9Ikdyb3VwIEFmZmlsaWF0aW9uIi8+Ci0gICAgICAgIDxjaGVja0dyb3VwIGdyb3VwPSJhZG1pbiIgbGlzdC1pbj0idXNlckdyb3VwIiBsaXN0LW5vdD0ib3RoZXJHcm91cCIvPgotCi0gICAgICAgPCEtLSByZW1vdmUgdXNlciBhbGljZSBmcm9tIGdyb3VwIGFkbWluIC0tPgotICAgICAgIDxjbGlja0VsZW1lbnQgeHBhdGg9Ii8vc2VsZWN0W0BuYW1lID0gJ3VzZXJHcm91cCddL29wdGlvbltAdmFsdWUgPSAnYWRtaW4nXSIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0icmVtb3ZlIi8+Ci0gICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iR3JvdXAgQWZmaWxpYXRpb24iLz4KLSAgICAgICAgPGNoZWNrR3JvdXAgZ3JvdXA9ImFkbWluIiBsaXN0LWluPSJvdGhlckdyb3VwIiBsaXN0LW5vdD0idXNlckdyb3VwIi8+Ci0KLSAgICAgICAgPCEtLSBzYXZlIGFuZCBiYWNrIHRvIHVzZXIgcHJvZmlsZSAtLT4KLSAgICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotICAgICAgICA8Y2hlY2tVc2VyUHJvZmlsZSBhZG1pbj0iZmFsc2UiLz4KLQotICAgICAgICA8ZG9Mb2dvdXQvPgotICAgICAgPC9zdGVwcz4KLSAgICA8L3dlYnRlc3Q+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2Fib3V0TGVueWEuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2Fib3V0TGVueWEuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDE4NmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9hYm91dExlbnlhLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiBhZGRHcm91cC5qeCA0OTY2OTcgMjAwNy0wMS0xNiAxNDoxMjozNlogYW5kcmVhcyAkIC0tPgotCi08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgIAotICB4bWxuczpjaT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2luY2x1ZGUvMS4wIiAgCi0gID4KLSAgCi0gIDxjaTppbmNsdWRlIHNyYz0iY29udGV4dDovL2xlbnlhL2NvbnRlbnQvYWJvdXQueG1sIiBzZWxlY3Q9IiovKiIvPgotICAKLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvYWRkR3JvdXAuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2FkZEdyb3VwLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjFiZTY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvYWRkR3JvdXAuangKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotCi08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYiI+Ci0gICAgICA8aDE+PGkxOG46dGV4dD5BZGQgR3JvdXA8L2kxOG46dGV4dD48L2gxPgotICAgIAotICAgIDxmb3JtIGlkPSJmb3JtLWFkZF9ncm91cCI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9Imdyb3VwSWQiPjxpMThuOnRleHQ+R3JvdXAgSUQ8L2kxOG46dGV4dD4gKjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Imdyb3VwSWQiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdncm91cElkJyl9Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0ibmFtZSI+PGkxOG46dGV4dD5OYW1lPC9pMThuOnRleHQ+PC9sYWJlbD48L3RkPgotICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmFtZSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ25hbWUnKX0iLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0iZGVzY3JpcHRpb24iPjxpMThuOnRleHQ+RGVzY3JpcHRpb248L2kxOG46dGV4dD48L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPCEtLSBOLkIuOiBkbyBub3QgcHV0IHNwYWNlcyBvciBjYXJyaWFnZSByZXR1cm5zIGluc2lkZSB0aGUKLSAgICAgICAgICAgICAgICAgdGV4dGFyZWEgZWxlbWVudCAtIHRoZXNlIHdvdWxkIGJlIHJlbmRlcmVkIC0tPgotICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImRlc2NyaXB0aW9uIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50Ij48ang6b3V0IHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdkZXNjcmlwdGlvbicpfSIvPjwvdGV4dGFyZWE+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQWRkIi8+Ci0gICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9hZGRJUFJhbmdlLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9hZGRJUFJhbmdlLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDZhM2VmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvYWRkSVBSYW5nZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYiI+Ci0gICAgICAKLSAgICA8aDE+PGkxOG46dGV4dD5BZGQgSVAgUmFuZ2U8L2kxOG46dGV4dD48L2gxPgotICAgIAotICAgIDxmb3JtIGlkPSJmb3JtLWFkZF9pcF9yYW5nZSI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+SVAgUmFuZ2UgSUQ8L2kxOG46dGV4dD4gKjwvdGQ+Ci0gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpcFJhbmdlSWQiIGNsYXNzPSJsZW55YS1mb3JtLWVudHJ5IiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignaXBSYW5nZUlkJyl9Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+TmFtZTwvaTE4bjp0ZXh0PjwvdGQ+Ci0gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuYW1lIiBjbGFzcz0ibGVueWEtZm9ybS1lbnRyeSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ25hbWUnKX0iLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5EZXNjcmlwdGlvbjwvaTE4bjp0ZXh0PjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImRlc2NyaXB0aW9uIiBjbGFzcz0ibGVueWEtZm9ybS1lbnRyeSI+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2Rlc2NyaXB0aW9uJyl9Ii8+Ci0gICAgICAgICAgICA8L3RleHRhcmVhPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5OZXR3b3JrIEFkZHJlc3M8L2kxOG46dGV4dD48L3RkPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0icGFydCIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3BhcnROdW1iZXJzJyl9Ij4KLSAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgCTxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ25ldHdvcmtBZGRyZXNzLScgKyBwYXJ0KS5pc1ZhbGlkKCl9Ij4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuZXR3b3JrQWRkcmVzcy0ke3BhcnR9IiBzaXplPSIzIiBtYXhsZW5ndGg9IjMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ25ldHdvcmtBZGRyZXNzLScgKyBwYXJ0KS5nZXRWYWx1ZSgpfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiLz4KLSAgICAgICAgICAgICAgCTwvang6d2hlbj4KLSAgICAgICAgICAgICAgCTxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmV0d29ya0FkZHJlc3MtJHtwYXJ0fSIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCduZXR3b3JrQWRkcmVzcy0nICsgcGFydCkuZ2V0VmFsdWUoKX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRjk5OTk7IHRleHQtYWxpZ246IHJpZ2h0OyIvPgotICAgICAgICAgICAgICAJPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAJPC9qeDpjaG9vc2U+Ci0gIAkJICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+U3VibmV0IE1hc2s8L2kxOG46dGV4dD48L3RkPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0icGFydCIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3BhcnROdW1iZXJzJyl9Ij4KLSAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgCTxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3N1Ym5ldE1hc2stJyArIHBhcnQpLmlzVmFsaWQoKX0iPgotICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN1Ym5ldE1hc2stJHtwYXJ0fSIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzdWJuZXRNYXNrLScgKyBwYXJ0KS5nZXRWYWx1ZSgpfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiLz4KLSAgICAgICAgICAgICAgCTwvang6d2hlbj4KLSAgICAgICAgICAgICAgCTxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3VibmV0TWFzay0ke3BhcnR9IiBzaXplPSIzIiBtYXhsZW5ndGg9IjMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3N1Ym5ldE1hc2stJyArIHBhcnQpLmdldFZhbHVlKCl9IgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkY5OTk5OyB0ZXh0LWFsaWduOiByaWdodDsiLz4KLSAgICAgICAgICAgICAgCTwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgCTwvang6Y2hvb3NlPgotICAJCSAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkLz4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJBZGQiLz4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2FkZFVzZXIuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2FkZFVzZXIuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTE1YWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9hZGRVc2VyLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICAKLSAgICA8aDE+Ci0gICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgIDxpMThuOnRleHQ+YWRkLXVzZXI8L2kxOG46dGV4dD4KLSAgICAgICAgPGkxOG46cGFyYW0+PGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCd1c2VyVHlwZScpfSIvPjwvaTE4bjp0ZXh0PjwvaTE4bjpwYXJhbT4KLSAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgPC9oMT4KLSAgICAKLSAgICA8Zm9ybSBpZD0iZm9ybS1hZGRfdXNlciIgbWV0aG9kPSJQT1NUIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLQotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0idXNlcklkIj48aTE4bjp0ZXh0PlVzZXIgSUQ8L2kxOG46dGV4dD4gKjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJJZCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ3VzZXJJZCcpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8ang6aWYgdGVzdD0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignY2xhc3NOYW1lJykgPT0gJ29yZy5hcGFjaGUubGVueWEuYWMubGRhcC5MREFQVXNlcid9Ij4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9ImxkYXBJZCI+PGkxOG46dGV4dD5MREFQIElEPC9pMThuOnRleHQ+ICo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxkYXBJZCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xkYXBJZCcpfSIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC9qeDppZj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9ImZ1bGxOYW1lIj48aTE4bjp0ZXh0Pk5hbWU8L2kxOG46dGV4dD48L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmdWxsTmFtZSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2Z1bGxOYW1lJyl9Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9ImRlc2NyaXB0aW9uIj48aTE4bjp0ZXh0PkRlc2NyaXB0aW9uPC9pMThuOnRleHQ+PC9sYWJlbD48L3RkPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDwhLS0gTi5CLjogZG8gbm90IHB1dCBzcGFjZXMgb3IgY2FycmlhZ2UgcmV0dXJucyBpbnNpZGUgdGhlCi0gICAgICAgICAgICAgICAgIHRleHRhcmUgZWxlbWVudCAtIHRoZXNlIHdvdWxkIGJlIHJlbmRlcmVkIC0tPgotICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImRlc2NyaXB0aW9uIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50Ij48ang6b3V0IHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdkZXNjcmlwdGlvbicpfSIvPjwvdGV4dGFyZWE+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0iZW1haWwiPjxpMThuOnRleHQ+RS1NYWlsPC9pMThuOnRleHQ+ICo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJlbWFpbCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2VtYWlsJyl9Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDxqeDppZiB0ZXN0PSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdjbGFzc05hbWUnKSAhPSAnb3JnLmFwYWNoZS5sZW55YS5hYy5sZGFwLkxEQVBVc2VyJ30iPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJuZXdQYXNzd29yZCI+PGkxOG46dGV4dD5QYXNzd29yZDwvaTE4bjp0ZXh0PiAqPC9sYWJlbD48L3RkPgotICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9Im5ld1Bhc3N3b3JkIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbmV3UGFzc3dvcmQnKX0iLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJjb25maXJtUGFzc3dvcmQiPjxpMThuOnRleHQ+Q29uZmlybSBwYXNzd29yZDwvaTE4bjp0ZXh0PiAqPC9sYWJlbD48L3RkPgotICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9ImNvbmZpcm1QYXNzd29yZCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2NvbmZpcm1QYXNzd29yZCcpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDwvang6aWY+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkLz4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJBZGQiLz4KLSAgICAgICAgICAgIDxhIGhyZWY9Ij9sZW55YS51c2VjYXNlPWFkbWluLnVzZXJzIj4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9mb3JtPgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvY2hhbmdlUGFzc3dvcmQuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2NoYW5nZVBhc3N3b3JkLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDMyYjAwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvY2hhbmdlUGFzc3dvcmQuangKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotCi08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOnRpdGxlPgotICAgIDxpMThuOnRleHQ+Q2hhbmdlIFBhc3N3b3JkPC9pMThuOnRleHQ+Ci0gIDwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD5DaGFuZ2UgUGFzc3dvcmQ8L2kxOG46dGV4dD4KLSAgICAgIDwvZGl2PgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3Bhc3N3b3JkRm9ybS5qeCIvPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9jaGFuZ2VQYXNzd29yZEFkbWluLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9jaGFuZ2VQYXNzd29yZEFkbWluLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDQwYmE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvY2hhbmdlUGFzc3dvcmRBZG1pbi5qeAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICAKLSAgICAgIDxoMT4KLSAgICAgICAgPGkxOG46dGV4dD5DaGFuZ2UgUGFzc3dvcmQ8L2kxOG46dGV4dD4KLSAgICAgIDwvaDE+Ci0gICAgICAKLSAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvcGFzc3dvcmRGb3JtLmp4Ii8+Ci0KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2RlbGV0ZUdyb3VwLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9kZWxldGVHcm91cC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlYTRjMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2RlbGV0ZUdyb3VwLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICA+Ci0gIAotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeCIvPgotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWIiPgotICAgIDxoMT48aTE4bjp0ZXh0PkRlbGV0ZSBHcm91cDwvaTE4bjp0ZXh0PjwvaDE+Ci0gICAgCi0gICAgPGZvcm0gaWQ9ImZvcm0tZGVsZXRlX2dyb3VwIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLQotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICA8aTE4bjp0ZXh0IGkxOG46a2V5PSJkZWxldGUtb2JqZWN0PyIvPgotICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48aTE4bjp0ZXh0Pmdyb3VwPC9pMThuOnRleHQ+JiMxNjA7PHE+PGp4Om91dCB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignZ3JvdXBJZCcpfSIvPjwvcT48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPiAgICAgICAKLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkLz4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJZZXMiLz4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9Ik5vIi8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9mb3JtPgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZGVsZXRlVXNlci5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZGVsZXRlVXNlci5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyYWRiYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2RlbGV0ZVVzZXIuangKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotCi08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYiI+Ci0gICAgPGgxPjxpMThuOnRleHQ+RGVsZXRlIFVzZXI8L2kxOG46dGV4dD48L2gxPiAgICAKLSAgICA8Zm9ybSBpZD0iZm9ybS1kZWxldGVfdXNlciI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQvPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0iZGVsZXRlLW9iamVjdD8iLz4KLSAgICAgICAgICAgICAgPGkxOG46cGFyYW0+PGkxOG46dGV4dD51c2VyPC9pMThuOnRleHQ+JiMxNjA7PHE+PGp4Om91dCB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcigndXNlcklkJyl9Ii8+PC9xPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+ICAgICAgIAotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQvPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IlllcyIvPgotICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iTm8iLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9lbXB0eVRyYXNoLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9lbXB0eVRyYXNoLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWU1ZjI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZW1wdHlUcmFzaC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICA8aDE+PGkxOG46dGV4dD5EZWxldGUgVHJhc2g8L2kxOG46dGV4dD48L2gxPgotICAgICAgCi0gICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICA8cD4KLSAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50cycpLmlzRW1wdHkoKX0iPgotICAgICAgICAgIDxpMThuOnRleHQ+VGhlIHRyYXNoIGlzIGVtcHR5LjwvaTE4bjp0ZXh0PgotICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjIiPjxpMThuOnRleHQ+RG9jdW1lbnRzIGluIHRyYXNoPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9ImRvY3VtZW50IiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRzJyl9Ij4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke2RvY3VtZW50Lmhhc0xpbmsoKX0iPgotICAgICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke2RvY3VtZW50LmdldFBhdGgoKX0iLz4KLSAgICAgICAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke2RvY3VtZW50LmdldE1ldGFEYXRhKCdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpLmdldEZpcnN0VmFsdWUoJ3RpdGxlJyl9Ii8+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgIDwvang6Y2hvb3NlPgotICAgIDwvcD4KLSAgICA8Zm9ybSBpZD0iZm9ybS1kZWxldGVfdHJhc2giIHN0eWxlPSJtYXJnaW4tdG9wOiAyMHB4Ij4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50cycpLmlzRW1wdHkoKX0iPgotICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkRlbGV0ZSIgZGlzYWJsZWQ9ImRpc2FibGVkIi8+Ci0gICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJEZWxldGUiLz4KLSAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICA8L2p4OmNob29zZT4KLSAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9ncm91cC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZ3JvdXAuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGFjZWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9ncm91cC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICA8aDE+PGkxOG46dGV4dD5Hcm91cCBQcm9maWxlPC9pMThuOnRleHQ+PC9oMT4KLSAgICAgIAotICAgICAgPGp4OnNldCB2YXI9Imdyb3VwIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZ3JvdXAnKX0iLz4KLQotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5Hcm91cCBJRDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgIDx0ZD48ang6b3V0IHZhbHVlPSIke2dyb3VwLmdldElkKCl9Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5OYW1lPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgPHRkPjxqeDpvdXQgdmFsdWU9IiR7Z3JvdXAuZ2V0TmFtZSgpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PkRlc2NyaXB0aW9uPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPCEtLSBOLkIuOiBkbyBub3QgcHV0IHNwYWNlcyBvciBjYXJyaWFnZSByZXR1cm5zIGluc2lkZSB0aGUKLSAgICAgICAgICAgICAgICAgdGV4dGFyZWEgZWxlbWVudCAtIHRoZXNlIHdvdWxkIGJlIHJlbmRlcmVkIC0tPgotICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtncm91cC5nZXREZXNjcmlwdGlvbigpfSIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQvPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxmb3JtIGlkPSJmb3JtLWVkaXRfcHJvZmlsZSI+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSJhZG1pbi5ncm91cFByb2ZpbGUiLz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZ3JvdXBJZCIgdmFsdWU9IiR7Z3JvdXAuZ2V0SWQoKX0iLz4KLSAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkVkaXQgUHJvZmlsZSIgbmFtZT0iaW5wdXQtZWRpdF9wcm9maWxlIi8+Ci0gICAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0Pk1lbWJlcnM8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8ang6c2V0IHZhcj0ibWVtYmVycyIgdmFsdWU9IiR7Z3JvdXAuZ2V0TWVtYmVycygpfSIvPgotICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJtZW1iZXIiIGl0ZW1zPSIke21lbWJlcnN9Ij48ang6aWYgdGVzdD0iJHttZW1iZXIgIT0gbWVtYmVyc1swXX0iPiwgPC9qeDppZj4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iP2xlbnlhLnVzZWNhc2U9YWRtaW4udXNlciZhbXA7dXNlcklkPSR7bWVtYmVyLmdldElkKCl9Ij48ang6b3V0IHZhbHVlPSIke21lbWJlci5nZXRJZCgpfSIvPjwvYT48L2p4OmZvckVhY2g+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGZvcm0gaWQ9ImZvcm0tZWRpdF9tZW1iZXJzIj4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9ImFkbWluLmdyb3VwTWVtYmVycyIvPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJncm91cElkIiB2YWx1ZT0iJHtncm91cC5nZXRJZCgpfSIvPgotICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRWRpdCBNZW1iZXJzIiBuYW1lPSJpbnB1dC1lZGl0X21lbWJlcnMiLz4KLSAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGZvcm0gaWQ9ImZvcm0tY2FuY2VsIj4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgPC9mb3JtPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZ3JvdXBNZW1iZXJzLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9ncm91cE1lbWJlcnMuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjAwYjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9ncm91cE1lbWJlcnMuangKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotCi08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYiI+Ci0gICAgPGgxPjxpMThuOnRleHQ+R3JvdXAgQWZmaWxpYXRpb248L2kxOG46dGV4dD48L2gxPgotICAgIAotICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0tZ3JvdXBfYWZmaWxpYXRpb24iPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotCi0gICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXItbm9wYWRkaW5nIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxzdHJvbmc+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+R3JvdXAgVXNlcnM8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvc3Ryb25nPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkLz4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8c3Ryb25nPgotICAgICAgICAgICAgICA8aTE4bjp0ZXh0PkFsbCBVc2VyczwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgPC9zdHJvbmc+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSI+Ci0gICAgICAgICAgICA8c2VsZWN0IG5hbWU9Imdyb3VwVXNlciIgc2l6ZT0iMTUiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQtbmFycm93Ij4KLSAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJ1c2VyIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZ3JvdXBVc2VycycpfSI+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHt1c2VyfSI+PGp4Om91dCB2YWx1ZT0iJHt1c2VyfSIvPjwvb3B0aW9uPgotICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSI+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iYWRkIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSImbHQ7Ii8+Ci0gICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9InJlbW92ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJmd0OyIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIj4KLSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ib3RoZXJVc2VyIiBzaXplPSIxNSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudC1uYXJyb3ciPgotICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9Im90aGVyVXNlciIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ290aGVyVXNlcnMnKX0iPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7b3RoZXJVc2VyfSI+PGp4Om91dCB2YWx1ZT0iJHtvdGhlclVzZXJ9Ii8+PC9vcHRpb24+Ci0gICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Ci0gICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU2F2ZSIvPgotICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0KLSAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9ncm91cFByb2ZpbGUuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2dyb3VwUHJvZmlsZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4MDRmMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2dyb3VwUHJvZmlsZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICA8aDE+PGkxOG46dGV4dD5FZGl0IEdyb3VwIFByb2ZpbGU8L2kxOG46dGV4dD48L2gxPgotICAgIAotICAgIDxmb3JtIGlkPSJmb3JtLWVkaXRfZ3JvdXBfcHJvZmlsZSI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+R3JvdXAgSUQ8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICA8dGQ+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZ3JvdXBJZCcpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9Im5hbWUiPjxpMThuOnRleHQ+TmFtZTwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuYW1lIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbmFtZScpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJkZXNjcmlwdGlvbiI+PGkxOG46dGV4dD5EZXNjcmlwdGlvbjwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPCEtLSBOLkIuOiBkbyBub3QgcHV0IHNwYWNlcyBvciBjYXJyaWFnZSByZXR1cm5zIGluc2lkZSB0aGUKLSAgICAgICAgICAgICAgICAgdGV4dGFyZWEgZWxlbWVudCAtIHRoZXNlIHdvdWxkIGJlIHJlbmRlcmVkIC0tPgotICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImRlc2NyaXB0aW9uIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50Ij48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkZXNjcmlwdGlvbicpfSIvPjwvdGV4dGFyZWE+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQvPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiLz4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2dyb3Vwcy5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZ3JvdXBzLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGExZGM2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvZ3JvdXBzLmp4CisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICA+Ci0gIAotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeCIvPgotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWIiPgotICAgICAgCi0gICAgICA8aDE+PGkxOG46dGV4dD5Hcm91cHM8L2kxOG46dGV4dD48L2gxPgotICAgIAotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICAKLSAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHgiPgotICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgIAkgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogMHB4Ij4KLSAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiIGlkPSJmb3JtLWFkZF9ncm91cCI+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9ImFkbWluLmFkZEdyb3VwIi8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkFkZCBHcm91cCIgbmFtZT0iaW5wdXQtYWRkX2dyb3VwIi8+Ci0gICAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvZGl2PgotICAgICAgCi0gICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJsZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0Pkdyb3VwIElEPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGg+PGkxOG46dGV4dD5OYW1lPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGg+PGkxOG46dGV4dD5BY3Rpb25zPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJncm91cCIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2dyb3VwcycpfSI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlIj4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iJHtyZXF1ZXN0LnBhdGhJbmZvfT9sZW55YS51c2VjYXNlPWFkbWluLmdyb3VwJmFtcDtncm91cElkPSR7Z3JvdXAuZ2V0SWQoKX0iPjxqeDpvdXQgdmFsdWU9IiR7Z3JvdXAuZ2V0SWQoKX0iLz48L2E+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlIj4KLSAgICAgICAgICAgICAgPGp4OmlmIHRlc3Q9IiR7Z3JvdXAuZ2V0TmFtZSgpLmVxdWFscygnJyl9Ij48c3BhbiBzdHlsZT0iY29sb3I6ICM5OTk5OTkiPi0tPC9zcGFuPjwvang6aWY+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7Z3JvdXAuZ2V0TmFtZSgpfSIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZSI+Ci0gICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIiBpZD0iZm9ybS1kZWxldGVfZ3JvdXAiPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSJhZG1pbi5kZWxldGVHcm91cCIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJncm91cElkIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIke2dyb3VwLmdldElkKCl9Ii8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkRlbGV0ZSIgbmFtZT0iaW5wdXQtZGVsZXRlX2dyb3VwIi8+Ci0gICAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgPC90YWJsZT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2UuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2UuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODUwMmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9pcFJhbmdlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogdXNlci5qeCAxNjQyMzEgMjAwNS0wNC0yMiAxMjo1Njo1OVogandrYWx0eiAkIC0tPgotCi08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYiI+Ci0gICAgPGgxPjxpMThuOnRleHQ+SVAgUmFuZ2UgUHJvZmlsZTwvaTE4bjp0ZXh0PjwvaDE+Ci0gICAgCi0gICAgICA8ang6c2V0IHZhcj0iaXBSYW5nZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2lwUmFuZ2UnKX0iLz4KLSAgICAKLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+SVAgUmFuZ2UgSUQ8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICA8dGQ+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignaXBSYW5nZUlkJyl9Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5OYW1lPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgPHRkPjxqeDpvdXQgdmFsdWU9IiR7aXBSYW5nZS5nZXROYW1lKCl9Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+RGVzY3JpcHRpb248L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke2lwUmFuZ2UuZ2V0RGVzY3JpcHRpb24oKX0iLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5OZXR3b3JrIEFkZHJlc3M8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke2lwUmFuZ2UuZ2V0TmV0d29ya0FkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpfSIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PlN1Ym5ldCBNYXNrPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtpcFJhbmdlLmdldFN1Ym5ldE1hc2soKS5nZXRIb3N0QWRkcmVzcygpfSIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGZvcm0gaWQ9ImZvcm0taXByYW5nZV9lZGl0X3Byb2ZpbGUiPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iYWRtaW4uaXBSYW5nZVByb2ZpbGUiLz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaXBSYW5nZUlkIiB2YWx1ZT0iJHtpcFJhbmdlLmdldElkKCl9Ii8+Ci0gICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFZGl0IFByb2ZpbGUiIG5hbWU9ImlucHV0LWlwcmFuZ2VfZWRpdF9wcm9maWxlIi8+Ci0gICAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+R3JvdXBzPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGp4OnNldCB2YXI9Imdyb3VwcyIgdmFsdWU9IiR7aXBSYW5nZS5nZXRHcm91cHMoKX0iLz4KLSAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke2dyb3Vwcy5zaXplKCkgPT0gMH0iPjxpMThuOnRleHQ+Tm8gZ3JvdXBzIGFzc2lnbmVkPC9pMThuOnRleHQ+PC9qeDppZj4KLSAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iZ3JvdXAiIGl0ZW1zPSIke2dyb3Vwc30iPgotICAgICAgICAgICAgICA8YSBocmVmPSIke3VzZWNhc2UuZ2V0U291cmNlVVJMKCl9P2xlbnlhLnVzZWNhc2U9YWRtaW4uZ3JvdXAmYW1wO2dyb3VwSWQ9JHtncm91cC5nZXRJZCgpfSI+PGp4Om91dCB2YWx1ZT0iJHtncm91cC5nZXRJZCgpfSIvPjwvYT4KLSAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGZvcm0gaWQ9ImZvcm0taXByYW5nZV9lZGl0X2dyb3VwX2FmZmlsaWF0aW9uIj4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9ImFkbWluLmlwUmFuZ2VHcm91cHMiLz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaXBSYW5nZUlkIiB2YWx1ZT0iJHtpcFJhbmdlLmdldElkKCl9Ii8+Ci0gICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFZGl0IEdyb3VwIEFmZmlsaWF0aW9uIiBuYW1lPSJpbnB1dC1pcHJhbmdlX2VkaXRfZ3JvdXBfYWZmaWxpYXRpb24iLz4KLSAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGZvcm0gaWQ9ImZvcm0taXByYW5nZV9jYW5jZWwiPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2VHcm91cHMuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2VHcm91cHMuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTRlMTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9pcFJhbmdlR3JvdXBzLmp4CisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiB1c2VyR3JvdXBzLmp4IDE2NDIzMyAyMDA1LTA0LTIyIDEzOjAxOjQ1WiBqd2thbHR6ICQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICAgIDxoMT48aTE4bjp0ZXh0Pkdyb3VwIEFmZmlsaWF0aW9uPC9pMThuOnRleHQ+PC9oMT4KLSAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtLWdyb3VwX2FmZmlsaWF0aW9uIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLQotICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotCi0gICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyLW5vcGFkZGluZyI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8c3Ryb25nPgotICAgICAgICAgICAgICA8aTE4bjp0ZXh0PklQIFJhbmdlIEdyb3VwczwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgPC9zdHJvbmc+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQvPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxzdHJvbmc+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+QWxsIEdyb3VwczwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgPC9zdHJvbmc+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSI+Ci0gICAgICAgICAgICA8c2VsZWN0IG5hbWU9ImlwUmFuZ2VHcm91cCIgc2l6ZT0iMTUiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQtbmFycm93Ij4KLSAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJncm91cCIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2lwUmFuZ2VHcm91cHMnKX0iPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7Z3JvdXB9Ij48ang6b3V0IHZhbHVlPSIke2dyb3VwfSIvPjwvb3B0aW9uPgotICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSI+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iYWRkIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSImbHQ7Ii8+Ci0gICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9InJlbW92ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJmd0OyIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIj4KLSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ib3RoZXJHcm91cCIgc2l6ZT0iMTUiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQtbmFycm93Ij4KLSAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJvdGhlckdyb3VwIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignb3RoZXJHcm91cHMnKX0iPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7b3RoZXJHcm91cH0iPjxqeDpvdXQgdmFsdWU9IiR7b3RoZXJHcm91cH0iLz48L29wdGlvbj4KLSAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KLSAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTYXZlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLQotICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2VQcm9maWxlLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9pcFJhbmdlUHJvZmlsZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyZTI1Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2VQcm9maWxlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYiI+Ci0gICAgICAKLSAgICA8aDE+PGkxOG46dGV4dD5JUCBSYW5nZSBQcm9maWxlPC9pMThuOnRleHQ+PC9oMT4KLSAgICAKLSAgICA8Zm9ybSBpZD0iZm9ybS1pcHJhbmdlX3Byb2ZpbGUiPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgCi0gICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PklQIFJhbmdlIElEPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgPHRkPjxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2lwUmFuZ2VJZCcpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0Pk5hbWU8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIGNsYXNzPSJsZW55YS1mb3JtLWVudHJ5IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbmFtZScpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PkRlc2NyaXB0aW9uPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImRlc2NyaXB0aW9uIiBjbGFzcz0ibGVueWEtZm9ybS1lbnRyeSI+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZGVzY3JpcHRpb24nKX0iLz48L3RleHRhcmVhPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5OZXR3b3JrIEFkZHJlc3M8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InBhcnQiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdwYXJ0TnVtYmVycycpfSI+Ci0gICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgIAk8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCduZXR3b3JrQWRkcmVzcy0nICsgcGFydCkuaXNWYWxpZCgpfSI+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmV0d29ya0FkZHJlc3MtJHtwYXJ0fSIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCduZXR3b3JrQWRkcmVzcy0nICsgcGFydCkuZ2V0VmFsdWUoKX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0Ii8+Ci0gICAgICAgICAgICAgIAk8L2p4OndoZW4+Ci0gICAgICAgICAgICAgIAk8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5ldHdvcmtBZGRyZXNzLSR7cGFydH0iIHNpemU9IjMiIG1heGxlbmd0aD0iMyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbmV0d29ya0FkZHJlc3MtJyArIHBhcnQpLmdldFZhbHVlKCl9IgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkY5OTk5OyB0ZXh0LWFsaWduOiByaWdodDsiLz4KLSAgICAgICAgICAgICAgCTwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgCTwvang6Y2hvb3NlPgotICAJCSAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PlN1Ym5ldCBNYXNrPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJwYXJ0IiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncGFydE51bWJlcnMnKX0iPgotICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAJPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc3VibmV0TWFzay0nICsgcGFydCkuaXNWYWxpZCgpfSI+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3VibmV0TWFzay0ke3BhcnR9IiBzaXplPSIzIiBtYXhsZW5ndGg9IjMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3N1Ym5ldE1hc2stJyArIHBhcnQpLmdldFZhbHVlKCl9IgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodCIvPgotICAgICAgICAgICAgICAJPC9qeDp3aGVuPgotICAgICAgICAgICAgICAJPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzdWJuZXRNYXNrLSR7cGFydH0iIHNpemU9IjMiIG1heGxlbmd0aD0iMyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc3VibmV0TWFzay0nICsgcGFydCkuZ2V0VmFsdWUoKX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRjk5OTk7IHRleHQtYWxpZ246IHJpZ2h0OyIvPgotICAgICAgICAgICAgICAJPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAJPC9qeDpjaG9vc2U+Ci0gIAkJICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQvPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiLz4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2VzLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9pcFJhbmdlcy5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllODNmYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL2lwUmFuZ2VzLmp4CisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICA+Ci0gIAotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeCIvPgotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWIiPgotICAgICAgCi0gICAgICA8aDE+PGkxOG46dGV4dD5JUCBSYW5nZXM8L2kxOG46dGV4dD48L2gxPgotICAgIAotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICAKLSAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHgiPgotICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCIgaWQ9ImZvcm0tYWRkX2lwcmFuZ2UiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSJhZG1pbi5hZGRJUFJhbmdlIi8+Ci0gICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkFkZCBJUCBSYW5nZSIgbmFtZT0iaW5wdXQtYWRkX2lwcmFuZ2UiLz4KLSAgICAgICAgPC9mb3JtPgotICAgICAgPC9kaXY+Ci0gICAgICAKLSAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9ImxlbnlhLXRhYmxlLWxpc3Qtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRoPjxpMThuOnRleHQ+SVAgUmFuZ2UgSUQ8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0Pk5hbWU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0Pkdyb3VwczwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgPHRoPjxpMThuOnRleHQ+QWN0aW9uczwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iaXBSYW5nZSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2lwUmFuZ2VzJyl9Ij4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGUiPgotICAgICAgICAgICAgICA8YSBocmVmPSIke3VzZWNhc2UuZ2V0U291cmNlVVJMKCl9P2xlbnlhLnVzZWNhc2U9YWRtaW4uaXBSYW5nZSZhbXA7aXBSYW5nZUlkPSR7aXBSYW5nZS5nZXRJZCgpfSI+PGp4Om91dCB2YWx1ZT0iJHtpcFJhbmdlLmdldElkKCl9Ii8+PC9hPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZSI+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7aXBSYW5nZS5nZXROYW1lKCl9Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlIj4KLSAgICAgICAgICAgICAgPGp4OmlmIHRlc3Q9IiR7aXBSYW5nZS5nZXRHcm91cHMoKS5zaXplKCkgPT0gMH0iPjxzcGFuIHN0eWxlPSJjb2xvcjogIzk5OTk5OSI+LS08L3NwYW4+PC9qeDppZj4KLSAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJncm91cCIgaXRlbXM9IiR7aXBSYW5nZS5nZXRHcm91cHMoKX0iPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiR7dXNlY2FzZS5nZXRTb3VyY2VVUkwoKX0/bGVueWEudXNlY2FzZT1hZG1pbi5ncm91cFByb2ZpbGUmYW1wO2dyb3VwSWQ9JHtncm91cC5nZXRJZCgpfSI+PGp4Om91dCB2YWx1ZT0iJHtncm91cC5nZXRJZCgpfSIvPjwvYT4KLSAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZSI+Ci0gICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIiBpZD0iZm9ybS1kZWxldGVfaXByYW5nZSI+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9ImFkbWluLmRlbGV0ZUlQUmFuZ2UiLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iaXBSYW5nZUlkIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIke2lwUmFuZ2UuZ2V0SWQoKX0iLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRGVsZXRlIiBuYW1lPSJpbnB1dC1kZWxldGVfaXByYW5nZSIvPgotICAgICAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgIDwvdGFibGU+Ci0gICAgICAgIAotICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3Bhc3N3b3JkRm9ybS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvcGFzc3dvcmRGb3JtLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmIzODU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvcGFzc3dvcmRGb3JtLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGp4OnRlbXBsYXRlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgbmFtZT0iIj4KLQotICA8Zm9ybSBpZD0iZm9ybS1jaGFuZ2VfcGFzc3dvcmQiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgCi0gICAgPGp4OnNldCB2YXI9ImN1cnJlbnRVc2VySWQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdwcml2YXRlLnNlc3Npb24nKS5nZXRJZGVudGl0eSgpLmdldFVzZXIoKS5nZXRJZCgpfSIvPgotICAgIDxqeDpzZXQgdmFyPSJ1c2VySWQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1c2VySWQnLCBjdXJyZW50VXNlcklkKX0iLz4KLSAgICAKLSAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5Vc2VybmFtZTwvaTE4bjp0ZXh0PjwvdGQ+Ci0gICAgICAgIDx0ZD48ang6b3V0IHZhbHVlPSIke3VzZXJJZH0iLz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDxqeDppZiB0ZXN0PSIke3VzZWNhc2UuZ2V0VmlldygpLmdldFBhcmFtZXRlcignY2hlY2tQYXNzd29yZCcpLmVxdWFscygndHJ1ZScpfSI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9Im9sZFBhc3N3b3JkIj48aTE4bjp0ZXh0Pk9sZCBQYXNzd29yZDwvaTE4bjp0ZXh0PiAqPC9sYWJlbD48L3RkPgotICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9Im9sZFBhc3N3b3JkIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignb2xkUGFzc3dvcmQnKX0iLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC9qeDppZj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJuZXdQYXNzd29yZCI+PGkxOG46dGV4dD5OZXcgUGFzc3dvcmQ8L2kxOG46dGV4dD4gKjwvbGFiZWw+PC90ZD4KLSAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0ibmV3UGFzc3dvcmQiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCduZXdQYXNzd29yZCcpfSIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9ImNvbmZpcm1QYXNzd29yZCI+PGkxOG46dGV4dD5Db25maXJtIFBhc3N3b3JkPC9pMThuOnRleHQ+ICo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgIDx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9ImNvbmZpcm1QYXNzd29yZCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2NvbmZpcm1QYXNzd29yZCcpfSIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgCi0gICAgICA8dHI+Ci0gICAgICAgIDx0ZC8+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTYXZlIi8+Ci0gICAgICAgICAgPGEgaHJlZj0iP2xlbnlhLnVzZWNhc2U9YWRtaW4udXNlciZhbXA7dXNlcklkPSR7dXNlcklkfSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiIGkxOG46YXR0cj0idmFsdWUiLz4KLSAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZm9ybT4KLTwvang6dGVtcGxhdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9zZXJ2ZXJTdGF0dXMuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3NlcnZlclN0YXR1cy5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwOGYyZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3NlcnZlclN0YXR1cy5qeAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxuczpjaW5jbHVkZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2luY2x1ZGUvMS4wIgotICA+Ci0gIAotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeCIvPgotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWIiPgotICAgICAgCi0gICAgICA8aDE+PGkxOG46dGV4dD5TZXJ2ZXIgU3RhdHVzPC9pMThuOnRleHQ+PC9oMT4KLSAgICAgIAotICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgCi0gICAgICA8Y2luY2x1ZGU6aW5jbHVkZXhtbD4KLSAgICAgICAgPGNpbmNsdWRlOnNyYz5jb2Nvb246Ly9tb2R1bGVzL2FkbWluaXN0cmF0aW9uL3N0YXR1cy54bWw8L2NpbmNsdWRlOnNyYz4KLSAgICAgIDwvY2luY2x1ZGU6aW5jbHVkZXhtbD4KLSAgICAgIAotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvc2Vzc2lvbnMuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3Nlc3Npb25zLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBjZGI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvc2Vzc2lvbnMuangKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IC0tPgotCi08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYiI+Ci0gICAgICAKLSAgICAgIDxoMT48aTE4bjp0ZXh0PlNlc3Npb25zPC9pMThuOnRleHQ+PC9oMT4KLSAgICAKLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgICAgCi0gICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJsZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PlVzZXIgSUQ8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PkZ1bGwgTmFtZTwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgPHRoPjxpMThuOnRleHQ+ZS1tYWlsPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJ1c2VyIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndXNlcnMnKX0iPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZSI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiR7dXNlY2FzZS5nZXRTb3VyY2VVUkwoKX0/bGVueWEudXNlY2FzZT1hZG1pbi51c2VyJmFtcDt1c2VySWQ9JHt1c2VyLmdldElkKCl9Ij48ang6b3V0IHZhbHVlPSIke3VzZXIuZ2V0SWQoKX0iLz48L2E+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlIj4KLSAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VyLmdldE5hbWUoKX0iLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGUiPgotICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke3VzZXIuZ2V0RW1haWwoKX0iLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgPC90YWJsZT4KLSAgICAgICAgCi0gIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy9zaXRlT3ZlcnZpZXcuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3NpdGVPdmVydmlldy5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhZmE0OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3NpdGVPdmVydmlldy5qeAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IGVtcHR5VHJhc2guanggMTY0MjMzIDIwMDUtMDQtMjIgMTM6MDE6NDVaIGp3a2FsdHogJCAtLT4KLQotPHBhZ2U6cGFnZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICA+Ci0gIAotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeCIvPgotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWIiPgotICAgIDxoMT48aTE4bjp0ZXh0Pk92ZXJ2aWV3PC9pMThuOnRleHQ+PC9oMT4KLSAgICAgIAotICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgPGZvcm0gaWQ9ImZvcm0tb3ZlcnZpZXciPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgCi0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPjxpMThuOnRleHQ+RmlsdGVyPC9pMThuOnRleHQ+PC9kaXY+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iZmlsdGVyIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZmlsdGVycycpfSI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHtmaWx0ZXJ9Ii8+PC9pMThuOnRleHQ+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIG5hbWU9IiR7ZmlsdGVyfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0idmFsdWUiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKGZpbHRlciArICdWYWx1ZXMnKX0iPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJzZWxlY3RlZFZhbHVlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcihmaWx0ZXIpfSIvPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3ZhbHVlLmVxdWFscyhzZWxlY3RlZFZhbHVlKX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke3ZhbHVlfSIgc2VsZWN0ZWQ9InNlbGVjdGVkIj48aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7dmFsdWV9Ii8+PC9pMThuOnRleHQ+PC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke3ZhbHVlfSI+PGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke3ZhbHVlfSIvPjwvaTE4bjp0ZXh0Pjwvb3B0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD48L3RkPgotICAgICAgICAgICAgICA8dGQ+PGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlVwZGF0ZSIgbmFtZT0iaW5wdXQtc3VibWl0Ii8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICA8L2Rpdj4KLSAgICAgIAotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJrZXkiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdrZXlzJyl9Ij4KLSAgICAgICAgICAgIDx0aCBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcCI+IDxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHtrZXl9Ii8+PC9pMThuOnRleHQ+IAotICAgICAgICAgICAgICA8YSBjbGFzcz0ic29ydEFycm93IiBocmVmPSIke3JlcXVlc3QucGF0aEluZm99P29yZGVyPWFzYyZhbXA7c29ydD0ke2tleX0mYW1wO2xlbnlhLnVzZWNhc2U9JHt1c2VjYXNlLmdldE5hbWUoKX0mYW1wO2xlbnlhLmNvbnRpbnVhdGlvbj0ke2NvbnRpbnVhdGlvbi5pZH0iPgotICAgICAgICAgICAgICAgICYjeDI1QkM7Ci0gICAgICAgICAgICAgIDwvYT4KLSAgICAgICAgICAgICAgPGEgY2xhc3M9InNvcnRBcnJvdyIgaHJlZj0iJHtyZXF1ZXN0LnBhdGhJbmZvfT9vcmRlcj1kZXNjJmFtcDtzb3J0PSR7a2V5fSZhbXA7bGVueWEudXNlY2FzZT0ke3VzZWNhc2UuZ2V0TmFtZSgpfSZhbXA7bGVueWEuY29udGludWF0aW9uPSR7Y29udGludWF0aW9uLmlkfSI+Ci0gICAgICAgICAgICAgICAgJiN4MjVCMjsKLSAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8ang6Zm9yRWFjaCB2YXI9ImVudHJ5IiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRzJyl9Ij4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9ImtleSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2tleXMnKX0iPgotICAgICAgICAgICAgICA8dGQgc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXAiPgotICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke2tleS5lcXVhbHMoJ2tleVBhdGgnKX0iPgotICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIke2VudHJ5LmdldFZhbHVlKCdrZXlVcmwnKX0iPgotICAgICAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHtlbnRyeS5nZXRWYWx1ZShrZXkpfSIvPjwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke2tleS5lcXVhbHMoJ2tleUNoZWNrZWRPdXQnKSAmYW1wOyZhbXA7ICFlbnRyeS5nZXRWYWx1ZShrZXkpLmVxdWFscygnJyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJHt1c2VjYXNlLmdldFNvdXJjZVVSTCgpfT9sZW55YS51c2VjYXNlPWFkbWluLnVzZXImYW1wO3VzZXJJZD0ke2VudHJ5LmdldFZhbHVlKGtleSl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7ZW50cnkuZ2V0VmFsdWUoa2V5KX0iLz48L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke2VudHJ5LmdldFZhbHVlKGtleSl9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgIAotICAgICAgPC90YWJsZT4KLSAgICAgIAotICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3VzZWNhc2VzLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy91c2VjYXNlcy5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3YTRhNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3VzZWNhc2VzLmp4CisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiB1c2VyLmp4IDQ3Mzg2MSAyMDA2LTExLTEyIDAzOjUxOjE0WiBncmVnb3IgJCAtLT4KLQotPHBhZ2U6cGFnZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICA+Ci0gIAotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeCIvPgotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWIiPgotICAgICAgPGgxPjxpMThuOnRleHQ+VXNlY2FzZXM8L2kxOG46dGV4dD48L2gxPgotICAgICAgCi0gICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtLXVzZWNhc2VzIj4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXROYW1lKCl9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICA8cD48aTE4bjp0ZXh0PnVzZWNhc2UtcG9saWNpZXMtbWVzc2FnZTwvaTE4bjp0ZXh0PjwvcD4KLSAgICAgICAgPGp4OmlmIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3RlbXBsYXRlcycpLnNpemUoKSAmZ3Q7IDB9Ij4KLSAgICAgICAgICA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+PGJyLz4KLSAgICAgICAgICAgIElmIHlvdSBzdWJtaXQgdGhpcyBmb3JtLCBhbGwgdXNlY2FzZSBwZXJtaXNzaW9ucwotICAgICAgICAgICAgYXJlIHN0b3JlZCBmb3IgdGhlIHB1YmxpY2F0aW9uICI8ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdwdWJsaWNhdGlvbklkJyl9Ii8+Ii4KLSAgICAgICAgICAgIElmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgaW5oZXJpdGVkIHVzZWNhc2UgcGVybWlzc2lvbnMgb2YgYSB0ZW1wbGF0ZSBwdWJsaWNhdGlvbiwgcGxlYXNlIGdvCi0gICAgICAgICAgICB0byB0aGUgYWRtaW5pc3RyYXRpb24gR1VJIG9mIG9uZSBvZiB0aGUgdGVtcGxhdGVzCi0gICAgICAgICAgICAoPGp4OmZvckVhY2ggdmFyPSJ0ZW1wbGF0ZSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3RlbXBsYXRlcycpfSI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiR7Jy8nICsgdGVtcGxhdGUgKyAnL2F1dGhvcmluZy9pbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9YWRtaW4udXNlY2FzZXMnfSI+PGp4Om91dCB2YWx1ZT0iJHt0ZW1wbGF0ZX0iLz48L2E+Ci0gICAgICAgICAgICA8L2p4OmZvckVhY2g+KS4KLSAgICAgICAgICA8L3A+Ci0gICAgICAgIDwvang6aWY+Ci0gICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIj4KLSAgICAgICAgICA8ang6c2V0IHZhcj0iaSIgdmFsdWU9IjAiLz4KLSAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InVzZWNhc2VOYW1lIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndXNlY2FzZXMnKX0iPgotICAgICAgICAgICAgPGp4OmlmIHRlc3Q9IiR7aSAlIDEwID09IDB9Ij4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkezEgKyB1c2VjYXNlLmdldFBhcmFtZXRlcigncm9sZXMnKS5zaXplKCl9IiBzdHlsZT0iYm9yZGVyLWxlZnQ6IDA7IGJvcmRlci1yaWdodDogMDsiPgotICAgICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGg+PGkxOG46dGV4dD5Vc2VjYXNlPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InJvbGUiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdyb2xlcycpfSI+Ci0gICAgICAgICAgICAgICAgICA8dGg+PGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke3JvbGV9Ii8+PC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgPGp4OnNldCB2YXI9ImkiIHZhbHVlPSIke2kgKyAxfSIvPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlTmFtZX0iLz48L3RkPgotICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InJvbGUiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdyb2xlcycpfSI+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGp4OnNldCB2YXI9Im5hbWUiIHZhbHVlPSIke3VzZWNhc2VOYW1lICsgJzonICsgcm9sZX0iLz4KLSAgICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJ2YWx1ZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIobmFtZSl9Ii8+Ci0gICAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3ZhbHVlID09IGphdmEubGFuZy5Cb29sZWFuLlRSVUV9Ij4KLSAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iJHtuYW1lfSIgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ9ImNoZWNrZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSIke25hbWV9IiB0eXBlPSJjaGVja2JveCIvPgotICAgICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8cCBzdHlsZT0id2lkdGg6IDUwJSI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0IiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgIDwvcD4KLSAgICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvdXNlci5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvdXNlci5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhN2Q2Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3VzZXIuangKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICA+Ci0gIAotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeCIvPgotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWIiPgotICAgIDxoMT48aTE4bjp0ZXh0PlVzZXIgUHJvZmlsZTwvaTE4bjp0ZXh0PjwvaDE+Ci0gICAgCi0gICAgICA8ang6Y2hvb3NlPgotICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1c2VyJyl9Ij4KLSAgICAgICAgICA8ang6c2V0IHZhcj0idXNlciIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3VzZXInKX0iLz4KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5Vc2VyIElEPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1c2VySWQnKX0iLz48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0Pk5hbWU8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgPHRkPjxqeDpvdXQgdmFsdWU9IiR7dXNlci5nZXROYW1lKCl9Ii8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8ang6aWYgdGVzdD0iJHt1c2VyLmdldExkYXBJZCgpfSI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+TERBUCBJRDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48ang6b3V0IHZhbHVlPSIke3VzZXIuZ2V0TGRhcElkKCl9Ii8+PC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+RGVzY3JpcHRpb248L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlci5nZXREZXNjcmlwdGlvbigpfSIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+RS1NYWlsPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD48ang6b3V0IHZhbHVlPSIke3VzZXIuZ2V0RW1haWwoKX0iLz48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+RGVmYXVsdCBNZW51IExvY2FsZTwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+PGp4Om91dCB2YWx1ZT0iJHt1c2VyLmdldERlZmF1bHRNZW51TG9jYWxlKCl9Ii8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PkRlZmF1bHQgRG9jdW1lbnQgTG9jYWxlPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD48ang6b3V0IHZhbHVlPSIke3VzZXIuZ2V0RGVmYXVsdERvY3VtZW50TG9jYWxlKCl9Ii8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkLz4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxmb3JtIGlkPSJmb3JtLWVkaXRfdXNlcl9wcm9maWxlIj4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSJhZG1pbi51c2VyUHJvZmlsZSIvPgotICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idXNlcklkIiB2YWx1ZT0iJHt1c2VyLmdldElkKCl9Ii8+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRWRpdCBQcm9maWxlIiBuYW1lPSJpbnB1dC1lZGl0X3VzZXJfcHJvZmlsZSIvPgotICAgICAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke3VzZXIuY2FuQ2hhbmdlUGFzc3dvcmQoKSA9PSAndHJ1ZSd9Ij4gCi0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxmb3JtIGlkPSJmb3JtLWNoYW5nZV91c2VyX3Bhc3N3b3JkIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9ImFkbWluLmNoYW5nZVBhc3N3b3JkQWRtaW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idXNlcklkIiB2YWx1ZT0iJHt1c2VyLmdldElkKCl9Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UgUGFzc3dvcmQiIG5hbWU9ImlucHV0LWNoYW5nZV91c2VyX3Bhc3N3b3JkIi8+Ci0gICAgICAgICAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5Hcm91cHM8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJncm91cHMiIHZhbHVlPSIke3VzZXIuZ2V0R3JvdXBzKCl9Ii8+Ci0gICAgICAgICAgICAgICAgPGp4OnNldCB2YXI9Imdyb3VwSWRzIiB2YWx1ZT0iJHtqYXZhLnV0aWwuVHJlZVNldCgpfSIvPgotICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iZ3JvdXAiIGl0ZW1zPSIke2dyb3Vwc30iPgotICAgICAgICAgICAgICAgICAgPGp4OnNldCB2YXI9Imlnbm9yZSIgdmFsdWU9IiR7Z3JvdXBJZHMuYWRkKGdyb3VwLmdldElkKCkpfSIvPgotICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHtncm91cElkcy5zaXplKCkgPT0gMH0iPgotICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0Pk5vIGdyb3VwcyBhc3NpZ25lZDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJncm91cCIgaXRlbXM9IiR7Z3JvdXBJZHN9Ij48ang6aWYgdGVzdD0iJHtncm91cCAhPSBncm91cElkcy5maXJzdCgpfSI+LCA8L2p4OmlmPgotICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiR7cmVxdWVzdC5wYXRoSW5mb30/bGVueWEudXNlY2FzZT1hZG1pbi5ncm91cCZhbXA7Z3JvdXBJZD0ke2dyb3VwfSI+PGp4Om91dCB2YWx1ZT0iJHtncm91cH0iLz48L2E+PC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8Zm9ybSBpZD0iZm9ybS1lZGl0X2dyb3VwX2FmZmlsaWF0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSJhZG1pbi51c2VyR3JvdXBzIi8+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ1c2VySWQiIHZhbHVlPSIke3VzZXIuZ2V0SWQoKX0iLz4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFZGl0IEdyb3VwIEFmZmlsaWF0aW9uIiBuYW1lPSJpbnB1dC1lZGl0X2dyb3VwX2FmZmlsaWF0aW9uIi8+Ci0gICAgICAgICAgICAgICAgPC9mb3JtPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImZvcm0tdXNlcl9wcm9maWxlX2NhbmNlbCI+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgICAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICA8cD4KLSAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgJ3VzZXInIGlzIG1pc3NpbmcuIFBsZWFzZSBnbyBiYWNrIHRvIHRoZQotICAgICAgICAgICAgPGEgaHJlZj0iP2xlbnlhLnVzZWNhc2U9YWRtaW4udXNlcnMiPnVzZXJzIG92ZXJ2aWV3IHBhZ2U8L2E+Ci0gICAgICAgICAgICBhbmQgY2xpY2sgb24gYSB1c2VyIGxpbmsuCi0gICAgICAgICAgPC9wPgotICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgIDwvang6Y2hvb3NlPgotICAgIAotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy91c2VyR3JvdXBzLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy91c2VyR3JvdXBzLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFjODYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvdXNlckdyb3Vwcy5qeAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICAgIDxoMT48aTE4bjp0ZXh0Pkdyb3VwIEFmZmlsaWF0aW9uPC9pMThuOnRleHQ+PC9oMT4KLSAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtLXVzZXJfZ3JvdXBfYWZmaWxpYXRpb24iPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotCi0gICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXItbm9wYWRkaW5nIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxzdHJvbmc+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+VXNlciBHcm91cHM8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvc3Ryb25nPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkLz4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8c3Ryb25nPgotICAgICAgICAgICAgICA8aTE4bjp0ZXh0PkFsbCBHcm91cHM8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvc3Ryb25nPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiPgotICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJ1c2VyR3JvdXAiIHNpemU9IjE1IiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50LW5hcnJvdyI+Ci0gICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iZ3JvdXAiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1c2VyR3JvdXBzJyl9Ij4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke2dyb3VwfSI+PGp4Om91dCB2YWx1ZT0iJHtncm91cH0iLz48L29wdGlvbj4KLSAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9ImFkZCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJmx0OyIvPgotICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJyZW1vdmUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiZndDsiLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSI+Ci0gICAgICAgICAgICA8c2VsZWN0IG5hbWU9Im90aGVyR3JvdXAiIHNpemU9IjE1IiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50LW5hcnJvdyI+Ci0gICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0ib3RoZXJHcm91cCIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ290aGVyR3JvdXBzJyl9Ij4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke290aGVyR3JvdXB9Ij48ang6b3V0IHZhbHVlPSIke290aGVyR3JvdXB9Ii8+PC9vcHRpb24+Ci0gICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Ci0gICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU2F2ZSIvPgotICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0KLSAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy91c2VyUHJvZmlsZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvYWRtaW5pc3RyYXRpb24vdXNlY2FzZXMvdXNlclByb2ZpbGUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYzdlY2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy91c2VyUHJvZmlsZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICA8aDE+PGkxOG46dGV4dD5FZGl0IFVzZXIgUHJvZmlsZTwvaTE4bjp0ZXh0PjwvaDE+Ci0gICAgCi0gICAgPGZvcm0gaWQ9ImZvcm0tZWRpdF91c2VyX3Byb2ZpbGUiPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotCi0gICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PlVzZXIgSUQ8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICA8dGQ+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndXNlcklkJyl9Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0ibmFtZSI+PGkxOG46dGV4dD5OYW1lPC9pMThuOnRleHQ+PC9sYWJlbD46PC90ZD4KLSAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImZ1bGxOYW1lIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZnVsbE5hbWUnKX0iLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0iZGVzY3JpcHRpb24iPjxpMThuOnRleHQ+RGVzY3JpcHRpb248L2kxOG46dGV4dD46PC9sYWJlbD48L3RkPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDwhLS0gTi5CLjogZG8gbm90IHB1dCBzcGFjZXMgb3IgY2FycmlhZ2UgcmV0dXJucyBpbnNpZGUgdGhlCi0gICAgICAgICAgICAgICAgIHRleHRhcmVhIGVsZW1lbnQgLSB0aGVzZSB3b3VsZCBiZSByZW5kZXJlZCAtLT4KLSAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJkZXNjcmlwdGlvbiIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCI+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZGVzY3JpcHRpb24nKX0iLz48L3RleHRhcmVhPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0iZW1haWwiPjxpMThuOnRleHQ+RS1NYWlsPC9pMThuOnRleHQ+ICo8L2xhYmVsPjo8L3RkPgotICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZW1haWwiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdlbWFpbCcpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJkZWZhdWx0TWVudUxvY2FsZSI+PGkxOG46dGV4dD5EZWZhdWx0IE1lbnUgTG9jYWxlPC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRlZmF1bHRNZW51TG9jYWxlIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZGVmYXVsdE1lbnVMb2NhbGUnKX0iLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0iZGVmYXVsdERvY3VtZW50TG9jYWxlIj48aTE4bjp0ZXh0PkRlZmF1bHQgRG9jdW1lbnQgTG9jYWxlPC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRlZmF1bHREb2N1bWVudExvY2FsZSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RlZmF1bHREb2N1bWVudExvY2FsZScpfSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkLz4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTYXZlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3VzZXJzLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9hZG1pbmlzdHJhdGlvbi91c2VjYXNlcy91c2Vycy5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyMzliNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2FkbWluaXN0cmF0aW9uL3VzZWNhc2VzL3VzZXJzLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYiI+Ci0gICAgICAKLSAgICAgIDxoMT48aTE4bjp0ZXh0PlVzZXJzPC9pMThuOnRleHQ+PC9oMT4KLSAgICAKLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgICAgCi0gICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxMHB4OyI+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgCSAgPHRyPgotICAgICAgCSAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDA7IG1hcmdpbjogMCAxMHB4IDAgMDsiPgotICAgICAgCQkgIDxpMThuOnRleHQ+QWRkIFVzZXI8L2kxOG46dGV4dD46JiMxNjA7Ci0gICAgCSAgICA8L3RkPgotICAgIAkgICAgPGp4OmZvckVhY2ggdmFyPSJ0eXBlIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndXNlclR5cGVzJyl9Ij4KLSAgICAJICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiAwOyBtYXJnaW46IDAgMTBweCAwIDA7Ij4KLSAgICAJICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCIgaWQ9ImZvcm0tYWRkX3VzZXIiPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3R5cGUuZ2V0Q3JlYXRlVXNlQ2FzZSgpfSIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNsYXNzTmFtZSIgdmFsdWU9IiR7dHlwZS5nZXRDbGFzc05hbWUoKX0iLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ1c2VyVHlwZSIgdmFsdWU9IiR7dHlwZS5nZXRLZXkoKX0iLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJHt0eXBlLmdldEtleSgpfSIgbmFtZT0iaW5wdXQtYWRkX3VzZXIiLz4KLSAgICAgICAgICAgICAgPC9mb3JtPgotICAgIAkgICAgICA8L3RkPgotICAgIAkgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Rpdj4KLSAgICAgIAotICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibGVueWEtdGFibGUtbGlzdC1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGg+PGkxOG46dGV4dD5Vc2VyIElEPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGg+PGkxOG46dGV4dD5GdWxsIE5hbWU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0Pkdyb3VwczwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgPHRoPjxpMThuOnRleHQ+QWN0aW9uczwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDxqeDpmb3JFYWNoIHZhcj0idXNlciIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3VzZXJzJyl9Ij4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGUiPgotICAgICAgICAgICAgICA8YSBocmVmPSIke3VzZWNhc2UuZ2V0U291cmNlVVJMKCl9P2xlbnlhLnVzZWNhc2U9YWRtaW4udXNlciZhbXA7dXNlcklkPSR7dXNlci5nZXRJZCgpfSI+PGp4Om91dCB2YWx1ZT0iJHt1c2VyLmdldElkKCl9Ii8+PC9hPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZSI+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlci5nZXROYW1lKCl9Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8ang6c2V0IHZhcj0iZ3JvdXBzIiB2YWx1ZT0iJHt1c2VyLmdldEdyb3VwcygpfSIvPgotICAgICAgICAgICAgICA8ang6c2V0IHZhcj0iZ3JvdXBJZHMiIHZhbHVlPSIke2phdmEudXRpbC5UcmVlU2V0KCl9Ii8+Ci0gICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iZ3JvdXAiIGl0ZW1zPSIke2dyb3Vwc30iPgotICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJpZ25vcmUiIHZhbHVlPSIke2dyb3VwSWRzLmFkZChncm91cC5nZXRJZCgpKX0iLz4KLSAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9Imdyb3VwIiBpdGVtcz0iJHtncm91cElkc30iPjxqeDppZiB0ZXN0PSIke2dyb3VwICE9IGdyb3VwSWRzLmZpcnN0KCl9Ij4sIDwvang6aWY+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iJHt1c2VjYXNlLmdldFNvdXJjZVVSTCgpfT9sZW55YS51c2VjYXNlPWFkbWluLmdyb3VwJmFtcDtncm91cElkPSR7Z3JvdXB9Ij48ang6b3V0IHZhbHVlPSIke2dyb3VwfSIvPjwvYT48L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlIj4KLSAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiIGlkPSJmb3JtLWRlbGV0ZV91c2VyIj4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iYWRtaW4uZGVsZXRlVXNlciIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJ1c2VySWQiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiR7dXNlci5nZXRJZCgpfSIvPgotICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZXIuZXF1YWxzKHVzZWNhc2UuZ2V0UGFyYW1ldGVyKCdjdXJyZW50VXNlcicpKX0iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRGVsZXRlIiBkaXNhYmxlZD0iZGlzYWJsZWQiIG5hbWU9ImlucHV0LWRlbGV0ZV91c2VyIi8+Ci0gICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRGVsZXRlIiBuYW1lPSJpbnB1dC1kZWxldGVfdXNlciIvPgotICAgICAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgPC90YWJsZT4KLSAgICAgICAgCi0gIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1jYWNoZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvY29uZmlnL2NvY29vbi14Y29uZi9zb3VyY2UtY2FjaGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZmEyMDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1jYWNoZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL2NvbXBvbmVudFtAcm9sZSA9ICdvcmcuYXBhY2hlLmxlbnlhLmFjLmNhY2hlLlNvdXJjZUNhY2hlJ10iPg0KLSAgICA8Y29tcG9uZW50IGxvZ2dlcj0ibGVueWEuYWMuY2FjaGUiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGUuU291cmNlQ2FjaGVJbXBsIg0KLSAgICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGUuU291cmNlQ2FjaGUiLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2I2YTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmNhY2hlPC9pZD4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmFjLmNhY2hlIi8+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPG5hbWU+U291cmNlIGNhY2hlPC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj5Tb3VyY2UgY2FjaGU8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2NhY2hlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvY2FjaGUvQnVpbGRFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9CdWlsZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQxM2FjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9CdWlsZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZTsKLQotLyoqCi0gKiBFeGNlcHRpb24gZm9yIHByb2JsZW1zIHdoZW4gY2FjaGVhYmxlIG9iamVjdHMgYXJlIGJ1aWx0LgotICovCi1wdWJsaWMgY2xhc3MgQnVpbGRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9DYWNoZWRPYmplY3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9DYWNoZWRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjMjhkNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2NhY2hlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvY2FjaGUvQ2FjaGVkT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmNhY2hlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVZhbGlkaXR5OwotCi0vKioKLSAqIENhY2hlZCBvYmplY3QuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZWRPYmplY3QgewotCi0gICAgcHJpdmF0ZSBTb3VyY2VWYWxpZGl0eSB2YWxpZGl0eU9iamVjdDsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIEFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgdmFsaWRpdHkuCi0gICAgICogQHJldHVybiBBIHNvdXJjZSB2YWxpZGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlVmFsaWRpdHkgZ2V0VmFsaWRpdHlPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZhbGlkaXR5T2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIHZhbGlkaXR5IFRoZSBzb3VyY2UgdmFsaWRpdHkuCi0gICAgICogQHBhcmFtIF92YWx1ZSBUaGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIENhY2hlZE9iamVjdChTb3VyY2VWYWxpZGl0eSB2YWxpZGl0eSwgT2JqZWN0IF92YWx1ZSkgewotICAgICAgICB0aGlzLnZhbGlkaXR5T2JqZWN0ID0gdmFsaWRpdHk7Ci0gICAgICAgIHRoaXMudmFsdWUgPSBfdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2NhY2hlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvY2FjaGUvQ2FjaGluZ0V4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2NhY2hlL0NhY2hpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1NzI4Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2NhY2hlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvY2FjaGUvQ2FjaGluZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZTsKLQotLyoqCi0gKiBDYWNoaW5nIGV4Y2VwdGlvbi4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIENhY2hpbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDYWNoaW5nRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIENhY2hpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBDYWNoaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2FjaGluZ0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2NhY2hlL0lucHV0U3RyZWFtQnVpbGRlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2NhY2hlL0lucHV0U3RyZWFtQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGNmZmM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9JbnB1dFN0cmVhbUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyBjYXBhYmxlIG9mIGJ1aWxkaW5nIG9iamVjdHMgZnJvbSBpbnB1dCBzdHJlYW1zLgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElucHV0U3RyZWFtQnVpbGRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYW4gb2JqZWN0IGZyb20gYW4gaW5wdXQgc3RyZWFtLgotICAgICAqIEBwYXJhbSBzdHJlYW0gQW4gaW5wdXQgc3RyZWFtLgotICAgICAqIEByZXR1cm4gQW4gb2JqZWN0LgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gd2hlbiBidWlsZGluZyB0aGUgb2JqZWN0IGZhaWxlZC4KLSAgICAgKi8KLSAgICBPYmplY3QgYnVpbGQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9Tb3VyY2VDYWNoZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2NhY2hlL1NvdXJjZUNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjVmNDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2NhY2hlL1NvdXJjZUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmNhY2hlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbXBvbmVudC5Db21wb25lbnQ7Ci0KLS8qKgotICogU291cmNlIGNhY2hlIGNvbXBvbmVudC4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBTb3VyY2VDYWNoZSBleHRlbmRzIENvbXBvbmVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBBdmFsb24gcm9sZSBvZiB0aGUgU291cmNlQ2FjaGUgaW50ZXJmYWNlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gU291cmNlQ2FjaGUuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNhY2hlZCBvYmplY3Qgb3IgYnVpbGRzIGEgbmV3IG9iamVjdCB3aGVuIHRoZSBjYWNoZWQKLSAgICAgKiBvYmplY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHVwIHRvIGRhdGUuCi0gICAgICogQHBhcmFtIHNvdXJjZVVyaSBUaGUgVVJJIHRvIGJ1aWxkIHRoZSBzb3VyY2UgZnJvbS4KLSAgICAgKiBAcGFyYW0gYnVpbGRlciBUaGUgYnVpbGRlciB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGlmIG5lZWRlZC4KLSAgICAgKiBAcmV0dXJuIEFuIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIENhY2hpbmdFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0KFN0cmluZyBzb3VyY2VVcmksIElucHV0U3RyZWFtQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgQ2FjaGluZ0V4Y2VwdGlvbjsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9Tb3VyY2VDYWNoZUltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9Tb3VyY2VDYWNoZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyYzMxNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2NhY2hlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvY2FjaGUvU291cmNlQ2FjaGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay50aHJlYWQuVGhyZWFkU2FmZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVZhbGlkaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5DYWNoZU1hcDsKLQotLyoqCi0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIHNvdXJjZSBjYWNoZS4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUNhY2hlSW1wbAotICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkCi0gICAgaW1wbGVtZW50cyBTb3VyY2VDYWNoZSwgU2VydmljZWFibGUsIERpc3Bvc2FibGUsIFRocmVhZFNhZmUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEByZXR1cm4gQSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc291cmNlIHJlc29sdmVyLgotICAgICAqIEByZXR1cm4gQSBzb3VyY2UgcmVzb2x2ZXIuCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZVJlc29sdmVyIGdldFJlc29sdmVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2VDYWNoZUltcGwoKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUNJVFkgPSAxMDAwOwotICAgIHByaXZhdGUgQ2FjaGVNYXAgY2FjaGU7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZS4KLSAgICAgKiBAcmV0dXJuIEEgY2FjaGUgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDYWNoZU1hcCBnZXRDYWNoZSgpIHsKLSAgICAgICAgaWYgKHRoaXMuY2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBDYWNoZU1hcChDQVBBQ0lUWSwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmNhY2hlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZS5Tb3VyY2VDYWNoZSNnZXQoamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZS5JbnB1dFN0cmVhbUJ1aWxkZXIpCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0KFN0cmluZyBzb3VyY2VVcmksIElucHV0U3RyZWFtQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgQ2FjaGluZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IHNvdXJjZVVyaTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLQotICAgICAgICBDYWNoZWRPYmplY3QgY2FjaGVkT2JqZWN0ID0gKENhY2hlZE9iamVjdCkgZ2V0Q2FjaGUoKS5nZXQoa2V5KTsKLSAgICAgICAgYm9vbGVhbiB1c2VkQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgU291cmNlVmFsaWRpdHkgc291cmNlVmFsaWRpdHkgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY2FjaGVkT2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJGb3VuZCBjYWNoZWQgb2JqZWN0IFsiICsgY2FjaGVkT2JqZWN0ICsgIl0iKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNvdXJjZVZhbGlkaXR5IGNhY2hlZFZhbGlkaXR5ID0gY2FjaGVkT2JqZWN0LmdldFZhbGlkaXR5T2JqZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gY2FjaGVkVmFsaWRpdHkuaXNWYWxpZCgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgc291cmNlIHZhbGlkaXR5IGFuZCBjb21wYXJlCi0KLSAgICAgICAgICAgICAgICAgICAgc291cmNlVmFsaWRpdHkgPSBnZXRTb3VyY2VWYWxpZGl0eShzb3VyY2VVcmkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VWYWxpZGl0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYWNoZWRWYWxpZGl0eS5pc1ZhbGlkKHNvdXJjZVZhbGlkaXR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVZhbGlkaXR5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAocmVzdWx0ID09IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAocmVzdWx0ID4gMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzaW5nIHZhbGlkIGNhY2hlZCBzb3VyY2UgZm9yICciICsgc291cmNlVXJpICsgIicuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXNlZENhY2hlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjYWNoZWRPYmplY3QuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYWNoZWQgY29udGVudCBpcyBpbnZhbGlkIGZvciAnIiArIHNvdXJjZVVyaSArICInLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnZhbGlkIGNhY2hlZCBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2FjaGUoKS5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRpZCBub3QgZmluZCBjYWNoZWQgb2JqZWN0LiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXVzZWRDYWNoZSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJEaWQgbm90IHVzZSBjYWNoZS4iKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZVZhbGlkaXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVZhbGlkaXR5ID0gZ2V0U291cmNlVmFsaWRpdHkoc291cmNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlVmFsaWRpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiU291cmNlIHZhbGlkaXR5IGlzIG5vdCBudWxsLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiU291cmNlIHZhbGlkaXR5IGlzIG51bGwgLSBub3QgY2FjaGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGJ1aWxkT2JqZWN0KHNvdXJjZVVyaSwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgcmVzcG9uc2UKLSAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FjaGluZyBvYmplY3QgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGZvciBmdXJ0aGVyIHJlcXVlc3RzIG9mIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc291cmNlVXJpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2FjaGUoKS5wdXQoa2V5LCBuZXcgQ2FjaGVkT2JqZWN0KHNvdXJjZVZhbGlkaXR5LCB2YWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgU291cmNlTm90Rm91bmRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDYWNoaW5nRXhjZXB0aW9uKGUxKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2FjaGluZ0V4Y2VwdGlvbihlMSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2FjaGluZ0V4Y2VwdGlvbihlMSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIEJ1aWxkRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2FjaGluZ0V4Y2VwdGlvbihlMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgYSBzb3VyY2UgZnJvbS4KLSAgICAgKiBAcGFyYW0gc291cmNlVXJpIFRoZSBVUkkgb2YgdGhlIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gYnVpbGRlciBUaGUgaW5wdXQgc3RyZWFtIGJ1aWxkZXIgdGhhdCBzaG91bGQgYmUgdXNlZC4KLSAgICAgKiBAcmV0dXJuIEFuIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgU291cmNlTm90Rm91bmRFeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBPYmplY3QgYnVpbGRPYmplY3QoU3RyaW5nIHNvdXJjZVVyaSwgSW5wdXRTdHJlYW1CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvdXJjZSA9IGdldFJlc29sdmVyKCkucmVzb2x2ZVVSSShzb3VyY2VVcmkpOwotICAgICAgICAgICAgaWYgKHNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gYnVpbGRlci5idWlsZChzdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0UmVzb2x2ZXIoKS5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbGlkaXR5IG9mIGEgc291cmNlLgotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkgVGhlIFVSSSBvZiB0aGUgc291cmNlLgotICAgICAqIEByZXR1cm4gQSBzb3VyY2UgdmFsaWRpdHkgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTb3VyY2VWYWxpZGl0eSBnZXRTb3VyY2VWYWxpZGl0eShTdHJpbmcgc291cmNlVXJpKQotICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVZhbGlkaXR5IHNvdXJjZVZhbGlkaXR5OwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvdXJjZSA9IGdldFJlc29sdmVyKCkucmVzb2x2ZVVSSShzb3VyY2VVcmkpOwotICAgICAgICAgICAgc291cmNlVmFsaWRpdHkgPSBzb3VyY2UuZ2V0VmFsaWRpdHkoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldFJlc29sdmVyKCkucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb3VyY2VWYWxpZGl0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBTb3VyY2VSZXNvbHZlciByZXNvbHZlcjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIF9tYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IF9tYW5hZ2VyOwotICAgICAgICB0aGlzLnJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBfbWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAoZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShnZXRSZXNvbHZlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2NhY2hlL1VSTEtleVV0aWwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvY2FjaGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9hYy9jYWNoZS9VUkxLZXlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWEyYTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9jYWNoZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2NhY2hlL1VSTEtleVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gZ2VuZXJhdGUgU3RyaW5nIGNhY2hlIGtleXMgZnJvbSB3ZWJhcHAgVVJMcy4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVSTEtleVV0aWwgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFVSTEtleVV0aWwoKSB7Ci0JICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBjYWNoZSBrZXkgZm9yIGEgY29udGV4dCBhbmQgYSB3ZWJhcHAgVVJMLgotICAgICAqIEBwYXJhbSByZXNvbHZlciBUaGUgcmVzb2x2ZXIgb2YgdGhlIGNvbnRleHQuCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgd2ViYXBwIFVybC4KLSAgICAgKiBAcmV0dXJuIEEgU3RyaW5nLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlS2V5KFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgd2ViYXBwVXJsKQotICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSSgiY29udGV4dDovLy8iKTsKLSAgICAgICAgICAgIGtleSA9IHNvdXJjZS5nZXRVUkkoKSArICJfIiArIHdlYmFwcFVybDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9qYW5pdG9yL2NvbmZpZy9jb2Nvb24teGNvbmYvY29udGVudC1qYW5pdG9yLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9qYW5pdG9yL2NvbmZpZy9jb2Nvb24teGNvbmYvY29udGVudC1qYW5pdG9yLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzYzZjEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvamFuaXRvci9jb25maWcvY29jb29uLXhjb25mL2NvbnRlbnQtamFuaXRvci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iCi0gIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMuamFuaXRvci5Db250ZW50SmFuaXRvciddIj4KLSAgCi0gIDxjb21wb25lbnQgbG9nZ2VyPSJjb250ZW50LWphbml0b3IiCi0gICAgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMuamFuaXRvci5Db250ZW50SmFuaXRvciIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuamFuaXRvci5Db250ZW50SmFuaXRvciIvPgotCQotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvamFuaXRvci9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvamFuaXRvci9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5ZDg0Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2phbml0b3IvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5qYW5pdG9yPC9pZD4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5KYW5pdG9yIE1vZHVsZTwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+VGhlIGphbml0b3IgY2xlYW5zIHVwIGVtcHR5IGRpcmVjdG9yaWVzIGV0Yy48L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2phbml0b3IvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvamFuaXRvci9Db250ZW50SmFuaXRvci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9qYW5pdG9yL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2phbml0b3IvQ29udGVudEphbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmZmFjNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2phbml0b3IvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvamFuaXRvci9Db250ZW50SmFuaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmphbml0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLmNvbnRleHQuQ29udGV4dFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLkFic3RyYWN0UmVwb3NpdG9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uUmVwb3NpdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgamFuaXRvciBjbGVhbnMgdXAgZW1wdHkgZGlyZWN0b3JpZXMgYWZ0ZXIgYSBkb2N1bWVudCBpcyByZW1vdmVkLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEphbml0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlcG9zaXRvcnlMaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBldmVudEZpcmVkKFJlcG9zaXRvcnlFdmVudCByZXBvRXZlbnQpIHsKLSAgICAgICAgCi0gICAgICAgIGlmICghKHJlcG9FdmVudCBpbnN0YW5jZW9mIERvY3VtZW50RXZlbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRG9jdW1lbnRFdmVudCBldmVudCA9IChEb2N1bWVudEV2ZW50KSByZXBvRXZlbnQ7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWV2ZW50LmdldERlc2NyaXB0b3IoKS5lcXVhbHMoRG9jdW1lbnRFdmVudC5SRU1PVkVEKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDb250ZXh0VXRpbGl0eSB1dGlsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHV0aWwgPSAoQ29udGV4dFV0aWxpdHkpIHRoaXMubWFuYWdlci5sb29rdXAoQ29udGV4dFV0aWxpdHkuUk9MRSk7Ci0gICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSB1dGlsLmdldFJlcXVlc3QoKTsKLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmdldERvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgUHVibGljYXRpb24gcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihldmVudC5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICAgICAgRmlsZSBjb250ZW50RmlsZSA9IHB1Yi5nZXRDb250ZW50RGlyZWN0b3J5KGV2ZW50LmdldEFyZWEoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudFVyaSA9IGNvbnRlbnRGaWxlLnRvVVJJKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFNvdXJjZVV0aWwuZGVsZXRlRW1wdHlDb2xsZWN0aW9ucyhjb250ZW50VXJpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAodXRpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UodXRpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGRhcC9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGRhcC9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzYzY1NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xkYXAvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5sZGFwPC9pZD4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmFjLmxkYXAiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuYWMiLz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5MREFQPC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj5MREFQIHVzZXIgaW1wbGVtZW50YXRpb24uIEFsc28gc2VlIHNyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjL3Bhc3N3ZC9sZGFwLnByb3BlcnRpZXMuc2FtcGxlPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9sZGFwL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvbGRhcC9MREFQVXNlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9sZGFwL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYWMvbGRhcC9MREFQVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM2ZGFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGRhcC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2FjL2xkYXAvTERBUFVzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmxkYXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXgubmFtaW5nLkF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OwotaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlOwotaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlczsKLWltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5TZWFyY2hDb250cm9sczsKLWltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LlNlYXJjaFJlc3VsdDsKLWltcG9ydCBqYXZheC5uYW1pbmcubGRhcC5Jbml0aWFsTGRhcENvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVVc2VyOwotCi1pbXBvcnQgY29tLnN1bi5qbmRpLmxkYXAuTGRhcEN0eEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5qbmRpLmxkYXAuTGRhcFVSTDsKLQotLyoqCi0gKiBMREFQIHVzZXIuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBMREFQVXNlciBleHRlbmRzIEZpbGVVc2VyIHsKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgUHJvcGVydGllcyBkZWZhdWx0UHJvcGVydGllcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5MREFQX0lEPC9jb2RlPiBUaGUgTERBUCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExEQVBfSUQgPSAibGRhcGlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTERBUF9QUk9QRVJUSUVTX0ZJTEUgPSAibGRhcC5wcm9wZXJ0aWVzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPVklERVJfVVJMX1BST1AgPSAicHJvdmlkZXItdXJsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTUdSX0ROX1BST1AgPSAibWdyLWRuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTUdSX1BXX1BST1AgPSAibWdyLXB3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgS0VZX1NUT1JFX1BST1AgPSAia2V5LXN0b3JlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VDVVJJVFlfUFJPVE9DT0xfUFJPUCA9ICJzZWN1cml0eS1wcm90b2NvbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OX1BST1AgPSAic2VjdXJpdHktYXV0aGVudGljYXRpb24iOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBVU1JfQVRUUl9QUk9QID0gInVzci1hdHRyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVNSX0FUVFJfREVGQVVMVCA9ICJ1aWQiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBVU1JfTkFNRV9BVFRSX1BST1AgPSAidXNyLW5hbWUtYXR0ciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVTUl9OQU1FX0FUVFJfREVGQVVMVCA9ICJnZWNvcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVTUl9CUkFOQ0hfUFJPUCA9ICJ1c3ItYnJhbmNoIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVNSX0JSQU5DSF9ERUZBVUxUID0gIm91PVBlb3BsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVTUl9BVVRIX1RZUEVfUFJPUCA9ICJ1c3ItYXV0aGVudGljYXRpb24iOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBVU1JfQVVUSF9UWVBFX0RFRkFVTFQgPSAic2ltcGxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQkFTRV9ETl9QUk9QID0gImJhc2UtZG4iOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBET01BSU5fTkFNRV9QUk9QID0gImRvbWFpbi1uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSEFORExFX1JFRkVSUkFMU19QUk9QID0gImhhbmRsZS1yZWZlcnJhbHMiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBIQU5ETEVfUkVGRVJSQUxTX0RFRkFVTFQgPSAiaWdub3JlIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxkYXBJZDsKLSAgICBwcml2YXRlIFN0cmluZyBsZGFwTmFtZTsKLQotICAgIC8vIGRlcHJlY2F0ZWQ6IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5ICEKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUEFSVElBTF9VU0VSX0ROX1BST1AgPSAicGFydGlhbC11c2VyLWRuIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgTERBUFVzZXIgb2JqZWN0LgotICAgICAqIEBwYXJhbSBpdGVtTWFuYWdlciBUaGUgaXRlbSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTERBUFVzZXIoSXRlbU1hbmFnZXIgaXRlbU1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIExEQVBVc2VyCi0gICAgICogQHBhcmFtIGl0ZW1NYW5hZ2VyIFRoZSBpdGVtIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEBwYXJhbSBpZCB1c2VyIGlkIG9mIExEQVBVc2VyCi0gICAgICogQHBhcmFtIGVtYWlsIG9mIExEQVBVc2VyCi0gICAgICogQHBhcmFtIF9sZGFwSWQgb2YgTERBUFVzZXIKLSAgICAgKiBAcGFyYW0gX2xvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydGllcyBjb3VsZCBub3QgYmUgcmVhZAotICAgICAqLwotICAgIHB1YmxpYyBMREFQVXNlcihJdGVtTWFuYWdlciBpdGVtTWFuYWdlciwgTG9nZ2VyIGxvZ2dlciwgU3RyaW5nIGlkLCBTdHJpbmcgZW1haWwsCi0gICAgICAgICAgICBTdHJpbmcgX2xkYXBJZCwgTG9nZ2VyIF9sb2dnZXIpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoaXRlbU1hbmFnZXIsIGxvZ2dlciwgaWQsIG51bGwsIGVtYWlsLCBudWxsKTsKLSAgICAgICAgdGhpcy5sZGFwSWQgPSBfbGRhcElkOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IExEQVBVc2VyIGZyb20gYSBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGNvbmZpZyB0aGUgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gc3BlY2lmeWluZyB0aGUgdXNlcgotICAgICAqICAgICAgICBkZXRhaWxzCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHRoZSB1c2VyIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlKGNvbmZpZyk7Ci0gICAgICAgIHRoaXMubGRhcElkID0gY29uZmlnLmdldENoaWxkKExEQVBfSUQpLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIHVzZXIgZXhpc3RzLgotICAgICAqIEBwYXJhbSBfbGRhcElkIFRoZSBMREFQIGlkLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdXNlciBpcyBmb3VuZCBpbiB0aGUKLSAgICAgKiAgICAgICAgIGRpcmVjdG9yeQotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHNVc2VyKFN0cmluZyBfbGRhcElkKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiZXhpc3RzVXNlcigpIGNoZWNraW5nIGlkICIgKyBfbGRhcElkKTsKLQotICAgICAgICBib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkUHJvcGVydGllcygpOwotICAgICAgICAgICAgU2VhcmNoUmVzdWx0IGVudHJ5ID0gZ2V0RGlyZWN0b3J5RW50cnkoX2xkYXBJZCk7Ci0KLSAgICAgICAgICAgIGV4aXN0cyA9IChlbnRyeSAhPSBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImV4aXN0c1VzZXIoKSBmb3IgaWQgIiArIF9sZGFwSWQgKyAiIGdvdCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKCJFeGNlcHRpb24gZHVyaW5nIHNlYXJjaDogIiwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIE5hbWluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiZXhpc3RzVXNlcigpIGZvciBpZCAiICsgX2xkYXBJZCArICIgZ290IGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIkV4Y2VwdGlvbiBkdXJpbmcgc2VhcmNoOiAiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBleGlzdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhpcyB1c2VyLiBUaGUgY3VycmVudCAoYWxyZWFkeSBhdXRoZW50aWNhdGVkKSBsZGFwSWQgaXMKLSAgICAgKiBxdWVyaWVkIGluIHRoZSBkaXJlY3RvcnksIGluIG9yZGVyIHRvIHJldHJpZXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sCi0gICAgICogc3VjaCBhcyB0aGUgdXNlciBuYW1lLiBJbiBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBvbmx5IHRoZSB1c2VyIG5hbWUgaXMKLSAgICAgKiBhY3R1YWxseSByZXRyaWV2ZWQsIGJ1dCBvdGhlciBhdHRyaWJ1dGVzIG1heSBiZSB1c2VkIGluIHRoZSBmdXR1cmUgKHN1Y2gKLSAgICAgKiBhcyBncm91cHMgPykgVE9ETzogc2hvdWxkIHRoZSBjb2RlIGJlIGNoYW5nZWQgdG8gbm90IHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAqIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcgPyBBZnRlciBhbGwsIGl0J3Mgb25seSB1c2VkIHRvIGdldCBhZGRpdGlvbmFsCi0gICAgICogaW5mbyBmb3IgZGlzcGxheT8gVGhpcyBpcyBhIGRlc2lnbiBkZWNpc2lvbiwgSSdtIG5vdCBzdXJlIHdoYXQncyBiZXN0LgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJpbml0aWFsaXplKCkgZ2V0dGluZyBlbnRyeSAuLi4iKTsKLQotICAgICAgICAgICAgU2VhcmNoUmVzdWx0IGVudHJ5ID0gZ2V0RGlyZWN0b3J5RW50cnkodGhpcy5sZGFwSWQpOwotICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAvKiB1c2VycyBmdWxsIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgdXNyTmFtZUF0dHIgPSBkZWZhdWx0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShVU1JfTkFNRV9BVFRSX1BST1AsCi0gICAgICAgICAgICAgICAgICAgICAgICBVU1JfTkFNRV9BVFRSX0RFRkFVTFQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXplKCkgZ290IGVudHJ5LCBnb2luZyB0byBsb29rIGZvciBhdHRyaWJ1dGUgIiArIHVzck5hbWVBdHRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gZW50cnksIHdoaWNoIGlzOiAiICsgZW50cnkpOwotCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZW50cnkuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIHVzZXJOYW1lID0gYXR0cmlidXRlcy5nZXQodXNyTmFtZUF0dHIpOwkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJOYW1lICE9IG51bGwpIG5hbWUuYXBwZW5kKChTdHJpbmcpIHVzZXJOYW1lLmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAJdGhpcy5sZGFwTmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImluaXRpYWxpemUoKSBzZXQgbmFtZSB0byAiICsgdGhpcy5sZGFwTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMubGRhcE5hbWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgTmFtaW5nRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IHJlYWQgcHJvcGVydGllcyIsIGUxKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVhZCBwcm9wZXJ0aWVzIiwgZTEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZVVzZXIjY3JlYXRlQ29uZmlndXJhdGlvbigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb24gY29uZmlnID0gKERlZmF1bHRDb25maWd1cmF0aW9uKSBzdXBlci5jcmVhdGVDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gYWRkIGxkYXBfaWQgbm9kZQotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbiBjaGlsZCA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbihMREFQX0lEKTsKLSAgICAgICAgY2hpbGQuc2V0VmFsdWUodGhpcy5sZGFwSWQpOwotICAgICAgICBjb25maWcuYWRkQ2hpbGQoY2hpbGQpOwotCi0gICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsZGFwIGlkCi0gICAgICogQHJldHVybiB0aGUgbGRhcCBpZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGRhcElkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5sZGFwSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsZGFwIGlkCi0gICAgICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IGxkYXAgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMZGFwSWQoU3RyaW5nIHN0cmluZykgewotICAgICAgICB0aGlzLmxkYXBJZCA9IHN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRoZW50aWNhdGUgYSB1c2VyIGFnYWluc3QgdGhlIGRpcmVjdG9yeS4gVGhlIHByaW5jaXBhbCB0byBiZQotICAgICAqIGF1dGhlbnRpY2F0ZWQgaXMgZWl0aGVyIGNvbnN0cnVjdGVkIGJ5IHVzZSBvZiB0aGUgY29uZmlndXJlZCBwcm9wZXJ0aWVzLAotICAgICAqIG9yIGJ5IGxvb2t1cCBvZiB0aGlzIElEIGluIHRoZSBkaXJlY3RvcnkuIFRoaXMgcHJpbmNpcGFsIHRoZW4gYXR0ZW1wdHMgdG8KLSAgICAgKiBhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIHByb3ZpZGVkIHBhc3N3b3JkLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyI2F1dGhlbnRpY2F0ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmcgcGFzc3dvcmQpIHsKLQotICAgICAgICBib29sZWFuIGF1dGhlbnRpY2F0ZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHByaW5jaXBhbCA9ICIiOwotICAgICAgICBDb250ZXh0IGN0eCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByaW5jaXBhbCA9IGdldFByaW5jaXBhbCgpOwotCi0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQXV0aGVudGljYXRpbmcgd2l0aCBwcmluY2lwYWwgWyIgKyBwcmluY2lwYWwgKyAiXSIpOwotCi0gICAgICAgICAgICBjdHggPSBiaW5kKHByaW5jaXBhbCwgcGFzc3dvcmQsIGRlZmF1bHRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFVTUl9BVVRIX1RZUEVfUFJPUCwKLSAgICAgICAgICAgICAgICAgICAgVVNSX0FVVEhfVFlQRV9ERUZBVUxUKSk7Ci0gICAgICAgICAgICBhdXRoZW50aWNhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGNsb3NlKGN0eCk7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ29udGV4dCBjbG9zZWQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oImF1dGhlbnRpY2F0ZSBoYW5kbGluZyBJT0V4Y2VwdGlvbiwgY2hlY2sgeW91ciBzZXR1cDogIiArIGUpOwotICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJhdXRoZW50aWNhdGUgZmFpbGVkIGZvciBwcmluY2lwYWwgIiArIHByaW5jaXBhbCArICIsIGV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBsb2cgdGhpcyBmYWlsdXJlCi0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNJbmZvRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiQmluZCBmb3IgdXNlciAiICsgcHJpbmNpcGFsICsgIiB0byBMZGFwIHNlcnZlciBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF1dGhlbnRpY2F0ZWQ7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuSXRlbSNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxkYXBOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExEQVAgVXNlcnMgZmV0Y2ggdGhlaXIgbmFtZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBMREFQIHNlcnZlciwgc28gd2UgZG9uJ3QKLSAgICAgKiBzdG9yZSBpdCBsb2NhbGx5LiBTaW5jZSB3ZSBvbmx5IGhhdmUgcmVhZCBhY2Nlc3Mgd2UgYmFzaWNhbGx5IGNhbid0IHNldAotICAgICAqIHRoZSBuYW1lLCBpLmUuIGFueSByZXF1ZXN0IHRvIGNoYW5nZSB0aGUgbmFtZSBpcyBpZ25vcmVkLgotICAgICAqIEBwYXJhbSBzdHJpbmcgaXMgaWdub3JlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHN0cmluZykgewotICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gTERBUCwgc28gd2UgaWdub3JlCi0gICAgICAgIC8vIGNoYW5nZSByZXF1ZXN0IHRvIHRoZSBuYW1lLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBMREFQVXNlciBkb2Vzbid0IHN0b3JlIGFueSBwYXNzd29yZHMgYXMgdGhleSBhcmUgaGFuZGxlZCBieSBMREFQCi0gICAgICogQHBhcmFtIHBsYWluVGV4dFBhc3N3b3JkIGlzIGlnbm9yZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGxhaW5UZXh0UGFzc3dvcmQpIHsKLSAgICAgICAgc2V0RW5jcnlwdGVkUGFzc3dvcmQobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIExEQVBVc2VyIGRvZXNuJ3Qgc3RvcmUgYW55IHBhc3N3b3JkcyBhcyB0aGV5IGFyZSBoYW5kbGVkIGJ5IExEQVAKLSAgICAgKiBAcGFyYW0gZW5jcnlwdGVkUGFzc3dvcmQgaXMgaWdub3JlZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEVuY3J5cHRlZFBhc3N3b3JkKFN0cmluZyBlbmNyeXB0ZWRQYXNzd29yZCkgewotICAgICAgICBlbmNyeXB0ZWRQYXNzd29yZCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIExEQVBVc2VyIGRvZXNuJ3QgY2hhbmdlIGFueSBwYXNzd29yZHMgYXMgdGhleSBhcmUgaGFuZGxlZCBieSBMREFQCi0gICAgICogQHJldHVybiBhbHdheXMgcmV0dXJucyBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkNoYW5nZVBhc3N3b3JkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdCB0byB0aGUgTERBUCBzZXJ2ZXIKLSAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIHRoZSBwcmluY2lwYWwgc3RyaW5nIGZvciB0aGUgTERBUCBjb25uZWN0aW9uCi0gICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBjcmVkZW50aWFscyBmb3IgdGhlIExEQVAgY29ubmVjdGlvbgotICAgICAqIEBwYXJhbSBhdXRoTWV0aG9kIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+RGlyQ29udGV4dDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgZXN0YWJsaXNoaW5nIHRoZSBMZGFwCi0gICAgICogICAgICAgICBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBEaXJDb250ZXh0IGJpbmQoU3RyaW5nIHByaW5jaXBhbCwgU3RyaW5nIGNyZWRlbnRpYWxzLCBTdHJpbmcgYXV0aE1ldGhvZCkKLSAgICAgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJCaW5kaW5nIHByaW5jaXBhbDogWyIgKyBwcmluY2lwYWwgKyAiXSIpOwotCi0gICAgICAgIEhhc2h0YWJsZSBlbnYgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiLCBnZXRDb25maWd1cmF0aW9uRGlyZWN0b3J5KCkKLSAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgZGVmYXVsdFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoS0VZX1NUT1JFX1BST1ApKTsKLQotICAgICAgICBlbnYucHV0KENvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksIExkYXBDdHhGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgU3RyaW5nIHByb3AgPSBkZWZhdWx0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9WSURFUl9VUkxfUFJPUCk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTERBUCBjb25maWd1cmF0aW9uIGVycm9yOiBwcm9wZXJ0eSAiICsgUFJPVklERVJfVVJMX1BST1AKLSAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBzZXQgaW4gcHJvcGVydHkgZmlsZSAiICsgTERBUF9QUk9QRVJUSUVTX0ZJTEUpOwotICAgICAgICBlbnYucHV0KENvbnRleHQuUFJPVklERVJfVVJMLCBwcm9wKTsKLQotICAgICAgICBwcm9wID0gZGVmYXVsdFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoU0VDVVJJVFlfUFJPVE9DT0xfUFJPUCk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTERBUCBjb25maWd1cmF0aW9uIGVycm9yOiBwcm9wZXJ0eSAiCi0gICAgICAgICAgICAgICAgICAgICsgU0VDVVJJVFlfUFJPVE9DT0xfUFJPUCArICIgaXMgbm90IHNldCBpbiBwcm9wZXJ0eSBmaWxlICIKLSAgICAgICAgICAgICAgICAgICAgKyBMREFQX1BST1BFUlRJRVNfRklMRSk7Ci0gICAgICAgIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9QUk9UT0NPTCwgcHJvcCk7Ci0KLSAgICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OLCBhdXRoTWV0aG9kKTsKLSAgICAgICAgaWYgKGF1dGhNZXRob2QgIT0gbnVsbCAmJiAhYXV0aE1ldGhvZC5lcXVhbHMoIm5vbmUiKSkgewotICAgICAgICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX1BSSU5DSVBBTCwgcHJpbmNpcGFsKTsKLSAgICAgICAgICAgIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9DUkVERU5USUFMUywgY3JlZGVudGlhbHMpOwotICAgICAgICB9Ci0gICAgICAgIGVudi5wdXQoQ29udGV4dC5SRUZFUlJBTCwgZGVmYXVsdFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSEFORExFX1JFRkVSUkFMU19QUk9QLCBIQU5ETEVfUkVGRVJSQUxTX0RFRkFVTFQpKTsKLQotICAgICAgICBEaXJDb250ZXh0IGN0eCA9IG5ldyBJbml0aWFsTGRhcENvbnRleHQoZW52LCBudWxsKTsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiRmluaXNoZWQgYmluZGluZyBwcmluY2lwYWwuIik7Ci0KLSAgICAgICAgcmV0dXJuIGN0eDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgTERBUCBzZXJ2ZXIKLSAgICAgKiBAcGFyYW0gY3R4IHRoZSBjb250ZXh0IHRoYXQgd2FzIHJldHVybmVkIGZyb20gdGhlIGJpbmQKLSAgICAgKiBAdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gY29tbXVuaWNhdGluZyB0byB0aGUgTERBUAotICAgICAqICAgICAgICAgc2VydmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlKENvbnRleHQgY3R4KSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGN0eCAhPSBudWxsKQotICAgICAgICAgICAgY3R4LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgcHJvcGVydGllcwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHByb3BlcnRpZXMgY2Fubm90IGJlIGZvdW5kLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhbmQgbG9hZCBkZWZhdWx0IHByb3BlcnRpZXMKLSAgICAgICAgRmlsZSBwcm9wZXJ0aWVzRmlsZSA9IG5ldyBGaWxlKGdldENvbmZpZ3VyYXRpb25EaXJlY3RvcnkoKSwgTERBUF9QUk9QRVJUSUVTX0ZJTEUpOwotCi0gICAgICAgIGlmIChkZWZhdWx0UHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZhdWx0UHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZSk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXMubG9hZChpbik7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JhcHBpbmcgb2YgdGhlIGRlY2lzaW9uIHdoZXRoZXIgYSByZWN1cnNpdmUgc2VhcmNoIGlzIHdhbnRlZCBvciBub3QuCi0gICAgICogSW1wbGVtZW50YXRpb246IElmIHRoZSBVU1JfQlJBTkNIX1BST1AgaXMgcHJlc2VudCwgdGhpcyBpcyB0aGUgbmV3IHN0eWxlCi0gICAgICogb2YgY29uZmlndXJhdGlvbiAoc3RhcnRpbmcgTGVueWEgMS4yLjIpOyBpZiBpdCBoYXMgYSB2YWx1ZSwgdGhlbiBhCi0gICAgICogc3BlY2lmaWMgYnJhbmNoIGlzIHdhbnRlZDogbm8gcmVjdXJzaXZlIHNlYXJjaC4gSWYgdGhlIHByb3BlcnR5IGlzCi0gICAgICogcHJlc2VudCwgYnV0IGhhcyBubyB2YWx1ZSwgc2VhcmNoIHJlY3Vyc2l2ZWx5LgotICAgICAqIEByZXR1cm4gUmVjdXJzaXZlIHNlYXJjaAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1YnRyZWVTZWFyY2goKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVjdXJzZSA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgdXNyQnJhbmNoUHJvcCA9IGRlZmF1bHRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFVTUl9CUkFOQ0hfUFJPUCk7Ci0gICAgICAgIGlmICh1c3JCcmFuY2hQcm9wICE9IG51bGwpCi0gICAgICAgICAgICBpZiAodXNyQnJhbmNoUHJvcC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICByZWN1cnNlID0gdHJ1ZTsKLQotICAgICAgICByZXR1cm4gcmVjdXJzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlYXJjaFJlc3VsdCBnZXREaXJlY3RvcnlFbnRyeShTdHJpbmcgdXNlcklkKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIERpckNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzZWFyY2hGaWx0ZXIgPSAiIjsKLSAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSAiIjsKLSAgICAgICAgYm9vbGVhbiByZWN1cnNpdmVTZWFyY2g7Ci0gICAgICAgIFNlYXJjaFJlc3VsdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkUHJvcGVydGllcygpOwotCi0gICAgICAgICAgICBjb250ZXh0ID0gYmluZChkZWZhdWx0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShNR1JfRE5fUFJPUCksIGRlZmF1bHRQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShNR1JfUFdfUFJPUCksIGRlZmF1bHRQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShTRUNVUklUWV9BVVRIRU5USUNBVElPTl9QUk9QKSk7Ci0KLSAgICAgICAgICAgIC8vIEdldCBzZWFyY2ggaW5mb3JtYXRpb24gYW5kIHVzZXIgYXR0cmlidXRlIGZyb20gcHJvcGVydGllcwotICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0cyBpZiBub3QgcHJlc2VudCAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKLSAgICAgICAgICAgIFN0cmluZyB1c2VyQXR0cmlidXRlID0gZGVmYXVsdFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVVNSX0FUVFJfUFJPUCwgVVNSX0FUVFJfREVGQVVMVCk7Ci0gICAgICAgICAgICBzZWFyY2hGaWx0ZXIgPSAiKCIgKyB1c2VyQXR0cmlidXRlICsgIj0iICsgdXNlcklkICsgIikiOwotICAgICAgICAgICAgU2VhcmNoQ29udHJvbHMgc2NvcGUgPSBuZXcgU2VhcmNoQ29udHJvbHMoKTsKLQotICAgICAgICAgICAgcmVjdXJzaXZlU2VhcmNoID0gaXNTdWJ0cmVlU2VhcmNoKCk7Ci0gICAgICAgICAgICBpZiAocmVjdXJzaXZlU2VhcmNoKSB7Ci0gICAgICAgICAgICAgICAgc2NvcGUuc2V0U2VhcmNoU2NvcGUoU2VhcmNoQ29udHJvbHMuU1VCVFJFRV9TQ09QRSk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0TmFtZSA9IGRlZmF1bHRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1ZJREVSX1VSTF9QUk9QKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NvcGUuc2V0U2VhcmNoU2NvcGUoU2VhcmNoQ29udHJvbHMuT05FTEVWRUxfU0NPUEUpOwotICAgICAgICAgICAgICAgIG9iamVjdE5hbWUgPSBkZWZhdWx0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShVU1JfQlJBTkNIX1BST1AsIFVTUl9CUkFOQ0hfREVGQVVMVCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlYXJjaGluZyBvYmplY3QgIiArIG9iamVjdE5hbWUgKyAiIGZpbHRlcmluZyB3aXRoICIgKyBzZWFyY2hGaWx0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByZWN1cnNpdmUgc2VhcmNoID8gIiArIHJlY3Vyc2l2ZVNlYXJjaCk7Ci0KLSAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIHJlc3VsdHMgPSBjb250ZXh0LnNlYXJjaChvYmplY3ROYW1lLCBzZWFyY2hGaWx0ZXIsIHNjb3BlKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5oYXNNb3JlKCkpCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKFNlYXJjaFJlc3VsdCkgcmVzdWx0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIHNhbml0eSBjaGVjazogaWYgbW9yZSB0aGFuIG9uZSBlbnRyeSBpcyByZXR1cm5lZAotICAgICAgICAgICAgLy8gZm9yIGEgdXNlci1pZCwgdGhlbiB0aGUgZGlyZWN0b3J5IGlzIHByb2JhYmx5IGZsYXdlZCwKLSAgICAgICAgICAgIC8vIHNvIGl0IHdvdWxkIGJlIG5pY2UgdG8gd2FybiB0aGUgYWRtaW5pc3RyYXRvci4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBUaGlzIGJsb2NrIGlzIGNvbW1lbnRlZCBvdXQgZm9yIG5vdywgYmVjYXVzZSBvZiBwb3NzaWJsZQotICAgICAgICAgICAgLy8gc2lkZS1lZmZlY3RzLCBzdWNoIGFzIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucy4KLSAgICAgICAgICAgIC8vIHRyeSB7Ci0gICAgICAgICAgICAvLyBpZiAocmVzdWx0cy5oYXNNb3JlKCkpIHsKLSAgICAgICAgICAgIC8vIGdldExvZ2dlcigpLndhcm4oIkZvdW5kIG1vcmUgdGhhbiBvbmUgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSBmb3IKLSAgICAgICAgICAgIC8vIHVzZXIgIiArIHVzZXJJZCArICIuIFlvdSBwcm9iYWJseSBzaG91bGQgZGVhY3RpdmF0ZSByZWN1cnNpdmUKLSAgICAgICAgICAgIC8vIHNlYXJjaGVzLiBUaGUgZmlyc3QgZW50cnkgd2FzIHVzZWQgYXMgYSB3b3JrLWFyb3VuZC4iKTsKLSAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIC8vIGNhdGNoIChqYXZheC5uYW1pbmcuUGFydGlhbFJlc3VsdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIC8vIGdldExvZ2dlcigpLmRlYnVnKCJDYXRjaGluZyBhbmQgaWdub3JpbmcgUGFydGlhbFJlc3VsdEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIC8vIGFzIHRoaXMgbWVhbnMgTERBUCBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBvdXIgc2FuaXR5IGNoZWNrIik7Ci0gICAgICAgICAgICAvLyB9Ci0KLSAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWluZ0V4Y2VwdGlvbiBjYXVnaHQgd2hlbiBzZWFyY2hpbmcgb24gb2JqZWN0TmFtZSA9ICIgKyBvYmplY3ROYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgc2VhcmNoRmlsdGVyPSIgKyBzZWFyY2hGaWx0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCB0aGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHByb3BhZ2F0ZWQ6ICIgKyBlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCJ0aGlzIHNob3VsZCBub3QgaGFwcGVuOiBleGNlcHRpb24gY2xvc2luZyBjb250ZXh0ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuY2Fwc3VsYXRpb24gb2YgdGhlIGNyZWF0aW9uIG9mIGEgcHJpbmNpcGFsOiB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoCi0gICAgICogdGhyZWUgY2FzZXMsIGluIG9yZGVyIHRvIHN1cHBvcnQgZGlmZmVyZW50IG1vZGVzIG9mIHVzaW5nIGEgZGlyZWN0b3J5LgotICAgICAqIFRoZSBmaXJzdCBpcyB0aGUgdXNlIG9mIGEgZG9tYWluLW5hbWUgKHJlcXVpcmVtZW50IG9mIE1TIEFjdGl2ZQotICAgICAqIERpcmVjdG9yeSk6IGlmIHRoaXMgcHJvcGVydHkgaXMgc2V0LCB0aGlzIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZQotICAgICAqIHByaW5jaXBhbC4gVGhlIHNlY29uZCBjYXNlIGlzIHdoZXJlIGEgdXNlci1pZCBpcyBzb21ld2hlcmUgaW4gYSBkb21haW4sCi0gICAgICogYnV0IG5vdCBpbiBhIHNwZWNpZmljIGJyYW5jaDogaW4gdGhpcyBjYXNlLCBhIHN1YnRyZWUgc2VhcmNoIGlzIHBlcmZvcm1lZAotICAgICAqIHRvIHJldHJpZXZlIHRoZSBjb21wbGV0ZSBwYXRoLiBUaGUgdGhpcmQgY2FzZSBpcyB3aGVyZSBhIHNwZWNpZmljIGJyYW5jaAotICAgICAqIG9mIHRoZSBkaXJlY3RvcnkgaXMgdG8gYmUgdXNlZDsgdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB1c3ItYnJhbmNoIGlzIHNldAotICAgICAqIHRvIGEgdmFsdWUuIEluIHRoaXMgY2FzZSwgdGhpcyBicmFuY2ggaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHByaW5jaXBhbC4KLSAgICAgKiBAcmV0dXJuIFRoZSBwcmluY2lwYWwKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBOYW1pbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQcmluY2lwYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE5hbWluZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHByaW5jaXBhbDsKLQotICAgICAgICAvLyAxLiBDaGVjayBpZiBkb21haW4tbmFtZSBpcyB0byBiZSBzdXBwb3J0ZWQKLSAgICAgICAgU3RyaW5nIGRvbWFpblByb3AgPSBkZWZhdWx0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShET01BSU5fTkFNRV9QUk9QKTsKLSAgICAgICAgaWYgKGRvbWFpblByb3AgIT0gbnVsbCAmJiBkb21haW5Qcm9wLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHByaW5jaXBhbCA9IGRvbWFpblByb3AgKyAiXFwiICsgZ2V0TGRhcElkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXNTdWJ0cmVlU2VhcmNoKCkpIHsKLSAgICAgICAgICAgICAgICAvLyAyLiBQcmluY2lwYWwgaXMgY29uc3RydWN0ZWQgZnJvbSBkaXJlY3RvcnkgZW50cnkKLSAgICAgICAgICAgICAgICBTZWFyY2hSZXN1bHQgZW50cnkgPSBnZXREaXJlY3RvcnlFbnRyeShnZXRMZGFwSWQoKSk7Ci0gICAgICAgICAgICAgICAgcHJpbmNpcGFsID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc1JlbGF0aXZlKCkpewotICAgICAgICAgICAgICAgICAgICBpZiAocHJpbmNpcGFsLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jaXBhbCA9IHByaW5jaXBhbCArICIsIiArIGRlZmF1bHRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEJBU0VfRE5fUFJPUCk7CQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpdGVtIGlzIGZvdW5kIGZvbGxvd2luZyBhIHJlZmVycmFsIGFuIFVSTCBzdHJpbmcgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgd2hpY2ggY2FuIG5vdCBiZSB1c2VkIGFzIHByaW5jaXBhbAotICAgICAgICAgICAgICAgICAgICBMZGFwVVJMIGxkYXB1cmwgPSBuZXcgTGRhcFVSTChwcmluY2lwYWwpOwotICAgICAgICAgICAgICAgICAgICBwcmluY2lwYWwgPSBsZGFwdXJsLmdldEROKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgLy8gMy4gUHJpbmNpcGFsIGlzIGNvbnN0cnVjdGVkIGZyb20gcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHByaW5jaXBhbCA9IGNvbnN0cnVjdFByaW5jaXBhbChnZXRMZGFwSWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJpbmNpcGFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgcHJpbmNpcGFsIGZvciBhIHVzZXIsIGJ5IHVzaW5nIHRoZSBnaXZlbiB1c2VySWQgYWxvbmcgd2l0aAotICAgICAqIHRoZSBjb25maWd1cmVkIHByb3BlcnRpZXMuCi0gICAgICogQHBhcmFtIHVzZXJJZCBUaGUgdXNlciBpZAotICAgICAqIEByZXR1cm4gVGhlIHByaW5jaXBhbAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbnN0cnVjdFByaW5jaXBhbChTdHJpbmcgdXNlcklkKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBwcmluY2lwYWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHByaW5jaXBhbC5hcHBlbmQoZGVmYXVsdFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVVNSX0FUVFJfUFJPUCwgVVNSX0FUVFJfREVGQVVMVCkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiPSIpLmFwcGVuZCh1c2VySWQpLmFwcGVuZCgiLCIpOwotCi0gICAgICAgIFN0cmluZyBiYXNlRG4gPSBkZWZhdWx0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShCQVNFX0ROX1BST1ApOwotICAgICAgICBpZiAoYmFzZURuICE9IG51bGwgJiYgYmFzZURuLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gVVNSX0JSQU5DSF9QUk9QIG1heSBiZSBlbXB0eSwgc28gb25seSBhcHBlbmQgd2hlbiBub3QtZW1wdHkKLSAgICAgICAgICAgIFN0cmluZyB1c3JCcmFuY2ggPSBkZWZhdWx0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShVU1JfQlJBTkNIX1BST1ApOwotICAgICAgICAgICAgaWYgKHVzckJyYW5jaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVzckJyYW5jaC50cmltKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBwcmluY2lwYWwuYXBwZW5kKHVzckJyYW5jaCkuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBwcmluY2lwYWwuYXBwZW5kKFVTUl9CUkFOQ0hfREVGQVVMVCkuYXBwZW5kKCIsIik7Ci0KLSAgICAgICAgICAgIHByaW5jaXBhbC5hcHBlbmQoZGVmYXVsdFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQkFTRV9ETl9QUk9QKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0cnkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9mIGxkYXAgcHJvcGVydGllcwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkud2FybigKLSAgICAgICAgICAgICAgICAgICAgImdldFByaW5jaXBhbCgpIHJlYWQgYSBkZXByZWNhdGVkIGZvcm1hdCBpbiBsZGFwIHByb3BlcnRpZXMsIHBsZWFzZSB1cGRhdGUiKTsKLSAgICAgICAgICAgIHByaW5jaXBhbC5hcHBlbmQoZGVmYXVsdFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUEFSVElBTF9VU0VSX0ROX1BST1ApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImdldFByaW5jaXBhbCgpIHJldHVybmluZyAiICsgcHJpbmNpcGFsLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIHJldHVybiBwcmluY2lwYWwudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGRhcC9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9sZGFwL0Fic3RyYWN0TERBUFVzZXJUZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xkYXAvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvYWMvbGRhcC9BYnN0cmFjdExEQVBVc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZhNGZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGRhcC9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9hYy9sZGFwL0Fic3RyYWN0TERBUFVzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5hYy5sZGFwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlclR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVBY2NyZWRpdGFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVSb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5sZGFwLkxEQVBVc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIExEQVAgdXNlciB0ZXN0LiBUaGUgbmFtZSAiQWJzdHJhY3QuLi4iIGlzIHVzZWQgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nCi0gKiBleGVjdXRlZC4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RMREFQVXNlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLQotICAgIC8qKgotICAgICAqIGdldCBhIHB1YmxpY2F0aW9uCi0gICAgICogCi0gICAgICogQHJldHVybiBhIDxjb2RlPlB1YmxpY2F0aW9uPC9jb2RlPgotICAgICAqIAotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBzYXZlIGFuIGxkYXAgdXNlcgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyTmFtZSBuYW1lIG9mIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIGVtYWlsIG9mIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIGxkYXBJZCBsZGFwIGlkIG9mIHRoZSB1c2VyCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSBjcmVhdGluZyBvciB0aGUgc2F2aW5nIGZhaWxzCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBjcmVhdGluZyBvciB0aGUgc2F2aW5nIGZhaWxzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgY3JlYXRlQW5kU2F2ZVVzZXIoU3RyaW5nIHVzZXJOYW1lLCBTdHJpbmcgZW1haWwsIFN0cmluZyBsZGFwSWQpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBlZGl0b3JHcm91cE5hbWUgPSAiZWRpdG9yR3JvdXAiOwotICAgICAgICBTdHJpbmcgYWRtaW5Hcm91cE5hbWUgPSAiYWRtaW5Hcm91cCI7Ci0gICAgICAgIFN0cmluZyBlZGl0b3JSb2xlTmFtZSA9ICJlZGl0b3JSb2xlIjsKLSAgICAgICAgU3RyaW5nIGFkbWluUm9sZU5hbWUgPSAiYWRtaW5Sb2xlIjsKLQotICAgICAgICBGaWxlUm9sZSBlZGl0b3JSb2xlID0gbmV3IEZpbGVSb2xlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRSb2xlTWFuYWdlcigpLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGVkaXRvclJvbGUuc2V0TmFtZShlZGl0b3JSb2xlTmFtZSk7Ci0KLSAgICAgICAgRmlsZVJvbGUgYWRtaW5Sb2xlID0gbmV3IEZpbGVSb2xlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRSb2xlTWFuYWdlcigpLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGFkbWluUm9sZS5zZXROYW1lKGFkbWluUm9sZU5hbWUpOwotCi0gICAgICAgIEZpbGVHcm91cCBlZGl0b3JHcm91cCA9IG5ldyBGaWxlR3JvdXAoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldEdyb3VwTWFuYWdlcigpLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLCBlZGl0b3JHcm91cE5hbWUpOwotICAgICAgICBGaWxlR3JvdXAgYWRtaW5Hcm91cCA9IG5ldyBGaWxlR3JvdXAoZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldEdyb3VwTWFuYWdlcigpLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLCBhZG1pbkdyb3VwTmFtZSk7Ci0KLSAgICAgICAgTERBUFVzZXIgdXNlciA9IG5ldyBMREFQVXNlcihnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0VXNlck1hbmFnZXIoKSwgZ2V0TG9nZ2VyKCksCi0gICAgICAgICAgICAgICAgdXNlck5hbWUsIGVtYWlsLCBsZGFwSWQsIGdldExvZ2dlcigpKTsKLQotICAgICAgICBlZGl0b3JSb2xlLnNhdmUoKTsKLSAgICAgICAgYWRtaW5Sb2xlLnNhdmUoKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBlZGl0b3JHcm91cC5hZGRSb2xlKGVkaXRvclJvbGUpOyB1c2VyLmFkZEdyb3VwKGVkaXRvckdyb3VwKTsKLSAgICAgICAgICogYWRtaW5Hcm91cC5hZGRSb2xlKGVkaXRvclJvbGUpOyBhZG1pbkdyb3VwLmFkZFJvbGUoYWRtaW5Sb2xlKTsKLSAgICAgICAgICovCi0gICAgICAgIGVkaXRvckdyb3VwLnNhdmUoKTsKLSAgICAgICAgYWRtaW5Hcm91cC5zYXZlKCk7Ci0KLSAgICAgICAgYWRtaW5Hcm91cC5hZGQodXNlcik7Ci0gICAgICAgIHVzZXIuc2F2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgbG9hZGluZyBhbiBMREFQVXNlcgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyTmFtZSB0aGUgbmFtZSBvZiB0aGUgdXNlcgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+TERBUFVzZXI8L2NvZGU+Ci0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIG9mIHRoZSBsb2FkaW5nIGZhaWxzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIExEQVBVc2VyIGxvYWRVc2VyKFN0cmluZyB1c2VyTmFtZSkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBVc2VyVHlwZVtdIHVzZXJUeXBlcyA9IHsgRmlsZUFjY3JlZGl0YWJsZU1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJUeXBlKCkgfTsKLSAgICAgICAgRmlsZVVzZXJNYW5hZ2VyIF9tYW5hZ2VyID0gRmlsZVVzZXJNYW5hZ2VyLmluc3RhbmNlKGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBnZXRBY2NyZWRpdGFibGVzRGlyZWN0b3J5KCksIHVzZXJUeXBlcywgZ2V0TG9nZ2VyKCkpOwotCi0gICAgICAgIHJldHVybiAoTERBUFVzZXIpIF9tYW5hZ2VyLmdldFVzZXIodXNlck5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGxkYXAgaWQgZ2V0dGVyCi0gICAgICogCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlmIHRoZSB0ZXN0IGZhaWxzCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBjcmVhdGluZyBvciB0aGUgc2F2aW5nIGZhaWxzCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEdldExkYXBJZCgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHVzZXJOYW1lID0gImZlbGl4IjsKLSAgICAgICAgU3RyaW5nIGxkYXBJZCA9ICJtNDAwMDMyIjsKLSAgICAgICAgY3JlYXRlQW5kU2F2ZVVzZXIodXNlck5hbWUsICJmZWxpeEB3eW9uYS5jb20iLCBsZGFwSWQpOwotCi0gICAgICAgIExEQVBVc2VyIHVzZXIgPSBudWxsOwotICAgICAgICB1c2VyID0gbG9hZFVzZXIodXNlck5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGRhcElkLCB1c2VyLmdldExkYXBJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHNldHRpbmYgdGhlIGxkYXAgaWQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgdGhlIHRlc3QgZmFpbHMKLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgdGhlIGNyZWF0aW5nIG9yIHRoZSBzYXZpbmcgZmFpbHMKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0U2V0TGRhcElkKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdXNlck5hbWUgPSAiZmVsaXgiOwotICAgICAgICBTdHJpbmcgbmV3TGRhcElkID0gImZvbyI7Ci0gICAgICAgIGNyZWF0ZUFuZFNhdmVVc2VyKHVzZXJOYW1lLCAiZmVsaXhAd3lvbmEuY29tIiwgImJhciIpOwotCi0gICAgICAgIExEQVBVc2VyIHVzZXIgPSBudWxsOwotICAgICAgICB1c2VyID0gbG9hZFVzZXIodXNlck5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXIpOwotICAgICAgICB1c2VyLnNldExkYXBJZChuZXdMZGFwSWQpOwotICAgICAgICB1c2VyLnNhdmUoKTsKLSAgICAgICAgdXNlciA9IG51bGw7Ci0gICAgICAgIHVzZXIgPSBsb2FkVXNlcih1c2VyTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodXNlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXdMZGFwSWQsIHVzZXIuZ2V0TGRhcElkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgc2F2ZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiB0aGUgdGVzdCBmYWlscwotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgY3JlYXRpbmcgb3IgdGhlIHNhdmluZyBmYWlscwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RTYXZlKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdXNlck5hbWUgPSAiZmVsaXgiOwotICAgICAgICBjcmVhdGVBbmRTYXZlVXNlcih1c2VyTmFtZSwgImZlbGl4QHd5b25hLmNvbSIsICJtNDAwMDMyIik7Ci0KLSAgICAgICAgVXNlciB1c2VyID0gbnVsbDsKLSAgICAgICAgdXNlciA9IGxvYWRVc2VyKHVzZXJOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh1c2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBkZWxldGlvbiBvZiBhIGxkYXAgdXNlcgotICAgICAqIAotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB7Ci0gICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IGRlbGV0ZSgpLgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9jb25maWcvY29jb29uLXhjb25mL2dsb2JhbHByb3hpZXMueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9nbG9iYWxwcm94aWVzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTlhZjMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9jb25maWcvY29jb29uLXhjb25mL2dsb2JhbHByb3hpZXMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6JCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuR2xvYmFsUHJveGllcyddIj4KLQotICA8IS0tIExlbnlhIGNhbiByZXdyaXRlIHRoZSBsaW5rcyB0byBjYXRlciB0byBzcGVjaWFsIHByb3h5IHNldHVwcy4KLSAgICBNYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBwcm94eSBjb25maWd1cmF0aW9uIGluIHB1YmxpY2F0aW9uLnhtbCBhcyB3ZWxsLgotICAgIEZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBzZXR0aW5ncywgcmVhZAotICAgIGh0dHA6Ly9sZW55YS5hcGFjaGUub3JnL2RvY3UvZG9jcy8yXzBfeC90dXRvcmlhbHMvcHJveHkuaHRtbAotCi0gICAgVGhlIGV4YW1wbGUgc2V0dGluZyBiZWxvdyBkZXNjcmliZXMgYSB0ZXN0IHNldHVwIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGV4YW1wbGUgCi0gICAgaW4gc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvcHVibGljYXRpb24ueG1sLgotICAtLT4KLSAgPGNvbXBvbmVudCBsb2dnZXI9ImxlbnlhLnByb3h5IgotICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuR2xvYmFsUHJveGllcyIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5pbXBsLkdsb2JhbFByb3hpZXNJbXBsIj4KLTwhLS0KLSAgICA8cHJveHkgc3NsPSJmYWxzZSIgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhIi8+Ci0gICAgPHByb3h5IHNzbD0idHJ1ZSIgdXJsPSJodHRwczovL3d3dy5leGFtcGxlLmNvbS9sZW55YSIvPgotLS0+Ci0gIDwvY29tcG9uZW50PgotICAKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9saW5raW5nbW9kdWxlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2NvbmZpZy9jb2Nvb24teGNvbmYvbGlua2luZ21vZHVsZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViZjc0NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9saW5raW5nbW9kdWxlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcyIgdW5sZXNzPSIvY29jb29uL2lucHV0LW1vZHVsZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2xpbmsnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBsb2dnZXI9ImNvcmUubW9kdWxlcy5pbnB1dC5saW5rIiBuYW1lPSJsaW5rIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LkxpbmtpbmdNb2R1bGUiLz4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2NvbmZpZy9jb2Nvb24teGNvbmYvbGlua21hbmFnZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9saW5rbWFuYWdlci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZGEwZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9saW5rbWFuYWdlci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDokIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rTWFuYWdlciddIj4KLQotICA8Y29tcG9uZW50IGxvZ2dlcj0iIiByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtNYW5hZ2VyIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkNvbnRlbnRMaW5rTWFuYWdlciIvPgotICAKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9saW5rcmVzb2x2ZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9saW5rcmVzb2x2ZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDY5YzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2NvbmZpZy9jb2Nvb24teGNvbmYvbGlua3Jlc29sdmVyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL2NvbXBvbmVudFtAcm9sZSA9ICdvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtSZXNvbHZlciddIj4KLQotICA8Y29tcG9uZW50IGxvZ2dlcj0iIiByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtSZXNvbHZlciIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rUmVzb2x2ZXJJbXBsIi8+Ci0gIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9jb25maWcvY29jb29uLXhjb25mL3Byb3h5LXVybC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9jb25maWcvY29jb29uLXhjb25mL3Byb3h5LXVybC54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyNjBmMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9wcm94eS11cmwueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcyIgdW5sZXNzPSIvY29jb29uL2lucHV0LW1vZHVsZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3Byb3h5J10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InByb3h5IiBsb2dnZXI9InNpdGVtYXAubW9kdWxlcy5pbnB1dC5wcm94eSINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5Qcm94eU1vZHVsZSIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9zb3VyY2VmYWN0b3J5Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlZmFjdG9yeS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2Njc3ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9zb3VyY2VmYWN0b3J5Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi9zb3VyY2UtZmFjdG9yaWVzIiB1bmxlc3M9Ii9jb2Nvb24vc291cmNlLWZhY3Rvcmllcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnbGVueWEtZG9jdW1lbnQnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBsb2dnZXI9IiIgbmFtZT0ibGVueWEtZG9jdW1lbnQiCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuRG9jdW1lbnRTb3VyY2VGYWN0b3J5Ii8+Ci0gIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5NmM4OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5saW5raW5nPC9pZD4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nIi8+Ci0gIDxleHBvcnQgcGFja2FnZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uIi8+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPG5hbWU+TGlua2luZzwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+Q29tcG9uZW50cyB0byBoYW5kbGUgaW50ZXJuYWwgbGlua3MuPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVycy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVycy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGIwNjk3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9jb25maWcvc2l0ZW1hcC90cmFuc2Zvcm1lcnMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08eG1hcCB4cGF0aD0iL3NpdGVtYXAvY29tcG9uZW50cy90cmFuc2Zvcm1lcnMiIA0KLSAgdW5sZXNzPSIvc2l0ZW1hcC9jb21wb25lbnRzL3RyYW5zZm9ybWVycy90cmFuc2Zvcm1lcltAbmFtZSA9ICd1dWlkMnVybCddIg0KLSAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICANCi0gIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0idXVpZDJ1cmwiIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC50cmFuc2Zvcm1lci51dWlkMnVybCIKLSAgICBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5VdWlkVG9VcmxUcmFuc2Zvcm1lciI+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9ImEiIGF0dHJpYnV0ZT0iaHJlZiIvPgotICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBlbGVtZW50PSJvYmplY3QiIGF0dHJpYnV0ZT0iZGF0YSIvPgotICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBlbGVtZW50PSJpbWciIGF0dHJpYnV0ZT0ic3JjIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9ImxpbmsiIGF0dHJpYnV0ZT0iaHJlZiIvPgotICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBlbGVtZW50PSJmb3JtIiBhdHRyaWJ1dGU9ImFjdGlvbiIvPgotICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBlbGVtZW50PSJzY3JpcHQiIGF0dHJpYnV0ZT0ic3JjIi8+Ci0gIDwvbWFwOnRyYW5zZm9ybWVyPgotICAgIA0KLSAgPG1hcDp0cmFuc2Zvcm1lciBuYW1lPSJ1cmwydXVpZCIgbG9nZ2VyPSJsZW55YS5zaXRlbWFwLnRyYW5zZm9ybWVyLnVybDJ1dWlkIgotICAgIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uLlVybFRvVXVpZFRyYW5zZm9ybWVyIj4KLSAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZWxlbWVudD0iYSIgYXR0cmlidXRlPSJocmVmIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9Im9iamVjdCIgYXR0cmlidXRlPSJkYXRhIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9ImltZyIgYXR0cmlidXRlPSJzcmMiLz4KLSAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZWxlbWVudD0ibGluayIgYXR0cmlidXRlPSJocmVmIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9ImZvcm0iIGF0dHJpYnV0ZT0iYWN0aW9uIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9InNjcmlwdCIgYXR0cmlidXRlPSJzcmMiLz4KLSAgPC9tYXA6dHJhbnNmb3JtZXI+Ci0gICAgCi0gIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0icHJveHkiIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC50cmFuc2Zvcm1lci5wcm94eSIKLSAgICBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5Qcm94eVRyYW5zZm9ybWVyIj4KLSAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZWxlbWVudD0iYSIgYXR0cmlidXRlPSJocmVmIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9Im9iamVjdCIgYXR0cmlidXRlPSJkYXRhIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9ImltZyIgYXR0cmlidXRlPSJzcmMiLz4KLSAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZWxlbWVudD0ibGluayIgYXR0cmlidXRlPSJocmVmIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9ImZvcm0iIGF0dHJpYnV0ZT0iYWN0aW9uIi8+Ci0gICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGVsZW1lbnQ9InNjcmlwdCIgYXR0cmlidXRlPSJzcmMiLz4NCi0gIDwvbWFwOnRyYW5zZm9ybWVyPgotCi0gIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0iaW5jb21pbmctcHJveHkiIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC50cmFuc2Zvcm1lci5pbmNvbWluZy1wcm94eSIKLSAgICBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5JbmNvbWluZ1Byb3h5VHJhbnNmb3JtZXIiPgotICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBlbGVtZW50PSJhIiBhdHRyaWJ1dGU9ImhyZWYiLz4KLSAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZWxlbWVudD0ib2JqZWN0IiBhdHRyaWJ1dGU9ImRhdGEiLz4KLSAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZWxlbWVudD0iaW1nIiBhdHRyaWJ1dGU9InNyYyIvPgotICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBlbGVtZW50PSJsaW5rIiBhdHRyaWJ1dGU9ImhyZWYiLz4KLSAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZWxlbWVudD0iZm9ybSIgYXR0cmlidXRlPSJhY3Rpb24iLz4KLSAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZWxlbWVudD0ic2NyaXB0IiBhdHRyaWJ1dGU9InNyYyIvPgotICA8L21hcDp0cmFuc2Zvcm1lcj4KLSAgCi08L3htYXA+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvTGlua2luZ01vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvTGlua2luZ01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQ4NDRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L0xpbmtpbmdNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuQWJzdHJhY3RJbnB1dE1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotCi0vKioKLSAqIDxwPlRoZSBsaW5raW5nIG1vZHVsZSBpcyBhIHV0aWxpdHkgdG8gYWRkIHBhcmFtZXRlcnMgdG8gbGluayBVUkxzLAotICogZGVwZW5kaW5nIG9uIHJlcXVlc3QgcGFyYW1ldGVycy4gU3VwcG9ydGVkIGF0dHJpYnV0ZXM6PC9wPgotICogPHVsPgotICogPGxpPjxjb2RlPnJldjwvY29kZT4gLSBpbnNlcnRzIHRoZSBwYXJhbWV0ZXIgPGNvZGU+LHJldj0uLi48L2NvZGU+Ci0gKiBpZiBhIHJlcXVlc3QgcGFyYW1ldGVyIDxjb2RlPmxlbnlhLnJldmlzaW9uPC9jb2RlPiBpcyBwcmVzZW50LjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgTGlua2luZ01vZHVsZSBleHRlbmRzIEFic3RyYWN0SW5wdXRNb2R1bGUgewotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9SRVZJU0lPTiA9ICJyZXYiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfUEFSQU1fUkVWSVNJT04gPSAibGVueWEucmV2aXNpb24iOwotCi0gICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKEFUVFJJQlVURV9SRVZJU0lPTikpIHsKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotICAgICAgICAgICAgU3RyaW5nIHJldmlzaW9uID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoUkVRVUVTVF9QQVJBTV9SRVZJU0lPTik7Ci0gICAgICAgICAgICBpZiAocmV2aXNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiLHJldj0iICsgcmV2aXNpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVGhlIGF0dHJpYnV0ZSBbIiArIG5hbWUgKyAiXSBpcyBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1Byb3h5TW9kdWxlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9Qcm94eU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDhhODM5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1Byb3h5TW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuQWJzdHJhY3RJbnB1dE1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua1Jld3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuT3V0Z29pbmdMaW5rUmV3cml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotCi0vKioKLSAqIDxwPgotICogSW5wdXQgbW9kdWxlIGZvciBnZXR0aW5nIHRoZSBiYXNlIFVSTCB3aGljaCBtYXkgYmUgcHJlcGVuZGVkIHRvIGludGVybmFsIFVSTHMKLSAqIHRvIGNvbnN0cnVjdCBsaW5rcy4gVGhlIGZ1bmN0aW9uYWxpdHkgY29ycmVzcG9uZHMgdG8gdGhlCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uLlByb3h5VHJhbnNmb3JtZXJ9IHdpdGggb25lCi0gKiBleGNlcHRpb246IElmIHRoZSA8ZW0+d2ViYXBwVXJsPC9lbT4gcGFyYW1ldGVyIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIHJvb3QKLSAqIHByb3h5IFVSTCAob3IgdGhlIGNvbnRleHQgcHJlZml4LCByZXNwLikgaXMgcmV0dXJuZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFVzYWdlOiA8Y29kZT57cHJveHk6e3dlYmFwcFVybH19PC9jb2RlPgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgbW9kdWxlIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkxzIGluIHRoZSBzYW1lIHdheQotICogYXMgdGhlIHtAbGluayBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24udHJhbnNmb3JtYXRpb24uUHJveHlUcmFuc2Zvcm1lcn0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eU1vZHVsZSBleHRlbmRzIEFic3RyYWN0SW5wdXRNb2R1bGUgaW1wbGVtZW50cyBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRSA9ICJ0eXBlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVFlQRV9BQlNPTFVURSA9ICJhYnNvbHV0ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RZUEVfUkVMQVRJVkUgPSAicmVsYXRpdmUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9VUkxTID0gInVybHMiOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgYm9vbGVhbiByZWxhdGl2ZVVybHM7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZSNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHdlYmFwcFVybCA9IG5hbWU7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAod2ViYXBwVXJsLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHJld3JpdGUocmVxdWVzdCwgIi8iKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSByZXdyaXRlKHJlcXVlc3QsIHdlYmFwcFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJPYnRhaW5pbmcgdmFsdWUgZm9yIFsiICsgbmFtZSArICJdIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmV3cml0ZShSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyB1cmwpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uLAotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24odGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgTGlua1Jld3JpdGVyIHJld3JpdGVyID0gbmV3IE91dGdvaW5nTGlua1Jld3JpdGVyKHRoaXMubWFuYWdlciwgc2Vzc2lvbiwgcmVxdWVzdAotICAgICAgICAgICAgICAgIC5nZXRSZXF1ZXN0VVJJKCksIHJlcXVlc3QuaXNTZWN1cmUoKSwgZmFsc2UsIHRoaXMucmVsYXRpdmVVcmxzKTsKLSAgICAgICAgaWYgKCFyZXdyaXRlci5tYXRjaGVzKHVybCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJUaGUgVVJMIFsiICsgdXJsICsgIl0gY2FuJ3QgYmUgcmV3cml0dGVuISIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlKHVybCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlTmFtZXMob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEF0dHJpYnV0ZU5hbWVzKENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEF0dHJpYnV0ZVZhbHVlcyhTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvYmplY3RzID0geyBnZXRBdHRyaWJ1dGUobmFtZSwgbW9kZUNvbmYsIG9iamVjdE1vZGVsKSB9OwotICAgICAgICByZXR1cm4gb2JqZWN0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBzdXBlci5jb25maWd1cmUoY29uZik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gdXJsQ29uZmlnID0gY29uZi5nZXRDaGlsZChQQVJBTUVURVJfVVJMUywgZmFsc2UpOwotICAgICAgICBpZiAodXJsQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHVybENvbmZpZy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1RZUEUpOwotICAgICAgICAgICAgc2V0VXJsVHlwZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXJsVHlwZShTdHJpbmcgdmFsdWUpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhVUkxfVFlQRV9SRUxBVElWRSkpIHsKLSAgICAgICAgICAgIHRoaXMucmVsYXRpdmVVcmxzID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoVVJMX1RZUEVfQUJTT0xVVEUpKSB7Ci0gICAgICAgICAgICB0aGlzLnJlbGF0aXZlVXJscyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkludmFsaWQgVVJMIHR5cGUgWyIgKyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICArICJdLCBtdXN0IGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLiIpOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zb3VyY2UvRG9jdW1lbnRTb3VyY2VGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9Eb2N1bWVudFNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhOTEwZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9Eb2N1bWVudFNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0dWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnRocmVhZC5UaHJlYWRTYWZlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua1Jlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua1RhcmdldDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5RdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgc291cmNlIGZhY3RvcnkgYWxsb3dzIHRvIGFjY2VzcyBkb2N1bWVudHMgdXNpbmcgdGhlIGxpbmsgc3ludGF4IG9mIHRoZQotICoge0BsaW5rIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua1Jlc29sdmVyfS4KLSAqIDwvcD4KLSAqIDxwPgotICogQWRkaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXJzLCBzZXBhcmF0ZWQgdXNpbmcgPGNvZGU+Li4uP2Y9Zm9vJmFtcDtiPWJhcjwvY29kZT46Ci0gKiA8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+PHN0cm9uZz5mb3JtYXQ8L3N0cm9uZz4gLSB0aGUgcmVzb3VyY2UgdHlwZSBmb3JtYXQ8L2xpPgotICogPGxpPjxzdHJvbmc+c2Vzc2lvbjwvc3Ryb25nPiAtIHRoZSBzZXNzaW9uLgotICogICBUbyB1c2UgdGhlIHNlc3Npb24gb2YgdGhlIGN1cnJlbnQgdXNlY2FzZSwgc3BlY2lmeSA8Y29kZT5zZXNzaW9uPXVzZWNhc2U8L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBTb3VyY2VGYWN0b3J5LCBUaHJlYWRTYWZlLAotICAgICAgICBDb250ZXh0dWFsaXphYmxlLCBTZXJ2aWNlYWJsZSwgQ29uZmlndXJhYmxlIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBVUkkgc2NoZW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJsZW55YS1kb2N1bWVudCI7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgY29udGV4dDsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGZvciByZXNvbHZpbmcgdGhlIG9iamVjdCBtb2RlbC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGUjY29udGV4dHVhbGl6ZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29udGV4dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU291cmNlUmVzb2x2ZXIgc291cmNlUmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGUjY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUZhY3RvcnkjZ2V0U291cmNlKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgZ2V0U291cmNlKFN0cmluZyBsb2NhdGlvbiwgTWFwIHBhcmFtZXRlcnMpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiwgU291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIE1hcCBvYmplY3RNb2RlbCA9IENvbnRleHRIZWxwZXIuZ2V0T2JqZWN0TW9kZWwodGhpcy5jb250ZXh0KTsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0KLSAgICAgICAgU3RyaW5nW10gdXJpQW5kUXVlcnkgPSBsb2NhdGlvbi5zcGxpdCgiXFw/Iik7Ci0KLSAgICAgICAgU3RyaW5nIGxpbmtVcmkgPSB1cmlBbmRRdWVyeVswXTsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKLSAgICAgICAgaWYgKHVyaUFuZFF1ZXJ5Lmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgIHF1ZXJ5U3RyaW5nID0gdXJpQW5kUXVlcnlbMV07Ci0gICAgICAgIH0KLQotICAgICAgICBMaW5rUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlUmVzb2x2ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuc291cmNlUmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc29sdmVyID0gKExpbmtSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChMaW5rUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5nZXREb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIFN0cmluZyB3ZWJhcHBVcmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgICAgIExpbmtUYXJnZXQgdGFyZ2V0OwotICAgICAgICAgICAgaWYgKGZhY3RvcnkuaXNEb2N1bWVudCh3ZWJhcHBVcmwpKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgY3VycmVudERvYyA9IGZhY3RvcnkuZ2V0RnJvbVVSTCh3ZWJhcHBVcmwpOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IHJlc29sdmVyLnJlc29sdmUoY3VycmVudERvYywgbGlua1VyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayhsaW5rVXJpKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0dWFsaXplKGxpbmssIHdlYmFwcFVybCk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcmVzb2x2ZXIucmVzb2x2ZShmYWN0b3J5LCBsaW5rLmdldFVyaSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gdGFyZ2V0LmdldERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXQuaXNSZXZpc2lvblNwZWNpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcXVlcnlTdHJpbmcgKz0gInJldj0iICsgdGFyZ2V0LmdldFJldmlzaW9uTnVtYmVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBmb3JtYXQgPSBudWxsOwotICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBRdWVyeSBxdWVyeSA9IG5ldyBRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0ID0gcXVlcnkuZ2V0VmFsdWUoImZvcm1hdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEZvcm1hdFNvdXJjZShkb2MsIGZvcm1hdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBsZW55YVVSTCA9IGRvYy5nZXRTb3VyY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAocXVlcnlTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsZW55YVVSTCArPSAiPyIgKyBxdWVyeVN0cmluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlUmVzb2x2ZXIucmVzb2x2ZVVSSShsZW55YVVSTCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbGluayBkb2Vzbid0IGNvbnRhaW4gY29udGV4dCBpbmZvcm1hdGlvbiAocHVibGljYXRpb24gSUQsIGFyZWEpLCBwcm92aWRlIGl0LgotICAgICAqIEBwYXJhbSBsaW5rIFRoZSBsaW5rLgotICAgICAqIEBwYXJhbSB3ZWJhcHBVcmwgVGhlIHdlYiBhcHBsaWNhdGlvbiBVUkwgdG8gZXh0cmFjdCB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiBmcm9tLi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb250ZXh0dWFsaXplKExpbmsgbGluaywgU3RyaW5nIHdlYmFwcFVybCkgewotICAgICAgICBVUkxJbmZvcm1hdGlvbiB1cmwgPSBuZXcgVVJMSW5mb3JtYXRpb24od2ViYXBwVXJsKTsKLSAgICAgICAgaWYgKGxpbmsuZ2V0UHViSWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rLnNldFB1YklkKHVybC5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaW5rLmdldEFyZWEoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rLnNldEFyZWEodXJsLmdldEFyZWEoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU291cmNlIGdldEZvcm1hdFNvdXJjZShEb2N1bWVudCBkb2MsIFN0cmluZyBmb3JtYXQpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNlcnZpY2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZvcm1hdEJhc2VVcmkgPSBkb2MuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0Rm9ybWF0VVJJKGZvcm1hdCk7Ci0gICAgICAgIFN0cmluZyBmb3JtYXRVcmkgPSBmb3JtYXRCYXNlVXJpICsgIi8iICsgZG9jLmdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKSArICIvIiArIGRvYy5nZXRBcmVhKCkKLSAgICAgICAgICAgICAgICArICIvIiArIGRvYy5nZXRVVUlEKCkgKyAiLyIgKyBkb2MuZ2V0TGFuZ3VhZ2UoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VSZXNvbHZlci5yZXNvbHZlVVJJKGZvcm1hdFVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlRmFjdG9yeSNyZWxlYXNlKG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZShTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIHRoaXMuc291cmNlUmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9BYnN0cmFjdExpbmtUcmFuc2Zvcm1lci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9BYnN0cmFjdExpbmtUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjEyMTVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vQWJzdHJhY3RMaW5rVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24udHJhbnNmb3JtYXRpb24uQWJzdHJhY3RTQVhUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtSZXdyaXRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIDxwPgotICogVGhpcyB0cmFuc2Zvcm1lciBwcm9jZXNzZXMgYWxsIGxpbmtzIHdoaWNoIGFyZSBjb25maWd1cmVkIHVzaW5nCi0gKiA8Y29kZT4mbHQ7dHJhbnNmb3JtLyZndDs8L2NvZGU+IGVsZW1lbnRzOgotICogPC9wPgotICogPGNvZGU+PHByZT4KLSAqICAgJmx0O21hcDp0cmFuc2Zvcm1lciAuLi4gJmd0OwotICogICAgICZsdDt0cmFuc2Zvcm0gbmFtZXNwYWNlPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwmcXVvdDsgZWxlbWVudD0mcXVvdDthJnF1b3Q7IGF0dHJpYnV0ZT0mcXVvdDtocmVmJnF1b3Q7LyZndDsKLSAqICAgICAmbHQ7dHJhbnNmb3JtIG5hbWVzcGFjZT0mcXVvdDsuLi4mcXVvdDsgLi4uIC8mZ3Q7Ci0gKiAgICZsdDsvbWFwOnRyYW5zZm9ybWVyJmd0OwotICogPC9wcmU+PC9jb2RlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaW5rVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFNBWFRyYW5zZm9ybWVyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgb2Ygc3VwcG9ydGVkIGxvY2FsIG5hbWVzIGZvciBxdWljayBwcmUtY2hlY2tzLgotICAgICAqLwotICAgIHByaXZhdGUgU2V0IGxvY2FsTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBzdXBlci5jb25maWd1cmUoY29uZmlnKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbltdIHRyYW5zZm9ybUNvbmZpZ3MgPSBjb25maWcuZ2V0Q2hpbGRyZW4oInRyYW5zZm9ybSIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zZm9ybUNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSB0cmFuc2Zvcm1Db25maWdzW2ldLmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudCA9IHRyYW5zZm9ybUNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKCJlbGVtZW50Iik7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gdHJhbnNmb3JtQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoImF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgQXR0cmlidXRlQ29uZmlndXJhdGlvbiBhdHRyQ29uZmlnID0gbmV3IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24obmFtZXNwYWNlLCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpOwotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldENhY2hlS2V5KG5hbWVzcGFjZSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBTZXQgY29uZmlncyA9IChTZXQpIHRoaXMubmFtZXNwYWNlTG9jYWxuYW1lMmNvbmZpZ1NldC5nZXQoa2V5KTsKLSAgICAgICAgICAgIGlmIChjb25maWdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25maWdzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTmFtZXMuYWRkKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlTG9jYWxuYW1lMmNvbmZpZ1NldC5wdXQoa2V5LCBjb25maWdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbmZpZ3MuYWRkKGF0dHJDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjbGFyYXRpb24gb2YgYW4gYXR0cmlidXRlIHdoaWNoIHNob3VsZCBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gewotCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZWxlbWVudDsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnQuCi0gICAgICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdHJhbnNmb3JtLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIG5hbWVzcGFjZSBVUkkuCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBsb2NhbCBuYW1lLgotICAgICAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMuCi0gICAgICAgICAqIEByZXR1cm4gSWYgdGhpcyBjb25maWd1cmF0aW9uIG1hdGNoZXMgdGhlIHBhcmFtZXRlcnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UuZXF1YWxzKHVyaSkgJiYgdGhpcy5lbGVtZW50LmVxdWFscyhuYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBhdHRycy5nZXRWYWx1ZSh0aGlzLmF0dHJpYnV0ZSkgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIFVSSS4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lLgotICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcy4KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIHtAbGluayBBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBvYmplY3RzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXQgZ2V0TWF0Y2hpbmdDb25maWd1cmF0aW9ucyhTdHJpbmcgbmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwgQXR0cmlidXRlcyBhdHRycykgewotICAgICAgICAKLSAgICAgICAgLy8gcHJlLWNoZWNrIGZvciBwZXJmb3JtYW5jZSByZWFzb25zCi0gICAgICAgIGlmICghZXhpc3RzTWF0Y2hpbmdDb25maWd1cmF0aW9uKG5hbWVzcGFjZSwgbG9jYWxOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGtleSA9IGdldENhY2hlS2V5KG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGRvbid0IGluaXRpYWxpemUgeWV0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zCi0gICAgICAgIFNldCBjb25maWdzID0gbnVsbDsKLSAgICAgICAgU2V0IGFsbENvbmZpZ3MgPSAoU2V0KSB0aGlzLm5hbWVzcGFjZUxvY2FsbmFtZTJjb25maWdTZXQuZ2V0KGtleSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGFsbENvbmZpZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgQXR0cmlidXRlQ29uZmlndXJhdGlvbiBjb25maWcgPSAoQXR0cmlidXRlQ29uZmlndXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLm1hdGNoZXMobmFtZXNwYWNlLCBsb2NhbE5hbWUsIGF0dHJzKSkgewotICAgICAgICAgICAgICAgIGlmIChjb25maWdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlncyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmZpZ3MuYWRkKGNvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmZpZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlncyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FjaGUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBuYW1lc3BhY2VMb2NhbG5hbWUyY29uZmlnU2V0ID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGV4aXN0c01hdGNoaW5nQ29uZmlndXJhdGlvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIC8vIHF1aWNrIHByZS1jaGVjawotICAgICAgICBpZiAoIXRoaXMubG9jYWxOYW1lcy5jb250YWlucyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG1vcmUgZXhwZW5zaXZlIGNoZWNrCi0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRDYWNoZUtleShuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZUxvY2FsbmFtZTJjb25maWdTZXQuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENhY2hlS2V5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSArICIgIiArIGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGluZGVudCA9ICIiOwotICAgIHByb3RlY3RlZCBib29sZWFuIGlnbm9yZUxpbmtFbGVtZW50ID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUsIFN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRycykKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgKyAiPCIgKyBxbmFtZSArICI+IChpZ25vcmVBRWxlbWVudCA9ICIgKyB0aGlzLmlnbm9yZUxpbmtFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSIpOwotICAgICAgICAgICAgdGhpcy5pbmRlbnQgKz0gIiAgIjsKLSAgICAgICAgfQotCi0gICAgICAgIEF0dHJpYnV0ZXNJbXBsIG5ld0F0dHJzID0gbnVsbDsKLQotICAgICAgICBTZXQgY29uZmlncyA9IGdldE1hdGNoaW5nQ29uZmlndXJhdGlvbnModXJpLCBuYW1lLCBhdHRycyk7Ci0KLSAgICAgICAgaWYgKCFjb25maWdzLmlzRW1wdHkoKSkgewotCi0gICAgICAgICAgICB0aGlzLmlnbm9yZUxpbmtFbGVtZW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gKEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5rVXJsID0gYXR0cnMuZ2V0VmFsdWUoY29uZmlnLmF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKHRoaXMuaW5kZW50ICsgImxpbmsgVVJMOiBbIiArIGxpbmtVcmwgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5ld0F0dHJzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGluayhsaW5rVXJsLCBjb25maWcsIG5ld0F0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigic3RhcnRFbGVtZW50IGZhaWxlZDogIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKHRoaXMuaW5kZW50ICsgImlnbm9yZUFFbGVtZW50OiAiICsgdGhpcy5pZ25vcmVMaW5rRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISghY29uZmlncy5pc0VtcHR5KCkgJiYgdGhpcy5pZ25vcmVMaW5rRWxlbWVudCkpIHsKLSAgICAgICAgICAgIGlmIChuZXdBdHRycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cnMgPSBuZXdBdHRyczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIG5hbWUsIHFuYW1lLCBhdHRycyk7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKHRoaXMuaW5kZW50ICsgIjwiICsgcW5hbWUgKyAiPiBzZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgYSBsaW5rIGluIHRoZSBzb3VyY2UgU0FYIHN0cmVhbS4KLSAgICAgKiBAcGFyYW0gbGlua1VybCBUaGUgbGluayBVUkwuCi0gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gd2hpY2ggbWF0Y2hlZCB0aGUgbGluay4KLSAgICAgKiBAcGFyYW0gbmV3QXR0cnMgVGhlIG5ldyBhdHRyaWJ1dGVzIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlc3VsdAotICAgICAqICAgICAgICBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMaW5rKFN0cmluZyBsaW5rVXJsLCBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIGNvbmZpZywgQXR0cmlidXRlc0ltcGwgbmV3QXR0cnMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExpbmtSZXdyaXRlcigpLm1hdGNoZXMobGlua1VybCkpIHsKLSAgICAgICAgICAgIHNldEF0dHJpYnV0ZShuZXdBdHRycywgY29uZmlnLmF0dHJpYnV0ZSwgZ2V0TGlua1Jld3JpdGVyKCkucmV3cml0ZShsaW5rVXJsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gdGhpcy5pbmRlbnQuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcodGhpcy5pbmRlbnQgKyAiPC8iICsgcW5hbWUgKyAiPiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleGlzdHNNYXRjaGluZ0NvbmZpZ3VyYXRpb24odXJpLCBuYW1lKSAmJiB0aGlzLmlnbm9yZUxpbmtFbGVtZW50KSB7Ci0gICAgICAgICAgICB0aGlzLmlnbm9yZUxpbmtFbGVtZW50ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKHRoaXMuaW5kZW50ICsgIjwvIiArIHFuYW1lICsgIj4gc2VudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwZXIuZW5kRWxlbWVudCh1cmksIG5hbWUsIHFuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgY2VydGFpbiBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZXMuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBjb250YWluZWQKLSAgICAgKiAgICAgICAgIGluIHRoaXMgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBdHRyaWJ1dGUoQXR0cmlidXRlc0ltcGwgYXR0ciwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpbnQgcG9zaXRpb24gPSBhdHRyLmdldEluZGV4KG5hbWUpOwotICAgICAgICBpZiAocG9zaXRpb24gPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBhdHRyaWJ1dGUgWyIgKyBuYW1lICsgIl0gaXMgbm90IGF2YWlsYWJsZSEiKTsKLSAgICAgICAgfQotICAgICAgICBhdHRyLnNldFZhbHVlKHBvc2l0aW9uLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbGluayByZXdyaXRlciB1c2VkIGJ5IHRoaXMgdHJhbnNmb3JtZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExpbmtSZXdyaXRlciBnZXRMaW5rUmV3cml0ZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9JbmNvbWluZ1Byb3h5VHJhbnNmb3JtZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vSW5jb21pbmdQcm94eVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTQ3NzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9JbmNvbWluZ1Byb3h5VHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24udHJhbnNmb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLlByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkluY29taW5nTGlua1Jld3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua1Jld3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIENvbnZlcnRzIGxpbmtzIGluIHByb3h5IHN5bnRheCB0byB3ZWIgYXBwbGljYXRpb24gbGlua3MuCi0gKiBAc2VlIEluY29taW5nTGlua1Jld3JpdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNvbWluZ1Byb3h5VHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdExpbmtUcmFuc2Zvcm1lciB7Ci0KLSAgICBwcml2YXRlIExpbmtSZXdyaXRlciByZXdyaXRlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNldHVwKFNvdXJjZVJlc29sdmVyIF9yZXNvbHZlciwgTWFwIF9vYmplY3RNb2RlbCwgU3RyaW5nIF9zb3VyY2UsCi0gICAgICAgICAgICBQYXJhbWV0ZXJzIF9wYXJhbWV0ZXJzKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldHVwKF9yZXNvbHZlciwgX29iamVjdE1vZGVsLCBfc291cmNlLCBfcGFyYW1ldGVycyk7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3QoX29iamVjdE1vZGVsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbih0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KHRoaXMubWFuYWdlciwgc2Vzc2lvbik7Ci0gICAgICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpKTsKLSAgICAgICAgICAgIFN0cmluZyBwdWJJZCA9IGluZm8uZ2V0UHVibGljYXRpb25JZCgpOwotICAgICAgICAgICAgdGhpcy5yZXdyaXRlciA9IG5ldyBJbmNvbWluZ0xpbmtSZXdyaXRlcihmYWN0b3J5LmdldFB1YmxpY2F0aW9uKHB1YklkKSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaW5rUmV3cml0ZXIgZ2V0TGlua1Jld3JpdGVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXdyaXRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3RyYW5zZm9ybWF0aW9uL1Byb3h5VHJhbnNmb3JtZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vUHJveHlUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcyOTMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vUHJveHlUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24udHJhbnNmb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rUmV3cml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5PdXRnb2luZ0xpbmtSZXdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogPHA+Ci0gKiBQcm94eSB0cmFuc2Zvcm1lci4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHJlc3VsdGluZyBVUkxzIGNhbiBlaXRoZXIgYmUgYWJzb2x1dGUgKGRlZmF1bHQpIG9yIHJlbGF0aXZlLiBZb3UgY2FuCi0gKiBlaXRoZXIgY29uZmlndXJlIHRoaXMgd2hlbiBkZWNsYXJpbmcgdGhlIHRyYW5zZm9ybWVyOgotICogPC9wPgotICogPGNvZGU+PHByZT4KLSAqICAgICAmbHQ7bWFwOnRyYW5zZm9ybWVyIC4uLiAmZ3Q7Ci0gKiAgICAgICAmbHQ7dXJscyB0eXBlPSZxdW90O3JlbGF0aXZlJnF1b3Q7LyZndDsKLSAqICAgICAgIC4uLgotICogICAgICZsdDsvbWFwOnRyYW5zZm9ybWVyJmd0OwotICogPC9wcmU+PC9jb2RlPgotICogPHA+Ci0gKiBvciBwYXNzIGEgcGFyYW1ldGVyOgotICogPC9wPgotICogPGNvZGU+PHByZT4KLSAqICAgICAmbHQ7bWFwOnBhcmFtZXRlciBuYW1lPSZxdW90O3VybHMmcXVvdDsgdmFsdWU9JnF1b3Q7cmVsYXRpdmUmcXVvdDsvJmd0OwotICogPC9wcmU+PC9jb2RlPgotICogQHNlZSBPdXRnb2luZ0xpbmtSZXdyaXRlcgotICovCi1wdWJsaWMgY2xhc3MgUHJveHlUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0TGlua1RyYW5zZm9ybWVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFID0gInR5cGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9UWVBFX0FCU09MVVRFID0gImFic29sdXRlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVFlQRV9SRUxBVElWRSA9ICJyZWxhdGl2ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1VSTFMgPSAidXJscyI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVsYXRpdmVVcmxzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBMaW5rUmV3cml0ZXIgcmV3cml0ZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXR1cChTb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXIsIE1hcCBfb2JqZWN0TW9kZWwsIFN0cmluZyBfc291cmNlLAotICAgICAgICAgICAgUGFyYW1ldGVycyBfcGFyYW1ldGVycykgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXR1cChfcmVzb2x2ZXIsIF9vYmplY3RNb2RlbCwgX3NvdXJjZSwgX3BhcmFtZXRlcnMpOwotICAgICAgICBSZXF1ZXN0IF9yZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChfb2JqZWN0TW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoX3BhcmFtZXRlcnMuaXNQYXJhbWV0ZXIoUEFSQU1FVEVSX1VSTFMpKSB7Ci0gICAgICAgICAgICAgICAgc2V0VXJsVHlwZShfcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoUEFSQU1FVEVSX1VSTFMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24odGhpcy5tYW5hZ2VyLCBfcmVxdWVzdCk7Ci0gICAgICAgICAgICB0aGlzLnJld3JpdGVyID0gbmV3IE91dGdvaW5nTGlua1Jld3JpdGVyKHRoaXMubWFuYWdlciwgc2Vzc2lvbiwgX3JlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlcXVlc3RVUkkoKSwgcmVxdWVzdC5pc1NlY3VyZSgpLCBmYWxzZSwgdGhpcy5yZWxhdGl2ZVVybHMpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlKGNvbmZpZyk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gdXJsQ29uZmlnID0gY29uZmlnLmdldENoaWxkKFBBUkFNRVRFUl9VUkxTLCBmYWxzZSk7Ci0gICAgICAgIGlmICh1cmxDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdXJsQ29uZmlnLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVFlQRSk7Ci0gICAgICAgICAgICBzZXRVcmxUeXBlKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVybFR5cGUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoVVJMX1RZUEVfUkVMQVRJVkUpKSB7Ci0gICAgICAgICAgICB0aGlzLnJlbGF0aXZlVXJscyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzKFVSTF9UWVBFX0FCU09MVVRFKSkgewotICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZVVybHMgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIFVSTCB0eXBlIFsiICsgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKyAiXSwgbXVzdCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaW5rUmV3cml0ZXIgZ2V0TGlua1Jld3JpdGVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXdyaXRlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vVXJsVG9VdWlkVHJhbnNmb3JtZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vVXJsVG9VdWlkVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlOWRjMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3RyYW5zZm9ybWF0aW9uL1VybFRvVXVpZFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rUmV3cml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5VcmxUb1V1aWRSZXdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5BcmVhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPgotICogVVJMIHRvIFVVSUQgdHJhbnNmb3JtZXIuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyB0cmFuc2Zvcm1lciBpcyBhcHBsaWVkIHRvIGFuIFhITVRMIGRvY3VtZW50LiBJdCBwcm9jZXNzZXMgYWxsIFVSTC1iYXNlZAotICogbGlua3MgdG8gbGlua3MgZm9sbG93aW5nIHRoZSB7QGxpbmsgTGlua1Jlc29sdmVyfSBzeW50YXguCi0gKiA8L3A+Ci0gKiAKLSAqICRJZDogTGlua1Jld3JpdGluZ1RyYW5zZm9ybWVyLmphdmEsdiAxLjcgMjAwNC8wMy8xNiAxMToxMjoxNiBncmVnb3IKLSAqLwotcHVibGljIGNsYXNzIFVybFRvVXVpZFRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RMaW5rVHJhbnNmb3JtZXIgewotCi0gICAgcHJpdmF0ZSBMaW5rUmV3cml0ZXIgcmV3cml0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLnNpdGVtYXAuU2l0ZW1hcE1vZGVsQ29tcG9uZW50I3NldHVwKG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLAotICAgICAqICAgICAgamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0dXAoU291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyLCBNYXAgX29iamVjdE1vZGVsLCBTdHJpbmcgX3NvdXJjZSwKLSAgICAgICAgICAgIFBhcmFtZXRlcnMgX3BhcmFtZXRlcnMpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0dXAoX3Jlc29sdmVyLCBfb2JqZWN0TW9kZWwsIF9zb3VyY2UsIF9wYXJhbWV0ZXJzKTsKLQotICAgICAgICBSZXF1ZXN0IF9yZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChfb2JqZWN0TW9kZWwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbih0aGlzLm1hbmFnZXIsIF9yZXF1ZXN0KTsKLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHNlc3Npb24pOwotICAgICAgICAgICAgU3RyaW5nIHVybCA9IFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKF9yZXF1ZXN0KTsKLSAgICAgICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24odXJsKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24oaW5mby5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICAgICAgQXJlYSBhcmVhID0gcHViLmdldEFyZWEoaW5mby5nZXRBcmVhKCkpOwotICAgICAgICAgICAgdGhpcy5yZXdyaXRlciA9IG5ldyBVcmxUb1V1aWRSZXdyaXRlcihhcmVhKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlua1Jld3JpdGVyIGdldExpbmtSZXdyaXRlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmV3cml0ZXI7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9VdWlkVG9VcmxUcmFuc2Zvcm1lci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9VdWlkVG9VcmxUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQxNmVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vVXVpZFRvVXJsVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtSZXdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtUYXJnZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5VUkxJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuUXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKgotICogPHA+Ci0gKiBVVUlEIHRvIFVSTCB0cmFuc2Zvcm1lci4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIHRyYW5zZm9ybWVyIGlzIGFwcGxpZWQgdG8gYW4gWEhNVEwgZG9jdW1lbnQuIEl0IHByb2Nlc3NlcyBhbGwgbGlua3MgZm9sbG93aW5nIHRoZQotICoge0BsaW5rIExpbmtSZXNvbHZlcn0gc3ludGF4IHdoaWNoIGFyZSBjb25maWd1cmVkIHVzaW5nIDxjb2RlPiZsdDt0cmFuc2Zvcm0vJmd0OzwvY29kZT4gZWxlbWVudHMKLSAqIChzZWUgYmVsb3cpLgotICogPC9wPgotICogPHA+Ci0gKiBUaGVzZSBsaW5rcyBhcmUgcmVzb2x2ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT5UaGUgY3VycmVudCBhcmVhIChvYnRhaW5lZCBmcm9tIHRoZSBwYWdlIGVudmVsb3BlKSBpcyB1c2VkLjwvbGk+Ci0gKiA8bGk+QSBVUkwgcHJlZml4IGlzIGFkZGVkIGRlcGVuZGluZyBvbiB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBvZiB0aGUgcHVibGljYXRpb24uPC9saT4KLSAqIDxsaT5JZiB0aGUgdGFyZ2V0IGRvY3VtZW50IGRvZXMgbm90IGV4aXN0IGFuZCBpcyBpbiB0aGUgYXV0aG9yaW5nIGFyZWEsIHRoZSBocmVmIGF0dHJpYnV0ZSBpcwotICogcmVtb3ZlZCBhbmQgYSBjbGFzcz0iYnJva2VubGluayIgYXR0cmlidXRlIGlzIGFkZGVkIHRvIHRoZSA8Y29kZT4mbHQ7YS8mZ3Q7PC9jb2RlPiBlbGVtZW50LjwvbGk+Ci0gKiA8bGk+SWYgdGhlIHRhcmdldCBkb2N1bWVudCBkb2VzIG5vdCBleGlzdCBhbmQgaXMgaW4gdGhlIGxpdmUgYXJlYSwgdGhlIDxjb2RlPiZsdDthLyZndDs8L2NvZGU+Ci0gKiBlbGVtZW50IGlzIHJlbW92ZWQgdG8gZGlzYWJsZSB0aGUgbGluay48L2xpPgotICogPC91bD4KLSAqIAotICogPHA+Ci0gKiBZb3UgY2FuIGFkZCB0aGUgcXVlcnkgcGFyYW1ldGVyIDxjb2RlPnV1aWQydXJsLmV4dGVuc2lvbjwvY29kZT4gdG8gPGNvZGU+bGVueWEtZG9jdW1lbnQ6PC9jb2RlPgotICogVVJMcyB0byBzZXQgYSBzcGVjaWZpYyBsaW5rIGV4dGVuc2lvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHJlc3VsdGluZyBVUkxzIGFyZSBhYnNvbHV0ZSB3ZWIgYXBwbGljYXRpb24gVVJMcyAod2l0aG91dCB0aGUgc2VydmxldCBjb250ZXh0IHBhdGgpLgotICogPC9wPgotICogCi0gKiAkSWQ6IExpbmtSZXdyaXRpbmdUcmFuc2Zvcm1lci5qYXZhLHYgMS43IDIwMDQvMDMvMTYgMTE6MTI6MTYgZ3JlZ29yCi0gKi8KLXB1YmxpYyBjbGFzcyBVdWlkVG9VcmxUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0TGlua1RyYW5zZm9ybWVyIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9LRU5fQVRUUklCID0gImNsYXNzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9LRU5fVkFMVUUgPSAiYnJva2VubGluayI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BBUkFNID0gInV1aWQydXJsLmV4dGVuc2lvbiI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjdXJyZW50VXJsOwotCi0gICAgcHJpdmF0ZSBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeTsKLSAgICBwcml2YXRlIExpbmtSZXNvbHZlciBsaW5rUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudCBjdXJyZW50RG9jOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5zaXRlbWFwLlNpdGVtYXBNb2RlbENvbXBvbmVudCNzZXR1cChvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlciwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXAsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0dXAoU291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyLCBNYXAgX29iamVjdE1vZGVsLCBTdHJpbmcgX3NvdXJjZSwKLSAgICAgICAgICAgIFBhcmFtZXRlcnMgX3BhcmFtZXRlcnMpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0dXAoX3Jlc29sdmVyLCBfb2JqZWN0TW9kZWwsIF9zb3VyY2UsIF9wYXJhbWV0ZXJzKTsKLQotICAgICAgICBSZXF1ZXN0IF9yZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChfb2JqZWN0TW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgX3JlcXVlc3QpOwotICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHNlc3Npb24pOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50VXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkoX3JlcXVlc3QpOwotICAgICAgICAgICAgaWYgKHRoaXMuZmFjdG9yeS5pc0RvY3VtZW50KHRoaXMuY3VycmVudFVybCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREb2MgPSB0aGlzLmZhY3RvcnkuZ2V0RnJvbVVSTCh0aGlzLmN1cnJlbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5saW5rUmVzb2x2ZXIgPSAoTGlua1Jlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKExpbmtSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGluayhTdHJpbmcgbGlua1VybCwgQXR0cmlidXRlQ29uZmlndXJhdGlvbiBjb25maWcsIEF0dHJpYnV0ZXNJbXBsIG5ld0F0dHJzKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgVVJMSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBVUkxJbmZvcm1hdGlvbih0aGlzLmN1cnJlbnRVcmwpOwotICAgICAgICBpZiAobGlua1VybC5zdGFydHNXaXRoKCJsZW55YS1kb2N1bWVudDoiKSkgewotCi0gICAgICAgICAgICBTdHJpbmcgYW5jaG9yID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyB1cmwgPSBudWxsOwotCi0gICAgICAgICAgICBpbnQgYW5jaG9ySW5kZXggPSBsaW5rVXJsLmluZGV4T2YoIiMiKTsKLSAgICAgICAgICAgIGlmIChhbmNob3JJbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgdXJsID0gbGlua1VybC5zdWJzdHJpbmcoMCwgYW5jaG9ySW5kZXgpOwotICAgICAgICAgICAgICAgIGFuY2hvciA9IGxpbmtVcmwuc3Vic3RyaW5nKGFuY2hvckluZGV4ICsgMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVybCA9IGxpbmtVcmw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybCwgIj8iKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5rVXJpID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyByZXF1aXJlZEV4dGVuc2lvbiA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgICAgICAgICByZXF1aXJlZEV4dGVuc2lvbiA9IHF1ZXJ5LmdldFZhbHVlKEVYVEVOU0lPTl9QQVJBTSk7Ci0gICAgICAgICAgICAgICAgcXVlcnkucmVtb3ZlVmFsdWUoRVhURU5TSU9OX1BBUkFNKTsKLSAgICAgICAgICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpbmtUYXJnZXQgdGFyZ2V0OwotICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudERvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5saW5rUmVzb2x2ZXIucmVzb2x2ZSh0aGlzLmN1cnJlbnREb2MsIGxpbmtVcmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMaW5rIGxpbmsgPSBnZXRBYnNvbHV0ZUxpbmsoaW5mbywgbGlua1VyaSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5saW5rUmVzb2x2ZXIucmVzb2x2ZSh0aGlzLmZhY3RvcnksIGxpbmsuZ2V0VXJpKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGFyZ2V0LmV4aXN0cygpICYmIHRhcmdldC5nZXREb2N1bWVudCgpLmhhc0xpbmsoKSkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IHRhcmdldERvY3VtZW50ID0gdGFyZ2V0LmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbih0YXJnZXREb2N1bWVudCwgcmVxdWlyZWRFeHRlbnNpb24pOwotICAgICAgICAgICAgICAgIHJld3JpdGVMaW5rKG5ld0F0dHJzLCBjb25maWcuYXR0cmlidXRlLCB0YXJnZXREb2N1bWVudCwgYW5jaG9yLCBxdWVyeVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8uZ2V0QXJlYSgpLmVxdWFscyhQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSkpIHsKLSAgICAgICAgICAgICAgICBtYXJrQnJva2VuTGluayhuZXdBdHRycywgY29uZmlnLmF0dHJpYnV0ZSwgbGlua1VybCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlTGlua0VsZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoaXMgaXMgbGVnYWN5IGNvZGUuIEl0IHJld3JpdGVzIGxpbmtzIHRvIG5vbi1kb2N1bWVudCBpbWFnZXMgKGluIHJlc291cmNlcy9zaGFyZWQpLgotICAgICAgICAgICAgICogVGhlc2UgaW1hZ2VzIHNob3VsZG4ndCBiZSByZWZlcmVuY2VkIGluIGRvY3VtZW50cyBzaW5jZSB0aGlzIHZpb2xhdGVzIHRoZSBzZXBhcmF0aW9uCi0gICAgICAgICAgICAgKiBiZXR3ZWVuIGNvbnRlbnQgYW5kIGxheW91dC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIvIiArIGluZm8uZ2V0UHVibGljYXRpb25JZCgpICsgIi8iOwotICAgICAgICAgICAgaWYgKGxpbmtVcmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHB1YlVybCA9IGxpbmtVcmwuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHViVXJsLCAiLyIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhcmVhID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmV3cml0ZSAve3B1Yn0vbW9kdWxlcy8uLi4KLSAgICAgICAgICAgICAgICBpZiAoYXJlYS5lcXVhbHMoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmVhVXJsID0gcHViVXJsLnN1YnN0cmluZyhhcmVhLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1VybCA9IHByZWZpeCArIGFyZWEgKyBhcmVhVXJsOwotICAgICAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUobmV3QXR0cnMsIGNvbmZpZy5hdHRyaWJ1dGUsIG5ld1VybCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGxpbmsgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgbGlua1VyaSBzdHJpbmcuIElmIGl0IGxhY2tzIHRoZSBhcmVhIG9yIHB1YmxpY2F0aW9uIElECi0gICAgICogaW5mb3JtYXRpb24sIHRoZXNlIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBjdXJyZW50IFVSTCBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gaW5mbyBUaGUgY3VycmVudCBVUkwgaW5mb3JtYXRpb24uCi0gICAgICogQHBhcmFtIGxpbmtVcmkgVGhlIGxpbmsgVVJJIHRvIHVzZS4KLSAgICAgKiBAcmV0dXJuIEEgbGluay4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiB0aGUgbGlua1VyaSBwYXJhbWV0ZXIgaXMgbWFsZm9ybWVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaW5rIGdldEFic29sdXRlTGluayhVUkxJbmZvcm1hdGlvbiBpbmZvLCBTdHJpbmcgbGlua1VyaSkKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayhsaW5rVXJpKTsKLSAgICAgICAgaWYgKGxpbmsuZ2V0UHViSWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rLnNldFB1YklkKGluZm8uZ2V0UHVibGljYXRpb25JZCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGluay5nZXRBcmVhKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgbGluay5zZXRBcmVhKGluZm8uZ2V0QXJlYSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGluazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGV4dGVuc2lvbiBvZiBhIGRvY3VtZW50LiBDYXV0aW9uOiByZXNvbHZpbmcgdGhlIGV4dGVuc2lvbiBpcyBleHBlbnNpdmUhCi0gICAgICogQHBhcmFtIHRhcmdldERvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZWRFeHRlbnNpb24gVGhlIHJlcXVpcmVkIGV4dGVuc2lvbi4KLSAgICAgKiBAcmV0dXJuIFRoZSByZXF1aXJlZCBleHRlbnNpb24gb3IsIGlmIGl0IGlzIG51bGwsIHRoZSBkb2N1bWVudCdzIGRlZmF1bHQgZXh0ZW5zaW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKERvY3VtZW50IHRhcmdldERvY3VtZW50LCBTdHJpbmcgcmVxdWlyZWRFeHRlbnNpb24pIHsKLSAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IHJlcXVpcmVkRXh0ZW5zaW9uICE9IG51bGwgPyByZXF1aXJlZEV4dGVuc2lvbiA6IHRhcmdldERvY3VtZW50Ci0gICAgICAgICAgICAgICAgLmdldEV4dGVuc2lvbigpOwotICAgICAgICBpZiAoZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgZXh0ZW5zaW9uID0gIi4iICsgZXh0ZW5zaW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHRlbnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFya3MgYSA8Y29kZT4mbHQ7YS8mZ3Q7PC9jb2RlPiBlbGVtZW50IGFzIGJyb2tlbiBhbmQgcmVtb3ZlcyBocmVmIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3QXR0cnMgVGhlIG5ldyBhdHRyaWJ1dGVzLgotICAgICAqIEBwYXJhbSBhdHRyTmFtZSBUaGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICogQHBhcmFtIGJyb2tlblVybCBUaGUgYnJva2VuIGxpbmsgVVJJLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1hcmtCcm9rZW5MaW5rKEF0dHJpYnV0ZXNJbXBsIG5ld0F0dHJzLCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBicm9rZW5VcmwpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuZXdBdHRycy5nZXRJbmRleChCUk9LRU5fQVRUUklCKSA+IC0xKQotICAgICAgICAgICAgbmV3QXR0cnMucmVtb3ZlQXR0cmlidXRlKG5ld0F0dHJzLmdldEluZGV4KEJST0tFTl9BVFRSSUIpKTsKLSAgICAgICAgaWYgKG5ld0F0dHJzLmdldEluZGV4KCJ0aXRsZSIpID4gLTEpCi0gICAgICAgICAgICBuZXdBdHRycy5yZW1vdmVBdHRyaWJ1dGUobmV3QXR0cnMuZ2V0SW5kZXgoInRpdGxlIikpOwotICAgICAgICBpZiAobmV3QXR0cnMuZ2V0SW5kZXgoYXR0ck5hbWUpID4gLTEpCi0gICAgICAgICAgICBuZXdBdHRycy5zZXRBdHRyaWJ1dGUobmV3QXR0cnMuZ2V0SW5kZXgoYXR0ck5hbWUpLCAiIiwgYXR0ck5hbWUsIGF0dHJOYW1lLCAiQ0RBVEEiLCAiIik7Ci0gICAgICAgIFN0cmluZyB3YXJuaW5nID0gIkJyb2tlbiBMaW5rOiAiICsgYnJva2VuVXJsOwotICAgICAgICBuZXdBdHRycy5hZGRBdHRyaWJ1dGUoIiIsICJ0aXRsZSIsICJ0aXRsZSIsICJDREFUQSIsIHdhcm5pbmcpOwotICAgICAgICBuZXdBdHRycy5hZGRBdHRyaWJ1dGUoIiIsIEJST0tFTl9BVFRSSUIsIEJST0tFTl9BVFRSSUIsICJDREFUQSIsIEJST0tFTl9WQUxVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV3cml0ZXMgYSBsaW5rLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdBdHRycyBUaGUgbmV3IGF0dHJpYnV0ZXMuCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZXdyaXRlLgotICAgICAqIEBwYXJhbSB0YXJnZXREb2N1bWVudCBUaGUgdGFyZ2V0IGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBhbmNob3IgVGhlIGFuY2hvciAodGhlIHN0cmluZyBhZnRlciB0aGUgIyBjaGFyYWN0ZXIgaW4gdGhlIFVSTCkuCi0gICAgICogQHBhcmFtIHF1ZXJ5U3RyaW5nIFRoZSBxdWVyeSBzdHJpbmcgd2l0aG91dCBxdWVzdGlvbiBtYXJrLgotICAgICAqIEBwYXJhbSBleHRlbnNpb24gVGhlIGV4dGVuc2lvbiB0byB1c2UuCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmV3cml0ZUxpbmsoQXR0cmlidXRlc0ltcGwgbmV3QXR0cnMsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgRG9jdW1lbnQgdGFyZ2V0RG9jdW1lbnQsIFN0cmluZyBhbmNob3IsIFN0cmluZyBxdWVyeVN0cmluZywgU3RyaW5nIGV4dGVuc2lvbikKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgd2ViYXBwVXJsID0gdGFyZ2V0RG9jdW1lbnQuZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCk7Ci0KLSAgICAgICAgaW50IGxhc3REb3RJbmRleCA9IHdlYmFwcFVybC5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICBpZiAobGFzdERvdEluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIHdlYmFwcFVybCA9IHdlYmFwcFVybC5zdWJzdHJpbmcoMCwgbGFzdERvdEluZGV4KSArIGV4dGVuc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgd2ViYXBwVXJsICs9ICIjIiArIGFuY2hvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChxdWVyeVN0cmluZyAhPSBudWxsICYmIHF1ZXJ5U3RyaW5nLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgd2ViYXBwVXJsICs9ICI/IiArIHF1ZXJ5U3RyaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKHRoaXMuaW5kZW50ICsgIlJld3JpdGluZyBVUkwgdG86IFsiICsgd2ViYXBwVXJsICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEF0dHJpYnV0ZShuZXdBdHRycywgYXR0cmlidXRlTmFtZSwgd2ViYXBwVXJsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaHJlZiBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZXMuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBjb250YWluZWQgaW4gdGhpcyBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEF0dHJpYnV0ZShBdHRyaWJ1dGVzSW1wbCBhdHRyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGludCBwb3NpdGlvbiA9IGF0dHIuZ2V0SW5kZXgobmFtZSk7Ci0gICAgICAgIGlmIChwb3NpdGlvbiA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBhdmFpbGFibGUhIik7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0ci5zZXRWYWx1ZShwb3NpdGlvbiwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGUjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgaWYgKHRoaXMubGlua1Jlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHRoaXMubGlua1Jlc29sdmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnBvb2wuUmVjeWNsYWJsZSNyZWN5Y2xlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgewotICAgICAgICB0aGlzLmlnbm9yZUxpbmtFbGVtZW50ID0gZmFsc2U7Ci0gICAgICAgIHRoaXMuY3VycmVudFVybCA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpbmtSZXdyaXRlciBnZXRMaW5rUmV3cml0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9Db250ZW50TGlua01hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0NvbnRlbnRMaW5rTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWJmM2M0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0NvbnRlbnRMaW5rTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aEFQSTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotLyoqCi0gKiBCYXNpYyBsaW5rIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc2VhcmNoZXMgZm9yIGxpbmtzIGJ5IHBhcnNpbmcgdGhlCi0gKiBkb2N1bWVudCBjb250ZW50LiBGb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHVzZSBhbiBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBiYXNlZAotICogb24gbWV0YSBkYXRhIG9yIGEgY2VudHJhbGl6ZWQgbGluayByZWdpc3RyeS4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRMaW5rTWFuYWdlciBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIExpbmtNYW5hZ2VyLCBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHB1YmxpYyBMaW5rW10gZ2V0TGlua3NGcm9tKERvY3VtZW50IHNvdXJjZSkgewotCi0gICAgICAgIFNldCBsaW5rcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHhQYXRocyA9IHNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKS5nZXRMaW5rQXR0cmlidXRlWFBhdGhzKCk7Ci0gICAgICAgICAgICBpZiAoeFBhdGhzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCB4bWwgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoc291cmNlLmdldElucHV0U3RyZWFtKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHhtbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgZG9jdW1lbnQgWyIgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGRvZXNuJ3QgY29udGFpbiBhbnkgWE1MIGNvbnRlbnQuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4UGF0aHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTm9kZUl0ZXJhdG9yIGl0ZXIgPSBYUGF0aEFQSS5zZWxlY3ROb2RlSXRlcmF0b3IoeG1sLCB4UGF0aHNbaV0pOwotICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobm9kZSA9IGl0ZXIubmV4dE5vZGUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIG5vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTGlua1VyaSh1cmkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3MuYWRkKG5ldyBMaW5rKHVyaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoTGlua1tdKSBsaW5rcy50b0FycmF5KG5ldyBMaW5rW2xpbmtzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGlua1VyaShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHJldHVybiB1cmkuc3RhcnRzV2l0aChMaW5rUmVzb2x2ZXIuU0NIRU1FICsgIjoiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRbXSBnZXRSZWZlcmVuY2luZ0RvY3VtZW50cyhEb2N1bWVudCB0YXJnZXQpIHsKLQotICAgICAgICBEb2N1bWVudFtdIGFsbERvY3MgPSB0YXJnZXQuYXJlYSgpLmdldERvY3VtZW50cygpOwotICAgICAgICBTZXQgZG9jcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgTGlua1Jlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKExpbmtSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChMaW5rUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IGFsbERvY3MubGVuZ3RoOyBkKyspIHsKLQotICAgICAgICAgICAgICAgIExpbmtbXSBsaW5rcyA9IGdldExpbmtzRnJvbShhbGxEb2NzW2RdKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGxpbmtzLmxlbmd0aDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpbmtUYXJnZXQgbGlua1RhcmdldCA9IHJlc29sdmVyLnJlc29sdmUoYWxsRG9jc1tkXSwgbGlua3NbbF0uZ2V0VXJpKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGlua1RhcmdldC5leGlzdHMoKSAmJiBsaW5rVGFyZ2V0LmdldERvY3VtZW50KCkuZXF1YWxzKHRhcmdldCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvY3MuYWRkKGFsbERvY3NbZF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKERvY3VtZW50W10pIGRvY3MudG9BcnJheShuZXcgRG9jdW1lbnRbZG9jcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0dsb2JhbFByb3hpZXMuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0dsb2JhbFByb3hpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQzZmNmNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9HbG9iYWxQcm94aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlByb3h5OwotCi0vKioKLSAqIFNlcnZpY2UgdG8gbWFuYWdlIHRoZSB3ZWItYXBwbGljYXRpb24td2lkZSBwcm94eSBzZXR0aW5ncy4KLSAqLwotcHVibGljIGludGVyZmFjZSBHbG9iYWxQcm94aWVzIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSByb2xlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gR2xvYmFsUHJveGllcy5jbGFzcy5nZXROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNzbCBJZiBTU0wgaXMgdXNlZC4KLSAgICAgKiBAcmV0dXJuIEEgcHJveHkuCi0gICAgICovCi0gICAgUHJveHkgZ2V0UHJveHkoYm9vbGVhbiBzc2wpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9JbmNvbWluZ0xpbmtSZXdyaXRlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvSW5jb21pbmdMaW5rUmV3cml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhNmViNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9JbmNvbWluZ0xpbmtSZXdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Qcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLQotLyoqCi0gKiA8cD4KLSAqIENvbnZlcnRzIGJyb3dzZXItYmFzZWQgbGlua3MgdG8gd2ViIGFwcGxpY2F0aW9uIGxpbmtzIGJ5IHVzaW5nIHRoZQotICogcHVibGljYXRpb24ncyBwcm94eSBzZXR0aW5ncy4KLSAqIDwvcD4KLSAqIDxwPgotICogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFyZSBub3QgdGhyZWFkLXNhZmUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbmNvbWluZ0xpbmtSZXdyaXRlciBpbXBsZW1lbnRzIExpbmtSZXdyaXRlciB7Ci0KLSAgICBwcml2YXRlIFB1YmxpY2F0aW9uIHB1YjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwdWIgVGhlIGN1cnJlbnQgcHVibGljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEluY29taW5nTGlua1Jld3JpdGVyKFB1YmxpY2F0aW9uIHB1YikgewotICAgICAgICB0aGlzLnB1YiA9IHB1YjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyB1cmwpIHsKLSAgICAgICAgcmV0dXJuIGdldE1hdGNoaW5nUHJveHlDb25maWd1cmF0aW9uKHVybCkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJveHlDb25maWd1cmF0aW9uIGdldE1hdGNoaW5nUHJveHlDb25maWd1cmF0aW9uKFN0cmluZyB1cmwpIHsKLSAgICAgICAgUHJveHlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0gICAgICAgIFN0cmluZ1tdIGFyZWFzID0gdGhpcy5wdWIuZ2V0QXJlYU5hbWVzKCk7Ci0gICAgICAgIEJvb2xlYW5bXSBzc2xWYWx1ZXMgPSB7IEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSB9OwotICAgICAgICBmb3IgKGludCBhID0gMDsgYSA8IGFyZWFzLmxlbmd0aDsgYSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBzID0gMDsgcyA8IHNzbFZhbHVlcy5sZW5ndGg7IHMrKykgewotICAgICAgICAgICAgICAgIFByb3h5IHByb3h5ID0gdGhpcy5wdWIuZ2V0UHJveHkoYXJlYXNbYV0sIHNzbFZhbHVlc1tzXS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsICYmIHVybC5zdGFydHNXaXRoKHByb3h5LmdldFVybCgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBuZXcgUHJveHlDb25maWd1cmF0aW9uKGFyZWFzW2FdLCBzc2xWYWx1ZXNbc10uYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV3cml0ZShTdHJpbmcgdXJsKSB7Ci0gICAgICAgIFByb3h5Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRNYXRjaGluZ1Byb3h5Q29uZmlndXJhdGlvbih1cmwpOwotICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBtYXRjaGluZyBwcm94eSBjb25maWcgZm9yIFVSTCBbIiArIHVybCArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgUHJveHkgcHJveHkgPSB0aGlzLnB1Yi5nZXRQcm94eShjb25maWcuYXJlYSwgY29uZmlnLnNzbCk7Ci0gICAgICAgIFN0cmluZyBzdWZmaXggPSB1cmwuc3Vic3RyaW5nKHByb3h5LmdldFVybCgpLmxlbmd0aCgpKTsKLSAgICAgICAgcmV0dXJuICIvIiArIHRoaXMucHViLmdldElkKCkgKyAiLyIgKyBjb25maWcuYXJlYSArIHN1ZmZpeDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByb3h5Q29uZmlndXJhdGlvbiB7Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgYXJlYTsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3NsOwotICAgICAgICBwcm90ZWN0ZWQgUHJveHlDb25maWd1cmF0aW9uKFN0cmluZyBhcmVhLCBib29sZWFuIHNzbCkgewotICAgICAgICAgICAgdGhpcy5hcmVhID0gYXJlYTsKLSAgICAgICAgICAgIHRoaXMuc3NsID0gc3NsOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYmE5ZjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuUXVlcnk7Ci0KLS8qKgotICogQSBsaW5rIHRvIGEgZG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBSVJfREVMSU1JVEVSID0gIiwiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxVRV9ERUxJTUlURVIgPSAiPSI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB1dWlkOwotICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlOwotICAgIHByaXZhdGUgU3RyaW5nIHJldmlzaW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGFyZWE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHViSWQ7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGluaygpIHsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbGlua1VyaSBUaGUgbGluayBVUkkuCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIFVSSSBkb2Vzbid0IHJlcHJlc2VudCBhIGxpbmsuCi0gICAgICovCi0gICAgcHVibGljIExpbmsoU3RyaW5nIGxpbmtVcmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgaWYgKCFsaW5rVXJpLnN0YXJ0c1dpdGgoTGlua1Jlc29sdmVyLlNDSEVNRSArICI6IikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIlRoZSBzdHJpbmcgWyIgKyBsaW5rVXJpICsgIl0gaXMgbm90IGEgdmFsaWQgbGluayBVUkkhIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzY2hlbWVBbmRQYXRoID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5rVXJpLCAiOiIpOwotICAgICAgICBzY2hlbWVBbmRQYXRoLm5leHRUb2tlbigpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IHNjaGVtZUFuZFBhdGgubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgaWYgKHBhdGguaW5kZXhPZihQQUlSX0RFTElNSVRFUikgPiAtMSkgewotICAgICAgICAgICAgaW50IGZpcnN0RGVsaW1pdGVySW5kZXggPSBwYXRoLmluZGV4T2YoUEFJUl9ERUxJTUlURVIpOwotICAgICAgICAgICAgdGhpcy51dWlkID0gcGF0aC5zdWJzdHJpbmcoMCwgZmlyc3REZWxpbWl0ZXJJbmRleCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aFF1ZXJ5U3RyaW5nID0gcGF0aC5zdWJzdHJpbmcoZmlyc3REZWxpbWl0ZXJJbmRleCArIDEpOwotICAgICAgICAgICAgUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkocGF0aFF1ZXJ5U3RyaW5nLCBQQUlSX0RFTElNSVRFUiwgS0VZX1ZBTFVFX0RFTElNSVRFUik7Ci0gICAgICAgICAgICB0aGlzLnB1YklkID0gcXVlcnkuZ2V0VmFsdWUoInB1YiIpOwotICAgICAgICAgICAgdGhpcy5hcmVhID0gcXVlcnkuZ2V0VmFsdWUoImFyZWEiKTsKLSAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBxdWVyeS5nZXRWYWx1ZSgibGFuZyIpOwotICAgICAgICAgICAgdGhpcy5yZXZpc2lvbiA9IHF1ZXJ5LmdldFZhbHVlKCJyZXYiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMudXVpZCA9IHBhdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgYXJlYS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFyZWEoKSB7Ci0gICAgICAgIHJldHVybiBhcmVhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFyZWEoU3RyaW5nIGFyZWEpIHsKLSAgICAgICAgdGhpcy5hcmVhID0gYXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBsYW5ndWFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotICAgICAgICByZXR1cm4gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHViSWQoKSB7Ci0gICAgICAgIHJldHVybiBwdWJJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHViSWQgVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFB1YklkKFN0cmluZyBwdWJJZCkgewotICAgICAgICB0aGlzLnB1YklkID0gcHViSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcmV2aXNpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXZpc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHJldmlzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXZpc2lvbiBUaGUgcmV2aXNpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmV2aXNpb24oU3RyaW5nIHJldmlzaW9uKSB7Ci0gICAgICAgIHRoaXMucmV2aXNpb24gPSByZXZpc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBVVUlELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXVpZCgpIHsKLSAgICAgICAgcmV0dXJuIHV1aWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHV1aWQgVGhlIFVVSUQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXVpZChTdHJpbmcgdXVpZCkgewotICAgICAgICB0aGlzLnV1aWQgPSB1dWlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxpbmsgVVJJLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotICAgICAgICBTdHJpbmcgdXJpID0gTGlua1Jlc29sdmVyLlNDSEVNRSArICI6IjsKLSAgICAgICAgaWYgKHRoaXMudXVpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cmkgPSB1cmkgKyB0aGlzLnV1aWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMubGFuZ3VhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdXJpID0gdXJpICsgIixsYW5nPSIgKyB0aGlzLmxhbmd1YWdlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmFyZWEgIT0gbnVsbCkgewotICAgICAgICAgICAgdXJpID0gdXJpICsgIixhcmVhPSIgKyB0aGlzLmFyZWE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMucHViSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdXJpID0gdXJpICsgIixwdWI9IiArIHRoaXMucHViSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMucmV2aXNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdXJpID0gdXJpICsgIixyZXY9IiArIHRoaXMucmV2aXNpb247Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIWdldENsYXNzKCkuaXNJbnN0YW5jZShvYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoTGluaykgb2JqKS5nZXRVcmkoKS5lcXVhbHMoZ2V0VXJpKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRVcmkoKS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRVcmkoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rQ29udmVydGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmE3OTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMuY29udGV4dC5Db250ZXh0VXRpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhBUEk7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gY29udmVydCA8Y29kZT5sZW55YS1kb2N1bWVudDo8L2NvZGU+IGxpbmtzIGZyb20gYW5kIHRvIFVSTAotICogbGlua3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rQ29udmVydGVyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIHsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaW5rIGNvbnZlcnRlci4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlua0NvbnZlcnRlcihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFsbCBVUkwtYmFzZWQgbGlua3MgdG8gVVVJRC1iYXNlZCBsaW5rcy4KLSAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byBjb252ZXJ0LgotICAgICAqIEBwYXJhbSB1c2VDb250ZXh0UGF0aCBJZiB0aGUgcmVxdWVzdCdzIGNvbnRleHQgcGF0aCBzaG91bGQgYmUgY29uc2lkZXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb252ZXJ0VXJsc1RvVXVpZHMoRG9jdW1lbnQgZG9jLCBib29sZWFuIHVzZUNvbnRleHRQYXRoKSB7Ci0gICAgICAgIGNvbnZlcnRVcmxzVG9VdWlkcyhkb2MuZ2V0UHVibGljYXRpb24oKSwgZG9jLCB1c2VDb250ZXh0UGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYWxsIFVSTC1iYXNlZCBsaW5rcyB0byBVVUlELWJhc2VkIGxpbmtzLiBUaGUgbGluayBVUkxzIGNhbgotICAgICAqIG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBzcmNQdWIgVGhlIHB1YmxpY2F0aW9uIHdoZXJlIHRoZSBjb250ZW50IGNvbWVzIGZyb20uCi0gICAgICogQHBhcmFtIGV4YW1pbmVkRG9jdW1lbnQgVGhlIGRvY3VtZW50IGluIHRoZSB0YXJnZXQgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIHVzZUNvbnRleHRQYXRoIElmIHRoZSByZXF1ZXN0J3MgY29udGV4dCBwYXRoIHNob3VsZCBiZSBjb25zaWRlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnZlcnRVcmxzVG9VdWlkcyhQdWJsaWNhdGlvbiBzcmNQdWIsIERvY3VtZW50IGV4YW1pbmVkRG9jdW1lbnQsCi0gICAgICAgICAgICBib29sZWFuIHVzZUNvbnRleHRQYXRoKSB7Ci0gICAgICAgIGJvb2xlYW4gbGlua3NSZXdyaXR0ZW4gPSBmYWxzZTsKLSAgICAgICAgTGlua1Jlc29sdmVyIGxpbmtSZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgIGlmICh1c2VDb250ZXh0UGF0aCkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IGdldENvbnRleHRQYXRoKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFJlc291cmNlVHlwZSB0eXBlID0gZXhhbWluZWREb2N1bWVudC5nZXRSZXNvdXJjZVR5cGUoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHhQYXRocyA9IHR5cGUuZ2V0TGlua0F0dHJpYnV0ZVhQYXRocygpOwotCi0gICAgICAgICAgICBpZiAoeFBhdGhzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnZlcnQgbGlua3M6IE5vIFhQYXRocyBmb3IgcmVzb3VyY2UgdHlwZSBbIiArIHR5cGUuZ2V0TmFtZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxpbmtSZXNvbHZlciA9IChMaW5rUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoTGlua1Jlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZXhhbWluZWREb2N1bWVudC5nZXRGYWN0b3J5KCk7Ci0KLSAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCB4bWxEb2N1bWVudCA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudChleGFtaW5lZERvY3VtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCB4UGF0aEluZGV4ID0gMDsgeFBhdGhJbmRleCA8IHhQYXRocy5sZW5ndGg7IHhQYXRoSW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlYnVnKCJDb252ZXJ0IGxpbmtzOiBDaGVjayBYUGF0aCBbIiArIHhQYXRoc1t4UGF0aEluZGV4XSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBYUGF0aEFQSS5zZWxlY3ROb2RlTGlzdCh4bWxEb2N1bWVudCwgeFBhdGhzW3hQYXRoSW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IG5vZGVJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5vZGVJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIFhQYXRoIFsiICsgeFBhdGhzW3hQYXRoSW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIG1heSBvbmx5IG1hdGNoIGF0dHJpYnV0ZSBub2RlcyEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIgYXR0cmlidXRlID0gKEF0dHIpIG5vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJsID0gYXR0cmlidXRlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJDb252ZXJ0IGxpbmtzOiBDaGVjayBVUkwgWyIgKyB1cmwgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgocHJlZml4ICsgIi8iICsgc3JjUHViLmdldElkKCkgKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleGFtaW5lZERvY3VtZW50LmdldEFyZWEoKSArICIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UHViSWQgPSBleGFtaW5lZERvY3VtZW50LmdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2ViYXBwVXJsID0gIi8iICsgdGFyZ2V0UHViSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdXJsLnN1YnN0cmluZygocHJlZml4ICsgIi8iICsgc3JjUHViLmdldElkKCkpLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeS5pc0RvY3VtZW50KHdlYmFwcFVybCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgdGFyZ2V0RG9jdW1lbnQgPSBmYWN0b3J5LmdldEZyb21VUkwod2ViYXBwVXJsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb252ZXJ0IGxpbmtzOiBDaGVjayB3ZWJhcHAgVVJMIFsiICsgd2ViYXBwVXJsICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgbGluayA9IG5ldyBMaW5rKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuc2V0VXVpZCh0YXJnZXREb2N1bWVudC5nZXRVVUlEKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuc2V0VmFsdWUobGluay5nZXRVcmkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzUmV3cml0dGVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobGlua3NSZXdyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRIZWxwZXIud3JpdGVEb2N1bWVudCh4bWxEb2N1bWVudCwgZXhhbWluZWREb2N1bWVudC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHJld3JpdGluZyBkb2N1bWVudDogWyIgKyBleGFtaW5lZERvY3VtZW50ICsgIl0iLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsaW5rUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGxpbmtSZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJlZml4OwotICAgICAgICBDb250ZXh0VXRpbGl0eSBjdHhVdGlsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGN0eFV0aWwgPSAoQ29udGV4dFV0aWxpdHkpIHRoaXMubWFuYWdlci5sb29rdXAoQ29udGV4dFV0aWxpdHkuUk9MRSk7Ci0gICAgICAgICAgICBwcmVmaXggPSBjdHhVdGlsLmdldFJlcXVlc3QoKS5nZXRDb250ZXh0UGF0aCgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGN0eFV0aWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGN0eFV0aWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ODRjNDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmc7Ci0KLS8qKgotICogTGluayBleGNlcHRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMzA0ODc0NjIyNDk1MDc5OTcwTDsKLQotICAgIHB1YmxpYyBMaW5rRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5rRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotICAgICAgICBzdXBlcihhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlua0V4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlua0V4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua01hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0xpbmtNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Y2I3MDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci0KLS8qKgotICogTGluayBtYW5hZ2VyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpbmtNYW5hZ2VyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgQXZhbG9uIHNlcnZpY2Ugcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IExpbmtNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGxpbmtzIGZyb20gYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGxpbmtzLgotICAgICAqLwotICAgIExpbmtbXSBnZXRMaW5rc0Zyb20oRG9jdW1lbnQgc291cmNlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGRvY3VtZW50cyB3aGljaCByZWZlcmVuY2UgYSBjZXJ0YWluIGRvY3VtZW50LiBUaGlzIGRlcGVuZHMgb24KLSAgICAgKiB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSB0cmFuc2xhdGlvbnMgb2YgdGhlIHRhcmdldCBkb2N1bWVudCBhbmQgdGhlIGxpbmsKLSAgICAgKiByZXNvbHZlciBmYWxsYmFjayBtb2RlLgotICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGRvY3VtZW50cy4KLSAgICAgKi8KLSAgICBEb2N1bWVudFtdIGdldFJlZmVyZW5jaW5nRG9jdW1lbnRzKERvY3VtZW50IHRhcmdldCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0xpbmtSZXNvbHZlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua1Jlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNmQyZjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua1Jlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmc7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci0KLS8qKgotICogPHA+Ci0gKiBSZXNvbHZlIGEgbGluayBmcm9tIGEgZG9jdW1lbnQgdG8gYW5vdGhlciBkb2N1bWVudCB1c2luZyBpdCdzCi0gKiA8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+cHVibGljYXRpb24gSUQ8L2xpPgotICogPGxpPmFyZWE8L2xpPgotICogPGxpPlVVSUQ8L2xpPgotICogPGxpPmxhbmd1YWdlPC9saT4KLSAqIDxsaT5yZXZpc2lvbiBudW1iZXI8L2xpPgotICogPC91bD4KLSAqIDxwPgotICogQWxsIG9mIHRoZXNlIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsIGFuZCBkZWZhdWx0IHRvIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQotICogZG9jdW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGxpbmsuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN5bnRheCAoc3F1YXJlIGJyYWNrZXRzIGRlbm90ZSBvcHRpb25hbCBwYXJ0cyk6Ci0gKiA8L3A+Ci0gKiA8Y29kZT5sZW55YS1kb2N1bWVudDombHQ7dXVpZCZndDtbLGxhbmc9Li4uXVssYXJlYT0uLi5dWyxyZXY9Li4uXVsscHViPS4uLl08L2NvZGU+Ci0gKiA8cD4KLSAqIFRoZSBmYWxsYmFjayBtb2RlIGRldGVybWluZXMgdGhlIGJlaGF2aW91ciBpZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGlzIG9taXR0ZWQKLSAqIGFuZCB0aGUgdGFyZ2V0IGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGxhbmd1YWdlIG9mIHRoZSBzb3VyY2UgZG9jdW1lbnQuCi0gKiBUaGUgZGVmYXVsdCBmYWxsYmFjayBtb2RlIGlzIHtAbGluayAjTU9ERV9ERUZBVUxUX0xBTkdVQUdFfS4KLSAqIDxwPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpbmtSZXNvbHZlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXZhbG9uIHJvbGUuCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBMaW5rUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBsaW5rIFVSSSBzY2hlbWUuCi0gICAgICovCi0gICAgU3RyaW5nIFNDSEVNRSA9ICJsZW55YS1kb2N1bWVudCI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFpbCBpZiB0aGUgdGFyZ2V0IGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHNvdXJjZSBsYW5ndWFnZS4KLSAgICAgKi8KLSAgICBpbnQgTU9ERV9GQUlMID0gMDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUcnkgdG8gZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGxhbmd1YWdlLgotICAgICAqLwotICAgIGludCBNT0RFX0RFRkFVTFRfTEFOR1VBR0UgPSAxOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmFsbGJhY2sgbW9kZS4KLSAgICAgKiBAcGFyYW0gbW9kZSBvbmUgb2Yge0BsaW5rICNNT0RFX0ZBSUx9IGFuZCB7QGxpbmsgI01PREVfREVGQVVMVF9MQU5HVUFHRX0uCi0gICAgICovCi0gICAgdm9pZCBzZXRGYWxsYmFja01vZGUoaW50IG1vZGUpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZmFsbGJhY2sgbW9kZS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RmFsbGJhY2tNb2RlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIGEgbGluay4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3VycmVudERvY3VtZW50IFRoZSBkb2N1bWVudCB3aGljaCBjb250YWlucyB0aGUgbGluay4KLSAgICAgKiBAcGFyYW0gbGlua1VyaSBUaGUgbGluayBVUkkuCi0gICAgICogQHJldHVybiBBIGxpbmsgdGFyZ2V0LgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIHRoZSBVUkkgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBMaW5rVGFyZ2V0IHJlc29sdmUoRG9jdW1lbnQgY3VycmVudERvY3VtZW50LCBTdHJpbmcgbGlua1VyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlc29sdmUgYSBsaW5rLiBUaGUgbGluayBVUkkgaGFzIHRvIGNvbnRhaW4gdGhlIFVVSUQsIGxhbmd1YWdlLCBhcmVhIGFuZCBwdWJsaWNhdGlvbiBJRC4KLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZG9jdW1lbnQgZmFjdG9yeSB0byB1c2UuCi0gICAgICogQHBhcmFtIGxpbmtVcmkgVGhlIGxpbmsgVVJJLgotICAgICAqIEByZXR1cm4gQSBsaW5rIHRhcmdldC4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiB0aGUgVVJJIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgTGlua1RhcmdldCByZXNvbHZlKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBTdHJpbmcgbGlua1VyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua1Jlc29sdmVySW1wbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua1Jlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGViNThjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0xpbmtSZXNvbHZlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZzsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBMaW5rIHJlc29sdmVyIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTGlua1Jlc29sdmVySW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIExpbmtSZXNvbHZlciwgQ29uZmlndXJhYmxlIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBBdmFsb24gcm9sZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFID0gTGlua1Jlc29sdmVySW1wbC5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICBwdWJsaWMgTGlua1RhcmdldCByZXNvbHZlKERvY3VtZW50IGN1cnJlbnREb2MsIFN0cmluZyBsaW5rVXJpKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayhsaW5rVXJpKTsKLQotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRWYWx1ZShsaW5rLmdldExhbmd1YWdlKCksIGN1cnJlbnREb2MuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIFN0cmluZyByZXZpc2lvblN0cmluZyA9IGdldFZhbHVlKGxpbmsuZ2V0UmV2aXNpb24oKSwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBhcmVhID0gZ2V0VmFsdWUobGluay5nZXRBcmVhKCksIGN1cnJlbnREb2MuZ2V0QXJlYSgpKTsKLSAgICAgICAgU3RyaW5nIHB1YklkID0gZ2V0VmFsdWUobGluay5nZXRQdWJJZCgpLCBjdXJyZW50RG9jLmdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdXVpZCA9IGdldFZhbHVlKGxpbmsuZ2V0VXVpZCgpLCBjdXJyZW50RG9jLmdldFVVSUQoKSk7Ci0gICAgICAgIGlmICh1dWlkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHV1aWQgPSBjdXJyZW50RG9jLmdldFVVSUQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc29sdmUoY3VycmVudERvYy5nZXRGYWN0b3J5KCksIHB1YklkLCBhcmVhLCB1dWlkLCBsYW5ndWFnZSwgcmV2aXNpb25TdHJpbmcpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZmFsbGJhY2tNb2RlID0gTU9ERV9ERUZBVUxUX0xBTkdVQUdFOwotCi0gICAgcHVibGljIGludCBnZXRGYWxsYmFja01vZGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWxsYmFja01vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgdGhpcy5mYWxsYmFja01vZGUgPSBtb2RlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRkFMTEJBQ0sgPSAiZmFsbGJhY2siOwotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gZmFsbGJhY2tDb25maWcgPSBjb25maWcuZ2V0Q2hpbGQoRUxFTUVOVF9GQUxMQkFDSywgZmFsc2UpOwotICAgICAgICBpZiAoZmFsbGJhY2tDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBmYWxsYmFjayA9IGNvbmZpZy5nZXRWYWx1ZUFzQm9vbGVhbigpOwotICAgICAgICAgICAgaWYgKGZhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgc2V0RmFsbGJhY2tNb2RlKE1PREVfREVGQVVMVF9MQU5HVUFHRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldEZhbGxiYWNrTW9kZShNT0RFX0ZBSUwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpbmtUYXJnZXQgcmVzb2x2ZShEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGxpbmtVcmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCi0gICAgICAgIExpbmsgbGluayA9IG5ldyBMaW5rKGxpbmtVcmkpOwotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBsaW5rLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJsYW5ndWFnZSIsIGxhbmd1YWdlKTsKLSAgICAgICAgU3RyaW5nIHV1aWQgPSBsaW5rLmdldFV1aWQoKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInV1aWQiLCB1dWlkKTsKLSAgICAgICAgU3RyaW5nIGFyZWEgPSBsaW5rLmdldEFyZWEoKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImFyZWEiLCBhcmVhKTsKLSAgICAgICAgU3RyaW5nIHB1YklkID0gbGluay5nZXRQdWJJZCgpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgicHVibGljYXRpb24gSUQiLCBwdWJJZCk7Ci0KLSAgICAgICAgU3RyaW5nIHJldmlzaW9uU3RyaW5nID0gZ2V0VmFsdWUobGluay5nZXRSZXZpc2lvbigpLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXNvbHZlKGZhY3RvcnksIHB1YklkLCBhcmVhLCB1dWlkLCBsYW5ndWFnZSwgcmV2aXNpb25TdHJpbmcpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaW5rVGFyZ2V0IHJlc29sdmUoRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBwdWJJZCwgU3RyaW5nIGFyZWEsIFN0cmluZyB1dWlkLAotICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgcmV2aXNpb25TdHJpbmcpIHsKLSAgICAgICAgaW50IHJldmlzaW9uOwotICAgICAgICBpZiAocmV2aXNpb25TdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV2aXNpb24gPSAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldmlzaW9uID0gSW50ZWdlci52YWx1ZU9mKHJldmlzaW9uU3RyaW5nKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24ocHViSWQpOwotICAgICAgICAgICAgQXJlYSBhcmVhT2JqID0gcHViLmdldEFyZWEoYXJlYSk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2M7Ci0gICAgICAgICAgICBpZiAoYXJlYU9iai5jb250YWlucyh1dWlkLCBsYW5ndWFnZSkpIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBhcmVhT2JqLmdldERvY3VtZW50KHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmFsbGJhY2tNb2RlID09IE1PREVfRkFJTCkgewotICAgICAgICAgICAgICAgICAgICBkb2MgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5mYWxsYmFja01vZGUgPT0gTU9ERV9ERUZBVUxUX0xBTkdVQUdFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmVhT2JqLmNvbnRhaW5zKHV1aWQsIHB1Yi5nZXREZWZhdWx0TGFuZ3VhZ2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvYyA9IGZhY3RvcnkuZ2V0KHB1YiwgYXJlYSwgdXVpZCwgcHViLmdldERlZmF1bHRMYW5ndWFnZSgpLCByZXZpc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb2MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBmYWxsYmFjayBtb2RlIFsiICsgdGhpcy5mYWxsYmFja01vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGlzIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRvYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXZpc2lvbiA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlua1RhcmdldChkb2MsIHJldmlzaW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtUYXJnZXQoZG9jKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rUmV3cml0ZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0xpbmtSZXdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDgyNTdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0xpbmtSZXdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmc7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBzZXJ2aWNlcyB3aGljaCBjb252ZXJ0IGxpbmtzIGZyb20gb25lIGZvcm0gdG8gYW5vdGhlci4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaW5rUmV3cml0ZXIgewotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTC4KLSAgICAgKiBAcmV0dXJuIElmIHRoaXMgcmV3cml0ZXIgZmVlbHMgcmVzcG9uc2libGUgZm9yIHRoZSBVUkwuCi0gICAgICovCi0gICAgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyB1cmwpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmwgVGhlIG9yaWdpbmFsIFVSTC4KLSAgICAgKiBAcmV0dXJuIFRoZSByZXdyaXR0ZW4gVVJMLgotICAgICAqLwotICAgIFN0cmluZyByZXdyaXRlKFN0cmluZyB1cmwpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rVGFyZ2V0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2NjNzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvTGlua1RhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIFRoZSB0YXJnZXQgb2YgYSBsaW5rLgotICovCi1wdWJsaWMgY2xhc3MgTGlua1RhcmdldCB7Ci0KLSAgICBwcml2YXRlIERvY3VtZW50IGRvYzsKLSAgICBwcml2YXRlIGludCByZXZpc2lvbk51bWJlciA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gcmV2aXNpb25OdW1iZXIgVGhlIHJldmlzaW9uIG51bWJlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlua1RhcmdldChEb2N1bWVudCBkb2MsIGludCByZXZpc2lvbk51bWJlcikgewotICAgICAgICB0aGlzKGRvYyk7Ci0gICAgICAgIHRoaXMucmV2aXNpb25OdW1iZXIgPSByZXZpc2lvbk51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaW5rVGFyZ2V0KERvY3VtZW50IGRvYykgewotICAgICAgICBBc3NlcnQubm90TnVsbCgiZG9jdW1lbnQiLCBkb2MpOwotICAgICAgICB0aGlzLmRvYyA9IGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yIGZvciBub24tZXhpc3RpbmcgdGFyZ2V0cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlua1RhcmdldCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBsaW5rZWQgZG9jdW1lbnQuCi0gICAgICogQHRocm93cyBMaW5rRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBleGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB0aHJvd3MgTGlua0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBMaW5rRXhjZXB0aW9uKCJUaGUgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJldmlzaW9uIG51bWJlci4KLSAgICAgKiBAdGhyb3dzIExpbmtFeGNlcHRpb24gaWYgdGhlIHRhcmdldCBkb2Vzbid0IGV4aXN0IG9yIG5vIHJldmlzaW9uIG51bWJlcgotICAgICAqICAgICAgICAgaXMgc3BlY2lmaWVkIGluIHRoZSBsaW5rLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UmV2aXNpb25OdW1iZXIoKSB0aHJvd3MgTGlua0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBMaW5rRXhjZXB0aW9uKCJUaGUgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMucmV2aXNpb25OdW1iZXIgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBMaW5rRXhjZXB0aW9uKCJObyByZXZpc2lvbiBzcGVjaWZpZWQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmV2aXNpb25OdW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiB0aGUgcmV2aXNpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBsaW5rLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmV2aXNpb25TcGVjaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJldmlzaW9uTnVtYmVyICE9IC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgdGhlIHRhcmdldCBleGlzdHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb2MgIT0gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL091dGdvaW5nTGlua1Jld3JpdGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9PdXRnb2luZ0xpbmtSZXdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA0MWYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL091dGdvaW5nTGlua1Jld3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmc7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlclJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjcmVkaXRhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Qcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5VUkxJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBDb252ZXJ0cyB3ZWIgYXBwbGljYXRpb24gbGlua3MgdG8gbGlua3Mgd2hpY2ggd2lsbCBiZSBzZW50IHRvIHRoZSBicm93c2VyIGJ5IHVzaW5nIHRoZQotICogcHVibGljYXRpb24ncyBwcm94eSBzZXR0aW5ncy4gSWYgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBTU0wtZW5jcnlwdGVkLCBhbGwgbGluayBVUkxzIHdpbGwgdXNlIHRoZQotICogU1NMIHByb3h5LgotICogPC9wPgotICogPHA+Ci0gKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXJlIG5vdCB0aHJlYWQtc2FmZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE91dGdvaW5nTGlua1Jld3JpdGVyIGV4dGVuZHMgU2VydmxldExpbmtSZXdyaXRlciB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVsYXRpdmVVcmxzOwotICAgIHByaXZhdGUgUG9saWN5TWFuYWdlciBwb2xpY3lNYW5hZ2VyOwotICAgIHByaXZhdGUgQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyOwotICAgIHByaXZhdGUgRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNzbDsKLSAgICBwcml2YXRlIEdsb2JhbFByb3hpZXMgZ2xvYmFsUHJveGllczsKLSAgICBwcml2YXRlIGJvb2xlYW4gY29uc2lkZXJTc2xQb2xpY2llczsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIgdG8gdXNlLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHBhcmFtIHJlcXVlc3RVcmwgVGhlIHJlcXVlc3QgVVJMIHdoZXJlIHRoZSBsaW5rcyBzaG91bGQgYmUgcmV3cml0dGVuLgotICAgICAqIEBwYXJhbSBzc2wgSWYgdGhlIGN1cnJlbnQgcGFnZSBpcyBTU0wtZW5jcnlwdGVkLgotICAgICAqIEBwYXJhbSBjb25zaWRlclNzbFBvbGljaWVzIElmIHRoZSBTU0wgcHJvdGVjdGlvbiBvZiBwb2xpY2llcyBzaG91bGQgYmUgY29uc2lkZXJlZCB3aGVuCi0gICAgICogICAgICAgIHJlc29sdmluZyB0aGUgY29ycmVzcG9uZGluZyBwcm94eS4gU2V0dGluZyB0aGlzIHRvIDxjb2RlPnRydWU8L2NvZGU+IGxlYWRzIHRvIGEKLSAgICAgKiAgICAgICAgc3Vic3RhbnRpYWwgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuCi0gICAgICogQHBhcmFtIHJlbGF0aXZlVXJscyBJZiByZWxhdGl2ZSBVUkxzIHNob3VsZCBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBPdXRnb2luZ0xpbmtSZXdyaXRlcihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyByZXF1ZXN0VXJsLAotICAgICAgICAgICAgYm9vbGVhbiBzc2wsIGJvb2xlYW4gY29uc2lkZXJTc2xQb2xpY2llcywgYm9vbGVhbiByZWxhdGl2ZVVybHMpIHsKLQotICAgICAgICBzdXBlcihtYW5hZ2VyKTsKLSAgICAgICAgdGhpcy5yZXF1ZXN0VXJsID0gcmVxdWVzdFVybDsKLSAgICAgICAgdGhpcy5yZWxhdGl2ZVVybHMgPSByZWxhdGl2ZVVybHM7Ci0gICAgICAgIHRoaXMuc3NsID0gc3NsOwotICAgICAgICB0aGlzLmNvbnNpZGVyU3NsUG9saWNpZXMgPSBjb25zaWRlclNzbFBvbGljaWVzOwotCi0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZXJ2aWNlU2VsZWN0b3IgPSBudWxsOwotICAgICAgICBBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIgYWNSZXNvbHZlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLQotICAgICAgICAgICAgaWYgKHRoaXMuY29uc2lkZXJTc2xQb2xpY2llcykgewotICAgICAgICAgICAgICAgIHNlcnZpY2VTZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmxvb2t1cChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgICAgIGFjUmVzb2x2ZXIgPSAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyKSBzZXJ2aWNlU2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLkRFRkFVTFRfUkVTT0xWRVIpOwotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIgYWNjZXNzQ29udHJvbGxlciA9IGFjUmVzb2x2ZXIucmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIocmVxdWVzdFVybCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIgPSBhY2Nlc3NDb250cm9sbGVyLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2xpY3lNYW5hZ2VyID0gYWNjZXNzQ29udHJvbGxlci5nZXRQb2xpY3lNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQdWJsaWNhdGlvbltdIHB1YnMgPSB0aGlzLmZhY3RvcnkuZ2V0UHVibGljYXRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLnB1YmxpY2F0aW9uQ2FjaGUucHV0KHB1YnNbaV0uZ2V0SWQoKSwgcHVic1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlcnZpY2VTZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlU2VsZWN0b3IucmVsZWFzZShhY1Jlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VydmljZVNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBHbG9iYWxQcm94aWVzIGdldEdsb2JhbFByb3hpZXMoKSB7Ci0gICAgICAgIGlmICh0aGlzLmdsb2JhbFByb3hpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbFByb3hpZXMgPSAoR2xvYmFsUHJveGllcykgdGhpcy5tYW5hZ2VyLmxvb2t1cChHbG9iYWxQcm94aWVzLlJPTEUpOwotICAgICAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsUHJveGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyB1cmwpIHsKLSAgICAgICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCIvIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgcHVibGljYXRpb25DYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcm90ZWN0ZWQgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24oU3RyaW5nIHB1YklkKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKFB1YmxpY2F0aW9uKSB0aGlzLnB1YmxpY2F0aW9uQ2FjaGUuZ2V0KHB1YklkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJld3JpdGUoZmluYWwgU3RyaW5nIHVybCkgewotCi0gICAgICAgIFN0cmluZyByZXdyaXR0ZW5VcmwgPSAiIjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG5vcm1hbGl6ZWRVcmwgPSBub3JtYWxpemVVcmwodXJsKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlbGF0aXZlVXJscykgewotICAgICAgICAgICAgICAgIHJld3JpdHRlblVybCA9IGdldFJlbGF0aXZlVXJsVG8obm9ybWFsaXplZFVybCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlU3NsID0gdGhpcy5zc2w7Ci0gICAgICAgICAgICAgICAgaWYgKCF1c2VTc2wgJiYgdGhpcy5wb2xpY3lNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IHRoaXMucG9saWN5TWFuYWdlci5nZXRQb2xpY3kodGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRVcmwpOwotICAgICAgICAgICAgICAgICAgICB1c2VTc2wgPSBwb2xpY3kuaXNTU0xQcm90ZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKG5vcm1hbGl6ZWRVcmwpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwdWJJZCA9IGluZm8uZ2V0UHVibGljYXRpb25JZCgpOwotCi0gICAgICAgICAgICAgICAgUHVibGljYXRpb24gcHViID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocHViSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwdWIgPSBnZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbGluayBwb2ludHMgdG8gcHVibGljYXRpb24KLSAgICAgICAgICAgICAgICBpZiAocHViICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0dGVuVXJsID0gcmV3cml0ZUxpbmsobm9ybWFsaXplZFVybCwgcHViLCB1c2VTc2wpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGxpbmsgZG9lc24ndCBwb2ludCB0byBwdWJsaWNhdGlvbgotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQcm94eSBwcm94eSA9IGdldEdsb2JhbFByb3hpZXMoKS5nZXRQcm94eShzc2wpOwotICAgICAgICAgICAgICAgICAgICByZXdyaXR0ZW5VcmwgPSBwcm94eS5nZXRVcmwoKSArIG5vcm1hbGl6ZWRVcmw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJld3JpdHRlblVybDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZVVybChmaW5hbCBTdHJpbmcgdXJsKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5vcm1hbGl6ZWRVcmw7Ci0gICAgICAgIGlmICh1cmwuaW5kZXhPZigiLi4iKSA+IC0xKSB7Ci0gICAgICAgICAgICBub3JtYWxpemVkVXJsID0gbmV3IFVSSSh1cmwpLm5vcm1hbGl6ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3JtYWxpemVkVXJsID0gdXJsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub3JtYWxpemVkVXJsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3RVcmw7Ci0KLSAgICBwcml2YXRlIE1hcCBwdWJJZDJhcmVhTGlzdCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBwdWJsaWNhdGlvbiBoYXMgYW4gYXJlYSBieSB1c2luZyBhIGNhY2hlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgotICAgICAqIEBwYXJhbSBwdWIgVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhIG5hbWUuCi0gICAgICogQHJldHVybiBpZiB0aGUgcHVibGljYXRpb24gY29udGFpbnMgdGhlIGFyZWEuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzQXJlYShQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBhcmVhKSB7Ci0gICAgICAgIFN0cmluZyBwdWJJZCA9IHB1Yi5nZXRJZCgpOwotICAgICAgICBMaXN0IGFyZWFzID0gKExpc3QpIHRoaXMucHViSWQyYXJlYUxpc3QuZ2V0KHB1YklkKTsKLSAgICAgICAgaWYgKGFyZWFzID09IG51bGwpIHsKLSAgICAgICAgICAgIGFyZWFzID0gQXJyYXlzLmFzTGlzdChwdWIuZ2V0QXJlYU5hbWVzKCkpOwotICAgICAgICAgICAgdGhpcy5wdWJJZDJhcmVhTGlzdC5wdXQocHViSWQsIGFyZWFzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJlYXMuY29udGFpbnMoYXJlYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxpbmtVcmwgVGhlIG9yaWdpbmFsIGxpbmsgVVJMLgotICAgICAqIEBwYXJhbSBwdWIgVGhlIHB1YmxpY2F0aW9uIHRvIHVzZSBmb3IgcHJveHkgcmVzb2x2aW5nLgotICAgICAqIEBwYXJhbSBzc2wgSWYgdGhlIFVSTCB1c2VzIFNTTC4KLSAgICAgKiBAcmV0dXJuIEEgbGluayBVUkwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXdyaXRlTGluayhTdHJpbmcgbGlua1VybCwgUHVibGljYXRpb24gcHViLCBib29sZWFuIHNzbCkgewotICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKGxpbmtVcmwpOwotICAgICAgICBTdHJpbmcgcmV3cml0dGVuVXJsOwotICAgICAgICBTdHJpbmcgYXJlYU5hbWUgPSBpbmZvLmdldEFyZWEoKTsKLQotICAgICAgICAvLyB2YWxpZCBhcmVhCi0gICAgICAgIGlmIChhcmVhTmFtZSAhPSBudWxsICYmIGhhc0FyZWEocHViLCBhcmVhTmFtZSkpIHsKLSAgICAgICAgICAgIFByb3h5IHByb3h5ID0gcHViLmdldFByb3h5KGFyZWFOYW1lLCBzc2wpOwotICAgICAgICAgICAgcmV3cml0dGVuVXJsID0gcHJveHkuZ2V0VXJsKCkgKyBpbmZvLmdldERvY3VtZW50VXJsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbnZhbGlkIGFyZWEKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQcm94eSBwcm94eSA9IGdldEdsb2JhbFByb3hpZXMoKS5nZXRQcm94eShzc2wpOwotICAgICAgICAgICAgcmV3cml0dGVuVXJsID0gcHJveHkuZ2V0VXJsKCkgKyBsaW5rVXJsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXdyaXR0ZW5Vcmw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWxhdGl2ZVVybFRvKFN0cmluZyB3ZWJhcHBVcmwpIHsKLSAgICAgICAgU3RyaW5nIHJlbGF0aXZlVXJsOwotICAgICAgICBpZiAodGhpcy5yZXF1ZXN0VXJsLmVxdWFscyh3ZWJhcHBVcmwpKSB7Ci0gICAgICAgICAgICByZWxhdGl2ZVVybCA9IGdldExhc3RTdGVwKHdlYmFwcFVybCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBMaXN0IHNvdXJjZVN0ZXBzID0gdG9MaXN0KHRoaXMucmVxdWVzdFVybCk7Ci0gICAgICAgICAgICBMaXN0IHRhcmdldFN0ZXBzID0gdG9MaXN0KHdlYmFwcFVybCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICghc291cmNlU3RlcHMuaXNFbXB0eSgpICYmICF0YXJnZXRTdGVwcy5pc0VtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgc291cmNlU3RlcHMuZ2V0KDApLmVxdWFscyh0YXJnZXRTdGVwcy5nZXQoMCkpKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlU3RlcHMucmVtb3ZlKDApOwotICAgICAgICAgICAgICAgIHRhcmdldFN0ZXBzLnJlbW92ZSgwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgaWYgKHRhcmdldFN0ZXBzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlVXBEb3RzKHNvdXJjZVN0ZXBzLnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VTdGVwcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBnZXRMYXN0U3RlcCh0aGlzLnJlcXVlc3RVcmwpICsgIi8iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlU3RlcHMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlVXBEb3RzKHNvdXJjZVN0ZXBzLnNpemUoKSAtIDEpICsgIi8iOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdbXSB0YXJnZXRBcnJheSA9IChTdHJpbmdbXSkgdGFyZ2V0U3RlcHMudG9BcnJheShuZXcgU3RyaW5nW3RhcmdldFN0ZXBzLnNpemUoKV0pOwotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhdGggPSBTdHJpbmdVdGlsLmpvaW4odGFyZ2V0QXJyYXksICIvIik7Ci0gICAgICAgICAgICByZWxhdGl2ZVVybCA9IHByZWZpeCArIHRhcmdldFBhdGg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlbGF0aXZlVXJsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFzdFN0ZXAoU3RyaW5nIHVybCkgewotICAgICAgICByZXR1cm4gdXJsLnN1YnN0cmluZyh1cmwubGFzdEluZGV4T2YoIi8iKSArIDEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVVcERvdHMoaW50IGxlbmd0aCkgewotICAgICAgICBTdHJpbmcgdXBEb3RzOwotICAgICAgICBTdHJpbmdbXSB1cERvdHNBcnJheSA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLSAgICAgICAgQXJyYXlzLmZpbGwodXBEb3RzQXJyYXksICIuLiIpOwotICAgICAgICB1cERvdHMgPSBTdHJpbmdVdGlsLmpvaW4odXBEb3RzQXJyYXksICIvIik7Ci0gICAgICAgIHJldHVybiB1cERvdHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3QgdG9MaXN0KFN0cmluZyB1cmwpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh1cmwuc3Vic3RyaW5nKDEpLnNwbGl0KCIvIiwgLTEpKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9TZXJ2bGV0TGlua1Jld3JpdGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9TZXJ2bGV0TGlua1Jld3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzc0YWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvU2VydmxldExpbmtSZXdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLmNvbnRleHQuQ29udGV4dFV0aWxpdHk7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc2VydmxldC1vcmllbnRlZCBsaW5rIHJld3JpdGVycy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZsZXRMaW5rUmV3cml0ZXIgaW1wbGVtZW50cyBMaW5rUmV3cml0ZXIgewotICAgIAotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmxldExpbmtSZXdyaXRlcihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFBhdGg7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKLSAgICAgICAgaWYgKHRoaXMuY29udGV4dFBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgQ29udGV4dFV0aWxpdHkgY29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbnRleHQgPSAoQ29udGV4dFV0aWxpdHkpIHRoaXMubWFuYWdlci5sb29rdXAoQ29udGV4dFV0aWxpdHkuUk9MRSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldENvbnRleHRQYXRoKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRQYXRoOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvVXJsVG9VdWlkUmV3cml0ZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL1VybFRvVXVpZFJld3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTBiMzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvVXJsVG9VdWlkUmV3cml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkFyZWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogQ29udmVydHMgd2ViYXBwIFVSTHMgdG8gVVVJRC1iYXNlZCBpbnRlcm5hbCBsaW5rcy4gSWYgdGhlIFVSTAotICogZG9lc24ndCByZWZlciB0byBhIGRvY3VtZW50LCB0aGUgb3JpZ2luYWwgVVJMIGlzIHJldHVybmVkLgotICogPC9wPgotICogPHA+Ci0gKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXJlIG5vdCB0aHJlYWQtc2FmZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFVybFRvVXVpZFJld3JpdGVyIGltcGxlbWVudHMgTGlua1Jld3JpdGVyIHsKLQotICAgIHByaXZhdGUgQXJlYSBhcmVhOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEgdG8gb3BlcmF0ZSBpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXJsVG9VdWlkUmV3cml0ZXIoQXJlYSBhcmVhKSB7Ci0gICAgICAgIHRoaXMuYXJlYSA9IGFyZWE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgdXJsKSB7Ci0gICAgICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aCgiLyIgKyB0aGlzLmFyZWEuZ2V0UHVibGljYXRpb24oKS5nZXRJZCgpICsgIi8iICsgdGhpcy5hcmVhLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyByZXdyaXRlKFN0cmluZyB3ZWJhcHBVcmwpIHsKLQotICAgICAgICBTdHJpbmcgYW5jaG9yID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybCA9IG51bGw7Ci0KLSAgICAgICAgaW50IGFuY2hvckluZGV4ID0gd2ViYXBwVXJsLmluZGV4T2YoIiMiKTsKLSAgICAgICAgaWYgKGFuY2hvckluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIHVybCA9IHdlYmFwcFVybC5zdWJzdHJpbmcoMCwgYW5jaG9ySW5kZXgpOwotICAgICAgICAgICAgYW5jaG9yID0gd2ViYXBwVXJsLnN1YnN0cmluZyhhbmNob3JJbmRleCArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXJsID0gd2ViYXBwVXJsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gbGlua1VybEFuZFF1ZXJ5ID0gdXJsLnNwbGl0KCJcXD8iKTsKLSAgICAgICAgU3RyaW5nIGxpbmtVcmwgPSBsaW5rVXJsQW5kUXVlcnlbMF07Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IG51bGw7Ci0gICAgICAgIGlmIChsaW5rVXJsQW5kUXVlcnkubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSBsaW5rVXJsQW5kUXVlcnlbMV07Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IHRoaXMuYXJlYS5nZXRQdWJsaWNhdGlvbigpLmdldEZhY3RvcnkoKTsKLQotICAgICAgICBTdHJpbmcgcmV3cml0dGVuVXJsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZmFjdG9yeS5pc0RvY3VtZW50KGxpbmtVcmwpKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgdGFyZ2V0RG9jdW1lbnQgPSBmYWN0b3J5LmdldEZyb21VUkwobGlua1VybCk7Ci0gICAgICAgICAgICAgICAgcmV3cml0dGVuVXJsID0gZ2V0VXVpZEJhc2VkVXJpKHRhcmdldERvY3VtZW50LCBhbmNob3IsIHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV3cml0dGVuVXJsID0gd2ViYXBwVXJsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJld3JpdHRlblVybDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXdyaXRlcyBhIGxpbmsuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhcmdldERvY3VtZW50IFRoZSB0YXJnZXQgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGFuY2hvciBUaGUgYW5jaG9yICh0aGUgc3RyaW5nIGFmdGVyIHRoZSAjIGNoYXJhY3RlciBpbiB0aGUgVVJMKS4KLSAgICAgKiBAcGFyYW0gcXVlcnlTdHJpbmcgVGhlIHF1ZXJ5IHN0cmluZyB3aXRob3V0IHF1ZXN0aW9uIG1hcmsuCi0gICAgICogQHJldHVybiBBIFVVSUQtYmFzZWQgbGluayBVUkkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVdWlkQmFzZWRVcmkoRG9jdW1lbnQgdGFyZ2V0RG9jdW1lbnQsIFN0cmluZyBhbmNob3IsIFN0cmluZyBxdWVyeVN0cmluZykgewotCi0gICAgICAgIExpbmsgbGluayA9IG5ldyBMaW5rKCk7Ci0gICAgICAgIGxpbmsuc2V0VXVpZCh0YXJnZXREb2N1bWVudC5nZXRVVUlEKCkpOwotCi0gICAgICAgIFN0cmluZyBsaW5rVXJpID0gbGluay5nZXRVcmkoKTsKLQotICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmtVcmkgKz0gIiMiICsgYW5jaG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmtVcmkgKz0gIj8iICsgcXVlcnlTdHJpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGlua1VyaTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL2ltcGwvR2xvYmFsUHJveGllc0ltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL2ltcGwvR2xvYmFsUHJveGllc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmMzRhMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9pbXBsL0dsb2JhbFByb3hpZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMuY29udGV4dC5Db250ZXh0VXRpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkdsb2JhbFByb3hpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHJveHk7Ci0KLS8qKgotICogR2xvYmFsUHJveHkgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIFRoZSBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbi4KLSAqLwotcHVibGljIGNsYXNzIEdsb2JhbFByb3hpZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgR2xvYmFsUHJveGllcywgU2VydmljZWFibGUsCi0gICAgICAgIFRocmVhZFNhZmUsIENvbmZpZ3VyYWJsZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXAgc3NsMnByb3h5ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgUHJveHkgZ2V0UHJveHkoYm9vbGVhbiBzc2wpIHsKLSAgICAgICAgT2JqZWN0IGtleSA9IEJvb2xlYW4udmFsdWVPZihzc2wpOwotICAgICAgICBQcm94eSBwcm94eSA9IChQcm94eSkgdGhpcy5zc2wycHJveHkuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eSA9IGluaXRpYWxpemVQcm94eShrZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm94eTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIFByb3h5IGluaXRpYWxpemVQcm94eShPYmplY3Qga2V5KSB7Ci0gICAgICAgIFByb3h5IHByb3h5OwotICAgICAgICBwcm94eSA9IG5ldyBQcm94eSgpOwotICAgICAgICBDb250ZXh0VXRpbGl0eSBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRleHQgPSAoQ29udGV4dFV0aWxpdHkpIG1hbmFnZXIubG9va3VwKENvbnRleHRVdGlsaXR5LlJPTEUpOwotICAgICAgICAgICAgcHJveHkuc2V0VXJsKGNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldENvbnRleHRQYXRoKCkpOwotICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc3NsMnByb3h5LnB1dChrZXksIHByb3h5KTsKLSAgICAgICAgcmV0dXJuIHByb3h5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uW10gcHJveHlDb25maWdzID0gY29uZmlnLmdldENoaWxkcmVuKCJwcm94eSIpOwotICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IHByb3h5Q29uZmlncy5sZW5ndGg7IHArKykgewotICAgICAgICAgICAgYm9vbGVhbiBzc2wgPSBwcm94eUNvbmZpZ3NbcF0uZ2V0QXR0cmlidXRlQXNCb29sZWFuKCJzc2wiKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmwgPSBwcm94eUNvbmZpZ3NbcF0uZ2V0QXR0cmlidXRlKCJ1cmwiKTsKLSAgICAgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KCk7Ci0gICAgICAgICAgICBwcm94eS5zZXRVcmwodXJsKTsKLSAgICAgICAgICAgIHNldFByb3h5KHNzbCwgcHJveHkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNzbCBJZiB0aGUgcHJveHkgaXMgcmVzcG9uc2libGUgZm9yIFNTTCByZXF1ZXN0cy4KLSAgICAgKiBAcGFyYW0gcHJveHkgQSBwcm94eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIHNzbCwgUHJveHkgcHJveHkpIHsKLSAgICAgICAgdGhpcy5zc2wycHJveHkucHV0KEJvb2xlYW4udmFsdWVPZihzc2wpLCBwcm94eSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9Qcm94eVRyYW5zZm9ybWVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vUHJveHlUcmFuc2Zvcm1lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwYzNhNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9Qcm94eVRyYW5zZm9ybWVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24udHJhbnNmb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VyaWFsaXplcnMuWEhUTUxTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc291cmNlLlNvdXJjZVJlc29sdmVyQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkdsb2JhbFByb3hpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5pbXBsLkdsb2JhbFByb3hpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmcuSW5zdGFudGlhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLk5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi1wdWJsaWMgY2xhc3MgUHJveHlUcmFuc2Zvcm1lclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkNPTkZfTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wdWJsaWNhdGlvbi8xLjEiOwotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9IFhIVE1MU2VyaWFsaXplci5YSFRNTDFfTkFNRVNQQUNFOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlQgPSAiYSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFID0gImhyZWYiOwotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0V2ViYXBwVXJsKCkgewotICAgICAgICByZXR1cm4gIi9kZWZhdWx0L2F1dGhvcmluZy9pbmRleC5odG1sIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJveHlUcmFuc2Zvcm1lcigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFByb3h5VHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBuZXcgUHJveHlUcmFuc2Zvcm1lcigpOwotICAgICAgICB0cmFuc2Zvcm1lci5lbmFibGVMb2dnaW5nKGdldExvZ2dlcigpKTsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2VydmljZShnZXRNYW5hZ2VyKCkpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHB1YklkID0gIm1vY2siOwotICAgICAgICBTdHJpbmcgYXJlYSA9ICJhdXRob3JpbmciOwotICAgICAgICBTdHJpbmcgcHJveHlVcmwgPSAiaHR0cDovL3d3dy5tb2NrLm9yZyI7Ci0KLSAgICAgICAgY3JlYXRlTW9ja1B1YmxpY2F0aW9uKHB1YklkLCBhcmVhLCBwcm94eVVybCk7Ci0KLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gdGhpcy5jb250ZXh0OwotICAgICAgICBNYXAgb2JqZWN0TW9kZWwgPSAoTWFwKSBjb250ZXh0LmdldChDb250ZXh0SGVscGVyLkNPTlRFWFRfT0JKRUNUX01PREVMKTsKLQotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldHVwKG5ldyBTb3VyY2VSZXNvbHZlckFkYXB0ZXIocmVzb2x2ZXIpLCBvYmplY3RNb2RlbCwgIiIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXJzKCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgZG9jdW1lbnRVcmwgPSAiL2luZGV4Lmh0bWwiOwotICAgICAgICAgICAgU3RyaW5nIGxpbmtVcmwgPSAiLyIgKyBwdWJJZCArICIvIiArIGFyZWEgKyBkb2N1bWVudFVybDsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRVcmwgPSBwcm94eVVybCArIGRvY3VtZW50VXJsOwotICAgICAgICAgICAgcmV3cml0ZUxpbmsodHJhbnNmb3JtZXIsIGxpbmtVcmwsIHRhcmdldFVybCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBjc3NVcmwgPSAiL2xlbnlhL2Zvby5jc3MiOwotICAgICAgICAgICAgcmV3cml0ZUxpbmsodHJhbnNmb3JtZXIsIGNzc1VybCwgY3NzVXJsKTsKLQotICAgICAgICAgICAgU3RyaW5nIG1vZHVsZVVybCA9ICIvbW9kdWxlcy9mb28vYmFyLmh0bWw/eD15IjsKLSAgICAgICAgICAgIHJld3JpdGVMaW5rKHRyYW5zZm9ybWVyLCBtb2R1bGVVcmwsIG1vZHVsZVVybCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmV3cml0ZUxpbmsoUHJveHlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwgU3RyaW5nIGxpbmtVcmwsIFN0cmluZyB0YXJnZXRVcmwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBdHRyaWJ1dGVzSW1wbCBhdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotICAgICAgICBhdHRycy5hZGRBdHRyaWJ1dGUoIiIsIEFUVFJJQlVURSwgQVRUUklCVVRFLCAic3RyaW5nIiwgbGlua1VybCk7Ci0KLSAgICAgICAgQWJzdHJhY3RMaW5rVHJhbnNmb3JtZXIuQXR0cmlidXRlQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQWJzdHJhY3RMaW5rVHJhbnNmb3JtZXIuQXR0cmlidXRlQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICBOQU1FU1BBQ0UsIEVMRU1FTlQsIEFUVFJJQlVURSk7Ci0KLSAgICAgICAgdHJhbnNmb3JtZXIuaGFuZGxlTGluayhsaW5rVXJsLCBjb25maWcsIGF0dHJzKTsKLQotICAgICAgICBTdHJpbmcgcmV3cml0dGVuVXJsID0gYXR0cnMuZ2V0VmFsdWUoQVRUUklCVVRFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJld3JpdHRlblVybCwgdGFyZ2V0VXJsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNb2NrUHVibGljYXRpb24oU3RyaW5nIHB1YklkLCBTdHJpbmcgYXJlYSwgU3RyaW5nIHByb3h5VXJsKQotICAgICAgICAgICAgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uLCBTZXJ2aWNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWV4aXN0c1B1YmxpY2F0aW9uKHB1YklkKSkgewotCi0gICAgICAgICAgICBQdWJsaWNhdGlvbiBkZWZhdWx0UHViID0gZ2V0UHVibGljYXRpb24oImRlZmF1bHQiKTsKLSAgICAgICAgICAgIEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IgPSBudWxsOwotICAgICAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSBnZXRNYW5hZ2VyKCkubG9va3VwKEluc3RhbnRpYXRvci5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICAgICAgaW5zdGFudGlhdG9yID0gKEluc3RhbnRpYXRvcikgc2VsZWN0b3Iuc2VsZWN0KGRlZmF1bHRQdWIuZ2V0SW5zdGFudGlhdG9ySGludCgpKTsKLSAgICAgICAgICAgICAgICBpbnN0YW50aWF0b3IuaW5zdGFudGlhdGUoZGVmYXVsdFB1YiwgcHViSWQsICJNb2NrIik7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlUHJveHkoYXJlYSwgcHJveHlVcmwpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFudGlhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2UoaW5zdGFudGlhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUHJveHkoU3RyaW5nIGFyZWEsIFN0cmluZyBwcm94eVVybCkKLSAgICAgICAgICAgIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uLCBTb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24sCi0gICAgICAgICAgICBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29uZmlnVXJpID0gImNvbnRleHQ6Ly9sZW55YS9wdWJzL21vY2svY29uZmlnL3B1YmxpY2F0aW9uLnhtbCI7Ci0gICAgICAgIERvY3VtZW50IGRvbSA9IFNvdXJjZVV0aWwucmVhZERPTShjb25maWdVcmksIGdldE1hbmFnZXIoKSk7Ci0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKFBVQkNPTkZfTkFNRVNQQUNFLCAiIiwgZG9tKTsKLQotICAgICAgICBFbGVtZW50IHByb3hpZXMgPSBoZWxwZXIuZ2V0Rmlyc3RDaGlsZChkb20uZ2V0RG9jdW1lbnRFbGVtZW50KCksICJwcm94aWVzIik7Ci0gICAgICAgIGlmIChwcm94aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3hpZXMgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgicHJveGllcyIpOwotICAgICAgICAgICAgZG9tLmdldERvY3VtZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKHByb3hpZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkUHJveHlFbGVtZW50KGhlbHBlciwgcHJveGllcywgYXJlYSwgcHJveHlVcmwsIGZhbHNlKTsKLSAgICAgICAgYWRkUHJveHlFbGVtZW50KGhlbHBlciwgcHJveGllcywgYXJlYSwgcHJveHlVcmwsIHRydWUpOwotCi0gICAgICAgIFNvdXJjZVV0aWwud3JpdGVET00oZG9tLCBjb25maWdVcmksIGdldE1hbmFnZXIoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJveHlFbGVtZW50KE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEVsZW1lbnQgcHJveGllcywgU3RyaW5nIGFyZWEsCi0gICAgICAgICAgICBTdHJpbmcgcHJveHlVcmwsIGJvb2xlYW4gc3NsKSB7Ci0gICAgICAgIEVsZW1lbnQgcHJveHlFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoInByb3h5Iik7Ci0gICAgICAgIHByb3h5RWxlbWVudC5zZXRBdHRyaWJ1dGUoInNzbCIsIEJvb2xlYW4udG9TdHJpbmcoc3NsKSk7Ci0gICAgICAgIHByb3h5RWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyZWEiLCBhcmVhKTsKLSAgICAgICAgcHJveHlFbGVtZW50LnNldEF0dHJpYnV0ZSgidXJsIiwgcHJveHlVcmwpOwotICAgICAgICBwcm94aWVzLmFwcGVuZENoaWxkKHByb3h5RWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhpc3RzUHVibGljYXRpb24oU3RyaW5nIHB1YklkKSB7Ci0gICAgICAgIFB1YmxpY2F0aW9uW10gcHVicyA9IGdldEZhY3RvcnkoKS5nZXRQdWJsaWNhdGlvbnMoKTsKLSAgICAgICAgTGlzdCBwdWJJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVicy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcHViSWRzLmFkZChwdWJzW2ldLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwdWJJZHMuY29udGFpbnMocHViSWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvbGlua2luZy9MaW5rVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0xpbmtUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzgzM2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL0xpbmtUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5BcmVhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLQotLyoqCi0gKiBUZXN0IGZvciBsaW5rIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotICAgIAotICAgIC8qKgotICAgICAqIExpbmsgdGVzdC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5rcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZ2V0UHVibGljYXRpb24oInRlc3QiKTsKLSAgICAgICAgQXJlYSBhcmVhID0gcHViLmdldEFyZWEoImF1dGhvcmluZyIpOwotICAgICAgICBTaXRlU3RydWN0dXJlIHNpdGUgPSBhcmVhLmdldFNpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIERvY3VtZW50IHNvdXJjZSA9IHNpdGUuZ2V0Tm9kZSgiL2luZGV4IikuZ2V0TGluaygiZW4iKS5nZXREb2N1bWVudCgpOwotICAgICAgICBEb2N1bWVudCB0YXJnZXQgPSBzaXRlLmdldE5vZGUoIi90dXRvcmlhbCIpLmdldExpbmsoImVuIikuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIExpbmtNYW5hZ2VyIGxpbmtNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgTGlua1Jlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxpbmtNYW5hZ2VyID0gKExpbmtNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkubG9va3VwKExpbmtNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoTGlua1Jlc29sdmVyKSBnZXRNYW5hZ2VyKCkubG9va3VwKExpbmtSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlua1tdIGxpbmtzID0gbGlua01hbmFnZXIuZ2V0TGlua3NGcm9tKHNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIExpbmtUYXJnZXQgbGlua1RhcmdldCA9IHJlc29sdmVyLnJlc29sdmUoc291cmNlLCBsaW5rc1tpXS5nZXRVcmkoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmtUYXJnZXQuZXhpc3RzKCkgJiYgbGlua1RhcmdldC5nZXREb2N1bWVudCgpLmVxdWFscyh0YXJnZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYXRjaGVkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRG9jdW1lbnRbXSByZWZlcmVuY2VzID0gbGlua01hbmFnZXIuZ2V0UmVmZXJlbmNpbmdEb2N1bWVudHModGFyZ2V0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmFzTGlzdChyZWZlcmVuY2VzKS5jb250YWlucyhzb3VyY2UpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsaW5rTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UobGlua01hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvT3V0Z29pbmdMaW5rUmV3cml0ZXJUZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2xpbmtpbmcvT3V0Z29pbmdMaW5rUmV3cml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3M2I1ZTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9saW5raW5nL091dGdvaW5nTGlua1Jld3JpdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBPdXRnb2luZ0xpbmtSZXdyaXRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGl2ZVVybHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbG9naW4oImxlbnlhIik7Ci0gICAgICAgIFN0cmluZyB1cmwgPSAiL2FhYS9iYmIvY2NjIjsKLSAgICAgICAgT3V0Z29pbmdMaW5rUmV3cml0ZXIgcmV3cml0ZXIgPSBuZXcgT3V0Z29pbmdMaW5rUmV3cml0ZXIoZ2V0TWFuYWdlcigpLCBzZXNzaW9uLCB1cmwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMocmV3cml0ZXIucmV3cml0ZSgiL2FhYS9iYmIvZm9vIiksICJmb28iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJld3JpdGVyLnJld3JpdGUoIi9hYWEvYmJiIiksICIuLiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV3cml0ZXIucmV3cml0ZSgiL2FhYS9iYmIvY2NjL2RkZCIpLCAiY2NjL2RkZCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV3cml0ZXIucmV3cml0ZSgiL2FhYS9mb28iKSwgIi4uL2ZvbyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV3cml0ZXIucmV3cml0ZSgiL2FhYS9mb28vYmFyIiksICIuLi9mb28vYmFyIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXdyaXRlci5yZXdyaXRlKCIvZm9vL2JhciIpLCAiLi4vLi4vZm9vL2JhciIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV3cml0ZXIucmV3cml0ZSgiL2FhYS9mb28vYmFyL2JheiIpLCAiLi4vZm9vL2Jhci9iYXoiKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL29ic2VydmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvb2JzZXJ2YXRpb24tcmVnaXN0cnkueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL29ic2VydmF0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvb2JzZXJ2YXRpb24tcmVnaXN0cnkueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGU5ZDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9vYnNlcnZhdGlvbi9jb25maWcvY29jb29uLXhjb25mL29ic2VydmF0aW9uLXJlZ2lzdHJ5Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLk9ic2VydmF0aW9uUmVnaXN0cnknXSI+DQotICAgIDxjb21wb25lbnQgbG9nZ2VyPSJsZW55YS5vYnNlcnZhdGlvbi5yZWdpc3RyeSINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uT2JzZXJ2YXRpb25NYW5hZ2VyIg0KLSAgICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLk9ic2VydmF0aW9uUmVnaXN0cnkiLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9vYnNlcnZhdGlvbi9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvb2JzZXJ2YXRpb24vY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODhlNWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9vYnNlcnZhdGlvbi9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLm9ic2VydmF0aW9uPC9pZD4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5PYnNlcnZhdGlvbiBpbXBsZW1lbnRhdGlvbjwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+T2JzZXJ2YXRpb24gaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL29ic2VydmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL09ic2VydmF0aW9uTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9vYnNlcnZhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9PYnNlcnZhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlYjkwMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL29ic2VydmF0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL09ic2VydmF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogT2JzZXJ2YXRpb24gbWFuYWdlci4gV29ya3MgYXMgYW4gb2JzZXJ2YXRpb24gcmVnaXN0cnkgYW5kIHNlbmRzIHRoZSBub3RpZmljYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgT2JzZXJ2YXRpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgT2JzZXJ2YXRpb25SZWdpc3RyeSwKLSAgICAgICAgVGhyZWFkU2FmZSB7Ci0KLSAgICBwcml2YXRlIE1hcCBpZGVudGlmaWVyMmxpc3RlbmVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTZXQgbGlzdGVuZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3Rlckxpc3RlbmVyKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lciwgRG9jdW1lbnQgZG9jKQotICAgICAgICAgICAgdGhyb3dzIE9ic2VydmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyhkb2MuZ2V0SWRlbnRpZmllcigpKTsKLSAgICAgICAgaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPYnNlcnZhdGlvbkV4Y2VwdGlvbigiVGhlIGxpc3RlbmVyIFsiICsgbGlzdGVuZXIKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoZSBkb2N1bWVudCBbIiArIGRvYyArICJdLiIpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXQgZ2V0TGlzdGVuZXJzKERvY3VtZW50SWRlbnRpZmllciBkb2MpIHsKLSAgICAgICAgU2V0IGxpc3RlbmVycyA9IChTZXQpIHRoaXMuaWRlbnRpZmllcjJsaXN0ZW5lcnMuZ2V0KGRvYyk7Ci0gICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdGVuZXJzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllcjJsaXN0ZW5lcnMucHV0KGRvYywgbGlzdGVuZXJzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdGVuZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3Rlckxpc3RlbmVyKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICAgICAgICAgIHRocm93cyBPYnNlcnZhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPYnNlcnZhdGlvbkV4Y2VwdGlvbigiVGhlIGxpc3RlbmVyIFsiICsgbGlzdGVuZXIgKyAiXSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnRJZGVudGlmaWVyIGdldElkZW50aWZpZXIoRG9jdW1lbnRFdmVudCBldmVudCkgewotCi0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJldmVudCIsIGV2ZW50KTsKLSAgICAgICAgRG9jdW1lbnRJZGVudGlmaWVyIGlkID0gbmV3IERvY3VtZW50SWRlbnRpZmllcihldmVudC5nZXRQdWJsaWNhdGlvbklkKCksIGV2ZW50LmdldEFyZWEoKSwKLSAgICAgICAgICAgICAgICBldmVudC5nZXRVdWlkKCksIGV2ZW50LmdldExhbmd1YWdlKCkpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNldCBnZXRBbGxMaXN0ZW5lcnMoRG9jdW1lbnRJZGVudGlmaWVyIGRvYykgewotICAgICAgICBTZXQgYWxsTGlzdGVuZXJzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBhbGxMaXN0ZW5lcnMuYWRkQWxsKHRoaXMubGlzdGVuZXJzKTsKLSAgICAgICAgICAgIGFsbExpc3RlbmVycy5hZGRBbGwoZ2V0TGlzdGVuZXJzKGRvYykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbGxMaXN0ZW5lcnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5KFNldCBsaXN0ZW5lcnMsIFJlcG9zaXRvcnlFdmVudCBldmVudCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lciA9IChSZXBvc2l0b3J5TGlzdGVuZXIpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmV2ZW50RmlyZWQoZXZlbnQpOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV2ZW50RmlyZWQoUmVwb3NpdG9yeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJldmVudCIsIGV2ZW50KTsKLSAgICAgICAgU2V0IGxpc3RlbmVyczsKLSAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRFdmVudCkgewotICAgICAgICAgICAgRG9jdW1lbnRJZGVudGlmaWVyIGlkID0gZ2V0SWRlbnRpZmllcigoRG9jdW1lbnRFdmVudCkgZXZlbnQpOwotICAgICAgICAgICAgbGlzdGVuZXJzID0gZ2V0QWxsTGlzdGVuZXJzKGlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShsaXN0ZW5lcnMsIGV2ZW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvb2JzZXJ2YXRpb24vamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL09ic2VydmF0aW9uVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9vYnNlcnZhdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvb2JzZXJ2YXRpb24vT2JzZXJ2YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwN2U4ZjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9vYnNlcnZhdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvb2JzZXJ2YXRpb24vT2JzZXJ2YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBPYnNlcnZhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T2JzZXJ2YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgc2l0ZSA9IHB1YmxpY2F0aW9uLmdldEFyZWEoImF1dGhvcmluZyIpLmdldFNpdGUoKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gc2l0ZS5nZXROb2RlKCIvaW5kZXgiKS5nZXRMaW5rKCJlbiIpLmdldERvY3VtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBUZXN0TGlzdGVuZXIgZG9jTGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCk7Ci0gICAgICAgIFRlc3RMaXN0ZW5lciBhbGxMaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKTsKLSAgICAgICAgCi0gICAgICAgIE9ic2VydmF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVnaXN0cnkgPSAoT2JzZXJ2YXRpb25SZWdpc3RyeSkgZ2V0TWFuYWdlcigpLmxvb2t1cChPYnNlcnZhdGlvblJlZ2lzdHJ5LlJPTEUpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBpdCB3b3JrcyBpZiBvbmx5IHRoZSBhbGxMaXN0ZW5lciBpcyByZWdpc3RlcmVkCi0gICAgICAgICAgICByZWdpc3RyeS5yZWdpc3Rlckxpc3RlbmVyKGFsbExpc3RlbmVyKTsKLSAgICAgICAgICAgIHRlc3RDaGFuZ2VkKGRvYywgYWxsTGlzdGVuZXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZWdpc3RyeS5yZWdpc3Rlckxpc3RlbmVyKGRvY0xpc3RlbmVyLCBkb2MpOwotICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWdpc3RyeS5yZWdpc3Rlckxpc3RlbmVyKGRvY0xpc3RlbmVyLCBkb2MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE9ic2VydmF0aW9uRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgZSA9IGUxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlKTsKLQotICAgICAgICAgICAgdGVzdENoYW5nZWQoZG9jLCBkb2NMaXN0ZW5lcik7Ci0gICAgICAgICAgICB0ZXN0Q2hhbmdlZChkb2MsIGFsbExpc3RlbmVyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGVzdE1ldGFEYXRhQ2hhbmdlZChkb2MsIGRvY0xpc3RlbmVyKTsKLSAgICAgICAgICAgIHRlc3RNZXRhRGF0YUNoYW5nZWQoZG9jLCBhbGxMaXN0ZW5lcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UocmVnaXN0cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0Q2hhbmdlZChEb2N1bWVudCBkb2MsIFRlc3RMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxpc3RlbmVyLnJlc2V0KCk7Ci0gICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IG9sZFhtbCA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudChkb2MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgIE5hbWVzcGFjZUhlbHBlciB4bWwgPSBuZXcgTmFtZXNwYWNlSGVscGVyKCJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS90ZXN0IiwgIiIsICJ0ZXN0Iik7Ci0gICAgICAgIHhtbC5zYXZlKGRvYy5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgIERvY3VtZW50SGVscGVyLndyaXRlRG9jdW1lbnQob2xkWG1sLCBkb2MuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIud2FzQ2hhbmdlZCgpKTsKLSAgICAgICAgZG9jLmdldFJlcG9zaXRvcnlOb2RlKCkuZ2V0U2Vzc2lvbigpLmNvbW1pdCgpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwMCk7Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIud2FzQ2hhbmdlZCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0TWV0YURhdGFDaGFuZ2VkKERvY3VtZW50IGRvYywgVGVzdExpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbGlzdGVuZXIucmVzZXQoKTsKLQotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBkb2MuZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgZG9jLnNldE1pbWVUeXBlKCIiKTsKLSAgICAgICAgZG9jLnNldE1pbWVUeXBlKG1pbWVUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLndhc0NoYW5nZWQoKSk7Ci0gICAgICAgIGRvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpLmdldFNlc3Npb24oKS5jb21taXQoKTsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCgxMDApOwotICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLndhc0NoYW5nZWQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdFJlbW92ZWQoRG9jdW1lbnQgZG9jLCBUZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsaXN0ZW5lci5yZXNldCgpOwotCi0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2NNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY01hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIERvY3VtZW50IHRhcmdldCA9IGRvYy5nZXRGYWN0b3J5KCkuZ2V0KGRvYy5nZXRQdWJsaWNhdGlvbigpLCBkb2MuZ2V0QXJlYSgpLCAiL3Rlc3RUYXJnZXQiLCBkb2MuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICBkb2NNYW5hZ2VyLm1vdmUoZG9jLCB0YXJnZXQuZ2V0TG9jYXRvcigpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIud2FzUmVtb3ZlZCgpKTsKLSAgICAgICAgICAgIGRvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpLmdldFNlc3Npb24oKS5jb21taXQoKTsKLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMTAwKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIud2FzUmVtb3ZlZCgpKTsKLSAgICAgICAgCi0gICAgICAgICAgICBkb2NNYW5hZ2VyLm1vdmUodGFyZ2V0LCBkb2MuZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLndhc0NoYW5nZWQoKSk7Ci0gICAgICAgICAgICBkb2MuZ2V0UmVwb3NpdG9yeU5vZGUoKS5nZXRTZXNzaW9uKCkuY29tbWl0KCk7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLndhc0NoYW5nZWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZG9jTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UoZG9jTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL29ic2VydmF0aW9uL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9vYnNlcnZhdGlvbi9UZXN0TGlzdGVuZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvb2JzZXJ2YXRpb24vamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL1Rlc3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWRkOGRlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvb2JzZXJ2YXRpb24vamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL29ic2VydmF0aW9uL1Rlc3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIFJlcG9zaXRvcnlMaXN0ZW5lciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIHZvaWQgZXZlbnRGaXJlZChSZXBvc2l0b3J5RXZlbnQgcmVwb0V2ZW50KSB7Ci0gICAgICAgIGlmICghKHJlcG9FdmVudCBpbnN0YW5jZW9mIERvY3VtZW50RXZlbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRG9jdW1lbnRFdmVudCBldmVudCA9IChEb2N1bWVudEV2ZW50KSByZXBvRXZlbnQ7Ci0gICAgICAgIGlmIChldmVudC5nZXREZXNjcmlwdG9yKCkuZXF1YWxzKERvY3VtZW50RXZlbnQuQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0RGVzY3JpcHRvcigpLmVxdWFscyhEb2N1bWVudEV2ZW50LlJFTU9WRUQpKSB7Ci0gICAgICAgICAgICB0aGlzLnJlbW92ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHdhc0NoYW5nZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHdhc1JlbW92ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgdGhpcy5yZW1vdmVkID0gZmFsc2U7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9wcm9wZXJ0aWVzL2NvbmZpZy9jb2Nvb24teGNvbmYvcHJvcGVydGllcy1pbnB1dC1tb2R1bGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3Byb3BlcnRpZXMvY29uZmlnL2NvY29vbi14Y29uZi9wcm9wZXJ0aWVzLWlucHV0LW1vZHVsZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1YzNlZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3Byb3BlcnRpZXMvY29uZmlnL2NvY29vbi14Y29uZi9wcm9wZXJ0aWVzLWlucHV0LW1vZHVsZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4KLTwhLS0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzCi0tLT4KLQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcyIgdW5sZXNzPSIvY29jb29uL2lucHV0LW1vZHVsZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3Byb3BlcnRpZXMnXSI+Ci0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBsb2dnZXI9ImNvcmUubW9kdWxlcy5pbnB1dC5wcm9wZXJ0aWVzIiBuYW1lPSJwcm9wZXJ0aWVzIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuUHJvcGVydGllc01vZHVsZSIvPgotICA8L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9wcm9wZXJ0aWVzL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9wcm9wZXJ0aWVzL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQzMDQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvcHJvcGVydGllcy9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnByb3BlcnRpZXM8L2lkPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPlByb3BlcnR5IHN5c3RlbSBpbXBsZW1lbnRhdGlvbjwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+UHJvcGVydHkgc3lzdGVtIGltcGxlbWVudGF0aW9uPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9wcm9wZXJ0aWVzL2phdmEvbGliL29yZy5hcGFjaGUuZm9ycmVzdC5wbHVnaW4ub3V0cHV0LmlucHV0TW9kdWxlLXI0MzExNjIuamFyIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9wcm9wZXJ0aWVzL2phdmEvbGliL29yZy5hcGFjaGUuZm9ycmVzdC5wbHVnaW4ub3V0cHV0LmlucHV0TW9kdWxlLXI0MzExNjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZlNjVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvcHJvcGVydGllcy9qYXZhL2xpYi9vcmcuYXBhY2hlLmZvcnJlc3QucGx1Z2luLm91dHB1dC5pbnB1dE1vZHVsZS1yNDMxMTYyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvcHJvcGVydGllcy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1Byb3BlcnRpZXNNb2R1bGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvcHJvcGVydGllcy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1Byb3BlcnRpZXNNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlNzMzMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3Byb3BlcnRpZXMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9Qcm9wZXJ0aWVzTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuSW5pdGlhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LkRlZmF1bHRzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TeXN0ZW1VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmZvcnJlc3QuY29uZi5BbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwkKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubW9kdWxlLk1vZHVsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogSW5wdXQgbW9kdWxlIGZvciBhY2Nlc3NpbmcgdGhlIGJhc2UgcHJvcGVydGllcyB1c2VkIGluIExlbnlhLiBUaGUgbWFpbiB2YWx1ZXMKLSAqIGFyZSB0aGUgbG9jYXRpb25zIG9mIHRoZSA8Yj5zb3VyY2UgPC9iPiBkaXJlY3RvcmllcyBhbmQgb2YgdGhlIDxiPkxlbnlhIDwvYj4KLSAqIGRpcmVjdG9yaWVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc01vZHVsZSBleHRlbmRzIERlZmF1bHRzTW9kdWxlIGltcGxlbWVudHMgSW5wdXRNb2R1bGUsCi0gICAgICAgIEluaXRpYWxpemFibGUsIFRocmVhZFNhZmUsIFNlcnZpY2VhYmxlIHsKLSAgICAKLSAgICBwcml2YXRlIEhhc2hTZXQgcHViSW5pdDsKLSAgICAKLSAgICBwcml2YXRlIEFudFByb3BlcnRpZXMgZmlsdGVyaW5nUHJvcGVydGllczsKLQotICAgIHByaXZhdGUgU291cmNlUmVzb2x2ZXIgbV9yZXNvbHZlcjsKLQotICAgIHByaXZhdGUgTW9kdWxlTWFuYWdlciBtb2R1bGVNYW5hZ2VyOwotICAgIAotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgc2VydmljZU1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgbGVueWFIb21lID0gImNvbnRleHQ6LyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9IT01FX1BST1AgPSAibGVueWEuaG9tZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJsZW55YS5wcm9wZXJ0aWVzLnhtbCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfTkFNRV9MT0NBTCA9ICJsb2NhbC4iICsgUFJPUEVSVFlfTkFNRTsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLQotICAgICAgICBsb2FkUHVibGljYXRpb25Qcm9wZXJ0aWVzSWZOb3REb25lKG9iamVjdE1vZGVsKTsKLSAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBmaWx0ZXJpbmdQcm9wZXJ0aWVzLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gIlVuYWJsZSB0byBnZXQgYXR0cmlidXRlIHZhbHVlIGZvciAiCi0gICAgICAgICAgICAgICAgKyBuYW1lCi0gICAgICAgICAgICAgICAgKyAiLlxuIgotICAgICAgICAgICAgICAgICsgIlBsZWFzZSBtYWtlIHN1cmUgeW91IGRlZmluZWQgIgotICAgICAgICAgICAgICAgICsgbmFtZQotICAgICAgICAgICAgICAgICsgIiBpbiBsZW55YS5wcm9wZXJ0aWVzLnhtbCBlaXRoZXIgaW4gJExFTllBX0hPTUUsICRQVUJfSE9NRSBvciAiCi0gICAgICAgICAgICAgICAgKyAiaW4gdGhlIG1vZHVsZSB0aGF0IGlzIHJlcXVlc3RpbmcgdGhpcyBwcm9wZXJ0eS5cbiIKLSAgICAgICAgICAgICAgICArICJJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgbW9zdCBvZiB0aGUgdGltZSB5b3Ugc3BvdHRlZCBhIG1vZHVsZSBidWcgIgotICAgICAgICAgICAgICAgICsgIihmb3JnZXQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IHByb3BlcnR5KS4gUGxlYXNlIHJlcG9ydCBpdCB0byAiCi0gICAgICAgICAgICAgICAgKyAib3VyIG1haWxpbmcgbGlzdC4iOyAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihlcnJvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVidWdnaW5nKCkpIHsKLSAgICAgICAgICAgIGRlYnVnKCIgLSBSZXF1ZXN0ZWQ6IiArIG5hbWUpOwotICAgICAgICAgICAgZGVidWcoIiAtIEdpdmVuOiIgKyBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEF0dHJpYnV0ZVZhbHVlcyhTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwKLSAgICAgICAgICAgIE1hcCBvYmplY3RNb2RlbCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBsb2FkUHVibGljYXRpb25Qcm9wZXJ0aWVzSWZOb3REb25lKG9iamVjdE1vZGVsKTsKLSAgICAgICAgT2JqZWN0W10gYXR0cmlidXRlVmFsdWVzID0gc3VwZXIuZ2V0QXR0cmlidXRlVmFsdWVzKG5hbWUsIG1vZGVDb25mLAotICAgICAgICAgICAgICAgIG9iamVjdE1vZGVsKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlc1tpXSA9IGZpbHRlcmluZ1Byb3BlcnRpZXMuZmlsdGVyKGF0dHJpYnV0ZVZhbHVlc1tpXQotICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBdHRyaWJ1dGVOYW1lcyhDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvYWRQdWJsaWNhdGlvblByb3BlcnRpZXNJZk5vdERvbmUob2JqZWN0TW9kZWwpOwotICAgICAgICBTb3J0ZWRTZXQgbWF0Y2hzZXQgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGZpbHRlcmluZ1Byb3BlcnRpZXMua2V5cygpOwotICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgbWF0Y2hzZXQuYWRkKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzdXBlci5nZXRBdHRyaWJ1dGVOYW1lcyhtb2RlQ29uZiwgb2JqZWN0TW9kZWwpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgICAgbWF0Y2hzZXQuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgIHJldHVybiBtYXRjaHNldC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBwdWJJbml0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCBhbGwgaG9tZXMgaW1wb3J0YW50IHRvIExlbnlhIHRvIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgIHNldEhvbWVzKCk7Ci0KLSAgICAgICAgbG9hZFN5c3RlbVByb3BlcnRpZXMoZmlsdGVyaW5nUHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gTk9URTogdGhlIGZpcnN0IHZhbHVlcyBzZXQgZ2V0IHByZWNlZGVuY2UsIGFzIGluIEFudFByb3BlcnRpZXMKLSAgICAgICAgLy8gCi0gICAgICAgIC8vIE9yZGVyIG9mIHByZWNlZGVuY2U6ICAgICAgICAKLSAgICAgICAgLy8gMS4gUHVibGljYXRpb24gKGxhenkgbG9hZGVkIGluIGxvYWRQdWJsaWNhdGlvblByb3BlcnRpZXNJZk5vdERvbmUoKSkKLSAgICAgICAgLy8gMi4gTGVueWEgbG9jYWwKLSAgICAgICAgLy8gMy4gTW9kdWxlcyAoYWxsIG1vZHVsZXMsIG5vdCBvbmx5IHRoZSBvbmVzIHJlZmVyZW5jZWQgaW4gdGhlIHB1YmxpY2F0aW9uKQotICAgICAgICAvLyA0LiBMZW55YQotICAgICAgICAvLwotICAgICAgICBTdHJpbmcgbGVueWFQcm9wZXJ0aWVzU3RyaW5nVVJJID0gIiI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgdmFsdWVzIGZyb20gbG9jYWwubGVueWEucHJvcGVydGllcy54bWwKLSAgICAgICAgICAgIGxlbnlhUHJvcGVydGllc1N0cmluZ1VSSSA9IGxlbnlhSG9tZSArIFN5c3RlbVV0aWxzLkZJTEVfU0VQQVJBVE9SCi0gICAgICAgICAgICAgICAgICAgICsgUFJPUEVSVFlfTkFNRV9MT0NBTDsKLSAgICAgICAgICAgIGZpbHRlcmluZ1Byb3BlcnRpZXMgPSBsb2FkWE1MUHJvcGVydGllc0Zyb21VUkkoZmlsdGVyaW5nUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgbGVueWFQcm9wZXJ0aWVzU3RyaW5nVVJJLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgdmFsdWVzIGZyb20gYWxsIG1vZHVsZXMKLSAgICAgICAgICAgIFN0cmluZ1tdIG1vZHVsZTJzcmMgPSBtb2R1bGVNYW5hZ2VyLmdldE1vZHVsZUlkcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGUyc3JjLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gbW9kdWxlMnNyY1tpXTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtb2R1bGVNYW5hZ2VyLmdldEJhc2VVUkkoaWQpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbnlhUHJvcGVydGllc1N0cmluZ1VSSSA9IHZhbHVlICsgU3lzdGVtVXRpbHMuRklMRV9TRVBBUkFUT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBST1BFUlRZX05BTUU7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZ1Byb3BlcnRpZXMgPSBsb2FkWE1MUHJvcGVydGllc0Zyb21VUkkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyaW5nUHJvcGVydGllcywgbGVueWFQcm9wZXJ0aWVzU3RyaW5nVVJJLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZXMgZnJvbSBsZW55YS5wcm9wZXJ0aWVzLnhtbCB0aGlzIGFyZSB0aGUgZGVmYXVsdAotICAgICAgICAgICAgLy8gbGVueWEgdmFsdWVzCi0gICAgICAgICAgICBsZW55YVByb3BlcnRpZXNTdHJpbmdVUkkgPSBsZW55YUhvbWUgKyBTeXN0ZW1VdGlscy5GSUxFX1NFUEFSQVRPUgotICAgICAgICAgICAgICAgICAgICArIFBST1BFUlRZX05BTUU7Ci0gICAgICAgICAgICBmaWx0ZXJpbmdQcm9wZXJ0aWVzID0gbG9hZFhNTFByb3BlcnRpZXNGcm9tVVJJKGZpbHRlcmluZ1Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgIGxlbnlhUHJvcGVydGllc1N0cmluZ1VSSSwgZmFsc2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRlYnVnZ2luZygpKQotICAgICAgICAgICAgICAgIGRlYnVnKCJMb2FkZWQgcHJvamVjdCBsZW55YS5wcm9wZXJ0aWVzLnhtbDoiICsgZmlsdGVyaW5nUHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYWxsIExlbnlhIHJlbGF0ZWQgaG9tZSBsb2NhdGlvbnMgc3VjaCBhcyAtIExlbnlhSG9tZSAtIHByb2plY3RIb21lIC0KLSAgICAgKiBjb250ZXh0SG9tZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEhvbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZmlsdGVyaW5nUHJvcGVydGllcyA9IG5ldyBBbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZpbHRlcmluZ1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoREVGQVVMVF9IT01FX1BST1AsIGxlbnlhSG9tZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgYW55IHByb3BlcnRpZXMgZm9yIHdoaWNoIGEgc3lzdGVtIHByb3BlcnR5IGV4aXN0cwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkU3lzdGVtUHJvcGVydGllcyhBbnRQcm9wZXJ0aWVzIHByb3BzKSB7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1Qcm9wVmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcE5hbWUpOwotICAgICAgICAgICAgaWYgKHN5c3RlbVByb3BWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3ZlcndyaXRlUHJvcGVydHkocHJvcHMsIHByb3BOYW1lLCBzeXN0ZW1Qcm9wVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG92ZXJ3cml0ZVByb3BlcnR5KEFudFByb3BlcnRpZXMgcHJvcHMsIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotICAgICAgICAvLwotICAgICAgICAvLyBBbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5IGRvZXNuJ3QgbGV0IHlvdSBvdmVycmlkZSwgc28gd2UKLSAgICAgICAgLy8gaGF2ZSB0byByZW1vdmUgdGhlIHByb3BlcnR5IHRoZW4gYWRkIGl0IGFnYWluCi0gICAgICAgIHByb3BzLnJlbW92ZShwcm9wTmFtZSk7Ci0gICAgICAgIHByb3BzLnNldFByb3BlcnR5KHByb3BOYW1lLCBwcm9wVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcmVjZWRpbmdQcm9wZXJ0aWVzCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXNTdHJpbmdVUkkKLSAgICAgKiBAcGFyYW0gb3ZlcndyaXRlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEFudFByb3BlcnRpZXMgbG9hZFhNTFByb3BlcnRpZXNGcm9tVVJJKEFudFByb3BlcnRpZXMgcHJlY2VkaW5nUHJvcGVydGllcywgCi0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydGllc1N0cmluZ1VSSSwgYm9vbGVhbiBvdmVyd3JpdGUpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHNvdXJjZSA9IG1fcmVzb2x2ZXIucmVzb2x2ZVVSSShwcm9wZXJ0aWVzU3RyaW5nVVJJKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5leGlzdHMoKSkgewotCi0gICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShzb3VyY2UuZ2V0VVJJKCkpOwotCi0gICAgICAgICAgICAgICAgTm9kZUxpc3QgbmwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvcGVydHkiKTsKLSAgICAgICAgICAgICAgICBpZiAobmwgIT0gbnVsbCAmJiBubC5nZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsID0gKEVsZW1lbnQpIG5sLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcndyaXRlID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVQcm9wZXJ0eShmaWx0ZXJpbmdQcm9wZXJ0aWVzLCBlbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyaW5nUHJvcGVydGllcy5zZXRQcm9wZXJ0eShlbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoInZhbHVlIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRlYnVnZ2luZygpKQotICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiTG9hZGVkOiIgKyBwcm9wZXJ0aWVzU3RyaW5nVVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXJpbmdQcm9wZXJ0aWVzLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1fcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbHRlcmluZ1Byb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlcXVlc3RlZCBwdWJsaWNhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkUHVibGljYXRpb25Qcm9wZXJ0aWVzSWZOb3REb25lKE1hcCBvYmplY3RNb2RlbCkgCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YjsKLSAgICAgICAgU3RyaW5nIHB1YklkOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWIgPSBQdWJsaWNhdGlvblV0aWwuZ2V0UHVibGljYXRpb24oc2VydmljZU1hbmFnZXIsIG9iamVjdE1vZGVsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICBwdWJJZCA9IHB1Yi5nZXRJZCgpOwotICAgICAgICBpZiAocHViSW5pdC5jb250YWlucyhwdWJJZCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsdGVyaW5nUHJvcGVydGllcyA9IGxvYWRYTUxQcm9wZXJ0aWVzRnJvbVVSSShmaWx0ZXJpbmdQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRZX05BTUUsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7ICAgICAgIAotICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oIkNvdWxkIG5vdCBsb2FkIHByb3BlcnRpZXMgZnJvbSBwdWIgXCIiK3B1YklkKyJcIi5cbiIrZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHViSW5pdC5hZGQocHViSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24geyAgICAgICAgCi0gICAgICAgIHRoaXMuc2VydmljZU1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICBtX3Jlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSBtYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgbW9kdWxlTWFuYWdlciA9IChNb2R1bGVNYW5hZ2VyKSBtYW5hZ2VyLmxvb2t1cChNb2R1bGVNYW5hZ2VyLlJPTEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJvY2tlZCBzY2llbmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRlYnVnZ2luZygpIHsKLSAgICAgICAgcmV0dXJuIGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUm9ja2VkIHNjaWVuY2UKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVidWdTdHJpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgZGVidWcoU3RyaW5nIGRlYnVnU3RyaW5nKSB7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKGRlYnVnU3RyaW5nKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvcHJvcGVydGllcy9zaXRlbWFwLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3Byb3BlcnRpZXMvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2JkMTJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvcHJvcGVydGllcy9zaXRlbWFwLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0gIDxtYXA6Y29tcG9uZW50cz4KLSAgICA8bWFwOmdlbmVyYXRvcnMgZGVmYXVsdD0iZmlsZSI+Ci0gICAgICA8bWFwOmdlbmVyYXRvciBuYW1lPSJtb2R1bGUiIAotICAgICAgICBzcmM9Im9yZy5hcGFjaGUuZm9ycmVzdC5nZW5lcmF0aW9uLk1vZHVsZUdlbmVyYXRvciIvPgotICAgIDwvbWFwOmdlbmVyYXRvcnM+Ci0gIDwvbWFwOmNvbXBvbmVudHM+Ci0gIDxtYXA6cGlwZWxpbmVzPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gaW5wdXQtbW9kdWxlIHByb3BlcnRpZXMgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJpbnB1dC1tb2R1bGUuKi5wcm9wZXJ0aWVzLnhtbCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ibW9kdWxlIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJpbnB1dC1tb2R1bGUiIHZhbHVlPSJ7MX0iLz4KLSAgICAgICAgPC9tYXA6Z2VuZXJhdGU+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtYXJjaGl2ZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1hcmNoaXZlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGJjYzMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1hcmNoaXZlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3NpdGVtYW5hZ2VtZW50LmFyY2hpdmUnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ic2l0ZW1hbmFnZW1lbnQuYXJjaGl2ZSIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5BcmNoaXZlIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9hcmNoaXZlLmp4Ii8+DQotICAgICAgPGV4aXQgdXNlY2FzZT0idGFiLm92ZXJ2aWV3IiAvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWNoYW5nZUxhYmVsLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWNoYW5nZUxhYmVsLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWVhZTViLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1jaGFuZ2VMYWJlbC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdzaXRlbWFuYWdlbWVudC5jaGFuZ2VMYWJlbCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJzaXRlbWFuYWdlbWVudC5jaGFuZ2VMYWJlbCIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DaGFuZ2VMYWJlbCI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY2hhbmdlTGFiZWwuangiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1jaGFuZ2VOb2RlSUQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtY2hhbmdlTm9kZUlELnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTMxNWE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1jaGFuZ2VOb2RlSUQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnc2l0ZW1hbmFnZW1lbnQuY2hhbmdlTm9kZUlEJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InNpdGVtYW5hZ2VtZW50LmNoYW5nZU5vZGVJRCIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DaGFuZ2VOb2RlSUQiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NoYW5nZU5vZGVJRC5qeCIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWNoYW5nZVZpc2liaWxpdHkueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtY2hhbmdlVmlzaWJpbGl0eS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3ZmIxYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtY2hhbmdlVmlzaWJpbGl0eS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdzaXRlbWFuYWdlbWVudC5jaGFuZ2VWaXNpYmlsaXR5J10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InNpdGVtYW5hZ2VtZW50LmNoYW5nZVZpc2liaWxpdHkiIGxvZ2dlcj0ibGVueWEuc2l0ZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuQ2hhbmdlVmlzaWJpbGl0eSIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtY29weS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1jb3B5Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTJmNmQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1jb3B5Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3NpdGVtYW5hZ2VtZW50LmNvcHknXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ic2l0ZW1hbmFnZW1lbnQuY29weSIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5Db3B5Ij4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9jb3B5Lmp4Ii8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtY3JlYXRlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWNyZWF0ZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0MjRmMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtY3JlYXRlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3NpdGVtYW5hZ2VtZW50LmNyZWF0ZSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJzaXRlbWFuYWdlbWVudC5jcmVhdGUiIGxvZ2dlcj0ibGVueWEuc2l0ZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuQ3JlYXRlRG9jdW1lbnQiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NyZWF0ZS5qeCIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWNyZWF0ZUxhbmd1YWdlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWNyZWF0ZUxhbmd1YWdlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGZhNTg5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1jcmVhdGVMYW5ndWFnZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdzaXRlbWFuYWdlbWVudC5jcmVhdGVMYW5ndWFnZSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJzaXRlbWFuYWdlbWVudC5jcmVhdGVMYW5ndWFnZSIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DcmVhdGVMYW5ndWFnZSI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY3JlYXRlTGFuZ3VhZ2UuangiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1jdXQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtY3V0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlMDI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1jdXQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnc2l0ZW1hbmFnZW1lbnQuY3V0J10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InNpdGVtYW5hZ2VtZW50LmN1dCIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DdXQiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2N1dC5qeCIvPg0KLSAgICAgIDxleGl0IHVzZWNhc2U9InRhYi5vdmVydmlldyIgLz4gIA0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWRlbGV0ZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1kZWxldGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZTA3ZmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWRlbGV0ZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdzaXRlbWFuYWdlbWVudC5kZWxldGUnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ic2l0ZW1hbmFnZW1lbnQuZGVsZXRlIiBsb2dnZXI9ImxlbnlhLnNpdGUiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLkRlbGV0ZSI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvZGVsZXRlLmp4Ii8+DQotICAgICAgPGV4aXQgdXNlY2FzZT0idGFiLm92ZXJ2aWV3IiAvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWRlbGV0ZUxhbmd1YWdlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLWRlbGV0ZUxhbmd1YWdlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTBjNWQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1kZWxldGVMYW5ndWFnZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdzaXRlbWFuYWdlbWVudC5kZWxldGVMYW5ndWFnZSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJzaXRlbWFuYWdlbWVudC5kZWxldGVMYW5ndWFnZSIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5EZWxldGVMYW5ndWFnZSI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvZGVsZXRlTGFuZ3VhZ2UuangiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1mb3JjZUNoZWNrSW4ueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtZm9yY2VDaGVja0luLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM2ZjEyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1mb3JjZUNoZWNrSW4ueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3NpdGVtYW5hZ2VtZW50LmZvcmNlQ2hlY2tJbiddIj4NCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ic2l0ZW1hbmFnZW1lbnQuZm9yY2VDaGVja0luIiBsb2dnZXI9ImxlbnlhLnNpdGUiCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuRm9yY2VDaGVja0luIj4NCi0gICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvZm9yY2VDaGVja0luLmp4Ii8+DQotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi08L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1wYXN0ZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1wYXN0ZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlNmVkZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtcGFzdGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnc2l0ZW1hbmFnZW1lbnQucGFzdGUnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ic2l0ZW1hbmFnZW1lbnQucGFzdGUiIGxvZ2dlcj0ibGVueWEuc2l0ZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuUGFzdGUiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL3Bhc3RlLmp4Ii8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS91c2VjYXNlLXNpdGUtcmVzdG9yZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1yZXN0b3JlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBkZWNjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1yZXN0b3JlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3NpdGVtYW5hZ2VtZW50LnJlc3RvcmUnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ic2l0ZW1hbmFnZW1lbnQucmVzdG9yZSIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5SZXN0b3JlIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9yZXN0b3JlLmp4Ii8+DQotICAgICAgPGV4aXQgdXNlY2FzZT0idGFiLm92ZXJ2aWV3IiAvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLXJvbGxiYWNrLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3NpdGUvdXNlY2FzZS1zaXRlLXJvbGxiYWNrLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmMzMDE2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9zaXRlL3VzZWNhc2Utc2l0ZS1yb2xsYmFjay54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdzaXRlbWFuYWdlbWVudC5yb2xsYmFjayddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJzaXRlbWFuYWdlbWVudC5yb2xsYmFjayIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5Sb2xsYmFjayI+Ci0gICAgICA8cGFyYW1ldGVyIG5hbWU9IndvcmtmbG93RXZlbnQiIHZhbHVlPSJlZGl0Ii8+DQotICAgICAgPGV4aXQgdXNlY2FzZT0idGFiLnJldmlzaW9ucyIgLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdGFicy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdGFicy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2MmU2ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3RhYnMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vZ3VpLW1hbmFnZXIiIHVubGVzcz0iL2NvY29vbi9ndWktbWFuYWdlci90YWItZ3JvdXBbQG5hbWUgPSAnc2l0ZSddIj4NCi0gICAgPHRhYi1ncm91cCBuYW1lPSJzaXRlIj4NCi0gICAgICA8dGFiIG5hbWU9Im92ZXJ2aWV3IiBsYWJlbD0iT3ZlcnZpZXciIHVzZWNhc2U9InRhYi5vdmVydmlldyIvPg0KLSAgICAgIDx0YWIgbmFtZT0ibWV0YSIgbGFiZWw9Ik1ldGEiIHVzZWNhc2U9InRhYi5tZXRhIi8+DQotICAgICAgPHRhYiBuYW1lPSJhc3NldHMiIGxhYmVsPSJBc3NldHMiIHVzZWNhc2U9InRhYi5hc3NldHMiLz4NCi0gICAgICA8dGFiIG5hbWU9IndvcmtmbG93IiBsYWJlbD0iV29ya2Zsb3ciIHVzZWNhc2U9InRhYi53b3JrZmxvdyIvPg0KLSAgICAgIDx0YWIgbmFtZT0icmV2aXNpb25zIiBsYWJlbD0iUmV2aXNpb25zIiB1c2VjYXNlPSJ0YWIucmV2aXNpb25zIi8+DQotICAgICAgPHRhYiBuYW1lPSJhY0F1dGhvcmluZyIgbGFiZWw9IkFDIEF1dGgiIHVzZWNhc2U9InRhYi5hY0F1dGhvcmluZyI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFjQXJlYSIgdmFsdWU9ImF1dGhvcmluZyIvPg0KLSAgICAgIDwvdGFiPg0KLSAgICAgIDx0YWIgbmFtZT0iYWNUcmFzaCIgbGFiZWw9IkFDIFRyYXNoIiB1c2VjYXNlPSJ0YWIuYWNUcmFzaCI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFjQXJlYSIgdmFsdWU9InRyYXNoIi8+DQotICAgICAgPC90YWI+DQotICAgICAgPHRhYiBuYW1lPSJhY0FyY2hpdmUiIGxhYmVsPSJBQyBBcmNoaXZlIiB1c2VjYXNlPSJ0YWIuYWNBcmNoaXZlIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYWNBcmVhIiB2YWx1ZT0iYXJjaGl2ZSIvPg0KLSAgICAgIDwvdGFiPg0KLSAgICAgIDx0YWIgbmFtZT0iYWNMaXZlIiBsYWJlbD0iQUMgTGl2ZSIgdXNlY2FzZT0idGFiLmFjTGl2ZSIvPg0KLSAgICAgIDx0YWIgbmFtZT0ic2NoZWR1bGVyIiBsYWJlbD0iU2NoZWR1bGVyIiB1c2VjYXNlPSJ0YWIuc2NoZWR1bGVyIi8+DQotICAgIDwvdGFiLWdyb3VwPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3VzZWNhc2UtdGFiLWFjQXJjaGl2ZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItYWNBcmNoaXZlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE0M2ZiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItYWNBcmNoaXZlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3RhYi5hY0FyY2hpdmUnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0idGFiLmFjQXJjaGl2ZSIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuQWNjZXNzQ29udHJvbCI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY0FyY2hpdmUuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0ic2l0ZSIgbmFtZT0iYWNBcmNoaXZlIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYWNBcmVhIiB2YWx1ZT0iYXJjaGl2ZSIvPg0KLSAgICAgIDxleGl0IHVzZWNhc2U9InRhYi5hY0FyY2hpdmUiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItYWNBdXRob3JpbmcueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3VzZWNhc2UtdGFiLWFjQXV0aG9yaW5nLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTFhZmU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItYWNBdXRob3JpbmcueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAndGFiLmFjQXV0aG9yaW5nJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InRhYi5hY0F1dGhvcmluZyIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZXMuQWNjZXNzQ29udHJvbCI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY0F1dGhvcmluZy5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJzaXRlIiBuYW1lPSJhY0F1dGhvcmluZyIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8cGFyYW1ldGVyIG5hbWU9ImFjQXJlYSIgdmFsdWU9ImF1dGhvcmluZyIvPg0KLSAgICAgIDxleGl0IHVzZWNhc2U9InRhYi5hY0F1dGhvcmluZyIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi1hY0xpdmUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3VzZWNhc2UtdGFiLWFjTGl2ZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0ZThkZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3VzZWNhc2UtdGFiLWFjTGl2ZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd0YWIuYWNMaXZlJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InRhYi5hY0xpdmUiIGxvZ2dlcj0ibGVueWEuc2l0ZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2VzLkFjY2Vzc0NvbnRyb2wiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYWNMaXZlLmp4IiBtZW51PSJ0cnVlIj4NCi0gICAgICAgIDx0YWIgZ3JvdXA9InNpdGUiIG5hbWU9ImFjTGl2ZSIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8cGFyYW1ldGVyIG5hbWU9ImFjQXJlYSIgdmFsdWU9ImxpdmUiLz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJ0YWIuYWNMaXZlIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3VzZWNhc2UtdGFiLWFjVHJhc2gueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3VzZWNhc2UtdGFiLWFjVHJhc2gueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZmY5NWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi1hY1RyYXNoLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3RhYi5hY1RyYXNoJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InRhYi5hY1RyYXNoIiBsb2dnZXI9ImxlbnlhLnNpdGUiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlcy5BY2Nlc3NDb250cm9sIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2FjVHJhc2guangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0ic2l0ZSIgbmFtZT0iYWNUcmFzaCIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8cGFyYW1ldGVyIG5hbWU9ImFjQXJlYSIgdmFsdWU9InRyYXNoIi8+DQotICAgICAgPGV4aXQgdXNlY2FzZT0idGFiLmFjVHJhc2giLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItYXNzZXRzLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi1hc3NldHMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlM2QyZWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi1hc3NldHMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAndGFiLmFzc2V0cyddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ0YWIuYXNzZXRzIiBsb2dnZXI9ImxlbnlhLnNpdGUiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLkFzc2V0cyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hc3NldHMuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0ic2l0ZSIgbmFtZT0iYXNzZXRzIi8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9InRhYi5hc3NldHMiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItbWV0YS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItbWV0YS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjMjc0NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3VzZWNhc2UtdGFiLW1ldGEueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAndGFiLm1ldGEnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0idGFiLm1ldGEiIGxvZ2dlcj0ibGVueWEuc2l0ZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLnVzZWNhc2VzLk1ldGFkYXRhIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL21ldGEuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0ic2l0ZSIgbmFtZT0ibWV0YSIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJ0YWIubWV0YSIgLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItb3ZlcnZpZXcueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdGFiL3VzZWNhc2UtdGFiLW92ZXJ2aWV3Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdiYjU0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItb3ZlcnZpZXcueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAndGFiLm92ZXJ2aWV3J10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InRhYi5vdmVydmlldyIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5PdmVydmlldyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9vdmVydmlldy5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJzaXRlIiBuYW1lPSJvdmVydmlldyIvPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJ0YWIub3ZlcnZpZXciLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItcmV2aXNpb25zLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi1yZXZpc2lvbnMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OGNkOTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi1yZXZpc2lvbnMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAndGFiLnJldmlzaW9ucyddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ0YWIucmV2aXNpb25zIiBsb2dnZXI9ImxlbnlhLnNpdGUiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLlJldmlzaW9ucyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9yZXZpc2lvbnMuangiIG1lbnU9InRydWUiPg0KLSAgICAgICAgPHRhYiBncm91cD0ic2l0ZSIgbmFtZT0icmV2aXNpb25zIi8+DQotICAgICAgPC92aWV3PgotICAgICAgPHBhcmFtZXRlciBuYW1lPSJ3b3JrZmxvd0V2ZW50IiB2YWx1ZT0iZWRpdCIvPg0KLSAgICAgIDxleGl0IHVzZWNhc2U9InRhYi5yZXZpc2lvbnMiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItc2NoZWR1bGVyLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi1zY2hlZHVsZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTA3OWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi1zY2hlZHVsZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAndGFiLndvcmtmbG93J10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InRhYi5zY2hlZHVsZXIiIGxvZ2dlcj0ibGVueWEuc2l0ZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2Uuc2NoZWR1bGluZy5NYW5hZ2VKb2JzIj4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3NjaGVkdWxlci5qeCIgbWVudT0idHJ1ZSI+DQotICAgICAgICA8dGFiIGdyb3VwPSJzaXRlIiBuYW1lPSJzY2hlZHVsZXIiLz4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPGV4aXQgdXNlY2FzZT0idGFiLnNjaGVkdWxlciIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi13b3JrZmxvdy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi90YWIvdXNlY2FzZS10YWItd29ya2Zsb3cueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMGNmYzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvY29jb29uLXhjb25mL3RhYi91c2VjYXNlLXRhYi13b3JrZmxvdy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd0YWIud29ya2Zsb3cnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0idGFiLndvcmtmbG93IiBsb2dnZXI9ImxlbnlhLnNpdGUiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlcy5IaXN0b3J5Ij4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3dvcmtmbG93Lmp4IiBtZW51PSJ0cnVlIj4NCi0gICAgICAgIDx0YWIgZ3JvdXA9InNpdGUiIG5hbWU9IndvcmtmbG93Ii8+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDxleGl0IHVzZWNhc2U9InRhYi53b3JrZmxvdyIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjQ4YzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnNpdGVtYW5hZ2VtZW50PC9pZD4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzIi8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnVzZWNhc2UiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMud29ya2Zsb3ciLz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5TaXRlIG1hbmFnZW1lbnQ8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPlNpdGUgbWFuYWdlbWVudCB1c2VjYXNlczwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvdXNlY2FzZXMvTWV0YWRhdGEuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWV0YWRhdGEvdXNlY2FzZXMvTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5NzdlZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL21ldGFkYXRhL3VzZWNhc2VzL01ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5TaXRlVXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuV29ya2Zsb3dVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzLlVzZWNhc2VXb3JrZmxvd0hlbHBlcjsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGVkaXQgbWV0YWRhdGEgZm9yIGEgcmVzb3VyY2UuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIE1ldGFkYXRhIGV4dGVuZHMgU2l0ZVVzZWNhc2UgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNnZXROb2Rlc1RvTG9jaygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgTm9kZVtdIG9iamVjdHMgPSBuZXcgTm9kZVswXTsKLSAgICAgICAgaWYoZ2V0U291cmNlRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvYmplY3RzID0gbmV3IE5vZGVbXSB7IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UmVwb3NpdG9yeU5vZGUoKSB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ldGFEYXRhV3JhcHBlciB7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZ1tdIHZhbHVlczsKLSAgICAgICAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTWV0YURhdGFXcmFwcGVyKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nW10gdmFsdWVzKSB7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICAKLSAgICAgICAgaWYgKGdldFNvdXJjZURvY3VtZW50KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTWV0YURhdGFSZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWdpc3RyeSA9IChNZXRhRGF0YVJlZ2lzdHJ5KSB0aGlzLm1hbmFnZXIubG9va3VwKE1ldGFEYXRhUmVnaXN0cnkuUk9MRSk7Ci0KLSAgICAgICAgICAgIExpc3QgbnVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIE1hcCBudW0ybmFtZXNwYWNlID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIExpc3Qga2V5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gbmFtZXNwYWNlcyA9IHJlZ2lzdHJ5LmdldE5hbWVzcGFjZVVyaXMoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgbnNJbmRleCA9IDA7IG5zSW5kZXggPCBuYW1lc3BhY2VzLmxlbmd0aDsgbnNJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgTWV0YURhdGEgbWV0YSA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0TWV0YURhdGEobmFtZXNwYWNlc1tuc0luZGV4XSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5cyA9IG1ldGEuZ2V0UG9zc2libGVLZXlzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQga2V5SW5kZXggPSAwOyBrZXlJbmRleCA8IGtleXMubGVuZ3RoOyBrZXlJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAibnMiICsgbnNJbmRleCArICIuIiArIGtleXNba2V5SW5kZXhdOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBtZXRhLmdldFZhbHVlcyhrZXlzW2tleUluZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG1ldGEuZ2V0RWxlbWVudFNldCgpLmdldEVsZW1lbnQoa2V5c1trZXlJbmRleF0pOwotICAgICAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoa2V5LCBuZXcgTWV0YURhdGFXcmFwcGVyKGVsZW1lbnQsIHZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBrZXlMaXN0LmFkZChrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBudW1iZXJzLmFkZCgiIiArIG5zSW5kZXgpOwotICAgICAgICAgICAgICAgIG51bTJuYW1lc3BhY2UucHV0KCIiICsgbnNJbmRleCwgbmFtZXNwYWNlc1tuc0luZGV4XSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFBhcmFtZXRlcigibnVtYmVycyIsIG51bWJlcnMpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJuYW1lc3BhY2VzIiwgbnVtMm5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoa2V5TGlzdCk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoImtleXMiLCBrZXlMaXN0KTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIlVuYWJsZSB0byBsb2FkIG1ldGEgZGF0YS4iLCBlKTsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVW5hYmxlIHRvIGxvYWQgbWV0YSBkYXRhOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZWdpc3RyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWRvYy5nZXRBcmVhKCkuZXF1YWxzKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBpbiB0aGUgYXV0aG9yaW5nIGFyZWEhIik7Ci0gICAgICAgIH0KLSAgICAgICAgVXNlY2FzZVdvcmtmbG93SGVscGVyLmNoZWNrV29ya2Zsb3codGhpcy5tYW5hZ2VyLCB0aGlzLCBnZXRFdmVudCgpLCBkb2MsCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgLy8gd2UgbmVlZCBhIHJldmVyc2UgbG9va3VwIHRvIGdldCB0aGUgY29ycmVjdCBucyBpbmRleDoKLSAgICAgICAgTWFwIG51bTJuYW1lc3BhY2UgPSAoTWFwKSBnZXRQYXJhbWV0ZXIoIm5hbWVzcGFjZXMiKTsKLSAgICAgICAgTWFwIG5hbWVzcGFjZTJudW0gPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBudW0ybmFtZXNwYWNlLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgbmFtZXNwYWNlMm51bS5wdXQobnVtMm5hbWVzcGFjZS5nZXQoa2V5KSwga2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgU3RyaW5nW10gbmFtZXNwYWNlcyA9IGRvY3VtZW50LmdldE1ldGFEYXRhTmFtZXNwYWNlVXJpcygpOwotCi0gICAgICAgIGZvciAoaW50IG5zSW5kZXggPSAwOyBuc0luZGV4IDwgbmFtZXNwYWNlcy5sZW5ndGg7IG5zSW5kZXgrKykgewotICAgICAgICAgICAgTWV0YURhdGEgbWV0YSA9IGRvY3VtZW50LmdldE1ldGFEYXRhKG5hbWVzcGFjZXNbbnNJbmRleF0pOwotICAgICAgICAgICAgU3RyaW5nIG9yZ05zSW5kZXggPSAoU3RyaW5nKSBuYW1lc3BhY2UybnVtLmdldChuYW1lc3BhY2VzW25zSW5kZXhdKTsKLQotICAgICAgICAgICAgU3RyaW5nW10ga2V5cyA9IG1ldGEuZ2V0UG9zc2libGVLZXlzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBrZXlJbmRleCA9IDA7IGtleUluZGV4IDwga2V5cy5sZW5ndGg7IGtleUluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0ga2V5c1trZXlJbmRleF07Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbWV0YS5nZXRFbGVtZW50U2V0KCkuZ2V0RWxlbWVudChrZXkpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzRWRpdGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRQYXJhbWV0ZXIoIm5zIiArIG9yZ05zSW5kZXggKyAiLiIgKyBrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRWYWx1ZShrZXksIChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBkb2N1bWVudCwgZ2V0RXZlbnQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuICJlZGl0IjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9BcmNoaXZlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQXJjaGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGMxMjQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9BcmNoaXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotCi0vKioKLSAqIEFyY2hpdmUgdXNlY2FzZSBoYW5kbGVyLgotICogCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZSBleHRlbmRzIE1vdmVTdWJzaXRlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5Nb3ZlU3Vic2l0ZSNnZXRTb3VyY2VBcmVhcygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFNvdXJjZUFyZWFzKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuTW92ZVN1YnNpdGUjZ2V0VGFyZ2V0QXJlYSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRBcmVhKCkgewotICAgICAgICByZXR1cm4gUHVibGljYXRpb24uQVJDSElWRV9BUkVBOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5Nb3ZlU3Vic2l0ZSNnZXRFdmVudCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuICJhcmNoaXZlIjsKLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9Bc3NldHMuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9Bc3NldHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkMDlhYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQXNzZXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZTsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGFkZCBBc3NldHMgdG8gYSByZXNvdXJjZS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQXNzZXRzIGV4dGVuZHMgU2l0ZVVzZWNhc2UgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgaWYgKGdldFNvdXJjZURvY3VtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudFtdIHJlc291cmNlRG9jcyA9IGdldFJlc291cmNlRG9jdW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJyZXNvdXJjZURvY3VtZW50cyIsIHJlc291cmNlRG9jcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50W10gZ2V0UmVzb3VyY2VEb2N1bWVudHMoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24sIFNpdGVFeGNlcHRpb24gewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIERvY3VtZW50W10gZG9jcyA9IGdldFNvdXJjZURvY3VtZW50KCkuYXJlYSgpLmdldERvY3VtZW50cygpOwotICAgICAgICBTaXRlTm9kZSBub2RlID0gZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRMaW5rKCkuZ2V0Tm9kZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChkb2NzW2ldLmhhc0xpbmsoKSAmJiAhZG9jc1tpXS5nZXRMaW5rKCkuZ2V0Tm9kZSgpLmlzVG9wTGV2ZWwoKQotICAgICAgICAgICAgICAgICAgICAmJiBkb2NzW2ldLmdldExpbmsoKS5nZXROb2RlKCkuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpLmVxdWFscyhub2RlLmdldFBhdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgZG9jc1tpXS5nZXRSZXNvdXJjZVR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJyZXNvdXJjZSIpKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoZG9jc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChEb2N1bWVudFtdKSBsaXN0LnRvQXJyYXkobmV3IERvY3VtZW50W2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ2hhbmdlTGFiZWwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DaGFuZ2VMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWUwOGNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DaGFuZ2VMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Eb2N1bWVudFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LldvcmtmbG93VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlcy5Vc2VjYXNlV29ya2Zsb3dIZWxwZXI7Ci0KLS8qKgotICogQ2hhbmdlIHRoZSBsYWJlbCBvZiBhIGRvY3VtZW50LgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VMYWJlbCBleHRlbmRzIERvY3VtZW50VXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfSUQgPSAiZG9jdW1lbnRJZCI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gImVkaXQiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIGlmIChoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKCFnZXRTb3VyY2VEb2N1bWVudCgpLmdldEFyZWEoKS5lcXVhbHMoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgdXNlY2FzZSBjYW4gb25seSBiZSBpbnZva2VkIGluIHRoZSBhdXRob3JpbmcgYXJlYSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVzZWNhc2VXb3JrZmxvd0hlbHBlci5jaGVja1dvcmtmbG93KHRoaXMubWFuYWdlciwgdGhpcywgZ2V0RXZlbnQoKSwgZG9jLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZihnZXRTb3VyY2VEb2N1bWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNpdGVTdHJ1Y3R1cmUgc3RydWN0dXJlID0gZ2V0U291cmNlRG9jdW1lbnQoKS5hcmVhKCkuZ2V0U2l0ZSgpOwotICAgICAgICAgICAgbm9kZXMuYWRkKHN0cnVjdHVyZS5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgfSAgICAKLQotICAgICAgICByZXR1cm4gKE5vZGVbXSkgbm9kZXMudG9BcnJheShuZXcgTm9kZVtub2Rlcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2luaXRQYXJhbWV0ZXJzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRE9DVU1FTlRfSUQsIGRvY3VtZW50LmdldFVVSUQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKExBQkVMLCBkb2N1bWVudC5nZXRMaW5rKCkuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoTEFCRUwpOwotICAgICAgICBpZiAobGFiZWwudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgibWlzc2luZy1uYXZpZ2F0aW9uLXRpdGxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhMQUJFTCkudHJpbSgpOwotICAgICAgICBkb2N1bWVudC5nZXRMaW5rKCkuc2V0TGFiZWwobGFiZWwpOwotCi0gICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBkb2N1bWVudCwgZ2V0RXZlbnQoKSk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ2hhbmdlTm9kZUlELmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ2hhbmdlTm9kZUlELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjA2NDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NoYW5nZU5vZGVJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuTm9kZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkRvY3VtZW50VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDaGFuZ2UgdGhlIG5vZGUgSUQgb2YgYSBkb2N1bWVudC4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlTm9kZUlEIGV4dGVuZHMgRG9jdW1lbnRVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfSUQgPSAibm9kZUlkIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoTk9ERV9JRCwgZG9jdW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZ2V0Tm9kZXNUb0xvY2soKQotICAgICAqLwotICAgIHByb3RlY3RlZCBOb2RlW10gZ2V0Tm9kZXNUb0xvY2soKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYoZ2V0U291cmNlRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBzaXRlTm9kZSA9IGdldFNvdXJjZURvY3VtZW50KCkuYXJlYSgpLmdldFNpdGUoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpOwotICAgICAgICAgICAgICAgIG5vZGVzLmFkZChzaXRlTm9kZSk7Ci0KLSAgICAgICAgICAgICAgICBEb2N1bWVudCBzb3VyY2VEb2N1bWVudCA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gIAotICAgICAgICAgICAgICAgIE5vZGVTZXQgc3Vic2l0ZSA9IFNpdGVVdGlsLmdldFN1YlNpdGUodGhpcy5tYW5hZ2VyLCBzb3VyY2VEb2N1bWVudC5nZXRMaW5rKCkuZ2V0Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKE5vZGVJdGVyYXRvciBpID0gc3Vic2l0ZS5hc2NlbmRpbmcoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNpdGVOb2RlIG5vZGUgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gbm9kZS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBsYW5ndWFnZXMubGVuZ3RoOyBsKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TGluayhsYW5ndWFnZXNbbF0pLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5hZGQoZG9jLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVzZWNhc2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKE5vZGVbXSkgbm9kZXMudG9BcnJheShuZXcgTm9kZVtub2Rlcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRBbGxMYW5ndWFnZVZlcnNpb25Ob2RlcyhEb2N1bWVudCBkb2MpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFRyYW5zYWN0aW9uRXhjZXB0aW9uLCBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gZG9jLmdldExhbmd1YWdlcygpOwotICAgICAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhbmd1YWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbm9kZXMuYWRkKGRvYy5nZXRUcmFuc2xhdGlvbihsYW5ndWFnZXNbaV0pLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub2RlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvQ2hlY2tQcmVjb25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotICAgICAgICBpZiAoaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRBcmVhKCkuZXF1YWxzKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBpbiB0aGUgYXV0aG9yaW5nIGFyZWEhIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0U291cmNlRG9jdW1lbnQoKS5leGlzdHNBcmVhVmVyc2lvbihQdWJsaWNhdGlvbi5MSVZFX0FSRUEpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2Fubm90IGJlIGludm9rZWQgd2hlbiB0aGUgbGl2ZSB2ZXJzaW9uIGV4aXN0cyEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCk7Ci0KLSAgICAgICAgU3RyaW5nIG5vZGVJZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKE5PREVfSUQpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UHVibGljYXRpb24oKS5nZXREb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgaWYgKCFidWlsZGVyLmlzVmFsaWREb2N1bWVudE5hbWUobm9kZUlkKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGUgZG9jdW1lbnQgSUQgaXMgbm90IHZhbGlkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHRhcmdldCA9IGdldFRhcmdldExvY2F0b3IoKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldERvY3VtZW50RmFjdG9yeSgpLmdldFB1YmxpY2F0aW9uKHRhcmdldC5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzaXRlID0gcHViLmdldEFyZWEodGFyZ2V0LmdldEFyZWEoKSkuZ2V0U2l0ZSgpOwotICAgICAgICAgICAgaWYgKHNpdGUuY29udGFpbnModGFyZ2V0LmdldFBhdGgoKSwgdGFyZ2V0LmdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGUgZG9jdW1lbnQgZG9lcyBhbHJlYWR5IGV4aXN0LiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50TG9jYXRvciBnZXRUYXJnZXRMb2NhdG9yKCkgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24sIFNpdGVFeGNlcHRpb24sCi0gICAgICAgICAgICBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBub2RlSWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhOT0RFX0lEKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgRG9jdW1lbnRMb2NhdG9yIGxvYyA9IERvY3VtZW50TG9jYXRvci5nZXRMb2NhdG9yKGRvYy5nZXRQdWJsaWNhdGlvbigpLmdldElkKCksIGRvYwotICAgICAgICAgICAgICAgIC5nZXRBcmVhKCksIGRvYy5nZXRQYXRoKCksIGRvYy5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHBhcmVudCA9IGxvYy5nZXRQYXJlbnQoKTsKLSAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRDaGlsZChub2RlSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgdGFyZ2V0RG9jOwotICAgICAgICBEb2N1bWVudCBzb3VyY2UgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBEb2N1bWVudExvY2F0b3IgdGFyZ2V0ID0gZ2V0VGFyZ2V0TG9jYXRvcigpOwotICAgICAgICBEb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY3VtZW50TWFuYWdlciA9IChEb2N1bWVudE1hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoRG9jdW1lbnRNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgZG9jdW1lbnRNYW5hZ2VyLm1vdmVBbGwoc291cmNlLmFyZWEoKSwgc291cmNlLmdldFBhdGgoKSwgc291cmNlLmFyZWEoKSwgdGFyZ2V0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQYXRoKCkpOwotICAgICAgICAgICAgdGFyZ2V0RG9jID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCkuZ2V0KHRhcmdldCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShkb2N1bWVudE1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VGFyZ2V0RG9jdW1lbnQodGFyZ2V0RG9jKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgZG9jdW1lbnQgd2hlbiB0aGUgbm9kZSBJRCB3b3VsZCBiZSBjaGFuZ2VkLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld0RvY3VtZW50SWQoKSB7Ci0gICAgICAgIFN0cmluZyBub2RlSWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhOT0RFX0lEKTsKLQotICAgICAgICBTdHJpbmcgb2xkUGF0aDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9sZFBhdGggPSBnZXRTb3VyY2VEb2N1bWVudCgpLmdldFBhdGgoKTsKLSAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGxhc3RTbGFzaEluZGV4ID0gb2xkUGF0aC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICBTdHJpbmcgc3RyaXBwZWREb2N1bWVudElkID0gb2xkUGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoSW5kZXggKyAxKTsKLSAgICAgICAgU3RyaW5nIG5ld0RvY3VtZW50SWQgPSBzdHJpcHBlZERvY3VtZW50SWQgKyBub2RlSWQ7Ci0KLSAgICAgICAgcmV0dXJuIG5ld0RvY3VtZW50SWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NoYW5nZVZpc2liaWxpdHkuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DaGFuZ2VWaXNpYmlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDU0Y2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NoYW5nZVZpc2liaWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkRvY3VtZW50VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuV29ya2Zsb3dVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzLlVzZWNhc2VXb3JrZmxvd0hlbHBlcjsKLQotLyoqCi0gKiBTd2l0Y2ggdGhlIG5hdmlnYXRpb24gdmlzaWJpbGl0eSBvZiBhIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlVmlzaWJpbGl0eSBleHRlbmRzIERvY3VtZW50VXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gImVkaXQiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIGlmIChoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKCFnZXRTb3VyY2VEb2N1bWVudCgpLmdldEFyZWEoKS5lcXVhbHMoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgdXNlY2FzZSBjYW4gb25seSBiZSBpbnZva2VkIGluIHRoZSBhdXRob3JpbmcgYXJlYSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IGRvYy5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ndWFnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIERvY3VtZW50IHZlcnNpb24gPSBkb2MuZ2V0VHJhbnNsYXRpb24obGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgIFVzZWNhc2VXb3JrZmxvd0hlbHBlci5jaGVja1dvcmtmbG93KHRoaXMubWFuYWdlciwgdGhpcywgZ2V0RXZlbnQoKSwgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBTaXRlTm9kZSBub2RlID0gZG9jLmdldExpbmsoKS5nZXROb2RlKCk7Ci0gICAgICAgIG5vZGUuc2V0VmlzaWJsZSghbm9kZS5pc1Zpc2libGUoKSk7Ci0KLSAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gZG9jLmdldExhbmd1YWdlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhbmd1YWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRG9jdW1lbnQgdmVyc2lvbiA9IGRvYy5nZXRUcmFuc2xhdGlvbihsYW5ndWFnZXNbaV0pOwotICAgICAgICAgICAgV29ya2Zsb3dVdGlsLmludm9rZSh0aGlzLm1hbmFnZXIsIGdldFNlc3Npb24oKSwgZ2V0TG9nZ2VyKCksIHZlcnNpb24sIGdldEV2ZW50KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNnZXROb2Rlc1RvTG9jaygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYoZ2V0U291cmNlRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTaXRlU3RydWN0dXJlIHN0cnVjdHVyZSA9IGdldFNvdXJjZURvY3VtZW50KCkuYXJlYSgpLmdldFNpdGUoKTsKLSAgICAgICAgICAgIG5vZGVzLmFkZChzdHJ1Y3R1cmUuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKE5vZGVbXSkgbm9kZXMudG9BcnJheShuZXcgTm9kZVtub2Rlcy5zaXplKCldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DbGlwYm9hcmQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DbGlwYm9hcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3NGRjYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ2xpcGJvYXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotCi0vKioKLSAqIENsaXBib2FyZCBmb3IgY3V0L2NvcHkvcGFzdGUgb2YgZG9jdW1lbnRzLiBUaGUgY2xpcHBpbmcgbWV0aG9kIGlzIGVpdGhlciB7QGxpbmsgI01FVEhPRF9DVVR9IG9yCi0gKiB7QGxpbmsgI01FVEhPRF9DT1BZfS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHB1YmxpY2F0aW9uSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXJlYTsKLSAgICBwcml2YXRlIFN0cmluZyB1dWlkOwotICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlOwotICAgIHByaXZhdGUgaW50IG1ldGhvZDsKLQotICAgIC8qKgotICAgICAqIFRoZSAiY3V0IiBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0NVVCA9IDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlICJjb3B5IiBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0NPUFkgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIHB1dCBvbiB0aGUgY2xpcGJvYXJkLgotICAgICAqIEBwYXJhbSBfbWV0aG9kIFRoZSBjbGlwcGluZyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIENsaXBib2FyZChEb2N1bWVudCBkb2N1bWVudCwgaW50IF9tZXRob2QpIHsKLSAgICAgICAgdGhpcy5wdWJsaWNhdGlvbklkID0gZG9jdW1lbnQuZ2V0UHVibGljYXRpb24oKS5nZXRJZCgpOwotICAgICAgICB0aGlzLmFyZWEgPSBkb2N1bWVudC5nZXRBcmVhKCk7Ci0gICAgICAgIHRoaXMudXVpZCA9IGRvY3VtZW50LmdldFVVSUQoKTsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGRvY3VtZW50LmdldExhbmd1YWdlKCk7Ci0gICAgICAgIHRoaXMubWV0aG9kID0gX21ldGhvZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBmb3IgdGhlIGN1cnJlbnQgaWRlbnRpdHkgbWFwLgotICAgICAqIEBwYXJhbSBpZGVudGl0eU1hcCBUaGUgaWRlbnRpdHkgbWFwLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQgY291bGQgbm90IGJlIGJ1aWx0LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudChEb2N1bWVudEZhY3RvcnkgaWRlbnRpdHlNYXAsIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uKSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gaWRlbnRpdHlNYXAuZ2V0KHB1YmxpY2F0aW9uLCB0aGlzLmFyZWEsIHRoaXMudXVpZCwgdGhpcy5sYW5ndWFnZSk7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGUgcHVibGljYXRpb24gdGhlIGRvY3VtZW50IGJlbG9uZ3MgdG8uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNhdGlvbklkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wdWJsaWNhdGlvbklkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGhvZCBvZiB0aGlzIGNsaXBib2FyZC4KLSAgICAgKiBAcmV0dXJuIEFuIGludGVnZXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NsaXBib2FyZEhlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NsaXBib2FyZEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTJhYTBlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DbGlwYm9hcmRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIGNsaXBib2FyZCBoYW5kbGluZy4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkSGVscGVyIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsaXBib2FyZCBhdHRhY2h0ZWQgdG8gdGhlIHNlc3Npb24uCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgY29udGFpbmluZyB0aGUgc2Vzc2lvbi4KLSAgICAgKiBAcmV0dXJuIEEgY2xpcGJvYXJkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNsaXBib2FyZCBpcyBhdHRhY2hlZCB0bwotICAgICAqICAgICAgICAgdGhlIHNlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIENsaXBib2FyZCBnZXRDbGlwYm9hcmQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldFNlc3Npb24oY29udGV4dCk7Ci0gICAgICAgIENsaXBib2FyZCBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkKSBzZXNzaW9uLmdldEF0dHJpYnV0ZShnZXRTZXNzaW9uQXR0cmlidXRlTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIGNsaXBib2FyZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBhdHRyaWJ1dGUgdG8gaG9sZCB0aGUgY2xpcGJvYXJkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2Vzc2lvbkF0dHJpYnV0ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBDbGlwYm9hcmQuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gb2YgdGhlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNlc3Npb24gZ2V0U2Vzc2lvbihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgTWFwIG9iamVjdE1vZGVsID0gQ29udGV4dEhlbHBlci5nZXRPYmplY3RNb2RlbChjb250ZXh0KTsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbih0cnVlKTsKLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGNsaXBib2FyZCB0byB0aGUgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dC4KLSAgICAgKiBAcGFyYW0gY2xpcGJvYXJkIFRoZSBjbGlwYm9hcmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZUNsaXBib2FyZChDb250ZXh0IGNvbnRleHQsIENsaXBib2FyZCBjbGlwYm9hcmQpIHsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0U2Vzc2lvbihjb250ZXh0KTsKLSAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkF0dHJpYnV0ZU5hbWUoKSwgY2xpcGJvYXJkKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgY2xpcGJvYXJkIGZyb20gdGhlIHNlc3Npb24uCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2xpcGJvYXJkKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRTZXNzaW9uKGNvbnRleHQpOwotICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShnZXRTZXNzaW9uQXR0cmlidXRlTmFtZSgpKTsKLSAgICB9Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NvcHkuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9Db3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOWI1MjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Eb2N1bWVudFVzZWNhc2U7Ci0KLS8qKgotICogQ29weSBhIGRvY3VtZW50IGludG8gdGhlIGNsaXBib2FyZC4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQ29weSBleHRlbmRzIERvY3VtZW50VXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotICAgICAgICBpZiAoaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWdldFNvdXJjZURvY3VtZW50KCkuZ2V0QXJlYSgpLmVxdWFscyhQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgib25seS1pbi1hdXRob3JpbmctYXJlYSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgCi0gICAgICAgIENsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGdldFNvdXJjZURvY3VtZW50KCksIENsaXBib2FyZC5NRVRIT0RfQ09QWSk7Ci0gICAgICAgIENsaXBib2FyZEhlbHBlciBoZWxwZXIgPSBuZXcgQ2xpcGJvYXJkSGVscGVyKCk7Ci0gICAgICAgIGhlbHBlci5zYXZlQ2xpcGJvYXJkKGdldENvbnRleHQoKSwgY2xpcGJvYXJkKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ3JlYXRlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ3JlYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjIzMDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5kdWJsaW5jb3JlLkR1YmxpbkNvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci0KLS8qKgotICogPHA+Ci0gKiBBYnN0cmFjdCBzdXBlcmNsYXNzIGZvciB1c2VjYXNlcyB0byBjcmVhdGUgYSBkb2N1bWVudC4KLSAqIDwvcD4KLSAqIDxwPgotICogWW91IGNhbiBwYXNzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpbnRvIHRoZSB1c2VjYXNlOgotICogPC9wPgotICogPHVsPgotICogPGxpPjxzdHJvbmc+cGF0aDwvc3Ryb25nPiAtIHRoZSBwYXRoIG9mIHRoZSBkb2N1bWVudCB0byBjcmVhdGUgKG9wdGlvbmFsKTwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDcmVhdGUgZXh0ZW5kcyBBYnN0cmFjdFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVFlQRVMgPSAicmVzb3VyY2VUeXBlcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdVQUdFUyA9ICJsYW5ndWFnZXMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAicGF0aCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9OQU1FID0gIm5vZGVOYW1lIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJQkxFSU5OQVYgPSAidmlzaWJsZUluTmF2IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTEUgPSAic2FtcGxlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTEVTID0gInNhbXBsZXMiOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3JlYXRlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0KLSAgICAgICAgaWYgKCFnZXRBcmVhKCkuZXF1YWxzKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBpbiB0aGUgYXV0aG9yaW5nIGFyZWEhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSBnZXRQdWJsaWNhdGlvbigpLmdldEFyZWEoZ2V0QXJlYSgpKS5nZXRTaXRlKCk7Ci0gICAgICAgICAgICBOb2RlW10gbm9kZXMgPSB7IHN0cnVjdHVyZS5nZXRSZXBvc2l0b3J5Tm9kZSgpIH07Ci0gICAgICAgICAgICByZXR1cm4gbm9kZXM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYXZpZ2F0aW9uVGl0bGUgPSBnZXREdWJsaW5Db3JlUGFyYW1ldGVyKER1YmxpbkNvcmUuRUxFTUVOVF9USVRMRSk7Ci0gICAgICAgIGlmIChuYXZpZ2F0aW9uVGl0bGUudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgibWlzc2luZy1uYXZpZ2F0aW9uLXRpdGxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0SW5pdGlhbERvY3VtZW50KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gc2FtcGxlcyA9IChTdHJpbmdbXSkgZ2V0UGFyYW1ldGVyKFNBTVBMRVMpOwotICAgICAgICAgICAgU3RyaW5nIHNhbXBsZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFNBTVBMRSk7Ci0gICAgICAgICAgICBpZiAoc2FtcGxlcyAhPSBudWxsICYmIHNhbXBsZXMubGVuZ3RoID4gMSAmJiAoc2FtcGxlID09IG51bGwgfHwgc2FtcGxlLmVxdWFscygiIikpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJtaXNzaW5nLXBhZ2UtbGF5b3V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNQYXRoVmFsaWQoKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBnZXROZXdEb2N1bWVudFBhdGgoKTsKLSAgICAgICAgICAgIFNpdGVTdHJ1Y3R1cmUgc2l0ZSA9IGdldFB1YmxpY2F0aW9uKCkuZ2V0QXJlYShnZXRBcmVhKCkpLmdldFNpdGUoKTsKLSAgICAgICAgICAgIGlmICghY3JlYXRlVmVyc2lvbigpICYmIHNpdGUuY29udGFpbnMocGF0aCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IHBhdGggfTsKLSAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoInBhdGgtYWxyZWFkeS1leGlzdHMiLCBwYXJhbXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lID0gZ2V0RG9jdW1lbnRUeXBlTmFtZSgpOwotICAgICAgICBpZiAoZ2V0UGFyYW1ldGVyQXNTdHJpbmcoU0FNUExFKSA9PSBudWxsICYmIGRvY3R5cGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluaXRTYW1wbGVQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHtAbGluayAjZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKX0gdG8gY2hlY2sgaWYKLSAgICAgKiB0aGUgcGF0aCBlbnRlcmVkIGJ5IHRoZSB1c2VyIGlzIHZhbGlkLiBJZiBub3QsIGNoZWNraW5nIHRoZSBleGlzdGVuY2Ugb2YKLSAgICAgKiB0aGUgbmV3IGRvY3VtZW50IGluIHRoZSBzaXRlIHN0cnVjdHVyZSBpcyBvbWl0dGVkIGJlY2F1c2UgdGhpcyBvcGVyYXRpb24KLSAgICAgKiBjb3VsZCBjYXVzZSBlcnJvcnMuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXRoVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIG5ldyBkb2N1bWVudAotICAgICAgICBEb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGRvY3VtZW50TWFuYWdlciA9IChEb2N1bWVudE1hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoRG9jdW1lbnRNYW5hZ2VyLlJPTEUpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhMQU5HVUFHRSk7Ci0gICAgICAgICAgICBEb2N1bWVudCBpbml0aWFsRG9jdW1lbnQgPSBnZXRJbml0aWFsRG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IGdldER1YmxpbkNvcmVQYXJhbWV0ZXIoRHVibGluQ29yZS5FTEVNRU5UX1RJVExFKS50cmltKCk7Ci0KLSAgICAgICAgICAgIGlmIChjcmVhdGVWZXJzaW9uKCkpIHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGRvY3VtZW50TWFuYWdlci5hZGRWZXJzaW9uKGluaXRpYWxEb2N1bWVudCwgZ2V0QXJlYSgpLCBsYW5ndWFnZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0TGluaygpLnNldExhYmVsKHRpdGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxEb2N1bWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvb2t1cChSZXNvdXJjZVR5cGUuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVR5cGUgPSAoUmVzb3VyY2VUeXBlKSBzZWxlY3Rvci5zZWxlY3QoZ2V0RG9jdW1lbnRUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNhbXBsZU5hbWUgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhTQU1QTEUsIHJlc291cmNlVHlwZS5nZXRTYW1wbGVOYW1lcygpWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLlNhbXBsZSBzYW1wbGUgPSByZXNvdXJjZVR5cGUuZ2V0U2FtcGxlKHNhbXBsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGRvY3VtZW50TWFuYWdlci5hZGQoZ2V0RG9jdW1lbnRGYWN0b3J5KCksIHJlc291cmNlVHlwZSwgc2FtcGxlLmdldFVyaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFB1YmxpY2F0aW9uKCksIGdldEFyZWEoKSwgZ2V0TmV3RG9jdW1lbnRQYXRoKCksIGxhbmd1YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZUV4dGVuc2lvbigpLCB0aXRsZSwgZ2V0VmlzaWJsZUluTmF2KCkpOwotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5zZXRNaW1lVHlwZShzYW1wbGUuZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQgPSBkb2N1bWVudE1hbmFnZXIuYWRkKGluaXRpYWxEb2N1bWVudCwgZ2V0QXJlYSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0RvY3VtZW50UGF0aCgpLCBsYW5ndWFnZSwgZ2V0U291cmNlRXh0ZW5zaW9uKCksIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZpc2libGVJbk5hdigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldE1ldGFEYXRhKGRvY3VtZW50KTsKLQotICAgICAgICAgICAgLy8gdGhlIGxvY2F0aW9uIHRvIG5hdmlnYXRlIHRvIGFmdGVyIGNvbXBsZXRpb24gb2YgdXNlY2FzZQotICAgICAgICAgICAgc2V0RGVmYXVsdFRhcmdldFVSTChkb2N1bWVudC5nZXRDYW5vbmljYWxXZWJhcHBVUkwoKSk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGRvY3VtZW50TWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHJlc291cmNlVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RHVibGluQ29yZVBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICBPYmplY3QgcGFyYW0gPSBnZXRQYXJhbWV0ZXIoRFVCTElOX0NPUkVfUFJFRklYICsgbmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsICYmIGdldFBhcmFtZXRlcihEVUJMSU5fQ09SRV9QUkVGSVggKyBuYW1lKS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gKFN0cmluZ1tdKSBnZXRQYXJhbWV0ZXIoRFVCTElOX0NPUkVfUFJFRklYICsgbmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgcGFyYW1WYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdmFsdWVzW2ldOwotICAgICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZS5hcHBlbmQoJywnKS5hcHBlbmQodmFsdWUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZS5hcHBlbmQodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBhcmFtVmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoRFVCTElOX0NPUkVfUFJFRklYICsgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RHVibGluQ29yZVBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHNldFBhcmFtZXRlcihEVUJMSU5fQ09SRV9QUkVGSVggKyBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY3JlYXRlVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50IHNvdXJjZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNvdXJjZUV4dGVuc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgY3JlYXRlZCBpbiB0aGUgdXNlY2FzZQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmV3RG9jdW1lbnROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgbmV3IGRvY3VtZW50IGJlaW5nIGNyZWF0ZWQgaW4gdGhlIHVzZWNhc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5ld0RvY3VtZW50UGF0aCgpOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGRvY3VtZW50IGNyZWF0ZWQgaW4gdGhlIHVzZWNhc2Ugc2hhbGwgaGF2ZSBpbml0aWFsIGNvbnRlbnRzIGNvcGllZAotICAgICAqIGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQsIGNvbnN0cnVjdCB0aGF0IGRvY3VtZW50IGluIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0SW5pdGlhbERvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSBjcmVhdGVkIGRvY3VtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlTmFtZSgpOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVCTElOX0NPUkVfUFJFRklYID0gImR1YmxpbmNvcmUuIjsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgY3JlYXRlZCBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1ldGFEYXRhKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyYW1ldGVyIGRvY3VtZW50IG1heSBub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIE1ldGFEYXRhIGRjTWV0YURhdGEgPSBkb2N1bWVudC5nZXRNZXRhRGF0YShEdWJsaW5Db3JlLkRDX05BTUVTUEFDRSk7Ci0gICAgICAgIFN0cmluZ1tdIGRjS2V5cyA9IGRjTWV0YURhdGEuZ2V0QXZhaWxhYmxlS2V5cygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGNLZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBnZXREdWJsaW5Db3JlUGFyYW1ldGVyKGRjS2V5c1tpXSk7Ci0gICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRjTWV0YURhdGEuc2V0VmFsdWUoZGNLZXlzW2ldLCBwYXJhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIE1hcCBvYmplY3RNb2RlbCA9IENvbnRleHRIZWxwZXIuZ2V0T2JqZWN0TW9kZWwoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0gICAgICAgIElkZW50aXR5IGlkZW50aXR5ID0gKElkZW50aXR5KSBzZXNzaW9uLmdldEF0dHJpYnV0ZShJZGVudGl0eS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBVc2VyIHVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldER1YmxpbkNvcmVQYXJhbWV0ZXIoRHVibGluQ29yZS5FTEVNRU5UX0NSRUFUT1IsIHVzZXIuZ2V0SWQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXREdWJsaW5Db3JlUGFyYW1ldGVyKER1YmxpbkNvcmUuRUxFTUVOVF9DUkVBVE9SLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzIik7Ci0gICAgICAgIHNldER1YmxpbkNvcmVQYXJhbWV0ZXIoRHVibGluQ29yZS5FTEVNRU5UX0RBVEUsIGZvcm1hdC5mb3JtYXQobmV3IEdyZWdvcmlhbkNhbGVuZGFyKCkKLSAgICAgICAgICAgICAgICAuZ2V0VGltZSgpKSk7Ci0KLSAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lID0gZ2V0RG9jdW1lbnRUeXBlTmFtZSgpOwotICAgICAgICBpZiAoZG9jdHlwZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdFNhbXBsZVBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihSRVNPVVJDRV9UWVBFUywgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSByZXNvdXJjZVR5cGVzID0gZ2V0UHVibGljYXRpb24oKS5nZXRSZXNvdXJjZVR5cGVOYW1lcygpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFJFU09VUkNFX1RZUEVTLCBBcnJheXMuYXNMaXN0KHJlc291cmNlVHlwZXMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRTYW1wbGVQYXJhbWV0ZXJzKCkgewotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChSZXNvdXJjZVR5cGUuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgcmVzb3VyY2VUeXBlID0gKFJlc291cmNlVHlwZSkgc2VsZWN0b3Iuc2VsZWN0KGdldERvY3VtZW50VHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzYW1wbGVzID0gcmVzb3VyY2VUeXBlLmdldFNhbXBsZU5hbWVzKCk7Ci0gICAgICAgICAgICBpZiAoc2FtcGxlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIHJlc291cmNlIHR5cGUgWyIgKyByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIGRvZXNuJ3QgcHJvdmlkZSBhbnkgc2FtcGxlcyEiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFNBTVBMRVMsIHNhbXBsZXMpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVzZXRTYW1wbGUgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhTQU1QTEUpOwotICAgICAgICAgICAgICAgIGlmIChwcmVzZXRTYW1wbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoU0FNUExFLCBzYW1wbGVzWzBdKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMaXN0IHNhbXBsZUxpc3QgPSBBcnJheXMuYXNMaXN0KHNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNhbXBsZUxpc3QuY29udGFpbnMocHJlc2V0U2FtcGxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBbIiArIHByZXNldFNhbXBsZSArICJdIG5vdCBkZWZpbmVkLCB1c2luZyBkZWZhdWx0IHNhbXBsZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihTQU1QTEUsIHNhbXBsZXNbMF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHJlc291cmNlVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHNvdXJjZSBkb2N1bWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlY2FzZSB3YXMgbm90Ci0gICAgICogICAgICAgICBpbnZva2VkIG9uIGEgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldFNvdXJjZURvY3VtZW50KCkgewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBnZXRTb3VyY2VVUkwoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChnZXREb2N1bWVudEZhY3RvcnkoKS5pc0RvY3VtZW50KHVybCkpIHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGdldERvY3VtZW50RmFjdG9yeSgpLmdldEZyb21VUkwodXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb2N1bWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldE5ld0RvY3VtZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBnZXROZXdEb2N1bWVudFBhdGgoKTsKLSAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKExBTkdVQUdFKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRQdWJsaWNhdGlvbigpLmdldEFyZWEoZ2V0QXJlYSgpKS5nZXRTaXRlKCkuZ2V0Tm9kZShwYXRoKS5nZXRMaW5rKGxhbmd1YWdlKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgYXJlYSB3aXRob3V0IHRoZSAiaW5mby0iIHByZWZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFyZWEoKSB7Ci0gICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24oZ2V0U291cmNlVVJMKCkpOwotICAgICAgICByZXR1cm4gaW5mby5nZXRBcmVhKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWNjZXNzIHRvIHRoZSBjdXJyZW50IHB1YmxpY2F0aW9uLiBVc2UgdGhpcyB3aGVuIHRoZSBwdWJsaWNhdGlvbiBpcyBub3QKLSAgICAgKiB5ZXQga25vd24gaW4gdGhlIHVzZWNhc2U6IGUuZy4gd2hlbiBjcmVhdGluZyBhIGdsb2JhbCBhc3NldC4gV2hlbiBhZGRpbmcKLSAgICAgKiBhIHJlc291cmNlIG9yIGEgY2hpbGQgdG8gYSBkb2N1bWVudCwgYWNjZXNzIHRoZSBwdWJsaWNhdGlvbiB2aWEgdGhhdAotICAgICAqIGRvY3VtZW50J3MgaW50ZXJmYWNlIGluc3RlYWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHVibGljYXRpb24gaW4gd2hpY2ggdGhlIHVzZS1jYXNlIGlzIGJlaW5nIGV4ZWN1dGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLCBnZXREb2N1bWVudEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlVVJMKCkpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZpc2libGVJbk5hdiBBdHRyaWJ1dGUgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGNyZWF0ZWQgaW4gdGhlCi0gICAgICogICAgICAgICB1c2VjYXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VmlzaWJsZUluTmF2KCkgewotICAgICAgICBpZiAoZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVklTSUJMRUlOTkFWKS5lcXVhbHMoImZhbHNlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DcmVhdGVEb2N1bWVudC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODM3M2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGNyZWF0ZSBhIGRvY3VtZW50LgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVEb2N1bWVudCBleHRlbmRzIENyZWF0ZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfUEFUSCA9ICJwYXJlbnRQYXRoIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEUgPSAiZG9jdHlwZSI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxBVElPTiA9ICJyZWxhdGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMQVRJT05TID0gInJlbGF0aW9ucyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMQVRJT05fQ0hJTEQgPSAiY2hpbGQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEFUSU9OX0JFRk9SRSA9ICJzaWJsaW5nIGJlZm9yZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMQVRJT05fQUZURVIgPSAic2libGluZyBhZnRlciI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9QUk9WSURFRCA9ICJwYXRoUHJvdmlkZWQiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgcGFyZW50ID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoUEFSRU5UX1BBVEgsICIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFBBUkVOVF9QQVRILCBwYXJlbnQuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IGdldFB1YmxpY2F0aW9uKCkuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgIGlmIChsYW5ndWFnZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIHB1YmxpY2F0aW9uIGRvZXNuJ3QgY29udGFpbiBhbnkgbGFuZ3VhZ2VzISIpOwotICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihMQU5HVUFHRVMsIGxhbmd1YWdlcyk7Ci0KLSAgICAgICAgRG9jdW1lbnQgc291cmNlRG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgU3RyaW5nW10gY2hpbGRPbmx5ID0geyBSRUxBVElPTl9DSElMRCB9OwotICAgICAgICBTdHJpbmdbXSBjaGlsZEFuZEFmdGVyID0geyBSRUxBVElPTl9DSElMRCwgUkVMQVRJT05fQUZURVIgfTsKLSAgICAgICAgU3RyaW5nW10gcmVsYXRpb25zID0gc291cmNlRG9jID09IG51bGwgPyBjaGlsZE9ubHkgOiBjaGlsZEFuZEFmdGVyOwotICAgICAgICAKLSAgICAgICAgc2V0UGFyYW1ldGVyKFJFTEFUSU9OUywgcmVsYXRpb25zKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKFJFTEFUSU9OLCBSRUxBVElPTl9DSElMRCk7Ci0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhQQVRIKTsKLSAgICAgICAgYm9vbGVhbiBwcm92aWRlZCA9IHBhdGggIT0gbnVsbCAmJiAhcGF0aC5lcXVhbHMoIiIpOwotICAgICAgICBzZXRQYXJhbWV0ZXIoUEFUSF9QUk9WSURFRCwgQm9vbGVhbi52YWx1ZU9mKHByb3ZpZGVkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc3VwcG9ydCBvdGhlciByZWxhdGlvbnMuCi0gICAgICogQHJldHVybiBUaGUgc3VwcG9ydGVkIHJlbGF0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0U3VwcG9ydGVkUmVsYXRpb25zKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgUkVMQVRJT05fQ0hJTEQsIFJFTEFUSU9OX0FGVEVSIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLQotICAgICAgICBTdHJpbmcgcmVsYXRpb24gPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhSRUxBVElPTik7Ci0KLSAgICAgICAgaWYgKCFBcnJheXMuYXNMaXN0KGdldFN1cHBvcnRlZFJlbGF0aW9ucygpKS5jb250YWlucyhyZWxhdGlvbikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIHJlbGF0aW9uICciICsgcmVsYXRpb24gKyAiJyBpcyBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZ2V0UHVibGljYXRpb24oKTsKLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IHB1Yi5nZXREb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgYm9vbGVhbiBwcm92aWRlZCA9IGdldFBhcmFtZXRlckFzQm9vbGVhbihQQVRIX1BST1ZJREVELCBmYWxzZSk7Ci0KLSAgICAgICAgaWYgKHByb3ZpZGVkKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3UGF0aCA9IGdldE5ld0RvY3VtZW50UGF0aCgpOwotICAgICAgICAgICAgaWYgKHB1Yi5nZXRBcmVhKGdldEFyZWEoKSkuZ2V0U2l0ZSgpLmNvbnRhaW5zKG5ld1BhdGgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyBuZXdQYXRoIH07Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJwYXRoLWFscmVhZHktZXhpc3RzIiwgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICBpZiAobm9kZU5hbWUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgibWlzc2luZy1ub2RlLW5hbWUiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJ1aWxkZXIuaXNWYWxpZERvY3VtZW50TmFtZShub2RlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIm5vZGUtbmFtZS1zcGVjaWFsLWNoYXJhY3RlcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJBc1N0cmluZyhOT0RFX05BTUUpLnRyaW0oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhdGhWYWxpZCgpIHsKLSAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gZ2V0TmV3RG9jdW1lbnROYW1lKCk7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZ2V0UHVibGljYXRpb24oKS5nZXREb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgcmV0dXJuICFub2RlTmFtZS50cmltKCkuZXF1YWxzKCIiKSAmJiBidWlsZGVyLmlzVmFsaWREb2N1bWVudE5hbWUobm9kZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgQ3JlYXRlI2dldE5ld0RvY3VtZW50TmFtZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdEb2N1bWVudE5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBub2RlTmFtZTsKLSAgICAgICAgaWYgKGdldFBhcmFtZXRlckFzQm9vbGVhbihQQVRIX1BST1ZJREVELCBmYWxzZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoUEFUSCk7Ci0gICAgICAgICAgICBub2RlTmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhdGgubGFzdEluZGV4T2YoIi8iKSArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm9kZU5hbWUgPSBnZXROb2RlTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub2RlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSBzb3VyY2UgZG9jdW1lbnQgYW5kIHRoZSBjcmVhdGVkCi0gICAgICogICAgICAgICBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoUkVMQVRJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgQ3JlYXRlI2dldE5ld0RvY3VtZW50UGF0aCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdEb2N1bWVudFBhdGgoKSB7Ci0gICAgICAgIGlmIChnZXRQYXJhbWV0ZXJBc0Jvb2xlYW4oUEFUSF9QUk9WSURFRCwgZmFsc2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoUEFUSCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVsYXRpb24gPSBnZXRSZWxhdGlvbigpOwotICAgICAgICAgICAgRG9jdW1lbnQgc291cmNlRG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VEb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiLyIgKyBnZXROZXdEb2N1bWVudE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHNvdXJjZUxvYyA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0TG9jYXRvcigpOwotICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5lcXVhbHMoUkVMQVRJT05fQ0hJTEQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VMb2MuZ2V0Q2hpbGQoZ2V0TmV3RG9jdW1lbnROYW1lKCkpLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLmVxdWFscyhSRUxBVElPTl9CRUZPUkUpIHx8IHJlbGF0aW9uLmVxdWFscyhSRUxBVElPTl9BRlRFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUxvYy5nZXRQYXJlbnQoKS5nZXRDaGlsZChnZXROZXdEb2N1bWVudE5hbWUoKSkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuc3VwcG9ydGVkIHJlbGF0aW9uICIgKyByZWxhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLkNyZWF0ZSNnZXREb2N1bWVudFR5cGVOYW1lKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERvY3VtZW50VHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJBc1N0cmluZyhET0NVTUVOVF9UWVBFKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUV4dGVuc2lvbigpIHsKLSAgICAgICAgcmV0dXJuICJ4bWwiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DcmVhdGVMYW5ndWFnZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZUxhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmIyZDcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZUxhbmd1YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXI7Ci0KLS8qKgotICogVXNlY2FzZSB0byBjcmVhdGUgYSBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiBvZiBhIHJlc291cmNlLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVMYW5ndWFnZSBleHRlbmRzIENyZWF0ZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkb2N1bWVudFR5cGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLQotICAgICAgICBpZiAoZ2V0U291cmNlRG9jdW1lbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgb3BlcmF0aW9uIG11c3QgYmUgaW52b2tlZCBvbiBhIGRvY3VtZW50LiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFyZWEgPSBnZXRTb3VyY2VEb2N1bWVudCgpLmdldEFyZWEoKTsKLSAgICAgICAgaWYgKCFhcmVhLmVxdWFscyhQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhpcyBvcGVyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlIGF1dGhvcmluZyBhcmVhLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldE5vbkV4aXN0aW5nTGFuZ3VhZ2VzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIkFsbCBsYW5ndWFnZSB2ZXJzaW9ucyBhbHJlYWR5IGV4aXN0LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBbGwgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSB0aGUgcHVibGljYXRpb24gZm9yIHdoaWNoIHRoaXMgZG9jdW1lbnQgZG9lcyBub3QgeWV0IGhhdmUKLSAgICAgKiAgICAgICAgIGEgdmVyc2lvbgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Tm9uRXhpc3RpbmdMYW5ndWFnZXMoKSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiwgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBzb3VyY2UgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBMaXN0IG5vbkV4aXN0aW5nTGFuZ3VhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBsYW5ndWFnZXMgPSBzb3VyY2UuZ2V0UHVibGljYXRpb24oKS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ndWFnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghc291cmNlLmV4aXN0c1RyYW5zbGF0aW9uKGxhbmd1YWdlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBub25FeGlzdGluZ0xhbmd1YWdlcy5hZGQobGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9uRXhpc3RpbmdMYW5ndWFnZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgc291cmNlID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihQQVRILCBzb3VyY2UuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICBMaXN0IG5vbkV4aXN0aW5nTGFuZ3VhZ2VzID0gZ2V0Tm9uRXhpc3RpbmdMYW5ndWFnZXMoKTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoTEFOR1VBR0VTLCBub25FeGlzdGluZ0xhbmd1YWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFN0cmluZ1tub25FeGlzdGluZ0xhbmd1YWdlcy5zaXplKCldKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIG5ldyBsYW5ndWFnZSB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQsIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhhdCBkb2N1bWVudCdzCi0gICAgICogQHNlZSBDcmVhdGUjZ2V0TmV3RG9jdW1lbnROYW1lKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld0RvY3VtZW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvdXJjZURvY3VtZW50KCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiBvZiBhIGRvY3VtZW50LCB0aGUgcGF0aCBpcyB0aGUgc2FtZSBhcyB0aGF0IGRvY3VtZW50J3MKLSAgICAgKiBAc2VlIENyZWF0ZSNnZXROZXdEb2N1bWVudFBhdGgoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3RG9jdW1lbnRQYXRoKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UGF0aCgpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5ldyBsYW5ndWFnZSB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQ6IHVzZSB0aGF0IGRvY3VtZW50J3MgY29udGVudAotICAgICAqIEBzZWUgQ3JlYXRlI2dldEluaXRpYWxEb2N1bWVudCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldEluaXRpYWxEb2N1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBDcmVhdGUjZ2V0RG9jdW1lbnRUeXBlTmFtZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREb2N1bWVudFR5cGVOYW1lKCkgewotICAgICAgICBpZiAodGhpcy5kb2N1bWVudFR5cGVOYW1lID09IG51bGwgJiYgZ2V0U291cmNlRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZSB0eXBlID0gZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRSZXNvdXJjZVR5cGUoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIExpc3Qgbm9uRXhpc3RpbmdMYW5ndWFnZXMgPSBnZXROb25FeGlzdGluZ0xhbmd1YWdlcygpOwotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihMQU5HVUFHRVMsIG5vbkV4aXN0aW5nTGFuZ3VhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgU3RyaW5nW25vbkV4aXN0aW5nTGFuZ3VhZ2VzLnNpemUoKV0pKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFR5cGVOYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZpc2libGVJbk5hdigpIHsKLSAgICAgICAgRG9jdW1lbnQgc291cmNlID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgU2l0ZU1hbmFnZXIgc2l0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSBtYW5hZ2VyLmxvb2t1cChTaXRlTWFuYWdlci5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICBzaXRlTWFuYWdlciA9IChTaXRlTWFuYWdlcikgc2VsZWN0b3Iuc2VsZWN0KHNvdXJjZS5nZXRQdWJsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTaXRlTWFuYWdlckhpbnQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gc2l0ZU1hbmFnZXIuaXNWaXNpYmxlSW5OYXYoc291cmNlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHNpdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlRXh0ZW5zaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRTb3VyY2VFeHRlbnNpb24oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ3V0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGExNWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0N1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Eb2N1bWVudFVzZWNhc2U7Ci0KLS8qKgotICogQ3V0IGEgZG9jdW1lbnQgaW50byB0aGUgY2xpcGJvYXJkLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXQgZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9JU0xJVkUgPSAiY3V0LWVycm9yLWlzbGl2ZSI7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotICAgICAgICBpZiAoaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIGlmICghZG9jLmdldEFyZWEoKS5lcXVhbHMoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIm9ubHktaW4tYXV0aG9yaW5nLWFyZWEiKTsKLSAgICAgICAgfQotICAgICAgICBTaXRlU3RydWN0dXJlIGxpdmVTaXRlID0gZG9jLmdldFB1YmxpY2F0aW9uKCkuZ2V0QXJlYShQdWJsaWNhdGlvbi5MSVZFX0FSRUEpLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKGxpdmVTaXRlLmNvbnRhaW5zKGRvYy5nZXRQYXRoKCkpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoTUVTU0FHRV9JU0xJVkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgCi0gICAgICAgIENsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGdldFNvdXJjZURvY3VtZW50KCksIENsaXBib2FyZC5NRVRIT0RfQ1VUKTsKLSAgICAgICAgQ2xpcGJvYXJkSGVscGVyIGhlbHBlciA9IG5ldyBDbGlwYm9hcmRIZWxwZXIoKTsKLSAgICAgICAgaGVscGVyLnNhdmVDbGlwYm9hcmQoZ2V0Q29udGV4dCgpLCBjbGlwYm9hcmQpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9EZWxldGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9EZWxldGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNzRiZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvRGVsZXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotCi0vKioKLSAqIERlbGV0ZSBhIGRvY3VtZW50IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzLCBpbmNsdWRpbmcgYWxsIGxhbmd1YWdlIHZlcnNpb25zLiBUaGUgZG9jdW1lbnRzIGFyZQotICogbW92ZWQgdG8gdGhlIHRyYXNoLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGUgZXh0ZW5kcyBNb3ZlU3Vic2l0ZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuTW92ZVN1YnNpdGUjZ2V0U291cmNlQXJlYXMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRTb3VyY2VBcmVhcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBLCBQdWJsaWNhdGlvbi5BUkNISVZFX0FSRUEgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuTW92ZVN1YnNpdGUjZ2V0VGFyZ2V0QXJlYSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRBcmVhKCkgewotICAgICAgICByZXR1cm4gUHVibGljYXRpb24uVFJBU0hfQVJFQTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuTW92ZVN1YnNpdGUjZ2V0RXZlbnQoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXZlbnQoKSB7Ci0gICAgICAgIHJldHVybiAiZGVsZXRlIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9EZWxldGVMYW5ndWFnZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0RlbGV0ZUxhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YmFiYTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0RlbGV0ZUxhbmd1YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51dGlsLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkRvY3VtZW50VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci0KLS8qKgotICogRGVsZXRlIGEgbGFuZ3VhZ2UgdmVyc2lvbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlTGFuZ3VhZ2UgZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKGhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFkb2MuZ2V0QXJlYSgpLmVxdWFscyhQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhpcyB1c2VjYXNlIGNhbiBvbmx5IGJlIGludm9rZWQgaW4gdGhlIGF1dGhvcmluZyBhcmVhISIpOwotICAgICAgICB9IGVsc2UgaWYgKGRvYy5nZXRMYW5ndWFnZXMoKS5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGUgbGFzdCBsYW5ndWFnZSB2ZXJzaW9uIGNhbm5vdCBiZSByZW1vdmVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZG9jLmV4aXN0c1ZlcnNpb24oUHVibGljYXRpb24uTElWRV9BUkVBLCBkb2MuZ2V0TGFuZ3VhZ2UoKSkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIGRvY3VtZW50IGNhbid0IGJlIGRlbGV0ZWQgaWYgYSBsaXZlIHZlcnNpb24gZXhpc3RzLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNnZXROb2Rlc1RvTG9jaygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYoZ2V0U291cmNlRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBOb2RlIGRvY05vZGUgPSBnZXRTb3VyY2VEb2N1bWVudCgpLmdldFJlcG9zaXRvcnlOb2RlKCk7Ci0gICAgICAgICAgICBOb2RlIHNpdGVOb2RlID0gZ2V0U291cmNlRG9jdW1lbnQoKS5hcmVhKCkuZ2V0U2l0ZSgpLmdldFJlcG9zaXRvcnlOb2RlKCk7Ci0gICAgICAgICAgICBub2Rlcy5hZGQoZG9jTm9kZSk7Ci0gICAgICAgICAgICBub2Rlcy5hZGQoc2l0ZU5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTm9kZVtdKSBub2Rlcy50b0FycmF5KG5ldyBOb2RlW25vZGVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBkb2N1bWVudC5nZXRMaW5rKCkuZGVsZXRlKCk7Ci0gICAgICAgIGRvY3VtZW50LmRlbGV0ZSgpOwotCi0gICAgICAgIHNldFRhcmdldERvY3VtZW50KERvY3VtZW50SGVscGVyLmdldEV4aXN0aW5nTGFuZ3VhZ2VWZXJzaW9uKGRvY3VtZW50KSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvRW1wdHlUcmFzaC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0VtcHR5VHJhc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlZWM1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvRW1wdHlUcmFzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudFNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEVtcHR5IHRoZSB0cmFzaC4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlUcmFzaCBleHRlbmRzIEFic3RyYWN0VXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVFMgPSAiZG9jdW1lbnRzIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBnZXRUcmFzaERvY3VtZW50cygpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKERPQ1VNRU5UUywgQXJyYXlzLmFzTGlzdChkb2N1bWVudHMpKTsKLSAgICAgICAgfSBjYXRjaCAoU2l0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoUHVibGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2NrIHRoZSBmb2xsb3dpbmcgb2JqZWN0czoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmFsbCBpbnZvbHZlZCBkb2N1bWVudHMgaW4gdGhlIHRyYXNoIGFyZWE8L2xpPgotICAgICAqIDxsaT50aGUgZG9jdW1lbnQgdHJhc2ggc2l0ZSBzdHJ1Y3R1cmU8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNnZXROb2Rlc1RvTG9jaygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBTaXRlTWFuYWdlciBzaXRlTWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gUHVibGljYXRpb25VdGlsLmdldFB1YmxpY2F0aW9uRnJvbVVybCh0aGlzLm1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50RmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VVUkwoKSk7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgaWRlbnRpdHlNYXAgPSBnZXREb2N1bWVudEZhY3RvcnkoKTsKLSAgICAgICAgICAgIERvY3VtZW50W10gZG9jcyA9IGdldFRyYXNoRG9jdW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBub2Rlcy5hZGQoZG9jc1tpXS5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3QocHVibGljYXRpb24uZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSBzaXRlTWFuYWdlci5nZXRTaXRlU3RydWN0dXJlKGlkZW50aXR5TWFwLAotICAgICAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24uVFJBU0hfQVJFQSk7Ci0gICAgICAgICAgICBub2Rlcy5hZGQoc3RydWN0dXJlLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVzZWNhc2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzaXRlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2Uoc2l0ZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbXSkgbm9kZXMudG9BcnJheShuZXcgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW25vZGVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIERvY3VtZW50W10gZG9jdW1lbnRzID0gZ2V0VHJhc2hEb2N1bWVudHMoKTsKLSAgICAgICAgICAgIERvY3VtZW50U2V0IHNldCA9IG5ldyBEb2N1bWVudFNldChkb2N1bWVudHMpOwotICAgICAgICAgICAgZG9jdW1lbnRNYW5hZ2VyLmRlbGV0ZShzZXQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoZG9jdW1lbnRNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGRvY3VtZW50cyBpbiB0aGUgdHJhc2ggYXJlYS4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudFtdIGdldFRyYXNoRG9jdW1lbnRzKCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uLCBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBQdWJsaWNhdGlvblV0aWwuZ2V0UHVibGljYXRpb25Gcm9tVXJsKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICBnZXREb2N1bWVudEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBnZXRTb3VyY2VVUkwoKSk7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBpZGVudGl0eU1hcCA9IGdldERvY3VtZW50RmFjdG9yeSgpOwotICAgICAgICBEb2N1bWVudFtdIGRvY3VtZW50czsKLQotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBTaXRlTWFuYWdlciBzaXRlTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoU2l0ZU1hbmFnZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgc2l0ZU1hbmFnZXIgPSAoU2l0ZU1hbmFnZXIpIHNlbGVjdG9yLnNlbGVjdChwdWJsaWNhdGlvbi5nZXRTaXRlTWFuYWdlckhpbnQoKSk7Ci0gICAgICAgICAgICBkb2N1bWVudHMgPSBzaXRlTWFuYWdlci5nZXREb2N1bWVudHMoaWRlbnRpdHlNYXAsIHB1YmxpY2F0aW9uLCBQdWJsaWNhdGlvbi5UUkFTSF9BUkVBKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShzaXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkb2N1bWVudHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0ZvcmNlQ2hlY2tJbi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0ZvcmNlQ2hlY2tJbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjNlZDMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9Gb3JjZUNoZWNrSW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuZHVibGluY29yZS5EdWJsaW5Db3JlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkRvY3VtZW50VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2Vzc2lvbkxpc3RlbmVyOwotCi0vKioKLSAqIEZvcmNlIGEgZG9jdW1lbnQgdG8gYmUgY2hlY2tlZCBpbiAob3ZlcnJpZGUgYSBjaGVja291dCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JjZUNoZWNrSW4gZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZID0gSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBISVNUT1JZID0gIm9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3RpbmcuSGlzdG9yeSI7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotCi0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBOb2RlIG5vZGUgPSBkb2MuZ2V0UmVwb3NpdG9yeU5vZGUoKTsKLSAgICAgICAgaWYgKCFub2RlLmlzQ2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IER1YmxpbkNvcmVIZWxwZXIuZ2V0VGl0bGUoZG9jLCB0cnVlKSB9OwotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJub3QtY2hlY2tlZC1vdXQiLCBwYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpOwotICAgICAgICBpZiAobm9kZS5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIHVzZXJJZCA9IG5vZGUuZ2V0Q2hlY2tvdXRVc2VySWQoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHsgdXNlcklkIH07Ci0gICAgICAgICAgICBpZiAoaXNMb2dnZWRJbih1c2VySWQpKSB7Ci0gICAgICAgICAgICAgICAgYWRkSW5mb01lc3NhZ2UoInVzZXItbG9nZ2VkLWluIiwgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEluZm9NZXNzYWdlKCJ1c2VyLW5vdC1sb2dnZWQtaW4iLCBwYXJhbXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2dnZWRJbihTdHJpbmcgdXNlcklkKSB7Ci0gICAgICAgIFN0cmluZyBwdWJJZCA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UHVibGljYXRpb24oKS5nZXRJZCgpOwotICAgICAgICBTZXNzaW9uTGlzdGVuZXIgc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbkxpc3RlbmVyKCk7Ci0gICAgICAgIFdlYWtIYXNoTWFwIGFsbFNlc3Npb25zID0gc2Vzc2lvbnMuZ2V0QWxsU2Vzc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gbG9nZ2VkSW4gPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgdXNlcml0ID0gYWxsU2Vzc2lvbnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAodXNlcml0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgdXNlcml0Lm5leHQoKTsKLSAgICAgICAgICAgIEh0dHBTZXNzaW9uIG5leHRzZXNzaW9uID0gKEh0dHBTZXNzaW9uKSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IChJZGVudGl0eSkgbmV4dHNlc3Npb24uZ2V0QXR0cmlidXRlKElERU5USVRZKTsKLQotICAgICAgICAgICAgaWYoaWRlbnRpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBVc2VyIHVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICBWZWN0b3IgaGlzdG9yeSA9IChWZWN0b3IpIG5leHRzZXNzaW9uLmdldEF0dHJpYnV0ZShISVNUT1JZKTsKLSAgICAgICAgICAgIFN0cmluZyBwdWJsaWNhdGlvbklEID0gZ2V0UHVibGljYXRpb25JRGZyb21IaXN0b3J5KGhpc3RvcnkpOwotICAgICAgICAgICAgaWYgKHB1YmxpY2F0aW9uSUQuZXF1YWxzKHB1YklkKSAmJiB1c2VyICE9IG51bGwgJiYgdXNlci5nZXRJZCgpLmVxdWFscyh1c2VySWQpKSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VkSW4gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb2dnZWRJbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgTm9kZSBub2RlID0gZG9jLmdldFJlcG9zaXRvcnlOb2RlKCk7Ci0KLSAgICAgICAgbm9kZS5mb3JjZUNoZWNrSW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IHRoZSBwdWJsaWNhdGlvbklEIGZyb20gdGhlIGhpc3RvcnkgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZQotICAgICAqIHNlc3Npb24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGlzdG9yeSBUaGUgaGlzdG9yeSBzdG9yZWQgaW4gdGhlIHNlc3Npb24uLiBBbiBlbnRyeSBsb29rcyBsaWtlIFwvCi0gICAgICogICAgICAgIDxwdWJsaWNhdGlvbi1pZD4vYXV0aG9yaW5nL2luZGV4Lmh0bWwKLSAgICAgKiBAcmV0dXJuIEEgcHVibGljYXRpb24gSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHVibGljYXRpb25JRGZyb21IaXN0b3J5KFZlY3RvciBoaXN0b3J5KSB7Ci0gICAgICAgIFN0cmluZyBmaXJzdEVsZW1lbnQgPSBoaXN0b3J5LmZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyBwdWJsaWNhdGlvbklEID0gZmlyc3RFbGVtZW50LnN1YnN0cmluZygxLCBmaXJzdEVsZW1lbnQuaW5kZXhPZigiLyIsIDEpKTsKLSAgICAgICAgcmV0dXJuIHB1YmxpY2F0aW9uSUQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvTW92ZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL01vdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmMDczZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvTW92ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLlNpdGVVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIG1vdmUgYSByZXNvdXJjZS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgTW92ZSBleHRlbmRzIFNpdGVVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1vdmUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuCi0gICAgICogQHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI3NldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvTW92ZVN1YnNpdGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9Nb3ZlU3Vic2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDc1NDc3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9Nb3ZlU3Vic2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5Ob2RlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuVXNlY2FzZVdvcmtmbG93SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGU7Ci0KLS8qKgotICogVXNlY2FzZSB0byBtb3ZlIGEgc3Vic2l0ZSB0byBhbm90aGVyIGFyZWEuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb3ZlU3Vic2l0ZSBleHRlbmRzIERvY3VtZW50VXNlY2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBwb3NzaWJsZSBzb3VyY2UgYXJlYXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldFNvdXJjZUFyZWFzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB0YXJnZXQgYXJlYS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFRhcmdldEFyZWEoKTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIGlmIChoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBzb3VyY2VBcmVhcyA9IEFycmF5cy5hc0xpc3QoZ2V0U291cmNlQXJlYXMoKSk7Ci0gICAgICAgIGlmICghc291cmNlQXJlYXMuY29udGFpbnMoZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRBcmVhKCkpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgdXNlY2FzZSBjYW4gb25seSBiZSBpbnZva2VkIGluIHRoZSBhdXRob3JpbmcgYXJlYSEiKTsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotCi0gICAgICAgICAgICBOb2RlU2V0IHN1YnNpdGUgPSBTaXRlVXRpbC5nZXRTdWJTaXRlKHRoaXMubWFuYWdlciwgZG9jdW1lbnQuZ2V0TGluaygpLmdldE5vZGUoKSk7Ci0gICAgICAgICAgICBEb2N1bWVudFtdIGRvY3MgPSBzdWJzaXRlLmdldERvY3VtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRvY3NbaV0uZXhpc3RzQXJlYVZlcnNpb24oUHVibGljYXRpb24uTElWRV9BUkVBKSkgewotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBsaXZlVmVyc2lvbiA9IGRvY3NbaV0uZ2V0QXJlYVZlcnNpb24oUHVibGljYXRpb24uTElWRV9BUkVBKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJkZWxldGUtZG9jLWxpdmUiLCBuZXcgU3RyaW5nW10geyBsaXZlVmVyc2lvbi50b1N0cmluZygpIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBVc2VjYXNlV29ya2Zsb3dIZWxwZXIuY2hlY2tXb3JrZmxvdyh0aGlzLm1hbmFnZXIsIHRoaXMsIGdldEV2ZW50KCksIGRvY3NbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB3b3JrZmxvdyBldmVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEV2ZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NrIGFsbCBzb3VyY2UgZG9jdW1lbnRzIGFuZCB0aGUgc2l0ZSBzdHJ1Y3R1cmUgcmVwb3NpdG9yeSBub2RlcyBiZWNhdXNlCi0gICAgICogY2hhbmdlcyB0byB0aGUgc2l0ZSBzdHJ1Y3R1cmUgd291bGQgY29tcHJvbWlzZSB0aGUgb3BlcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBOb2RlW10gZ2V0Tm9kZXNUb0xvY2soKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNldCBub2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gIAotICAgICAgICBpZihnZXRTb3VyY2VEb2N1bWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICBTaXRlU3RydWN0dXJlIHNvdXJjZVNpdGUgPSBnZXRTb3VyY2VEb2N1bWVudCgpLmFyZWEoKS5nZXRTaXRlKCk7Ci0gICAgICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSB0YXJnZXRTaXRlID0gZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRQdWJsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXJlYShnZXRUYXJnZXRBcmVhKCkpLmdldFNpdGUoKTsKLQotICAgICAgICAgICAgICAgIG5vZGVzLmFkZChzb3VyY2VTaXRlLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotICAgICAgICAgICAgICAgIG5vZGVzLmFkZCh0YXJnZXRTaXRlLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotCi0gICAgICAgICAgICAgICAgRG9jdW1lbnRbXSBkb2NzID0gU2l0ZVV0aWwuZ2V0U3ViU2l0ZSh0aGlzLm1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VEb2N1bWVudCgpLmdldExpbmsoKS5nZXROb2RlKCkpLmdldERvY3VtZW50cygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBub2Rlcy5hZGQoZG9jc1tpXS5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotIAotICAgICAgICByZXR1cm4gKE5vZGVbXSkgbm9kZXMudG9BcnJheShuZXcgTm9kZVtub2Rlcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHRhcmdldEFyZWFOYW1lID0gZ2V0VGFyZ2V0QXJlYSgpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBEb2N1bWVudFtdIHNvdXJjZXMgPSBTaXRlVXRpbC5nZXRTdWJTaXRlKHRoaXMubWFuYWdlciwgZG9jLmdldExpbmsoKS5nZXROb2RlKCkpCi0gICAgICAgICAgICAgICAgLmdldERvY3VtZW50cygpOwotICAgICAgICBBcmVhIHRhcmdldEFyZWEgPSBkb2MuZ2V0UHVibGljYXRpb24oKS5nZXRBcmVhKHRhcmdldEFyZWFOYW1lKTsKLQotICAgICAgICBEb2N1bWVudExvY2F0b3IgdGFyZ2V0TG9jID0gZG9jLmdldExvY2F0b3IoKS5nZXRBcmVhVmVyc2lvbih0YXJnZXRBcmVhTmFtZSk7Ci0gICAgICAgIHRhcmdldExvYyA9IFNpdGVVdGlsLmdldEF2YWlsYWJsZUxvY2F0b3IodGhpcy5tYW5hZ2VyLCBnZXREb2N1bWVudEZhY3RvcnkoKSwgdGFyZ2V0TG9jKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBzb3VyY2VzW2ldLCBnZXRFdmVudCgpLAotICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKFJlc3RvcmUuY2xhc3MuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKHRoaXMubWFuYWdlciwgZ2V0U2Vzc2lvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCksIHNvdXJjZXNbaV0pOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IHdvcmtmbG93YWJsZS5nZXRMYXRlc3RWZXJzaW9uKCkuZ2V0U3RhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmVxdWFscygiYXV0aG9yaW5nIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGUgc3RhdGUgaXMgWyIgKyBzdGF0ZSArICJdIGluc3RlYWQgb2YgW2F1dGhvcmluZ10hIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudE1hbmFnZXIgZG9jTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2NNYW5hZ2VyID0gKERvY3VtZW50TWFuYWdlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBkb2NNYW5hZ2VyLm1vdmVBbGwoZG9jLmFyZWEoKSwgZG9jLmdldFBhdGgoKSwgdGFyZ2V0QXJlYSwgdGFyZ2V0TG9jLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkb2NNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShkb2NNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFRhcmdldERvY3VtZW50KGRvYy5nZXRBcmVhVmVyc2lvbih0YXJnZXRBcmVhTmFtZSkpOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRVUkwoYm9vbGVhbiBzdWNjZXNzKSB7Ci0gICAgICAgIGlmIChnZXRUYXJnZXRBcmVhKCkuZXF1YWxzKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRhcmdldFVSTChzdWNjZXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB1cmw7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgdXJsID0gZ2V0U291cmNlVVJMKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0VGFyZ2V0RG9jdW1lbnQoc3VjY2Vzcyk7Ci0gICAgICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzaXRlID0gZG9jdW1lbnQuZ2V0UHVibGljYXRpb24oKS5nZXRBcmVhKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKS5nZXRTaXRlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFRhcmdldFVybChzaXRlLCBkb2N1bWVudC5nZXRQYXRoKCkpICsgZ2V0RXhpdFF1ZXJ5U3RyaW5nKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmwgKyBnZXRFeGl0UXVlcnlTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRUYXJnZXRVcmwoU2l0ZVN0cnVjdHVyZSBzaXRlLCBTdHJpbmcgcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIi8iICsgc2l0ZS5nZXRQdWJsaWNhdGlvbigpLmdldElkKCkgKyAiLyIgKyBzaXRlLmdldEFyZWEoKSArICIvIjsKLSAgICAgICAgfSBlbHNlIGlmIChzaXRlLmNvbnRhaW5zKHBhdGgpKSB7Ci0gICAgICAgICAgICBTaXRlTm9kZSBub2RlID0gc2l0ZS5nZXROb2RlKHBhdGgpOwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0TGFuZ3VhZ2VzKCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIExpbmsgbGluazsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdExhbmd1YWdlID0gc2l0ZS5nZXRQdWJsaWNhdGlvbigpLmdldERlZmF1bHRMYW5ndWFnZSgpOwotICAgICAgICAgICAgICAgIGlmIChub2RlLmhhc0xpbmsoZGVmYXVsdExhbmd1YWdlKSkgewotICAgICAgICAgICAgICAgICAgICBsaW5rID0gbm9kZS5nZXRMaW5rKGRlZmF1bHRMYW5ndWFnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaW5rID0gbm9kZS5nZXRMaW5rKG5vZGUuZ2V0TGFuZ3VhZ2VzKClbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbGluay5nZXREb2N1bWVudCgpLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFRhcmdldFVybChzaXRlLCBnZXRQYXJlbnRQYXRoKHBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUYXJnZXRVcmwoc2l0ZSwgZ2V0UGFyZW50UGF0aChwYXRoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRQYXJlbnRQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJwYXRoIiwgcGF0aCk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoIm5vdCBlbXB0eSIsIHBhdGgubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoIi8iKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvT3ZlcnZpZXcuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9PdmVydmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWRiODFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9PdmVydmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLmR1YmxpbmNvcmUuRHVibGluQ29yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLlNpdGVVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LldvcmtmbG93VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZTsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGRpc3BsYXkgdGhlIG92ZXJ2aWV3IHRhYiBpbiB0aGUgc2l0ZSBhcmVhIGZvciBhIGRvY3VtZW50LgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVydmlldyBleHRlbmRzIFNpdGVVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RNT0RJRklFRCA9ICJsYXN0bW9kaWZpZWQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdVQUdFUyA9ICJsYW5ndWFnZXMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFID0gInN0YXRlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJU0xJVkUgPSAiaXNMaXZlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJQkxFX0lOX05BVklHQVRJT04gPSAidmlzaWJsZUluTmF2IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19WQVJJQUJMRV9JU0xJVkUgPSAiaXNfbGl2ZSI7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBPdmVydmlldygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2luaXRQYXJhbWV0ZXJzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLQotICAgICAgICBXb3JrZmxvd01hbmFnZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChkb2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHJlYWQgcGFyYW1ldGVycyBmcm9tIER1YmxpbiBDb3JlIG1ldGEtZGF0YQotICAgICAgICAgICAgICAgIE1ldGFEYXRhIGRjID0gZG9jLmdldE1ldGFEYXRhKER1YmxpbkNvcmUuRENfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRHVibGluQ29yZS5FTEVNRU5UX1RJVExFLCBkYy5nZXRGaXJzdFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9USVRMRSkpOwotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihEdWJsaW5Db3JlLkVMRU1FTlRfREVTQ1JJUFRJT04sIGRjCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfREVTQ1JJUFRJT04pKTsKLQotICAgICAgICAgICAgICAgIC8vIHJlYWQgcGFyYW1ldGVycyBmcm9tIGRvY3VtZW50IGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoTEFOR1VBR0VTLCBkb2MuZ2V0TGFuZ3VhZ2VzKCkpOwotICAgICAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MgWiIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0TW9kaWZpZWQgPSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQobmV3IERhdGUoZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRMYXN0TW9kaWZpZWQoKSkpOwotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihMQVNUTU9ESUZJRUQsIGxhc3RNb2RpZmllZCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gZG9jLmdldExpbmsoKS5nZXROb2RlKCkuaXNWaXNpYmxlKCk7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFZJU0lCTEVfSU5fTkFWSUdBVElPTiwgQm9vbGVhbi52YWx1ZU9mKHZpc2libGUpKTsKLQotICAgICAgICAgICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlc3Npb24oKSwgZ2V0TG9nZ2VyKCksIGRvYyk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIgPSAoV29ya2Zsb3dNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKFdvcmtmbG93TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIuaGFzV29ya2Zsb3cod29ya2Zsb3dhYmxlKSkgewotICAgICAgICAgICAgICAgICAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IHJlc29sdmVyLmdldFdvcmtmbG93U2NoZW1hKHdvcmtmbG93YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhcmlhYmxlTmFtZXMgPSB3b3JrZmxvdy5nZXRWYXJpYWJsZU5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFZlcnNpb24gbGF0ZXN0VmVyc2lvbiA9IHdvcmtmbG93YWJsZS5nZXRMYXRlc3RWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gaXNMaXZlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVzdFZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFNUQVRFLCBsYXRlc3RWZXJzaW9uLmdldFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5cy5hc0xpc3QodmFyaWFibGVOYW1lcykuY29udGFpbnMoV09SS0ZMT1dfVkFSSUFCTEVfSVNMSVZFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGl2ZSA9IEJvb2xlYW4udmFsdWVPZihsYXRlc3RWZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoV09SS0ZMT1dfVkFSSUFCTEVfSVNMSVZFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoU1RBVEUsIHdvcmtmbG93LmdldEluaXRpYWxTdGF0ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheXMuYXNMaXN0KHZhcmlhYmxlTmFtZXMpLmNvbnRhaW5zKFdPUktGTE9XX1ZBUklBQkxFX0lTTElWRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xpdmUgPSBCb29sZWFuLnZhbHVlT2Yod29ya2Zsb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbml0aWFsVmFsdWUoV09SS0ZMT1dfVkFSSUFCTEVfSVNMSVZFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKElTTElWRSwgaXNMaXZlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoU1RBVEUsICIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiQ291bGQgbm90IHJlYWQgYSB2YWx1ZS4gU2VlIGxvZyBmaWxlcyBmb3IgZGV0YWlscy4iKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJDb3VsZCBub3QgcmVhZCB2YWx1ZSBmb3IgT3ZlcnZpZXcgdXNlY2FzZS4gIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGRvbid0IGNvbXBsYWluIGlmIGRvY3VtZW50IGlzIG51bGwKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvUGFzdGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9QYXN0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDc4NzQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9QYXN0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLk5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci0KLS8qKgotICogUGFzdGUgYSBkb2N1bWVudCBmcm9tIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFBhc3RlIGV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMSVBCT0FSRF9MQUJFTCA9ICJjbGlwYm9hcmRMYWJlbCI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvQ2hlY2tQcmVjb25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotCi0gICAgICAgIGlmIChoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWdldEFyZWEoKS5nZXROYW1lKCkuZXF1YWxzKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJvbmx5LWluLWF1dGhvcmluZy1hcmVhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZEhlbHBlcigpLmdldENsaXBib2FyZChnZXRDb250ZXh0KCkpOwotICAgICAgICBpZiAoY2xpcGJvYXJkID09IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiY2xpcGJvYXJkLWVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICAgICAgaWYoZG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBjbGlwcGVkRG9jID0gY2xpcGJvYXJkLmdldERvY3VtZW50KGdldERvY3VtZW50RmFjdG9yeSgpLCBkb2MuZ2V0UHVibGljYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHV1aWQgPSBjbGlwcGVkRG9jLmdldFVVSUQoKTsKLSAgICAgICAgICAgICAgICBTaXRlTm9kZSBub2RlID0gZG9jLmdldExpbmsoKS5nZXROb2RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBib2FyZC5nZXRNZXRob2QoKSA9PSBDbGlwYm9hcmQuTUVUSE9EX0NVVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAod2lsbFBhc3RlSW5Pd25TdWJ0cmVlKG5vZGUsIHV1aWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIndpbGwtcGFzdGUtaW4tb3duLXN1YnRyZWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHdpbGxQYXN0ZUluT3duU3VidHJlZShTaXRlTm9kZSBub2RlLCBTdHJpbmcgdXVpZCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbm9kZVV1aWQgPSBub2RlLmdldFV1aWQoKTsKLSAgICAgICAgaWYgKG5vZGVVdWlkLmVxdWFscyh1dWlkKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW5vZGUuaXNUb3BMZXZlbCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gd2lsbFBhc3RlSW5Pd25TdWJ0cmVlKG5vZGUuZ2V0UGFyZW50KCksIHV1aWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldFNvdXJjZURvY3VtZW50KCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBnZXREb2N1bWVudEZhY3RvcnkoKTsKLSAgICAgICAgICAgIFN0cmluZyBzb3VyY2VVcmwgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhTT1VSQ0VfVVJMKTsKLSAgICAgICAgICAgIGlmIChmYWN0b3J5LmlzRG9jdW1lbnQoc291cmNlVXJsKSkgewotICAgICAgICAgICAgICAgIGRvYyA9IGZhY3RvcnkuZ2V0RnJvbVVSTChzb3VyY2VVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmRIZWxwZXIoKS5nZXRDbGlwYm9hcmQoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgaWYgKGNsaXBib2FyZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSBjbGlwYm9hcmQuZ2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnRGYWN0b3J5KCksIHB1YikuZ2V0TGluaygpLmdldExhYmVsKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKENMSVBCT0FSRF9MQUJFTCwgbGFiZWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgewotICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKGdldFNvdXJjZVVSTCgpKTsKLSAgICAgICAgU3RyaW5nIHB1YklkID0gaW5mby5nZXRQdWJsaWNhdGlvbklkKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRGYWN0b3J5KCkuZ2V0UHVibGljYXRpb24ocHViSWQpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZ2V0Tm9kZXNUb0xvY2soKQotICAgICAqLwotICAgIHByb3RlY3RlZCBOb2RlW10gZ2V0Tm9kZXNUb0xvY2soKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmRIZWxwZXIoKS5nZXRDbGlwYm9hcmQoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgICAgIGlmIChjbGlwYm9hcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE5vZGUgc2l0ZU5vZGUgPSBnZXRBcmVhKCkuZ2V0U2l0ZSgpLmdldFJlcG9zaXRvcnlOb2RlKCk7Ci0gICAgICAgICAgICAgICAgbm9kZXMuYWRkKHNpdGVOb2RlKTsKLQotICAgICAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBnZXREb2N1bWVudEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IGNsaXBwZWREb2N1bWVudCA9IGNsaXBib2FyZC5nZXREb2N1bWVudChtYXAsIHB1Yik7Ci0gICAgCi0gICAgICAgICAgICAgICAgTm9kZVNldCBzdWJzaXRlID0gU2l0ZVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdWJTaXRlKHRoaXMubWFuYWdlciwgY2xpcHBlZERvY3VtZW50LmdldExpbmsoKS5nZXROb2RlKCkpOwotICAgICAgICAgICAgICAgIERvY3VtZW50W10gc3Vic2l0ZURvY3MgPSBzdWJzaXRlLmdldERvY3VtZW50cygpOwotICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic2l0ZURvY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBib2FyZC5nZXRNZXRob2QoKSA9PSBDbGlwYm9hcmQuTUVUSE9EX0NVVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuYWRkKHN1YnNpdGVEb2NzW2ldLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoTm9kZVtdKSBub2Rlcy50b0FycmF5KG5ldyBOb2RlW25vZGVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBBcmVhIGdldEFyZWEoKSB7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKCk7Ci0gICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24oZ2V0U291cmNlVVJMKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHB1Yi5nZXRBcmVhKGluZm8uZ2V0QXJlYSgpKTsKLSAgICAgICAgfSBjYXRjaCAoUHVibGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotCi0gICAgICAgIERvY3VtZW50RmFjdG9yeSBpZGVudGl0eU1hcCA9IGdldERvY3VtZW50RmFjdG9yeSgpOwotICAgICAgICBDbGlwYm9hcmRIZWxwZXIgaGVscGVyID0gbmV3IENsaXBib2FyZEhlbHBlcigpOwotCi0gICAgICAgIENsaXBib2FyZCBjbGlwYm9hcmQgPSBoZWxwZXIuZ2V0Q2xpcGJvYXJkKGdldENvbnRleHQoKSk7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKCk7Ci0gICAgICAgIERvY3VtZW50IGNsaXBwZWREb2N1bWVudCA9IGNsaXBib2FyZC5nZXREb2N1bWVudChpZGVudGl0eU1hcCwgcHViKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0UGF0aCA9IGdldFRhcmdldFBhdGgoKTsKLSAgICAgICAgZmluYWwgQXJlYSBhcmVhID0gY2xpcHBlZERvY3VtZW50LmFyZWEoKTsKLSAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLQotICAgICAgICAgICAgaWYgKGNsaXBib2FyZC5nZXRNZXRob2QoKSA9PSBDbGlwYm9hcmQuTUVUSE9EX0NPUFkpIHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIuY29weUFsbChhcmVhLCBjbGlwcGVkRG9jdW1lbnQuZ2V0UGF0aCgpLCBhcmVhLCB0YXJnZXRQYXRoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpcGJvYXJkLmdldE1ldGhvZCgpID09IENsaXBib2FyZC5NRVRIT0RfQ1VUKSB7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnRNYW5hZ2VyLm1vdmVBbGwoYXJlYSwgY2xpcHBlZERvY3VtZW50LmdldFBhdGgoKSwgYXJlYSwgdGFyZ2V0UGF0aCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIGNsaXBib2FyZCBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGRvY3VtZW50TWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBoZWxwZXIucmVtb3ZlQ2xpcGJvYXJkKGdldENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRQYXRoKCkgdGhyb3dzIFNpdGVFeGNlcHRpb24sIERvY3VtZW50QnVpbGRFeGNlcHRpb24sCi0gICAgICAgICAgICBTZXJ2aWNlRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBpZGVudGl0eU1hcCA9IGdldERvY3VtZW50RmFjdG9yeSgpOwotICAgICAgICBDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZEhlbHBlcigpLmdldENsaXBib2FyZChnZXRDb250ZXh0KCkpOwotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbigpOwotICAgICAgICBEb2N1bWVudCBjbGlwcGVkRG9jdW1lbnQgPSBjbGlwYm9hcmQuZ2V0RG9jdW1lbnQoaWRlbnRpdHlNYXAsIHB1Yik7Ci0KLSAgICAgICAgU3RyaW5nIHRhcmdldEFyZWEgPSBnZXRBcmVhKCkuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBjbGlwcGVkRG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgU3RyaW5nIG5vZGVJZCA9IGNsaXBwZWREb2N1bWVudC5nZXROYW1lKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgc291cmNlRG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIGJhc2VQYXRoID0gc291cmNlRG9jICE9IG51bGwgPyBzb3VyY2VEb2MuZ2V0UGF0aCgpIDogIiI7Ci0KLSAgICAgICAgU3RyaW5nIHBvdGVudGlhbFBhdGggPSBiYXNlUGF0aCArICIvIiArIG5vZGVJZDsKLQotICAgICAgICBEb2N1bWVudExvY2F0b3IgcG90ZW50aWFsTG9jID0gRG9jdW1lbnRMb2NhdG9yLmdldExvY2F0b3IoZ2V0UHVibGljYXRpb24oKS5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHRhcmdldEFyZWEsIHBvdGVudGlhbFBhdGgsIGxhbmd1YWdlKTsKLSAgICAgICAgcmV0dXJuIFNpdGVVdGlsLmdldEF2YWlsYWJsZUxvY2F0b3IodGhpcy5tYW5hZ2VyLCBnZXREb2N1bWVudEZhY3RvcnkoKSwgcG90ZW50aWFsTG9jKQotICAgICAgICAgICAgICAgIC5nZXRQYXRoKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1Jlc3RvcmUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9SZXN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjNmMjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1Jlc3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGU7Ci0KLS8qKgotICogUmVzdG9yZSB1c2VjYXNlIGhhbmRsZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN0b3JlIGV4dGVuZHMgTW92ZVN1YnNpdGUgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLk1vdmVTdWJzaXRlI2dldFNvdXJjZUFyZWFzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0U291cmNlQXJlYXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBQdWJsaWNhdGlvbi5UUkFTSF9BUkVBLCBQdWJsaWNhdGlvbi5BUkNISVZFX0FSRUEgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuTW92ZVN1YnNpdGUjZ2V0VGFyZ2V0QXJlYSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRBcmVhKCkgewotICAgICAgICByZXR1cm4gUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLk1vdmVTdWJzaXRlI2dldEV2ZW50KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gInJlc3RvcmUiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0KLSAgICAgICAgU3RyaW5nIHRhcmdldEFyZWFOYW1lID0gZ2V0VGFyZ2V0QXJlYSgpOyAKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgaWYoZG9jID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgcGFyZW50IG5vZGUgZXhpc3RzIGluIHRhcmdldCB0byBwcmV2ZW50IGdob3N0IG5vZGVzCi0gICAgICAgIEFyZWEgdGFyZ2V0QXJlYSA9IGRvYy5nZXRQdWJsaWNhdGlvbigpLmdldEFyZWEodGFyZ2V0QXJlYU5hbWUpOwotICAgICAgICBEb2N1bWVudExvY2F0b3IgdGFyZ2V0TG9jID0gZG9jLmdldExvY2F0b3IoKS5nZXRBcmVhVmVyc2lvbih0YXJnZXRBcmVhTmFtZSk7Ci0gICAgICAgIHRhcmdldExvYyA9IFNpdGVVdGlsLmdldEF2YWlsYWJsZUxvY2F0b3IodGhpcy5tYW5hZ2VyLCBnZXREb2N1bWVudEZhY3RvcnkoKSwgdGFyZ2V0TG9jKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldFBhdGggPSB0YXJnZXRMb2MuZ2V0UGF0aCgpOwotICAgICAgICB0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5zdWJzdHJpbmcoMCx0YXJnZXRQYXRoLmxhc3RJbmRleE9mKCcvJykpOwotICAgICAgICBpZighdGFyZ2V0QXJlYS5nZXRTaXRlKCkuY29udGFpbnModGFyZ2V0UGF0aCkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIGF1dGhvcmluZyBwYXRoIFsiICsgdGFyZ2V0UGF0aCArICJdIGRvZXMgbm90IGV4aXN0LiIpOwotICAgICAgICB9Ci0gICAgfQotICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUG9zdGNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1Bvc3Rjb25kaXRpb25zKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0VGFyZ2V0RG9jdW1lbnQodHJ1ZSk7Ci0gICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKHRoaXMubWFuYWdlciwgZ2V0U2Vzc2lvbigpLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLCBkb2MpOwotICAgICAgICBTdHJpbmcgc3RhdGUgPSB3b3JrZmxvd2FibGUuZ2V0TGF0ZXN0VmVyc2lvbigpLmdldFN0YXRlKCk7Ci0gICAgICAgIGlmICghc3RhdGUuZXF1YWxzKCJhdXRob3JpbmciKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGUgc3RhdGUgaXMgWyIgKyBzdGF0ZSArICJdIGluc3RlYWQgb2YgW2F1dGhvcmluZ10hIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1JldmlzaW9ucy5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1JldmlzaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTliYjMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9SZXZpc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuSGlzdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJldmlzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LldvcmtmbG93VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZTsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIGRpc3BsYXkgcmV2aXNpb25zIG9mIGEgcmVzb3VyY2UuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFJldmlzaW9ucyBleHRlbmRzIFNpdGVVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKSBUT0RPCi0gICAgICogICAgICBmaWx0ZXIgb3V0IGNoZWNraW4gZW50cmllcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICBEb2N1bWVudCBzb3VyY2VEb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBpZiAoc291cmNlRG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSGlzdG9yeSBoaXN0b3J5ID0gc291cmNlRG9jLmdldFJlcG9zaXRvcnlOb2RlKCkuZ2V0SGlzdG9yeSgpOwotCi0gICAgICAgICAgICAgICAgaW50W10gbnVtYmVycyA9IGhpc3RvcnkuZ2V0UmV2aXNpb25OdW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgUmV2aXNpb25bXSByZXZpc2lvbnMgPSBuZXcgUmV2aXNpb25bbnVtYmVycy5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICByZXZpc2lvbnNbaV0gPSBoaXN0b3J5LmdldFJldmlzaW9uKG51bWJlcnNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoInJldmlzaW9ucyIsIHJldmlzaW9ucyk7Ci0KLSAgICAgICAgICAgICAgICBCb29sZWFuIGNhblJvbGxiYWNrID0gQm9vbGVhbi52YWx1ZU9mKFdvcmtmbG93VXRpbC5jYW5JbnZva2UodGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnRGYWN0b3J5KCkuZ2V0U2Vzc2lvbigpLCBnZXRMb2dnZXIoKSwgc291cmNlRG9jLCBnZXRFdmVudCgpKSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJjYW5Sb2xsYmFjayIsIGNhblJvbGxiYWNrKTsKLQotICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1V0aWwuaGFzV29ya2Zsb3codGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBzb3VyY2VEb2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBzb3VyY2VEb2MpOwotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIGxhdGVzdFZlcnNpb24gPSB3b3JrZmxvd2FibGUuZ2V0TGF0ZXN0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXRlc3RWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gbGF0ZXN0VmVyc2lvbi5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dTY2hlbWEodGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBzb3VyY2VEb2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB3b3JrZmxvdy5nZXRJbml0aWFsU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoIndvcmtmbG93U3RhdGUiLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIC8vIHNpbmNlIHdlIG5lZWQgYm90aCBzdGF0ZSBhbmQgY2FuSW52b2tlLCB3ZSBjb3VsZCBkZWFsIHdpdGggdGhlCi0gICAgICAgICAgICAgKiBhdmFsb24gLy8gY29tcG9uZW50IG91cnNlbHZlcyByYXRoZXIgdGhhbiB1c2luZyBXb3JrZmxvd1V0aWwgLQotICAgICAgICAgICAgICogc2F2ZXMgb25lIC8vIHNlcnZpY2UgbWFuYWdlciBsb29rdXAuIC8vIHByb2JsZW0gaXMgdGhhdAotICAgICAgICAgICAgICogRG9jdW1lbnRXb3JrZmxvd2FibGUgaXMgbm90IHB1YmxpYyBhbmQgV29ya2Zsb3dhYmxlIGlzIGFic3RyYWN0IDooCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIFdvcmtmbG93TWFuYWdlciB3Zk1hbmFnZXIgPSBudWxsOyBTdHJpbmcgd29ya2Zsb3dTdGF0ZTsgQm9vbGVhbgotICAgICAgICAgICAgICogY2FuUm9sbGJhY2s7IHRyeSB7IHdmTWFuYWdlciA9IChXb3JrZmxvd01hbmFnZXIpCi0gICAgICAgICAgICAgKiB0aGlzLm1hbmFnZXIubG9va3VwKFdvcmtmbG93TWFuYWdlci5ST0xFKTsgV29ya2Zsb3dhYmxlCi0gICAgICAgICAgICAgKiB3b3JrZmxvd2FibGUgPSBuZXcgRG9jdW1lbnRXb3JrZmxvd2FibGUoIHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAqIGdldERvY3VtZW50RmFjdG9yeSgpLmdldFNlc3Npb24oKSwgc291cmNlRG9jLCBnZXRMb2dnZXIoKSApOwotICAgICAgICAgICAgICogd29ya2Zsb3dTdGF0ZSA9IHdvcmtmbG93YWJsZS5nZXRMYXRlc3RWZXJzaW9uKCkuZ2V0U3RhdGUoKTsKLSAgICAgICAgICAgICAqIGNhblJvbGxiYWNrID0gbmV3IEJvb2xlYW4od2ZNYW5hZ2VyLmNhbkludm9rZSh3b3JrZmxvd2FibGUsCi0gICAgICAgICAgICAgKiBXT1JLRkxPV19FVkVOVF9FRElUKSk7IH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcKLSAgICAgICAgICAgICAqIFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0gZmluYWxseSB7IGlmICh3Zk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICogbWFuYWdlci5yZWxlYXNlKHdmTWFuYWdlcik7IH0gfSBzZXRQYXJhbWV0ZXIoIndvcmtmbG93U3RhdGUiLAotICAgICAgICAgICAgICogd29ya2Zsb3dTdGF0ZSk7IHNldFBhcmFtZXRlcigiY2FuUm9sbGJhY2siLCBjYW5Sb2xsYmFjayk7Ci0gICAgICAgICAgICAgKi8KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlckFzU3RyaW5nKCJ3b3JrZmxvd0V2ZW50Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1JvbGxiYWNrLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvUm9sbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmOTk0MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvUm9sbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuVXNlY2FzZVdvcmtmbG93SGVscGVyOwotCi0vKioKLSAqIFJvbGxiYWNrLgotICovCi1wdWJsaWMgY2xhc3MgUm9sbGJhY2sgZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNnZXROb2Rlc1RvTG9jaygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbXSBvYmplY3RzID0geyBnZXRTb3VyY2VEb2N1bWVudCgpLmdldFJlcG9zaXRvcnlOb2RlKCkgfTsKLSAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgVXNlY2FzZVdvcmtmbG93SGVscGVyLmNoZWNrV29ya2Zsb3codGhpcy5tYW5hZ2VyLCB0aGlzLCBnZXRFdmVudCgpLCBnZXRTb3VyY2VEb2N1bWVudCgpLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotCi0gICAgICAgIGludCByZXZpc2lvbiA9IGdldFBhcmFtZXRlckFzSW50ZWdlcigicm9sbGJhY2tSZXZpc2lvbiIsIC0xKTsKLQotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGRvY3VtZW50LmdldFJlcG9zaXRvcnlOb2RlKCk7Ci0gICAgICAgIG5vZGUucm9sbGJhY2socmV2aXNpb24pOwotICAgICAgICAKLSAgICAgICAgV29ya2Zsb3dVdGlsLmludm9rZSh0aGlzLm1hbmFnZXIsIGdldFNlc3Npb24oKSwgZ2V0TG9nZ2VyKCksIGdldFNvdXJjZURvY3VtZW50KCksCi0gICAgICAgICAgICAgICAgZ2V0RXZlbnQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlckFzU3RyaW5nKCJ3b3JrZmxvd0V2ZW50Iik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvU2l0ZU92ZXJ2aWV3LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvU2l0ZU92ZXJ2aWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NTUyZTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1NpdGVPdmVydmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGU7Ci0KLS8qKgotICogT3ZlcnZpZXcgb3ZlciBhbGwgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZU92ZXJ2aWV3IGV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9ET0NVTUVOVFMgPSAiYWxsRG9jdW1lbnRzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVFMgPSAiZG9jdW1lbnRzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfV09SS0ZMT1dfU1RBVEVfVkFMVUVTID0gImZpbHRlcldvcmtmbG93U3RhdGVWYWx1ZXMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9SRVNPVVJDRV9UWVBFX1ZBTFVFUyA9ICJmaWx0ZXJSZXNvdXJjZVR5cGVWYWx1ZXMiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BBVEggPSAia2V5UGF0aCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JFU09VUkNFX1RZUEUgPSAia2V5UmVzb3VyY2VUeXBlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfV09SS0ZMT1dfU1RBVEUgPSAia2V5V29ya2Zsb3dTdGF0ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0xBTkdVQUdFID0gImtleUxhbmd1YWdlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTEFTVF9NT0RJRklFRCA9ICJrZXlMYXN0TW9kaWZpZWQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VUkwgPSAia2V5VXJsIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0hFQ0tFRF9PVVQgPSAia2V5Q2hlY2tlZE91dCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX0tFWVMgPSAia2V5cyI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEtFWVMgPSB7IEtFWV9QQVRILCBLRVlfTEFOR1VBR0UsIEtFWV9SRVNPVVJDRV9UWVBFLAotICAgICAgICAgICAgS0VZX1dPUktGTE9XX1NUQVRFLCBLRVlfTEFTVF9NT0RJRklFRCwgS0VZX0NIRUNLRURfT1VUIH07Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfUkVTT1VSQ0VfVFlQRSA9ICJmaWx0ZXJSZXNvdXJjZVR5cGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9XT1JLRkxPV19TVEFURSA9ICJmaWx0ZXJXb3JrZmxvd1N0YXRlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfTEFOR1VBR0UgPSAiZmlsdGVyTGFuZ3VhZ2UiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9GSUxURVJTID0gImZpbHRlcnMiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGSUxURVJTID0geyBGSUxURVJfTEFOR1VBR0UsIEZJTFRFUl9SRVNPVVJDRV9UWVBFLAotICAgICAgICAgICAgRklMVEVSX1dPUktGTE9XX1NUQVRFIH07Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9BTEwgPSAiLSBhbGwgLSI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1JUID0gInNvcnQiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVIgPSAib3JkZXIiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQyA9ICJkZXNjIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBU0MgPSAiYXNjIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBnZXREb2N1bWVudHMoKTsKLQotICAgICAgICAgICAgTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLQotICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50c1tpXS5oYXNMaW5rKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoS0VZX1BBVEgsIGRvY3VtZW50c1tpXS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlKEtFWV9QQVRILCAibm90IGluIHNpdGUgc3RydWN0dXJlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlKEtFWV9SRVNPVVJDRV9UWVBFLCBSZXNvdXJjZVR5cGUuSTE4Tl9QUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZG9jdW1lbnRzW2ldLmdldFJlc291cmNlVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoS0VZX0xBTkdVQUdFLCBkb2N1bWVudHNbaV0uZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoS0VZX1VSTCwgZG9jdW1lbnRzW2ldLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpKTsKLQotICAgICAgICAgICAgICAgIERhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdE1vZGlmaWVkID0gZm9ybWF0LmZvcm1hdChuZXcgRGF0ZShkb2N1bWVudHNbaV0uZ2V0TGFzdE1vZGlmaWVkKCkpKTsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShLRVlfTEFTVF9NT0RJRklFRCwgbGFzdE1vZGlmaWVkKTsKLQotICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1V0aWwuaGFzV29ya2Zsb3codGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBkb2N1bWVudHNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBkb2N1bWVudHNbaV0pOwotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIGxhdGVzdFZlcnNpb24gPSB3b3JrZmxvd2FibGUuZ2V0TGF0ZXN0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXRlc3RWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gbGF0ZXN0VmVyc2lvbi5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dTY2hlbWEodGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBkb2N1bWVudHNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB3b3JrZmxvdy5nZXRJbml0aWFsU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShLRVlfV09SS0ZMT1dfU1RBVEUsIHN0YXRlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShLRVlfV09SS0ZMT1dfU1RBVEUsICIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBkb2N1bWVudHNbaV0uZ2V0UmVwb3NpdG9yeU5vZGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobm9kZS5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShLRVlfQ0hFQ0tFRF9PVVQsIG5vZGUuZ2V0Q2hlY2tvdXRVc2VySWQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoS0VZX0NIRUNLRURfT1VULCAiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVudHJpZXMuYWRkKGVudHJ5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSUxURVJTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU29ydGVkU2V0IGZpbHRlclZhbHVlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgICAgICAgICAgICAgZmlsdGVyVmFsdWVzLmFkZChWQUxVRV9BTEwpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICJrZXkiICsgRklMVEVSU1tpXS5zdWJzdHJpbmcoImZpbHRlciIubGVuZ3RoKCkpOwotCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBkb2NzID0gZW50cmllcy5pdGVyYXRvcigpOyBkb2NzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpIGRvY3MubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZXMuYWRkKGVudHJ5LmdldFZhbHVlKGtleSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRklMVEVSU1tpXSArICJWYWx1ZXMiLCBmaWx0ZXJWYWx1ZXMpOwotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihGSUxURVJTW2ldLCBWQUxVRV9BTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFBBUkFNRVRFUl9GSUxURVJTLCBBcnJheXMuYXNMaXN0KEZJTFRFUlMpKTsKLQotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKEFMTF9ET0NVTUVOVFMsIG5ldyBBcnJheUxpc3QoZW50cmllcykpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKERPQ1VNRU5UUywgZW50cmllcyk7Ci0KLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihQQVJBTUVURVJfS0VZUywgQXJyYXlzLmFzTGlzdChLRVlTKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZG9jdW1lbnRzIGluIHRoZSBhdXRob3JpbmcgYXJlYS4KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudFtdIGdldERvY3VtZW50cygpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiwgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gZ2V0UHVibGljYXRpb24oKTsKLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGlkZW50aXR5TWFwID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCk7Ci0gICAgICAgIERvY3VtZW50W10gZG9jdW1lbnRzOwotCi0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIFNpdGVNYW5hZ2VyIHNpdGVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTaXRlTWFuYWdlci5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICBzaXRlTWFuYWdlciA9IChTaXRlTWFuYWdlcikgc2VsZWN0b3Iuc2VsZWN0KHB1YmxpY2F0aW9uLmdldFNpdGVNYW5hZ2VySGludCgpKTsKLSAgICAgICAgICAgIGRvY3VtZW50cyA9IHNpdGVNYW5hZ2VyLmdldERvY3VtZW50cyhpZGVudGl0eU1hcCwgcHVibGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShzaXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkb2N1bWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLCBnZXREb2N1bWVudEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBnZXRTb3VyY2VVUkwoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjYWR2YW5jZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWR2YW5jZSgpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuYWR2YW5jZSgpOwotCi0gICAgICAgIExpc3QgYWxsRG9jdW1lbnRzID0gKExpc3QpIGdldFBhcmFtZXRlcihBTExfRE9DVU1FTlRTKTsKLSAgICAgICAgTGlzdCBmaWx0ZXJlZERvY3VtZW50cyA9IG5ldyBBcnJheUxpc3QoYWxsRG9jdW1lbnRzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJTFRFUlMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAia2V5IiArIEZJTFRFUlNbaV0uc3Vic3RyaW5nKCJmaWx0ZXIiLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXJWYWx1ZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKEZJTFRFUlNbaV0pOwotICAgICAgICAgICAgaWYgKCFmaWx0ZXJWYWx1ZS5lcXVhbHMoVkFMVUVfQUxMKSkgewotICAgICAgICAgICAgICAgIEVudHJ5W10gZW50cmllcyA9IChFbnRyeVtdKSBmaWx0ZXJlZERvY3VtZW50cy50b0FycmF5KG5ldyBFbnRyeVtmaWx0ZXJlZERvY3VtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKV0pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGVudHJ5SW5kZXggPSAwOyBlbnRyeUluZGV4IDwgZW50cmllcy5sZW5ndGg7IGVudHJ5SW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWVudHJpZXNbZW50cnlJbmRleF0uZ2V0VmFsdWUoa2V5KS5lcXVhbHMoZmlsdGVyVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERvY3VtZW50cy5yZW1vdmUoZW50cmllc1tlbnRyeUluZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc29ydCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFNPUlQpOwotICAgICAgICBTdHJpbmcgb3JkZXIgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhPUkRFUiwgQVNDKTsKLSAgICAgICAgaWYgKHNvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IEVudHJ5Q29tcGFyYXRvcihzb3J0LCBvcmRlcik7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGZpbHRlcmVkRG9jdW1lbnRzLCBjb21wYXJhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFBhcmFtZXRlcihET0NVTUVOVFMsIGZpbHRlcmVkRG9jdW1lbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJhdG9yIGZvciBlbnRyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50cnlDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgICAgICBwcml2YXRlIFN0cmluZyBvcmRlcjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGNvbXBhcmUuCi0gICAgICAgICAqIEBwYXJhbSBvcmRlciBUaGUgb3JkZXIgc3RyaW5nICh7QGxpbmsgU2l0ZU92ZXJ2aWV3I0FTQ30gb3Ige0BsaW5rIFNpdGVPdmVydmlldyNERVNDfSkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRW50cnlDb21wYXJhdG9yKFN0cmluZyBrZXksIFN0cmluZyBvcmRlcikgewotICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0gICAgICAgICAgICBFbnRyeSBlMSA9IChFbnRyeSkgYXJnMDsKLSAgICAgICAgICAgIEVudHJ5IGUyID0gKEVudHJ5KSBhcmcxOwotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUxID0gZTEuZ2V0VmFsdWUodGhpcy5rZXkpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlMiA9IGUyLmdldFZhbHVlKHRoaXMua2V5KTsKLSAgICAgICAgICAgIGlmICh0aGlzLm9yZGVyLmVxdWFscyhERVNDKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUyLmNvbXBhcmVUbyh2YWx1ZTEpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTEuY29tcGFyZVRvKHZhbHVlMik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlcyBkb2N1bWVudC1yZWxhdGVkIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50cnkgewotCi0gICAgICAgIHByaXZhdGUgTWFwIHZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRW50cnkoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIGtleSkgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHRoaXMudmFsdWVzLmdldChrZXkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9TaXRlVXNlY2FzZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1NpdGVVc2VjYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OGFkMDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1NpdGVVc2VjYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotCi0vKioKLSAqIFN1cGVyIGNsYXNzIGZvciBzaXRlIHJlbGF0ZWQgdXNlY2FzZXMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFNpdGVVc2VjYXNlIGV4dGVuZHMgRG9jdW1lbnRVc2VjYXNlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9Db3B5UGFzdGVUZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NvcHlQYXN0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlMmQxYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NvcHlQYXN0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2VUZXN0OwotCi1wdWJsaWMgY2xhc3MgQ29weVBhc3RlVGVzdCBleHRlbmRzIEFic3RyYWN0VXNlY2FzZVRlc3QgewotCi0gICAgU3RyaW5nIFBBUkVOVF9QQVRIID0gIi9kb2N0eXBlcyI7Ci0gICAgU3RyaW5nIENISUxEX1VSTCA9ICIvdGVzdC9hdXRob3JpbmcvZG9jdHlwZXMvY2Zvcm1zLmh0bWwiOwotICAgIFN0cmluZyBWRVJJRklDQVRJT05fUEFUSCA9ICIvZG9jdHlwZXMvY2Zvcm1zL2RvY3R5cGVzL2Nmb3JtcyI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZWNhc2VOYW1lKCkgewotICAgICAgICByZXR1cm4gInNpdGVtYW5hZ2VtZW50LnBhc3RlIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoInByaXZhdGUuc291cmNlVXJsIiwgQ0hJTERfVVJMKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlVXNlY2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5wcmVwYXJlVXNlY2FzZSgpOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgc2l0ZSA9IHB1Yi5nZXRBcmVhKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKS5nZXRTaXRlKCk7Ci0gICAgICAgIERvY3VtZW50IHBhcmVudCA9IHNpdGUuZ2V0Tm9kZShQQVJFTlRfUEFUSCkuZ2V0TGluayhwdWIuZ2V0RGVmYXVsdExhbmd1YWdlKCkpLmdldERvY3VtZW50KCk7Ci0KLSAgICAgICAgQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQocGFyZW50LCBDbGlwYm9hcmQuTUVUSE9EX0NPUFkpOwotICAgICAgICBDbGlwYm9hcmRIZWxwZXIgaGVscGVyID0gbmV3IENsaXBib2FyZEhlbHBlcigpOwotICAgICAgICBoZWxwZXIuc2F2ZUNsaXBib2FyZCh0aGlzLmNvbnRleHQsIGNsaXBib2FyZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tQb3N0Y29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5jaGVja1Bvc3Rjb25kaXRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbigidGVzdCIpOwotICAgICAgICBTaXRlU3RydWN0dXJlIHNpdGUgPSBwdWIuZ2V0QXJlYShQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSkuZ2V0U2l0ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHNpdGUuY29udGFpbnMoVkVSSUZJQ0FUSU9OX1BBVEgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL01vdmVTdWJzaXRlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9Nb3ZlU3Vic2l0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNDk3NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL01vdmVTdWJzaXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkFyZWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZVRlc3Q7Ci0KLS8qKgotICogVGVzdCBjbGFzcyBmb3IgbW92aW5nIHN1YnNpdGVzIHRvIGEgZGlmZmVyZW50IGFyZWEuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlU3Vic2l0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFVzZWNhc2VUZXN0IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAiL2Zvby9iYXIvYmF6IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfVVJMID0gIi90ZXN0L2F1dGhvcmluZyIgKyBQQVRIICsgIi5odG1sIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfVVJMID0gIi90ZXN0L2F1dGhvcmluZy9mb29fZGUuaHRtbCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1BBVEggPSAiL3R1dG9yaWFsIjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlY2FzZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAic2l0ZW1hbmFnZW1lbnQuZGVsZXRlIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc3Rjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRUYXJnZXRVcmwoKS5zdGFydHNXaXRoKFRBUkdFVF9VUkwpKTsKLQotICAgICAgICBzdXBlci5jaGVja1Bvc3Rjb25kaXRpb25zKCk7Ci0KLSAgICAgICAgQXJlYSBhdXRob3JpbmcgPSBnZXRQdWJsaWNhdGlvbigidGVzdCIpLmdldEFyZWEoImF1dGhvcmluZyIpOwotICAgICAgICBTaXRlU3RydWN0dXJlIGF1dGhvcmluZ1NpdGUgPSBhdXRob3JpbmcuZ2V0U2l0ZSgpOwotICAgICAgICBhc3NlcnRGYWxzZShhdXRob3JpbmdTaXRlLmNvbnRhaW5zKFBBVEgpKTsKLQotICAgICAgICBBcmVhIHRyYXNoID0gZ2V0UHVibGljYXRpb24oInRlc3QiKS5nZXRBcmVhKCJ0cmFzaCIpOwotICAgICAgICBTaXRlU3RydWN0dXJlIHRyYXNoU2l0ZSA9IHRyYXNoLmdldFNpdGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0cmFzaFNpdGUuY29udGFpbnMoUEFUSCkpOwotICAgICAgICBTdHJpbmcgdHJhc2hVdWlkID0gdHJhc2hTaXRlLmdldE5vZGUoUEFUSCkuZ2V0VXVpZCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRyYXNoVXVpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cmFzaFV1aWQsIHRoaXMudXVpZCk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwYXJhbXMucHV0KCJwcml2YXRlLnNvdXJjZVVybCIsIERFTEVURV9VUkwpOwotICAgICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHV1aWQ7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlVXNlY2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5wcmVwYXJlVXNlY2FzZSgpOwotICAgICAgICBBcmVhIGF1dGhvcmluZyA9IGdldFB1YmxpY2F0aW9uKCJ0ZXN0IikuZ2V0QXJlYSgiYXV0aG9yaW5nIik7Ci0KLSAgICAgICAgU2l0ZVN0cnVjdHVyZSBhdXRob3JpbmdTaXRlID0gYXV0aG9yaW5nLmdldFNpdGUoKTsKLSAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IGF1dGhvcmluZ1NpdGUuZ2V0Tm9kZShTT1VSQ0VfUEFUSCk7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TGluaygiZW4iKS5nZXREb2N1bWVudCgpOwotCi0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2NNZ3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jTWdyID0gKERvY3VtZW50TWFuYWdlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwdWJJZCA9IGRvYy5nZXRQdWJsaWNhdGlvbigpLmdldElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYXJlYSA9IGRvYy5nZXRBcmVhKCk7Ci0gICAgICAgICAgICBEb2N1bWVudExvY2F0b3IgbG9jID0gRG9jdW1lbnRMb2NhdG9yLmdldExvY2F0b3IocHViSWQsIGFyZWEsIFBBVEgsIGRvYy5nZXRMYW5ndWFnZSgpKTsKLQotICAgICAgICAgICAgYXV0aG9yaW5nU2l0ZS5hZGQoIi9mb28iKTsKLSAgICAgICAgICAgIGF1dGhvcmluZ1NpdGUuYWRkKCIvZm9vL2JhciIpOwotCi0gICAgICAgICAgICBkb2NNZ3IuY29weShkb2MsIGxvYyk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBhbiBhbmNlc3RvciBsYW5ndWFnZSB2ZXJzaW9uIHRvIHRlc3QgdGhlIG1ldGhvZAotICAgICAgICAgICAgLy8gTW92ZVN1YlNpdGUuZ2V0VGFyZ2V0VVJMKCkKLSAgICAgICAgICAgIERvY3VtZW50TG9jYXRvciBhbmNlc3RvckxvYyA9IERvY3VtZW50TG9jYXRvci5nZXRMb2NhdG9yKHB1YklkLCBhcmVhLCAiL2ZvbyIsICJkZSIpOwotICAgICAgICAgICAgZG9jTWdyLmNvcHkoZG9jLCBhbmNlc3RvckxvYyk7Ci0KLSAgICAgICAgICAgIFNpdGVOb2RlIGNoaWxkTm9kZSA9IGF1dGhvcmluZ1NpdGUuZ2V0Tm9kZShQQVRIKTsKLSAgICAgICAgICAgIHRoaXMudXVpZCA9IGNoaWxkTm9kZS5nZXRVdWlkKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZG9jTWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShkb2NNZ3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjcwZmYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDY1NjQgMjAwNi0wOS0xNSAxMDoxMzoxNlogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotDQotICA8bWVzc2FnZSBrZXk9InNpdGVtYW5hZ2VtZW50LmRlbGV0ZSI+RGVsZXRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InNpdGVtYW5hZ2VtZW50LmFyY2hpdmUiPkFyY2hpdmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic2l0ZW1hbmFnZW1lbnQucmVzdG9yZSI+UmVzdG9yZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjdXQtZXJyb3ItaXNsaXZlIj5UaGUgbm9kZSBjYW5ub3QgYmUgY3V0IHdoZW4gYSBsYW5ndWFnZSB2ZXJzaW9uIGlzIHB1Ymxpc2hlZC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGFyZW50IFBhdGgiPlBhcmVudCBQYXRoPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJOb2RlIE5hbWUiPk5vZGUgTmFtZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJtaXNzaW5nLW5vZGUtbmFtZSI+UGxlYXNlIGVudGVyIGEgbm9kZSBuYW1lLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJub2RlLW5hbWUtc3BlY2lhbC1jaGFyYWN0ZXJzIj5UaGUgbm9kZSBuYW1lIG1heSBub3QgY29udGFpbiBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEb2N1bWVudCB2aXNpYmxlIGluIE5hdmlnYXRpb24iPlZpc2libGUgaW4gTmF2aWdhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZWxhdGlvbiI+UmVsYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGFnZSBMYXlvdXQiPlBhZ2UgTGF5b3V0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvY3VtZW50IFBhdGgiPlBhdGg8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTWV0YSBEYXRhIj5NZXRhIERhdGE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm8tYXNzZXRzIj5ObyBhc3NldHMgdXBsb2FkZWQgeWV0LjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0b3IiPkVkaXRvcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJtaXNzaW5nLWxhbmd1YWdlcyI+TWlzc2luZyBMYW5ndWFnZXM8YnIvPiAoY2xpY2sgdG8gY3JlYXRlKTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOYW1lc3BhY2UiPk5hbWVzcGFjZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvIj5EdWJsaW4gQ29yZSBUZXJtczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+RHVibGluIENvcmUgRWxlbWVudHM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idmFsdWUtbm90LXNldCI+bm90IHNldDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbmhlcml0ZWQgY3JlZGVudGlhbHMiPkluaGVyaXRlZCBjcmVkZW50aWFsczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdWJ0cmVlIGNyZWRlbnRpYWxzIj5TdWJ0cmVlIGNyZWRlbnRpYWxzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBzdWJ0cmVlIGNyZWRlbnRpYWwiPk5ldyBzdWJ0cmVlIGNyZWRlbnRpYWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm8tam9icy1zY2hlZHVsZWQiPk5vIGpvYnMgc2NoZWR1bGVkLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyBvdmVydmlldyBhdmFpbGFibGUuIj5ObyBvdmVydmlldyBhdmFpbGFibGUuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im1pc3NpbmctbmF2aWdhdGlvbi10aXRsZSI+UGxlYXNlIGVudGVyIGEgbmF2aWdhdGlvbiB0aXRsZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibWlzc2luZy1wYWdlLWxheW91dCI+UGxlYXNlIHNlbGVjdCBhIHBhZ2UgbGF5b3V0LjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJwYXRoLWFscmVhZHktZXhpc3RzIj5UaGUgcGF0aCB7MH0gYWxyZWFkeSBleGlzdHMuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InllcyI+eWVzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vIj5ubzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUeXBlIj5UeXBlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1ldGhvZCI+TWV0aG9kPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImdyYW50Ij5ncmFudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZW55Ij5kZW55PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IndvcmxkIj5Xb3JsZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJvbmx5LWluLWF1dGhvcmluZy1hcmVhIj5UaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBpbiB0aGUgYXV0aG9yaW5nIGFyZWEuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNsaXBib2FyZC1lbXB0eSI+VGhlIGNsaXBib2FyZCBpcyBlbXB0eS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVzb3VyY2UgVHlwZSI+UmVzb3VyY2UgVHlwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNaW1lIFR5cGUiPk1pbWUgVHlwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEb2N1bWVudCBTaXplIj5Eb2N1bWVudCBTaXplPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vLXJvbGxiYWNrIj5Sb2xsYmFjayBpcyBkaXNhYmxlZC48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IndvcmtmbG93LXN0YXRlIj5Xb3JrZmxvdyBzdGF0ZSBpcyAiezB9Ii48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InZpZXctcmV2aXNpb24taW4tbmV3LXdpbmRvdyI+dmlldyByZXZpc2lvbiBpbiBuZXcgd2luZG93PC9tZXNzYWdlPiAgDQotICA8bWVzc2FnZSBrZXk9InZpZXctcmV2aXNpb24iPlZpZXcgcmV2aXNpb248L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImlzLWN1cnJlbnQtdmVyc2lvbiI+KGlzIGN1cnJlbnQpPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJyb2xsYmFjayI+Um9sbCBiYWNrPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJyb2xsYmFjay1vayI+cm9sbCBiYWNrIHRvIHRoaXMgdmVyc2lvbjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0ibm8tcm9sbGJhY2staW4tcmV2aWV3Ij5Sb2xsYmFjayBkaXNhYmxlZC4gRG9jdW1lbnQgaXMgaW4NCi0gIHJldmlldyBzdGF0ZS48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Im5vLXJvbGxiYWNrLW5vLXByaXZpbGVnZXMiPlJvbGxiYWNrIGRpc2FibGVkLiBZb3UgZG8gbm90DQotICBoYXZlIHN1ZmZpY2llbnQgcHJpdmlsZWdlcy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0id2lsbC1wYXN0ZS1pbi1vd24tc3VidHJlZSI+Q2FuJ3QgcGFzdGUgYSBjdXQgZG9jdW1lbnQgaW4gaXRzIG93biBzdWJ0cmVlLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDaGFuZ2UgRG9jdW1lbnQgVVJMIj5DaGFuZ2UgRG9jdW1lbnQgVVJMPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNoYW5nZS1kb2N1bWVudC11cmwiPkNoYW5nZSB0aGUgVVJMIG9mIGRvY3VtZW50IDxxPnswfTwvcT48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IFVSTCBGcmFnbWVudCI+TmV3IFVSTCBGcmFnbWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgZG9jdW1lbnQgSUQgaXMgbm90IHZhbGlkLiI+VGhlIFVSTCBmcmFnbWVudCBpcyBub3QgdmFsaWQuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBkb2N1bWVudCBjYW4ndCBiZSBkZWxldGVkIGlmIGEgbGl2ZSB2ZXJzaW9uIGV4aXN0cy4iPgotICAgIFRoZSBkb2N1bWVudCBjYW4ndCBiZSBkZWxldGVkIGlmIGEgbGl2ZSB2ZXJzaW9uIGV4aXN0cy4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNoaWxkIj5DaGlsZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzaWJsaW5nIGFmdGVyIj5Gb2xsb3dpbmcgc2libGluZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgbGFzdCBsYW5ndWFnZSB2ZXJzaW9uIGNhbm5vdCBiZSByZW1vdmVkLiI+VGhlIGxhc3QgbGFuZ3VhZ2UgdmVyc2lvbiBjYW5ub3QgYmUgcmVtb3ZlZC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWxsIGxhbmd1YWdlIHZlcnNpb25zIGFscmVhZHkgZXhpc3QuIj5BbGwgbGFuZ3VhZ2UgdmVyc2lvbnMgYWxyZWFkeSBleGlzdC48L21lc3NhZ2U+Ci0gIAotICA8IS0tIGZvcmNlIGNoZWNrLWluIC0tPgotICA8bWVzc2FnZSBrZXk9ImZvcmNlLWNoZWNraW4iPkZvcmNlIENoZWNrLUluPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZvcmNlLWNoZWNraW4tcXVlc3Rpb24iPkRvIHlvdSByZWFsbHkgd2FudCB0byBjaGVjay1pbiB0aGUgZG9jdW1lbnQgJ3swfSc/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVzZXItbG9nZ2VkLWluIj5UaGUgdXNlciAnezB9JyBpcyBzdGlsbCBsb2dnZWQgaW4uPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ1c2VyLW5vdC1sb2dnZWQtaW4iPlRoZSB1c2VyICd7MH0nIGlzIG5vdCBsb2dnZWQgaW4gYW55bW9yZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm90LWNoZWNrZWQtb3V0Ij5UaGUgZG9jdW1lbnQgJ3swfScgaXMgbm90IGNoZWNrZWQgb3V0LjwvbWVzc2FnZT4KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmY2NjZTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWlfZGUueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0ic2l0ZW1hbmFnZW1lbnQuZGVsZXRlIj5Mw7ZzY2hlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzaXRlbWFuYWdlbWVudC5hcmNoaXZlIj5BcmNoaXZpZXJlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzaXRlbWFuYWdlbWVudC5yZXN0b3JlIj5XaWVkZXJoZXJzdGVsbGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImN1dC1lcnJvci1pc2xpdmUiPkRlciBLbm90ZW4ga2FubiBuaWNodCBhdXNnZXNjaG5pdHRlbiB3ZXJkZW4gd2VubiBlaW5lIFNwcmFjaHZlcnNpb24gcHVibGl6aWVydCBpc3QuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJQYXJlbnQgUGF0aCI+w5xiZXJnZW9yZG5ldGVyIFBmYWQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm9kZSBOYW1lIj5Lbm90ZW4tTmFtZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJtaXNzaW5nLW5vZGUtbmFtZSI+Qml0dGUgZ2ViZW4gU2llIGVpbmVuIEtub3Rlbi1OYW1lbiBlaW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vZGUtbmFtZS1zcGVjaWFsLWNoYXJhY3RlcnMiPkRlciBLbm90ZW4tTmFtZSBkYXJmIGtlaW5lIFNvbmRlcnplaWNoZW4gZW50aGFsdGVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEb2N1bWVudCB2aXNpYmxlIGluIE5hdmlnYXRpb24iPlNpY2h0YmFyIGluIE5hdmlnYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVsYXRpb24iPlJlbGF0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhZ2UgTGF5b3V0Ij5TZWl0ZW5sYXlvdXQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnQgUGF0aCI+UGZhZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNZXRhIERhdGEiPk1ldGEtRGF0ZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm8tYXNzZXRzIj5FcyB3dXJkZW4gbm9jaCBrZWluZSBBbmxhZ2VuIGhvY2hnZWxhZGVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0b3IiPkJlYXJiZWl0ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibWlzc2luZy1sYW5ndWFnZXMiPkZlaGxlbmRlIFNwcmFjaGVuPGJyLz4gKEtsaWNrZW4genVtIEVyc3RlbGxlbik8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmFtZXNwYWNlIj5OYW1lbnNyYXVtPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Imh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8iPkR1Ymxpbi1Db3JlLVRlcm1lPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5EdWJsaW4tQ29yZS1FbGVtZW50ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ2YWx1ZS1ub3Qtc2V0Ij5uaWNodCBnZXNldHp0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkluaGVyaXRlZCBjcmVkZW50aWFscyI+VmVyZXJidGUgQmVyZWNodGlndW5nZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3VidHJlZSBjcmVkZW50aWFscyI+QmVyZWNodGlndW5nZW4gZsO8ciBkaWVzZW4gVGVpbGJhdW08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IHN1YnRyZWUgY3JlZGVudGlhbCI+TmV1ZSBCZXJlY2h0aWd1bmcgZsO8ciBkaWVzZW4gVGVpbGJhdW08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm8tam9icy1zY2hlZHVsZWQiPkVzIHd1cmRlbiBrZWluZSB6ZWl0Z2VzdGV1ZXJ0ZW4gQWt0aW9uZW4gZ2VzdGFydGV0LjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyBvdmVydmlldyBhdmFpbGFibGUuIj5FcyBpc3Qga2VpbmUgw5xiZXJzaWNodCB2ZXJmw7xnYmFyLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJtaXNzaW5nLW5hdmlnYXRpb24tdGl0bGUiPkJpdHRlIGdlYmVuIFNpZSBlaW5lbiBOYXZpZ2F0aW9uc3RpdGVsIGVpbi48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibWlzc2luZy1wYWdlLWxheW91dCI+Qml0dGUgd8OkaGxlbiBTaWUgZWluIFNlaXRlbi1MYXlvdXQuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InBhdGgtYWxyZWFkeS1leGlzdHMiPkRlciBQZmFkIHswfSBleGlzdGllcnQgYmVyZWl0cy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ieWVzIj5qYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJubyI+bmVpbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUeXBlIj5UeXA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTWV0aG9kIj5NZXRob2RlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImdyYW50Ij5lcmxhdWJlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZW55Ij52ZXJiaWV0ZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0id29ybGQiPldlbHQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ib25seS1pbi1hdXRob3JpbmctYXJlYSI+RGllc2VyIFVzZWNhc2Uga2FubiBudXIgaW0gQXV0aG9yaW5nLUJlcmVpY2ggYXVzZ2Vmw7xocnQgd2VyZGVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjbGlwYm9hcmQtZW1wdHkiPkRpZSBad2lzY2hlbmFibGFnZSBpc3QgbGVlci48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVzb3VyY2UgVHlwZSI+UmVzc291cmNlbi1UeXA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTWltZSBUeXBlIj5NaW1lLVR5cGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnQgU2l6ZSI+R3LDtsOfZSBkZXMgRG9rdW1lbnRzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vLXJvbGxiYWNrIj5Sb2xsYmFjayBpc3QgZGVha3RpdmllcnQuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ3b3JrZmxvdy1zdGF0ZSI+RGFzIERva3VtZW50IGlzdCBpbSBBcmJlaXRzc2Nocml0dCAiezB9Ii48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InZpZXctcmV2aXNpb24taW4tbmV3LXdpbmRvdyI+VmVyc2lvbiBpbiBuZXVlbSBGZW5zdGVyIGFuc2VoZW48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InZpZXctcmV2aXNpb24iPlZlcnNpb24gYW5zZWhlbjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaXMtY3VycmVudC12ZXJzaW9uIj4oYWt0dWVsbCk8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InJvbGxiYWNrIj5XaWVkZXJoZXJzdGVsbGVuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJyb2xsYmFjay1vayI+ZGllc2UgVmVyc2lvbiB3aWVkZXJoZXJzdGVsbGVuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJuby1yb2xsYmFjay1pbi1yZXZpZXciPkltIEFyYmVpdHNzY2hyaXR0ICJGcmVpZ2FiZSIgaXN0DQotICBrZWluZSBXaWVkZXJoZXJzdGVsbHVuZyBtw7ZnbGljaC48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Im5vLXJvbGxiYWNrLW5vLXByaXZpbGVnZXMiPktlaW5lIGF1c3JlaWNoZW5kZW4gUmVjaHRlIHp1bSBXaWVkZXJoZXJzdGVsbGVuLjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0id2lsbC1wYXN0ZS1pbi1vd24tc3VidHJlZSI+Ci0gICAgRWluIGF1c2dlc2Nobml0dGVuZXMgRG9rdW1lbnQga2FubiBuaWNodCBpbSBlaWdlbmVuIFRlaWxiYXVtIGVpbmdlZsO8Z3Qgd2VyZGVuLgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2hhbmdlIERvY3VtZW50IFVSTCI+VVJMIGRlcyBEb2t1bWVudHMgw6RuZGVybjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjaGFuZ2UtZG9jdW1lbnQtdXJsIj5VUkwgZGVzIERva3VtZW50cyA8cT57MH08L3E+IMOkbmRlcm48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IFVSTCBGcmFnbWVudCI+TmV1ZXMgVVJMLUZyYWdtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBkb2N1bWVudCBJRCBpcyBub3QgdmFsaWQuIj5EYXMgVVJMLUZyYWdtZW50IGlzdCB1bmfDvGx0aWcuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBkb2N1bWVudCBjYW4ndCBiZSBkZWxldGVkIGlmIGEgbGl2ZSB2ZXJzaW9uIGV4aXN0cy4iPgotICAgIERhcyBEb2t1bWVudCBrYW5uIG5pY2h0IGdlbMO2c2NodCB3ZXJkZW4sIHdlbm4gZWluZSBMaXZlLVZlcnNpb24gZXhpc3RpZXJ0LgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY2hpbGQiPktpbmQtRG9rdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic2libGluZyBhZnRlciI+Rm9sZ2VuZGVzIEdlc2Nod2lzdGVyLURva3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBsYXN0IGxhbmd1YWdlIHZlcnNpb24gY2Fubm90IGJlIHJlbW92ZWQuIj5EaWUgbGV0enRlIFNwcmFjaHZlcnNpb24ga2FubiBuaWNodCBnZWzDtnNjaHQgd2VyZGVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBbGwgbGFuZ3VhZ2UgdmVyc2lvbnMgYWxyZWFkeSBleGlzdC4iPkVzIGV4aXN0aWVyZW4gYmVyZWl0cyBhbGxlIFNwcmFjaHZlcnNpb25lbi48L21lc3NhZ2U+Ci0gIA0KLSAgPCEtLSBmb3JjZSBjaGVjay1pbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJmb3JjZS1jaGVja2luIj5DaGVjay1JbiBlcnp3aW5nZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZm9yY2UtY2hlY2tpbi1xdWVzdGlvbiI+V29sbGVuIFNpZSBkYXMgRG9rdW1lbnQgInswfSIgd2lya2xpY2ggZWluY2hlY2tlbj88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXNlci1sb2dnZWQtaW4iPkRlciBOdXR6ZXIgInswfSIgaXN0IG5vY2ggZWluZ2Vsb2dndC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXNlci1ub3QtbG9nZ2VkLWluIj5EZXIgTnV0emVyICJ7MH0iIGlzdCBuaWNodCBtZWhyIGVpbmdlbG9nZ3QuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vdC1jaGVja2VkLW91dCI+RGFzIERva3VtZW50ICJ7MH0iIGlzdCBuaWNodCBhdXNnZWNoZWNrdC48L21lc3NhZ2U+Ci08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3Jlc291cmNlcy9qYXZhc2NyaXB0L2xlbnlhVGFicy5qcyBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvcmVzb3VyY2VzL2phdmFzY3JpcHQvbGVueWFUYWJzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhkZjhkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvcmVzb3VyY2VzL2phdmFzY3JpcHQvbGVueWFUYWJzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0qIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0qIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0qICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0qIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLWZ1bmN0aW9uIGxlbnlhR2V0VGl0bGUobnVtKSB7Ci0gIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVueWFUYWJUaXRsZScgKyBudW0pOwotfQotCi1mdW5jdGlvbiBsZW55YUdldEJvZHkobnVtKSB7Ci0gIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVueWFUYWJCb2R5JyArIG51bSk7Ci19Ci0KLWZ1bmN0aW9uIGxlbnlhSW5pdFRhYnMoY291bnQpIHsKLSAgbGVueWFUb2dnbGVUYWIoY291bnQsIDApOwotfQotCi1mdW5jdGlvbiBsZW55YVRvZ2dsZVRhYihjb3VudCwgbnVtKSB7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIHZhciB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZW55YVRhYlRpdGxlJyArIGkpOwotICAgIHZhciBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlbnlhVGFiQm9keScgKyBpKTsKLSAgICBpZiAoaSA9PSBudW0pIHsKLSAgICAgIHRpdGxlLmNsYXNzTmFtZSA9ICdsZW55YVRhYlRpdGxlQWN0aXZlJzsKLSAgICAgIGJvZHkuY2xhc3NOYW1lID0gJ2xlbnlhVGFiQm9keUFjdGl2ZSc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdGl0bGUuY2xhc3NOYW1lID0gJ2xlbnlhVGFiVGl0bGUnOwotICAgICAgYm9keS5jbGFzc05hbWUgPSAnbGVueWFUYWJCb2R5JzsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3Rlc3QvY2Fub28vdGVzdC54bWwgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3Rlc3QvY2Fub28vdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDliZDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC90ZXN0L2Nhbm9vL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IURPQ1RZUEUgcHJvamVjdCBTWVNURU0gIi4uLy4uLy4uLy4uL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby9sZW55YV93ZWJ0ZXN0LmR0ZCI+Ci0KLTxwcm9qZWN0IG5hbWU9InNpdGVtYW5hZ2VtZW50IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIj4KLQotICA8aW1wb3J0IGZpbGU9Ii4uLy4uLy4uLy4uL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby9tYWNyb3MueG1sIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJtYWluIj4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InNpdGVtYW5hZ2VtZW50LmRlbGV0ZSI+Ci0gICAgICA8cGFyYW0gbmFtZT0id2VidGVzdC5jb25maWcuYmFzZXBhdGgiIHZhbHVlPSJkZWZhdWx0Ii8+Ci0gICAgPC9hbnRjYWxsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InNpdGVtYW5hZ2VtZW50LmRlbGV0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im51bWJlciIgdmFsdWU9IjEiLz4KLSAgICA8d2VidGVzdCBuYW1lPSJzaXRlbWFuYWdlbWVudC5kZWxldGUiPgotICAgICAgJmRvQ29uZmlnOwotICAgICAgPHN0ZXBzPgotICAgICAgICA8ZG9Mb2dpbiB1c2VybmFtZT0ibGVueWEiIHBhc3N3b3JkPSJsZXZpIiB1cmw9ImF1dGhvcmluZy9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxyZXBlYXQgY291bnQ9IiR7bnVtYmVyfSI+Ci0gICAgICAgICAgPGVjaG8+RGVsZXRlL1Jlc3RvcmUvQXJjaGl2ZS9SZXN0b3JlOiBUZXN0ICN7Y291bnR9IG9mICR7bnVtYmVyfTwvZWNobz4KLQotICAgICAgICAgIDwhLS0gZGVsZXRlIC0tPgotICAgICAgICAgIDxpbnZva2UgdXJsPSJhdXRob3JpbmcvdHV0b3JpYWwuaHRtbD9sZW55YS51c2VjYXNlPXNpdGVtYW5hZ2VtZW50LmRlbGV0ZSIvPgotICAgICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iRGVsZXRlIERvY3VtZW50Ii8+Ci0gICAgICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotICAgICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iT3ZlcnZpZXciLz4KLSAgICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJObyBvdmVydmlldyBhdmFpbGFibGUuIi8+Ci0gICAgICAgICAgPGludm9rZSB1cmw9InRyYXNoL3R1dG9yaWFsLmh0bWw/bGVueWEudXNlY2FzZT10YWIub3ZlcnZpZXciLz4KLSAgICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0ic3BhbiIgbmFtZT0id29ya2Zsb3ctc3RhdGUiIHRleHQ9InRyYXNoIi8+Ci0KLSAgICAgICAgICA8IS0tIHJlc3RvcmUgLS0+Ci0gICAgICAgICAgPGludm9rZSB1cmw9InRyYXNoL3R1dG9yaWFsLmh0bWw/bGVueWEudXNlY2FzZT1zaXRlbWFuYWdlbWVudC5yZXN0b3JlIi8+Ci0gICAgICAgICAgPHZlcmlmeUVsZW1lbnRUZXh0IHR5cGU9ImgxIiB0ZXh0PSJSZXN0b3JlIERvY3VtZW50Ii8+Ci0gICAgICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotICAgICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iT3ZlcnZpZXciLz4KLSAgICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJBIHNob3J0IHR1dG9yaWFsIG9uIHVzaW5nIEFwYWNoZSBMZW55YSIvPgotICAgICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJzcGFuIiBuYW1lPSJ3b3JrZmxvdy1zdGF0ZSIgdGV4dD0iYXV0aG9yaW5nIi8+Ci0KLSAgICAgICAgICA8IS0tIGFyY2hpdmUgLS0+Ci0gICAgICAgICAgPGludm9rZSB1cmw9ImF1dGhvcmluZy90dXRvcmlhbC5odG1sP2xlbnlhLnVzZWNhc2U9c2l0ZW1hbmFnZW1lbnQuYXJjaGl2ZSIvPgotICAgICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iQXJjaGl2ZSBEb2N1bWVudCIvPgotICAgICAgICAgIDxjbGlja0J1dHRvbiBuYW1lPSJzdWJtaXQiLz4KLSAgICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0iaDEiIHRleHQ9Ik92ZXJ2aWV3Ii8+Ci0gICAgICAgICAgPHZlcmlmeVRleHQgdGV4dD0iTm8gb3ZlcnZpZXcgYXZhaWxhYmxlLiIvPgotICAgICAgICAgIDxpbnZva2UgdXJsPSJhcmNoaXZlL3R1dG9yaWFsLmh0bWw/bGVueWEudXNlY2FzZT10YWIub3ZlcnZpZXciLz4KLSAgICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0ic3BhbiIgbmFtZT0id29ya2Zsb3ctc3RhdGUiIHRleHQ9ImFyY2hpdmUiLz4KLQotICAgICAgICAgIDwhLS0gcmVzdG9yZSAtLT4KLSAgICAgICAgICA8aW52b2tlIHVybD0iYXJjaGl2ZS90dXRvcmlhbC5odG1sP2xlbnlhLnVzZWNhc2U9c2l0ZW1hbmFnZW1lbnQucmVzdG9yZSIvPgotICAgICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iUmVzdG9yZSBEb2N1bWVudCIvPgotICAgICAgICAgIDxjbGlja0J1dHRvbiBuYW1lPSJzdWJtaXQiLz4KLSAgICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0iaDEiIHRleHQ9Ik92ZXJ2aWV3Ii8+Ci0gICAgICAgICAgPHZlcmlmeVRleHQgdGV4dD0iQSBzaG9ydCB0dXRvcmlhbCBvbiB1c2luZyBBcGFjaGUgTGVueWEiLz4KLSAgICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0ic3BhbiIgbmFtZT0id29ya2Zsb3ctc3RhdGUiIHRleHQ9ImF1dGhvcmluZyIvPgotCi0gICAgICAgIDwvcmVwZWF0PgotICAgICAgICA8ZG9Mb2dvdXQvPgotICAgICAgPC9zdGVwcz4KLSAgICA8L3dlYnRlc3Q+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2FyY2hpdmUuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvYXJjaGl2ZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2N2RjNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvYXJjaGl2ZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0gICAgICAgICAgIAotICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0PkFyY2hpdmUgRG9jdW1lbnQ8L2kxOG46dGV4dD48L3BhZ2U6dGl0bGU+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8aTE4bjp0ZXh0IGtleT0iYXJjaGl2ZS1kb2MiLz4KLSAgICAgICAgICA8aTE4bjpwYXJhbT48cT48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudCcpLmdldExpbmsoKS5nZXRMYWJlbCgpfSIvPjwvcT48L2kxOG46cGFyYW0+Ci0gICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICA8L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGZvcm0gbWV0aG9kPSJnZXQiIGlkPSJmb3JtLWFyY2hpdmVfZG9jdW1lbnQiPgotICAgICAgICAgIAotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0IGtleT0iYXJjaGl2ZS1kb2M/Ii8+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48c3Ryb25nPjxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykuZ2V0TGluaygpLmdldExhYmVsKCl9Ii8+PC9zdHJvbmc+PC9pMThuOnBhcmFtPgotICAgICAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+PGJyLz48YnIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke25vdChlbXB0eSh1c2VjYXNlLmdldFBhcmFtZXRlcignaW5jb25zaXN0ZW50ZG9jdW1lbnQnKSkpfSI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsZW55YS1mb3JtLW1lc3NhZ2UtZXJyb3IiPjxpMThuOnRleHQga2V5PSJkb2NzLWhhdmUtbGlua3MtdG8tZG9jIi8+Ojwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9Iml0ZW0iIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdpbmNvbnNpc3RlbnRkb2N1bWVudCcpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJ7QGhyZWZ9Ij48ang6b3V0IHZhbHVlPSIke2l0ZW0uaWR9Ii8+PGp4Om91dCB2YWx1ZT0iLiIvPjwvYT48YnIvPgotICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQXJjaGl2ZSIvPiYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY2hhbmdlTGFiZWwuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY2hhbmdlTGFiZWwuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTgxY2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NoYW5nZUxhYmVsLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogcmVuYW1lTGFiZWwuanggMTIzMzY0IDIwMDQtMTItMjYgMTY6MTE6MjdaIGdyZWdvciAkIC0tPgotPHBhZ2U6cGFnZSB4bWxuczpjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAKLSAgICAgICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgICAgICAgICAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICAgICAgICAgICA+Ci0gICAgICAgICAgIAotICA8cGFnZTp0aXRsZT4KLSAgICA8aTE4bjp0ZXh0PkVkaXQgTmF2aWdhdGlvbiBUaXRsZTwvaTE4bjp0ZXh0PgotICA8L3BhZ2U6dGl0bGU+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8aTE4bjp0ZXh0IGtleT0icmVuYW1lLWxhYmVsLWRvYyIvPgotICAgICAgICAgIDxpMThuOnBhcmFtPgotICAgICAgICAgICAgPHE+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKQotICAgICAgICAgICAgICAgIC5nZXRNZXRhRGF0YSgnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nKQotICAgICAgICAgICAgICAgIC5nZXRGaXJzdFZhbHVlKCd0aXRsZScpfSIvPjwvcT4KLSAgICAgICAgICA8L2kxOG46cGFyYW0+Ci0gICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICA8L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiIgaWQ9ImZvcm0tY2hhbmdlX2xhYmVsIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJsYWJlbCI+PGkxOG46dGV4dD5OZXcgTmF2aWdhdGlvbiBUaXRsZTwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgbmFtZT0ibGFiZWwiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdsYWJlbCcpfSIvPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTYXZlIi8+Ci0gICAgICAgICAgICAgICAgJiMxNjA7Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZm9ybT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9jaGFuZ2VOb2RlSUQuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY2hhbmdlTm9kZUlELmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjUwYWQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9jaGFuZ2VOb2RlSUQuangKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiByZW5hbWVMYWJlbC5qeCAxMjMzNjQgMjAwNC0xMi0yNiAxNjoxMToyN1ogZ3JlZ29yICQgLS0+Ci08cGFnZTpwYWdlIHhtbG5zOmM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICAgICAgICAgICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gICAgICAgICAgID4KLSAgICAgICAgICAgCi0gIDxwYWdlOnRpdGxlPgotICAgIDxpMThuOnRleHQ+Q2hhbmdlIERvY3VtZW50IFVSTDwvaTE4bjp0ZXh0PgotICA8L3BhZ2U6dGl0bGU+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8aTE4bjp0ZXh0IGtleT0iY2hhbmdlLWRvY3VtZW50LXVybCIvPgotICAgICAgICAgIDxpMThuOnBhcmFtPjxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykuZ2V0TGluaygpLmdldExhYmVsKCl9Ii8+PC9pMThuOnBhcmFtPgotICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgPC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiIGlkPSJmb3JtLWNoYW5nZV9ub2RlX2lkIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJub2RlSWQiPjxpMThuOnRleHQ+TmV3IFVSTCBGcmFnbWVudDwvaTE4bjp0ZXh0PjogKjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiBuYW1lPSJub2RlSWQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdub2RlSWQnKX0iLz48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkLz4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU2F2ZSIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9jb3B5Lmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NvcHkuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZWUxYTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NvcHkuangKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTxwYWdlOnBhZ2UgeG1sbnM6Yz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gICAgICAgICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgCi0gICAgICAgICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gICAgICAgICAgIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgICAgICAgICAgPgotICAgICAgICAgICAKLSAgPHBhZ2U6dGl0bGU+Ci0gICAgPGkxOG46dGV4dD5Db3B5IERvY3VtZW50PC9pMThuOnRleHQ+Ci0gIDwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD5Db3B5IERvY3VtZW50PC9pMThuOnRleHQ+Ci0gICAgICA8L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGZvcm0gbWV0aG9kPSJnZXQiIGFjdGlvbj0iIiBpZD0iZm9ybS1jb3B5X2RvY3VtZW50Ij4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dCBrZXk9ImNvcHktZG9jLXRvLWNsaXA/Ii8+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT4ke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudCcpLmdldExpbmsoKS5nZXRMYWJlbCgpfTwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQ29weSIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY3JlYXRlLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NyZWF0ZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmMjczNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY3JlYXRlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLSAgCi0gIDxwYWdlOnRpdGxlPgotICAgIDxqeDpjaG9vc2U+Ci0gICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N0eXBlJykgPT0gbnVsbH0iPgotICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgPGkxOG46dGV4dD5OZXcgRG9jdW1lbnQ8L2kxOG46dGV4dD4KLSAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgIDwvang6d2hlbj4KLSAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8aTE4bjp0ZXh0Pk5ldyAuLi4gRG9jdW1lbnQ8L2kxOG46dGV4dD4KLSAgICAgICAgICA8aTE4bjpwYXJhbT48aTE4bjp0ZXh0PnJlc291cmNlVHlwZS08ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N0eXBlJyl9Ii8+PC9pMThuOnRleHQ+PC9pMThuOnBhcmFtPgotICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgPC9qeDpjaG9vc2U+Ci0gIDwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgIDxpMThuOnRleHQ+TmV3IERvY3VtZW50PC9pMThuOnRleHQ+Ci0gICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICA8L2Rpdj4KLSAgICAgIAotICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgCi0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0tY3JlYXRlIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NyZWF0ZUZpZWxkcy5qeCIvPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIi8+Ci0gICAgICAgICAgICAgICAgJiMxNjA7Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZm9ybT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NyZWF0ZUZpZWxkcy5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9jcmVhdGVGaWVsZHMuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZWZmZjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NyZWF0ZUZpZWxkcy5qeAorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGNyZWF0ZS5qeCA0ODYyMTMgMjAwNi0xMi0xMiAxNjoxNDozMFogYW5kcmVhcyAkIC0tPgotCi08ang6dGVtcGxhdGUgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0gIAotICA8ang6c2V0IHZhcj0ibmV3TGFuZ3VhZ2VWZXJzaW9uIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKS5lcXVhbHMoJ3NpdGVtYW5hZ2VtZW50LmNyZWF0ZUxhbmd1YWdlJyl9Ii8+Ci0gIAotICA8ang6Y2hvb3NlPgotICAgIDxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3BhdGhQcm92aWRlZCcpfSI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0ibm9kZU5hbWUiPjxpMThuOnRleHQ+UGF0aDwvaTE4bjp0ZXh0PjogPC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3BhdGgnKX0iLz4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC9qeDp3aGVuPgotICAgIDxqeDp3aGVuIHRlc3Q9IiR7bmV3TGFuZ3VhZ2VWZXJzaW9ufSI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0ibm9kZU5hbWUiPjxpMThuOnRleHQ+UGF0aDwvaTE4bjp0ZXh0PjogPC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3BhdGgnKX0iLz4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC9qeDp3aGVuPgotICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0ibm9kZU5hbWUiPjxpMThuOnRleHQ+UGFyZW50IFBhdGg8L2kxOG46dGV4dD46IDwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdwYXJlbnRQYXRoJyl9Ii8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgIDxsYWJlbCBmb3I9Im5vZGVOYW1lIj48aTE4bjp0ZXh0Pk5vZGUgTmFtZTwvaTE4bjp0ZXh0Pio6IDwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIgbmFtZT0ibm9kZU5hbWUiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdub2RlTmFtZScpfSIvPgotICAgICAgICAgIDxici8+ICg8aTE4bjp0ZXh0Pk5vIHdoaXRlc3BhY2UsIG5vIHNwZWNpYWwgY2hhcmFjdGVyczwvaTE4bjp0ZXh0PikKLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC9qeDpvdGhlcndpc2U+Ci0gIDwvang6Y2hvb3NlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgIDxsYWJlbCBmb3I9ImR1YmxpbmNvcmUudGl0bGUiPjxpMThuOnRleHQ+TmF2aWdhdGlvbiBUaXRsZTwvaTE4bjp0ZXh0Pio6IDwvbGFiZWw+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIKLSAgICAgICAgbmFtZT0iZHVibGluY29yZS50aXRsZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2R1YmxpbmNvcmUudGl0bGUnKX0iLz4KLSAgICA8L3RkPgotICA8L3RyPgotICA8ang6aWYgdGVzdD0iJHshbmV3TGFuZ3VhZ2VWZXJzaW9ufSI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgPGxhYmVsIGZvcj0idmlzaWJsZWlubmF2Ij48aTE4bjp0ZXh0PkRvY3VtZW50IHZpc2libGUgaW4gTmF2aWdhdGlvbjwvaTE4bjp0ZXh0Pio6IDwvbGFiZWw+PC90ZD4KLSAgICAgIDxqeDpzZXQgdmFyPSJ2aXNpYmxlIiB2YWx1ZT0ieWVzIi8+Ci0gICAgICA8ang6aWYgdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndmlzaWJsZUluTmF2JykuZXF1YWxzKCdmYWxzZScpfSI+Ci0gICAgICAgIDxqeDpzZXQgdmFyPSJ2aXNpYmxlIiB2YWx1ZT0ibm8iLz4KLSAgICAgIDwvang6aWY+IAotICAgICAgPHRkPgotICAgICAgICA8c2VsZWN0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIG5hbWU9InZpc2libGVJbk5hdiI+Ci0gICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dmlzaWJsZS5lcXVhbHMoJ3llcycpfSI+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InRydWUiIHNlbGVjdGVkPSJzZWxlY3RlZCI+PGkxOG46dGV4dD55ZXM8L2kxOG46dGV4dD48L29wdGlvbj4KLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZmFsc2UiPjxpMThuOnRleHQ+bm88L2kxOG46dGV4dD48L29wdGlvbj4KLSAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InRydWUiPjxpMThuOnRleHQ+eWVzPC9pMThuOnRleHQ+PC9vcHRpb24+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImZhbHNlIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPjxpMThuOnRleHQ+bm88L2kxOG46dGV4dD48L29wdGlvbj4KLSAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC9qeDppZj4KLSAgPGp4OnNldCB2YXI9InJlbGF0aW9ucyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3JlbGF0aW9ucycpfSIvPgotICA8ang6aWYgdGVzdD0iJHtyZWxhdGlvbnMuc2l6ZSgpICZndDsgMX0iPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgIDxsYWJlbCBmb3I9InJlbGF0aW9uIj48aTE4bjp0ZXh0PlJlbGF0aW9uPC9pMThuOnRleHQ+KjogPC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxqeDpmb3JFYWNoIHZhcj0icmVsYXRpb24iIGl0ZW1zPSIke3JlbGF0aW9uc30iPgotICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3JlbGF0aW9uLmVxdWFscyh1c2VjYXNlLmdldFBhcmFtZXRlcigncmVsYXRpb24nKSl9Ij4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZWxhdGlvbiIgdmFsdWU9IiR7cmVsYXRpb259IiBjaGVja2VkPSJjaGVja2VkIi8+PGkxOG46dGV4dD4ke3JlbGF0aW9ufTwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZWxhdGlvbiIgdmFsdWU9IiR7cmVsYXRpb259Ii8+PGkxOG46dGV4dD4ke3JlbGF0aW9ufTwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC9qeDppZj4KLSAgPGp4OnNldCB2YXI9Imxhbmd1YWdlcyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2xhbmd1YWdlcycpfSIvPgotICA8ang6Y2hvb3NlPgotICAgIDxqeDp3aGVuIHRlc3Q9IiR7bGFuZ3VhZ2VzLnNpemUoKSAmZ3Q7IDF9Ij4gICAgICAgICAgICAKLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJsYW5ndWFnZSI+PGkxOG46dGV4dD5MYW5ndWFnZTwvaTE4bjp0ZXh0Pio6IDwvbGFiZWw+PC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgbmFtZT0ibGFuZ3VhZ2UiPgotICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJsYW5ndWFnZSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2xhbmd1YWdlcycpfSI+Ci0gICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHtsYW5ndWFnZS5lcXVhbHModXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2xhbmd1YWdlJykpfSI+Ci0gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke2xhbmd1YWdlfSIgc2VsZWN0ZWQ9InNlbGVjdGVkIj4ke2xhbmd1YWdlfSAoPGkxOG46dGV4dD4ke2xhbmd1YWdlfTwvaTE4bjp0ZXh0Pik8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7bGFuZ3VhZ2V9Ij4ke2xhbmd1YWdlfSAoPGkxOG46dGV4dD4ke2xhbmd1YWdlfTwvaTE4bjp0ZXh0Pik8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvang6d2hlbj4KLSAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgIDxsYWJlbCBmb3I9Imxhbmd1YWdlIj48aTE4bjp0ZXh0Pkxhbmd1YWdlPC9pMThuOnRleHQ+OiA8L2xhYmVsPjwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8ang6c2V0IHZhcj0ibGFuZ3VhZ2UiIHZhbHVlPSIke2xhbmd1YWdlc1swXX0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9IiR7bGFuZ3VhZ2V9Ii8+Ci0gICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtsYW5ndWFnZX0iLz4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC9qeDpvdGhlcndpc2U+Ci0gIDwvang6Y2hvb3NlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgIDxsYWJlbCBmb3I9ImR1YmxpbmNvcmUuY3JlYXRvciI+PGkxOG46dGV4dD5DcmVhdG9yPC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIgbmFtZT0iZHVibGluY29yZS5jcmVhdG9yIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZHVibGluY29yZS5jcmVhdG9yJyl9Ii8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICA8bGFiZWwgZm9yPSJkdWJsaW5jb3JlLnN1YmplY3QiPjxpMThuOnRleHQ+U3ViamVjdDwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9ImR1YmxpbmNvcmUuc3ViamVjdCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2R1YmxpbmNvcmUuc3ViamVjdCcpfSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgPGxhYmVsIGZvcj0iZHVibGluY29yZS5wdWJsaXNoZXIiPjxpMThuOnRleHQ+UHVibGlzaGVyPC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIgbmFtZT0iZHVibGluY29yZS5wdWJsaXNoZXIiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkdWJsaW5jb3JlLnB1Ymxpc2hlcicpfSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgPGkxOG46dGV4dD5EYXRlPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgPHRkPgotICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZHVibGluY29yZS5kYXRlJyl9Ii8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICA8bGFiZWwgZm9yPSJkdWJsaW5jb3JlLnJpZ2h0cyI+PGkxOG46dGV4dD5SaWdodHM8L2kxOG46dGV4dD46PC9sYWJlbD48L3RkPgotICAgIDx0ZD4KLSAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJkdWJsaW5jb3JlLnJpZ2h0cyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2R1YmxpbmNvcmUucmlnaHRzJyl9Ii8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPGp4OnNldCB2YXI9InJlc291cmNlVHlwZXMiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdyZXNvdXJjZVR5cGVzJyl9Ii8+Ci0gIDxqeDppZiB0ZXN0PSIke3Jlc291cmNlVHlwZXMuc2l6ZSgpICAmZ3Q7IDB9Ij4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICA8bGFiZWwgZm9yPSJzYW1wbGUiPjxpMThuOnRleHQ+UmVzb3VyY2UgVHlwZTwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxzZWxlY3QgbmFtZT0iZG9jdHlwZSI+Ci0gICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJpdGVtIiBpdGVtcz0iJHtyZXNvdXJjZVR5cGVzfSI+Ci0gICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N0eXBlJykuZXF1YWxzKGl0ZW0pfSI+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHtpdGVtfSIgc2VsZWN0ZWQ9InNlbGVjdGVkIj4ke2l0ZW19PC9vcHRpb24+Ci0gICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke2l0ZW19Ij4ke2l0ZW19PC9vcHRpb24+Ci0gICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC9qeDppZj4KLSAgPGp4OnNldCB2YXI9InNhbXBsZXMiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzYW1wbGVzJyl9Ii8+Ci0gIDxqeDppZiB0ZXN0PSIke3NhbXBsZXMuc2l6ZSgpICZndDsgMCAmYW1wOyZhbXA7ICFuZXdMYW5ndWFnZVZlcnNpb259Ij4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wIj4KLSAgICAgICAgPGxhYmVsIGZvcj0ic2FtcGxlIj48aTE4bjp0ZXh0PlBhZ2UgTGF5b3V0PC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJpdGVtIiBpdGVtcz0iJHtzYW1wbGVzfSI+Ci0gICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3NhbXBsZScpLmVxdWFscyhpdGVtKX0iPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNhbXBsZSIgdmFsdWU9IiR7aXRlbX0iIGNoZWNrZWQ9ImNoZWNrZWQiLz4ke2l0ZW19PGJyIC8+Ci0gICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNhbXBsZSIgdmFsdWU9IiR7aXRlbX0iLz4ke2l0ZW19PGJyIC8+Ci0gICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L2p4OmlmPiAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPiogPGkxOG46dGV4dD5yZXF1aXJlZCBmaWVsZHM8L2kxOG46dGV4dD4KLSAgICA8L3RkPgotICA8L3RyPgotICAKLTwvang6dGVtcGxhdGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY3JlYXRlTGFuZ3VhZ2UuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY3JlYXRlTGFuZ3VhZ2UuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWM4MjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NyZWF0ZUxhbmd1YWdlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLQotICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0Pk5ldyBMYW5ndWFnZSBWZXJzaW9uPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0Pk5ldyBMYW5ndWFnZSBWZXJzaW9uPC9pMThuOnRleHQ+Ci0gICAgICA8L2Rpdj4KLQotICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgCi0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0tY3JlYXRlX2xhbmd1YWdlIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NyZWF0ZUZpZWxkcy5qeCIvPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAmIzE2MDsKLSAgICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9mb3JtPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY3V0Lmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2N1dC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhYjU5NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvY3V0Lmp4CisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08cGFnZTpwYWdlIHhtbG5zOmM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICAgICAgICAgICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gICAgICAgICAgID4KLSAgICAgICAgICAgCi0gIDxwYWdlOnRpdGxlPgotICAgIDxpMThuOnRleHQ+Q3V0IERvY3VtZW50PC9pMThuOnRleHQ+Ci0gIDwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD5DdXQgRG9jdW1lbnQ8L2kxOG46dGV4dD4KLSAgICAgIDwvZGl2PgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICA8Zm9ybSBtZXRob2Q9ImdldCIgYWN0aW9uPSIiIGlkPSJmb3JtLWN1dF9kb2N1bWVudCI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQga2V5PSJjdXQtZG9jLXRvLWNsaXA/Ii8+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT4ke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudCcpLmdldExpbmsoKS5nZXRMYWJlbCgpfTwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQ3V0Ii8+Ci0gICAgICAgICAgICAgICAgJiMxNjA7Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZm9ybT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9kZWFjdGl2YXRlLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2RlYWN0aXZhdGUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDZlY2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2RlYWN0aXZhdGUuangKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08cGFnZTpwYWdlIHhtbG5zOmM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiA+Ci0gICAgICAgICAgIAotICA8cGFnZTp0aXRsZT4KLSAgICA8aTE4bjp0ZXh0PkRlYWN0aXZhdGUgRG9jdW1lbnQ8L2kxOG46dGV4dD4KLSAgPC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgPGkxOG46dGV4dCBrZXk9ImRlYWN0aXZhdGUtZG9jIi8+Ci0gICAgICAgICAgPGkxOG46cGFyYW0+Ci0gICAgICAgICAgICA8cT4KLSAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRpZCcpfSIvPgotICAgICAgICAgICAgPC9xPgotICAgICAgICAgIDwvaTE4bjpwYXJhbT4KLSAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgIDwvZGl2PgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7bm90KGVtcHR5KHVzZWNhc2UuZ2V0UGFyYW1ldGVyKCdtZXNzYWdlJykpKX0iPiA8IS0tIHRoZXJlIGlzIGEgd2FybmluZyAtLT4KLSAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iZ2V0IiBpZD0iZm9ybS1kZWFjdGl2YXRlIj4KLSAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPjxpMThuOnRleHQ+RGVhY3RpdmF0ZSBEb2N1bWVudDwvaTE4bjp0ZXh0PjwvZGl2PgotICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PkRvY3VtZW50PC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRkPjxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50aWQnKX0iLz4gWzxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2xhbmd1YWdlJyl9Ii8+XTwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PlByb2JsZW08L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGVueWEtZm9ybS1lcnJvciI+PGkxOG46dGV4dCBrZXk9ImNhbm5vdC1kZWFjdGl2YXRlLXVubGVzcy1jaGlsZHJlbi1kZWFjdGl2YXRlZCIvPjo8L3NwYW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iaXRlbSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2xpdmVjaGlsZHJlbicpfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IntAaHJlZn0iPjxqeDpvdXQgdmFsdWU9IiR7aXRlbS5pZH0iLz4gWzxqeDpvdXQgdmFsdWU9IiR7aXRlbS5sYW5ndWFnZX0iLz5dPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgICA8aW5wdXQgb25DbGljaz0ibG9jYXRpb24uaHJlZj0neyRyZXF1ZXN0LXVyaX0nOyIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQ2FuY2VsIiBuYW1lPSJpbnB1dC1jYW5jZWwiLz4KLSAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgPGp4Om90aGVyd2lzZT4gPCEtLSBubyB3YXJuaW5nIC0tPgotICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJnZXQiIGFjdGlvbj0iIj4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9ImRlYWN0aXZhdGUiLz4KLSAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dCBrZXk9ImRlYWN0aXZhdGUtZG9jPyIvPgotICAgICAgICAgICAgICAgICAgICAgIDxpMThuOnBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRpZCcpfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgPC9pMThuOnBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke25vdChlbXB0eSh1c2VjYXNlLmdldFBhcmFtZXRlcignaW5jb25zaXN0ZW50ZG9jdW1lbnQnKSkpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxlbnlhLWZvcm0tbWVzc2FnZS1lcnJvciI+PGkxOG46dGV4dCBrZXk9ImRvY3MtaGF2ZS1saW5rcy10by1kb2MiLz46PC9zcGFuPgotICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iaXRlbSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2luY29uc2lzdGVudGRvY3VtZW50Jyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJ7QGhyZWZ9Ij48ang6b3V0IHZhbHVlPSIke2l0ZW0uaWR9Ii8+PGp4Om91dCB2YWx1ZT0iLiIvPjwvYT48YnIvPgotICAgICAgICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxici8+PGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkRlYWN0aXZhdGUiIG5hbWU9ImlucHV0LWRlYWN0aXZhdGUiLz4mIzE2MDsgCi0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJidXR0b24iIG9uQ2xpY2s9ImxvY2F0aW9uLmhyZWY9JyR7cmVxdWVzdHVyaX0nOyIgdmFsdWU9IkNhbmNlbCIgbmFtZT0iaW5wdXQtY2FuY2VsIi8+IAotICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgPC9mb3JtPgotICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9kZWxldGUuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvZGVsZXRlLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQyZjc4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9kZWxldGUuangKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiIAotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgPgotICAKLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5EZWxldGUgRG9jdW1lbnQ8L2kxOG46dGV4dD48L3BhZ2U6dGl0bGU+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8aTE4bjp0ZXh0IGtleT0iZGVsZXRlLWRvYyIvPgotICAgICAgICAgIDxqeDpzZXQgdmFyPSJkb2N1bWVudCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50Jyl9Ii8+Ci0gICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7ZG9jdW1lbnQuaGFzTGluaygpfSI+Ci0gICAgICAgICAgICAgIDxpMThuOnBhcmFtPjxxPjxqeDpvdXQgdmFsdWU9IiR7ZG9jdW1lbnQuZ2V0TGluaygpLmdldExhYmVsKCl9Ii8+PC9xPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDxpMThuOnBhcmFtPihub3QgYXZhaWxhYmxlKTwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgPC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0tZGVsZXRlIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5oYXNFcnJvcnMoKX0iPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0IGtleT0iZGVsZXRlLWxhbmd1YWdlLXZlcnNpb25zPyIvPgotICAgICAgICAgICAgICAgICAgICAgIDxpMThuOnBhcmFtPjxzdHJvbmc+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKS5nZXRMaW5rKCkuZ2V0TGFiZWwoKX0iLz48L3N0cm9uZz48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+PGJyLz48YnIvPgotICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke25vdChlbXB0eSh1c2VjYXNlLmdldFBhcmFtZXRlcignaW5jb25zaXN0ZW50ZG9jdW1lbnQnKSkpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxlbnlhLWZvcm0tbWVzc2FnZS1lcnJvciI+PGkxOG46dGV4dCBrZXk9ImRvY3MtaGF2ZS1saW5rcy10by1kb2MiLz46PC9zcGFuPgotICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iaXRlbSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2luY29uc2lzdGVudGRvY3VtZW50Jyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJ7QGhyZWZ9Ij48ang6b3V0IHZhbHVlPSIke2l0ZW0uaWR9Ii8+PGp4Om91dCB2YWx1ZT0iLiIvPjwvYT48YnIvPgotICAgICAgICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkRlbGV0ZSIvPgotICAgICAgICAgICAgICAgICAgICAmIzE2MDsKLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9mb3JtPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2RlbGV0ZUxhbmd1YWdlLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2RlbGV0ZUxhbmd1YWdlLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTc0YjJjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9kZWxldGVMYW5ndWFnZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbG9naW4uanggMTIzOTg2IDIwMDUtMDEtMDMgMTU6MjM6MTFaIGFuZHJlYXMgJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLQotICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0PlJlbW92ZSBMYW5ndWFnZSBWZXJzaW9uPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PlJlbW92ZSBMYW5ndWFnZSBWZXJzaW9uPC9pMThuOnRleHQ+Ci0gICAgICA8L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBpZD0iZm9ybS1kZWxldGVfbGFuZ3VhZ2UiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+RG9jdW1lbnQ8L2kxOG46dGV4dD46IDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKS5nZXRMaW5rKCkuZ2V0TGFiZWwoKX0iLz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+TGFuZ3VhZ2U8L2kxOG46dGV4dD4qOiA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykuZ2V0TGFuZ3VhZ2UoKX0iLz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkLz4KLSAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJEZWxldGUiLz4KLSAgICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9mb3JjZUNoZWNrSW4uanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvZm9yY2VDaGVja0luLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAxMTY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9mb3JjZUNoZWNrSW4uangKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRlbGV0ZS5qeCA0OTkwNjAgMjAwNy0wMS0yMyAxNTo1MDo1NlogYW5kcmVhcyAkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiIAotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgPgotICAKLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5mb3JjZS1jaGVja2luPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxwPgotICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICA8aTE4bjp0ZXh0IGtleT0iZm9yY2UtY2hlY2tpbi1xdWVzdGlvbiIvPgotICAgICAgICA8ang6c2V0IHZhcj0iZG9jdW1lbnQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudCcpfSIvPgotICAgICAgICA8aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke2RvY3VtZW50LmdldE1ldGFEYXRhKCdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpLmdldEZpcnN0VmFsdWUoJ3RpdGxlJyl9Ii8+PC9pMThuOnBhcmFtPgotICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgIAotICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiIGlkPSJmb3JtLWZvcmNlX2NoZWNraW4iPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4KLSAgICAgIAotICAgICAgPHA+Ci0gICAgICAgIDxqeDppZiB0ZXN0PSIkeyF1c2VjYXNlLmhhc0Vycm9ycygpfSI+Ci0gICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ii8+Ci0gICAgICAgICAgJiMxNjA7Ci0gICAgICAgIDwvang6aWY+Ci0gICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgPC9wPgotICAgIDwvZm9ybT4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvcGFzdGUuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvcGFzdGUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkN2M5MTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL3Bhc3RlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08cGFnZTpwYWdlIHhtbG5zOmM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICAgICAgICAgICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gICAgICAgICAgID4KLSAgICAgICAgICAgCi0gIDxwYWdlOnRpdGxlPgotICAgIDxpMThuOnRleHQ+UGFzdGUgRG9jdW1lbnQ8L2kxOG46dGV4dD4KLSAgPC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PlBhc3RlIERvY3VtZW50PC9pMThuOnRleHQ+Ci0gICAgICA8L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiIgaWQ9ImZvcm0tcGFzdGUiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0IGtleT0icGFzdGUtZG9jLWZyb20tY2xpcD8iLz4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnBhcmFtPiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2NsaXBib2FyZExhYmVsJyl9PC9pMThuOnBhcmFtPgotICAgICAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJQYXN0ZSIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3NpdGUvcmVzdG9yZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9yZXN0b3JlLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjlhYWUxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9yZXN0b3JlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAKLSAgICAgICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgPgotICAgICAgICAgICAKLSAgPHBhZ2U6dGl0bGU+Ci0gICAgPGkxOG46dGV4dD5SZXN0b3JlIERvY3VtZW50PC9pMThuOnRleHQ+Ci0gIDwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgIDxpMThuOnRleHQga2V5PSJyZXN0b3JlLWRvYyIvPgotICAgICAgICAgIDxpMThuOnBhcmFtPgotICAgICAgICAgICAgPHE+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykuZ2V0TGluaygpLmdldExhYmVsKCl9Ii8+Ci0gICAgICAgICAgICA8L3E+Ci0gICAgICAgICAgPC9pMThuOnBhcmFtPgotICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgPC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmhhc0Vycm9ycygpfSI+CQkKLSAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIG9uQ2xpY2s9ImxvY2F0aW9uLmhyZWY9JyR7cmVxdWVzdHVyaX0nOyIgdmFsdWU9IkJhY2siLz4KLSAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0tcmVzdG9yZSI+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgPGkxOG46dGV4dCBrZXk9InJlc3RvcmUtZG9jPyIvPgotICAgICAgICAgICAgICAgIDxpMThuOnBhcmFtPgotICAgICAgICAgICAgICAgICAgPHN0cm9uZz4KLSAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKS5nZXRMaW5rKCkuZ2V0TGFiZWwoKX0iLz4KLSAgICAgICAgICAgICAgICAgIDwvc3Ryb25nPgotICAgICAgICAgICAgICAgIDwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgPGJyLz48YnIvPgotICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJSZXN0b3JlIi8+Ci0gICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgPC9qeDpjaG9vc2U+CQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYWMvYWMuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hYy9hYy5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZjAwMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hYy9hYy5qeAorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogYWMuanggMTU2MTYxIDIwMDUtMDMtMDQgMTU6MjM6MjFaIGFuZHJlYXMgJCAtLT4KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIj4KLSAgCi0gIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2hlYWQuangiLz4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0Ci0gICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvc2l0ZXRyZWUuangiLz4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICAKLSAgICA8ang6c2V0IHZhcj0iYXJlYSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2FjQXJlYScpfSIvPgotICAgIAotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWItc2l0ZXRyZWUiPgotICAgICAgCi0gICAgICA8aDE+PGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0VmlldygpLmdldFRhYigpLmdldExhYmVsKCl9Ii8+PC9pMThuOnRleHQ+PC9oMT4KLQotICAgICAgPCEtLQotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRvZ2dsZWQiPgotICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPjxpMThuOnRleHQ+SGVscDwvaTE4bjp0ZXh0PjwvZGl2PgotICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgICAgSSBndWVzcyBhIGhlbHAgdGV4dCB3b3VsZCBiZSBuZWNlc3NhcnkgZm9yIHRoaXMgcGFnZS4KLSAgICAgICAgICBXb3VsZCBzb21lb25lIG1pbmQgYWRkaW5nIHNvbWUgaGludHM/IE9yIG1heWJlIHdlIHNob3VsZCBhZGQgYQotICAgICAgICAgIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCi0gICAgICAgIDwvZGl2PgotICAgICAgPC9kaXY+Ci0gICAgICAtLT4KLSAgICAgIAotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1IiBzdHlsZT0iYm9yZGVyLWxlZnQ6IDA7IGJvcmRlci1yaWdodDogMDsgYm9yZGVyLXRvcDogMHB4OyI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KLSAgICAgICAgICAgIDxqeDppbXBvcnQKLSAgICAgICAgICAgICAgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2FjL3NzbC1mb3JtLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1IiBzdHlsZT0iYm9yZGVyLWxlZnQ6IDA7IGJvcmRlci1yaWdodDogMDsiPgotICAgICAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW46IDMwcHggMCAwIDA7Ij4KLSAgICAgICAgICAgICAgPGkxOG46dGV4dD5Jbmhlcml0ZWQgY3JlZGVudGlhbHM8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvaDQ+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PlR5cGU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PklEPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGg+PGkxOG46dGV4dD5Sb2xlPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGggY29sc3Bhbj0iMiI+PGkxOG46dGV4dD5NZXRob2Q8L2kxOG46dGV4dD48L3RoPgotICAgICAgICA8L3RyPgotICAgICAgICA8ang6Zm9yRWFjaCB2YXI9ImNyZWRlbnRpYWwiCi0gICAgICAgICAgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3BhcmVudENyZWRlbnRpYWxzJyl9Ij4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHtjcmVkZW50aWFsLmdldFR5cGUoKX0iLz48L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7Y3JlZGVudGlhbC5nZXRBY2NyZWRpdGFibGVJZCgpfSIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtjcmVkZW50aWFsLmdldFJvbGVJZCgpfSIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgPGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke2NyZWRlbnRpYWwuZ2V0TWV0aG9kKCl9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjUiIHN0eWxlPSJib3JkZXItbGVmdDogMDsgYm9yZGVyLXJpZ2h0OiAwOyI+Ci0gICAgICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbjogMzBweCAwIDAgMDsiPgotICAgICAgICAgICAgICA8aTE4bjp0ZXh0PlN1YnRyZWUgY3JlZGVudGlhbHM8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvaDQ+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PlR5cGU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PklEPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGg+PGkxOG46dGV4dD5Sb2xlPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGg+PGkxOG46dGV4dD5NZXRob2Q8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD4mIzE2MDsKLSAgICAgICAgICA8L3RoPgotICAgICAgICA8L3RyPgotICAgICAgICA8ang6Zm9yRWFjaCB2YXI9ImNyZWRlbnRpYWwiIHZhclN0YXR1cz0ic3RhdHVzIgotICAgICAgICAgIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzdWJDcmVkZW50aWFscycpfSI+Ci0gICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBpZD0iZm9ybS1kZWxldGVTdWJDcmVkZW50aWFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTdWJtaXQiLz4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHtjcmVkZW50aWFsLmdldFR5cGUoKX0iLz48L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IiR7Y3JlZGVudGlhbC5nZXRUeXBlKCl9IiB2YWx1ZT0iJHtjcmVkZW50aWFsLmdldEFjY3JlZGl0YWJsZUlkKCl9Ii8+Ci0gICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtjcmVkZW50aWFsLmdldEFjY3JlZGl0YWJsZUlkKCl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyb2xlIiB2YWx1ZT0iJHtjcmVkZW50aWFsLmdldFJvbGVJZCgpfSIvPgotICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7Y3JlZGVudGlhbC5nZXRSb2xlSWQoKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1ldGhvZCIgdmFsdWU9IiR7Y3JlZGVudGlhbC5nZXRNZXRob2QoKX0iLz4KLSAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7Y3JlZGVudGlhbC5nZXRNZXRob2QoKX0iLz48L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiCi0gICAgICAgICAgICAgICAgICBuYW1lPSJkZWxldGVDcmVkZW50aWFsXyR7Y3JlZGVudGlhbC5nZXRUeXBlKCl9IgotICAgICAgICAgICAgICAgICAgaTE4bjphdHRyPSJ2YWx1ZSIgdmFsdWU9IkRlbGV0ZSIvPgotICAgICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke3N0YXR1cy5jb3VudD4xfSI+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IgotICAgICAgICAgICAgICAgICAgICBuYW1lPSJ1cENyZWRlbnRpYWxfJHtjcmVkZW50aWFsLmdldFR5cGUoKX0iCi0gICAgICAgICAgICAgICAgICAgIGkxOG46YXR0cj0idmFsdWUiIHZhbHVlPSJNb3ZlIFVwIi8+Ci0gICAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgICAgICA8ang6aWYgdGVzdD0iJHshc3RhdHVzLmxhc3R9Ij4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiCi0gICAgICAgICAgICAgICAgICAgIG5hbWU9ImRvd25DcmVkZW50aWFsXyR7Y3JlZGVudGlhbC5nZXRUeXBlKCl9IgotICAgICAgICAgICAgICAgICAgICBpMThuOmF0dHI9InZhbHVlIiB2YWx1ZT0iTW92ZSBEb3duIi8+Ci0gICAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC9mb3JtPgotICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNvbHNwYW49IjUiIHN0eWxlPSJib3JkZXItbGVmdDogMDsgYm9yZGVyLXJpZ2h0OiAwOyBib3JkZXItdG9wOiAwcHg7Ij4KLSAgICAgICAgICAgIDxoNCBzdHlsZT0ibWFyZ2luOiAzMHB4IDAgMCAwOyI+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+TmV3IHN1YnRyZWUgY3JlZGVudGlhbDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgPC9oND4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRoPjxpMThuOnRleHQ+VHlwZTwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgPHRoPjxpMThuOnRleHQ+SUQ8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PlJvbGU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0Pk1ldGhvZDwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgPHRoPiYjMTYwOwotICAgICAgICAgIDwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAKLSAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtLWFkZENyZWRlbnRpYWxfdXNlciI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ii8+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+dXNlcjwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJ1c2VyIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50LXZlcnluYXJyb3ciPgotICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0idXNlciIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3VzZXJzJyl9Ij4KLSAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7dXNlcn0iPgotICAgICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke3VzZXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICA8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJyb2xlIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50LXZlcnluYXJyb3ciPgotICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0icm9sZSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3JvbGVzJyl9Ij4KLSAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7cm9sZX0iPgotICAgICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke3JvbGV9Ii8+Ci0gICAgICAgICAgICAgICAgICA8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJtZXRob2QiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQtdmVyeW5hcnJvdyI+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZGVueSI+PGkxOG46dGV4dD5kZW55PC9pMThuOnRleHQ+PC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZ3JhbnQiPjxpMThuOnRleHQ+Z3JhbnQ8L2kxOG46dGV4dD48L29wdGlvbj4KLSAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJhZGRDcmVkZW50aWFsX3VzZXIiCi0gICAgICAgICAgICAgICAgdmFsdWU9IkFkZCIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgCi0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtLWFkZENyZWRlbnRpYWxfZ3JvdXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXROYW1lKCl9Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCIvPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aTE4bjp0ZXh0Pmdyb3VwPC9pMThuOnRleHQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Imdyb3VwIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50LXZlcnluYXJyb3ciPgotICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iZ3JvdXAiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdncm91cHMnKX0iPgotICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHtncm91cH0iPgotICAgICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke2dyb3VwfSIvPgotICAgICAgICAgICAgICAgICAgPC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0icm9sZSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudC12ZXJ5bmFycm93Ij4KLSAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InJvbGUiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdyb2xlcycpfSI+Ci0gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke3JvbGV9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtyb2xlfSIvPgotICAgICAgICAgICAgICAgICAgPC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ibWV0aG9kIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50LXZlcnluYXJyb3ciPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImRlbnkiPjxpMThuOnRleHQ+ZGVueTwvaTE4bjp0ZXh0Pjwvb3B0aW9uPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImdyYW50Ij48aTE4bjp0ZXh0PmdyYW50PC9pMThuOnRleHQ+PC9vcHRpb24+Ci0gICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iYWRkQ3JlZGVudGlhbF9ncm91cCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iQWRkIi8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtLWFkZENyZWRlbnRpYWxfaXBSYW5nZSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ii8+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+SVAgUmFuZ2U8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iaXBSYW5nZSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudC12ZXJ5bmFycm93Ij4KLSAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9ImlwUmFuZ2UiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdpcFJhbmdlcycpfSI+Ci0gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke2lwUmFuZ2V9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtpcFJhbmdlfSIvPgotICAgICAgICAgICAgICAgICAgPC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0icm9sZSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudC12ZXJ5bmFycm93Ij4KLSAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InJvbGUiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdyb2xlcycpfSI+Ci0gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke3JvbGV9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtyb2xlfSIvPgotICAgICAgICAgICAgICAgICAgPC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ibWV0aG9kIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50LXZlcnluYXJyb3ciPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImRlbnkiPjxpMThuOnRleHQ+ZGVueTwvaTE4bjp0ZXh0Pjwvb3B0aW9uPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImdyYW50Ij48aTE4bjp0ZXh0PmdyYW50PC9pMThuOnRleHQ+PC9vcHRpb24+Ci0gICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iYWRkQ3JlZGVudGlhbF9pcFJhbmdlIgotICAgICAgICAgICAgICAgIHZhbHVlPSJBZGQiLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC9mb3JtPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0tYWRkQ3JlZGVudGlhbF93b3JsZCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ii8+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+d29ybGQ8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9InJvbGUiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQtdmVyeW5hcnJvdyI+Ci0gICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJyb2xlIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncm9sZXMnKX0iPgotICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHtyb2xlfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7cm9sZX0iLz4KLSAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPgotICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Im1ldGhvZCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudC12ZXJ5bmFycm93Ij4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJkZW55Ij48aTE4bjp0ZXh0PmRlbnk8L2kxOG46dGV4dD48L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJncmFudCI+PGkxOG46dGV4dD5ncmFudDwvaTE4bjp0ZXh0Pjwvb3B0aW9uPgotICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImFkZENyZWRlbnRpYWxfd29ybGQiCi0gICAgICAgICAgICAgICAgdmFsdWU9IkFkZCIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgPC90YWJsZT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hYy9zc2wtZm9ybS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2FjL3NzbC1mb3JtLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDFmYjk1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2FjL3NzbC1mb3JtLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBhYy5qeCAxNTYxNjEgMjAwNS0wMy0wNCAxNToyMzoyMVogYW5kcmVhcyAkIC0tPgotPGp4OnRlbXBsYXRlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgbmFtZT0iIj4KLTxqeDpzZXQgdmFyPSJhcmVhIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKS5nZXRBcmVhKCl9Ii8+Ci08Zm9ybSBtZXRob2Q9IlBPU1QiIG5hbWU9ImZvcm1fc3NsXyR7YXJlYX0iIGlkPSJmb3JtX3NzbF8ke2FyZWF9Ij4KLSAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXROYW1lKCl9Ii8+Ci0gIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5zdWJtaXQiIHZhbHVlPSJvayIvPgotICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGFuZ2Vfc3NsIiB2YWx1ZT0idHJ1ZSIvPgotICA8ang6c2V0IHZhcj0ic3NsIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc3NsJyl9Ii8+Ci0gIDxqeDpzZXQgdmFyPSJhbmNlc3RvclNzbCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2FuY2VzdG9yU3NsJyl9Ii8+Ci0gIDxqeDpjaG9vc2U+Ci0gICAgPGp4OndoZW4gdGVzdD0iJHtzc2wuZXF1YWxzKCd0cnVlJykgfHwgYW5jZXN0b3JTc2wuZXF1YWxzKCd0cnVlJyl9Ij4KLSAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7YW5jZXN0b3JTc2wuZXF1YWxzKCd0cnVlJyl9Ij4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNzbCIgY2hlY2tlZD0iY2hlY2tlZCIgZGlzYWJsZWQ9ImRpc2FibGVkIj4KLSAgICAgICAgICAgIDxpMThuOnRleHQ+U1NMIEVuY3J5cHRpb248L2kxOG46dGV4dD4KLSAgICAgICAgICA8L2lucHV0PgotICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJzc2wiIG9uY2hhbmdlPSJkb2N1bWVudC5mb3Jtcy5mb3JtX3NzbF8ke2FyZWF9LnN1Ym1pdCgpIiBjaGVja2VkPSJjaGVja2VkIj4KLSAgICAgICAgICAgIDxpMThuOnRleHQ+U1NMIEVuY3J5cHRpb248L2kxOG46dGV4dD4KLSAgICAgICAgICA8L2lucHV0PgotICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgIDwvang6Y2hvb3NlPgotICAgIDwvang6d2hlbj4KLSAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgPGp4OndoZW4gdGVzdD0iJHthbmNlc3RvclNzbC5lcXVhbHMoJ3RydWUnKX0iPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic3NsIiBkaXNhYmxlZD0iZGlzYWJsZWQiPgotICAgICAgICAgICAgPGkxOG46dGV4dD5TU0wgRW5jcnlwdGlvbjwvaTE4bjp0ZXh0PgotICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNzbCIgb25jaGFuZ2U9ImRvY3VtZW50LmZvcm1zLmZvcm1fc3NsXyR7YXJlYX0uc3VibWl0KCkiPgotICAgICAgICAgICAgPGkxOG46dGV4dD5TU0wgRW5jcnlwdGlvbjwvaTE4bjp0ZXh0PgotICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgPC9qeDpvdGhlcndpc2U+Ci0gIDwvang6Y2hvb3NlPgotPC9mb3JtPgotPC9qeDp0ZW1wbGF0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY0FyY2hpdmUuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY0FyY2hpdmUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWQ2M2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYWNBcmNoaXZlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBhYy5qeCAxNTYxNjEgMjAwNS0wMy0wNCAxNToyMzoyMVogYW5kcmVhcyAkIC0tPgotPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYWMvYWMuangiCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIvPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYWNBdXRob3JpbmcuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY0F1dGhvcmluZy5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxZDYzYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY0F1dGhvcmluZy5qeAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogYWMuanggMTU2MTYxIDIwMDUtMDMtMDQgMTU6MjM6MjFaIGFuZHJlYXMgJCAtLT4KLTxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2FjL2FjLmp4IgotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiLz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2FjTGl2ZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2FjTGl2ZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxZDYzYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY0xpdmUuangKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGFjLmp4IDE1NjE2MSAyMDA1LTAzLTA0IDE1OjIzOjIxWiBhbmRyZWFzICQgLS0+Ci08ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hYy9hYy5qeCIKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIi8+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY1RyYXNoLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYWNUcmFzaC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxZDYzYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9hY1RyYXNoLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBhYy5qeCAxNTYxNjEgMjAwNS0wMy0wNCAxNToyMzoyMVogYW5kcmVhcyAkIC0tPgotPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYWMvYWMuangiCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIvPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYXNzZXRzLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvYXNzZXRzLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjNhYjRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL2Fzc2V0cy5qeAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0KLSAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvaGVhZC5qeCIvPgotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3NpdGV0cmVlLmp4Ii8+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYi1zaXRldHJlZSI+Ci0gICAgICAKLSAgICAgIDxoMT48aTE4bjp0ZXh0PkFzc2V0czwvaTE4bjp0ZXh0PjwvaDE+Ci0KLSAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3Jlc291cmNlRG9jdW1lbnRzJykuc2l6ZSgpID09IDB9Ij4KLSAgICAgICAgICA8aTE4bjp0ZXh0Pm5vLWFzc2V0czwvaTE4bjp0ZXh0PgotICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRoPjxpMThuOnRleHQ+VGl0bGU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgICAgICA8dGg+PGkxOG46dGV4dD5QcmV2aWV3PC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgICAgPHRoPjxpMThuOnRleHQ+RmlsZSBTaXplPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgICAgPHRoPjxpMThuOnRleHQ+RGltZW5zaW9uICh3IHggaCk8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgICAgICA8dGg+PGkxOG46dGV4dD5DcmVhdGlvbiBEYXRlPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9ImRvYyIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3Jlc291cmNlRG9jdW1lbnRzJyl9Ij4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJ0aXRsZSIgdmFsdWU9IiR7ZG9jLmdldE1ldGFEYXRhKCdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpLmdldEZpcnN0VmFsdWUoJ3RpdGxlJyl9Ii8+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJHtkb2MuZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCl9Ij48ang6b3V0IHZhbHVlPSIke3RpdGxlfSIvPjwvYT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD4gICAgICAgIAotICAgICAgICAgICAgICAgICAgPGp4OnNldCB2YXI9Im1pbWVUeXBlIiB2YWx1ZT0iJHtkb2MuZ2V0TWltZVR5cGUoKX0iLz4KLSAgICAgICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke21pbWVUeXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJleHRlbnNpb24iIHZhbHVlPSIke2RvYy5nZXRTb3VyY2VFeHRlbnNpb24oKX0iLz4KLSAgICAgICAgICAgICAgICAgICAgPGp4OnNldCB2YXI9InVybCIgdmFsdWU9IiR7ZG9jLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpfSIvPgotICAgICAgICAgICAgICAgICAgICA8ang6c2V0IHZhcj0iaW1hZ2VVcmwiIHZhbHVlPSIke3VybC5yZXBsYWNlRmlyc3QoJ1wuaHRtbCcsICdcLicgKyBleHRlbnNpb24pfSIvPgotICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJHtpbWFnZVVybH0iCi0gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImhlaWdodDogMzJweDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsiLz4mIzE2MDsKLSAgICAgICAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48ang6b3V0IHZhbHVlPSIke2RvYy5nZXRDb250ZW50TGVuZ3RoKCkgLyAxMDAwfSIvPiBrQjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Ci0gICAgICAgICAgICAgICAgICA8ang6aWYgdGVzdD0iJHttaW1lVHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKX0iPgotICAgICAgICAgICAgICAgICAgICA8ang6c2V0IHZhcj0ibWVkaWFNZXRhIiB2YWx1ZT0iJHtkb2MuZ2V0TWV0YURhdGEoJ2h0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL21lZGlhLzEuMCcpfSIvPgotICAgICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke21lZGlhTWV0YS5nZXRGaXJzdFZhbHVlKCd3aWR0aCcpfSIvPiB4IDxqeDpvdXQgdmFsdWU9IiR7bWVkaWFNZXRhLmdldEZpcnN0VmFsdWUoJ2hlaWdodCcpfSIvPgotICAgICAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxqeDpvdXQgdmFsdWU9IiR7amF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KGRvYy5nZXRMYXN0TW9kaWZpZWQoKSl9Ii8+PC90ZD4KLSAgICAgICAgICAgICAgPC90cj4gCi0gICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICA8L2p4OmNob29zZT4KLSAgICAgIAotICAgICA8ang6aWYgdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKS5nZXRBcmVhKCkuZXF1YWxzKCdhdXRob3JpbmcnKX0iPgotICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiIGlkPSJmb3JtLWFkZF9hc3NldCIgc3R5bGU9Im1hcmdpbi10b3A6IDIwcHgiPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0icmVzb3VyY2UuY3JlYXRlIi8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImRvY3R5cGUiIHZhbHVlPSJyZXNvdXJjZSIvPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5leGl0VXNlY2FzZSIgdmFsdWU9InRhYi5hc3NldHMiLz4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuZXhpdFVyaSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykuZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCl9Ii8+Ci0gICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9Ik5ldyBBc3NldCIvPgotICAgICAgIDwvZm9ybT4KLSAgICAgPC9qeDppZj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9oZWFkLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvaGVhZC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2M2RiZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9oZWFkLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBvdmVydmlldy5qeCAxMjM5NjAgMjAwNS0wMS0wMyAxMjozOTowNVogYW5kcmVhcyAkIC0tPgotCi08ang6dGVtcGxhdGUKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgbmFtZT0iIj4KLSAgCi0gIDxwYWdlOmhlYWQ+Ci0gICAgPGp4OnNldCB2YXI9InB1YklkIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKS5nZXRQdWJsaWNhdGlvbigpLmdldElkKCl9Ii8+Ci0gICAgPGp4OnNldCB2YXI9ImFyZWEiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudCcpLmdldEFyZWEoKX0iLz4KLSAgICA8ang6c2V0IHZhcj0ibGFuZ3VhZ2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudCcpLmdldExhbmd1YWdlKCl9Ii8+Ci0gICAgPHNjcmlwdCBzcmM9Ii9tb2R1bGVzL3NpdGV0cmVlL2phdmFzY3JpcHQvdHJlZS5qcyIvPgotICAgIDxzY3JpcHQgc3JjPSIvbW9kdWxlcy9zaXRldHJlZS9qYXZhc2NyaXB0L2xlbnlhdHJlZS5qcyIvPgotICAgIDxzY3JpcHQgc3JjPSIvbW9kdWxlcy9zaXRldHJlZS9qYXZhc2NyaXB0L25hdnRyZWUuanMiLz4KLSAgICA8c2NyaXB0IHNyYz0iL21vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvamF2YXNjcmlwdC9sZW55YVRhYnMuanMiLz4KLSAgPC9wYWdlOmhlYWQ+Ci08L2p4OnRlbXBsYXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL21ldGEuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9tZXRhLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmEwYWQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL21ldGEuangKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLSAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvaGVhZC5qeCIvPgotICAKLSAgPGp4OnNldCB2YXI9ImNvdW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbnVtYmVycycpLnNpemUoKX0iLz4KLSAgPHBhZ2U6Ym9keSBvbmxvYWQ9ImxlbnlhSW5pdFRhYnMoJHtjb3VudH0pIj4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9zaXRldHJlZS5qeCIvPgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeCIvPgotICAgIDxkaXYgaWQ9ImNvbnRlbnRibG9jazEiIGNsYXNzPSJsZW55YS10YWItc2l0ZXRyZWUiPgotICAgICAgPGgxIGlkPSJmb3JtLW1ldGEiIHN0eWxlPSJ3aWR0aDogNjAwcHgiPjxpMThuOnRleHQ+TWV0YSBEYXRhPC9pMThuOnRleHQ+PC9oMT4KLSAgICAgIDxmb3JtPgotICAgICAgICAKLSAgICAgICAgPGp4OnNldCB2YXI9Im51bTJuYW1lc3BhY2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCduYW1lc3BhY2VzJyl9Ii8+Ci0gICAgICAgIAotICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgIAotICAgICAgICA8ang6c2V0IHZhcj0iY291bnQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdudW1iZXJzJykuc2l6ZSgpfSIvPgotICAgICAgICA8ang6Zm9yRWFjaCB2YXI9Im51bSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ251bWJlcnMnKX0iPgotICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhVGFiVGl0bGUiIGlkPSJsZW55YVRhYlRpdGxlJHtudW19IiBvbmNsaWNrPSJsZW55YVRvZ2dsZVRhYigke2NvdW50fSwgJHtudW19KSI+Ci0gICAgICAgICAgICA8IS0tPGkxOG46dGV4dD5OYW1lc3BhY2U8L2kxOG46dGV4dD46LS0+Ci0gICAgICAgICAgICA8YT48aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7bnVtMm5hbWVzcGFjZS5nZXQobnVtKX0iLz48L2kxOG46dGV4dD48L2E+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJudW0iIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdudW1iZXJzJyl9Ij4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhVGFiQm9keSIgaWQ9ImxlbnlhVGFiQm9keSR7bnVtfSI+Ci0gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbGlzdC1ub2JvcmRlciI+Ci0gICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJrZXkiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdrZXlzJyl9Ij4KLSAgICAgICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke2tleS5zdGFydHNXaXRoKCducycgKyBudW0gKyAnLicpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iJHtrZXl9Ij48aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7a2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZignLicpKS5zdWJzdHJpbmcoMSl9Ii8+PC9pMThuOnRleHQ+OjwvbGFiZWw+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6c2V0IHZhcj0id3JhcHBlciIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoa2V5KX0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJ2YWx1ZXMiIHZhbHVlPSIke3dyYXBwZXIuZ2V0VmFsdWVzKCl9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3dyYXBwZXIuZ2V0RWxlbWVudCgpLmlzRWRpdGFibGUoKX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3ZhbHVlcy5zaXplKCkgJmd0OyAwfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iJHtrZXl9IiBuYW1lPSIke2tleX0iIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHZhbHVlPSIke3ZhbHVlc1swXX0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iJHtrZXl9IiBuYW1lPSIke2tleX0iIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4OnNldCB2YXI9InZhbHVlIiB2YWx1ZT0iJHt3cmFwcGVyLmdldFZhbHVlKCl9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dmFsdWVzLnNpemUoKSA9PSAwfSI+PGVtPjxpMThuOnRleHQ+dmFsdWUtbm90LXNldDwvaTE4bjp0ZXh0PjwvZW0+PC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJ2YWx1ZSIgaXRlbXM9IiR7dmFsdWVzfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt2YWx1ZX08YnIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPC9qeDpmb3JFYWNoPgotCi0gICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgPGp4OndoZW4KLSAgICAgICAgICAgIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykuZ2V0QXJlYSgpLmVxdWFscygnYXV0aG9yaW5nJykgJmFtcDsmYW1wOyAhIHVzZWNhc2UuaGFzRXJyb3JzKCl9Ij4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiLz4KLSAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgZGlzYWJsZWQ9ImRpc2FibGVkIiB2YWx1ZT0iU2F2ZSIvPgotICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgCi0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgPC9mb3JtPgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL292ZXJ2aWV3Lmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvb3ZlcnZpZXcuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGQzOTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvb3ZlcnZpZXcuangKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLSAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvaGVhZC5qeCIvPgotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3NpdGV0cmVlLmp4Ii8+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0gICAgPGRpdiBpZD0iY29udGVudGJsb2NrMSIgY2xhc3M9ImxlbnlhLXRhYi1zaXRldHJlZSI+Ci0gICAgICA8aDE+PGkxOG46dGV4dD5PdmVydmlldzwvaTE4bjp0ZXh0PjwvaDE+Ci0gICAgICA8ang6Y2hvb3NlPgotICAgICAgICA8ang6d2hlbiB0ZXN0PSIke25vdChlbXB0eSh1c2VjYXNlLmdldFBhcmFtZXRlcigndGl0bGUnKSkpfSI+Ci0gICAgICAgICAgPGp4OnNldCB2YXI9ImRvY3VtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKX0iLz4KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5UaXRsZTwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndGl0bGUnKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5EZXNjcmlwdGlvbjwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZGVzY3JpcHRpb24nKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5Xb3JrZmxvdyBTdGF0ZTwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7bm90KGVtcHR5KHVzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzdGF0ZScpKSl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzdGF0ZScpfSIvPjwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT48c3BhbiBzdHlsZT0iY29sb3I6ICM5OTk5OTk7Ij48aTE4bjp0ZXh0PltubyB3b3JrZmxvd108L2kxOG46dGV4dD48L3NwYW4+PC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+TGl2ZTwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdpc0xpdmUnKX0iLz48L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5BdmFpbGFibGUgTGFuZ3VhZ2VzPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9Imxhbmd1YWdlIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbGFuZ3VhZ2VzJyl9Ij4KLSAgICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7bGFuZ3VhZ2UuZXF1YWxzKGRvY3VtZW50LmdldExhbmd1YWdlKCkpfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtsYW5ndWFnZX0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJ0cmFuc2xhdGlvbiIgdmFsdWU9IiR7ZG9jdW1lbnQuZ2V0VHJhbnNsYXRpb24obGFuZ3VhZ2UpfSIvPgotICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiR7dHJhbnNsYXRpb24uZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCl9P2xlbnlhLnVzZWNhc2U9dGFiLm92ZXJ2aWV3Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7bGFuZ3VhZ2V9Ii8+PC9hPgotICAgICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8ang6c2V0IHZhcj0iZG9jTGFuZ3VhZ2VzIiB2YWx1ZT0iJHtkb2N1bWVudC5nZXRMYW5ndWFnZXMoKS5zaXplKCl9Ii8+Ci0gICAgICAgICAgICA8ang6c2V0IHZhcj0icHViTGFuZ3VhZ2VzIiB2YWx1ZT0iJHtkb2N1bWVudC5nZXRQdWJsaWNhdGlvbigpLmdldExhbmd1YWdlcygpLnNpemUoKX0iLz4KLSAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke2RvY0xhbmd1YWdlcyBsdCBwdWJMYW5ndWFnZXN9Ij4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5taXNzaW5nLWxhbmd1YWdlczwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0ibGFuZ3VhZ2UiIGl0ZW1zPSIke2RvY3VtZW50LmdldFB1YmxpY2F0aW9uKCkuZ2V0TGFuZ3VhZ2VzKCl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4OmlmIHRlc3Q9IiR7IWRvY3VtZW50LmV4aXN0c1RyYW5zbGF0aW9uKGxhbmd1YWdlKX0iPgotICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9sZW55YS51c2VjYXNlPXNpdGVtYW5hZ2VtZW50LmNyZWF0ZUxhbmd1YWdlJmFtcDtsZW55YS5leGl0VXNlY2FzZT10YWIub3ZlcnZpZXcmYW1wO2xhbmd1YWdlPSR7bGFuZ3VhZ2V9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7bGFuZ3VhZ2V9Ii8+PC9hPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+TGFzdCBtb2RpZmllZDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbGFzdG1vZGlmaWVkJyl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+VVVJRDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtkb2N1bWVudC5nZXRVVUlEKCl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+UGF0aDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtkb2N1bWVudC5nZXRQYXRoKCl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+UmVzb3VyY2UgVHlwZTwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGkxOG46dGV4dD5yZXNvdXJjZVR5cGUtPGp4Om91dCB2YWx1ZT0iJHtkb2N1bWVudC5nZXRSZXNvdXJjZVR5cGUoKS5nZXROYW1lKCl9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+TWltZSBUeXBlPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke2RvY3VtZW50LmdldE1pbWVUeXBlKCl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+RG9jdW1lbnQgU2l6ZTwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtkb2N1bWVudC5nZXRDb250ZW50TGVuZ3RoKCl9Ii8+IEIKLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5WaXNpYmxlIGluIE5hdmlnYXRpb248L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndmlzaWJsZUluTmF2Jyl9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbGFuZ3VhZ2VleGlzdHMnKS5lcXVhbHMoJ2ZhbHNlJyl9Ij4KLSAgICAgICAgICA8aTE4bjp0ZXh0PlRoaXMgZG9jdW1lbnQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGxhbmd1YWdlLjwvaTE4bjp0ZXh0Pjxici8+PGJyLz4KLSAgICAgICAgICA8aTE4bjp0ZXh0PkF2YWlsYWJsZSBMYW5ndWFnZXM8L2kxOG46dGV4dD46IDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2xhbmd1YWdlcycpfSIvPgotICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgIDxqeDpvdGhlcndpc2U+PGkxOG46dGV4dD5ObyBvdmVydmlldyBhdmFpbGFibGUuPC9pMThuOnRleHQ+PC9qeDpvdGhlcndpc2U+Ci0gICAgICA8L2p4OmNob29zZT4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9yZXZpc2lvbnMuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9yZXZpc2lvbnMuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmI2ZTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvcmV2aXNpb25zLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0KLSAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvaGVhZC5qeCIvPgotCi0gIDwhLS0gaWYgdGhlIHVzZWNhc2UgY2Fubm90IGJlIGludm9rZWQsIGZpbmQgdGhlIGNhdXNlOiAtLT4KLSAgPGp4OmNob29zZT4KLSAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdjYW5Sb2xsYmFjaycpID09ICd0cnVlJ30iPgotICAgICAgPGp4OnNldCB2YXI9InJvbGxiYWNrTWVzc2FnZSIgdmFsdWU9InJvbGxiYWNrLW9rIi8+Ci0gICAgPC9qeDp3aGVuPgotICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICA8ang6Y2hvb3NlPgotICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd3b3JrZmxvd1N0YXRlJykgPT0gJ3Jldmlldyd9Ij4KLSAgICAgICAgICA8ang6c2V0IHZhcj0icm9sbGJhY2tNZXNzYWdlIiB2YWx1ZT0ibm8tcm9sbGJhY2staW4tcmV2aWV3Ii8+Ci0gICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICA8ang6c2V0IHZhcj0icm9sbGJhY2tNZXNzYWdlIiB2YWx1ZT0ibm8tcm9sbGJhY2stbm8tcHJpdmlsZWdlcyIvPgotICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgIDwvang6Y2hvb3NlPgotICAgIDwvang6b3RoZXJ3aXNlPgotICA8L2p4OmNob29zZT4KLQotICA8cGFnZTpoZWFkPgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQotICBmdW5jdGlvbiBzaG93UmV2aXNpb24ocmV2aXNpb24pIHsKLSAgICB3aW5kb3cub3BlbigKLSAgICAgICAgJz9sZW55YS5yZXZpc2lvbj0nICsgcmV2aXNpb24sCi0gICAgICAgICdMZW55YV9WaWV3UmV2aXNpb24nLAotICAgICAgICAnbWVudWJhcj1ubyxhZGRyZXNzYmFyPW5vLHRvb2xiYXI9bm8sc3RhdHVzYmFyPW5vJwotICAgICk7Ci0gIH0KLQotICBmdW5jdGlvbiByb2xsYmFjayh0b1JldmlzaW9uKSB7Ci0gICAgd2luZG93LmxvY2F0aW9uLmhyZWY9Ij9sZW55YS51c2VjYXNlPXNpdGVtYW5hZ2VtZW50LnJvbGxiYWNrIgotICAgICAgICArIFN0cmluZy5mcm9tQ2hhckNvZGUoMzgpICAvLyBhbiAmYW1wOyBkb2VzIG5vdCB3b3JrLCBzaW5jZSBpdCdzIG5vdCBiZWluZyBkZWNvZGVkCi0gICAgICAgICsgInJvbGxiYWNrUmV2aXNpb249IiArIHRvUmV2aXNpb247Ci0gIH0KLQotICAgIDwvc2NyaXB0PgotICA8L3BhZ2U6aGVhZD4KLSAgPHBhZ2U6Ym9keT4KLQotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3NpdGV0cmVlLmp4Ii8+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4Ii8+Ci0KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiLXNpdGV0cmVlIj4KLSAgICAgIDxoMT48aTE4bjp0ZXh0PlJldmlzaW9uczwvaTE4bjp0ZXh0PjwvaDE+Ci0gIAotICAgICAgPGZvcm0gbmFtZT0icmV2aXNpb25zIj4KLSAgCi0gICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbGlzdC1ub2JvcmRlciI+Ci0KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+PGkxOG46dGV4dD5Oby48L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgICAgPHRoPjxpMThuOnRleHQ+VGltZTwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgICA8dGg+PGkxOG46dGV4dD5FZGl0b3I8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgICAgPHRoPjxpMThuOnRleHQ+QWN0aW9uczwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgCi0gICAgICAgICAgPGp4OnNldCB2YXI9ImNvdW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncmV2aXNpb25zJykuc2l6ZSgpfSIvPgotICAgICAgICAgIDxqeDpzZXQgdmFyPSJpc0ZpcnN0SXRlbSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InJldmlzaW9uIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncmV2aXNpb25zJyl9IiBiZWdpbj0iMCI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgotICAgICAgICAgICAgICAgIDxpbnB1dCAKLSAgICAgICAgICAgICAgICAgIHR5cGU9ImJ1dHRvbiIgCi0gICAgICAgICAgICAgICAgICBpMThuOmF0dHI9InRpdGxlIiAKLSAgICAgICAgICAgICAgICAgIG9uY2xpY2s9InNob3dSZXZpc2lvbigke3JldmlzaW9uLmdldE51bWJlcigpfSk7IgotICAgICAgICAgICAgICAgICAgdGl0bGU9InZpZXctcmV2aXNpb24taW4tbmV3LXdpbmRvdyIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3JldmlzaW9uLmdldE51bWJlcigpfSIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48aTE4bjpkYXRlLXRpbWUgc3JjLXBhdHRlcm49Inl5eXktTU0tZGQgSEg6bW06c3MiPjxqeDpmb3JtYXREYXRlIHZhbHVlPSIke3JldmlzaW9uLmdldFRpbWUoKX0iIHBhdHRlcm49Inl5eXktTU0tZGQgSEg6bW06c3MiLz48L2kxOG46ZGF0ZS10aW1lPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD48ang6b3V0IHZhbHVlPSIke3JldmlzaW9uLmdldFVzZXJJZCgpfSIvPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgCi0gICAgICAgICAgICAgICAgICB0eXBlPSJidXR0b24iIAotICAgICAgICAgICAgICAgICAgaTE4bjphdHRyPSJ2YWx1ZSB0aXRsZSIgCi0gICAgICAgICAgICAgICAgICBvbmNsaWNrPSJzaG93UmV2aXNpb24oJHtyZXZpc2lvbi5nZXROdW1iZXIoKX0pOyIKLSAgICAgICAgICAgICAgICAgIHRpdGxlPSJ2aWV3LXJldmlzaW9uLWluLW5ldy13aW5kb3ciCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0idmlldy1yZXZpc2lvbiIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke2lzRmlyc3RJdGVtID09ICd0cnVlJ30iPgotICAgICAgICAgICAgICAgICAgICA8ang6c2V0IHZhcj0iaXNGaXJzdEl0ZW0iIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0IGtleT0iaXMtY3VycmVudC12ZXJzaW9uIi8+Ci0gICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdjYW5Sb2xsYmFjaycpID09ICd0cnVlJ30iPgotICAgICAgICAgICAgICAgICAgICAmIzE2MDsKLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgaTE4bjphdHRyPSJ2YWx1ZSB0aXRsZSIgdGl0bGU9IiR7cm9sbGJhY2tNZXNzYWdlfSIgdmFsdWU9InJvbGxiYWNrIiAKLSAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJ2b2lkIHJvbGxiYWNrKCR7cmV2aXNpb24uZ2V0TnVtYmVyKCl9KTsiIAotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgaTE4bjphdHRyPSJ2YWx1ZSB0aXRsZSIgdGl0bGU9IiR7cm9sbGJhY2tNZXNzYWdlfSIgZGlzYWJsZWQ9ImRpc2FibGVkIiB2YWx1ZT0icm9sbGJhY2siLz4KLSAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gIAotICAgICAgICAgIDxqeDppZiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdjYW5Sb2xsYmFjaycpICE9ICd0cnVlJ30iPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz48aTE4bjp0ZXh0IGtleT0iJHtyb2xsYmFja01lc3NhZ2V9Ii8+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvang6aWY+Ci0KLSAgICAgICAgPC90YWJsZT4KLSAgCi0gICAgICA8L2Zvcm0+Ci0gIAotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3NjaGVkdWxlci5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3NjaGVkdWxlci5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1ZDM3OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9zY2hlZHVsZXIuangKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gICAgICAgICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiIAotICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gICAgICAgICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgPgotICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9oZWFkLmp4Ii8+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvc2l0ZXRyZWUuangiLz4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiLXNpdGV0cmVlIj4KLSAgICAgIAotICAgICAgPGgxPjxpMThuOnRleHQ+U2NoZWR1bGVyPC9pMThuOnRleHQ+PC9oMT4KLSAgICAgIAotICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignam9icycpLnNpemUoKSA9PSAwfSI+Ci0gICAgICAgICAgPGkxOG46dGV4dD5uby1qb2JzLXNjaGVkdWxlZDwvaTE4bjp0ZXh0PgotICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRoPjxpMThuOnRleHQ+Sm9iPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgICAgPHRoPjxpMThuOnRleHQ+VXNlcjwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PlRpbWU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iam9iIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignam9icycpfSI+Ci0gICAgICAgICAgICAgIDwhLS0gc2VlIFVzZWNhc2VTY2hlZHVsZXJJbXBsIGZvciBqb2IgbmFtZSBlbmNvZGluZyAtLT4KLSAgICAgICAgICAgICAgPGp4OnNldCB2YXI9Im5hbWUiIHZhbHVlPSIke2pvYi5nZXROYW1lKCl9Ii8+Ci0gICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJwYXJ0cyIgdmFsdWU9IiR7bmFtZS5zcGxpdCgnOicpfSIvPgotICAgICAgICAgICAgICA8ang6c2V0IHZhcj0idXNlY2FzZU5hbWUiIHZhbHVlPSIke3BhcnRzWzBdfSIvPgotICAgICAgICAgICAgICA8ang6c2V0IHZhcj0idXNlcklkIiB2YWx1ZT0iJHtwYXJ0c1sxXX0iLz4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZU5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICA8YSBocmVmPSIke3VzZWNhc2UuZ2V0U291cmNlVVJMKCl9P2xlbnlhLnVzZWNhc2U9YWRtaW4udXNlciZhbXA7dXNlcklkPSR7dXNlcklkfSI+PGp4Om91dCB2YWx1ZT0iJHt1c2VySWR9Ii8+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGkxOG46ZGF0ZS10aW1lIHNyYy1wYXR0ZXJuPSJ5eXl5LU1NLWRkIEhIOm1tOnNzIFoiPgotICAgICAgICAgICAgICAgICAgICA8ang6Zm9ybWF0RGF0ZSBwYXR0ZXJuPSJ5eXl5LU1NLWRkIEhIOm1tOnNzIFoiIHZhbHVlPSIke2pvYi5nZXROZXh0VGltZSgpfSIvPgotICAgICAgICAgICAgICAgICAgPC9pMThuOmRhdGUtdGltZT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAKLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9zaXRldHJlZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3NpdGV0cmVlLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJjNmVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3NpdGV0cmVlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogb3ZlcnZpZXcuanggMTIzOTYwIDIwMDUtMDEtMDMgMTI6Mzk6MDVaIGFuZHJlYXMgJCAtLT4KLQotPGp4OnRlbXBsYXRlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxuczpwcm94eT0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvcHJveHkvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgbmFtZT0iIj4KLSAgCi0gIDxqeDpzZXQgdmFyPSJ1cmwiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdwcml2YXRlLnNvdXJjZVVybCcpfSIvPgotICA8ang6c2V0IHZhcj0ic3RlcHMiIHZhbHVlPSIke3VybC5zcGxpdCgnLycpfSIvPgotICA8ang6c2V0IHZhcj0iYXJlYSIgdmFsdWU9IiR7c3RlcHNbMl19Ii8+Ci0gIDxqeDpzZXQgdmFyPSJwdWJsaWNhdGlvbklkIiB2YWx1ZT0iJHtzdGVwc1sxXX0iLz4KLSAgPGp4OnNldCB2YXI9ImZhY3RvcnkiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdwcml2YXRlLmZhY3RvcnknKX0iLz4KLSAgPGp4OnNldCB2YXI9InB1YmxpY2F0aW9uIiB2YWx1ZT0iJHtmYWN0b3J5LmdldFB1YmxpY2F0aW9uKHB1YmxpY2F0aW9uSWQpfSIvPgotICAKLSAgPGp4OnNldCB2YXI9ImRvY3VtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKX0iLz4KLSAgPGp4OnNldCB2YXI9ImRvY0V4aXN0cyIgdmFsdWU9IiR7amF2YS5sYW5nLkJvb2xlYW4udmFsdWVPZihkb2N1bWVudC5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoJ29yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50SW1wbCcpKX0iLz4KLSAgCi0gIDxkaXYgaWQ9ImxlbnlhLWluZm8tdHJlZWNhbnZhcyI+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtdGFicyI+Ci0gICAgICA8ang6Zm9yRWFjaCB2YXI9Imxhbmd1YWdlIiBpdGVtcz0iJHtwdWJsaWNhdGlvbi5nZXRMYW5ndWFnZXMoKX0iPgotICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7IWRvY0V4aXN0cy5ib29sZWFuVmFsdWUoKSAmYW1wOyZhbXA7IHVybC5lbmRzV2l0aCgnXycgKyBsYW5ndWFnZSl9Ij4KLSAgICAgICAgICAgIDxhIGlkPSIke2xhbmd1YWdlfSIgY2xhc3M9ImxlbnlhLXRhYmxpbmstYWN0aXZlIj48ang6b3V0IHZhbHVlPSIke2xhbmd1YWdlfSIvPjwvYT4KLSAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHshZG9jRXhpc3RzLmJvb2xlYW5WYWx1ZSgpICZhbXA7JmFtcDsgdXJsLmVuZHNXaXRoKCcvJykgJmFtcDsmYW1wOyBsYW5ndWFnZS5lcXVhbHMocHVibGljYXRpb24uZ2V0RGVmYXVsdExhbmd1YWdlKCkpfSI+Ci0gICAgICAgICAgICA8YSBpZD0iJHtsYW5ndWFnZX0iIGNsYXNzPSJsZW55YS10YWJsaW5rLWFjdGl2ZSI+PGp4Om91dCB2YWx1ZT0iJHtsYW5ndWFnZX0iLz48L2E+Ci0gICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7ZG9jdW1lbnQgIT0gbnVsbCAmYW1wOyZhbXA7IGRvY3VtZW50LmV4aXN0c1RyYW5zbGF0aW9uKGxhbmd1YWdlKX0iPgotICAgICAgICAgICAgPGp4OnNldCB2YXI9Imxhbmd1YWdlVmVyc2lvbiIgdmFsdWU9IiR7ZG9jdW1lbnQuZ2V0RmFjdG9yeSgpLmdldExhbmd1YWdlVmVyc2lvbihkb2N1bWVudCwgbGFuZ3VhZ2UpfSIvPgotICAgICAgICAgICAgPGp4OnNldCB2YXI9Imxhbmd1YWdlVXJsIiB2YWx1ZT0iJHsnLycgKyBwdWJsaWNhdGlvbklkICsgJy8nICsgYXJlYSArIGxhbmd1YWdlVmVyc2lvbi5nZXRDYW5vbmljYWxEb2N1bWVudFVSTCgpfSIvPgotICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHtsYW5ndWFnZS5lcXVhbHMoZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKSl9Ij4KLSAgICAgICAgICAgICAgICA8YSBpZD0iJHtsYW5ndWFnZX0iIGNsYXNzPSJsZW55YS10YWJsaW5rLWFjdGl2ZSIgaHJlZj0iJHtsYW5ndWFnZVVybH0/bGVueWEudXNlY2FzZT0ke3VzZWNhc2UuZ2V0TmFtZSgpfSI+PGp4Om91dCB2YWx1ZT0iJHtsYW5ndWFnZX0iLz48L2E+Ci0gICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8YSBpZD0iJHtsYW5ndWFnZX0iIGNsYXNzPSJsZW55YS10YWJsaW5rIiBocmVmPSIke2xhbmd1YWdlVXJsfT9sZW55YS51c2VjYXNlPSR7dXNlY2FzZS5nZXROYW1lKCl9Ij48ang6b3V0IHZhbHVlPSIke2xhbmd1YWdlfSIvPjwvYT4KLSAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgIDxhIGlkPSIke2xhbmd1YWdlfSIgY2xhc3M9ImxlbnlhLXRhYmxpbmsiIHRpdGxlPSJUaGlzIGxhbmd1YWdlIHZlcnNpb24gZG9lc24ndCBleGlzdC4iPgotICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke2xhbmd1YWdlfSIvPgotICAgICAgICAgICAgPC9hPgotICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgIDwvang6Zm9yRWFjaD4KLSAgICA8L2Rpdj4KLSAgICAKLSAgICA8ZGl2IGlkPSJsZW55YS1pbmZvLXRyZWUiPgotICAgICAgPGRpdiBpZD0idHJlZSI+Ci0gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICAgICAgICBXRUJBUFBfQkFTRV9QQVRIID0gJzxwcm94eTp1cmwgaHJlZj0iLyIvPic7Ci0gICAgICAgICAgQVJFQV9CQVNFX1BBVEggPSAnPHByb3h5OnVybCBocmVmPSIvJHtwdWJsaWNhdGlvbklkfS8ke2FyZWF9Ii8+JzsKLSAgICAgICAgICAKLSAgICAgICAgICBQVUJMSUNBVElPTl9JRCA9ICc8ang6b3V0IHZhbHVlPSIke3B1YmxpY2F0aW9uSWR9Ii8+JzsKLSAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHtkb2NFeGlzdHMuYm9vbGVhblZhbHVlKCl9Ij4KLSAgICAgICAgICAgICAgQ0hPU0VOX0xBTkdVQUdFID0gJzxqeDpvdXQgdmFsdWU9IiR7ZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKX0iLz4nOwotICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgQ0hPU0VOX0xBTkdVQUdFID0gJzxqeDpvdXQgdmFsdWU9IiR7cHVibGljYXRpb24uZ2V0RGVmYXVsdExhbmd1YWdlKCl9Ii8+JzsKLSAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgIERFRkFVTFRfTEFOR1VBR0UgPSAnPGp4Om91dCB2YWx1ZT0iJHtwdWJsaWNhdGlvbi5nZXREZWZhdWx0TGFuZ3VhZ2UoKX0iLz4nOwotICAgICAgICAgIElNQUdFX1BBVEggPSAnPHByb3h5OnVybCBocmVmPSIvbGVueWEvaW1hZ2VzL3RyZWUvIi8+JzsKLSAgICAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICA8ang6c2V0IHZhcj0iY2xpcGJvYXJkIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoJ29yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuQ2xpcGJvYXJkJyl9Ii8+Ci0gICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7Y2xpcGJvYXJkICE9IG51bGwgJmFtcDsmYW1wOyBjbGlwYm9hcmQuZ2V0TWV0aG9kKCkgPT0gUGFja2FnZXMub3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DbGlwYm9hcmQuTUVUSE9EX0NVVH0iPgotICAgICAgICAgICAgICA8ang6c2V0IHZhcj0iY3V0RG9jdW1lbnQiIHZhbHVlPSIke2NsaXBib2FyZC5nZXREb2N1bWVudChwdWJsaWNhdGlvbi5nZXRGYWN0b3J5KCksIHB1YmxpY2F0aW9uKX0iLz4KLSAgICAgICAgICAgICAgQ1VUX0RPQ1VNRU5UX0lEID0gJzxqeDpvdXQgdmFsdWU9IiR7Y3V0RG9jdW1lbnQuZ2V0UGF0aCgpfSIvPic7Ci0gICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICBDVVRfRE9DVU1FTlRfSUQgPSAnJzsKLSAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgIAotICAgICAgICAgIEFMTF9BUkVBUyA9ICdhdXRob3JpbmcsdHJhc2gsYXJjaGl2ZSc7Ci0gICAgICAgICAgUElQRUxJTkVfUEFUSCA9ICcvc2l0ZXRyZWUtZnJhZ21lbnQueG1sJzsKLSAgICAgICAgICBTSE9XX0xPQURJTkdfSElOVCA9IHRydWU7Ci0gICAgICAgICAgU0hPV19JQ09OUyA9IHRydWU7Ci0gICAgICAgICAgCi0gICAgICAgICAgPGp4OnNldCB2YXI9InB1Yk5hbWUiIHZhbHVlPSIke3B1YmxpY2F0aW9uLmdldE5hbWUoKX0iLz4KLSAgICAgICAgICB2YXIgcHViTmFtZSA9ICc8aTE4bjp0cmFuc2xhdGU+PGkxOG46dGV4dD4uLi4gUHVibGljYXRpb248L2kxOG46dGV4dD48aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke3B1Yk5hbWV9Ii8+PC9pMThuOnBhcmFtPjwvaTE4bjp0cmFuc2xhdGU+JzsKLSAgICAgICAgICAKLSAgICAgICAgICB2YXIgdHJlZSA9IG5ldyBOYXZUcmVlKGRvY3VtZW50LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJlZScpKTsKLSAgICAgICAgICAKLSAgICAgICAgICB0cmVlLmluaXQoUFVCTElDQVRJT05fSUQsIHB1Yk5hbWUpOwotICAgICAgICAgIHRyZWUucmVuZGVyKCk7Ci0gICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7ZG9jRXhpc3RzLmJvb2xlYW5WYWx1ZSgpfSI+Ci0gICAgICAgICAgICAgIHRyZWUubG9hZEluaXRpYWxUcmVlKCc8ang6b3V0IHZhbHVlPSIke2FyZWF9Ii8+JywgJzxqeDpvdXQgdmFsdWU9IiR7ZG9jdW1lbnQuZ2V0UGF0aCgpfSIvPicpOwotICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgdHJlZS5sb2FkSW5pdGlhbFRyZWUoJzxqeDpvdXQgdmFsdWU9IiR7YXJlYX0iLz4nLCAnJyk7Ci0gICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci08L2p4OnRlbXBsYXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvdGFiL3dvcmtmbG93Lmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvd29ya2Zsb3cuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjVjNTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvd29ya2Zsb3cuangKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gICAgICAgICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiIAotICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gICAgICAgICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgPgotICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3NpdGVtYW5hZ2VtZW50L3VzZWNhc2VzL3RhYi9oZWFkLmp4Ii8+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy90YWIvc2l0ZXRyZWUuangiLz4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiLXNpdGV0cmVlIj4KLSAgICAgIDxoMT48aTE4bjp0ZXh0PldvcmtmbG93PC9pMThuOnRleHQ+PC9oMT4KLSAgICAgIDwhLS0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbGlzdC1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj48dGg+PGkxOG46dGV4dD5OYW1lPC9pMThuOnRleHQ+PC90aD48dGg+PGkxOG46dGV4dD5WYWx1ZTwvaTE4bjp0ZXh0PjwvdGg+PC90cj4KLSAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJpdGVtIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndmFyaWFibGVzJyl9Ij4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7aXRlbS5uYW1lfSIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtpdGVtLnZhbHVlfSIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICA8L3RhYmxlPgotICAgICAgLS0+Ci0gICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLWxpc3Qtbm9ib3JkZXIiPgotICAgICAgPHRyPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PkRhdGU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PkV2ZW50PC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGg+PGkxOG46dGV4dD5TdGF0ZTwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgPHRoPjxpMThuOnRleHQ+VXNlcjwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgPHRoPjxpMThuOnRleHQ+SVAgQWRkcmVzczwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDxqeDpmb3JFYWNoIHZhcj0iaXRlbSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3ZlcnNpb25zJyl9IiB2YXJTdGF0dXM9InN0YXR1cyI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjxqeDpmb3JtYXREYXRlIHBhdHRlcm49Inl5eXktTU0tZGQgSEg6bW06c3MiIHZhbHVlPSIke2l0ZW0uZ2V0RGF0ZSgpfSIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke2l0ZW0uZXZlbnR9Ii8+PC9pMThuOnRleHQ+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7aXRlbS5zdGF0ZX0iLz48L2kxOG46dGV4dD48L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vYnJlYWsiPgotICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7aXRlbS51c2VySWR9Ii8+Ci0gICAgICAgICAgICAgIDwvc3Bhbj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7aXRlbS5pUEFkZHJlc3N9Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS90ZW1wbGF0aW5nL2NvbmZpZy9jb2Nvb24teGNvbmYvdGVtcGxhdGUtbWFuYWdlci54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdGVtcGxhdGluZy9jb25maWcvY29jb29uLXhjb25mL3RlbXBsYXRlLW1hbmFnZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODAzNTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS90ZW1wbGF0aW5nL2NvbmZpZy9jb2Nvb24teGNvbmYvdGVtcGxhdGUtbWFuYWdlci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbiINCi0gICAgdW5sZXNzPSIvY29jb29uL2NvbXBvbmVudFtAcm9sZSA9ICdvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLlB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyJ10iPg0KLSAgICA8Y29tcG9uZW50IGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24udGVtcGxhdGVtYW5hZ2VyIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLlB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VySW1wbCINCi0gICAgICByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLlB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdGVtcGxhdGluZy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY3JlYXRlUHVsaWNhdGlvbkZyb21UZW1wbGF0ZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdGVtcGxhdGluZy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY3JlYXRlUHVsaWNhdGlvbkZyb21UZW1wbGF0ZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjMzUxYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3RlbXBsYXRpbmcvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWNyZWF0ZVB1bGljYXRpb25Gcm9tVGVtcGxhdGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAndGVtcGxhdGluZy5jcmVhdGVQdWJsaWNhdGlvbkZyb21UZW1wbGF0ZSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ0ZW1wbGF0aW5nLmNyZWF0ZVB1YmxpY2F0aW9uRnJvbVRlbXBsYXRlIiBsb2dnZXI9ImxlbnlhLnB1YmxpY2F0aW9uIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi51c2VjYXNlcy5DcmVhdGVQdWJsaWNhdGlvbkZyb21UZW1wbGF0ZSI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3RlbXBsYXRpbmcvdXNlY2FzZXMvY3JlYXRlUHVibGljYXRpb25Gcm9tVGVtcGxhdGUuangiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdGVtcGxhdGluZy9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdGVtcGxhdGluZy9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhZDAyMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3RlbXBsYXRpbmcvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy50ZW1wbGF0aW5nPC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPlB1YmxpY2F0aW9uIHRlbXBsYXRpbmcgaW1wbGVtZW50YXRpb248L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPlB1YmxpY2F0aW9uIHRlbXBsYXRpbmcgaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3RlbXBsYXRpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9QdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdGVtcGxhdGluZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL1B1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWIyNzczLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdGVtcGxhdGluZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL1B1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogTWFuYWdlciBmb3IgcHVibGljYXRpb24gdGVtcGxhdGVzLgotICogCi0gKiBAdmVyc2lvbiAkSWQ6IFB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VySW1wbC5qYXZhIDQ3NDcyOSAyMDA2LTExLTE0IDExOjA3OjQ0WgotICogICAgICAgICAgYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlckltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cwotICAgICAgICBQdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlciwgU2VydmljZWFibGUgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHVibGljYXRpb25UZW1wbGF0ZU1hbmFnZXJJbXBsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZy5QdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlciN2aXNpdChvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLlNvdXJjZVZpc2l0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBwYXRoLCBTb3VyY2VWaXNpdG9yIHZpc2l0b3IpIHsKLQotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gYmFzZVVyaXMgPSBnZXRCYXNlVVJJcyhwdWJsaWNhdGlvbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VVcmlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGJhc2VVcmlzW2ldICsgIi8iICsgcGF0aDsKLQotICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJUcnlpbmcgdG8gcmVzb2x2ZSBVUkkgWyIgKyB1cmkgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQocmVzb2x2ZXIsIHVyaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUZW1wbGF0aW5nRXhjZXB0aW9uKCJWaXNpdGluZyBwYXRoIFsiICsgcGF0aCArICJdIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgX21hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gX21hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHVibGljYXRpb24uCi0gICAgICogQHJldHVybiBBIHB1YmxpY2F0aW9uLiBwcm90ZWN0ZWQgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24xKCkgeyByZXR1cm4KLSAgICAgKiAgICAgICAgIHRoaXMucHVibGljYXRpb247IH0KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJhc2UgVVJJcyBpbiB0cmF2ZXJzaW5nIG9yZGVyLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgb3JpZ2luYWwgcHVibGljYXRpb24uCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBzdHJpbmdzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRCYXNlVVJJcyhQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikgewotCi0gICAgICAgIExpc3QgdXJpcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBQdWJsaWNhdGlvbltdIHB1YmxpY2F0aW9ucyA9IGdldFB1YmxpY2F0aW9ucyhwdWJsaWNhdGlvbik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVibGljYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB1cmlzLmFkZChnZXRCYXNlVVJJKHB1YmxpY2F0aW9uc1tpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvcmVCYXNlVVJJID0gcHVibGljYXRpb24uZ2V0U2VydmxldENvbnRleHQoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIjsKLSAgICAgICAgdXJpcy5hZGQoY29yZUJhc2VVUkkpOwotCi0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHVyaXMudG9BcnJheShuZXcgU3RyaW5nW3VyaXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmFzZSBVUkkgZm9yIGEgY2VydGFpbiBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZVVSSShQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikgewotICAgICAgICByZXR1cm4gcHVibGljYXRpb24uZ2V0RGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLlB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyI3Zpc2l0KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZy5QdWJsaWNhdGlvblZpc2l0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoUHVibGljYXRpb24gcHVibGljYXRpb24sIFB1YmxpY2F0aW9uVmlzaXRvciB2aXNpdG9yKSB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotCi0gICAgICAgICAgICBQdWJsaWNhdGlvbltdIHB1YmxpY2F0aW9ucyA9IGdldFB1YmxpY2F0aW9ucyhwdWJsaWNhdGlvbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY2F0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJWaXNpdGluZyBwdWJsaWNhdGlvbiBbIiArIHB1YmxpY2F0aW9uc1tpXSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQocHVibGljYXRpb25zW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRlbXBsYXRpbmdFeGNlcHRpb24oIlZpc2l0aW5nIHB1YmxpY2F0aW9ucyBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHB1YmxpY2F0aW9ucyBpbiB0cmF2ZXJzaW5nIG9yZGVyLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgb3JpZ2luYWwgcHVibGljYXRpb24uCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBzdHJpbmdzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBQdWJsaWNhdGlvbltdIGdldFB1YmxpY2F0aW9ucyhQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikgewotCi0gICAgICAgIExpc3QgcHVibGljYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHB1YmxpY2F0aW9ucy5hZGQocHVibGljYXRpb24pOwotCi0gICAgICAgIFN0cmluZ1tdIHRlbXBsYXRlSWRzID0gcHVibGljYXRpb24uZ2V0VGVtcGxhdGVJZHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wbGF0ZUlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBQdWJsaWNhdGlvbiB0ZW1wbGF0ZSA9IHB1YmxpY2F0aW9uLmdldEZhY3RvcnkoKS5nZXRQdWJsaWNhdGlvbih0ZW1wbGF0ZUlkc1tpXSk7Ci0gICAgICAgICAgICAgICAgUHVibGljYXRpb25bXSB0ZW1wbGF0ZVRlbXBsYXRlcyA9IGdldFB1YmxpY2F0aW9ucyh0ZW1wbGF0ZSk7Ci0gICAgICAgICAgICAgICAgcHVibGljYXRpb25zLmFkZEFsbChBcnJheXMuYXNMaXN0KHRlbXBsYXRlVGVtcGxhdGVzKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFB1YmxpY2F0aW9uW10pIHB1YmxpY2F0aW9ucy50b0FycmF5KG5ldyBQdWJsaWNhdGlvbltwdWJsaWNhdGlvbnMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLlB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyI2dldFNlbGVjdGFibGVIaW50KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGFibGVIaW50KFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3JpZ2luYWxIaW50KSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBzZWxlY3RhYmxlSGludCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEV4aXN0aW5nU2VydmljZVZpc2l0b3IgcmVzb2x2ZXIgPSBuZXcgRXhpc3RpbmdTZXJ2aWNlVmlzaXRvcihzZWxlY3Rvciwgb3JpZ2luYWxIaW50LAotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICB2aXNpdChwdWJsaWNhdGlvbiwgcmVzb2x2ZXIpOwotICAgICAgICAgICAgc2VsZWN0YWJsZUhpbnQgPSByZXNvbHZlci5nZXRTZWxlY3RhYmxlSGludCgpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGFibGVIaW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RhYmxlSGludCA9IG9yaWdpbmFsSGludDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiUmVzb2x2aW5nIGhpbnQgWyIgKyBvcmlnaW5hbEhpbnQgKyAiXSBmYWlsZWQ6ICI7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcihtZXNzYWdlLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UsIGUpOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gc2VsZWN0YWJsZUhpbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgZm9yIGEgZGVjbGFyZWQgc2VydmljZSBvZiB0aGUgZm9ybSAicHVibGljYXRpb25JZC9zZXJ2aWNlIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRXhpc3RpbmdTZXJ2aWNlVmlzaXRvciBpbXBsZW1lbnRzIFB1YmxpY2F0aW9uVmlzaXRvciB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEN0b3IuCi0gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VydmljZSBzZWxlY3RvciB0byB1c2UuCi0gICAgICAgICAqIEBwYXJhbSBoaW50IFRoZSBoaW50IHRvIGNoZWNrLgotICAgICAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXhpc3RpbmdTZXJ2aWNlVmlzaXRvcihTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IsIE9iamVjdCBoaW50LCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICB0aGlzLmhpbnQgPSBoaW50OwotICAgICAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvcjsKLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgaGludDsKLSAgICAgICAgcHJpdmF0ZSBPYmplY3Qgc2VsZWN0YWJsZUhpbnQgPSBudWxsOwotICAgICAgICBwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZy5QdWJsaWNhdGlvblZpc2l0b3IjdmlzaXQob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb24pCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikgewotICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uSGludCA9IHB1YmxpY2F0aW9uLmdldElkKCkgKyAiLyIgKyB0aGlzLmhpbnQ7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdG9yLmlzU2VsZWN0YWJsZShwdWJsaWNhdGlvbkhpbnQpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlSGludCA9IHB1YmxpY2F0aW9uSGludDsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoIkNoZWNraW5nIGhpbnQgWyIgKyBwdWJsaWNhdGlvbkhpbnQgKyAiXTogIiArIHN1Y2Nlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHB1YmxpY2F0aW9uIGhpbnQgdGhhdCBjb3VsZCBiZSBzZWxlY3RlZCBvcgotICAgICAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhpbnQgY291bGQgYmUgc2VsZWN0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGFibGVIaW50KCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZUhpbnQ7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS90ZW1wbGF0aW5nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL3VzZWNhc2VzL0NyZWF0ZVB1YmxpY2F0aW9uRnJvbVRlbXBsYXRlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3RlbXBsYXRpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdXNlY2FzZXMvQ3JlYXRlUHVibGljYXRpb25Gcm9tVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyMWQzYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3RlbXBsYXRpbmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vdXNlY2FzZXMvQ3JlYXRlUHVibGljYXRpb25Gcm9tVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZy5JbnN0YW50aWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2U7Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IHB1YmxpY2F0aW9uIGJhc2VkIG9uIGEgdGVtcGxhdGUgcHVibGljYXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZVB1YmxpY2F0aW9uRnJvbVRlbXBsYXRlIGV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFWQUlMQUJMRV9URU1QTEFURVMgPSAiYXZhaWxhYmxlVGVtcGxhdGVzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNBVElPTl9JRCA9ICJwdWJsaWNhdGlvbklkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNBVElPTl9OQU1FID0gInB1YmxpY2F0aW9uTmFtZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEUgPSAidGVtcGxhdGUiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgUHVibGljYXRpb25bXSBwdWJzID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCkuZ2V0UHVibGljYXRpb25zKCk7Ci0gICAgICAgIExpc3QgdGVtcGxhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwdWJzW2ldLmdldEluc3RhbnRpYXRvckhpbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGVzLmFkZChwdWJzW2ldLmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGVtcGxhdGVzKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKEFWQUlMQUJMRV9URU1QTEFURVMsIHRlbXBsYXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLQotICAgICAgICBTdHJpbmcgcHVibGljYXRpb25JZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFBVQkxJQ0FUSU9OX0lEKS50cmltKCk7Ci0KLSAgICAgICAgaWYgKCFQdWJsaWNhdGlvblV0aWwuaXNWYWxpZFB1YmxpY2F0aW9uSUQocHVibGljYXRpb25JZCkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiUGxlYXNlIGVudGVyIGEgdmFsaWQgcHVibGljYXRpb24gSUQhIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnRGYWN0b3J5KCkuZXhpc3RzUHVibGljYXRpb24ocHVibGljYXRpb25JZCkpIHsKLSAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIkEgcHVibGljYXRpb24gd2l0aCB0aGlzIElEIGFscmVhZHkgZXhpc3RzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLQotICAgICAgICBTdHJpbmcgdGVtcGxhdGVJZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFRFTVBMQVRFKTsKLQotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBJbnN0YW50aWF0b3IgaW5zdGFudGlhdG9yID0gbnVsbDsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBQdWJsaWNhdGlvbiB0ZW1wbGF0ZSA9IGdldERvY3VtZW50RmFjdG9yeSgpLmdldFB1YmxpY2F0aW9uKHRlbXBsYXRlSWQpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhQVUJMSUNBVElPTl9OQU1FKTsKLQotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKEluc3RhbnRpYXRvci5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICBpbnN0YW50aWF0b3IgPSAoSW5zdGFudGlhdG9yKSBzZWxlY3Rvci5zZWxlY3QodGVtcGxhdGUuZ2V0SW5zdGFudGlhdG9ySGludCgpKTsKLQotICAgICAgICAgICAgaW5zdGFudGlhdG9yLmluc3RhbnRpYXRlKHRlbXBsYXRlLCBnZXRQYXJhbWV0ZXJBc1N0cmluZyhQVUJMSUNBVElPTl9JRCksIG5hbWUpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChpbnN0YW50aWF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKGluc3RhbnRpYXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3RlbXBsYXRpbmcvdXNlY2FzZXMvY3JlYXRlUHVibGljYXRpb25Gcm9tVGVtcGxhdGUuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3RlbXBsYXRpbmcvdXNlY2FzZXMvY3JlYXRlUHVibGljYXRpb25Gcm9tVGVtcGxhdGUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDFjNTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS90ZW1wbGF0aW5nL3VzZWNhc2VzL2NyZWF0ZVB1YmxpY2F0aW9uRnJvbVRlbXBsYXRlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogcmVuYW1lTGFiZWwuanggMTIzMzY0IDIwMDQtMTItMjYgMTY6MTE6MjdaIGdyZWdvciAkIC0tPgotPHBhZ2U6cGFnZSB4bWxuczpjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAKLSAgICAgICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgICAgICAgICAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICAgICAgICAgICA+Ci0gICAgICAgICAgIAotICA8cGFnZTp0aXRsZT4KLSAgICA8aTE4bjp0ZXh0PkNyZWF0ZSBQdWJsaWNhdGlvbiBmcm9tIFRlbXBsYXRlPC9pMThuOnRleHQ+Ci0gIDwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD5DcmVhdGUgUHVibGljYXRpb24gZnJvbSBUZW1wbGF0ZTwvaTE4bjp0ZXh0PgotICAgICAgPC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDxmb3JtIG1ldGhvZD0iZ2V0IiBhY3Rpb249IiIgaWQ9ImZvcm0tY3JlYXRlX3B1Yl9mcm9tX3RlbXBsYXRlIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJwdWJsaWNhdGlvbklkIj48aTE4bjp0ZXh0PlB1YmxpY2F0aW9uIElEPC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiBuYW1lPSJwdWJsaWNhdGlvbklkIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncHVibGljYXRpb25JZCcpfSIvPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9InB1YmxpY2F0aW9uTmFtZSI+PGkxOG46dGV4dD5QdWJsaWNhdGlvbiBOYW1lPC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiBuYW1lPSJwdWJsaWNhdGlvbk5hbWUiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdwdWJsaWNhdGlvbk5hbWUnKX0iLz48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJ0ZW1wbGF0ZSI+PGkxOG46dGV4dD5UZW1wbGF0ZTwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9InRlbXBsYXRlIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0idGVtcGxhdGUiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdhdmFpbGFibGVUZW1wbGF0ZXMnKX0iPgotICAgICAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dGVtcGxhdGUuZXF1YWxzKHVzZWNhc2UuZ2V0UGFyYW1ldGVyKCd0ZW1wbGF0ZScpKX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHt0ZW1wbGF0ZX0iIHNlbGVjdGVkPSJzZWxlY3RlZCI+PGp4Om91dCB2YWx1ZT0iJHt0ZW1wbGF0ZX0iLz48L29wdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7dGVtcGxhdGV9Ij48ang6b3V0IHZhbHVlPSIke3RlbXBsYXRlfSIvPjwvb3B0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkNyZWF0ZSIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi9ndWktbWFuYWdlci54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvY29jb29uLXhjb25mL2d1aS1tYW5hZ2VyLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmUwYWQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvY29jb29uLXhjb25mL2d1aS1tYW5hZ2VyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vZ3VpLW1hbmFnZXIiPg0KLSAgICA8Z3VpLW1hbmFnZXIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi90ZXN0LXVzZWNhc2UtaW52b2tlci54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvY29jb29uLXhjb25mL3Rlc3QtdXNlY2FzZS1pbnZva2VyLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhhZTU0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvY29jb29uLXhjb25mL3Rlc3QtdXNlY2FzZS1pbnZva2VyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uIg0KLSAgICB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuaW1wbC5UZXN0VXNlY2FzZUludm9rZXInXSI+DQotICAgIDxjb21wb25lbnQgbG9nZ2VyPSJsZW55YS51c2VjYXNlLmludm9rZXIiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuaW1wbC5UZXN0VXNlY2FzZUludm9rZXIiDQotICAgICAgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5pbXBsLlRlc3RVc2VjYXNlSW52b2tlciIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWF1dGhvcml6ZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWF1dGhvcml6ZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTkxM2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1hdXRob3JpemVyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vYXV0aG9yaXplcnMiIHVubGVzcz0iL2NvY29vbi9hdXRob3JpemVycy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAndXNlY2FzZSddIj4KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InVzZWNhc2UiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmFjLnVzZWNhc2UuaW1wbC5Vc2VjYXNlQXV0aG9yaXplckltcGwiDQotICAgICAgbG9nZ2VyPSJsZW55YS5hYy5hdXRob3JpemVyLnVzZWNhc2UiLz4KLSAgPC94Y29uZj4NCi0gIA0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2Vjcm9uam9iLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZWNyb25qb2IueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Y2Q4ZjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZWNyb25qb2IueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5jcm9uLkNyb25Kb2IvdXNlY2FzZSddIj4NCi0gICAgPGNvbXBvbmVudCByb2xlPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLmNyb24uQ3JvbkpvYi91c2VjYXNlIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnNjaGVkdWxpbmcuaW1wbC5Vc2VjYXNlQ3JvbkpvYiINCi0gICAgICBsb2dnZXI9ImNyb24udXNlY2FzZSIvPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZWludm9rZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlaW52b2tlci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxNzJmMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlaW52b2tlci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL2NvbXBvbmVudFtAcm9sZSA9ICdvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VJbnZva2VyJ10iPg0KLSAgICA8Y29tcG9uZW50Ci0gICAgICByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VJbnZva2VyIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuaW1wbC5Vc2VjYXNlSW52b2tlckltcGwiDQotICAgICAgbG9nZ2VyPSJsZW55YS51c2VjYXNlIi8+DQotICA8L3hjb25mPg0KLSAgDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZW1vZHVsZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2Vtb2R1bGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDdkZmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZW1vZHVsZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL2lucHV0LW1vZHVsZXMiIHVubGVzcz0iL2NvY29vbi9pbnB1dC1tb2R1bGVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd1c2VjYXNlJ10iPgotCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbG9nZ2VyPSJjb3JlLm1vZHVsZXMuaW5wdXQudXNlY2FzZSIgbmFtZT0idXNlY2FzZSIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5jb2Nvb24uVXNlY2FzZU1vZHVsZSIvPgotICAKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcmVzb2x2ZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcmVzb2x2ZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNjRhNzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXJlc29sdmVyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZVJlc29sdmVyJ10iPg0KLSAgICA8Y29tcG9uZW50Ci0gICAgICByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VSZXNvbHZlciIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLmltcGwuVXNlY2FzZVJlc29sdmVySW1wbCINCi0gICAgICBsb2dnZXI9ImxlbnlhLnVzZWNhc2UiLz4NCi0gIDwveGNvbmY+DQotICANCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjMyNWU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMiPg0KLSAgICA8dXNlY2FzZXMvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlc2NoZWR1bGVyLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXNjaGVkdWxlci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzZjllNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlc2NoZWR1bGVyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2Uuc2NoZWR1bGluZy5Vc2VjYXNlU2NoZWR1bGVyJ10iPg0KLSAgICA8Y29tcG9uZW50Ci0gICAgICByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnNjaGVkdWxpbmcuVXNlY2FzZVNjaGVkdWxlciIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnNjaGVkdWxpbmcuaW1wbC5Vc2VjYXNlU2NoZWR1bGVySW1wbCINCi0gICAgICBsb2dnZXI9ImxlbnlhLnVzZWNhc2UiLz4NCi0gIDwveGNvbmY+DQotICANCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzE5M2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZTwvaWQ+Ci0gIDxleHBvcnQgcGFja2FnZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZSIvPgotICA8ZXhwb3J0IHBhY2thZ2U9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UiLz4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnNjaGVkdWxpbmciLz4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnhtbCIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5hYyIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jYWNoZSIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPlVzZWNhc2UgZnJhbWV3b3JrIEFQSTwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+VXNlY2FzZSBmcmFtZXdvcmsgQVBJPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVycy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVycy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQyYmZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9jb25maWcvc2l0ZW1hcC90cmFuc2Zvcm1lcnMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08eG1hcCB4cGF0aD0iL3NpdGVtYXAvY29tcG9uZW50cy90cmFuc2Zvcm1lcnMiIA0KLSAgdW5sZXNzPSIvc2l0ZW1hcC9jb21wb25lbnRzL3RyYW5zZm9ybWVycy90cmFuc2Zvcm1lcltAbmFtZSA9ICd1c2VjYXNlbWVudSddIg0KLSAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPg0KLSAgICA8bWFwOnRyYW5zZm9ybWVyIG5hbWU9InVzZWNhc2VtZW51IiBsb2dnZXI9ImxlbnlhLnNpdGVtYXAudHJhbnNmb3JtZXIudXNlY2FzZW1lbnUiIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uLlVzZWNhc2VNZW51VHJhbnNmb3JtZXIiLz4NCi08L3htYXA+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2VkaXQtZG9jdW1lbnQuanMgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvZWRpdC1kb2N1bWVudC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4Njk0MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvZWRpdC1kb2N1bWVudC5qcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyoKLSAgVGhpcyBmaWxlIGlzIGRlcHJlY2F0ZWQuIFlvdSBzaG91bGQgbm90IGJhc2UgbmV3IGNvZGUgb24gaXQuIAotICBJdCdzIHN0aWxsIHVzZWQgYnkgS3VwdSBhbmQgQlhFLCAgdGhhdCdzIHdoeSBpdCByZW1haW5zIGZvciBub3cuIAotICBJbiB0aGUgZnV0dXJlLCBnZW5lcmljIGVkaXRvciBmdW5jdGlvbmFsaXR5IGFuZCBkb2N1bWVudCBoYW5kbGluZyAKLSAgaGVscGVycyBzaG91bGQgYmUgcHJvdmlkZWQgYnkgdGhlIGVkaXRvcnMgbW9kdWxlIG9ubHkuCi0qLwotCi1pbXBvcnRDbGFzcyhQYWNrYWdlcy5vcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZmxvdy5GbG93SGVscGVyKTsKLWltcG9ydENsYXNzKFBhY2thZ2VzLm9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcik7Ci1pbXBvcnRDbGFzcyhQYWNrYWdlcy5vcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLlNvdXJjZVV0aWwpOwotCi0vKioKLSAqIFByb3ZpZGVzIGdlbmVyYWwgZmxvdyBmdW5jdGlvbnMgZm9yIGRvY3VtZW50IGVkaXRpbmcuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLQotZnVuY3Rpb24gY2hlY2tvdXREb2N1bWVudCgpIHsKLX0KLQotZnVuY3Rpb24gY2hlY2tpbkRvY3VtZW50KCkgewotfQotCi0vKioKLSAqIFNhdmVzIGEgU291cmNlIHRvIHRoZSBkb2N1bWVudCBpbiB0aGUgY3VycmVudCBQYWdlRW52ZWxvcGUuCi0gKiBUT0RPOiBVc2Ugbm9iYnkncyBuZXcgdXNlY2FzZSBmdyBpbiAyLjAgYnJhbmNoLiBFeGNlcHRpb24gaGFuZGxpbmcgZS5nLiBkaXNwbGF5IGFwcHJvcHJpYXRlIGVycm9yIHBhZ2VzLgotICogQHBhcmFtIHNvdXJjZVVyaSBBbiBVUkkgb2YgYSBTb3VyY2UgcHJvdmlkaW5nIHRoZSBlZGl0ZWQgZG9jdW1lbnQgZGF0YQotICogQHBhcmFtIHVzZUJ1ZmZlciBJZiAidHJ1ZSIsIHRoZSBzb3VyY2UgU291cmNlIGlzIHJlYWQgaW50byBhIGJ1ZmZlciBiZWZvcmUgaXQgaXMgd3JpdHRlbiB0byBpdHMgZmluYWwgZGVzdGluYXRpb24uCi0gKiBAcGFyYW0gd29ya2Zsb3dFdmVudCBOYW1lIG9mIHRoZSB3b3JrZmxvdyBldmVudCB0byB0cmlnZ2VyLiBEZWZhdWx0IGlzICJlZGl0Ii4KLSAqIEBwYXJhbSBub1dvcmtmbG93IElmIHRydWUsIG5vIHdvcmtmbG93IGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLiBEZWZhdWx0IGlzIGZhbHNlLgotICogQHBhcmFtIG5vQ2hlY2tpbiBJZiB0cnVlLCB0aGUgY3VycmVudCBkb2N1bWVudCBpcyBub3QgY2hlY2tlZCBpbi4gRGVmYXVsdCBpcyBmYWxzZS4KLSAqIEBwYXJhbSBiYWNrdXAgSWYgdHJ1ZSwgYSBuZXcgcmV2aXNpb24gaXMgY3JlYXRlZCBvbiBjaGVja2luLiBEZWZhdWx0IGlzIHRydWUuCi0gKiBAcGFyYW0gc3RhdHVzIERlZmF1bHQgaW50IHZhbHVlIGlzIDIwNC4gVXNlZCB0byBzZXQgdGhlIHJlc3BvbnNlIHN0YXR1cy4KLSAqIEBwYXJhbSBub1N0YXR1cyBJZiB0cnVlLCB0aGVuIG5vIHJlc3BvbnNlIHN0YXR1cyB3aWxsIGJlIHNldC4gICAgIAotICovCi1mdW5jdGlvbiBlZGl0RG9jdW1lbnQoKSB7Ci0gICAgdmFyIHVzZWNhc2VOYW1lID0gY29jb29uLnBhcmFtZXRlcnNbImxlbnlhLnVzZWNhc2UiXTsKLSAgICAKLSAgICB2YXIgdXNlY2FzZVJlc29sdmVyOwotICAgIHZhciB1c2VjYXNlOwotICAgIAotICAgIHRyeSB7Ci0gICAgICAgIHZhciBmbG93SGVscGVyID0gY29jb29uLmdldENvbXBvbmVudCgib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmZsb3cuRmxvd0hlbHBlciIpOwotICAgICAgICB2YXIgcmVxdWVzdCA9IGZsb3dIZWxwZXIuZ2V0UmVxdWVzdChjb2Nvb24pOwotICAgICAgICB2YXIgc291cmNlVXJsID0gUGFja2FnZXMub3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpOwotCi0gICAgICAgIHVzZWNhc2VSZXNvbHZlciA9IGNvY29vbi5nZXRDb21wb25lbnQoIm9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZVJlc29sdmVyIik7Ci0gICAgICAgIHVzZWNhc2UgPSB1c2VjYXNlUmVzb2x2ZXIucmVzb2x2ZShzb3VyY2VVcmwsIHVzZWNhc2VOYW1lKTsKLQotICAgICAgICBpZiAoY29jb29uLmxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBjb2Nvb24ubG9nLmRlYnVnKCJlZGl0LWRvY3VtZW50LmpzOjplZGl0RG9jdW1lbnQoKSBjYWxsaW5nIHVzZWNhc2UgbWV0aG9kcywgdXNlY2FzZU5hbWUgWyIgKyB1c2VjYXNlTmFtZSArICJdLCBzb3VyY2VVcmwgWyIgKyBzb3VyY2VVcmwgKyAiXSIpOyAgICAKLSAgICAgICAgfQotCi0gICAgICAgIHVzZWNhc2Uuc2V0U291cmNlVVJMKHNvdXJjZVVybCk7Ci0gICAgICAgIHVzZWNhc2Uuc2V0TmFtZSh1c2VjYXNlTmFtZSk7Ci0KLSAgICAgICAgdXNlY2FzZS5jaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgdXNlY2FzZS5sb2NrSW52b2x2ZWRPYmplY3RzKCk7Ci0gICAgICAgIGlmICghdXNlY2FzZS5nZXRFcnJvck1lc3NhZ2VzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDaGVja2luZyBwcmUtY29uZGl0aW9ucyBvciBsb2NraW5nIGZhaWxlZCEiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHVzZWNhc2UuZXhlY3V0ZSgpOwotICAgICAgICAgICAgaWYgKCF1c2VjYXNlLmdldEVycm9yTWVzc2FnZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTYXZpbmcgZmFpbGVkISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvY29vbi5sb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgY29jb29uLmxvZy5kZWJ1ZygiZWRpdC1kb2N1bWVudC5qczo6ZWRpdERvY3VtZW50KCkgYWZ0ZXIgdXNlY2FzZS5leGVjdXRlKCksIGhhc0Vycm9ycyA/ICIgKyB1c2VjYXNlLmhhc0Vycm9ycygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZJWE1FOiBoYW5kbGUgZXJyb3IgbWVzc2FnZXMKLSAgICAgICAgLy9pZiAodXNlY2FzZS5oYXNFcnJvcnMoKSkgewotICAgICAgICAvL30KLQotICAgICAgICBpZihfZ2V0UGFyYW1ldGVyKCJub1N0YXR1cyIsICJmYWxzZSIpID09ICJmYWxzZSIpCi0gICAgICAgICAgICBjb2Nvb24uc2VuZFN0YXR1cyhfZ2V0UGFyYW1ldGVyKCJzdGF0dXMiLCAyMDQpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29jb29uLnJlZGlyZWN0VG8oX2dldFBhcmFtZXRlcigicmVkaXJlY3RVcmwiLCAiRklYTUUiKSk7Ci0KLSAgICB9IGNhdGNoIChleGNlcHRpb24pIHsKLQotCS8qIEZJWE1FOiBUaGlzIGlzIHVuY2xlYW4gYmVjYXVzZSB0aGUgZmxvdyB3aWxsIG5vdCByZXR1cm4gYSB2YWx1ZQotCSAgIGlmIHRoZXJlIGlzIGFuIGV4Y2VwdGlvbiAqLwotICAgICAgICBjb2Nvb24ubG9nLmVycm9yKCJDYW4gbm90IGVkaXQgZG9jdW1lbnQuIiwgZXhjZXB0aW9uKTsKLSAgICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkgewotICAgICAgICAvKiBkb25lIHdpdGggdXNlY2FzZSBjb21wb25lbnQsIHRlbGwgdXNlY2FzZVJlc29sdmVyIHRvIHJlbGVhc2UgaXQgKi8KLSAgICAgICAgaWYgKHVzZWNhc2VSZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodXNlY2FzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZVJlc29sdmVyLnJlbGVhc2UodXNlY2FzZSk7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZSA9IHVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvY29vbi5yZWxlYXNlQ29tcG9uZW50KHVzZWNhc2VSZXNvbHZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotfQotCi1mdW5jdGlvbiBfZ2V0UGFyYW1ldGVyKG5hbWUsIGRlZmF1bHRWYWx1ZSkgewotICAgIGlmKGNvY29vbi5wYXJhbWV0ZXJzW25hbWVdKQotICAgICAgICByZXR1cm4gY29jb29uLnBhcmFtZXRlcnNbbmFtZV07Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotfQotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZS9Vc2VjYXNlQXV0aG9yaXplci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2UvVXNlY2FzZUF1dGhvcml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4OTY1ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZS9Vc2VjYXNlQXV0aG9yaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkF1dGhvcml6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotCi0vKioKLSAqIEF1dGhvcml6ZXIgZm9yIHVzZWNhc2VzLgotICogQHZlcnNpb24gJElkOiBVc2VjYXNlQXV0aG9yaXplci5qYXZhIDM5MjQ0OSAyMDA2LTA0LTA3IDIzOjIwOjM4WiBtaWNoaSAkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVXNlY2FzZUF1dGhvcml6ZXIgZXh0ZW5kcyBBdXRob3JpemVyIHsKLQotICAgIC8qKgotICAgICAqIEF1dGhvcml6ZXMgYSB1c2VjYXNlIGJ5IGNvbnNpZGVyaW5nIGFsbCByb2xlcyBvZiB0aGUgY3VycmVudCBpZGVudGl0eQotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VjYXNlIFRoZSB1c2VjYXNlIElELgotICAgICAqIEBwYXJhbSByb2xlcyBUaGUgcm9sZXMgb2YgdGhlIGN1cnJlbnQgaWRlbnRpdHkuCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBib29sZWFuIGF1dGhvcml6ZVVzZWNhc2UoU3RyaW5nIHVzZWNhc2UsIFJvbGVbXSByb2xlcywgUHVibGljYXRpb24gcHVibGljYXRpb24pIAotICAgICAgICAgICAgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHcmFudHMgb3IgZGVuaWVzIGEgdXNlY2FzZSB0byBhIHJvbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VjYXNlIFRoZSB1c2VjYXNlLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUuCi0gICAgICogQHBhcmFtIGdyYW50ZWQgSWYgdGhlIHVzZWNhc2Ugc2hhbGwgYmUgcGVybWl0dGVkLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBzZXRQZXJtaXNzaW9uKFN0cmluZyB1c2VjYXNlLCBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgUm9sZSByb2xlLCBib29sZWFuIGdyYW50ZWQpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcm9sZSBpcyBwZXJtaXR0ZWQgdG8gaW52b2tlIGEgZ2l2ZW4gdXNlY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHVzZWNhc2UgVGhlIHVzZWNhc2UuCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gcm9sZSBUaGUgcm9sZS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNQZXJtaXR0ZWQoU3RyaW5nIHVzZWNhc2UsIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBSb2xlIHJvbGUpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2UvaW1wbC9Vc2VjYXNlQXV0aG9yaXplckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlL2ltcGwvVXNlY2FzZUF1dGhvcml6ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MzJkYzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2UvaW1wbC9Vc2VjYXNlQXV0aG9yaXplckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcml6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGUuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZS5DYWNoaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuY2FjaGUuU291cmNlQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlLlVzZWNhc2VBdXRob3JpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uVXRpbDsKLQotLyoqCi0gKiBBdXRob3JpemVyIGZvciB1c2VjYXNlcy4KLSAqIDxwPgotICogU3VwcG9ydGVkIHBhcmFtZXRlcnMgdmlhIHtAbGluayBQYXJhbWV0ZXJpemFibGV9OgotICogPC9wPgotICogPHVsPgotICogPGxpPiB7QGxpbmsgI1BBUkFNRVRFUl9DT05GSUdVUkFUSU9OfSAtIGxvY2F0aW9uIG9mIHRoZSB1c2VjYXNlIHBvbGljaWVzIGZpbGUKLSAqIChwYXJhbWV0ZXJpemFibGUgZm9yIHRlc3RpbmcgcHVycG9zZXMpIDwvbGk+Ci0gKiA8L3VsPgotICogQHZlcnNpb24gJElkOiBVc2VjYXNlQXV0aG9yaXplci5qYXZhIDM5MjQ0OSAyMDA2LTA0LTA3IDIzOjIwOjM4WiBtaWNoaSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VjYXNlQXV0aG9yaXplckltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBVc2VjYXNlQXV0aG9yaXplciwKLSAgICAgICAgU2VydmljZWFibGUsIERpc3Bvc2FibGUsIFBhcmFtZXRlcml6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHNldWRvLXVzZWNhc2UgdGhhdCBnb3Zlcm5zIGFjY2VzcyB0byBwYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVF9VU0VDQVNFID0gImFjLnZpc2l0IjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9DT05GSUdVUkFUSU9OID0gImNvbmZpZ3VyYXRpb24iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidXNlY2FzZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFQ0FTRV9QQVJBTUVURVIgPSAibGVueWEudXNlY2FzZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDX0NPTkZJR1VSQVRJT05fRklMRSA9ICJjb25maWcvYWNjZXNzLWNvbnRyb2wvYWNjZXNzLWNvbnRyb2wueG1sIgotICAgICAgICAgICAgLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0gICAgcHJpdmF0ZSBTb3VyY2VDYWNoZSBjYWNoZTsKLSAgICAvKioKLSAgICAgKiB0aGUgY29uZmlndXJhdGlvbiBVUkkgZm9yIHRoaXMgY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29uZmlndXJhdGlvblVyaTsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIHB1YmxpY2F0aW9uIElEcyB0byB0aGVpciBjb25maWd1cmF0aW9uIFVSSXMuIFRoaXMgaXMgYSBwZXJzaXN0ZW50Ci0gICAgICogbWFwIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHB1YmxpY2F0aW9uIGxvb2t1cHMuIFdoZW5ldmVyIGFuIGF1dGhvcml6YXRpb24KLSAgICAgKiByZXF1ZXN0IGZvciBhIG5ldyBwdWJsaWNhdGlvbiBpcyBkZWFsdCB3aXRoLCB0aGUgcHVibGljYXRpb24ncwotICAgICAqIGNvbmZpZ3VyYXRpb24gVVJJIGlzIHN0b3JlZCwgdG8gYmUgcmUtdXNlZCBvbiBsYXRlciBvY2Nhc2lvbnMgKGZvciB0aGUKLSAgICAgKiBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBwdWJJZDJjb25maWdVcmkgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlLlVzZWNhc2VBdXRob3JpemVyI2F1dGhvcml6ZVVzZWNhc2UoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZVtdLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYXV0aG9yaXplVXNlY2FzZShTdHJpbmcgdXNlY2FzZSwgUm9sZVtdIHJvbGVzLCBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGF1dGhvcml6ZVVzZWNhc2UodXNlY2FzZSwgcm9sZXMsIGdldENvbmZpZ3VyYXRpb25VUkkocHVibGljYXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXV0aG9yaXplVXNlY2FzZShTdHJpbmcgdXNlY2FzZSwgUm9sZVtdIHJvbGVzLCBTdHJpbmcgX2NvbmZpZ3VyYXRpb25VcmkpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBdXRob3JpemluZyB1c2VjYXNlIFsiICsgdXNlY2FzZSArICJdIik7Ci0gICAgICAgIGJvb2xlYW4gYXV0aG9yaXplZCA9IGZhbHNlOwotCi0gICAgICAgIFVzZWNhc2VSb2xlcyB1c2VjYXNlUm9sZXMgPSBnZXRVc2VjYXNlUm9sZXMoX2NvbmZpZ3VyYXRpb25VcmkpOwotCi0gICAgICAgIGlmICh1c2VjYXNlUm9sZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIlVzZWNhc2UgcG9saWNpZXMgY29uZmlndXJhdGlvbiBub3QgZm91bmQgYXQgWyIKLSAgICAgICAgICAgICAgICAgICAgKyBfY29uZmlndXJhdGlvblVyaSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodXNlY2FzZVJvbGVzLmhhc1JvbGVzKHVzZWNhc2UpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiUm9sZXMgZm9yIHVzZWNhc2UgZm91bmQuIik7Ci0KLSAgICAgICAgICAgIExpc3QgdXNlY2FzZVJvbGVJZHMgPSBBcnJheXMuYXNMaXN0KHVzZWNhc2VSb2xlcy5nZXRSb2xlcyh1c2VjYXNlKSk7Ci0KLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlICghYXV0aG9yaXplZCAmJiBpIDwgcm9sZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgYXV0aG9yaXplZCA9IHVzZWNhc2VSb2xlSWRzLmNvbnRhaW5zKHJvbGVzW2ldLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXRob3JpemF0aW9uIGZvciByb2xlIFsiICsgcm9sZXNbaV0uZ2V0SWQoKSArICJdIGlzIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhdXRob3JpemVkICsgIl0iKTsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiTm8gcm9sZXMgZm9yIHVzZWNhc2UgWyIgKyB1c2VjYXNlICsgIl0gZm91bmQuIERlbnlpbmcgYWNjZXNzLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdXRob3JpemVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZS5Vc2VjYXNlQXV0aG9yaXplciNpc1Blcm1pdHRlZChqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb24sCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQZXJtaXR0ZWQoU3RyaW5nIHVzZWNhc2UsIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBSb2xlIHJvbGUpCi0gICAgICAgICAgICB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb25maWdVcmkgPSBnZXRDb25maWd1cmF0aW9uVVJJKHB1YmxpY2F0aW9uKTsKLSAgICAgICAgVXNlY2FzZVJvbGVzIHVzZWNhc2VSb2xlcyA9IGdldFVzZWNhc2VSb2xlcyhjb25maWdVcmkpOwotICAgICAgICBTdHJpbmdbXSByb2xlcyA9IHVzZWNhc2VSb2xlcy5nZXRSb2xlcyh1c2VjYXNlKTsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qocm9sZXMpLmNvbnRhaW5zKHJvbGUuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlLlVzZWNhc2VBdXRob3JpemVyI3NldFBlcm1pc3Npb24oamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlLCBib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBlcm1pc3Npb24oU3RyaW5nIHVzZWNhc2UsIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBSb2xlIHJvbGUsIGJvb2xlYW4gZ3JhbnRlZCkKLSAgICAgICAgICAgIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNvbmZpZ1VyaSA9IGdldENvbmZpZ3VyYXRpb25VUkkocHVibGljYXRpb24pOwotICAgICAgICBpZiAoY29uZmlnVXJpLnN0YXJ0c1dpdGgoImFnZ3JlZ2F0ZS0iKSkgewotICAgICAgICAgICAgY29uZmlnVXJpID0gY29uZmlnVXJpLnN1YnN0cmluZygiYWdncmVnYXRlLSIubGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIFVzZWNhc2VSb2xlcyB1c2VjYXNlUm9sZXMgPSBnZXRVc2VjYXNlUm9sZXMoY29uZmlnVXJpKTsKLSAgICAgICAgTGlzdCByb2xlcyA9IEFycmF5cy5hc0xpc3QodXNlY2FzZVJvbGVzLmdldFJvbGVzKHVzZWNhc2UpKTsKLSAgICAgICAgU3RyaW5nIHJvbGVJZCA9IHJvbGUuZ2V0SWQoKTsKLSAgICAgICAgaWYgKGdyYW50ZWQpIHsKLSAgICAgICAgICAgIGlmICghcm9sZXMuY29udGFpbnMocm9sZUlkKSkgewotICAgICAgICAgICAgICAgIHVzZWNhc2VSb2xlcy5hZGRSb2xlKHVzZWNhc2UsIHJvbGVJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocm9sZXMuY29udGFpbnMocm9sZUlkKSkgewotICAgICAgICAgICAgICAgIHVzZWNhc2VSb2xlcy5yZW1vdmVSb2xlKHVzZWNhc2UsIHJvbGVJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVXNlY2FzZVJvbGVzQnVpbGRlciBidWlsZGVyID0gbmV3IFVzZWNhc2VSb2xlc0J1aWxkZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2F2ZSh1c2VjYXNlUm9sZXMsIGNvbmZpZ1VyaSwgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHN1YnN0aXR1dGUgVklTSVRfVVNFQ0FTRSBpZiBubyBVU0VDQVNFX1BBUkFNRVRFUiBpcyBzZXQsCi0gICAgICogc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBhdXRob3JpemUgcGxhaW4gcGFnZSBhY2Nlc3MgYXMgd2VsbC4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuYWMuQXV0aG9yaXplciNhdXRob3JpemUob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhdXRob3JpemUoUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHVzZWNhc2UgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVU0VDQVNFX1BBUkFNRVRFUik7Ci0gICAgICAgIGlmICh1c2VjYXNlID09IG51bGwgfHwgIiIuZXF1YWxzKHVzZWNhc2UpKSB7Ci0gICAgICAgICAgICB1c2VjYXNlID0gVklTSVRfVVNFQ0FTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gYXV0aG9yaXplZCA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgX2NvbmZpZ3VyYXRpb25Vcmk7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2VydmljZSBoYXMgYmVlbiBwYXJhbWV0ZXJpemVkIHdpdGggYQotICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvbiBVUkkuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgZXRjLgotICAgICAgICAgICAgaWYgKGdldENvbmZpZ3VyYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX2NvbmZpZ3VyYXRpb25VcmkgPSBnZXRDb25maWd1cmF0aW9uVVJJKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gUHVibGljYXRpb25VdGlsLmdldFB1YmxpY2F0aW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgX2NvbmZpZ3VyYXRpb25VcmkgPSBnZXRDb25maWd1cmF0aW9uVVJJKHB1YmxpY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUm9sZVtdIHJvbGVzID0gUG9saWN5VXRpbC5nZXRSb2xlcyhyZXF1ZXN0KTsKLSAgICAgICAgICAgIGF1dGhvcml6ZWQgPSBhdXRob3JpemVVc2VjYXNlKHVzZWNhc2UsIHJvbGVzLCBfY29uZmlndXJhdGlvblVyaSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBzb3VyY2UgY2FjaGUuCi0gICAgICogQHJldHVybiBBIHNvdXJjZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNvdXJjZUNhY2hlIGdldENhY2hlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jYWNoZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgVVJJIG9mIHRoZSB1c2VjYXNlIHJvbGUgY29uZmlndXJhdGlvbiBmaWxlIGZvciBhCi0gICAgICogY2VydGFpbiBwdWJsaWNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgVVJJLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvblVSSShQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikgewotCi0gICAgICAgIFN0cmluZyBjb25maWdVUkkgPSAoU3RyaW5nKSB0aGlzLnB1YklkMmNvbmZpZ1VyaS5nZXQocHVibGljYXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChjb25maWdVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldENvbmZpZ3VyYXRpb24ocHVibGljYXRpb24pOwotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25bXSBhdXRob3JpemVyQ29uZmlncyA9IGNvbmZpZy5nZXRDaGlsZHJlbigiYXV0aG9yaXplciIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXV0aG9yaXplckNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhvcml6ZXJDb25maWdzW2ldLmdldEF0dHJpYnV0ZSgidHlwZSIpLmVxdWFscygidXNlY2FzZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHBhcmFDb25maWcgPSBhdXRob3JpemVyQ29uZmlnc1tpXS5nZXRDaGlsZCgicGFyYW1ldGVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdVUkkgPSBwYXJhQ29uZmlnLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHViSWQyY29uZmlnVXJpLnB1dChwdWJsaWNhdGlvbi5nZXRJZCgpLCBjb25maWdVUkkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbmZpZ1VSSTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVXNlY2FzZVJvbGVzIGdldFVzZWNhc2VSb2xlcyhTdHJpbmcgX2NvbmZpZ3VyYXRpb25VcmkpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgVXNlY2FzZVJvbGVzQnVpbGRlciBidWlsZGVyID0gbmV3IFVzZWNhc2VSb2xlc0J1aWxkZXIoKTsKLSAgICAgICAgVXNlY2FzZVJvbGVzIHVzZWNhc2VSb2xlczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVzZWNhc2VSb2xlcyA9IChVc2VjYXNlUm9sZXMpIGdldENhY2hlKCkuZ2V0KF9jb25maWd1cmF0aW9uVXJpLCBidWlsZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoQ2FjaGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlY2FzZVJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIF9tYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJTZXJ2aWNpbmcgWyIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICJdIik7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IF9tYW5hZ2VyOwotICAgICAgICB0aGlzLmNhY2hlID0gKFNvdXJjZUNhY2hlKSBfbWFuYWdlci5sb29rdXAoU291cmNlQ2FjaGUuUk9MRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAoZ2V0Q2FjaGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShnZXRDYWNoZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcmFtZXRlcml6ZShQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHRocm93cyBQYXJhbWV0ZXJFeGNlcHRpb24gewotICAgICAgICBpZiAocGFyYW1ldGVycy5pc1BhcmFtZXRlcihQQVJBTUVURVJfQ09ORklHVVJBVElPTikpIHsKLSAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblVyaSA9IHBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKFBBUkFNRVRFUl9DT05GSUdVUkFUSU9OKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25VUkkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25Vcmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFjY2VzcyBjb250cm9sIGNvbmZpZ3VyYXRpb24gb2YgYSBzcGVjaWZpYyBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEByZXR1cm4gQ29uZmlndXJhdGlvbgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgY29uZmlndXJhdGlvbkZpbGUgPSBuZXcgRmlsZShwdWJsaWNhdGlvbi5nZXREaXJlY3RvcnkoKSwgQUNfQ09ORklHVVJBVElPTl9GSUxFKTsKLQotICAgICAgICBpZiAoY29uZmlndXJhdGlvbkZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGRGcm9tRmlsZShjb25maWd1cmF0aW9uRmlsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rvcnk6ICIgKyBjb25maWd1cmF0aW9uRmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlL2ltcGwvVXNlY2FzZVJvbGVzLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZS9pbXBsL1VzZWNhc2VSb2xlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRjOGZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hYy91c2VjYXNlL2ltcGwvVXNlY2FzZVJvbGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQ2xhc3MgdG8gbWFuYWdlIHJvbGVzIGZvciBhIHVzZWNhc2UuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFVzZWNhc2VSb2xlcyB7Ci0KLSAgICBwcml2YXRlIE1hcCB1c2VjYXNlVG9Sb2xlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBVc2VjYXNlUm9sZXMoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByb2xlcyBmb3IgYSB1c2VjYXNlLgotICAgICAqIEBwYXJhbSB1c2VjYXNlSWQgVGhlIHVzZWNhc2UgSUQuCi0gICAgICogQHBhcmFtIHJvbGVJZHMgVGhlIHJvbGUgSURzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvbGVzKFN0cmluZyB1c2VjYXNlSWQsIFN0cmluZ1tdIHJvbGVJZHMpIHsKLSAgICAgICAgdGhpcy51c2VjYXNlVG9Sb2xlcy5wdXQodXNlY2FzZUlkLCByb2xlSWRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb2xlcyBmb3IgYSB1c2VjYXNlLiBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCBmb3IgdGhpcwotICAgICAqIHVzZWNhc2UsIGFuIGFycmF5IG9mIHNpemUgMCBpcyByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gdXNlY2FzZUlkIFRoZSB1c2VjYXNlIElELgotICAgICAqIEByZXR1cm4gQSByb2xlIGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSb2xlcyhTdHJpbmcgdXNlY2FzZUlkKSB7Ci0gICAgICAgIFN0cmluZ1tdIHVzZWNhc2VSb2xlczsKLSAgICAgICAgaWYgKHRoaXMudXNlY2FzZVRvUm9sZXMuY29udGFpbnNLZXkodXNlY2FzZUlkKSkgewotICAgICAgICAgICAgdXNlY2FzZVJvbGVzID0gKFN0cmluZ1tdKSB0aGlzLnVzZWNhc2VUb1JvbGVzLmdldCh1c2VjYXNlSWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXNlY2FzZVJvbGVzID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlY2FzZVJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIHVzZWNhc2UgaGFzIHJvbGVzLgotICAgICAqIEBwYXJhbSB1c2VjYXNlSWQgVGhlIHVzZWNhc2UgSUQuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUm9sZXMoU3RyaW5nIHVzZWNhc2VJZCkgewotICAgICAgICByZXR1cm4gdGhpcy51c2VjYXNlVG9Sb2xlcy5jb250YWluc0tleSh1c2VjYXNlSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWxsIGF2YWlsYWJsZSB1c2VjYXNlIG5hbWVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRVc2VjYXNlTmFtZXMoKSB7Ci0gICAgICAgIFNldCBuYW1lcyA9IHRoaXMudXNlY2FzZVRvUm9sZXMua2V5U2V0KCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIG5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdXNlY2FzZSBUaGUgdXNlY2FzZSBuYW1lLgotICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIElELgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJvbGUoU3RyaW5nIHVzZWNhc2UsIFN0cmluZyByb2xlKSB7Ci0gICAgICAgIFN0cmluZ1tdIHVzZWNhc2VSb2xlcyA9IGdldFJvbGVzKHVzZWNhc2UpOwotICAgICAgICBTZXQgbmV3Um9sZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBuZXdSb2xlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh1c2VjYXNlUm9sZXMpKTsKLSAgICAgICAgbmV3Um9sZXMuYWRkKHJvbGUpOwotICAgICAgICB0aGlzLnVzZWNhc2VUb1JvbGVzLnB1dCh1c2VjYXNlLCBuZXdSb2xlcy50b0FycmF5KG5ldyBTdHJpbmdbbmV3Um9sZXMuc2l6ZSgpXSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB1c2VjYXNlIFRoZSB1c2VjYXNlLgotICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGUoU3RyaW5nIHVzZWNhc2UsIFN0cmluZyByb2xlKSB7Ci0gICAgICAgIFN0cmluZ1tdIHVzZWNhc2VSb2xlcyA9IGdldFJvbGVzKHVzZWNhc2UpOwotICAgICAgICBTZXQgbmV3Um9sZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBuZXdSb2xlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh1c2VjYXNlUm9sZXMpKTsKLQotICAgICAgICBpZiAoIW5ld1JvbGVzLmNvbnRhaW5zKHJvbGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIHJvbGUgWyIgKyByb2xlICsgIl0gaXMgbm90IHNldCBmb3IgdXNlY2FzZSBbIiArIHVzZWNhc2UKLSAgICAgICAgICAgICAgICAgICAgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3Um9sZXMucmVtb3ZlKHJvbGUpOwotICAgICAgICB0aGlzLnVzZWNhc2VUb1JvbGVzLnB1dCh1c2VjYXNlLCBuZXdSb2xlcy50b0FycmF5KG5ldyBTdHJpbmdbbmV3Um9sZXMuc2l6ZSgpXSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FjL3VzZWNhc2UvaW1wbC9Vc2VjYXNlUm9sZXNCdWlsZGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZS9pbXBsL1VzZWNhc2VSb2xlc0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmZGI2My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYWMvdXNlY2FzZS9pbXBsL1VzZWNhc2VSb2xlc0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZS5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmNhY2hlLklucHV0U3RyZWFtQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLlNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBCdWlsZGVyIGZvciB1c2VjYXNlIHJvbGVzLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VjYXNlUm9sZXNCdWlsZGVyIGltcGxlbWVudHMgSW5wdXRTdHJlYW1CdWlsZGVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUNBU0VTX0VMRU1FTlQgPSAidXNlY2FzZXMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUNBU0VfRUxFTUVOVCA9ICJ1c2VjYXNlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0VMRU1FTlQgPSAicm9sZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUklCVVRFID0gImlkIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5hYy5jYWNoZS5JbnB1dFN0cmVhbUJ1aWxkZXIjYnVpbGQoamF2YS5pby5JbnB1dFN0cmVhbSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGJ1aWxkKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBVc2VjYXNlUm9sZXMgdXNlY2FzZVJvbGVzID0gbmV3IFVzZWNhc2VSb2xlcygpOwotCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoc3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBBc3NlcnQuaXNUcnVlKCJDb3JyZWN0IHVzZWNhc2UgcG9saWNpZXMgWE1MIiwgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKFVTRUNBU0VTX0VMRU1FTlQpKTsKLQotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihBY2Nlc3NDb250cm9sbGVyLk5BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLkRFRkFVTFRfUFJFRklYLCBkb2N1bWVudCk7Ci0KLSAgICAgICAgRWxlbWVudFtdIHVzZWNhc2VFbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbihkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICBVU0VDQVNFX0VMRU1FTlQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVzZWNhc2VFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHVzZWNhc2VJZCA9IHVzZWNhc2VFbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoSURfQVRUUklCVVRFKTsKLQotICAgICAgICAgICAgLy8gYWRkIHJvbGVzIG9ubHkgaWYgbm90IG92ZXJyaWRkZW4gYnkgY2hpbGQgcHVibGljYXRpb24KLSAgICAgICAgICAgIGlmICghdXNlY2FzZVJvbGVzLmhhc1JvbGVzKHVzZWNhc2VJZCkpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50W10gcm9sZUVsZW1lbnRzID0gaGVscGVyLmdldENoaWxkcmVuKHVzZWNhc2VFbGVtZW50c1tpXSwgUk9MRV9FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICBTZXQgcm9sZUlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByb2xlRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvbGVJZCA9IHJvbGVFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoSURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgICAgcm9sZUlkcy5hZGQocm9sZUlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcm9sZUlkQXJyYXkgPSAoU3RyaW5nW10pIHJvbGVJZHMudG9BcnJheShuZXcgU3RyaW5nW3JvbGVJZHMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZVJvbGVzLnNldFJvbGVzKHVzZWNhc2VJZCwgcm9sZUlkQXJyYXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1c2VjYXNlUm9sZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIHVzZWNhc2Ugcm9sZXMuCi0gICAgICogQHBhcmFtIHVzZWNhc2VSb2xlcyBUaGUgcm9sZXMuCi0gICAgICogQHBhcmFtIHNvdXJjZVVyaSBUaGUgc291cmNlIHRvIHNhdmUgdG8uCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYXZlKFVzZWNhc2VSb2xlcyB1c2VjYXNlUm9sZXMsIFN0cmluZyBzb3VyY2VVcmksIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihBY2Nlc3NDb250cm9sbGVyLk5BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5ERUZBVUxUX1BSRUZJWCwgVVNFQ0FTRVNfRUxFTUVOVCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB1c2VjYXNlTmFtZXMgPSB1c2VjYXNlUm9sZXMuZ2V0VXNlY2FzZU5hbWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCB1ID0gMDsgdSA8IHVzZWNhc2VOYW1lcy5sZW5ndGg7IHUrKykgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgdXNlY2FzZUVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudChVU0VDQVNFX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgIGhlbHBlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKHVzZWNhc2VFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB1c2VjYXNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoSURfQVRUUklCVVRFLCB1c2VjYXNlTmFtZXNbdV0pOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJvbGVzID0gdXNlY2FzZVJvbGVzLmdldFJvbGVzKHVzZWNhc2VOYW1lc1t1XSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByb2xlcy5sZW5ndGg7IHIrKykgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJvbGVFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoUk9MRV9FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgdXNlY2FzZUVsZW1lbnQuYXBwZW5kQ2hpbGQocm9sZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICByb2xlRWxlbWVudC5zZXRBdHRyaWJ1dGUoSURfQVRUUklCVVRFLCByb2xlc1tyXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU291cmNlVXRpbC53cml0ZURPTShoZWxwZXIuZ2V0RG9jdW1lbnQoKSwgc291cmNlVXJpLCBtYW5hZ2VyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9tYXRjaGluZy9Vc2VjYXNlUmVnaXN0cmF0aW9uTWF0Y2hlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9tYXRjaGluZy9Vc2VjYXNlUmVnaXN0cmF0aW9uTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk2MzQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vbWF0Y2hpbmcvVXNlY2FzZVJlZ2lzdHJhdGlvbk1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5tYXRjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnBvb2wuUG9vbGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24ubWF0Y2hpbmcuTWF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5zaXRlbWFwLlBhdHRlcm5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci0KLS8qKgotICogTWF0Y2hlcyBpZiB0aGUgcmVxdWVzdCBjYWxscyBhIHVzZWNhc2Ugd2hpY2ggaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIFVzZWNhc2UgRnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgVXNlY2FzZVJlZ2lzdHJhdGlvbk1hdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBNYXRjaGVyLCBTZXJ2aWNlYWJsZSwgUG9vbGFibGUgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5tYXRjaGluZy5NYXRjaGVyI21hdGNoKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwLCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgbWF0Y2goU3RyaW5nIHBhdHRlcm4sIE1hcCBvYmplY3RNb2RlbCwgUGFyYW1ldGVycyBwYXJhbWV0ZXJzKQotICAgICAgICAgICAgdGhyb3dzIFBhdHRlcm5FeGNlcHRpb24gewotCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotICAgICAgICBTdHJpbmcgdXNlY2FzZU5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibGVueWEudXNlY2FzZSIpOwotCi0gICAgICAgIE1hcCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmICh1c2VjYXNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIm1hdGNoKCkgY2FsbGVkLCB1c2VjYXNlIHBhcmFtZXRlciBpcyBlbXB0eSAtIHJldHVybmluZyBmYWxzZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJtYXRjaCgpIGNhbGxlZCBmb3IgcmVxdWVzdCBwYXJhbWV0ZXIgbGVueWEudXNlY2FzZSA9IFsiICsgdXNlY2FzZU5hbWUgKyAiXTsgbm90ZSB0aGF0IHBhdHRlcm4gaXMgbm90IHJlbGV2YW50IGZvciB0aGlzIG1hdGNoZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgdXNlY2FzZSBpcyBzZXQsIHNlZSBpZiB0aGlzIGlzIGEgcmVnaXN0ZXJlZCBjb21wb25lbnQKLSAgICAgICAgICAgIFVzZWNhc2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgcmVzb2x2ZXIgPSAoVXNlY2FzZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFVzZWNhc2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgIGlmIChyZXNvbHZlci5pc1JlZ2lzdGVyZWQodXJsLCB1c2VjYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJVc2VjYXNlIFsiICsgdXNlY2FzZU5hbWUgKyAiXSBleGlzdHM6IFsiICsgIShyZXN1bHQgPT0gbnVsbCkgKyAiXSIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBuZXcgUGF0dGVybkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgX21hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gX21hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3RyYW5zZm9ybWF0aW9uL1VzZWNhc2VNZW51VHJhbnNmb3JtZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vVXNlY2FzZU1lbnVUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIwYzBjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vVXNlY2FzZU1lbnVUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQ6IFVzZWNhc2VNZW51VHJhbnNmb3JtZXIuamF2YSA0MDcyNDggMjAwNi0wNS0xNyAxMzoyMDowMVogYW5kcmVhcyAkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5BYnN0cmFjdFNBWFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkF1dGhvcml6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmFjLlBvbGljeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMudXNlY2FzZS5Vc2VjYXNlQXV0aG9yaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKLQotLyoqCi0gKiBUaGlzIHRyYW5zZm9ybWVyIGRpc2FibGVzIG1lbnUgaXRlbXMgKGJ5IHJlbW92aW5nIHRoZSBocmVmIGF0dHJpYnV0ZSkgd2hpY2ggYXJlIG5vdCBhbGxvd2VkIHdpdGgKLSAqIHJlc3BlY3QgdG8gdGhlIHVzZWNhc2UgcG9saWNpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VjYXNlTWVudVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RTQVhUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIERpc3Bvc2FibGUgewotCi0gICAgLyoqCi0gICAgICogPGNvZGU+TUVOVV9FTEVNRU5UPC9jb2RlPiBUaGUgbWVudSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVV9FTEVNRU5UID0gIm1lbnUiOwotICAgIC8qKgotICAgICAqIFRoZSBtZW51IG5hbWVzcGFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VX05BTUVTUEFDRSA9ICJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiOwotICAgIC8qKgotICAgICAqIDxjb2RlPklURU1fRUxFTUVOVDwvY29kZT4gVGhlIGl0ZW0gZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fRUxFTUVOVCA9ICJpdGVtIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5VU0VDQVNFX0FUVFJJQlVURTwvY29kZT4gVGhlIHVzZWNhc2UgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFQ0FTRV9BVFRSSUJVVEUgPSAidXNlY2FzZSI7Ci0gICAgLyoqCi0gICAgICogQ29tbWVudCBmb3IgPGNvZGU+SFJFRl9BVFRSSUJVVEU8L2NvZGU+IFRoZSBocmVmIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhSRUZfQVRUUklCVVRFID0gImhyZWYiOwotICAgIC8qKgotICAgICAqIDxjb2RlPk5BTUVTUEFDRTwvY29kZT4gVGhlIHVzZWNhc2UgbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91c2VjYXNlLzEuMCI7Ci0KLSAgICAvKioKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyByYXcsIEF0dHJpYnV0ZXMgYXR0cikKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGF0dHI7Ci0gICAgICAgIExpc3QgbWVzc2FnZXMgPSBudWxsOwotCi0gICAgICAgIFVzZWNhc2VSZXNvbHZlciB1c2VjYXNlUmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXNlY2FzZVJlc29sdmVyID0gKFVzZWNhc2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChVc2VjYXNlUmVzb2x2ZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmF1dGhvcml6ZXIgIT0gbnVsbCAmJiBsb2NhbE5hbWUuZXF1YWxzKElURU1fRUxFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXNlY2FzZU5hbWUgPSBhdHRyLmdldFZhbHVlKE5BTUVTUEFDRSwgVVNFQ0FTRV9BVFRSSUJVVEUpOwotCi0gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGl0ZW0gaWYgdXNlY2FzZSBub3QgYWxsb3dlZAotICAgICAgICAgICAgICAgIGlmICh1c2VjYXNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiRm91bmQgdXNlY2FzZSBbIiArIHVzZWNhc2VOYW1lICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXV0aG9yaXplci5hdXRob3JpemVVc2VjYXNlKHVzZWNhc2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdWJsaWNhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVzZWNhc2Ugbm90IGF1dGhvcml6ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSByZW1vdmVIcmVmQXR0cmlidXRlKGF0dHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgVXNlY2FzZU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBVc2VjYXNlTWVzc2FnZSgiQWNjZXNzIGRlbmllZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHVzZWNhc2VSZXNvbHZlci5pc1JlZ2lzdGVyZWQodGhpcy5zb3VyY2VVcmwsIHVzZWNhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBVc2VjYXNlIHVzZWNhc2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXNlY2FzZSA9IHVzZWNhc2VSZXNvbHZlci5yZXNvbHZlKHRoaXMuc291cmNlVXJsLCB1c2VjYXNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLnNldFNvdXJjZVVSTCh0aGlzLnNvdXJjZVVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLnNldE5hbWUodXNlY2FzZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuZ2V0VmFsdWUoSFJFRl9BVFRSSUJVVEUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzUmVxdWVzdFBhcmFtZXRlcnModXNlY2FzZSwgYXR0ci5nZXRWYWx1ZShIUkVGX0FUVFJJQlVURSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlY2FzZS5jaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VjYXNlLmhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVzZWNhc2UgcHJlY29uZGl0aW9ucyBub3QgY29tcGxpZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gcmVtb3ZlSHJlZkF0dHJpYnV0ZShhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IHVzZWNhc2UuZ2V0RXJyb3JNZXNzYWdlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZWNhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWNhc2VSZXNvbHZlci5yZWxlYXNlKHVzZWNhc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh1c2VjYXNlUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHVzZWNhc2VSZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHJhdywgYXR0cmlidXRlcyk7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgPGNvZGU+aHJlZjwvY29kZT4gYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhdHRyIFRoZSBvcmlnaW5hbCBhdHRyaWJ1dGVzLgotICAgICAqIEByZXR1cm4gQW4gYXR0cmlidXRlcyBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEF0dHJpYnV0ZXMgcmVtb3ZlSHJlZkF0dHJpYnV0ZShBdHRyaWJ1dGVzIGF0dHIpIHsKLSAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gYXR0cjsKLSAgICAgICAgaW50IGhyZWZJbmRleCA9IGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSFJFRl9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoaHJlZkluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlc0ltcGwoYXR0cik7Ci0gICAgICAgICAgICAoKEF0dHJpYnV0ZXNJbXBsKSBhdHRyaWJ1dGVzKS5yZW1vdmVBdHRyaWJ1dGUoaHJlZkluZGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRNZXNzYWdlcyhMaXN0IG1lc3NhZ2VzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtZXNzYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFVzZWNhc2VNZXNzYWdlIG1lc3NhZ2UgPSAoVXNlY2FzZU1lc3NhZ2UpIGkubmV4dCgpOwotICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KE1FTlVfTkFNRVNQQUNFLCAibWVzc2FnZSIsICJtZXNzYWdlIiwgbmV3IEF0dHJpYnV0ZXNJbXBsKCkpOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VTdHJpbmcgPSBtZXNzYWdlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHN1cGVyLmNoYXJhY3RlcnMobWVzc2FnZVN0cmluZy50b0NoYXJBcnJheSgpLCAwLCBtZXNzYWdlU3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlLmhhc1BhcmFtZXRlcnMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBtZXNzYWdlLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IHBhcmFtZXRlcnMubGVuZ3RoOyBwKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KE1FTlVfTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGVzSW1wbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2hhcmFjdGVycyhwYXJhbWV0ZXJzW3BdLnRvQ2hhckFycmF5KCksIDAsIHBhcmFtZXRlcnNbcF0ubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICBzdXBlci5lbmRFbGVtZW50KE1FTlVfTkFNRVNQQUNFLCAicGFyYW1ldGVyIiwgInBhcmFtZXRlciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQoTUVOVV9OQU1FU1BBQ0UsICJtZXNzYWdlIiwgIm1lc3NhZ2UiKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFzcyB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGZyb20gdGhlIDxjb2RlPmhyZWY8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGUgdXNlY2FzZSBoYW5kbGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VjYXNlIFRoZSB1c2VjYXNlIGhhbmRsZXIuCi0gICAgICogQHBhcmFtIGhyZWYgVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5ocmVmPC9jb2RlPiBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgdm9pZCBwYXNzUmVxdWVzdFBhcmFtZXRlcnMoVXNlY2FzZSB1c2VjYXNlLCBTdHJpbmcgaHJlZikgewotICAgICAgICBpbnQgcXVlc3Rpb25NYXJrSW5kZXggPSBocmVmLmluZGV4T2YoIj8iKTsKLSAgICAgICAgaWYgKHF1ZXN0aW9uTWFya0luZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IGhyZWYuc3Vic3RyaW5nKHF1ZXN0aW9uTWFya0luZGV4ICsgMSk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuYW1lVmFsdWVQYWlycyA9IHF1ZXJ5U3RyaW5nLnNwbGl0KCImIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVWYWx1ZVBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFpciA9IG5hbWVWYWx1ZVBhaXJzW2ldLnNwbGl0KCI9Iik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhaXIubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYWlyWzBdOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYWlyWzFdOwotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVc2VjYXNlQXV0aG9yaXplciBhdXRob3JpemVyOwotICAgIHByaXZhdGUgU2VydmljZVNlbGVjdG9yIHNlcnZpY2VTZWxlY3RvciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBSb2xlW10gcm9sZXM7Ci0gICAgcHJpdmF0ZSBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbjsKLSAgICBwcml2YXRlIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciBhY1Jlc29sdmVyOwotICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZVVybDsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uc2l0ZW1hcC5TaXRlbWFwTW9kZWxDb21wb25lbnQjc2V0dXAob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXIsCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldHVwKFNvdXJjZVJlc29sdmVyIF9yZXNvbHZlciwgTWFwIF9vYmplY3RNb2RlbCwgU3RyaW5nIHNyYywgUGFyYW1ldGVycyBfcGFyYW1ldGVycykKLSAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBzdXBlci5zZXR1cChfcmVzb2x2ZXIsIF9vYmplY3RNb2RlbCwgc3JjLCBfcGFyYW1ldGVycyk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlNldHRpbmcgdXAgdHJhbnNmb3JtZXIiKTsKLQotICAgICAgICB0aGlzLnNlcnZpY2VTZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIHRoaXMuYWNSZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRoaXMuYXV0aG9yaXplciA9IG51bGw7Ci0KLSAgICAgICAgdGhpcy5zb3VyY2VVcmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSSh0aGlzLnJlcXVlc3QpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnJvbGVzID0gUG9saWN5VXRpbC5nZXRSb2xlcyh0aGlzLnJlcXVlc3QpOwotICAgICAgICAgICAgdGhpcy5wdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbih0aGlzLm1hbmFnZXIsIF9vYmplY3RNb2RlbCk7Ci0KLSAgICAgICAgICAgIHRoaXMuc2VydmljZVNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuUk9MRQotICAgICAgICAgICAgICAgICAgICArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgdGhpcy5hY1Jlc29sdmVyID0gKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcikgdGhpcy5zZXJ2aWNlU2VsZWN0b3Iuc2VsZWN0KEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5ERUZBVUxUX1JFU09MVkVSKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZXNvbHZlZCBBQyByZXNvbHZlciBbIiArIHRoaXMuYWNSZXNvbHZlciArICJdIik7Ci0KLSAgICAgICAgICAgIFN0cmluZyB3ZWJhcHBVcmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSSh0aGlzLnJlcXVlc3QpOwotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlciBhY2Nlc3NDb250cm9sbGVyID0gdGhpcy5hY1Jlc29sdmVyLnJlc29sdmVBY2Nlc3NDb250cm9sbGVyKHdlYmFwcFVybCk7Ci0KLSAgICAgICAgICAgIEF1dGhvcml6ZXJbXSBhdXRob3JpemVycyA9IGFjY2Vzc0NvbnRyb2xsZXIuZ2V0QXV0aG9yaXplcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXV0aG9yaXplcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXV0aG9yaXplcnNbaV0gaW5zdGFuY2VvZiBVc2VjYXNlQXV0aG9yaXplcikgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhvcml6ZXIgPSAoVXNlY2FzZUF1dGhvcml6ZXIpIGF1dGhvcml6ZXJzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVzaW5nIGF1dGhvcml6ZXIgWyIgKyB0aGlzLmF1dGhvcml6ZXIgKyAiXSIpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGUjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRpc3Bvc2luZyB0cmFuc2Zvcm1lciIpOwotICAgICAgICBpZiAodGhpcy5zZXJ2aWNlU2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRoaXMuYWNSZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlU2VsZWN0b3IucmVsZWFzZSh0aGlzLmFjUmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UodGhpcy5zZXJ2aWNlU2VsZWN0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9BYnN0cmFjdFVzZWNhc2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL0Fic3RyYWN0VXNlY2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmFlOGJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL0Fic3RyYWN0VXNlY2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5Jbml0aWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5zZXJ2bGV0Lm11bHRpcGFydC5QYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5Mb2NrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25Mb2NrOwotCi0vKioKLSAqIEFic3RyYWN0IHVzZWNhc2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0VXNlY2FzZSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFVzZWNhc2UsIENvbmZpZ3VyYWJsZSwKLSAgICAgICAgQ29udGV4dHVhbGl6YWJsZSwgU2VydmljZWFibGUsIEluaXRpYWxpemFibGUgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfQ0hFQ0tfUE9TVENPTkRJVElPTlMgPSAiY2hlY2tQb3N0Y29uZGl0aW9ucyI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9FWEVDVVRFID0gImV4ZWN1dGUiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfQ0hFQ0tfUFJFQ09ORElUSU9OUyA9ICJjaGVja1ByZWNvbmRpdGlvbnMiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfQ0hFQ0tfRVhFQ1VUSU9OX0NPTkRJVElPTlMgPSAiY2hlY2tFeGVjdXRpb25Db25kaXRpb25zIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX09CSkVDVFNfQ0hFQ0tFRF9PVVQgPSAib2JqZWN0cy1jaGVja2VkLW91dCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0YXRlTWFjaGluZS5UcmFuc2l0aW9uW10gVFJBTlNJVElPTlMgPSB7Ci0gICAgICAgICAgICBuZXcgU3RhdGVNYWNoaW5lLlRyYW5zaXRpb24oInN0YXJ0IiwgInByZUNoZWNrZWQiLCBFVkVOVF9DSEVDS19QUkVDT05ESVRJT05TKSwKLSAgICAgICAgICAgIG5ldyBTdGF0ZU1hY2hpbmUuVHJhbnNpdGlvbigicHJlQ2hlY2tlZCIsICJwcmVDaGVja2VkIiwgRVZFTlRfQ0hFQ0tfUFJFQ09ORElUSU9OUyksCi0gICAgICAgICAgICBuZXcgU3RhdGVNYWNoaW5lLlRyYW5zaXRpb24oInByZUNoZWNrZWQiLCAibm9kZXNMb2NrZWQiLCAibG9ja0ludm9sdmVkT2JqZWN0cyIpLAotICAgICAgICAgICAgbmV3IFN0YXRlTWFjaGluZS5UcmFuc2l0aW9uKCJub2Rlc0xvY2tlZCIsICJleGVjQ2hlY2tlZCIsCi0gICAgICAgICAgICAgICAgICAgIEVWRU5UX0NIRUNLX0VYRUNVVElPTl9DT05ESVRJT05TKSwKLSAgICAgICAgICAgIG5ldyBTdGF0ZU1hY2hpbmUuVHJhbnNpdGlvbigiZXhlY0NoZWNrZWQiLCAiZXhlY0NoZWNrZWQiLAotICAgICAgICAgICAgICAgICAgICBFVkVOVF9DSEVDS19FWEVDVVRJT05fQ09ORElUSU9OUyksCi0gICAgICAgICAgICBuZXcgU3RhdGVNYWNoaW5lLlRyYW5zaXRpb24oIm5vZGVzTG9ja2VkIiwgInByZUNoZWNrZWQiLCBFVkVOVF9DSEVDS19QUkVDT05ESVRJT05TKSwKLSAgICAgICAgICAgIG5ldyBTdGF0ZU1hY2hpbmUuVHJhbnNpdGlvbigiZXhlY0NoZWNrZWQiLCAiZXhlY3V0ZWQiLCBFVkVOVF9FWEVDVVRFKSwKLSAgICAgICAgICAgIG5ldyBTdGF0ZU1hY2hpbmUuVHJhbnNpdGlvbigiZXhlY3V0ZWQiLCAicG9zdENoZWNrZWQiLCBFVkVOVF9DSEVDS19QT1NUQ09ORElUSU9OUykgfTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RhdGVNYWNoaW5lLk1vZGVsIE1PREVMID0gbmV3IFN0YXRlTWFjaGluZS5Nb2RlbCgic3RhcnQiLCBUUkFOU0lUSU9OUyk7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfU1RBVEVfTUFDSElORSA9ICJwcml2YXRlLnN0YXRlTWFjaGluZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NFU1NJT04gPSAicHJpdmF0ZS5zZXNzaW9uIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfRkFDVE9SWSA9ICJwcml2YXRlLmZhY3RvcnkiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9DSEVDS09VVF9SRVNUUklDVEVEX1RPX1NFU1NJT04gPSAiY2hlY2tvdXRSZXN0cmljdGVkVG9TZXNzaW9uIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUlNfSU5JVElBTElaRUQgPSAicHJpdmF0ZS5wYXJhbWV0ZXJzSW5pdGlhbGl6ZWQiOwotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkdmFuY2UgdGhlIHVzZWNhc2Ugc3RhdGUgbWFjaGluZSB0byB0aGUgbmV4dCBzdGF0ZS4gVGhpcyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZCBhdCB0aGUgZW5kCi0gICAgICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIHRvIGVuc3VyZSB0aGF0IHRoZSBzdWJzZXF1ZW50IG1ldGhvZHMgY2FuIG9ubHkgYmUgaW52b2tlZCBpZgotICAgICAqIG5vdGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHZlbnQgdG8gaW52b2tlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkdmFuY2VTdGF0ZShTdHJpbmcgZXZlbnQpIHsKLSAgICAgICAgZ2V0U3RhdGVNYWNoaW5lKCkuaW52b2tlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RhdGVNYWNoaW5lIGdldFN0YXRlTWFjaGluZSgpIHsKLSAgICAgICAgU3RhdGVNYWNoaW5lIG1hY2hpbmUgPSAoU3RhdGVNYWNoaW5lKSBnZXRQYXJhbWV0ZXIoUEFSQU1FVEVSX1NUQVRFX01BQ0hJTkUpOwotICAgICAgICByZXR1cm4gbWFjaGluZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0V2ZW50KFN0cmluZyBldmVudCkgewotICAgICAgICBnZXRTdGF0ZU1hY2hpbmUoKS5jaGVja0V2ZW50KGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIFNPVVJDRV9VUkwgPSAicHJpdmF0ZS5zb3VyY2VVcmwiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjZ2V0U291cmNlVVJMKCkgV2UgZG9uJ3QgdXNlIGdldFBhcmFtZXRlckFzU3RyaW5nKCkKLSAgICAgKiAgICAgIGJlY2F1c2UgdGhpcyB3aWxsIHR5cGljYWxseSBjYXVzZSBzdGFjayBvdmVyZmxvd3Mgb3IgTlBFcyBpbiBjb25uZWN0aW9uIHdpdGgKLSAgICAgKiAgICAgIGluaXRQYXJhbWV0ZXJzKCkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VVUkwoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSB0aGlzLnBhcmFtZXRlcnMuZ2V0KFNPVVJDRV9VUkwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRleHQuCi0gICAgICogQHJldHVybiBBIGNvbnRleHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHVzZWNhc2UgaGFzIGVycm9yIG1lc3NhZ2VzLiBQcm92aWRlcyBhIHdheSBvZiBjaGVja2luZyBmb3IgZXJyb3JzIHdpdGhvdXQKLSAgICAgKiBhY3R1YWxseSByZXRyaWV2aW5nIHRoZW0uCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB1c2VjYXNlIHJlc3VsdGVkIGluIGVycm9yIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlcyAhPSBudWxsKQotICAgICAgICAgICAgcmV0ID0gIXRoaXMuZXJyb3JNZXNzYWdlcy5pc0VtcHR5KCk7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQWJzdHJhY3RVc2VjYXNlOjpoYXNFcnJvcnMoKSBjYWxsZWQsIHJldHVybmluZyAiICsgcmV0KTsKLQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgdXNlY2FzZSBoYXMgaW5mbyBtZXNzYWdlcy4gUHJvdmlkZXMgYSB3YXkgb2YgY2hlY2tpbmcgZm9yIGluZm8gbWVzc2FnZXMKLSAgICAgKiB3aXRob3V0IGFjdHVhbGx5IHJldHJpZXZpbmcgdGhlbS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHVzZWNhc2UgcmVzdWx0ZWQgaW4gaW5mbyBtZXNzYWdlcyBiZWluZyBnZW5lcmF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzSW5mb01lc3NhZ2VzKCkgewotICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwotICAgICAgICBpZiAodGhpcy5pbmZvTWVzc2FnZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldCA9ICF0aGlzLmluZm9NZXNzYWdlcy5pc0VtcHR5KCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBvcGVyYXRpb24gY2FuIGJlIGV4ZWN1dGVkIGFuZCByZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlcy4gRXJyb3IgbWVzc2FnZXMKLSAgICAgKiBwcmV2ZW50IHRoZSBvcGVyYXRpb24gZnJvbSBiZWluZyBleGVjdXRlZC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRFcnJvck1lc3NhZ2VzKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0KHRoaXMuZXJyb3JNZXNzYWdlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZm9ybWF0aW9uIG1lc3NhZ2VzIHRvIHNob3cgb24gdGhlIGNvbmZpcm1hdGlvbiBzY3JlZW4uCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBzdHJpbmdzLiBJbmZvIG1lc3NhZ2VzIGRvIG5vdCBwcmV2ZW50IHRoZSBvcGVyYXRpb24gZnJvbSBiZWluZyBleGVjdXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRJbmZvTWVzc2FnZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3QodGhpcy5pbmZvTWVzc2FnZXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgZXJyb3JNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIExpc3QgaW5mb01lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlcnJvciBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmVycm9yTWVzc2FnZXMuYWRkKG5ldyBVc2VjYXNlTWVzc2FnZShtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlcnJvciBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBfcGFyYW1zIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIF9wYXJhbXMpIHsKLSAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzLmFkZChuZXcgVXNlY2FzZU1lc3NhZ2UobWVzc2FnZSwgX3BhcmFtcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yTWVzc2FnZXMoU3RyaW5nW10gbWVzc2FnZXMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKG1lc3NhZ2VzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gaW5mbyBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBfcGFyYW1zIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJbmZvTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gX3BhcmFtcykgewotICAgICAgICB0aGlzLmluZm9NZXNzYWdlcy5hZGQobmV3IFVzZWNhc2VNZXNzYWdlKG1lc3NhZ2UsIF9wYXJhbXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGluZm8gbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJbmZvTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmluZm9NZXNzYWdlcy5hZGQobmV3IFVzZWNhc2VNZXNzYWdlKG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNjaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tFdmVudChFVkVOVF9DSEVDS19FWEVDVVRJT05fQ09ORElUSU9OUyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGVhckVycm9yTWVzc2FnZXMoKTsKLSAgICAgICAgICAgIGNsZWFySW5mb01lc3NhZ2VzKCk7Ci0gICAgICAgICAgICBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotICAgICAgICAgICAgZHVtcEVycm9yTWVzc2FnZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZShlLmdldE1lc3NhZ2UoKSArICIgLSBQbGVhc2UgY29uc3VsdCB0aGUgbG9nZmlsZXMuIik7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VjYXNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIGFkdmFuY2VTdGF0ZShFVkVOVF9DSEVDS19FWEVDVVRJT05fQ09ORElUSU9OUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIGV4ZWN1dGlvbiBjb25kaXRpb25zLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjY2hlY2tQcmVjb25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrRXZlbnQoRVZFTlRfQ0hFQ0tfUFJFQ09ORElUSU9OUyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGVhckVycm9yTWVzc2FnZXMoKTsKLSAgICAgICAgICAgIGNsZWFySW5mb01lc3NhZ2VzKCk7Ci0KLSAgICAgICAgICAgIE5vZGVbXSBub2RlcyA9IGdldE5vZGVzVG9Mb2NrKCk7Ci0gICAgICAgICAgICBpZiAoIWNhbkNoZWNrT3V0KG5vZGVzKSkgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZShFUlJPUl9PQkpFQ1RTX0NIRUNLRURfT1VUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0KLSAgICAgICAgICAgIExpc3QgX2Vycm9yTWVzc2FnZXMgPSBnZXRFcnJvck1lc3NhZ2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9lcnJvck1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbyhfZXJyb3JNZXNzYWdlcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkgKyAiIC0gUGxlYXNlIGNvbnN1bHQgdGhlIGxvZ2ZpbGVzLiIpOwotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICBhZHZhbmNlU3RhdGUoRVZFTlRfQ0hFQ0tfUFJFQ09ORElUSU9OUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHByZWNvbmRpdGlvbnMuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGVycm9yIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyRXJyb3JNZXNzYWdlcygpIHsKLSAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBpbmZvIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFySW5mb01lc3NhZ2VzKCkgewotICAgICAgICB0aGlzLmluZm9NZXNzYWdlcy5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI2V4ZWN1dGUoKQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrRXZlbnQoRVZFTlRfRVhFQ1VURSk7Ci0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xlYXJFcnJvck1lc3NhZ2VzKCk7Ci0gICAgICAgICAgICBjbGVhckluZm9NZXNzYWdlcygpOwotICAgICAgICAgICAgZG9FeGVjdXRlKCk7Ci0gICAgICAgICAgICBkdW1wRXJyb3JNZXNzYWdlcygpOwotICAgICAgICB9IGNhdGNoIChMb2NrRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIGNvbXBsZXRlZCBiZWNhdXNlIGFuIGludm9sdmVkIG9iamVjdCB3YXMgY2hhbmdlZCBieSBhbm90aGVyIHVzZXIuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBlOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpICsgIiAtIFBsZWFzZSBjb25zdWx0IHRoZSBsb2dmaWxlcy4iKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBVc2VjYXNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21taXRFbmFibGVkICYmIGdldEVycm9yTWVzc2FnZXMoKS5pc0VtcHR5KCkgJiYgZXhjZXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLmNvbW1pdCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldFNlc3Npb24oKS5yb2xsYmFjaygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXJyb3IoIkNvdWxkIG5vdCBjb21taXQgdXNlY2FzZSBbIiArIGdldE5hbWUoKSArICJdOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiQ291bGQgbm90IGNvbW1pdC9yb2xsYmFjayB1c2VjYXNlIFsiICsgZ2V0TmFtZSgpICsgIl06ICIsIGUxKTsKLSAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIkV4Y2VwdGlvbiBkdXJpbmcgY29tbWl0IG9yIHJvbGxiYWNrOiAiICsgZTEuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgKHNlZSBsb2dmaWxlcyBmb3IgZGV0YWlscykiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICBhZHZhbmNlU3RhdGUoRVZFTlRfRVhFQ1VURSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEdW1wcyB0aGUgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIGxvZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wRXJyb3JNZXNzYWdlcygpIHsKLSAgICAgICAgTGlzdCBfZXJyb3JNZXNzYWdlcyA9IGdldEVycm9yTWVzc2FnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZXJyb3JNZXNzYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoX2Vycm9yTWVzc2FnZXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjY2hlY2tQb3N0Y29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hlY2tQb3N0Y29uZGl0aW9ucygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tFdmVudChFVkVOVF9DSEVDS19QT1NUQ09ORElUSU9OUyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGVhckVycm9yTWVzc2FnZXMoKTsKLSAgICAgICAgICAgIGNsZWFySW5mb01lc3NhZ2VzKCk7Ci0gICAgICAgICAgICBkb0NoZWNrUG9zdGNvbmRpdGlvbnMoKTsKLSAgICAgICAgICAgIGR1bXBFcnJvck1lc3NhZ2VzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkgKyAiIC0gUGxlYXNlIGNvbnN1bHQgdGhlIGxvZ2ZpbGVzLiIpOwotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICBhZHZhbmNlU3RhdGUoRVZFTlRfQ0hFQ0tfUE9TVENPTkRJVElPTlMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBwb3N0IGNvbmRpdGlvbnMuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUG9zdGNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBvcGVyYXRpb24uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2Ujc2V0UGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJTZXR0aW5nIHBhcmFtZXRlciBbIiArIG5hbWUgKyAiXSA9IFsiICsgdmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICAvLyBzZXQgYW55IGV4aXQgcGFyYW1ldGVycyB0aGF0IGFyZSBtaXNzaW5nIHZhbHVlcwotICAgICAgICBpZiAodGhpcy5leGl0VXNlY2FzZVBhcmFtZXRlcnMuY29udGFpbnNLZXkobmFtZSkKLSAgICAgICAgICAgICAgICAmJiB0aGlzLmV4aXRVc2VjYXNlUGFyYW1ldGVycy5nZXQobmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RXhpdFBhcmFtZXRlcihuYW1lLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI2dldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmICghdGhpcy5wYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KG5hbWUpKSB7Ci0gICAgICAgICAgICBpbml0aWFsaXplUGFyYW1ldGVyc0lmTm90RG9uZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlcnMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI2dldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNnZXRQYXJhbWV0ZXJBc1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyQXNTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWVTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZVN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcGFyYW1ldGVyIGFzIHN0cmluZy4gSWYgdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdCwgYSBkZWZhdWx0IHZhbHVlIGlzIHJldHVybmVkLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJBc1N0cmluZyhTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmcgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVTdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHBhcmFtZXRlciBhcyBpbnRlZ2VyLiBJZiB0aGUgcGFyYW1ldGVyIGRvZXMgbm90IGV4aXN0LCBhIGRlZmF1bHQgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBBbiBpbnRlZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyQXNJbnRlZ2VyKFN0cmluZyBuYW1lLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIGludCB2YWx1ZUludCA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWVJbnQgPSBJbnRlZ2VyLnZhbHVlT2YodmFsdWUudG9TdHJpbmcoKSkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVJbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHBhcmFtZXRlciBhcyBib29sZWFuLiBJZiB0aGUgcGFyYW1ldGVyIGRvZXMgbm90IGV4aXN0LCBhIGRlZmF1bHQgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFBhcmFtZXRlckFzQm9vbGVhbihTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgYm9vbGVhbiB2YWx1ZUJvb2xlYW4gPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIHZhbHVlQm9vbGVhbiA9IEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgICAgIHZhbHVlQm9vbGVhbiA9ICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgZ2V0IGJvb2xlYW4gdmFsdWUgb2YgcGFyYW1ldGVyIFsiICsgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAoY2xhc3MgIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVCb29sZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIG1hcCBvZiBhbGwgcGFyYW1ldGVycwotICAgICAqIEByZXR1cm4gdGhlIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgaW5pdGlhbGl6ZVBhcmFtZXRlcnNJZk5vdERvbmUoKTsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0aGlzLnBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgb25lIG9mIHRoZSBzdHJpbmdzICJ0cnVlIiBvciAiZmFsc2UiIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoZWNrYm94Ci0gICAgICogd2FzIGNoZWNrZWQuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCb29sZWFuQ2hlY2tib3hQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gImZhbHNlIjsKLSAgICAgICAgaWYgKGdldFBhcmFtZXRlcihuYW1lKSAhPSBudWxsICYmIGdldFBhcmFtZXRlcihuYW1lKS5lcXVhbHMoIm9uIikpIHsKLSAgICAgICAgICAgIHZhbHVlID0gInRydWUiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBFWElUX1VSSSA9ICJsZW55YS5leGl0VXJpIjsKLSAgICBwcml2YXRlIFN0cmluZyBERUZBVUxUX1RBUkdFVF9VUkwgPSAicHJpdmF0ZS5kZWZhdWx0VGFyZ2V0VXJsIjsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdGFyZ2V0IFVSTCB3aGljaCBzaG91bGQgYmUgdXNlZCBpZiBubyBleHBsaWNpdCB0YXJnZXQgVVJMIGlzIHNldC4KLSAgICAgKiBAcGFyYW0gdXJsIEEgVVJMIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFyZ2V0VVJMKFN0cmluZyB1cmwpIHsKLSAgICAgICAgc2V0UGFyYW1ldGVyKERFRkFVTFRfVEFSR0VUX1VSTCwgdXJsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB7QGxpbmsgI3NldERlZmF1bHRUYXJnZXRVUkwoU3RyaW5nKX13YXMgbm90IGNhbGxlZCwgdGhlIHNvdXJjZSBkb2N1bWVudCAoCi0gICAgICoge0BsaW5rICNnZXRTb3VyY2VVUkwoKX0pIGlzIHJldHVybmVkLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI2dldFRhcmdldFVSTChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VVJMKGJvb2xlYW4gc3VjY2VzcykgewotICAgICAgICBTdHJpbmcgdXJsID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoRVhJVF9VUkkpOwotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHVybCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKERFRkFVTFRfVEFSR0VUX1VSTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1cmwgPSBnZXRTb3VyY2VVUkwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJsICsgZ2V0RXhpdFF1ZXJ5U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2Ujc2V0UGFydChqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5jb2Nvb24uc2VydmxldC5tdWx0aXBhcnQuUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0KFN0cmluZyBuYW1lLCBQYXJ0IHZhbHVlKSB7Ci0gICAgICAgIGlmICghUGFydC5jbGFzcy5pc0luc3RhbmNlKHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICIiOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJbIiArIG5hbWUgKyAiXSA9ICgiICsgY2xhc3NOYW1lICsgIikgIFsiICsgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBpcyBub3QgYSBwYXJ0IG9iamVjdC4gTWF5YmUgeW91IGhhdmUgdG8gZW5hYmxlIHVwbG9hZHM/Iik7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0UGFyYW1ldGVyKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNnZXRQYXJ0KGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFBhcnQgZ2V0UGFydChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKFBhcnQpIGdldFBhcmFtZXRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnRGYWN0b3J5IGdldERvY3VtZW50RmFjdG9yeSgpIHsKLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSAoRG9jdW1lbnRGYWN0b3J5KSBnZXRQYXJhbWV0ZXIoUEFSQU1FVEVSX0ZBQ1RPUlkpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwgfHwgZmFjdG9yeS5nZXRTZXNzaW9uKCkgIT0gc2Vzc2lvbikgewotICAgICAgICAgICAgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihQQVJBTUVURVJfRkFDVE9SWSwgZmFjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuSW5pdGlhbGl6YWJsZSNpbml0aWFsaXplKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLmNvbnRleHQpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIHNldFBhcmFtZXRlcihQQVJBTUVURVJfU1RBVEVfTUFDSElORSwgbmV3IFN0YXRlTWFjaGluZShNT0RFTCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvZXMgdGhlIGFjdHVhbCBpbml0aWFsaXphdGlvbi4gVGVtcGxhdGUgbWV0aG9kLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRvSW5pdGlhbGl6ZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNhZHZhbmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZHZhbmNlKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhIHBhcmFtZXRlci4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlUGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycy5yZW1vdmUobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjZ2V0TmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI2dldFBhcmFtZXRlck5hbWVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7Ci0gICAgICAgIGluaXRpYWxpemVQYXJhbWV0ZXJzSWZOb3REb25lKCk7Ci0gICAgICAgIFNldCBrZXlzID0gdGhpcy5wYXJhbWV0ZXJzLmtleVNldCgpOwotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBrZXlzLnRvQXJyYXkobmV3IFN0cmluZ1trZXlzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQYXJhbWV0ZXJzSWZOb3REb25lKCkgewotICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJzLmdldChQQVJBTUVURVJTX0lOSVRJQUxJWkVEKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMucHV0KFBBUkFNRVRFUlNfSU5JVElBTElaRUQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBpbml0UGFyYW1ldGVycygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2Ujc2V0U291cmNlVVJMKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlVVJMKFN0cmluZyB1cmwpIHsKLSAgICAgICAgc2V0UGFyYW1ldGVyKFNPVVJDRV9VUkwsIHVybCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVc2VjYXNlVmlldyB2aWV3OwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjZ2V0VmlldygpCi0gICAgICovCi0gICAgcHVibGljIFVzZWNhc2VWaWV3IGdldFZpZXcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcmVwYXJlVmlldygpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIlZpZXcgcHJlcGFyYXRpb24gZm9yIHVzZWNhc2UgWyIgKyBnZXROYW1lKCkgKyAiXSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy52aWV3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByZXBhcmUgdGhlIHZpZXcgKGFkZCBpbmZvcm1hdGlvbiBtZXNzYWdlcyBldGMuKS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBUkFNRVRFUiA9ICJwYXJhbWV0ZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gIm5hbWUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9ICJ2YWx1ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9WSUVXID0gInZpZXciOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVFJBTlNBQ1RJT04gPSAidHJhbnNhY3Rpb24iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9QT0xJQ1kgPSAicG9saWN5IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PUFRJTUlTVElDID0gIm9wdGltaXN0aWMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BFU1NJTUlTVElDID0gInBlc3NpbWlzdGljIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0VYSVQgPSAiZXhpdCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1VTRUNBU0UgPSAidXNlY2FzZSI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPcHRpbWlzdGljID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRyYW5zYWN0aW9uIHBvbGljeSBpcyBvcHRpbWlzdGljIG9mZmxpbmUgbG9jaywKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBwZXNzaW1pc3RpYyBvZmZsaW5lIGxvY2suCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPcHRpbWlzdGljKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pc09wdGltaXN0aWM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGUjY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbltdIHBhcmFtZXRlckNvbmZpZ3MgPSBjb25maWcuZ2V0Q2hpbGRyZW4oRUxFTUVOVF9QQVJBTUVURVIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyYW1ldGVyQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVyQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb25maWd1cmF0aW9uIHZpZXdDb25maWcgPSBjb25maWcuZ2V0Q2hpbGQoRUxFTUVOVF9WSUVXLCBmYWxzZSk7Ci0gICAgICAgIGlmICh2aWV3Q29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBVc2VjYXNlVmlldygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB2aWV3LnNlcnZpY2UodGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJDb3VsZG4ndCBzZXJ2aWNlIHZpZXc6ICIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5jb25maWd1cmUodmlld0NvbmZpZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb25maWd1cmF0aW9uIHRyYW5zYWN0aW9uQ29uZmlnID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfVFJBTlNBQ1RJT04sIGZhbHNlKTsKLSAgICAgICAgaWYgKHRyYW5zYWN0aW9uQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwb2xpY3kgPSB0cmFuc2FjdGlvbkNvbmZpZy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1BPTElDWSk7Ci0gICAgICAgICAgICBpZiAocG9saWN5LmVxdWFscyhWQUxVRV9QRVNTSU1JU1RJQykpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3B0aW1pc3RpYyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbiBleGl0Q29uZmlnID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfRVhJVCwgZmFsc2UpOwotICAgICAgICBpZiAoZXhpdENvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmV4aXRVc2VjYXNlTmFtZSA9IGV4aXRDb25maWcuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VU0VDQVNFKTsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25bXSBleGl0UGFyYW1ldGVyQ29uZmlncyA9IGV4aXRDb25maWcuZ2V0Q2hpbGRyZW4oRUxFTUVOVF9QQVJBTUVURVIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGl0UGFyYW1ldGVyQ29uZmlncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZXhpdFBhcmFtZXRlckNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZU5hbWVzID0gZXhpdFBhcmFtZXRlckNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlTmFtZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lc1tqXS5lcXVhbHMoQVRUUklCVVRFX1ZBTFVFKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZXhpdFBhcmFtZXRlckNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldEV4aXRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2Ujc2V0VmlldyhvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VWaWV3KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpZXcoVXNlY2FzZVZpZXcgdmlldykgewotICAgICAgICB0aGlzLnZpZXcgPSB2aWV3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG9iamVjdHMgdGhhdCBjb3VsZCBiZSBjaGFuZ2VkIGR1cmluZyB0aGUgdXNlY2FzZS4KLSAgICAgKiBAdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBOb2RlW10gZ2V0Tm9kZXNUb0xvY2soKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZVswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzdGFydHMgdGhlIHRyYW5zYWN0aW9uIGFuZCBsb2NrcyBhbGwgaW52b2x2ZWQgb2JqZWN0cyBpbW1lZGlhdGVseS4KLSAgICAgKiBUaGlzIHdheSwgYWxsIGNoYW5nZXMgdG8gdGhlIG9iamVjdHMgaW4gdGhlIHNlc3Npb24gb2NjdXIgYWZ0ZXIgdGhlIGxvY2tpbmcsCi0gICAgICogYXZvaWRpbmcgb3ZlcnJpZGluZyBjaGFuZ2VzIG9mIG90aGVyIHNlc3Npb25zLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBsb2NrZWQgdmlhIHRoZSBjbGFzcyBsb2NrIHRvIGF2b2lkIGludGVyLXVzZWNhc2Ugc3luY2hyb25pemF0aW9uIGlzc3Vlcy4KLSAgICAgKiA8L3A+Ci0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UjbG9ja0ludm9sdmVkT2JqZWN0cygpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgbG9ja0ludm9sdmVkT2JqZWN0cygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXJ0VHJhbnNhY3Rpb24oKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKFRyYW5zYWN0aW9uTG9jay5MT0NLKSB7Ci0gICAgICAgICAgICBsb2NrSW52b2x2ZWRPYmplY3RzKGdldE5vZGVzVG9Mb2NrKCkpOwotICAgICAgICB9Ci0gICAgICAgIGFkdmFuY2VTdGF0ZSgibG9ja0ludm9sdmVkT2JqZWN0cyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24gYnkgdXNpbmcgYSBuZXcsIG1vZGlmaWFibGUgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0VHJhbnNhY3Rpb24oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmNvbW1pdEVuYWJsZWQpIHsKLSAgICAgICAgICAgIHNldFNlc3Npb24oUmVwb3NpdG9yeVV0aWwuY3JlYXRlU2Vzc2lvbih0aGlzLm1hbmFnZXIsIGdldFNlc3Npb24oKS5nZXRJZGVudGl0eSgpLCB0cnVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBMb2NrIHRoZSBvYmplY3RzLCBmb3IgZXhhbXBsZSB3aGVuIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGVtIChmb3IgZXhhbXBsZSwgZGVsZXRlKS4gSWYgeW91IGtub3cKLSAgICAgKiB3aGVuIGVudGVyaW5nIHRoZSB1c2VjYXNlIHdoYXQgdGhlc2Ugb2JqZWN0cyBhcmUsIHlvdSBkbyBub3QgbmVlZCB0byBjYWxsIHRoaXMsIHRoZSBmcmFtZXdvcmsKLSAgICAgKiB3aWxsIHRha2Ugb2YgaXQgaWYgeW91IGltcGxlbWVudCBnZXRPYmplY3RzVG9Mb2NrKCkuIElmIHlvdSBkbyBub3Qga25vdyBpbiBhZHZhbmNlIHdoYXQgdGhlCi0gICAgICogb2JqZWN0cyBhcmUsIHlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBleHBsaWNpdGx5IHdoZW4gYXBwcm9wcmlhdGUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RzIHRoZSB0cmFuc2FjdGlvbmFibGUgb2JqZWN0cyB0byBsb2NrCi0gICAgICogQHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAc2VlICNsb2NrSW52b2x2ZWRPYmplY3RzKCkKLSAgICAgKiBAc2VlICNnZXROb2Rlc1RvTG9jaygpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgbG9ja0ludm9sdmVkT2JqZWN0cyhOb2RlW10gb2JqZWN0cykgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvYmplY3RzW2ldLmlzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0c1tpXS5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghaXNPcHRpbWlzdGljKCkgJiYgIW9iamVjdHNbaV0uaXNDaGVja2VkT3V0QnlTZXNzaW9uKGdldFNlc3Npb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0c1tpXS5jaGVja291dChjaGVja291dFJlc3RyaWN0ZWRUb1Nlc3Npb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVc2VjYXNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuQ2hlY2tPdXQoTm9kZVtdIG9iamVjdHMpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBjYW5FeGVjdXRlID0gdHJ1ZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChvYmplY3RzW2ldLmlzQ2hlY2tlZE91dCgpICYmICFvYmplY3RzW2ldLmlzQ2hlY2tlZE91dEJ5U2Vzc2lvbihnZXRTZXNzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFic3RyYWN0VXNlY2FzZTo6bG9ja0ludm9sdmVkT2JqZWN0cygpIGNhbiBub3QgZXhlY3V0ZSwgb2JqZWN0IFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iamVjdHNbaV0gKyAiXSBpcyBhbHJlYWR5IGNoZWNrZWQgb3V0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuRXhlY3V0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNjYW5jZWwoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldFNlc3Npb24oKS5pc01vZGlmaWFibGUoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRTZXNzaW9uKCkucm9sbGJhY2soKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZWNhc2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBleGl0VXNlY2FzZU5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgTWFwIGV4aXRVc2VjYXNlUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgcGFyYW1ldGVyIHRvIHBhc3MgdG8gdGhlIGV4aXQgdXNlY2FzZS4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSBwYXJhbWV0ZXIgdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RXhpdFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZXhpdFVzZWNhc2VQYXJhbWV0ZXJzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcXVlcnkgc3RyaW5nIHRvIGFjY2VzcyB0aGUgZXhpdCB1c2VjYXNlIG9mIHRoaXMgdXNlY2FzZS4KLSAgICAgKiBAcmV0dXJuIEEgcXVlcnkgc3RyaW5nIG9mIHRoZSBmb3JtCi0gICAgICogICAgICAgICA8Y29kZT4/bGVueWEudXNlY2FzZT0uLi4mYW1wO3BhcmFtMT1mb28mYW1wO3BhcmFtMj1iYXI8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXhpdFF1ZXJ5U3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgcXVlcnlCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmICh0aGlzLmV4aXRVc2VjYXNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoIj9sZW55YS51c2VjYXNlPSIpLmFwcGVuZCh0aGlzLmV4aXRVc2VjYXNlTmFtZSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLmV4aXRVc2VjYXNlUGFyYW1ldGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgdGhpcy5leGl0VXNlY2FzZVBhcmFtZXRlcnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgcXVlcnlCdWZmZXIuYXBwZW5kKCImIikuYXBwZW5kKGtleSkuYXBwZW5kKCI9IikuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBleGl0VXNlY2FzZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKCJsZW55YS5leGl0VXNlY2FzZSIpOwotICAgICAgICAgICAgaWYgKGV4aXRVc2VjYXNlICE9IG51bGwgJiYgISIiLmVxdWFscyhleGl0VXNlY2FzZSkpIHsKLSAgICAgICAgICAgICAgICBxdWVyeUJ1ZmZlci5hcHBlbmQoIj9sZW55YS51c2VjYXNlPSIpLmFwcGVuZChleGl0VXNlY2FzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHF1ZXJ5QnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIChTZXNzaW9uKSBnZXRQYXJhbWV0ZXIoUEFSQU1FVEVSX1NFU1NJT04pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGUjY29udGV4dHVhbGl6ZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29udGV4dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTZXNzaW9uKG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFBhcmFtZXRlcihQQVJBTUVURVJfU0VTU0lPTiwgc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbW1pdEVuYWJsZWQgPSB0cnVlOwotCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdFNlc3Npb24oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHRoaXMuY29tbWl0RW5hYmxlZCA9IGZhbHNlOwotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja291dFJlc3RyaWN0ZWRUb1Nlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJBc0Jvb2xlYW4oUEFSQU1FVEVSX0NIRUNLT1VUX1JFU1RSSUNURURfVE9fU0VTU0lPTiwgdHJ1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9Eb2N1bWVudFVzZWNhc2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL0RvY3VtZW50VXNlY2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDM1Zjk0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL0RvY3VtZW50VXNlY2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIEV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHdpdGggZG9jdW1lbnQgaGVscGVyIG1ldGhvZHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFNvbWUgcGFyYW1ldGVycyBhcmUgaW5pdGlhbGl6ZWQgYnkgZGVmYXVsdDoKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5kb2N1bWVudDwvY29kZT4tIHRoZSBkb2N1bWVudDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRVc2VjYXNlIGV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UID0gImRvY3VtZW50IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRE9DVU1FTlQgPSAicHJpdmF0ZS50YXJnZXREb2N1bWVudCI7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudFVzZWNhc2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKGdldFNvdXJjZURvY3VtZW50KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBvbiBkb2N1bWVudHMhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhTT1VSQ0VfVVJMKSkgewotICAgICAgICAgICAgc2V0U291cmNlVVJMKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlI3NldFNvdXJjZVVSTChqYXZhLmxhbmcuU3RyaW5nKQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZVVSTChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IGdldERvY3VtZW50RmFjdG9yeSgpOwotICAgICAgICAgICAgaWYgKGZhY3RvcnkuaXNEb2N1bWVudCh1cmwpKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBmYWN0b3J5LmdldEZyb21VUkwodXJsKTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRE9DVU1FTlQsIGRvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcihTT1VSQ0VfVVJMLCB1cmwpOwotICAgIH0KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldFNvdXJjZURvY3VtZW50KCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpIGdldFBhcmFtZXRlcihET0NVTUVOVCk7Ci0gICAgICAgIGlmIChkb2MgPT0gbnVsbCB8fCBkb2MuZ2V0RmFjdG9yeSgpLmdldFNlc3Npb24oKSAhPSBnZXRTZXNzaW9uKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBnZXREb2N1bWVudEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlVXJsID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoU09VUkNFX1VSTCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkuaXNEb2N1bWVudChzb3VyY2VVcmwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvYyA9IGZhY3RvcnkuZ2V0RnJvbVVSTChzb3VyY2VVcmwpOwotICAgICAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRE9DVU1FTlQsIGRvYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0YXJnZXQgZG9jdW1lbnQgZm9yIHRoZSBjYXNlIHRoYXQgdGhlIHVzZWNhc2UgZXhlY3V0aW9uCi0gICAgICogc3VjY2VlZGVkIChzZWUge0BsaW5rICNnZXRUYXJnZXREb2N1bWVudChib29sZWFuKX0pLgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBBIGRvY3VtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFRhcmdldERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAgICAgIHNldFBhcmFtZXRlcihUQVJHRVRfRE9DVU1FTlQsIGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCB0byBiZSByZWRpcmVjdGVkIHRvIGFmdGVyIHRoZSB1c2VjYXNlIGhhcyBiZWVuCi0gICAgICogY29tcGxldGVkLiBJZiB0aGUgcGFyYW1ldGVyIDxjb2RlPnN1Y2Nlc3M8L2NvZGU+IGlzIGZhbHNlLCB0aGUgc291cmNlCi0gICAgICogZG9jdW1lbnQgaXMgcmV0dXJuZWQgKG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSB0aGlzIGJlaGF2aW91cikuCi0gICAgICogQHBhcmFtIHN1Y2Nlc3MgSWYgdGhlIHVzZWNhc2Ugd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBnZXRUYXJnZXREb2N1bWVudChib29sZWFuIHN1Y2Nlc3MpIHsKLSAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoRG9jdW1lbnQpIGdldFBhcmFtZXRlcihUQVJHRVRfRE9DVU1FTlQsIGdldFNvdXJjZURvY3VtZW50KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB7QGxpbmsgI3NldFRhcmdldERvY3VtZW50KERvY3VtZW50KX13YXMgbm90IGNhbGxlZCwgdGhlIFVSTCBvZiB0aGUKLSAgICAgKiBzb3VyY2UgZG9jdW1lbnQgKCB7QGxpbmsgI2dldFNvdXJjZURvY3VtZW50KCl9KSBpcyByZXR1cm5lZC4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNnZXRUYXJnZXRVUkwoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFVSTChib29sZWFuIHN1Y2Nlc3MpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRUYXJnZXREb2N1bWVudChzdWNjZXNzKTsKLSAgICAgICAgU3RyaW5nIGRvY3VtZW50VXJsID0gZG9jdW1lbnQuZ2V0Q2Fub25pY2FsRG9jdW1lbnRVUkwoKTsKLSAgICAgICAgU3RyaW5nIHVybCA9ICIvIiArIGRvY3VtZW50LmdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKSArICIvIiArIGRvY3VtZW50LmdldEFyZWEoKQotICAgICAgICAgICAgICAgICsgZG9jdW1lbnRVcmw7Ci0gICAgICAgIHJldHVybiB1cmwgKyBnZXRFeGl0UXVlcnlTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldFNvdXJjZVVSTCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VVUkwoKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2MgPT0gbnVsbCB8fCAhZG9jLmhhc0xpbmsoKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNvdXJjZVVSTCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb2MuZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNzZXREZWZhdWx0VGFyZ2V0VVJMKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFRhcmdldFVSTChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudCB0YXJnZXQgPSBnZXREb2N1bWVudEZhY3RvcnkoKS5nZXRGcm9tVVJMKHVybCk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoVEFSR0VUX0RPQ1VNRU5ULCB0YXJnZXQpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgc2V0UGFyYW1ldGVyKERPQ1VNRU5ULCBnZXRTb3VyY2VEb2N1bWVudCgpKTsKLSAgICB9Ci0gICAgICovCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvRHVtbXlVc2VjYXNlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9EdW1teVVzZWNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkZmQyYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9EdW1teVVzZWNhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlOwotCi0vKioKLSAqIFVzZWNhc2UgZm9yIHByZXNlbnRhdGlvbiBwdXJwb3NlcyB1c2luZyBhIHBsYWluIEpYIHRlbXBsYXRlLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIER1bW15VXNlY2FzZSBleHRlbmRzIEFic3RyYWN0VXNlY2FzZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1N0YXRlTWFjaGluZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvU3RhdGVNYWNoaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZGQ3NTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvU3RhdGVNYWNoaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIEEgc2ltcGxlIHN0YXRlIG1hY2hpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZU1hY2hpbmUgewotCi0gICAgU3RyaW5nIGN1cnJlbnRTdGF0ZTsKLSAgICBwcml2YXRlIE1vZGVsIG1vZGVsOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIFN0YXRlTWFjaGluZShNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gbW9kZWwuZ2V0SW5pdGlhbFN0YXRlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBpbnZva2UoU3RyaW5nIGV2ZW50KSB7Ci0gICAgICAgIFRyYW5zaXRpb24gdHJhbnNpdGlvbiA9IGdldFRyYW5zaXRpb24oZXZlbnQpOwotICAgICAgICBjaGVja1RyYW5zaXRpb24oZXZlbnQsIHRyYW5zaXRpb24pOwotICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRyYW5zaXRpb24uZGVzdGluYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRyYW5zaXRpb24gZ2V0VHJhbnNpdGlvbihTdHJpbmcgZXZlbnQpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImV2ZW50IiwgZXZlbnQpOwotICAgICAgICBUcmFuc2l0aW9uW10gdHJhbnNpdGlvbnMgPSB0aGlzLm1vZGVsLmdldFRyYW5zaXRpb25zKCk7Ci0gICAgICAgIFRyYW5zaXRpb24gdHJhbnNpdGlvbiA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNpdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRyYW5zaXRpb24gdCA9IHRyYW5zaXRpb25zW2ldOwotICAgICAgICAgICAgaWYgKGNhbkZpcmUodCwgZXZlbnQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNb3JlIHRoYW4gMSB0cmFuc2l0aW9uIGZvciBldmVudCBbIiArIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBpbiBzdGF0ZSBbIiArIHRoaXMuY3VycmVudFN0YXRlICsgIl0hIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyYW5zaXRpb24gPSB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc2l0aW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkZpcmUoVHJhbnNpdGlvbiB0LCBTdHJpbmcgZXZlbnQpIHsKLSAgICAgICAgcmV0dXJuIHQuZ2V0U291cmNlKCkuZXF1YWxzKHRoaXMuY3VycmVudFN0YXRlKSAmJiB0LmdldEV2ZW50KCkuZXF1YWxzKGV2ZW50KTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBjaGVja0V2ZW50KFN0cmluZyBldmVudCkgewotICAgICAgICBUcmFuc2l0aW9uIHRyYW5zaXRpb24gPSBnZXRUcmFuc2l0aW9uKGV2ZW50KTsKLSAgICAgICAgY2hlY2tUcmFuc2l0aW9uKGV2ZW50LCB0cmFuc2l0aW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1RyYW5zaXRpb24oU3RyaW5nIGV2ZW50LCBUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKLSAgICAgICAgaWYgKHRyYW5zaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gdHJhbnNpdGlvbiBmb3VuZCBmb3IgZXZlbnQgWyIgKyBldmVudAotICAgICAgICAgICAgICAgICAgICArICJdIGluIHN0YXRlIFsiICsgdGhpcy5jdXJyZW50U3RhdGUgKyAiXSEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgc3RhdGUgbWFjaGluZSBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGVsIHsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBpbml0aWFsU3RhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSBpbml0aWFsU3RhdGUgVGhlIGluaXRpYWwgc3RhdGUuCi0gICAgICAgICAqIEBwYXJhbSB0cmFuc2l0aW9ucyBUaGUgdHJhbnNpdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTW9kZWwoU3RyaW5nIGluaXRpYWxTdGF0ZSwgVHJhbnNpdGlvbltdIHRyYW5zaXRpb25zKSB7Ci0gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7Ci0gICAgICAgICAgICB0aGlzLmluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBpbml0aWFsIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJbml0aWFsU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFRyYW5zaXRpb25bXSB0cmFuc2l0aW9uczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgdHJhbnNpdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVHJhbnNpdGlvbltdIGdldFRyYW5zaXRpb25zKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvbnM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHRyYW5zaXRpb24gc3dpdGNoZXMgZnJvbSBhIHNvdXJjZSBzdGF0ZSB0byBhIGRlc3RpbmF0aW9uIHN0YXRlIGlmIGFuCi0gICAgICogZXZlbnQgaXMgaW52b2tlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyYW5zaXRpb24gewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugc3RhdGUuCi0gICAgICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgZGVzdGluYXRpb24gc3RhdGUuCi0gICAgICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVHJhbnNpdGlvbihTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb24sIFN0cmluZyBldmVudCkgewotICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0gICAgICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBzb3VyY2U7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGRlc3RpbmF0aW9uOwotICAgICAgICBwcml2YXRlIFN0cmluZyBldmVudDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgZGVzdGluYXRpb24gc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc3RpbmF0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGV2ZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFdmVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBldmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBzb3VyY2Ugc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1VzZWNhc2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1VzZWNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0NmQ2Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9Vc2VjYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLnNlcnZsZXQubXVsdGlwYXJ0LlBhcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotCi0vKioKLSAqIFVzZWNhc2UgaW50ZXJmYWNlLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVXNlY2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+VXNlY2FzZTwvY29kZT4gcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IFVzZWNhc2UuY2xhc3MuZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0aGUgdXNlY2FzZSBpcyBpbnZva2VkIG9uLgotICAgICAqLwotICAgIHZvaWQgc2V0U291cmNlVVJMKFN0cmluZyB1cmwpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIHBhcmFtZXRlciBmcm9tIHRoZSBmb3JtLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHBhcmFtZXRlciB2YWx1ZS4KLSAgICAgKi8KLSAgICB2b2lkIHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqIEByZXR1cm4gQW4gb2JqZWN0LgotICAgICAqLwotICAgIE9iamVjdCBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2V0LgotICAgICAqIEByZXR1cm4gQW4gb2JqZWN0LgotICAgICAqLwotICAgIE9iamVjdCBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBkZWZhdWx0VmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhcyBhIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICogQHJldHVybiBBIHN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFyYW1ldGVyIHdhcyBub3Qgc2V0LgotICAgICAqLwotICAgIFN0cmluZyBnZXRQYXJhbWV0ZXJBc1N0cmluZyhTdHJpbmcgbmFtZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcGFyYW1ldGVyIG5hbWVzLgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldFBhcmFtZXRlck5hbWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgcGFyYW1ldGVyIGZyb20gdGhlIGZvcm0uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgcGFydHMgaW4KLSAgICAgKiBtdWx0aXBhcnQgcmVxdWVzdHMuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcGFyYW1ldGVyIHZhbHVlLgotICAgICAqLwotICAgIHZvaWQgc2V0UGFydChTdHJpbmcgbmFtZSwgUGFydCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgcGFydCBwYXJhbWV0ZXIgYXMgYSBzdHJpbmcuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcnQgcGFyYW1ldGVyIG5hbWUuCi0gICAgICogQHJldHVybiBBIHBhcnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBhcnQgd2FzIG5vdCBzZXQuCi0gICAgICovCi0gICAgUGFydCBnZXRQYXJ0KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEFkdmFuY2VzIHRoZSB1c2VjYXNlIHRvIHRoZSBuZXh0IHN0ZXAuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFsbAotICAgICAqIHBhcmFtZXRlcnMgYXJlIHNldC4KLSAgICAgKiBAdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgYWR2YW5jZSgpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBjb25kaXRpb25zIGJlZm9yZSBhIGZvcm0gaXMgZGlzcGxheWVkLgotICAgICAqIEB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdGhhdCBjYXVzZXMgYW4gdW5zdGFibGUKLSAgICAgKiAgICAgICAgICAgICBzeXN0ZW0uCi0gICAgICovCi0gICAgdm9pZCBjaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgY29uZGl0aW9ucyBhZnRlciB0aGUgdXNlY2FzZSB3YXMgZXhlY3V0ZWQuCi0gICAgICogQHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB0aGF0IGNhdXNlcyBhbiB1bnN0YWJsZQotICAgICAqICAgICAgICAgICAgIHN5c3RlbS4KLSAgICAgKi8KLSAgICB2b2lkIGNoZWNrUG9zdGNvbmRpdGlvbnMoKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgY29uZGl0aW9ucyByaWdodCBiZWZvcmUgdGhlIG9wZXJhdGlvbiBpcyBleGVjdXRlZC4KLSAgICAgKiBAdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHRoYXQgY2F1c2VzIGFuIHVuc3RhYmxlCi0gICAgICogICAgICAgICAgICAgc3lzdGVtLgotICAgICAqLwotICAgIHZvaWQgY2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9ja3MgYWxsIG9iamVjdHMgdGhhdCBhcmUgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLgotICAgICAqIEB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBsb2NrSW52b2x2ZWRPYmplY3RzKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlcyBmcm9tIHRoZSBwcmV2aW91cyBvcGVyYXRpb24uIEVycm9yIG1lc3NhZ2VzCi0gICAgICogcHJldmVudCB0aGUgb3BlcmF0aW9uIGZyb20gYmVpbmcgZXhlY3V0ZWQuCi0gICAgICogQHJldHVybiBBIGxpc3Qgb2Yge0BsaW5rIFVzZWNhc2VNZXNzYWdlfSBvYmplY3RzLgotICAgICAqLwotICAgIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5mbyBtZXNzYWdlcyBmcm9tIHRoZSBwcmV2aW91cyBvcGVyYXRpb24uIEluZm8gbWVzc2FnZXMgZG8KLSAgICAgKiBub3QgcHJldmVudCB0aGUgb3BlcmF0aW9uIGZyb20gYmVpbmcgZXhlY3V0ZWQuCi0gICAgICogQHJldHVybiBBIGxpc3Qgb2Yge0BsaW5rIFVzZWNhc2VNZXNzYWdlfSBvYmplY3RzLgotICAgICAqLwotICAgIExpc3QgZ2V0SW5mb01lc3NhZ2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHVzZWNhc2UgaGFzIGVycm9yIG1lc3NhZ2VzLgotICAgICAqIFByb3ZpZGVzIGEgd2F5IG9mIGNoZWNraW5nIGZvciBlcnJvcnMgd2l0aG91dCBhY3R1YWxseSByZXRyaWV2aW5nIHRoZW0uCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB1c2VjYXNlIHJlc3VsdGVkIGluIGVycm9yIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpOwotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSB1c2VjYXNlIGhhcyBpbmZvIG1lc3NhZ2VzLgotICAgICAqIFByb3ZpZGVzIGEgd2F5IG9mIGNoZWNraW5nIGZvciBpbmZvIG1lc3NhZ2VzIHdpdGhvdXQgYWN0dWFsbHkgcmV0cmlldmluZyB0aGVtLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdXNlY2FzZSByZXN1bHRlZCBpbiBpbmZvIG1lc3NhZ2VzIGJlaW5nIGdlbmVyYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbmZvTWVzc2FnZXMoKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB1c2VjYXNlLiBEdXJpbmcgdGhpcyBtZXRob2QgZXJyb3IgYW5kIGluZm8gbWVzc2FnZXMgYXJlCi0gICAgICogZmlsbGVkIGluLiBJZiBnZXRFcnJvck1lc3NhZ2VzKCkgcmV0dXJucyBhbiBlbXB0eSBhcnJheSwgdGhlIG9wZXJhdGlvbgotICAgICAqIHN1Y2NlZWRlZC4gT3RoZXJ3aXNlLCB0aGUgb3BlcmF0aW9uIGZhaWxlZC4KLSAgICAgKiBAdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZCB0aGF0IGNhdXNlcyBhbiB1bnN0YWJsZQotICAgICAqICAgICAgICAgICAgIHN5c3RlbS4KLSAgICAgKi8KLSAgICB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIHRoZSB1c2VjYXNlLgotICAgICAqIEB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBjYW5jZWwoKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB3ZWIgYXBwbGljYXRpb24gVVJMIHRoZSB1c2VjYXNlIHdhcyBpbnZva2VkIG9uLgotICAgICAqLwotICAgIFN0cmluZyBnZXRTb3VyY2VVUkwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdlYmFwcCBVUkwgd2hpY2ggc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgdGhlIHVzZWNhc2UgaXMKLSAgICAgKiBjb21wbGV0ZWQuCi0gICAgICogQHBhcmFtIHN1Y2Nlc3MgSWYgdGhlIHVzZWNhc2Ugd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCi0gICAgICogQHJldHVybiBBIHdlYiBhcHBsaWNhdGlvbiBVUkwuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFRhcmdldFVSTChib29sZWFuIHN1Y2Nlc3MpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB1c2VjYXNlLgotICAgICAqLwotICAgIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGlzIHVzZWNhc2UuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB2aWV3IG9mIHRoZSB1c2VjYXNlLgotICAgICAqLwotICAgIFVzZWNhc2VWaWV3IGdldFZpZXcoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IG9mIHRoZSB1c2VjYXNlLgotICAgICAqLwotICAgIHZvaWQgc2V0VmlldyhVc2VjYXNlVmlldyB2aWV3KTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJlcG9zaXRvcnkgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBTZXNzaW9uIGdldFNlc3Npb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJZiB5b3UgaW52b2tlIHRoaXMgbWV0aG9kLCB0aGUgdXNlY2FzZSB3b24ndCB1c2UgaXRzIG93biBpc29sYXRlZCBzZXNzaW9uLAotICAgICAqIGJ1dCB0aGUgcGFzc2VkIHRlc3Qgc2Vzc2lvbi4gVGhlIHNlc3Npb24gd2lsbCBub3QgYmUgY29tbWl0dGVkIHdoZW4gdGhlIHVzZWNhc2UKLSAgICAgKiBpcyBpbnZva2VkLCBzbyB5b3UgY2FuIGNoZWNrIGl0IGZvciBtb2RpZmljYXRpb25zIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSByZXBvc2l0b3J5LgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSB0ZXN0IHNlc3Npb24uCi0gICAgICovCi0gICAgdm9pZCBzZXRUZXN0U2Vzc2lvbihTZXNzaW9uIHNlc3Npb24pOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgdGhlIHVzZWNhc2UgdXNlcyBvcHRpbWlzdGljIG9mZmxpbmUgbG9jay4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzT3B0aW1pc3RpYygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvVXNlY2FzZUV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvVXNlY2FzZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODY4OTAzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1VzZWNhc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlOwotCi0vKioKLSAqIFVzZWNhc2UgZXhjZXB0aW9uLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFVzZWNhc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBVc2VjYXNlRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIFVzZWNhc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBVc2VjYXNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlY2FzZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvVXNlY2FzZUludm9rZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1VzZWNhc2VJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWZiNGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvVXNlY2FzZUludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIHNlcnZpY2UgYWxsb3dzIHRvIGludm9rZSBhIHVzZWNhc2UgaW4gYSBjb252ZW5pZW50IHdheS4gQSB0eXBpY2FsIHVzYWdlCi0gKiBzY2VuYXJpbyBpcyB0aGUgY29tcG9zaXRpb24gb2YgdXNlY2FzZXMgLSB5b3UgY2FuIGludm9rZSBvbmUgb3IgbXVsdGlwbGUKLSAqICJjaGlsZCIgdXNlY2FzZXMgZnJvbSBhbm90aGVyIHVzZWNhc2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEV4YW1wbGU6Ci0gKiA8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiAgICAgVXNlY2FzZUludm9rZXIgaW52b2tlciA9IG51bGw7Ci0gKiAgICAgdHJ5IHsKLSAqICAgICAgICAgaW52b2tlciA9IChVc2VjYXNlSW52b2tlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChVc2VjYXNlSW52b2tlci5ST0xFKTsKLSAqICAgICAgICAgTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0gKiAgICAgICAgIHBhcmFtcy5wdXQoLi4uLCAuLi4pOwotICogICAgICAgICBpbnZva2VyLmludm9rZShnZXRTb3VyY2VVcmwoKSwgY2hpbGRVc2VjYXNlTmFtZSwgcGFyYW1zKTsKLSAqICAgICAKLSAqICAgICAgICAgaWYgKGludm9rZXIuZ2V0UmVzdWx0KCkgIT0gVXNlY2FzZUludm9rZXIuU1VDQ0VTUykgewotICogICAgICAgICAgICAgTGlzdCBtZXNzYWdlcyA9IGludm9rZXIuZ2V0RXJyb3JNZXNzYWdlcygpOwotICogICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gKiAgICAgICAgICAgICAgICAgVXNlY2FzZU1lc3NhZ2UgbWVzc2FnZSA9IChVc2VjYXNlTWVzc2FnZSkgaS5uZXh0KCk7Ci0gKiAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCBtZXNzYWdlLmdldFBhcmFtZXRlcnMoKSk7Ci0gKiAgICAgICAgICAgICB9Ci0gKiAgICAgICAgIH0KLSAqICAgICB9IGZpbmFsbHkgewotICogICAgICAgICBpZiAoaW52b2tlciAhPSBudWxsKSB7Ci0gKiAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShpbnZva2VyKTsKLSAqICAgICAgICAgfQotICogICAgIH0KLSAqICAgICAKLSAqIDwvcHJlPgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVXNlY2FzZUludm9rZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiByb2xlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gVXNlY2FzZUludm9rZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyBhIHVzZWNhc2UuCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgVVJMIHRvIGludm9rZSB0aGUgdXNlY2FzZSBvbi4KLSAgICAgKiBAcGFyYW0gdXNlY2FzZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZWNhc2UuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnMuCi0gICAgICogQHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICB2b2lkIGludm9rZShTdHJpbmcgd2ViYXBwVXJsLCBTdHJpbmcgdXNlY2FzZU5hbWUsIE1hcCBwYXJhbWV0ZXJzKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbi4KLSAgICAgKi8KLSAgICBpbnQgZ2V0UmVzdWx0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW52b2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KLSAgICAgKi8KLSAgICBpbnQgU1VDQ0VTUyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJlY29uZGl0aW9uIGNoZWNrIGZhaWxlZC4KLSAgICAgKi8KLSAgICBpbnQgUFJFQ09ORElUSU9OU19GQUlMRUQgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGV4ZWN1dGlvbiBjb25kaXRpb24gY2hlY2sgZmFpbGVkLgotICAgICAqLwotICAgIGludCBFWEVDVVRJT05fQ09ORElUSU9OU19GQUlMRUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGV4ZWN1dGlvbiBpdHNlbGYgZmFpbGVkLgotICAgICAqLwotICAgIGludCBFWEVDVVRJT05fRkFJTEVEID0gMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBwb3N0Y29uZGl0aW9uIGNoZWNrIGZhaWxlZC4KLSAgICAgKi8KLSAgICBpbnQgUE9TVENPTkRJVElPTlNfRkFJTEVEID0gNDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2VzIGZyb20gdGhlIHByZXZpb3VzIG9wZXJhdGlvbi4gRXJyb3IgbWVzc2FnZXMKLSAgICAgKiBwcmV2ZW50IHRoZSBvcGVyYXRpb24gZnJvbSBiZWluZyBleGVjdXRlZC4KLSAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiB7QGxpbmsgVXNlY2FzZU1lc3NhZ2V9IG9iamVjdHMuCi0gICAgICovCi0gICAgTGlzdCBnZXRFcnJvck1lc3NhZ2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmZvIG1lc3NhZ2VzIGZyb20gdGhlIHByZXZpb3VzIG9wZXJhdGlvbi4gSW5mbyBtZXNzYWdlcyBkbwotICAgICAqIG5vdCBwcmV2ZW50IHRoZSBvcGVyYXRpb24gZnJvbSBiZWluZyBleGVjdXRlZC4KLSAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiB7QGxpbmsgVXNlY2FzZU1lc3NhZ2V9IG9iamVjdHMuCi0gICAgICovCi0gICAgTGlzdCBnZXRJbmZvTWVzc2FnZXMoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHRhcmdldCBVUkwgb2YgdGhlIHVzZWNhc2UsIGJhc2VkIG9uIHRoZSBzdWNjZXNzLiBUaGlzIG1ldGhvZAotICAgICAqICAgICAgICAgdGhyb3dzIGEgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgdXNlY2FzZSBoYXNuJ3QgYmVlbiBleGVjdXRlZAotICAgICAqICAgICAgICAgeWV0LgotICAgICAqLwotICAgIFN0cmluZyBnZXRUYXJnZXRVcmwoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSB0ZXN0IHNlc3Npb24gdG8gdXNlLgotICAgICAqLwotICAgIHZvaWQgc2V0VGVzdFNlc3Npb24oU2Vzc2lvbiBzZXNzaW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvVXNlY2FzZU1lc3NhZ2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1VzZWNhc2VNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMDYyMmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvVXNlY2FzZU1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBBIG1lc3NhZ2UgaW4gYSB1c2VjYXNlLiBUaGlzIGFuIGVuY2Fwc3VsYXRpb24gZm9yIGFuIGludGVybmF0aW9uYWxpemFibGUKLSAqIG1lc3NhZ2UsIGNvbnRhaW5pbmcgYSBtZXNzYWdlIGNvbnRlbnQgYW5kIHBvdGVudGlhbGx5IHNvbWUgcGFyYW1ldGVycy4gVGhlCi0gKiBwYXJhbWV0ZXJzIGNvcnJlc3BvbmQgdG8gdGhlIHBsYWNlaG9sZGVycyBpbiBkaWN0aW9uYXJ5IGVudHJpZXMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFVzZWNhc2VNZXNzYWdlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbXM7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBfbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlY2FzZU1lc3NhZ2UoU3RyaW5nIF9tZXNzYWdlKSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJtZXNzYWdlIiwgX21lc3NhZ2UpOwotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBfbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBfbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gX3BhcmFtcyBUaGUgcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlY2FzZU1lc3NhZ2UoU3RyaW5nIF9tZXNzYWdlLCBTdHJpbmdbXSBfcGFyYW1zKSB7Ci0gICAgICAgIHRoaXMoX21lc3NhZ2UpOwotCi0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJwYXJhbXMiLCBfcGFyYW1zKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQubm90TnVsbCgicGFyYW1zWyIgKyBpICsgIl0iLCBfcGFyYW1zW2ldKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnBhcmFtcyA9IChTdHJpbmdbXSlfcGFyYW1zLmNsb25lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoaXMgbWVzc2FnZSBoYXMgcGFyYW1ldGVycwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBoYXMgcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1BhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbXMgIT0gbnVsbCAmJiBwYXJhbXMubGVuZ3RoID4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgbWVzc2FnZSBjb250ZW50Ci0gICAgICogQHJldHVybiB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIG1lc3NhZ2UuIElmIG5vIHBhcmFtZXRlcnMgYXJlIHNldCwKLSAgICAgKiBhbiBlbXB0eSBTdHJpbmcgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMgPT0gbnVsbCA/IG5ldyBTdHJpbmdbMF0gOiB0aGlzLnBhcmFtczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCB0aGUgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRNZXNzYWdlKCkpOwotICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBtc2cuYXBwZW5kKCIsICIgKyBwYXJhbXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtc2cudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9Vc2VjYXNlUmVzb2x2ZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1VzZWNhc2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWFlNDk1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1VzZWNhc2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFVzZWNhc2UgcmVzb2x2ZXIgaW50ZXJmYWNlLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBVc2VjYXNlUmVzb2x2ZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIEF2YWxvbiByb2xlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gVXNlY2FzZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXNvbHZlcyBhIHVzZWNhc2Ugb2JqZWN0LgotICAgICAqIEBwYXJhbSB3ZWJhcHBVcmwgVGhlIHdlYiBhcHBsaWNhdGlvbiBVUkwuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVzZWNhc2UuCi0gICAgICogQHJldHVybiBBIHVzZWNhc2Ugb2JqZWN0LgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIFVzZWNhc2UgcmVzb2x2ZShTdHJpbmcgd2ViYXBwVXJsLCBTdHJpbmcgbmFtZSkgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgY2VydGFpbiB1c2VjYXNlIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgd2ViIGFwcGxpY2F0aW9uIFVSTC4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlY2FzZSBuYW1lLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoU3RyaW5nIHdlYmFwcFVybCwgU3RyaW5nIG5hbWUpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbGVhc2VzIGEgdXNlY2FzZSBvYmplY3QuCi0gICAgICogQHBhcmFtIHVzZWNhc2UgVGhlIHVzZWNhc2Ugb2JqZWN0LgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCByZWxlYXNlKFVzZWNhc2UgdXNlY2FzZSkgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgdXNlY2FzZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldFVzZWNhc2VOYW1lcygpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHVzZWNhc2VOYW1lIFRoZSB1c2VjYXNlIHRvIHJlZ2lzdGVyLgotICAgICAqLwotICAgIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHVzZWNhc2VOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvVXNlY2FzZVZpZXcuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL1VzZWNhc2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkM2MzNDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvVXNlY2FzZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5ndWkuR1VJTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLmd1aS5UYWI7Ci0KLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYSB1c2VjYXNlIHZpZXcuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIDxwPgotICogRXhhbXBsZSBjb25maWd1cmF0aW9uOgotICogPGNvZGU+PHByZT4mbHQ7dmlldyB1cmk9Ii9tb2R1bGVzL2Zvby91c2VjYXNlcy9mb28tbW9ncmlmeS5qeCIKLSAqICAgICBjdXN0b21GbG93PSIvbW9kdWxlcy9mb28vZmxvdy9teWZsb3cuanMiCi0gKiAgICAgbWVudT0iZmFsc2V8dHJ1ZSIKLSAqICAgICBjcmVhdGVDb250aW51YXRpb249ImZhbHNlfHRydWUiCi0gKiAmZ3Q7Ci0gKiAgICZsdDt0YWIgZ3JvdXA9ImZvbyIgbmFtZT0iYmFyIi8mZ3Q7ICAgICAgLy8gb3B0aW9uYWwKLSAqICAgJmx0O3BhcmFtZXRlciBuYW1lPSJmb28iIHZhbHVlPSJiYXIvJmd0OyAvLyBvcHRpb25hbAotICogJmx0Oy92aWV3Jmd0OzwvcHJlPjwvY29kZT4KLSAqIDwvcD4KLSAqIDxwPgotICogPGNvZGU+dXJpPC9jb2RlPiBpcyB0aGUgcmVsYXRpdmUgVVJMIG9mIHRoZSBwYWdlIHRvIGJlIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LiBJZiB0aGUgVVJJCi0gKiBzdGFydHMgd2l0aCBhIHNsYXNoLCBpdCBpcyByZXNvbHZlZCBzdGFydGluZyBhdCB0aGUgcm9vdCBzaXRlbWFwLCBvdGhlcndpc2UgaXQKLSAqIGlzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNpdGVtYXAuIFRoZSBVUkkgc2hvdWxkIG5vdCBjb250YWluIGEKLSAqIHNjaGVtZSAoc3VjaCBhcyBjb2Nvb246KS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGNvZGU+bWVudTwvY29kZT4gaXMgYSBib29sZWFuIHRoYXQgZ292ZXJucyB3aGV0aGVyIHRoZSBMZW55YSBHVUkgbWVudSBpcyBkaXNwbGF5ZWQgd2hpbGUKLSAqIHRoZSB1c2VjYXNlIGlzIHJ1bm5pbmcuIFRoZSBkaXNwbGF5aW5nIG9mIHRoZSBtZW51IGlzIGhhbmRsZWQgYnkgdGhlIHVzZWNhc2UueG1hcCBzaXRlbWFwOwotICogaGVuY2UgdGhpcyBvcHRpb24gaXMgb25seSBmdW5jdGlvbmFsIGlmIDxjb2RlPnVyaTwvY29kZT4gZG9lcyA8ZW0+bm90PC9lbT4gc3RhcnQgd2l0aCBhIHNsYXNoCi0gKiAob3IgaWYgeW91IGltcGxlbWVudCBpdCB5b3Vyc2VsZiBiYXNlZCBvbiB0aGUgPGNvZGU+c2hvd01lbnUoKTwvY29kZT4gbWV0aG9kIG9mIHRoaXMgb2JqZWN0KS48YnI+Ci0gKiBEZWZhdWx0IGlzIDxlbT5mYWxzZTwvZW0+LgotICogPC9wPgotICogPHA+Ci0gKiA8Y29kZT5jdXN0b21GbG93PC9jb2RlPiBpcyBhIGphdmFzY3JpcHQgZmlsZSB3aGVyZSB5b3UgY2FuIHByb3ZpZGUgY3VzdG9tIG1ldGhvZHMgdGhhdCB3aWxsIG92ZXJyaWRlCi0gKiB0aG9zZSBpbiB0aGUgZGVmYXVsdCB1c2VjYXNlIGhhbmRsZXIgKDxjb2RlPm1vZHVsZXMtY29yZS91c2VjYXNlL3VzZWNhc2VzLmpzPC9jb2RlPikuCi0gKiBDdXJyZW50bHksIGl0IHByb3ZpZGVzIHN1cHBvcnQgZm9yICJjdXN0b21Mb29wRmxvdyIgYW5kICJjdXN0b21TdWJtaXRGbG93Ii4gUmVmZXIgdG8gdGhlIGRlZmF1bHQgaGFuZGxlcgotICogZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIG1vcmUgaW5mb3JtYXRpb24uCi0gKiBOQjogdGhlICJtZW51IiBhbmQgImNyZWF0ZUNvbnRpbnVhdGlvbiIgYXR0cmlidXRlcyB3aWxsIGhhdmUgbm8gZWZmZWN0IHdoZW4geW91IHVzZSBjdXN0b20gZmxvdyBjb2RlLCB1bmxlc3MKLSAqIHlvdSBjaGVjayBmb3IgdGhlbSBhbmQgaW1wbGVtZW50IHRoZSByZXNwZWN0aXZlIGZ1bmN0aW9ucyB5b3Vyc2VsZi4KLSAqIDwvcD4KLSAqIDxwPgotICogPGNvZGU+Y3JlYXRlQ29udGludWF0aW9uPC9jb2RlPiBjYW4gYmUgc2V0IHRvIGZhbHNlLCBpbiB3aGljaCBjYXNlIHRoZSBnZW5lcmljIGZsb3dzY3JpcHQKLSAqIHVzZXMgInNlbmRQYWdlIiBpbnN0ZWFkIG9mICJzZW5kUGFnZUFuZFdhaXQiIGFuZCB0ZXJtaW5hdGVzIGFmdGVyIHRoZSB2aWV3IGhhcyBiZWVuIHNlbnQuCi0gKiBXaGVuIDxjb2RlPmNyZWF0ZUNvbnRpbnVhdGlvbjwvY29kZT4gaXMgZmFsc2UsIHlvdSBtdXN0IG5vdCBzcGVjaWZ5IDxjb2RlPnN1Ym1pdEZsb3c8L2NvZGU+IAotICogb3IgPGNvZGU+bG9vcEZsb3c8L2NvZGU+Ljxicj4KLSAqIERlZmF1bHQgaXMgPGVtPnRydWU8L2VtPi4KLSAqIDwvcD4KLSAqIDxwPgotICogRm9yIHRhYmJlZCB1c2VjYXNlcywgeW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSB0YWIgZ3JvdXAgYW5kIG5hbWUuIEFkZGl0aW9uYWwgY3VzdG9tCi0gKiBjb25maWd1cmF0aW9uIGNhbiBiZSBwYXNzZWQgdmlhIHRoZSBnZW5lcmljICJwYXJhbWV0ZXIiIGVsZW1lbnQuIAotICogPC9wPgotICogPHA+Ci0gKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB1c2VjYXNlcywgdGhlIGNvbnN0cnVjdG9yIGxvb2tzIGZvciBhIDxjb2RlPnRlbXBsYXRlPC9jb2RlPgotICogYXR0cmlidXRlIGlmIG5vIDxjb2RlPnVyaTwvY29kZT4gaXMgcHJlc2VudC4gSXQgaXMgbWFwcGVkIHRvIHRoZSBzYW1lIGZpZWxkLCB2aWV3VXJpLCBpbnRlcm5hbGx5LgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVXNlY2FzZVZpZXcgaW1wbGVtZW50cyBDb25maWd1cmFibGUsIFNlcnZpY2VhYmxlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9VUkkgPSAidXJpIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVEVNUExBVEUgPSAidGVtcGxhdGUiOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgbWFwcGVkIHRvICJ1cmkiCi0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQ1VTVE9NX0ZMT1cgPSAiY3VzdG9tRmxvdyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1NIT1dfTUVOVSA9ICJtZW51IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQ1JFQVRFX0NPTlQgPSAiY3JlYXRlQ29udGludWF0aW9uIjsKLQotICAgIC8vIGFkZGl0aW9uYWwgcGFyYW1ldGVyczoKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBUkFNRVRFUiA9ICJwYXJhbWV0ZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gIm5hbWUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9ICJ2YWx1ZSI7Ci0KLSAgICAvLyB0YWJiZWQgdXNlY2FzZXM6Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0dST1VQID0gImdyb3VwIjsgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUIgPSAidGFiIjsKLQotCi0gICAgcHJpdmF0ZSBNYXAgcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlld1VyaTsKLSAgICBwcml2YXRlIFN0cmluZyBjdXN0b21GbG93OwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93TWVudTsKLSAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQ29udGludWF0aW9uOwotICAgIHByaXZhdGUgVGFiIHRhYjsKLQotCi0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGUjY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGdldCA8dmlldz4gYXR0cmlidXRlczoKLSAgICAgICAgdGhpcy52aWV3VXJpID0gY29uZmlnLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVJJLCAiIik7Ci0gICAgICAgIGlmICh0aGlzLnZpZXdVcmkgPT0gIiIpIHsKLSAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvICJ0ZW1wbGF0ZSIgYXR0cmlidXRlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAocmlwIG91dCBldmVudHVhbGx5KS4KLSAgICAgICAgICAgdGhpcy52aWV3VXJpID0gY29uZmlnLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVEVNUExBVEUsICIiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNob3dNZW51ID0gY29uZmlnLmdldEF0dHJpYnV0ZUFzQm9vbGVhbihBVFRSSUJVVEVfU0hPV19NRU5VLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuY3VzdG9tRmxvdyA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0NVU1RPTV9GTE9XLCAiIik7Ci0gICAgICAgIHRoaXMuY3JlYXRlQ29udGludWF0aW9uID0gY29uZmlnLmdldEF0dHJpYnV0ZUFzQm9vbGVhbihBVFRSSUJVVEVfQ1JFQVRFX0NPTlQsIHRydWUpOwotCi0KLSAgICAgICAgLy8gZ2V0IDx0YWIvPiBjb25maWd1cmF0aW9uOgotICAgICAgICBDb25maWd1cmF0aW9uIHRhYkNvbmZpZyA9IGNvbmZpZy5nZXRDaGlsZChFTEVNRU5UX1RBQiwgZmFsc2UpOwotICAgICAgICBpZiAodGFiQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0YWJOYW1lID0gdGFiQ29uZmlnLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgdGFiR3JvdXAgPSB0YWJDb25maWcuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9HUk9VUCk7Ci0gICAgICAgICAgICBHVUlNYW5hZ2VyIGd1aU1nciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGd1aU1nciA9IChHVUlNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKEdVSU1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgdGhpcy50YWIgPSBndWlNZ3IuZ2V0VGFiKHRhYkdyb3VwLCB0YWJOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoZ3VpTWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoZ3VpTWdyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgPHBhcmFtZXRlci8+IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgQ29uZmlndXJhdGlvbltdIHBhcmFtZXRlckNvbmZpZ3MgPSBjb25maWcuZ2V0Q2hpbGRyZW4oRUxFTUVOVF9QQVJBTUVURVIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyYW1ldGVyQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVyQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hlY2tDb25maWcoKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgSlggdGVtcGxhdGU7Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWaWV3VVJJKCkgewotICAgICAgICByZXR1cm4gdGhpcy52aWV3VXJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgbWVudWJhciBzaG91bGQgYmUgdmlzaWJsZSBvbiB1c2VjYXNlIHNjcmVlbnMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvd01lbnUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNob3dNZW51OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gd2hldGhlciBhIGNvbnRpbnVhdGlvbiBzaG91bGQgYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVDb250aW51YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvbnRpbnVhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBGbG93c2NyaXB0IHNuaXBwZXQgdG8gYmUgZXhlY3V0ZWQgZHVyaW5nIHRoZSB1c2VjYXNlIHZpZXcgbG9vcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbUZsb3coKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbUZsb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqIEByZXR1cm4gVGhlIHBhcmFtZXRlciB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgdGhpcy5wYXJhbWV0ZXJzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB0YWIgdGhlIHVzZWNhc2UgYmVsb25ncyB0byBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFiIGdldFRhYigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGFiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWxsIHRhYnMgaW4gdGhlIHNhbWUgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIFRhYltdIGdldFRhYnNJbkdyb3VwKCkgewotICAgICAgICBpZiAoZ2V0VGFiKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBHVUlNYW5hZ2VyIGd1aU1nciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGd1aU1nciA9IChHVUlNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKEdVSU1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGd1aU1nci5nZXRBY3RpdmVUYWJzKGdldFRhYigpLmdldEdyb3VwKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChndWlNZ3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShndWlNZ3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tDb25maWcoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLnRhYiAhPSBudWxsICYmIHRoaXMudmlld1VyaSA9PSAiIikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIldoZW4geW91IHNwZWNpZnkgYSA8dGFiLz4sIHlvdSBtdXN0IHNwZWNpZnkgYSA8dmlldyB1cmk9XCIuLlwiLz4gYXMgd2VsbCEiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2NvY29vbi9Vc2VjYXNlTW9kdWxlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9jb2Nvb24vVXNlY2FzZU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWFjNDVkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2NvY29vbi9Vc2VjYXNlTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5jb2Nvb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LkFic3RyYWN0SW5wdXRNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5ndWkuVGFiOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotCi0vKioKLSAqIElucHV0IG1vZHVsZSB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdXNlY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VjYXNlTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RJbnB1dE1vZHVsZSBpbXBsZW1lbnRzIFNlcnZpY2VhYmxlIHsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgdmFsdWUgPSAiIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSAidGFiR3JvdXA6IjsKLSAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpICYmIG5hbWUubGVuZ3RoKCkgPiBwcmVmaXgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ZXBzID0gbmFtZS5zcGxpdCgiOiIpOwotICAgICAgICAgICAgU3RyaW5nIHVzZWNhc2VOYW1lID0gc3RlcHNbMV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotICAgICAgICAgICAgU3RyaW5nIHdlYmFwcFVybCA9IFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBVc2VjYXNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICAgICAgVXNlY2FzZSB1c2VjYXNlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIgPSAoVXNlY2FzZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFVzZWNhc2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgICAgICB1c2VjYXNlID0gcmVzb2x2ZXIucmVzb2x2ZSh3ZWJhcHBVcmwsIHVzZWNhc2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodXNlY2FzZS5nZXRWaWV3KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBUYWIgdGFiID0gdXNlY2FzZS5nZXRWaWV3KCkuZ2V0VGFiKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YWIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0YWIuZ2V0R3JvdXAoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJFcnJvcjogIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodXNlY2FzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2UodXNlY2FzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9ndWkvR1VJTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvZ3VpL0dVSU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlZmRmZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9ndWkvR1VJTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5ndWk7DQotDQotLyoqDQotICogVXNlY2FzZSBHVUkgbWFuYWdlci4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEdVSU1hbmFnZXIgew0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIHNlcnZpY2Ugcm9sZS4NCi0gICAgICovDQotICAgIFN0cmluZyBST0xFID0gR1VJTWFuYWdlci5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZ3JvdXAgQSB0YWIgZ3JvdXAuDQotICAgICAqIEByZXR1cm4gQWxsIHRhYnMgb2YgdGhpcyBncm91cC4NCi0gICAgICovDQotICAgIFRhYltdIGdldEFjdGl2ZVRhYnMoU3RyaW5nIGdyb3VwKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIGdyb3VwLg0KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdGFiIG5hbWUuDQotICAgICAqIEByZXR1cm4gVGhlIHRhYiBvZiB0aGlzIG5hbWUgd2l0aGluIHRoaXMgZ3JvdXAuDQotICAgICAqLw0KLSAgICBUYWIgZ2V0VGFiKFN0cmluZyBncm91cCwgU3RyaW5nIG5hbWUpOw0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvZ3VpL1RhYi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvZ3VpL1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2ExMDZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2d1aS9UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICoNCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuZ3VpOw0KLQ0KLS8qKg0KLSAqIFRhYiBpbiBhIHRhYmJlZCBtdWx0aXBsZS11c2VjYXNlIGVudmlyb25tZW50Lg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgVGFiIHsNCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHRhYi4NCi0gICAgICovDQotICAgIFN0cmluZyBnZXROYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIFRoZSBsYWJlbC4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gVGhlIHVzZWNhc2Ugd2hpY2ggaXMgZGlzcGxheWVkIG9uIHRoZSB0YWIuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZWNhc2UoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gVGhlIGdyb3VwIHRoaXMgdGFiIGJlbG9uZ3MgdG8uDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwKCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBUaGUgbmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgdXNlY2FzZSB1cG9uIGludm9jYXRpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGNlcnRhaW4gcGFyYW1ldGVyIHRvIHBhc3MgdG8gdGhlIHVzZWNhc2UgdXBvbiBpbnZvY2F0aW9uLiANCi0gICAgICogQHBhcmFtIGtleSBUaGUgdmFsdWUuDQotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcga2V5KTsNCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2d1aS9pbXBsL0dVSU1hbmFnZXJJbXBsLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9ndWkvaW1wbC9HVUlNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDA2YzFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2d1aS9pbXBsL0dVSU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5ndWkuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQXV0aG9yaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Sb2xlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy5Qb2xpY3lVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hYy51c2VjYXNlLlVzZWNhc2VBdXRob3JpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5jb250ZXh0LkNvbnRleHRVdGlsaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uVXRpbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5ndWkuR1VJTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5ndWkuVGFiOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsNCi0NCi0vKioNCi0gKiBHVUkgbWFuYWdlciBpbXBsZW1lbnRhdGlvbi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgR1VJTWFuYWdlckltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBHVUlNYW5hZ2VyLCBDb25maWd1cmFibGUsDQotICAgICAgICBTZXJ2aWNlYWJsZSwgQ29udGV4dHVhbGl6YWJsZSB7DQotDQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFSQU1FVEVSID0gInBhcmFtZXRlciI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCX0dST1VQID0gInRhYi1ncm91cCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCID0gInRhYiI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gIm5hbWUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSAidmFsdWUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTEFCRUwgPSAibGFiZWwiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVVNFQ0FTRSA9ICJ1c2VjYXNlIjsNCi0NCi0gICAgcHJpdmF0ZSBNYXAgbmFtZTJncm91cCA9IG5ldyBIYXNoTWFwKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZSNjb25maWd1cmUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gew0KLSAgICAgICAgQ29uZmlndXJhdGlvbltdIHRhYkdyb3VwQ29uZmlncyA9IGNvbmZpZy5nZXRDaGlsZHJlbihFTEVNRU5UX1RBQl9HUk9VUCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkdyb3VwQ29uZmlncy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIFN0cmluZyBncm91cE5hbWUgPSB0YWJHcm91cENvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgICAgICBMaXN0IGdyb3VwID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25bXSB0YWJDb25maWdzID0gdGFiR3JvdXBDb25maWdzW2ldLmdldENoaWxkcmVuKEVMRU1FTlRfVEFCKTsNCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhYkNvbmZpZ3MubGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB0YWJDb25maWdzW2pdLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IHRhYkNvbmZpZ3Nbal0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9MQUJFTCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VjYXNlID0gdGFiQ29uZmlnc1tqXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VTRUNBU0UpOw0KLSAgICAgICAgICAgICAgICBUYWJJbXBsIHRhYiA9IG5ldyBUYWJJbXBsKGdyb3VwTmFtZSwgbmFtZSwgdXNlY2FzZSwgbGFiZWwpOw0KLSAgICAgICAgICAgICAgICBncm91cC5hZGQodGFiKTsNCi0NCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbltdIHBhcmFtQ29uZmlncyA9IHRhYkNvbmZpZ3Nbal0uZ2V0Q2hpbGRyZW4oRUxFTUVOVF9QQVJBTUVURVIpOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IHBhcmFtQ29uZmlncy5sZW5ndGg7IHArKykgew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtQ29uZmlnc1twXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWUgPSBwYXJhbUNvbmZpZ3NbcF0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICAgICAgICAgICAgICB0YWIuc2V0UGFyYW1ldGVyKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbmFtZTJncm91cC5wdXQoZ3JvdXBOYW1lLCBncm91cC50b0FycmF5KG5ldyBUYWJbZ3JvdXAuc2l6ZSgpXSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuZ3VpLkdVSU1hbmFnZXIjZ2V0QWN0aXZlVGFicyhqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFRhYltdIGdldEFjdGl2ZVRhYnMoU3RyaW5nIGdyb3VwKSB7DQotICAgICAgICBUYWJbXSB0YWJzID0gZ2V0VGFicyhncm91cCk7DQotICAgICAgICBMaXN0IGFjdGl2ZVRhYnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBpZiAoZ2V0RXJyb3JNZXNzYWdlcyh0YWJzW2ldKS5sZW5ndGggPT0gMCkgew0KLSAgICAgICAgICAgICAgICBhY3RpdmVUYWJzLmFkZCh0YWJzW2ldKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gKFRhYltdKSBhY3RpdmVUYWJzLnRvQXJyYXkobmV3IFRhYlthY3RpdmVUYWJzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUYWJbXSBnZXRUYWJzKFN0cmluZyBncm91cCkgew0KLSAgICAgICAgVGFiW10gdGFicyA9IChUYWJbXSkgbmFtZTJncm91cC5nZXQoZ3JvdXApOw0KLSAgICAgICAgcmV0dXJuIHRhYnM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5ndWkuR1VJTWFuYWdlciNnZXRUYWIoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBUYWIgZ2V0VGFiKFN0cmluZyBncm91cCwgU3RyaW5nIG5hbWUpIHsNCi0gICAgICAgIFRhYltdIHRhYnMgPSBnZXRUYWJzKGdyb3VwKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyh0YWJzW2ldLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRhYnNbaV07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdGFiIFsiICsgbmFtZSArICJdIGluIGdyb3VwIFsiICsgZ3JvdXAgKyAiXSIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDaGVja3MgaWYgYSB0YWIncyB1c2VjYXNlIGNhbiBiZSBleGVjdXRlZC4NCi0gICAgICogQHBhcmFtIHRhYiBUaGUgdGFiLg0KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFVzZWNhc2VNZXNzYWdlW10gZ2V0RXJyb3JNZXNzYWdlcyhUYWIgdGFiKSB7DQotDQotICAgICAgICBVc2VjYXNlTWVzc2FnZVtdIG1lc3NhZ2VzOw0KLQ0KLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsNCi0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciBhY1Jlc29sdmVyID0gbnVsbDsNCi0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIgYWNjZXNzQ29udHJvbGxlciA9IG51bGw7DQotICAgICAgICBVc2VjYXNlUmVzb2x2ZXIgdXNlY2FzZVJlc29sdmVyID0gbnVsbDsNCi0gICAgICAgIFVzZWNhc2VBdXRob3JpemVyIGF1dGhvcml6ZXIgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLlJPTEUNCi0gICAgICAgICAgICAgICAgICAgICsgIlNlbGVjdG9yIik7DQotICAgICAgICAgICAgYWNSZXNvbHZlciA9IChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIpIHNlbGVjdG9yLnNlbGVjdChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuREVGQVVMVF9SRVNPTFZFUik7DQotICAgICAgICAgICAgYWNjZXNzQ29udHJvbGxlciA9IGFjUmVzb2x2ZXIucmVzb2x2ZUFjY2Vzc0NvbnRyb2xsZXIodGhpcy53ZWJhcHBVcmwpOw0KLQ0KLSAgICAgICAgICAgIEF1dGhvcml6ZXJbXSBhdXRob3JpemVycyA9IGFjY2Vzc0NvbnRyb2xsZXIuZ2V0QXV0aG9yaXplcnMoKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1dGhvcml6ZXJzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGlmIChhdXRob3JpemVyc1tpXSBpbnN0YW5jZW9mIFVzZWNhc2VBdXRob3JpemVyKSB7DQotICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVyID0gKFVzZWNhc2VBdXRob3JpemVyKSBhdXRob3JpemVyc1tpXTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB1c2VjYXNlUmVzb2x2ZXIgPSAoVXNlY2FzZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFVzZWNhc2VSZXNvbHZlci5ST0xFKTsNCi0NCi0gICAgICAgICAgICAvLyBmaWx0ZXIgaXRlbSBpZiB1c2VjYXNlIG5vdCBhbGxvd2VkDQotICAgICAgICAgICAgaWYgKHRhYi5nZXRVc2VjYXNlKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkZvdW5kIHVzZWNhc2UgWyIgKyB0YWIuZ2V0VXNlY2FzZSgpICsgIl0iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeTsNCi0gICAgICAgICAgICAgICAgQ29udGV4dFV0aWxpdHkgdXRpbCA9IG51bGw7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICB1dGlsID0gKENvbnRleHRVdGlsaXR5KSB0aGlzLm1hbmFnZXIubG9va3VwKENvbnRleHRVdGlsaXR5LlJPTEUpOw0KLSAgICAgICAgICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gdXRpbC5nZXRSZXF1ZXN0KCk7DQotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmdldERvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHV0aWwpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnksDQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJhcHBVcmwpOw0KLSAgICAgICAgICAgICAgICBpZiAoIWF1dGhvcml6ZXIuYXV0aG9yaXplVXNlY2FzZSh0YWIuZ2V0VXNlY2FzZSgpLCB0aGlzLnJvbGVzLCBwdWIpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJVc2VjYXNlIG5vdCBhdXRob3JpemVkIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG5ldyBVc2VjYXNlTWVzc2FnZVsxXTsNCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzWzBdID0gbmV3IFVzZWNhc2VNZXNzYWdlKCJBY2Nlc3MgZGVuaWVkIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHVzZWNhc2VSZXNvbHZlci5pc1JlZ2lzdGVyZWQodGhpcy53ZWJhcHBVcmwsIHRhYi5nZXRVc2VjYXNlKCkpKSB7DQotICAgICAgICAgICAgICAgIFVzZWNhc2UgdXNlY2FzZSA9IG51bGw7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlID0gdXNlY2FzZVJlc29sdmVyLnJlc29sdmUodGhpcy53ZWJhcHBVcmwsIHRhYi5nZXRVc2VjYXNlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgdXNlY2FzZS5zZXRTb3VyY2VVUkwodGhpcy53ZWJhcHBVcmwpOw0KLSAgICAgICAgICAgICAgICAgICAgdXNlY2FzZS5zZXROYW1lKHRhYi5nZXRVc2VjYXNlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5cyA9IHRhYi5nZXRQYXJhbWV0ZXJOYW1lcygpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlY2FzZS5zZXRQYXJhbWV0ZXIoa2V5c1tpXSwgdGFiLmdldFBhcmFtZXRlcihrZXlzW2ldKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLmNoZWNrUHJlY29uZGl0aW9ucygpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZWNhc2UuaGFzRXJyb3JzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiVXNlY2FzZSBwcmVjb25kaXRpb25zIG5vdCBjb21wbGllZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0IG1zZ3MgPSB1c2VjYXNlLmdldEVycm9yTWVzc2FnZXMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IChVc2VjYXNlTWVzc2FnZVtdKSBtc2dzLnRvQXJyYXkobmV3IFVzZWNhc2VNZXNzYWdlW21zZ3Muc2l6ZSgpXSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gbmV3IFVzZWNhc2VNZXNzYWdlWzBdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZWNhc2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWNhc2VSZXNvbHZlci5yZWxlYXNlKHVzZWNhc2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBuZXcgVXNlY2FzZU1lc3NhZ2VbMV07DQotICAgICAgICAgICAgICAgIG1lc3NhZ2VzWzBdID0gbmV3IFVzZWNhc2VNZXNzYWdlKCJVc2VjYXNlIFsiICsgdGFiLmdldFVzZWNhc2UoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gaXMgbm90IHJlZ2lzdGVyZWQhIiwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKHVzZWNhc2VSZXNvbHZlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHVzZWNhc2VSZXNvbHZlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChhY1Jlc29sdmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NDb250cm9sbGVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBhY1Jlc29sdmVyLnJlbGVhc2UoYWNjZXNzQ29udHJvbGxlcik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKGFjUmVzb2x2ZXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZXM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOw0KLQ0KLSAgICAvKioNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7DQotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHdlYmFwcFVybDsNCi0gICAgcHJpdmF0ZSBSb2xlW10gcm9sZXM7DQotDQotICAgIC8qKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGUjY29udGV4dHVhbGl6ZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29udGV4dHVhbGl6ZShDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb250ZXh0RXhjZXB0aW9uIHsNCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdChjb250ZXh0KTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdGhpcy5yb2xlcyA9IFBvbGljeVV0aWwuZ2V0Um9sZXMocmVxdWVzdCk7DQotICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udGV4dEV4Y2VwdGlvbigiT2J0YWluaW5nIHJvbGVzIGZhaWxlZDogIiwgZSk7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLndlYmFwcFVybCA9IFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2d1aS9pbXBsL1RhYkltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2d1aS9pbXBsL1RhYkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2N2QwNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9ndWkvaW1wbC9UYWJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5ndWkuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuZ3VpLlRhYjsKLQotLyoqCi0gKiBUYWIgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJJbXBsIGltcGxlbWVudHMgVGFiIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGdyb3VwIFRoZSBuYW1lIG9mIHRoZSB1c2VjYXNlIGdyb3VwLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWIuCi0gICAgICogQHBhcmFtIHVzZWNhc2UgVGhlIHVzZWNhc2UgdG8gYmUgZGlzcGxheWVkLgotICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSB0YWIuCi0gICAgICovCi0gICAgcHVibGljIFRhYkltcGwoU3RyaW5nIGdyb3VwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVzZWNhc2UsIFN0cmluZyBsYWJlbCkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7Ci0gICAgICAgIHRoaXMudXNlY2FzZSA9IHVzZWNhc2U7Ci0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXAgcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgdm9pZCBzZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHVzZWNhc2U7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZWNhc2UoKSB7Ci0gICAgICAgIHJldHVybiB1c2VjYXNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKLSAgICAgICAgU2V0IGtleXMgPSB0aGlzLnBhcmFtZXRlcnMua2V5U2V0KCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGtleXMudG9BcnJheShuZXcgU3RyaW5nW2tleXMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHRoaXMucGFyYW1ldGVycy5nZXQoa2V5KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9pbXBsL1Rlc3RVc2VjYXNlSW52b2tlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvaW1wbC9UZXN0VXNlY2FzZUludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmMzkwMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9pbXBsL1Rlc3RVc2VjYXNlSW52b2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuaW1wbDsKLQotCi0vKioKLSAqIEludm9rZXIgZm9yIHRlc3QgdXNlY2FzZXMuIFRoZSB0cmFuc2FjdGlvbnMgYXJlIG5vdCBjb21taXR0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0VXNlY2FzZUludm9rZXIgZXh0ZW5kcyBVc2VjYXNlSW52b2tlckltcGwgewotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBBdmFsb24gcm9sZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFID0gVGVzdFVzZWNhc2VJbnZva2VyLmNsYXNzLmdldE5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvaW1wbC9Vc2VjYXNlSW52b2tlckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2ltcGwvVXNlY2FzZUludm9rZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWJkYTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvaW1wbC9Vc2VjYXNlSW52b2tlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUludm9rZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VSZXNvbHZlcjsKLQotLyoqCi0gKiBVc2VjYXNlIGludm9rZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFVzZWNhc2VJbnZva2VySW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFVzZWNhc2VJbnZva2VyLCBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRVcmw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUludm9rZXIjaW52b2tlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZShTdHJpbmcgd2ViYXBwVXJsLCBTdHJpbmcgdXNlY2FzZU5hbWUsIE1hcCBwYXJhbWV0ZXJzKQotICAgICAgICAgICAgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotCi0gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlcy5jbGVhcigpOwotICAgICAgICB0aGlzLmluZm9NZXNzYWdlcy5jbGVhcigpOwotCi0gICAgICAgIFVzZWNhc2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFVzZWNhc2UgdXNlY2FzZSA9IG51bGw7Ci0gICAgICAgIHRoaXMucmVzdWx0ID0gU1VDQ0VTUzsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoVXNlY2FzZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFVzZWNhc2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHVzZWNhc2UgPSByZXNvbHZlci5yZXNvbHZlKHdlYmFwcFVybCwgdXNlY2FzZU5hbWUpOwotCi0gICAgICAgICAgICBTZXNzaW9uIHRlc3RTZXNzaW9uID0gZ2V0VGVzdFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmICh0ZXN0U2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZS5zZXRUZXN0U2Vzc2lvbih0ZXN0U2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhc3NQYXJhbWV0ZXJzKHVzZWNhc2UsIHBhcmFtZXRlcnMpOwotCi0gICAgICAgICAgICB1c2VjYXNlLmNoZWNrUHJlY29uZGl0aW9ucygpOwotCi0gICAgICAgICAgICBpZiAoc3VjY2VlZGVkKFBSRUNPTkRJVElPTlNfRkFJTEVELCB1c2VjYXNlKSkgewotCi0gICAgICAgICAgICAgICAgdXNlY2FzZS5sb2NrSW52b2x2ZWRPYmplY3RzKCk7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZS5jaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdWNjZWVkZWQoRVhFQ1VUSU9OX0NPTkRJVElPTlNfRkFJTEVELCB1c2VjYXNlKSkgewotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLmV4ZWN1dGUoKTsKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBzdWNjZWVkZWQoRVhFQ1VUSU9OX0ZBSUxFRCwgdXNlY2FzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0VXJsID0gdXNlY2FzZS5nZXRUYXJnZXRVUkwoc3VjY2Vzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLmNoZWNrUG9zdGNvbmRpdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRlZChQT1NUQ09ORElUSU9OU19GQUlMRUQsIHVzZWNhc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZWNhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZSh1c2VjYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTZXNzaW9uIHRlc3RTZXNzaW9uID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU2Vzc2lvbiBnZXRUZXN0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGVzdFNlc3Npb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VjY2VlZGVkKGludCByZXN1bHQsIFVzZWNhc2UgdXNlY2FzZSkgewotCi0gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlcy5hZGRBbGwodXNlY2FzZS5nZXRFcnJvck1lc3NhZ2VzKCkpOwotICAgICAgICB0aGlzLmluZm9NZXNzYWdlcy5hZGRBbGwodXNlY2FzZS5nZXRJbmZvTWVzc2FnZXMoKSk7Ci0KLSAgICAgICAgaWYgKHVzZWNhc2UuZ2V0RXJyb3JNZXNzYWdlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKLSAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgICAgICBjYXNlIFBSRUNPTkRJVElPTlNfRkFJTEVEOgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiUHJlY29uZGl0aW9uIG1lc3NhZ2VzOiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVYRUNVVElPTl9DT05ESVRJT05TX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkV4ZWN1dGlvbiBjb25kaXRpb24gbWVzc2FnZXM6IjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRVhFQ1VUSU9OX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkV4ZWN1dGlvbiBtZXNzYWdlczoiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQT1NUQ09ORElUSU9OU19GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJQb3N0Y29uZGl0aW9uIG1lc3NhZ2VzOiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2dFcnJvck1lc3NhZ2VzKHVzZWNhc2UuZ2V0TmFtZSgpLCBtZXNzYWdlLCB1c2VjYXNlLmdldEVycm9yTWVzc2FnZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdXNlY2FzZSBUaGUgdXNlY2FzZSB0byBwYXNzIHRoZSBwYXJhbWV0ZXJzIHRvLgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhc3NQYXJhbWV0ZXJzKFVzZWNhc2UgdXNlY2FzZSwgTWFwIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFyYW1ldGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICB1c2VjYXNlLnNldFBhcmFtZXRlcihrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB1c2VjYXNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdXNlY2FzZS4KLSAgICAgKiBAcGFyYW0gaGVhZGxpbmUgVGhlIGhlYWRsaW5lIG9mIHRoZSBtZXNzYWdlcy4KLSAgICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gbG9nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yTWVzc2FnZXMoU3RyaW5nIHVzZWNhc2VOYW1lLCBTdHJpbmcgaGVhZGxpbmUsIExpc3QgZXJyb3JNZXNzYWdlcykgewotICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiVXNlY2FzZSBbIiArIHVzZWNhc2VOYW1lICsgIl0gLSAiICsgaGVhZGxpbmUpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlcnJvck1lc3NhZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIiIgKyAoVXNlY2FzZU1lc3NhZ2UpIGkubmV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgZXJyb3JNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIExpc3QgaW5mb01lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5lcnJvck1lc3NhZ2VzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRJbmZvTWVzc2FnZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuaW5mb01lc3NhZ2VzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZXN1bHQgPSBTVUNDRVNTOwotCi0gICAgcHVibGljIGludCBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFVybCgpIHsKLSAgICAgICAgaWYgKHRoaXMudGFyZ2V0VXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSB1c2VjYXNlIGhhcyBub3QgYmVlbiBleGVjdXRlZCB5ZXQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0VXJsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRlc3RTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICB0aGlzLnRlc3RTZXNzaW9uID0gc2Vzc2lvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2ltcGwvVXNlY2FzZVByb3h5LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9pbXBsL1VzZWNhc2VQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJhYmJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2ltcGwvVXNlY2FzZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlVmlldzsKLQotLyoqCi0gKiBQcm94eSB3aGljaCBob2xkcyB0aGUgcGFyYW1ldGVycyBvZiBhIHVzZWNhc2UuIEl0IGlzIHVzZWQgdG8gcmVzdG9yZSB0aGUgdXNlY2FzZSBhZnRlciB0aGUKLSAqIGZsb3dzY3JpcHQgaXMgcmUtZW50ZXJlZCBhbmQgdG8gcGFzcyB0aGUgdXNlY2FzZSBwYXJhbWV0ZXJzIHRvIGEgSlggdGVtcGxhdGUuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFVzZWNhc2VQcm94eSB7Ci0KLSAgICBwcml2YXRlIE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZVVybDsKLSAgICBwcml2YXRlIFVzZWNhc2VWaWV3IHZpZXc7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSB1c2VjYXNlIFRoZSB1c2VjYXNlIHRvIGV4dHJhY3QgdGhlIHBhcmFtZXRlcnMgZnJvbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlY2FzZVByb3h5KFVzZWNhc2UgdXNlY2FzZSkgewotICAgICAgICB0aGlzLm5hbWUgPSB1c2VjYXNlLmdldE5hbWUoKTsKLQotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHVzZWNhc2UuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnB1dChuYW1lc1tpXSwgdXNlY2FzZS5nZXRQYXJhbWV0ZXIobmFtZXNbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlcyA9IHVzZWNhc2UuZ2V0RXJyb3JNZXNzYWdlcygpOwotICAgICAgICB0aGlzLmluZm9NZXNzYWdlcyA9IHVzZWNhc2UuZ2V0SW5mb01lc3NhZ2VzKCk7Ci0gICAgICAgIHRoaXMuc291cmNlVXJsID0gdXNlY2FzZS5nZXRTb3VyY2VVUkwoKTsKLSAgICAgICAgdGhpcy52aWV3ID0gdXNlY2FzZS5nZXRWaWV3KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgYSB1c2VjYXNlIGZyb20gdGhpcyBwcm94eS4KLSAgICAgKiBAcGFyYW0gdXNlY2FzZSBUaGUgdXNlY2FzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXR1cChVc2VjYXNlIHVzZWNhc2UpIHsKLSAgICAgICAgdXNlY2FzZS5zZXROYW1lKHRoaXMubmFtZSk7Ci0gICAgICAgIHVzZWNhc2Uuc2V0U291cmNlVVJMKHRoaXMuc291cmNlVXJsKTsKLSAgICAgICAgdXNlY2FzZS5zZXRWaWV3KHRoaXMudmlldyk7Ci0KLSAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBnZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB1c2VjYXNlLnNldFBhcmFtZXRlcihuYW1lc1tpXSwgcGFyYW1ldGVycy5nZXQobmFtZXNbaV0pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqIEByZXR1cm4gQW4gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlcnMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHBhcmFtZXRlciBpcyBub3Qgc2V0LgotICAgICAqIEByZXR1cm4gQW4gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHRoaXMucGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhcyBhIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICogQHJldHVybiBBIHN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFyYW1ldGVyIHdhcyBub3Qgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyQXNTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWVTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZVN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBwYXJhbWV0ZXIgbmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlck5hbWVzKCkgewotICAgICAgICBTZXQga2V5cyA9IHRoaXMucGFyYW1ldGVycy5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkga2V5cy50b0FycmF5KG5ldyBTdHJpbmdba2V5cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgZXJyb3JNZXNzYWdlczsKLSAgICBwcml2YXRlIExpc3QgaW5mb01lc3NhZ2VzOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgcHJldmlvdXMgb3BlcmF0aW9uLiBFcnJvciBtZXNzYWdlcyBwcmV2ZW50IHRoZSBvcGVyYXRpb24KLSAgICAgKiBmcm9tIGJlaW5nIGV4ZWN1dGVkLgotICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JNZXNzYWdlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmZvIG1lc3NhZ2VzIGZyb20gdGhlIHByZXZpb3VzIG9wZXJhdGlvbi4gSW5mbyBtZXNzYWdlcyBkbyBub3QgcHJldmVudCB0aGUKLSAgICAgKiBvcGVyYXRpb24gZnJvbSBiZWluZyBleGVjdXRlZC4KLSAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBzdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldEluZm9NZXNzYWdlcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5mb01lc3NhZ2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgdXNlY2FzZSBoYXMgZXJyb3IgbWVzc2FnZXMuIFByb3ZpZGVzIGEgd2F5IG9mIGNoZWNraW5nIGZvciBlcnJvcnMgd2l0aG91dAotICAgICAqIGFjdHVhbGx5IHJldHJpZXZpbmcgdGhlbS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHVzZWNhc2UgcmVzdWx0ZWQgaW4gZXJyb3IgbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkgewotICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwotICAgICAgICBpZiAodGhpcy5lcnJvck1lc3NhZ2VzICE9IG51bGwpCi0gICAgICAgICAgICByZXQgPSAhdGhpcy5lcnJvck1lc3NhZ2VzLmlzRW1wdHkoKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHVzZWNhc2UgaGFzIGluZm8gbWVzc2FnZXMuIFByb3ZpZGVzIGEgd2F5IG9mIGNoZWNraW5nIGZvciBpbmZvIG1lc3NhZ2VzCi0gICAgICogd2l0aG91dCBhY3R1YWxseSByZXRyaWV2aW5nIHRoZW0uCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB1c2VjYXNlIHJlc3VsdGVkIGluIGluZm8gbWVzc2FnZXMgYmVpbmcgZ2VuZXJhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0luZm9NZXNzYWdlcygpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHRoaXMuaW5mb01lc3NhZ2VzICE9IG51bGwpCi0gICAgICAgICAgICByZXQgPSAhdGhpcy5pbmZvTWVzc2FnZXMuaXNFbXB0eSgpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhpcyB1c2VjYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB2aWV3IG9mIHRoZSB1c2VjYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBVc2VjYXNlVmlldyBnZXRWaWV3KCkgewotICAgICAgICByZXR1cm4gdGhpcy52aWV3OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzZXNzaW9uIG9mIHRoZSB1c2VjYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiAoU2Vzc2lvbikgZ2V0UGFyYW1ldGVyKCJwcml2YXRlLnNlc3Npb24iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIG9uZSBvZiB0aGUgc3RyaW5ncyAidHJ1ZSIgb3IgImZhbHNlIiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIGNoZWNrYm94IHdhcyBjaGVja2VkLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9vbGVhbkNoZWNrYm94UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9ICJmYWxzZSI7Ci0gICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcobmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbVZhbHVlICE9IG51bGwgJiYgKHBhcmFtVmFsdWUuZXF1YWxzKCJvbiIpIHx8IHBhcmFtVmFsdWUuZXF1YWxzKCJ0cnVlIikpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJ0cnVlIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHNvdXJjZSBVUkwgb2YgdGhlIHVzZWNhc2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VVUkwoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZVVybDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2ltcGwvVXNlY2FzZVJlc29sdmVySW1wbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvaW1wbC9Vc2VjYXNlUmVzb2x2ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmY2FkM2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvaW1wbC9Vc2VjYXNlUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5jb250ZXh0LkNvbnRleHRVdGlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZy5QdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXI7Ci0KLS8qKgotICogVXNlY2FzZSByZXNvbHZlciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgVXNlY2FzZVJlc29sdmVySW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFVzZWNhc2VSZXNvbHZlciwKLSAgICAgICAgU2VydmljZWFibGUsIERpc3Bvc2FibGUsIFRocmVhZFNhZmUgewotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlY2FzZVJlc29sdmVySW1wbCgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgX21hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gX21hbmFnZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VTZWxlY3RvciBnZXRTZWxlY3RvcigpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5zZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoVXNlY2FzZS5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VSZXNvbHZlciNyZWxlYXNlKG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKFVzZWNhc2UgdXNlY2FzZSkgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAodXNlY2FzZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdXNlY2FzZSB0byByZWxlYXNlIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0U2VsZWN0b3IoKS5yZWxlYXNlKHVzZWNhc2UpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAodGhpcy5zZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZSh0aGlzLnNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHB1YmxpY2F0aW9uLW92ZXJyaWRkZW4gdXNlY2FzZSB0byBiZSByZXNvbHZlZC4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSB3ZWIgYXBwbGljYXRpb24gVVJMLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBwbGFpbiB1c2VjYXNlIG5hbWUuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlY2FzZU5hbWUoU3RyaW5nIHdlYmFwcFVybCwgZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5ld05hbWUgPSBudWxsOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gZ2V0UHVibGljYXRpb24od2ViYXBwVXJsKTsKLSAgICAgICAgaWYgKHB1YmxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyIHRlbXBsYXRlTWFuYWdlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRlbXBsYXRlTWFuYWdlciA9IChQdWJsaWNhdGlvblRlbXBsYXRlTWFuYWdlcikgdGhpcy5tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAubG9va3VwKFB1YmxpY2F0aW9uVGVtcGxhdGVNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgICAgIG5ld05hbWUgPSAoU3RyaW5nKSB0ZW1wbGF0ZU1hbmFnZXIuZ2V0U2VsZWN0YWJsZUhpbnQocHVibGljYXRpb24sIGdldFNlbGVjdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHRlbXBsYXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3TmFtZSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNhdGlvbiB0aGUgdXNlY2FzZSB3YXMgaW52b2tlZCBpbi4KLSAgICAgKiBAcGFyYW0gd2ViYXBwVXJsIFRoZSB3ZWIgYXBwbGljYXRpb24gVVJMLgotICAgICAqIEByZXR1cm4gQSBwdWJsaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24oU3RyaW5nIHdlYmFwcFVybCkgewotICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IG51bGw7Ci0gICAgICAgIENvbnRleHRVdGlsaXR5IHV0aWwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXRpbCA9IChDb250ZXh0VXRpbGl0eSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChDb250ZXh0VXRpbGl0eS5ST0xFKTsKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IHV0aWwuZ2V0UmVxdWVzdCgpOwotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudFV0aWwuZ2V0RG9jdW1lbnRGYWN0b3J5KHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24od2ViYXBwVXJsKTsKLSAgICAgICAgICAgIFN0cmluZyBwdWJJZCA9IGluZm8uZ2V0UHVibGljYXRpb25JZCgpOwotCi0gICAgICAgICAgICBpZiAocHViSWQgIT0gbnVsbCAmJiBmYWN0b3J5LmV4aXN0c1B1YmxpY2F0aW9uKHB1YklkKSkgewotICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh1dGlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZSh1dGlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHVibGljYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VSZXNvbHZlciNyZXNvbHZlKGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBVc2VjYXNlIHJlc29sdmUoU3RyaW5nIHdlYmFwcFVybCwgU3RyaW5nIG5hbWUpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHVzZWNhc2VOYW1lID0gZ2V0VXNlY2FzZU5hbWUod2ViYXBwVXJsLCBuYW1lKTsKLSAgICAgICAgVXNlY2FzZSB1c2VjYXNlID0gKFVzZWNhc2UpIGdldFNlbGVjdG9yKCkuc2VsZWN0KHVzZWNhc2VOYW1lKTsKLSAgICAgICAgdXNlY2FzZS5zZXROYW1lKG5hbWUpOwotICAgICAgICB1c2VjYXNlLnNldFNvdXJjZVVSTCh3ZWJhcHBVcmwpOwotICAgICAgICByZXR1cm4gdXNlY2FzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZVJlc29sdmVyI2lzUmVnaXN0ZXJlZChqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoU3RyaW5nIHdlYmFwcFVybCwgU3RyaW5nIG5hbWUpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHVzZWNhc2VOYW1lID0gZ2V0VXNlY2FzZU5hbWUod2ViYXBwVXJsLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuaXNTZWxlY3RhYmxlKHVzZWNhc2VOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCB1c2VjYXNlcyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFVzZWNhc2VOYW1lcygpIHsKLSAgICAgICAgaWYgKHRoaXMudXNlY2FzZU5hbWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHVzZWNhc2UgcmVnaXN0ZXJlZCEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSB0aGlzLnVzZWNhc2VOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy51c2VjYXNlTmFtZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTb3J0ZWRTZXQgdXNlY2FzZU5hbWVzOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyB1c2VjYXNlTmFtZSkgewotICAgICAgICBpZiAodGhpcy51c2VjYXNlTmFtZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy51c2VjYXNlTmFtZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudXNlY2FzZU5hbWVzLmFkZCh1c2VjYXNlTmFtZSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvaW1wbC9Vc2VjYXNlU2VsZWN0b3IuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL2ltcGwvVXNlY2FzZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTVlMGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UvaW1wbC9Vc2VjYXNlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5TdGFydGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnRocmVhZC5UaHJlYWRTYWZlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuRXh0ZW5kZWRDb21wb25lbnRTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VSZXNvbHZlcjsKLQotLyoqCi0gKiBVc2VjYXNlIHNlbGVjdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVXNlY2FzZVNlbGVjdG9yIGV4dGVuZHMgRXh0ZW5kZWRDb21wb25lbnRTZWxlY3RvciBpbXBsZW1lbnRzIFRocmVhZFNhZmUsIFN0YXJ0YWJsZSwgU2VydmljZWFibGUgewotICAgIAotICAgIHByaXZhdGUgU29ydGVkU2V0IHVzZWNhc2VOYW1lczsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgdXNlY2FzZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRVc2VjYXNlTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHRoaXMudXNlY2FzZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLnVzZWNhc2VOYW1lcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlKGNvbmZpZyk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnVzZWNhc2VOYW1lcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25bXSB1c2VjYXNlQ29uZmlncyA9IGNvbmZpZy5nZXRDaGlsZHJlbigiY29tcG9uZW50LWluc3RhbmNlIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNlY2FzZUNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRoaXMudXNlY2FzZU5hbWVzLmFkZCh1c2VjYXNlQ29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVc2VjYXNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoVXNlY2FzZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFVzZWNhc2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMudXNlY2FzZU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlci5yZWdpc3RlcigoU3RyaW5nKSBpLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL3NjaGVkdWxpbmcvTWFuYWdlSm9icy5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2Uvc2NoZWR1bGluZy9NYW5hZ2VKb2JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTUyOWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2Uvc2NoZWR1bGluZy9NYW5hZ2VKb2JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5zY2hlZHVsaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5jcm9uLkpvYlNjaGVkdWxlckVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gbWFuYWdlIHNjaGVkdWxlZCBqb2JzLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW5hZ2VKb2JzIGV4dGVuZHMgRG9jdW1lbnRVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQlMgPSAiam9icyI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2luaXRQYXJhbWV0ZXJzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLQotICAgICAgICBVc2VjYXNlU2NoZWR1bGVyIHNjaGVkdWxlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzY2hlZHVsZXIgPSAoVXNlY2FzZVNjaGVkdWxlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChVc2VjYXNlU2NoZWR1bGVyLlJPTEUpOwotICAgICAgICAgICAgSm9iU2NoZWR1bGVyRW50cnlbXSBqb2JzID0gc2NoZWR1bGVyLmdldEpvYnMoKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihKT0JTLCBBcnJheXMuYXNMaXN0KGpvYnMpKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzY2hlZHVsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNjaGVkdWxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2Uvc2NoZWR1bGluZy9Vc2VjYXNlU2NoZWR1bGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9zY2hlZHVsaW5nL1VzZWNhc2VTY2hlZHVsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiZDJiYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9zY2hlZHVsaW5nL1VzZWNhc2VTY2hlZHVsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnNjaGVkdWxpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuY3Jvbi5Kb2JTY2hlZHVsZXJFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2U7Ci0KLS8qKgotICogU2VydmljZSB0byBzY2hlZHVsZSB1c2VjYXNlcy4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVzZWNhc2VTY2hlZHVsZXIgewotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBBdmFsb24gcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IFVzZWNhc2VTY2hlZHVsZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogU2NoZWR1bGVzIGEgdXNlY2FzZSBhdCBhIGNlcnRhaW4gZGF0ZS4KLSAgICAgKiBAcGFyYW0gdXNlY2FzZSBUaGUgdXNlY2FzZS4KLSAgICAgKiBAcGFyYW0gZGF0ZSBUaGUgaW52b2NhdGlvbiBkYXRlLgotICAgICAqLwotICAgIHZvaWQgc2NoZWR1bGUoVXNlY2FzZSB1c2VjYXNlLCBEYXRlIGRhdGUpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWxsIHNjaGVkdWxlZCBqb2JzLgotICAgICAqLwotICAgIEpvYlNjaGVkdWxlckVudHJ5W10gZ2V0Sm9icygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2Uvc2NoZWR1bGluZy9pbXBsL1VzZWNhc2VDcm9uSm9iLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9zY2hlZHVsaW5nL2ltcGwvVXNlY2FzZUNyb25Kb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3ODlmNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9zY2hlZHVsaW5nL2ltcGwvVXNlY2FzZUNyb25Kb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5zY2hlZHVsaW5nLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29jb29uQ29tcG9uZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5jcm9uLkNvbmZpZ3VyYWJsZUNyb25Kb2I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5jcm9uLlNlcnZpY2VhYmxlQ3JvbkpvYjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuY29tbWFuZGxpbmUuQ29tbWFuZExpbmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLk1hY2hpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUludm9rZXI7Ci0KLS8qKgotICogSm9iIHRvIHNjaGVkdWxlIHVzZWNhc2UgZXhlY3V0aW9uLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VjYXNlQ3JvbkpvYiBleHRlbmRzIFNlcnZpY2VhYmxlQ3JvbkpvYiBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZUNyb25Kb2IsCi0gICAgICAgIENvbnRleHR1YWxpemFibGUgewotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIGpvYi4KLSAgICAgKiBAcGFyYW0gdXNlY2FzZSBUaGUgdXNlY2FzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXR1cChVc2VjYXNlIHVzZWNhc2UpIHsKLSAgICAgICAgdGhpcy51c2VjYXNlTmFtZSA9IHVzZWNhc2UuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmdbXSBrZXlzID0gdXNlY2FzZS5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5wdXQoa2V5c1tpXSwgdXNlY2FzZS5nZXRQYXJhbWV0ZXIoa2V5c1tpXSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXNlY2FzZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlVXJsOwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJJZDsKLSAgICBwcml2YXRlIFN0cmluZyBtYWNoaW5lSXA7Ci0KLSAgICBwcml2YXRlIE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUNBU0VfTkFNRSA9ICJ1c2VjYXNlTmFtZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1VSTCA9ICJzb3VyY2VVcmwiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfSUQgPSAidXNlcklkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUNISU5FX0lQID0gIm1hY2hpbmVJcCI7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSB1c2VjYXNlIHRvIGV4ZWN1dGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VjYXNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXNlY2FzZU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIElEIG9mIHRoZSB1c2VyIHdobyBzY2hlZHVsZWQgdGhlIGpvYi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXNlcklkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlVVJMKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VVcmw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRoaXMucGFyYW1ldGVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLmNyb24uQ3JvbkpvYiNleGVjdXRlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShTdHJpbmcgam9ibmFtZSkgewotICAgICAgICBVc2VjYXNlSW52b2tlciBpbnZva2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldHVwT3JpZ2luYWxSZXF1ZXN0KCk7Ci0gICAgICAgICAgICBhdXRob3JpemVSZXF1ZXN0KCk7Ci0KLSAgICAgICAgICAgIGludm9rZXIgPSAoVXNlY2FzZUludm9rZXIpIHRoaXMubWFuYWdlci5sb29rdXAoVXNlY2FzZUludm9rZXIuUk9MRSk7Ci0gICAgICAgICAgICBpbnZva2VyLmludm9rZShnZXRTb3VyY2VVUkwoKSwgZ2V0VXNlY2FzZU5hbWUoKSwgZ2V0UGFyYW1ldGVycygpKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW52b2tlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoaW52b2tlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHJlcXVlc3Qgb2JqZWN0IGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHdoaWNoCi0gICAgICogdHJpZ2dlcmVkIHRoZSB1c2VjYXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwT3JpZ2luYWxSZXF1ZXN0KCkgewotICAgICAgICBFbnZpcm9ubWVudCBlbnYgPSBDb2Nvb25Db21wb25lbnRNYW5hZ2VyLmdldEN1cnJlbnRFbnZpcm9ubWVudCgpOwotCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLmNvbnRleHQpOwotICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlTmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChrZXksIHJlcXVlc3QuZ2V0QXR0cmlidXRlKGtleSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIHJlcXVlc3RQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnB1dChrZXksIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKGtleSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIG9iamVjdE1vZGVsID0gQ29udGV4dEhlbHBlci5nZXRPYmplY3RNb2RlbCh0aGlzLmNvbnRleHQpOwotICAgICAgICBvYmplY3RNb2RlbC5wdXQoT2JqZWN0TW9kZWxIZWxwZXIuUkVRVUVTVF9PQkpFQ1QsIG5ldyBDb21tYW5kTGluZVJlcXVlc3QoZW52LAotICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCksCi0gICAgICAgICAgICAgICAgZ2V0U291cmNlVVJMKCksCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBzZXNzaW9uIHdpdGggdGhlIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIGlmIHRoZSBhY2Nlc3MgY29udHJvbGxlciByZXNvbHZlciBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhdXRob3JpemVSZXF1ZXN0KCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciBhY1Jlc29sdmVyID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlciBjb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuUk9MRQotICAgICAgICAgICAgICAgICAgICArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgYWNSZXNvbHZlciA9IChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIpIHNlbGVjdG9yLnNlbGVjdChBY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXIuREVGQVVMVF9SRVNPTFZFUik7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gYWNSZXNvbHZlci5yZXNvbHZlQWNjZXNzQ29udHJvbGxlcihnZXRTb3VyY2VVUkwoKSk7Ci0KLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBZGQgaWRlbnRpdHkgdG8gc2Vzc2lvbiIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVzZXIgSUQ6IFsiICsgdGhpcy51c2VySWQgKyAiXSIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIk1hY2hpbmU6IFsiICsgdGhpcy5tYWNoaW5lSXAgKyAiXSIpOwotCi0gICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QodGhpcy5jb250ZXh0KTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuc2V0dXBJZGVudGl0eShyZXF1ZXN0KTsKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0gICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IChJZGVudGl0eSkgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIElkZW50aWZpYWJsZVtdIGlkZW50aWZpYWJsZXMgPSBpZGVudGl0eS5nZXRJZGVudGlmaWFibGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkZW50aWZpYWJsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZGVudGl0eS5yZW1vdmVJZGVudGlmaWFibGUoaWRlbnRpZmlhYmxlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyID0gY29udHJvbGxlci5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0VXNlck1hbmFnZXIoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnVzZXJJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVXNlciB1c2VyID0gdXNlck1hbmFnZXIuZ2V0VXNlcih0aGlzLnVzZXJJZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVc2VyIFsiICsgdGhpcy51c2VySWQgKyAiXSBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZGVudGl0eS5hZGRJZGVudGlmaWFibGUodXNlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5tYWNoaW5lSXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1hY2hpbmUgbWFjaGluZSA9IG5ldyBNYWNoaW5lKHRoaXMubWFjaGluZUlwKTsKLSAgICAgICAgICAgICAgICBpZGVudGl0eS5hZGRJZGVudGlmaWFibGUobWFjaGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnRyb2xsZXIuYXV0aG9yaXplKHJlcXVlc3QpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChhY1Jlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWNSZXNvbHZlci5yZWxlYXNlKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2UoYWNSZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLmNyb24uQ29uZmlndXJhYmxlQ3JvbkpvYiNzZXR1cChvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzLAotICAgICAqICAgICAgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXR1cChQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsIE1hcCBvYmplY3RzKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycy5wdXRBbGwoUGFyYW1ldGVycy50b1Byb3BlcnRpZXMocGFyYW1ldGVycykpOwotICAgICAgICB0aGlzLnVzZWNhc2VOYW1lID0gKFN0cmluZykgb2JqZWN0cy5nZXQoVVNFQ0FTRV9OQU1FKTsKLSAgICAgICAgdGhpcy5zb3VyY2VVcmwgPSAoU3RyaW5nKSBvYmplY3RzLmdldChTT1VSQ0VfVVJMKTsKLSAgICAgICAgdGhpcy51c2VySWQgPSAoU3RyaW5nKSBvYmplY3RzLmdldChVU0VSX0lEKTsKLSAgICAgICAgdGhpcy5tYWNoaW5lSXAgPSAoU3RyaW5nKSBvYmplY3RzLmdldChNQUNISU5FX0lQKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbnRleHQgY29udGV4dDsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZSNjb250ZXh0dWFsaXplKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udGV4dHVhbGl6ZShDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb250ZXh0RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS9zY2hlZHVsaW5nL2ltcGwvVXNlY2FzZVNjaGVkdWxlckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL3NjaGVkdWxpbmcvaW1wbC9Vc2VjYXNlU2NoZWR1bGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U1ZTMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlL3NjaGVkdWxpbmcvaW1wbC9Vc2VjYXNlU2NoZWR1bGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnNjaGVkdWxpbmcuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuY3Jvbi5Dcm9uSm9iOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuY3Jvbi5Kb2JTY2hlZHVsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5jcm9uLkpvYlNjaGVkdWxlckVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuTWFjaGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2Uuc2NoZWR1bGluZy5Vc2VjYXNlU2NoZWR1bGVyOwotCi0vKioKLSAqIDxwPgotICogVXNlY2FzZSBzY2hlZHVsZXIgaW1wbGVtZW50YXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBuYW1lcyBvZiB0aGUgc2NoZWR1bGVkIGpvYnMgaGF2ZSB0aGUgc3ludGF4Ci0gKiA8Y29kZT57dXNlY2FzZU5hbWV9Ont1c2VySWR9PC9jb2RlPi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgVXNlY2FzZVNjaGVkdWxlckltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBVc2VjYXNlU2NoZWR1bGVyLAotICAgICAgICBTZXJ2aWNlYWJsZSwgQ29udGV4dHVhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2Uuc2NoZWR1bGluZy5Vc2VjYXNlU2NoZWR1bGVyI3NjaGVkdWxlKG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSwKLSAgICAgKiAgICAgIGphdmEudXRpbC5EYXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlKFVzZWNhc2UgdXNlY2FzZSwgRGF0ZSBkYXRlKSB7Ci0gICAgICAgIEpvYlNjaGVkdWxlciBzY2hlZHVsZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2NoZWR1bGVyID0gKEpvYlNjaGVkdWxlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChKb2JTY2hlZHVsZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHVzZWNhc2UuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB1c2VjYXNlLmdldFBhcmFtZXRlcihuYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UGFyYW1ldGVyKG5hbWVzW2ldLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyYW1ldGVyIFsiICsgbmFtZXNbaV0gKyAiXSA9IFsiICsgdmFsdWUgKyAiXSAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBpZ25vcmVkLCBvbmx5IHN0cmluZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hcCBvYmplY3RzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIG9iamVjdHMucHV0KFVzZWNhc2VDcm9uSm9iLlVTRUNBU0VfTkFNRSwgdXNlY2FzZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgb2JqZWN0cy5wdXQoVXNlY2FzZUNyb25Kb2IuU09VUkNFX1VSTCwgdXNlY2FzZS5nZXRTb3VyY2VVUkwoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB1c2VySWQgPSAiIjsKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLmNvbnRleHQpOwotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IChJZGVudGl0eSkgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoSWRlbnRpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaWRlbnRpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyIHVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZCA9IHVzZXIuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMucHV0KFVzZWNhc2VDcm9uSm9iLlVTRVJfSUQsIHVzZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTWFjaGluZSBtYWNoaW5lID0gaWRlbnRpdHkuZ2V0TWFjaGluZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWFjaGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLnB1dChVc2VjYXNlQ3JvbkpvYi5NQUNISU5FX0lQLCBtYWNoaW5lLmdldElwKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgcm9sZSA9IENyb25Kb2IuY2xhc3MuZ2V0TmFtZSgpICsgIi91c2VjYXNlIjsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0Sm9iTmFtZSh1c2VjYXNlLCB1c2VySWQpOwotICAgICAgICAgICAgc2NoZWR1bGVyLmZpcmVKb2JBdChkYXRlLCBuYW1lLCByb2xlLCBwYXJhbWV0ZXJzLCBvYmplY3RzKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgam9iOiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNjaGVkdWxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2NoZWR1bGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9iTmFtZShVc2VjYXNlIHVzZWNhc2UsIFN0cmluZyB1c2VySWQpIHsKLSAgICAgICAgcmV0dXJuIHVzZWNhc2UuZ2V0TmFtZSgpICsgIjoiICsgdXNlcklkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGV4dCBjb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0dWFsaXphYmxlI2NvbnRleHR1YWxpemUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0dWFsaXplKENvbnRleHQgY29udGV4dCkgdGhyb3dzIENvbnRleHRFeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5zY2hlZHVsaW5nLlVzZWNhc2VTY2hlZHVsZXIjZ2V0Sm9icygpCi0gICAgICovCi0gICAgcHVibGljIEpvYlNjaGVkdWxlckVudHJ5W10gZ2V0Sm9icygpIHsKLSAgICAgICAgSm9iU2NoZWR1bGVyIHNjaGVkdWxlciA9IG51bGw7Ci0gICAgICAgIEpvYlNjaGVkdWxlckVudHJ5W10gZW50cmllcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzY2hlZHVsZXIgPSAoSm9iU2NoZWR1bGVyKSB0aGlzLm1hbmFnZXIubG9va3VwKEpvYlNjaGVkdWxlci5ST0xFKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gam9iTmFtZXMgPSBzY2hlZHVsZXIuZ2V0Sm9iTmFtZXMoKTsKLSAgICAgICAgICAgIGVudHJpZXMgPSBuZXcgSm9iU2NoZWR1bGVyRW50cnlbam9iTmFtZXMubGVuZ3RoXTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEpvYlNjaGVkdWxlckVudHJ5IGVudHJ5ID0gc2NoZWR1bGVyLmdldEpvYlNjaGVkdWxlckVudHJ5KGpvYk5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICBlbnRyaWVzW2ldID0gZW50cnk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJDb3VsZCBub3Qgb2J0YWluIGpvYiBsaXN0OiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNjaGVkdWxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2NoZWR1bGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cmllczsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS94bWwvVXNlY2FzZUVycm9ySGFuZGxlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2UveG1sL1VzZWNhc2VFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzZDU0ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZS94bWwvVXNlY2FzZUVycm9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlOwotCi1pbXBvcnQgY29tLnRoYWlvcGVuc291cmNlLnhtbC5zYXguRXJyb3JIYW5kbGVySW1wbDsKLQotLyoqCi0gKiBFcnJvciBoYW5kbGVyIHdoaWNoIG91dHB1dHMgaXRzIGVycm9ycyB0byB1c2VjYXNlIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgVXNlY2FzZUVycm9ySGFuZGxlciBleHRlbmRzIEVycm9ySGFuZGxlckltcGwgewotICAgIAotICAgIHByaXZhdGUgQWJzdHJhY3RVc2VjYXNlIHVzZWNhc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gdXNlY2FzZSBUaGUgdXNlY2FzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXNlY2FzZUVycm9ySGFuZGxlcihBYnN0cmFjdFVzZWNhc2UgdXNlY2FzZSkgewotICAgICAgICB0aGlzLnVzZWNhc2UgPSB1c2VjYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMudXNlY2FzZS5hZGRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmZDVlMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDczOTUgMjAwNi0wOS0xOCAxMzowMTozM1ogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotICANCi0gIDxtZXNzYWdlIGtleT0iY291bGQtbm90LWV4ZWN1dGUtdXNlY2FzZSI+Q291bGQgbm90IGV4ZWN1dGUgdXNlY2FzZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJvYmplY3RzLWNoZWNrZWQtb3V0Ij4KLSAgICBJbnZvbHZlZCBvYmplY3RzIGFyZSBjaGVja2VkIG91dC4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFjY2VzcyBkZW5pZWQiPkFjY2VzcyBkZW5pZWQ8L21lc3NhZ2U+Ci0gIAotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNWQ3NmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aS54bWwgNDQ3Mzk1IDIwMDYtMDktMTggMTM6MDE6MzNaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJkZSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLSAgDQotICA8bWVzc2FnZSBrZXk9ImNvdWxkLW5vdC1leGVjdXRlLXVzZWNhc2UiPkRlciBVc2VjYXNlIGtvbm50ZSBuaWNodCBhdXNnZWbDvGhydCB3ZXJkZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ib2JqZWN0cy1jaGVja2VkLW91dCI+Ci0gICAgQmV0ZWlsaWd0ZSBPYmpla3RlIHNpbmQgYXVzZ2VjaGVja3QuCi0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBY2Nlc3MgZGVuaWVkIj5adWdyaWZmIHZlcndlaWdlcnQ8L21lc3NhZ2U+Ci0gIAotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3RlbXBsYXRlcy9lcnJvci5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS90ZW1wbGF0ZXMvZXJyb3IuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZWQ5MDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3RlbXBsYXRlcy9lcnJvci5qeAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbG9naW4uanggNDk2Njk3IDIwMDctMDEtMTYgMTQ6MTI6MzZaIGFuZHJlYXMgJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLQotICA8ang6c2V0IHZhcj0icHViSWQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyQXNTdHJpbmcoJ3B1YmxpY2F0aW9uSWQnKX0iLz4KLQotICA8cGFnZTp0aXRsZT4KLSAgICA8aTE4bjp0ZXh0PmNvdWxkLW5vdC1leGVjdXRlLXVzZWNhc2U8L2kxOG46dGV4dD4KLSAgPC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhlZmIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08ang6dGVtcGxhdGUgbmFtZT0ibWVzc2FnZXMiCi0gICAgICAgICAgIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0KLSAgPCEtLSAKLSAgICAgTm90ZTogaW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgJHt1c2VjYXNlfSByZWZlcnMgdG8gYW4gCi0gICAgIGluc3RhbmNlIG9mIFVzZWNhc2VQcm94eSwgbm90IG9mIFVzZWNhc2UgIQotICAgICAtLT4KLSAgPGp4OmlmIHRlc3Q9IiR7dXNlY2FzZS5oYXNFcnJvcnMoKSB8fCB1c2VjYXNlLmhhc0luZm9NZXNzYWdlcygpfSI+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtZXJyb3IiPgotICAgICAgPHVsPgotICAgICAgICAKLSAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJtZXNzYWdlIiBpdGVtcz0iJHt1c2VjYXNlLmdldEVycm9yTWVzc2FnZXMoKX0iPgotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgPGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke21lc3NhZ2UuZ2V0TWVzc2FnZSgpfSIvPjwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke21lc3NhZ2UuaGFzUGFyYW1ldGVycygpfSI+IAotICAgICAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InBhcmFtIiBpdGVtcz0iJHttZXNzYWdlLmdldFBhcmFtZXRlcnMoKX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgPGkxOG46cGFyYW0+PGp4Om91dCB2YWx1ZT0iJHtwYXJhbX0iLz48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8L2xpPgotICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgIAotICAgICAgICA8ang6Zm9yRWFjaCB2YXI9Im1lc3NhZ2UiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0SW5mb01lc3NhZ2VzKCl9Ij4KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHttZXNzYWdlLmdldE1lc3NhZ2UoKX0iLz48L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgICA8ang6aWYgdGVzdD0iJHttZXNzYWdlLmhhc1BhcmFtZXRlcnMoKX0iPiAKLSAgICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJwYXJhbSIgaXRlbXM9IiR7bWVzc2FnZS5nZXRQYXJhbWV0ZXJzKCl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpMThuOnBhcmFtPjxqeDpvdXQgdmFsdWU9IiR7cGFyYW19Ii8+PC9pMThuOnBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgPC9saT4KLSAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAKLSAgICAgIDwvdWw+Ci0gICAgPC9kaXY+Ci0gIDwvang6aWY+Ci0KLTwvang6dGVtcGxhdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3RlbXBsYXRlcy90YWJzLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTRmMjZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS90ZW1wbGF0ZXMvdGFicy5qeAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdGFicy5qeCAyMjczOTYgMjAwNS0wOC0wNCAxMzoxMzozNVogYW5kcmVhcyAkIC0tPgotCi08ang6dGVtcGxhdGUKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICBuYW1lPSIiPgotICAKLSAgPGRpdiBjbGFzcz0ibGVueWEtdGFicyI+Ci0gICAgPGp4OnNldCB2YXI9InVzZWNhc2VUYWIiIHZhbHVlPSIke3VzZWNhc2UuZ2V0VmlldygpLmdldFRhYigpfSIvPgotICAgIDxqeDpmb3JFYWNoIHZhcj0idGFiIiBpdGVtcz0iJHt1c2VjYXNlLmdldFZpZXcoKS5nZXRUYWJzSW5Hcm91cCgpfSI+Ci0gICAgICA8ang6Y2hvb3NlPgotICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2VUYWIuZ2V0TmFtZSgpLmVxdWFscyh0YWIuZ2V0TmFtZSgpKX0iPgotICAgICAgICAgIDxhIGhyZWY9Ij9sZW55YS51c2VjYXNlPSR7dGFiLmdldFVzZWNhc2UoKX0iIGNsYXNzPSJsZW55YS10YWJsaW5rLWFjdGl2ZSI+PGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke3RhYi5nZXRMYWJlbCgpfSIvPjwvaTE4bjp0ZXh0PjwvYT4KLSAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgIDxhIGhyZWY9Ij9sZW55YS51c2VjYXNlPSR7dGFiLmdldFVzZWNhc2UoKX0iIGNsYXNzPSJsZW55YS10YWJsaW5rIj48aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7dGFiLmdldExhYmVsKCl9Ii8+PC9pMThuOnRleHQ+PC9hPgotICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgIDwvang6Y2hvb3NlPgotICAgIDwvang6Zm9yRWFjaD4KLSAgPC9kaXY+Ci08L2p4OnRlbXBsYXRlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3VzZWNhc2UueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS91c2VjYXNlLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMDNjNTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS91c2VjYXNlL3VzZWNhc2UueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotPCEtLQotICAgIFRoaXMgc2l0ZW1hcCBoYW5kbGVzIGNhbGxzIHRvIHVzZWNhc2VzIHdoaWNoIGFyZSByZWdpc3RlcmVkIGluIHRoZQotICAgIHVzZWNhc2UgZnJhbWV3b3JrLgotLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLSAgPG1hcDpjb21wb25lbnRzPgotICAgIDxtYXA6dHJhbnNmb3JtZXJzIGRlZmF1bHQ9InhzbHQiPiAgICAKLSAgICAgIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0iYnJvd3Nlci11cGRhdGUiIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uYWpheC5Ccm93c2VyVXBkYXRlVHJhbnNmb3JtZXIiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0idXNlY2FzZS1wcm94eSIgbG9nZ2VyPSJsZW55YS5zaXRlbWFwLnRyYW5zZm9ybWVyLnByb3h5IgotICAgICAgICBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5Qcm94eVRyYW5zZm9ybWVyIj4KLSAgICAgICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL3Byb3h5LzEuMCIgZWxlbWVudD0idXJsIiBhdHRyaWJ1dGU9ImhyZWYiLz4KLSAgICAgIDwvbWFwOnRyYW5zZm9ybWVyPgotICAgIDwvbWFwOnRyYW5zZm9ybWVycz4KLSAgICA8bWFwOnNlbGVjdG9ycz4KLSAgICAgIDxtYXA6c2VsZWN0b3IgbmFtZT0iYWpheC1yZXF1ZXN0IiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLmFqYXguQWpheFJlcXVlc3RTZWxlY3RvciIvPgotICAgIDwvbWFwOnNlbGVjdG9ycz4KLSAgPC9tYXA6Y29tcG9uZW50cz4KLSAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEZsb3dTY3JpcHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8bWFwOmZsb3cgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIDxtYXA6c2NyaXB0IHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdXNlY2FzZXMuanMiLz4KLSAgPC9tYXA6Zmxvdz4KLSAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFBpcGVsaW5lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8bWFwOnBpcGVsaW5lcz4KLSAgICAKLSAgICA8bWFwOnBpcGVsaW5lIHR5cGU9Im5vbmNhY2hpbmciIGludGVybmFsLW9ubHk9InRydWUiPgotICAgICAgPCEtLSAKLSAgICAgICAgVGhpcyBpbnRlcm5hbCBwaXBlbGluZSByZW5kZXJzIHRoZSB1c2VjYXNlLCBvbmNlIHRoZQotICAgICAgICBleGVjdXRlVXNlY2FzZSgpIGZsb3dzY3JpcHQgaGFzIGNvbXBsZXRlZCBhbmQgaXNzdWVkIGEgcmVkaXJlY3QsCi0gICAgICAgIHdoaWNoIGlzIG1hdGNoZWQgaGVyZS4KLSAgICAgICAgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InVzZWNhc2VzLXZpZXcvKi8qKiI+Ci0gICAgICAgIAotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9Imp4IiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvezJ9Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImJyb3dzZXItdXBkYXRlIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImNpbmNsdWRlIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImZvcm1zIiAvPgotICAgICAgICAKLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0idXNlY2FzZS1wcm94eSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9InhzbHQvcHJveHlVcmwydGV4dC54c2wiLz4KLSAgICAgICAgCi0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iY29jb29uOi8vbGVueWEtc2NyZWVuLnhzbCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPCEtLSBTdHJpcCB4aHRtbCBuYW1lc3BhY2UgZnJvbSA8aGVhZD4gYW5kIDxib2R5PiBlbGVtZW50IC0tPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9jZm9ybXMvc3RyaXAteGh0bWwtbmFtZXNwYWNlLnhzbCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9jZm9ybXMvZm9ybXMtc2FtcGxlcy1zdHlsaW5nLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VzLXVyaSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmNvbnRleHQtcHJlZml4fS9jZm9ybXMiLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9jZm9ybXMvYWRkLXhodG1sLW5hbWVzcGFjZS54c2wiLz4KLSAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJ1c2VjYXNlcy12aWV3L21lbnUvKioiPgotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iY29jb29uOi8vbGVueWEtcGFnZS97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0vZGVmYXVsdC54bWwiLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9ImFqYXgtcmVxdWVzdCI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9InRydWUiPgotICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJyZXF1ZXN0LXBhcmFtZXRlciI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyLW5hbWUiIHZhbHVlPSJhc1hNTCIvPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgIDwvbWFwOnNlbGVjdD4KLSAgICAgICAgCi0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2wiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieGh0bWwiLz4KLQotICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVxdWVzdC1wYXJhbWV0ZXIiIHBhdHRlcm49ImxlbnlhLmNvbnRpbnVhdGlvbiI+Ci0gICAgICAgIDxtYXA6Y2FsbCBjb250aW51YXRpb249InsxfSIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICA8bWFwOm1hdGNoIHR5cGU9InVzZWNhc2UiIHBhdHRlcm49IioiPgotICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249ImV4ZWN1dGVVc2VjYXNlIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1c2VjYXNlTmFtZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOmxlbnlhLnVzZWNhc2V9Ii8+Ci0gICAgICAgIDwvbWFwOmNhbGw+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotCQotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS91c2VjYXNlcy5qcyBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS91c2VjYXNlcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyZDEwNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UvdXNlY2FzZXMuanMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAkSWQkICovCi0gCi1jb2Nvb24ubG9hZCgicmVzb3VyY2U6Ly9vcmcvYXBhY2hlL2NvY29vbi9mb3Jtcy9mbG93L2phdmFzY3JpcHQvRm9ybS5qcyIpOwotaW1wb3J0UGFja2FnZShQYWNrYWdlcy5vcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nKQotCi0vL3BsYWNlaG9sZGVycyBmb3IgY3VzdG9tIGZsb3cgY29kZToKLXZhciBjdXN0b21Mb29wRmxvdyA9IHVuZGVmaW5lZDsKLXZhciBjdXN0b21TdWJtaXRGbG93ID0gdW5kZWZpbmVkOwotCi0vKioKLSAqIEdldCB1c2VjYXNlLgotICoKLSAqIEBwYXJhbSB1c2VjYXNlTmFtZSwgYSBzdHJpbmcKLSAqIEByZXR1cm4gYSBuZXcgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlIEF2YWxvbiBjb21wb25lbnQKLSAqLwotZnVuY3Rpb24gZ2V0VXNlY2FzZSh1c2VjYXNlTmFtZSkgewotICAgIHZhciBmbG93SGVscGVyOwotICAgIHZhciByZXF1ZXN0OwotICAgIHZhciBzb3VyY2VVcmw7Ci0gICAgdmFyIHVzZWNhc2VSZXNvbHZlcjsKLSAgICB2YXIgdXNlY2FzZTsKLSAgICB0cnkgewotICAgICAgICBmbG93SGVscGVyID0gY29jb29uLmdldENvbXBvbmVudCgib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmZsb3cuRmxvd0hlbHBlciIpOwotICAgICAgICByZXF1ZXN0ID0gZmxvd0hlbHBlci5nZXRSZXF1ZXN0KGNvY29vbik7Ci0gICAgICAgIHNvdXJjZVVybCA9IFBhY2thZ2VzLm9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgdXNlY2FzZVJlc29sdmVyID0gY29jb29uLmdldENvbXBvbmVudCgib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXIiKTsKLSAgICAgICAgdXNlY2FzZSA9IHVzZWNhc2VSZXNvbHZlci5yZXNvbHZlKHNvdXJjZVVybCwgdXNlY2FzZU5hbWUpOwotICAgICAgICB1c2VjYXNlLnNldFNvdXJjZVVSTChzb3VyY2VVcmwpOwotICAgICAgICB1c2VjYXNlLnNldE5hbWUodXNlY2FzZU5hbWUpOwotICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewotICAgICAgICBsb2coImVycm9yIiwgIkVycm9yIGluIGdldFVzZWNhc2UoKTogIiArIGV4Y2VwdGlvbik7Ci0gICAgICAgIGxvZygiZGVidWciLCAidXNlY2FzZU5hbWUgPSAiICsgdXNlY2FzZU5hbWUpOwotICAgICAgICBsb2coImRlYnVnIiwgImZsb3dIZWxwZXIgPSAiICsgZmxvd0hlbHBlcik7Ci0gICAgICAgIGxvZygiZGVidWciLCAicmVxdWVzdCA9ICIgKyByZXF1ZXN0KTsKLSAgICAgICAgbG9nKCJkZWJ1ZyIsICJzb3VyY2VVcmwgPSAiICsgc291cmNlVXJsKTsKLSAgICAgICAgbG9nKCJkZWJ1ZyIsICJ1c2VjYXNlUmVzb2x2ZXIgPSAiICsgdXNlY2FzZVJlc29sdmVyKTsKLSAgICAgICAgbG9nKCJkZWJ1ZyIsICJ1c2VjYXNlID0gIiArIHVzZWNhc2UpOwotICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgY29jb29uLnJlbGVhc2VDb21wb25lbnQoZmxvd0hlbHBlcik7Ci0gICAgICAgIGNvY29vbi5yZWxlYXNlQ29tcG9uZW50KHVzZWNhc2VSZXNvbHZlcik7Ci0gICAgfQotICAgIHJldHVybiB1c2VjYXNlOwotfQotCi0vKioKLSAqIFJlbGVhc2UgdXNlY2FzZS4gU2luY2UgdXNlY2FzZXMgYXJlIEF2YWxvbiBDb21wb25lbnRzLCB0aGV5IG11c3QKLSAqIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNvbnRpbnVhdGlvbiBpcyBjcmVhdGVkLgotICoKLSAqIEBwYXJhbSB1c2VjYXNlLCBhIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSBBdmFsb24gY29tcG9uZW50Ci0gKi8KLWZ1bmN0aW9uIHJlbGVhc2VVc2VjYXNlKHVzZWNhc2UpIHsKLSAgICB2YXIgdXNlY2FzZVJlc29sdmVyID0gY29jb29uLmdldENvbXBvbmVudCgib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXIiKTsKLSAgICB0cnkgewotICAgICAgICB1c2VjYXNlUmVzb2x2ZXIucmVsZWFzZSh1c2VjYXNlKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICBjb2Nvb24ucmVsZWFzZUNvbXBvbmVudCh1c2VjYXNlUmVzb2x2ZXIpOwotICAgIH0KLX0KLQotLyoqCi0gKiBQYXNzIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIGN1cnJlbnQgcmVxdWVzdCB0byBhIHVzZWNhc2UKLSAqIChleGNlcHQgbGVueWEudXNlY2FzZSwgbGVueWEuY29udGludWF0aW9uIGFuZCBzdWJtaXQpLgotICoKLSAqIEBwYXJhbSB1c2VjYXNlLCBhIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSBBdmFsb24gY29tcG9uZW50Ci0gKi8KLWZ1bmN0aW9uIHBhc3NSZXF1ZXN0UGFyYW1ldGVycyh1c2VjYXNlKSB7Ci0gICAgdmFyIGZsb3dIZWxwZXIgPSBjb2Nvb24uZ2V0Q29tcG9uZW50KCJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZmxvdy5GbG93SGVscGVyIik7Ci0gICAgdmFyIG5hbWVzID0gY29jb29uLnJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICB3aGlsZSAobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgdmFyIG5hbWUgPSBuYW1lcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAvLyBzb21lIHBhcmFtZXRlcnMgYXJlIGhhbmRsZWQgZWxzZXdoZXJlOgotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCJsZW55YS51c2VjYXNlIikgCi0gICAgICAgICAgICAmJiAhbmFtZS5lcXVhbHMoImxlbnlhLmNvbnRpbnVhdGlvbiIpIAotICAgICAgICAgICAgJiYgIW5hbWUuZXF1YWxzKCJzdWJtaXQiKSkgeyAKLSAgICAgICAgICAgIC8vIHBhc3MgdGhlIHJlc3Qgb246Ci0gICAgICAgICAgICB2YXIgdmFsdWUgPSBmbG93SGVscGVyLmdldFJlcXVlc3QoY29jb29uKS5nZXQobmFtZSk7Ci0gICAgICAgICAgICB2YXIgc3RyaW5nID0gbmV3IFBhY2thZ2VzLmphdmEubGFuZy5TdHJpbmcoKTsKLSAgICAgICAgICAgIHZhciB2ZWN0b3IgPSBuZXcgUGFja2FnZXMuamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgaWYgKHN0cmluZy5nZXRDbGFzcygpLmlzSW5zdGFuY2UodmFsdWUpIHx8IHZlY3Rvci5nZXRDbGFzcygpLmlzSW5zdGFuY2UodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIGdldFBhcmFtZXRlcnMoKSB0byBhdm9pZCBjaGFyYWN0ZXIgZW5jb2RpbmcgcHJvYmxlbXMKLSAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gZmxvd0hlbHBlci5nZXRSZXF1ZXN0KGNvY29vbikuZ2V0UGFyYW1ldGVyVmFsdWVzKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoIDwgMikgewotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZXNbMF0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzZWNhc2Uuc2V0UGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBjb2Nvb24ucmVxdWVzdC5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZS5zZXRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1c2VjYXNlLnNldFBhcnQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGNvY29vbi5yZWxlYXNlQ29tcG9uZW50KGZsb3dIZWxwZXIpOwotfQotCi0vKioKLSAqIExvYWQgdGhlIGN1c3RvbSBmbG93IGZ1bmN0aW9ucyBhcyBwcm92aWRlZCBpbiB0aGUgdmlldyAKLSAqIGNvbmZpZ3VyYXRpb24sIGlmIGFueS4KLSAqCi0gKiBAcGFyYW0gdmlldywgYSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VWaWV3IG9iamVjdAotICovCi1mdW5jdGlvbiBsb2FkQ3VzdG9tRmxvdyh2aWV3KSB7Ci0gICAgY3VzdG9tTG9vcEZsb3cgPSB1bmRlZmluZWQ7Ci0gICAgY3VzdG9tU3VibWl0RmxvdyA9IHVuZGVmaW5lZDsKLSAgICAKLSAgICB2YXIgZmxvd1VyaTsKLSAgICBpZiAodmlldyAhPSBudWxsKSB7Ci0gICAgICAgIGZsb3dVcmkgPSB2aWV3LmdldEN1c3RvbUZsb3coKTsKLSAgICAgICAgaWYgKGZsb3dVcmkgIT0gbnVsbCAmJiBmbG93VXJpICE9ICIiKSB7IC8vIGZvciBzb21lIHJlYXNvbiwgZmxvd1VyaSBpcyBub3QgY29ycmVjdGx5IGNhc3QgaW50byBhIEJvb2xlYW4sIHNvICJpZiAoZmxvd1VyaSkiIGRvZXMgbm90IHdvcmsKLSAgICAgICAgICAgIGxvZygiZGVidWciLCAiY3VzdG9tRmxvdyB1cmk6IFsiICsgZmxvd1VyaSArICJdIik7Ci0gICAgICAgICAgICBjb2Nvb24ubG9hZChmbG93VXJpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGxvZygiZGVidWciLCAiVXNlY2FzZSBkb2VzIG5vdCBkZWZpbmUgYSB2aWV3LiIpOwotICAgIH0KLX0KLQotCi0vKioKLSAqIExvZyBtZXNzYWdlcyB2aWEgY29jb29uLmxvZy4KLSAqCi0gKiBAcGFyYW0gbGV2ZWwsIG9uZSBvZiAoImRlYnVnInwiaW5mbyJ8Indhcm4ifCJlcnJvciIpCi0gKiBAcGFyYW0gbWVzc2FnZSwgYSBzdHJpbmcKLSAqIEBwYXJhbSB1c2VjYXNlTmFtZSwgYSBzdHJpbmcuCi0gKi8KLWZ1bmN0aW9uIGxvZyhsZXZlbCwgbWVzc2FnZSwgdXNlY2FzZU5hbWUpIHsKLSAgICB2YXIgbXNnID0gInVzZWNhc2VzLmpzOjpleGVjdXRlVXNlY2FzZSgpICIKLSAgICAgICAgKyAodXNlY2FzZU5hbWUgPyAid2l0aCBsZW55YS51c2VjYXNlPVsiICsgdXNlY2FzZU5hbWUgKyAiXSIgOiAiIikKLSAgICAgICAgKyAiOiAiIAotICAgICAgICArIG1lc3NhZ2U7Ci0gICAgc3dpdGNoIChsZXZlbCkgewotICAgICAgICBjYXNlICJkZWJ1ZyI6Ci0gICAgICAgICAgICBpZiAoY29jb29uLmxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGNvY29vbi5sb2cuZGVidWcobXNnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJpbmZvIjoKLSAgICAgICAgICAgIGNvY29vbi5sb2cuaW5mbyhtc2cpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSAid2FybiI6Ci0gICAgICAgICAgICBjb2Nvb24ubG9nLndhcm4obXNnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJlcnJvciI6Ci0gICAgICAgICAgICBjb2Nvb24ubG9nLmVycm9yKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNvY29vbi5sb2cuZXJyb3IobXNnICsgIltVbmtub3duIGxvZyBsZXZlbCAiICsgbGV2ZWwgKyAiXSIpOyAKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyoqCi0gKiBUaGUgTG9vcCBzdGFnZSBvZiB0aGUgZmxvdywgaW4gd2hpY2ggYSB2aWV3IGlzIGRpc3BsYXllZC4gCi0gKiA8ZW0+Tm90ZTo8L2VtPiBBbGwgQXZhbG9uIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJlbGVhc2VkIGJlZm9yZSBjYWxsaW5nCi0gKiB0aGlzIGZ1bmN0aW9uISBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbm5vdCBob2xkIGEgdXNlY2FzZSBvYmplY3QsCi0gKiBoZW5jZSB0aGUgcHJveHkuCi0gKiAKLSAqIEBwYXJhbSB2aWV3LCBhIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZVZpZXcgb2JqZWN0Ci0gKiBAcGFyYW0gcHJveHksIGEgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUHJveHkgb2JqZWN0Ci0gKiBAcGFyYW0gZ2VuZXJpYywgYSBnZW5lcmljIEphdmFzY3JpcHQgb2JqZWN0IGZvciBjdXN0b20gZmxvdyBjb2RlIHRvIHByZXNlcnZlIHN0YXRlIGluZm9ybWF0aW9uIChjdXJyZW50bHkgbm90IHVzZWQgYnkgdGhlIGRlZmF1bHQgY29kZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGludm9rZXMgY3VzdG9tTG9vcEZsb3cgaWYgaXQgZXhpc3RzLgotICogT3RoZXJ3aXNlIGl0IGZhbGxzIGJhY2sgdG8gZGVmYXVsdExvb3BGbG93LgotICovCi1mdW5jdGlvbiBsb29wRmxvdyh2aWV3LCBwcm94eSwgZ2VuZXJpYykgewotICAgIGlmIChjdXN0b21Mb29wRmxvdyAhPSB1bmRlZmluZWQpIHsKLSAgICAgICAgbG9nKCJpbmZvIiwgIlVzaW5nIGN1c3RvbUxvb3BGbG93IGZ1bmN0aW9uIiwgcHJveHkuZ2V0TmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIGN1c3RvbUxvb3BGbG93KHZpZXcsIHByb3h5LCBnZW5lcmljKTsKLSAgICB9IGVsc2V7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0TG9vcEZsb3codmlldywgcHJveHkpOwotICAgIH0KLX0KLQotCi0vKioKLSAqIFRoZSBTdWJtaXQgc3RhZ2Ugb2YgdGhlIGZsb3csIGluIHdoaWNoIGEgdXNlciBpbnRlcmFjdGlvbiBpcyBwcm9jZXNzZWQuCi0gKiBhbmQgdGhlIHVzZWNhc2UgaXMgYWR2YW5jZWQuIElmIHRoZSB1c2VyIGhhcyBzdWJtaXR0ZWQsIHRoZSB1c2VjYXNlIGlzIGV4ZWN1dGVkLgotICogCi0gKiBAcGFyYW0gdXNlY2FzZSwgYSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2UgQXZhbG9uIGNvbXBvbmVudAotICogQHBhcmFtIGdlbmVyaWMsIGEgZ2VuZXJpYyBKYXZhc2NyaXB0IG9iamVjdCBmb3IgY3VzdG9tIGZsb3cgY29kZSB0byBwcmVzZXJ2ZSBzdGF0ZSBpbmZvcm1hdGlvbiAoY3VycmVudGx5IG5vdCB1c2VkIGJ5IHRoZSBkZWZhdWx0IGNvZGUpCi0gKiBAcmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIHJldHVybiBzdGF0ZSAoInN1Y2Nlc3MifCJjYW5jZWwifCJjb250aW51ZSIpLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaW52b2tlcyBjdXN0b21TdWJtaXRGbG93IGlmIGl0IGV4aXN0cy4KLSAqIE90aGVyd2lzZSBpdCBmYWxscyBiYWNrIHRvIGRlZmF1bHRTdWJtaXRGbG93LgotICovCi1mdW5jdGlvbiBzdWJtaXRGbG93KHVzZWNhc2UsIGdlbmVyaWMpIHsKLSAgICBpZiAoY3VzdG9tU3VibWl0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgIGxvZygiaW5mbyIsICJVc2luZyBjdXN0b21TdWJtaXRGbG93IGZ1bmN0aW9uIiwgdXNlY2FzZS5nZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gY3VzdG9tU3VibWl0Rmxvdyh1c2VjYXNlLCBnZW5lcmljKTsKLSAgICB9IGVsc2V7Ci0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRTdWJtaXRGbG93KHVzZWNhc2UpOwotICAgIH0KLX0KLQotLyoqCi0gKiBAc2VlIGxvb3BGbG93LgotICovCi1mdW5jdGlvbiBkZWZhdWx0TG9vcEZsb3codmlldywgcHJveHkpIHsKLSAgICB2YXIgdmlld1VyaSA9IHZpZXcuZ2V0Vmlld1VSSSgpOwotICAgIC8vIHdlIHVzZWQgdG8gYWxsb3cgYSBjb2Nvb246LyBhbmQgY29jb29uOi8vIHByZWZpeCAod2hpY2ggc2VuZFBhZ2VYWFggZG9lcyBub3QgaGFuZGxlKSwKLSAgICAvLyBidXQgaXQgaXMgbm93IGRlcHJlY2F0ZWQhCi0gICAgaWYgKHZpZXdVcmkuc3RhcnRzV2l0aCgiY29jb29uOi8iKSkgewotICAgICAgICAvLyBsZWF2ZSBsZWFkaW5nIC8gaW4gY2FzZSBvZiBjb2Nvb246Ly8gZm9yIHJvb3Qgc2l0ZW1hcAotICAgICAgICB2aWV3VXJpID0gdmlld1VyaS5zdWJzdHJpbmcobmV3IFBhY2thZ2VzLmphdmEubGFuZy5TdHJpbmcoImNvY29vbjovIikubGVuZ3RoKCkpOwotICAgICAgICBsb2coIndhcm4iLCAiVGhlIHVzZSBvZiB0aGUgY29jb29uOi8gcHJvdG9jb2wgcHJlZml4IGluIHRoZSA8dmlldyB1cmk9XCIuLi5cIj4gYXR0cmlidXRlIGlzIGRlcHJlY2F0ZWQhIik7Ci0gICAgfQotICAgIGlmICghIHZpZXdVcmkuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgIC8vIGEgbG9jYWwgVVJJIG11c3QgYmUgaGFuZGxlZCBieSB1c2VjYXNlLnhtYXAsIHdoaWNoIGFzc3VtZXMgYSBwcmVmaXggInVzZWNhc2VzLXZpZXcvW21lbnV8bm9tZW51XS8KLSAgICAgICAgLy8gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG1lbnUgaXMgdG8gYmUgZGlzcGxheWVkLiB0aGlzIG1lY2hhbmlzbSBpcyB1c2VkIGJ5IG1vc3QgbGVueWEgY29yZSB1c2VjYXNlcy4KLSAgICAgICAgdmlld1VyaSA9ICJ1c2VjYXNlcy12aWV3LyIgCi0gICAgICAgICAgICArICh2aWV3LnNob3dNZW51KCkgPyAibWVudSIgOiAibm9tZW51IikKLSAgICAgICAgICAgICsgIi8iICsgdmlld1VyaTsKLSAgICB9Ci0gICAgaWYgKHZpZXcuY3JlYXRlQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgbG9nKCJkZWJ1ZyIsICJDcmVhdGluZyB2aWV3IGFuZCBjb250aW51YXRpb24sIGNhbGxpbmcgQ29jb29uIHdpdGggdmlld1VyaSA9IFsiICsgdmlld1VyaSArICJdIik7Ci0gICAgICAgIGNvY29vbi5zZW5kUGFnZUFuZFdhaXQodmlld1VyaSwgeyAidXNlY2FzZSIgOiBwcm94eSB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBsb2coImRlYnVnIiwgIkNyZWF0aW5nIHZpZXcgd2l0aG91dCBjb250aW51YXRpb24gKCEpLCBjYWxsaW5nIENvY29vbiB3aXRoIHZpZXdVcmkgPSBbIiArIHZpZXdVcmkgKyAiXSIpOwotICAgICAgICBjb2Nvb24uc2VuZFBhZ2Uodmlld1VyaSwgeyAidXNlY2FzZSIgOiBwcm94eX0pOwotICAgICAgICBjb2Nvb24uZXhpdCgpOyAvLyB3ZSdyZSBkb25lLgotICAgIH0KLX0KLQotLyoqCi0gKiBAc2VlIHN1Ym1pdEZsb3cKLSAqLwotZnVuY3Rpb24gZGVmYXVsdFN1Ym1pdEZsb3codXNlY2FzZSkgewotICAgIHZhciBwcmVjb25kaXRpb25zT2sgPSB0cnVlOwotICAgIGlmIChjb2Nvb24ucmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpfHxjb2Nvb24ucmVxdWVzdC5nZXRQYXJhbWV0ZXIoImxlbnlhLnN1Ym1pdCIpPT0ib2siKSB7Ci0gICAgICAgIGlmICh1c2VjYXNlLmlzT3B0aW1pc3RpYygpKSB7Ci0gICAgICAgICAgICB1c2VjYXNlLmNoZWNrUHJlY29uZGl0aW9ucygpOwotICAgICAgICAgICAgcHJlY29uZGl0aW9uc09rID0gIXVzZWNhc2UuaGFzRXJyb3JzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWNvbmRpdGlvbnNPaykgewotICAgICAgICAgICAgaWYgKHVzZWNhc2UuaXNPcHRpbWlzdGljKCkpIHsKLSAgICAgICAgICAgICAgICB1c2VjYXNlLmxvY2tJbnZvbHZlZE9iamVjdHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzZWNhc2UuY2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCk7Ci0gICAgICAgICAgICBpZiAoISB1c2VjYXNlLmhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVGbG93KHVzZWNhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb2Nvb24ucmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNhbmNlbCIpKSB7Ci0gICAgICAgIHVzZWNhc2UuY2FuY2VsKCk7Ci0gICAgICAgIHJldHVybiAiY2FuY2VsIjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHVzZWNhc2UuYWR2YW5jZSgpOwotICAgIH0KLSAgICByZXR1cm4gImNvbnRpbnVlIgotfQotCi0vKioKLSAqIFRoZSBFeGVjdXRlIHN0YWdlIG9mIHRoZSBmbG93LCBpbiB3aGljaCB0aGUgdXNlY2FzZSBpcyBmaW5hbGx5IGV4ZWN1dGVkLgotICoKLSAqIEBwYXJhbSBhIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSBvYmplY3QKLSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCB0aGUgcmV0dXJuIHN0YXRlICgic3VjY2VzcyJ8ImNvbnRpbnVlIikuCi0gKi8KLWZ1bmN0aW9uIGV4ZWN1dGVGbG93KHVzZWNhc2UpIHsKLSAgICB1c2VjYXNlLmV4ZWN1dGUoKTsKLSAgICBpZiAoISB1c2VjYXNlLmhhc0Vycm9ycygpKSB7Ci0gICAgICAgIHVzZWNhc2UuY2hlY2tQb3N0Y29uZGl0aW9ucygpOwotICAgICAgICBpZiAoISB1c2VjYXNlLmhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiY29udGludWUiOwotfQotCi0vKioKLSAqIFJlZGlyZWN0IHRvIHRhcmdldCBVUkwgYWZ0ZXIgZmluaXNoaW5nIHRoZSB1c2VjYXNlLCAKLSAqIHRha2luZyBwcm94eSBzZXR0aW5ncyBpbnRvIGFjY291bnQuCi0gKgotICogQHBhcmFtIHRoZSB3ZWJhcHAtaW50ZXJuYWwgdGFyZ2V0IFVSTAotICovCi1mdW5jdGlvbiByZWRpcmVjdCh0YXJnZXRVcmwpIHsKLSAgICB2YXIgZmxvd0hlbHBlcjsgIC8vIG5lZWRlZCB0byBvYnRhaW4gdGhlIGN1cnJlbnQgb2JqZWN0TW9kZWwgCi0gICAgdmFyIG9iamVjdE1vZGVsOyAvLyBuZWVkZWQgdG8gcHJvdmlkZSBjb250ZXh0IHRvIHRoZSBwcm94eU1vZHVsZSAKLSAgICB2YXIgaW5wdXRNb2R1bGVTZWxlY3RvcjsgLy8gbmVlZGVkIHRvIG9idGFpbiBhIHByb3h5TW9kdWxlCi0gICAgdmFyIHByb3h5TW9kdWxlOyAvLyB1c2VkIHRvIHJld3JpdGUgdGhlIHRhcmdldFVybCBhY2NvcmRpbmcgdG8gdGhlIHB1YmxpY2F0aW9uJ3MgcHJveHkgc2V0dGluZ3MKLSAgICB2YXIgcHJveHlVcmw7ICAgIC8vIHRoZSByZXdyaXR0ZW4gdGFyZ2V0IFVybAotCi0gICAgZmxvd0hlbHBlciA9IGNvY29vbi5nZXRDb21wb25lbnQoIm9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93LkZsb3dIZWxwZXIiKTsKLSAgICB0cnkgewotICAgICAgICBvYmplY3RNb2RlbCA9IGZsb3dIZWxwZXIuZ2V0T2JqZWN0TW9kZWwoY29jb29uKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICBjb2Nvb24ucmVsZWFzZUNvbXBvbmVudChmbG93SGVscGVyKTsKLSAgICB9Ci0KLSAgICBpbnB1dE1vZHVsZVNlbGVjdG9yID0gY29jb29uLmdldENvbXBvbmVudChvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUuUk9MRSArICJTZWxlY3RvciIpOwotICAgIHRyeSB7Ci0gICAgICAgIHByb3h5TW9kdWxlID0gaW5wdXRNb2R1bGVTZWxlY3Rvci5zZWxlY3QoInByb3h5Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm94eVVybCA9IHByb3h5TW9kdWxlLmdldEF0dHJpYnV0ZSh0YXJnZXRVcmwsIG51bGwsIG9iamVjdE1vZGVsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvY29vbi5yZWxlYXNlQ29tcG9uZW50KHByb3h5TW9kdWxlKTsKLSAgICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGNvY29vbi5yZWxlYXNlQ29tcG9uZW50KGlucHV0TW9kdWxlU2VsZWN0b3IpOwotICAgIH0KLQotICAgIGxvZygiZGVidWciLCAiUmVkaXJlY3RpbmcgdG8ge3Byb3h5OiIgKyB0YXJnZXRVcmwgKyAifSA9ICIgKyBwcm94eVVybCArICIuIik7Ci0KLSAgICBjb2Nvb24ucmVkaXJlY3RUbyhwcm94eVVybCwgdHJ1ZSk7Ci19Ci0KLQotCi0vKioKLSAqIE1haW4gZnVuY3Rpb24gdG8gZXhlY3V0ZSBhIHVzZWNhc2UuIFRoaXMgaXMgY2FsbGVkIGZyb20gPG1hcDpmbG93Lz4uCi0gKgotICogVXNlcyByZXF1ZXN0IHBhcmFtZXRlciAibGVueWEudXNlY2FzZSIgdG8gZGV0ZXJtaW5lIHdoYXQKLSAqIHVzZWNhc2UgdG8gZXhlY3V0ZS4KLSAqIAotICogU2luY2UgInVzZWNhc2UiIGFuZCAiZmxvd0hlbHBlciIgYXJlIGF2YWxvbiBjb21wb25lbnRzLCAKLSAqIHRoZXkgbXVzdCBiZSByZWxlYXNlZCBiZWZvcmUgYSBjb250aW51YXRpb24gaXMgY3JlYXRlZC4KLSAqIEluIG9yZGVyIHRvIHByZXNlcnZlIHN0YXRlIGluZm9ybWF0aW9uLCBhICJwcm94eSIgb2JqZWN0Ci0gKiBpcyB1c2VkLgotICovCi1mdW5jdGlvbiBleGVjdXRlVXNlY2FzZSgpIHsKLQotICAgIHZhciB1c2VjYXNlTmFtZTsKLSAgICB2YXIgdXNlY2FzZTsgLy8gdGhlIFVzZWNhc2Ugb2JqZWN0Ci0gICAgdmFyIHByb3h5OyAvLyBhIFVzZWNhc2VQcm94eSB0byBtYWtlIHRoZSB1c2VjYXNlIHN0YXRlIHBlcnNpc3RlbnQgYWNyb3NzIGNvbnRpbnVhdGlvbnMKLSAgICB2YXIgdmlldzsgLy8gdGhlIFVzZWNhc2VWaWV3IG9iamVjdCB0aGF0IGJlbG9uZ3MgdG8gb3VyIHVzZWNhc2UuCi0gICAgdmFyIHN0YXRlOyAvLyB0aGUgc3RhdGUgb2YgdGhlIHVzZWNhc2UgKCJjb250aW51ZSJ8InN1Y2Nlc3MifCJjYW5jZWwiKTsKLSAgICB2YXIgdGFyZ2V0VXJsOyAvLyBVUkwgdG8gcmVkaXJlY3QgdG8gYWZ0ZXIgY29tcGxldGlvbi4KLSAgICB2YXIgZ2VuZXJpYyA9IG5ldyBPYmplY3Q7IC8vIGEgZ2VuZXJpYyBoZWxwZXIgb2JqZWN0IGZvciBjdXN0b20gZmxvdyBjb2RlIHRvIHByZXNlcnZlIHN0YXRlIGluZm9ybWF0aW9uLgotICAgIAotICAgIHZhciBwcmVjb25kaXRpb25zT0s7Ci0KLSAgICB0cnkgewotICAgICAgICB1c2VjYXNlTmFtZSA9IGNvY29vbi5wYXJhbWV0ZXJzWyJ1c2VjYXNlTmFtZSJdOwotICAgICAgICB1c2VjYXNlID0gZ2V0VXNlY2FzZSh1c2VjYXNlTmFtZSk7Ci0gICAgICAgIHBhc3NSZXF1ZXN0UGFyYW1ldGVycyh1c2VjYXNlKTsKLSAgICAgICAgdXNlY2FzZS5jaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgcHJlY29uZGl0aW9uc09LID0gIXVzZWNhc2UuaGFzRXJyb3JzKCk7Ci0gICAgICAgIGlmIChwcmVjb25kaXRpb25zT0sgJiYgIXVzZWNhc2UuaXNPcHRpbWlzdGljKCkpIHsKLSAgICAgICAgICAgIHVzZWNhc2UubG9ja0ludm9sdmVkT2JqZWN0cygpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNyZWF0ZSBwcm94eSBvYmplY3QgdG8gc2F2ZSB1c2VjYXNlIHN0YXRlCi0gICAgICAgIHZpZXcgPSB1c2VjYXNlLmdldFZpZXcoKTsKLSAgICAgICAgcHJveHkgPSBuZXcgUGFja2FnZXMub3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5pbXBsLlVzZWNhc2VQcm94eSh1c2VjYXNlKTsKLSAgICAgICAgbG9nKCJkZWJ1ZyIsICJTdWNjZXNzZnVsbHkgcHJlcGFyZWQgdXNlY2FzZS4iLCB1c2VjYXNlTmFtZSk7Ci0gICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7Ci0gICAgICAgIGxvZygiZXJyb3IiLCAiQ291bGQgbm90IHByZXBhcmUgdXNlY2FzZTogIiArIGV4Y2VwdGlvbiwgdXNlY2FzZU5hbWUpOwotICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgcmVsZWFzZVVzZWNhc2UodXNlY2FzZSk7Ci0gICAgfQotICAgIGxvYWRDdXN0b21GbG93KHZpZXcpOwotICAgIC8vIElmIHRoZSB1c2VjYXNlIGhhcyBhIHZpZXcgdXJpLCB0aGlzIG1lYW5zIHdlIHdhbnQgdG8gZGlzcGxheSBzb21ldGhpbmcgCi0gICAgLy8gdG8gdGhlIHVzZXIgYmVmb3JlIHByb2NlZWRpbmcuIFRoaXMgYWxzbyBtZWFucyB0aGUgdXNlY2FzZSBjYW4gY29uc2lzdAotICAgIC8vIG9mIHNldmVyYWwgc3RlcHM7IHJlcGVhdGVkIHVudGlsIHRoZSB1c2VyIGNob29zZXMgdG8gc3VibWl0IG9yIGNhbmNlbC4KLSAgICBpZiAodmlldyAhPSBudWxsICYmIHZpZXcuZ2V0Vmlld1VSSSgpKSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIC8vIHNob3cgdGhlIHZpZXc6Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvb3BGbG93KHZpZXcsIHByb3h5LCBnZW5lcmljKTsgLy91c2VjYXNlIG11c3QgYmUgcmVsZWFzZWQgaGVyZSEKLSAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIC8vIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLCB0cnkgYW5kIHJvbGxiYWNrIHRoZSB1c2VjYXNlOgotICAgICAgICAgICAgICAgIGxvZygiZXJyb3IiLCAiRXhjZXB0aW9uIGR1cmluZyBsb29wRmxvdygpOiAiICsgZXhjZXB0aW9uLCB1c2VjYXNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdXNlY2FzZSA9IGdldFVzZWNhc2UodXNlY2FzZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXR1cCh1c2VjYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgdXNlY2FzZS5jYW5jZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VVc2VjYXNlKHVzZWNhc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcmVjb25kaXRpb25zT0spIHsKLSAgICAgICAgICAgICAgICBsb2coImRlYnVnIiwgIkFkdmFuY2luZyBpbiB1c2VjYXNlLiIsIHVzZWNhc2VOYW1lKTsKLSAgICAgICAgICAgICAgICAvLyByZXN0b3JlIHRoZSB1c2VjYXNlIHN0YXRlIGFuZCBoYW5kbGUgdGhlIHVzZXIgaW5wdXQ6Ci0gICAgICAgICAgICAgICAgdXNlY2FzZSA9IGdldFVzZWNhc2UodXNlY2FzZU5hbWUpOwotICAgICAgICAgICAgICAgIHByb3h5LnNldHVwKHVzZWNhc2UpOwotICAgICAgICAgICAgICAgIHBhc3NSZXF1ZXN0UGFyYW1ldGVycyh1c2VjYXNlKTsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN1Ym1pdEZsb3codXNlY2FzZSwgZ2VuZXJpYyk7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHByb3h5IHdpdGggdGhlIHVwZGF0ZWQgdXNlY2FzZSBzdGF0ZQotICAgICAgICAgICAgICAgIHByb3h5ID0gbmV3IFBhY2thZ2VzLm9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuaW1wbC5Vc2VjYXNlUHJveHkodXNlY2FzZSk7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZVVzZWNhc2UodXNlY2FzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHN0YXRlID09ICJjb250aW51ZSIpOwotICAgIC8vIElmIHRoZSB1c2VjYXNlIGRvZXMgbm90IGhhdmUgYSB2aWV3IHVyaSwgd2UgY2FuIGRpcmVjdGx5IGp1bXAgdG8gCi0gICAgLy8gZXhlY3V0ZUZsb3coKS4KLSAgICB9IGVsc2UgewotICAgICAgICB1c2VjYXNlID0gZ2V0VXNlY2FzZSh1c2VjYXNlTmFtZSk7Ci0gICAgICAgIHByb3h5LnNldHVwKHVzZWNhc2UpOwotICAgICAgICBwYXNzUmVxdWVzdFBhcmFtZXRlcnModXNlY2FzZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAodXNlY2FzZS5pc09wdGltaXN0aWMoKSkgewotICAgICAgICAgICAgdXNlY2FzZS5jaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgICAgIHByZWNvbmRpdGlvbnNPSyA9ICF1c2VjYXNlLmhhc0Vycm9ycygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocHJlY29uZGl0aW9uc09LKSB7Ci0gICAgICAgICAgICBpZiAodXNlY2FzZS5pc09wdGltaXN0aWMoKSkgewotICAgICAgICAgICAgICAgIHVzZWNhc2UubG9ja0ludm9sdmVkT2JqZWN0cygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXNlY2FzZS5jaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLSAgICAgICAgICAgIHZhciBoYXNFcnJvcnMgPSB1c2VjYXNlLmhhc0Vycm9ycygpOwotICAgICAgICAgICAgaWYgKCFoYXNFcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IGV4ZWN1dGVGbG93KHVzZWNhc2UpOwotICAgICAgICAgICAgICAgIGhhc0Vycm9ycyA9IHVzZWNhc2UuaGFzRXJyb3JzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVsZWFzZVVzZWNhc2UodXNlY2FzZSk7Ci0gICAgICAgIGlmIChoYXNFcnJvcnMpIHsKLSAgICAgICAgICAgIHByb3h5ID0gbmV3IFBhY2thZ2VzLm9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuaW1wbC5Vc2VjYXNlUHJveHkodXNlY2FzZSk7Ci0gICAgICAgICAgICBjb2Nvb24uc2VuZFBhZ2UoInVzZWNhc2VzLXZpZXcvbm9tZW51L21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvZXJyb3IuangiLCB7ICJ1c2VjYXNlIiA6IHByb3h5fSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy9nZXRUYXJnZXRVUkwgdGFrZXMgYSBib29sZWFuIHRoYXQgaXMgdHJ1ZSBvbiBzdWNjZXNzOgotICAgIHRhcmdldFVybCA9IHVzZWNhc2UuZ2V0VGFyZ2V0VVJMKHN0YXRlID09ICJzdWNjZXNzIik7Ci0gICAgbG9nKCJkZWJ1ZyIsICJDb21wbGV0ZWQsIHJlZGlyZWN0aW5nIHRvIHVybCA9IFsiICsgdGFyZ2V0VXJsICsgIl0iLCB1c2VjYXNlTmFtZSk7Ci0gICAgLy8ganVtcCB0byB0aGUgYXBwcm9wcmlhdGUgVVJMOgotICAgIHJlZGlyZWN0KHRhcmdldFVybCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UveHNsdC9pbml0VXNlY2FzZVBvbGljaWVzLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS94c2x0L2luaXRVc2VjYXNlUG9saWNpZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWNiMWEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS94c2x0L2luaXRVc2VjYXNlUG9saWNpZXMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0NCi0gIFJ1biB0aGlzIHN0eWxlc2hlZXQgb3ZlciBidWlsZC9sZW55YS93ZWJhcHAvV0VCLUlORi9jb2Nvb24ueGNvbmYgdG8NCi0gIGdldCBhIGRlZmF1bHQgcGVybWlzc2lvbnMgZmlsZSB3aXRoIGFsbCB1c2VjYXNlcyBhbGxvd2VkIGZvciB0aGUgImFkbWluIiByb2xlLg0KLQ0KLSAgRXhhbXBsZSBmb3IgWGFsYW4gb24gTGludXg6DQotICBYYWxhbiAtaSAyICRMRU5ZQV9IT01FL2J1aWxkL2xlbnlhL3dlYmFwcC9XRUItSU5GL2NvY29vbi54Y29uZiBcDQotICAgICRMRU5ZQV9IT01FL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS1pbXBsL3hzbHQvaW5pdFVzZWNhc2VQb2xpY2llcy54c2wgXA0KLSAgICA+ICRZT1VSX1BVQi9jb25maWcvYWMvdXNlY2FzZS1wb2xpY2llcy54bWwNCi0tLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCINCi0gIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvYWMvMS4wIj4NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29jb29uIj4NCi0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ1c2VjYXNlcyIvPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ1c2VjYXNlcyI+DQotICAgIDx4c2w6dGV4dD4NCi08L3hzbDp0ZXh0Pg0KLSAgICA8eHNsOmNvbW1lbnQ+KysrTk9URSsrKyBUaGUgdXNlY2FzZSBsaXN0IHdhcyBpbml0aWFsaXplZCB1c2luZyBtb2R1bGVzL3VzZWNhc2UtaW1wbC94c2x0L2luaXRVc2VjYXNlUG9saWNpZXMueHNsLjwveHNsOmNvbW1lbnQ+DQotICAgIDx4c2w6dGV4dD4NCi08L3hzbDp0ZXh0Pg0KLSAgICA8dXNlY2FzZXM+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb21wb25lbnQtaW5zdGFuY2UiLz4NCi0gICAgPC91c2VjYXNlcz4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ1c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2UiPg0KLSAgICA8dXNlY2FzZSBpZD0ie0BuYW1lfSI+PHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+PC91c2VjYXNlPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3VzZWNhc2UveHNsdC9wcm94eVVybDJ0ZXh0LnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS94c2x0L3Byb3h5VXJsMnRleHQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDk4YmFlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvdXNlY2FzZS94c2x0L3Byb3h5VXJsMnRleHQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotUmVwbGFjZSBpbnRlcm1lZGlhdGUgPHByb3h5OnVybCBocmVmPSIiLz4gZWxlbWVudHMgd2l0aCB0aGUgcGxhaW4gVVJMLgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICB4bWxuczpwcm94eT0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvcHJveHkvMS4wIj4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb3h5OnVybCI+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBocmVmIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLXdvcmtmbG93LW11bHRpV29ya2Zsb3cueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS13b3JrZmxvdy1tdWx0aVdvcmtmbG93Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDM2MTg3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLXdvcmtmbG93LW11bHRpV29ya2Zsb3cueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnd29ya2Zsb3cubXVsdGlXb3JrZmxvdyddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ3b3JrZmxvdy5tdWx0aVdvcmtmbG93IiBsb2dnZXI9ImxlbnlhLndvcmtmbG93IiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuTXVsdGlXb3JrZmxvdyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3dvcmtmbG93L3VzZWNhc2VzL211bHRpV29ya2Zsb3cuangiIG1lbnU9InRydWUiLz4NCi0gICAgICA8ZXhpdCB1c2VjYXNlPSJ3b3JrZmxvdy5tdWx0aVdvcmtmbG93Ii8+Ci0gICAgICA8dXNlY2FzZSBuYW1lPSJ3b3JrZmxvdy5zdWJtaXQiIGV2ZW50PSJzdWJtaXQiLz4NCi0gICAgICA8dXNlY2FzZSBuYW1lPSJ3b3JrZmxvdy5wdWJsaXNoIiBldmVudD0icHVibGlzaCIvPgotICAgICAgPHVzZWNhc2UgbmFtZT0id29ya2Zsb3cucmVqZWN0IiBldmVudD0icmVqZWN0Ii8+Ci0gICAgICA8dXNlY2FzZSBuYW1lPSJ3b3JrZmxvdy5kZWFjdGl2YXRlIiBldmVudD0iZGVhY3RpdmF0ZSIvPgotICAgICAgPHVzZWNhc2UgbmFtZT0ic2l0ZW1hbmFnZW1lbnQuZGVsZXRlIiBldmVudD0iZGVsZXRlIi8+Ci0gICAgICA8dXNlY2FzZSBuYW1lPSJzaXRlbWFuYWdlbWVudC5hcmNoaXZlIiBldmVudD0iYXJjaGl2ZSIvPgotICAgICAgPHVzZWNhc2UgbmFtZT0ic2l0ZW1hbmFnZW1lbnQucmVzdG9yZSIgZXZlbnQ9InJlc3RvcmUiLz4KLSAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic3R5bGUiIHZhbHVlPSJ0ZXh0Ii8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLXdvcmtmbG93LW11bHRpV29ya2Zsb3dJbnZva2UueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS13b3JrZmxvdy1tdWx0aVdvcmtmbG93SW52b2tlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdkYmE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLXdvcmtmbG93LW11bHRpV29ya2Zsb3dJbnZva2UueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnd29ya2Zsb3cubXVsdGlXb3JrZmxvd0ludm9rZSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ3b3JrZmxvdy5tdWx0aVdvcmtmbG93SW52b2tlIiBsb2dnZXI9ImxlbnlhLndvcmtmbG93IgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzLk11bHRpV29ya2Zsb3dJbnZva2UiPg0KLSAgICAgIDxleGl0IHVzZWNhc2U9IndvcmtmbG93Lm11bHRpV29ya2Zsb3ciLz4KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmMjYxMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZCQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnd29ya2Zsb3cuZGVhY3RpdmF0ZSddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ3b3JrZmxvdy5kZWFjdGl2YXRlIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEudXNlY2FzZXMud29ya2Zsb3ciDQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzLkRlYWN0aXZhdGUiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy93b3JrZmxvdy91c2VjYXNlcy9kZWFjdGl2YXRlLmp4Ii8+DQotICAgICAgPGV2ZW50IGlkPSJkZWFjdGl2YXRlIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLQ0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd29ya2Zsb3ctcHVibGlzaC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13b3JrZmxvdy1wdWJsaXNoLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJiZDQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13b3JrZmxvdy1wdWJsaXNoLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd3b3JrZmxvdy5wdWJsaXNoJ10iPg0KLQ0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9IndvcmtmbG93LnB1Ymxpc2giDQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPSJsZW55YS51c2VjYXNlcy53b3JrZmxvdyINCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuUHVibGlzaCI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL3dvcmtmbG93L3VzZWNhc2VzL3B1Ymxpc2guangiLz4NCi0gICAgICA8ZXZlbnQgaWQ9InB1Ymxpc2giLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotDQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13b3JrZmxvdy1yZWplY3QueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd29ya2Zsb3ctcmVqZWN0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2U3MjJkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13b3JrZmxvdy1yZWplY3QueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotPCEtLQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMKLS0tPgotCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd3b3JrZmxvdy5yZWplY3QnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9IndvcmtmbG93LnJlamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEudXNlY2FzZXMud29ya2Zsb3ciCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuUmVqZWN0Ij4KLSAgICAgIDxldmVudCBpZD0icmVqZWN0Ii8+Ci0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvd29ya2Zsb3cvdXNlY2FzZXMvcmVqZWN0Lmp4Ii8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0KLSAgPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13b3JrZmxvdy1zdWJtaXQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd29ya2Zsb3ctc3VibWl0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWEzMmM3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13b3JrZmxvdy1zdWJtaXQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotPCEtLQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMKLS0tPgotCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd3b3JrZmxvdy5zdWJtaXQnXSI+Ci0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9IndvcmtmbG93LnN1Ym1pdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEudXNlY2FzZXMud29ya2Zsb3ciCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuU3VibWl0Ij4KLSAgICAgIDxldmVudCBpZD0ic3VibWl0Ii8+Ci0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvd29ya2Zsb3cvdXNlY2FzZXMvc3VibWl0Lmp4Ii8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0KLSAgPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi93b3JrZmxvdy1pbnB1dC1tb2R1bGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvd29ya2Zsb3ctaW5wdXQtbW9kdWxlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmU2ODI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL2NvY29vbi14Y29uZi93b3JrZmxvdy1pbnB1dC1tb2R1bGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcyIgdW5sZXNzPSIvY29jb29uL2lucHV0LW1vZHVsZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3dvcmtmbG93J10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIGxvZ2dlcj0iY29yZS5tb2R1bGVzLmlucHV0LndvcmtmbG93IiBuYW1lPSJ3b3JrZmxvdyINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5Xb3JrZmxvd01vZHVsZSIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvd29ya2Zsb3ctbWV0YWRhdGEueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9jb2Nvb24teGNvbmYvd29ya2Zsb3ctbWV0YWRhdGEueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNmQ1NzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9jb25maWcvY29jb29uLXhjb25mL3dvcmtmbG93LW1ldGFkYXRhLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIA0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9tZXRhLWRhdGEiDQotICAgIHVubGVzcz0iL2NvY29vbi9tZXRhLWRhdGEvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2h0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL3dvcmtmbG93LzEuMCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhZGF0YS93b3JrZmxvdy8xLjAiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLkNvbmZpZ3VyYWJsZUVsZW1lbnRTZXQiPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9IndvcmtmbG93VmVyc2lvbiIgbXVsdGlwbGU9InRydWUiIG9uQ29weT0iZGVsZXRlIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCi0gIA0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTIyZWRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy53b3JrZmxvdzwvaWQ+Ci0gIDxleHBvcnQgcGFja2FnZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5saW5raW5nIi8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLm5vdGlmaWNhdGlvbiIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPldvcmtmbG93IGltcGxlbWVudGF0aW9uPC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj5Xb3JrZmxvdyBpbXBsZW1lbnRhdGlvbjwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL3NpdGVtYXAvYWN0aW9ucy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9jb25maWcvc2l0ZW1hcC9hY3Rpb25zLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTMyYjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9jb25maWcvc2l0ZW1hcC9hY3Rpb25zLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiBhY3Rpb25zLnhtYXAgMjgwMDYwIDIwMDUtMDktMTEgMDE6NTY6MzFaIGNoZXN0bnV0ICQgIC0tPgotCi08eG1hcCB4cGF0aD0iL3NpdGVtYXAvY29tcG9uZW50cy9hY3Rpb25zIiB1bmxlc3M9Ii9zaXRlbWFwL2NvbXBvbmVudHMvYWN0aW9ucy9hY3Rpb25bQG5hbWUgPSAnd29ya2Zsb3cnXSI+Ci0gICA8bWFwOmFjdGlvbiBuYW1lPSJ3b3JrZmxvdyIgbG9nZ2VyPSJzaXRlbWFwLmFjdGlvbi53b3JrZmxvdyIgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uYWN0aW5nLldvcmtmbG93SW52b2tlckFjdGlvbiIvPgotPC94bWFwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL3NpdGVtYXAvdHJhbnNmb3JtZXJzLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVycy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmZiOTA4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvY29uZmlnL3NpdGVtYXAvdHJhbnNmb3JtZXJzLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHhtYXAgeHBhdGg9Ii9zaXRlbWFwL2NvbXBvbmVudHMvdHJhbnNmb3JtZXJzIiANCi0gIHVubGVzcz0iL3NpdGVtYXAvY29tcG9uZW50cy90cmFuc2Zvcm1lcnMvdHJhbnNmb3JtZXJbQG5hbWUgPSAnd29ya2Zsb3dtZW51J10iDQotICB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+DQotICAgIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0id29ya2Zsb3dtZW51IiBsb2dnZXI9ImxlbnlhLnNpdGVtYXAudHJhbnNmb3JtZXIud29ya2Zsb3dtZW51IiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5Xb3JrZmxvd01lbnVUcmFuc2Zvcm1lciIvPg0KLTwveG1hcD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvV29ya2Zsb3dJbnZva2VyQWN0aW9uLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9hY3RpbmcvV29ya2Zsb3dJbnZva2VyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2FjOTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL1dvcmtmbG93SW52b2tlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uYWN0aW5nLlNlcnZpY2VhYmxlQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlZGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuV29ya2Zsb3dVdGlsOwotCi0vKioKLSAqIEFjdGlvbiB0byBpbnZva2UgYSB3b3JrZmxvdyB0cmFuc2l0aW9uIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgcmVxdWVzdCBkb2N1bWVudCBVUkwuIFBhcmFtZXRlcnM6Ci0gKiA8dWw+Ci0gKiA8bGk+PHN0cm9uZz5hcmVhOiA8L3N0cm9uZz4gVGhlIGFyZWEuPC9saT4KLSAqIDxsaT48c3Ryb25nPmRvY3VtZW50LXV1aWQ6IDwvc3Ryb25nPiBUaGUgZG9jdW1lbnQgdXVpZC48L2xpPgotICogPGxpPjxzdHJvbmc+bGFuZ3VhZ2U6IDwvc3Ryb25nPiBUaGUgbGFuZ3VhZ2UuPC9saT4KLSAqIDxsaT48c3Ryb25nPmV2ZW50OiA8L3N0cm9uZz4gVGhlIGV2ZW50IHRvIGludm9rZS48L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtmbG93SW52b2tlckFjdGlvbiBleHRlbmRzIFNlcnZpY2VhYmxlQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPkFSRUE8L2NvZGU+IFRoZSBhcmVhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJFQSA9ICJhcmVhIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ET0NVTUVOVF9VVUlEPC9jb2RlPiBUaGUgZG9jdW1lbnQgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9VVUlEID0gImRvY3VtZW50LXV1aWQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkxBTkdVQUdFPC9jb2RlPiBUaGUgbGFuZ3VhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HVUFHRSA9ICJsYW5ndWFnZSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RVZFTlQ8L2NvZGU+IFRoZSBldmVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UID0gImV2ZW50IjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uYWN0aW5nLkFjdGlvbiNhY3Qob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVkaXJlY3RvciwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLCBqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVycykKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGFjdChSZWRpcmVjdG9yIHJlZGlyZWN0b3IsIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBNYXAgb2JqZWN0TW9kZWwsIFN0cmluZyBzb3VyY2UsCi0gICAgICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBhcmVhID0gcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoQVJFQSk7Ci0gICAgICAgIFN0cmluZyBkb2N1bWVudElkID0gcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoRE9DVU1FTlRfVVVJRCk7Ci0gICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IHBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKExBTkdVQUdFKTsKLSAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9IHBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKEVWRU5UKTsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGludm9rZWQuIik7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiICAgIEFyZWE6ICAgICAgICBbIiArIGFyZWEgKyAiXSIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBEb2N1bWVudCBJRDogWyIgKyBkb2N1bWVudElkICsgIl0iKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIgICAgTGFuZ3VhZ2U6ICAgIFsiICsgbGFuZ3VhZ2UgKyAiXSIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBFdmVudDogICAgICAgWyIgKyBldmVudE5hbWUgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHViOwotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHViID0gUHVibGljYXRpb25VdGlsLmdldFB1YmxpY2F0aW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KHRoaXMubWFuYWdlciwgc2Vzc2lvbik7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbWFwLmdldChwdWIsIGFyZWEsIGRvY3VtZW50SWQsIGxhbmd1YWdlKTsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBJbnZva2luZyB3b3JrZmxvdyBldmVudCIpOwotICAgICAgICB9Ci0gICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLCBzZXNzaW9uLCBnZXRMb2dnZXIoKSwgZG9jdW1lbnQsIGV2ZW50TmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9Xb3JrZmxvd01vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1dvcmtmbG93TW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTIyNzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1dvcmtmbG93TW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dDsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUGFnZUVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LldvcmtmbG93VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZTsKLQotLyoqCi0gKiBNb2R1bGUgZm9yIHdvcmtmbG93IGFjY2Vzcy4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgV29ya2Zsb3dNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdFBhZ2VFbnZlbG9wZU1vZHVsZSB7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5TVEFURTwvY29kZT4gVGhlIHN0YXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEUgPSAic3RhdGUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlZBUklBQkxFX1BSRUZJWDwvY29kZT4gVGhlIHZhcmlhYmxlIHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQkxFX1BSRUZJWCA9ICJ2YXJpYWJsZS4iOwotCi0gICAgLyoqCi0gICAgICogVGhlIHByZWZpeCB0byBnZXQgdGhlIGxhc3QgdXNlciB3aG8gaW52b2tlZCBhIGNlcnRhaW4gZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9VU0VSX1BSRUZJWCA9ICJsYXN0VXNlci4iOwotCi0gICAgLyoqCi0gICAgICogVGhlIHByZWZpeCB0byBnZXQgdGhlIGxhc3QgZGF0ZSBhdCB3aGljaCBhIGNlcnRhaW4gZXZlbnQgd2FzIGludm9rZWQuCi0gICAgICogQHNlZSAjREFURV9GT1JNQVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0RBVEVfUFJFRklYID0gImxhc3REYXRlLiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERhdGVGb3JtYXQgREFURV9GT1JNQVQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcyIpOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBBUkFNRVRFUl9OQU1FUyA9IHsgU1RBVEUgfTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIFdvcmtmbG93TWFuYWdlciB3Zk1hbmFnZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQYWdlRW52ZWxvcGUgZW52ZWxvcGUgPSBnZXRFbnZlbG9wZShvYmplY3RNb2RlbCwgbmFtZSk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGVudmVsb3BlLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHdmTWFuYWdlciA9IChXb3JrZmxvd01hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoV29ya2Zsb3dNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24odGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCkpOwotICAgICAgICAgICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAod2ZNYW5hZ2VyLmhhc1dvcmtmbG93KHdvcmtmbG93YWJsZSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIGxhdGVzdFZlcnNpb24gPSB3b3JrZmxvd2FibGUuZ2V0TGF0ZXN0VmVyc2lvbigpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhTVEFURSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlc3RWZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IHdmTWFuYWdlci5nZXRXb3JrZmxvd1NjaGVtYSh3b3JrZmxvd2FibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gd29ya2Zsb3cuZ2V0SW5pdGlhbFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbGF0ZXN0VmVyc2lvbi5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChWQVJJQUJMRV9QUkVGSVgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFyaWFibGVOYW1lID0gbmFtZS5zdWJzdHJpbmcoVkFSSUFCTEVfUFJFRklYLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93IHdvcmtmbG93ID0gd2ZNYW5hZ2VyLmdldFdvcmtmbG93U2NoZW1hKHdvcmtmbG93YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YXJpYWJsZU5hbWVzID0gd29ya2Zsb3cuZ2V0VmFyaWFibGVOYW1lcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5cy5hc0xpc3QodmFyaWFibGVOYW1lcykuY29udGFpbnModmFyaWFibGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlc3RWZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCb29sZWFuLnZhbHVlT2Yod29ya2Zsb3cuZ2V0SW5pdGlhbFZhbHVlKHZhcmlhYmxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKGxhdGVzdFZlcnNpb24uZ2V0VmFsdWUodmFyaWFibGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChMQVNUX1VTRVJfUFJFRklYKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV2ZW50ID0gbmFtZS5zdWJzdHJpbmcoTEFTVF9VU0VSX1BSRUZJWC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIGxhdGVzdEV2ZW50VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24od29ya2Zsb3dhYmxlLCBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZXN0RXZlbnRWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGxhdGVzdEV2ZW50VmVyc2lvbi5nZXRVc2VySWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoTEFTVF9EQVRFX1BSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBldmVudCA9IG5hbWUuc3Vic3RyaW5nKExBU1RfREFURV9QUkVGSVgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiBsYXRlc3RFdmVudFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKHdvcmtmbG93YWJsZSwgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVzdEV2ZW50VmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKGxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLkRBVEVfRk9STUFULmZvcm1hdChsYXRlc3RFdmVudFZlcnNpb24uZ2V0RGF0ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVGhlIGF0dHJpYnV0ZSBbIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBpcyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiUmVzb2x2aW5nIGF0dHJpYnV0ZSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHdmTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uod2ZNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFZlcnNpb24gZ2V0TGF0ZXN0VmVyc2lvbihXb3JrZmxvd2FibGUgd29ya2Zsb3dhYmxlLCBTdHJpbmcgZXZlbnQpIHsKLSAgICAgICAgVmVyc2lvbiBsYXRlc3RFdmVudFZlcnNpb24gPSBudWxsOwotICAgICAgICBWZXJzaW9uIHZlcnNpb25zW10gPSB3b3JrZmxvd2FibGUuZ2V0VmVyc2lvbnMoKTsKLSAgICAgICAgaW50IGkgPSB2ZXJzaW9ucy5sZW5ndGggLSAxOwotICAgICAgICB3aGlsZSAoaSA+IC0xICYmICF2ZXJzaW9uc1tpXS5nZXRFdmVudCgpLmVxdWFscyhldmVudCkpIHsKLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA+IC0xKSB7Ci0gICAgICAgICAgICBsYXRlc3RFdmVudFZlcnNpb24gPSB2ZXJzaW9uc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGF0ZXN0RXZlbnRWZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZU5hbWVzKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBdHRyaWJ1dGVOYW1lcyhDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KFBBUkFNRVRFUl9OQU1FUykuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZSNnZXRBdHRyaWJ1dGVWYWx1ZXMoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEF0dHJpYnV0ZVZhbHVlcyhTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvYmplY3RzID0geyBnZXRBdHRyaWJ1dGUobmFtZSwgbW9kZUNvbmYsIG9iamVjdE1vZGVsKSB9OwotCi0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vV29ya2Zsb3dNZW51VHJhbnNmb3JtZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3RyYW5zZm9ybWF0aW9uL1dvcmtmbG93TWVudVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWRlYmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vV29ya2Zsb3dNZW51VHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24udHJhbnNmb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLnRyYW5zZm9ybWF0aW9uLkFic3RyYWN0U0FYVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuV29ya2Zsb3dVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKLQotLyoqCi0gKiBUaGlzIHRyYW5zZm9ybWVyIGRpc2FibGVzIG1lbnUgaXRlbXMgKGJ5IHJlbW92aW5nIHRoZSBocmVmIGF0dHJpYnV0ZSkgd2hpY2ggYXJlIG5vdCBhbGxvd2VkIHdpdGgKLSAqIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgd29ya2Zsb3cgc3RhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrZmxvd01lbnVUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0U0FYVHJhbnNmb3JtZXIgewotICAgIC8qKgotICAgICAqIDxjb2RlPk1FTlVfRUxFTUVOVDwvY29kZT4gVGhlIG1lbnUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfRUxFTUVOVCA9ICJtZW51IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5JVEVNX0VMRU1FTlQ8L2NvZGU+IFRoZSBpdGVtIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNX0VMRU1FTlQgPSAiaXRlbSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RVZFTlRfQVRUUklCVVRFPC9jb2RlPiBUaGUgZXZlbnQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfQVRUUklCVVRFID0gImV2ZW50IjsKLQotICAgIC8qKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHJhdywgQXR0cmlidXRlcyBhdHRyKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQotICAgICAgICBpZiAoaGFzV29ya2Zsb3coKSAmJiBsb2NhbE5hbWUuZXF1YWxzKElURU1fRUxFTUVOVCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBldmVudCA9IGF0dHIuZ2V0VmFsdWUoV29ya2Zsb3cuTkFNRVNQQUNFLCBFVkVOVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiRXZlbnQ6IFsiICsgZXZlbnQgKyAiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaWx0ZXIgaXRlbSBpZiBjb21tYW5kIG5vdCBhbGxvd2VkCi0gICAgICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSW1wbChhdHRyKTsKLQotICAgICAgICAgICAgICAgIGludCBocmVmSW5kZXggPSBhdHRyaWJ1dGVzLmdldEluZGV4KCJocmVmIik7Ci0gICAgICAgICAgICAgICAgaWYgKGhyZWZJbmRleCA+IC0xKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmV4ZWN1dGFibGVFdmVudHMuY29udGFpbnMoZXZlbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZW1vdmluZyBocmVmIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5yZW1vdmVBdHRyaWJ1dGUoaHJlZkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkFkZGluZyBldmVudCB0byBocmVmIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnNldFZhbHVlKGhyZWZJbmRleCwgaHJlZiArICImbGVueWEuZXZlbnQ9IiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCByYXcsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhc3NlZCkgewotICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCByYXcsIGF0dHIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLnNpdGVtYXAuU2l0ZW1hcE1vZGVsQ29tcG9uZW50I3NldHVwKG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLAotICAgICAqICAgICAgamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVycykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXR1cChTb3VyY2VSZXNvbHZlciBfcmVzb2x2ZXIsIE1hcCBfb2JqZWN0TW9kZWwsIFN0cmluZyBzcmMsIFBhcmFtZXRlcnMgX3BhcmFtZXRlcnMpCi0gICAgICAgICAgICB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgc3VwZXIuc2V0dXAoX3Jlc29sdmVyLCBfb2JqZWN0TW9kZWwsIHNyYywgX3BhcmFtZXRlcnMpOwotCi0gICAgICAgIFdvcmtmbG93TWFuYWdlciB3b3JrZmxvd01hbmFnZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KF9vYmplY3RNb2RlbCk7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHNlc3Npb24pOwotCi0gICAgICAgICAgICBTdHJpbmcgd2ViYXBwVXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkocmVxdWVzdCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobWFwLmlzRG9jdW1lbnQod2ViYXBwVXJsKSkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gbWFwLmdldEZyb21VUkwod2ViYXBwVXJsKTsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUgZG9jdHlwZSA9IGRvY3VtZW50LmdldFJlc291cmNlVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRQdWJsaWNhdGlvbigpLmdldFdvcmtmbG93U2NoZW1hKGRvY3R5cGUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SGFzV29ya2Zsb3codHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TWFuYWdlciA9IChXb3JrZmxvd01hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoV29ya2Zsb3dNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEhhc1dvcmtmbG93KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldEhhc1dvcmtmbG93KGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhc1dvcmtmbG93KCkpIHsKLSAgICAgICAgICAgICAgICBXb3JrZmxvd2FibGUgd29ya2Zsb3dhYmxlID0gV29ya2Zsb3dVdGlsLmdldFdvcmtmbG93YWJsZSh0aGlzLm1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSB3b3JrZmxvd01hbmFnZXIuZ2V0V29ya2Zsb3dTY2hlbWEod29ya2Zsb3dhYmxlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBldmVudHMgPSB3b3JrZmxvdy5nZXRFdmVudHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dNYW5hZ2VyLmNhbkludm9rZSh3b3JrZmxvd2FibGUsIGV2ZW50c1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0YWJsZUV2ZW50cy5hZGQoZXZlbnRzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAod29ya2Zsb3dNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZSh3b3JrZmxvd01hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzV29ya2Zsb3c7Ci0KLSAgICBwcml2YXRlIFNldCBleGVjdXRhYmxlRXZlbnRzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaGFzIGEgd29ya2Zsb3cuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzV29ya2Zsb3coKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmhhc1dvcmtmbG93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgaWYgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaGFzIGEgd29ya2Zsb3cuCi0gICAgICogQHBhcmFtIF9oYXNXb3JrZmxvdyBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFzV29ya2Zsb3coYm9vbGVhbiBfaGFzV29ya2Zsb3cpIHsKLSAgICAgICAgdGhpcy5oYXNXb3JrZmxvdyA9IF9oYXNXb3JrZmxvdzsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L1dvcmtmbG93Tm90aWZpZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvV29ya2Zsb3dOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjM3MjQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvV29ya2Zsb3dOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uQWJzdHJhY3RSZXBvc2l0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5RXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotCi0vKioKLSAqIE5vdGlmeSB1c2VycyBvZiB3b3JrZmxvdyBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgV29ya2Zsb3dOb3RpZmllciBleHRlbmRzIEFic3RyYWN0UmVwb3NpdG9yeUxpc3RlbmVyIHsKLQotICAgIHB1YmxpYyB2b2lkIGV2ZW50RmlyZWQoUmVwb3NpdG9yeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmICghKGV2ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRFdmVudCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBEb2N1bWVudEV2ZW50IGRvY0V2ZW50ID0gKERvY3VtZW50RXZlbnQpIGV2ZW50OwotICAgICAgICBpZiAoIShkb2NFdmVudC5nZXREZXNjcmlwdG9yKCkgaW5zdGFuY2VvZiBXb3JrZmxvd0V2ZW50RGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFdvcmtmbG93RXZlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoV29ya2Zsb3dFdmVudERlc2NyaXB0b3IpIGRvY0V2ZW50LmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gZGVzY3JpcHRvci5nZXRWZXJzaW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL0NoZWNrV29ya2Zsb3cuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvQ2hlY2tXb3JrZmxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmY5ZTBmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvQ2hlY2tXb3JrZmxvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7DQotDQotLyoqDQotICogQ2hlY2sgaWYgYSB3b3JrZmxvdyBldmVudCBjYW4gYmUgaW52b2tlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IGFjdHVhbGx5IGludm9raW5nIGl0Lg0KLSAqIFRoZSBldmVudCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGluIDxjb2RlPmNvY29vbi54Y29uZjwvY29kZT46PGNvZGU+DQotICogPHByZT4NCi0gKiAgICAgJmx0O2NvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSZxdW90O2RlZmF1bHQvd29ya2Zsb3cuc3VibWl0JnF1b3Q7DQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPSZxdW90O2xlbnlhLnVzZWNhc2VzLndvcmtmbG93JnF1b3Q7DQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuQ2hlY2tXb3JrZmxvdyZxdW90OyZndDsNCi0gKiAgICAgICAmbHQ7ZXZlbnQgaWQ9JnF1b3Q7c3VibWl0JnF1b3Q7LyZndDsNCi0gKiAgICAgJmx0Oy9jb21wb25lbnQtaW5zdGFuY2UmZ3Q7DQotICogPC9wcmU+DQotICogPC9jb2RlPg0KLSAqIA0KLSAqIEB2ZXJzaW9uICRJZDogSW52b2tlV29ya2Zsb3cuamF2YSA0MjYyNTQgMjAwNi0wNy0yNyAyMToyNzowNFogYW5kcmVhcyAkDQotICovDQotcHVibGljIGNsYXNzIENoZWNrV29ya2Zsb3cgZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgaW1wbGVtZW50cyBDb25maWd1cmFibGUgew0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBldmVudDsNCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gVGhlIHdvcmtmbG93IGV2ZW50IHRvIHVzZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXZlbnQoKSB7DQotICAgICAgICByZXR1cm4gZXZlbnQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7DQotDQotICAgICAgICBpZiAoaGFzRXJyb3JzKCkpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOw0KLSAgICAgICAgaWYgKCFXb3JrZmxvd1V0aWwuY2FuSW52b2tlKHRoaXMubWFuYWdlciwgZ2V0U2Vzc2lvbigpLCBnZXRMb2dnZXIoKSwgZG9jLCBnZXRFdmVudCgpKSkgew0KLSAgICAgICAgICAgIFVzZWNhc2VXb3JrZmxvd0hlbHBlci5hZGRXb3JrZmxvd0Vycm9yKHRoaXMsIGdldEV2ZW50KCksIGRvYyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9FVkVOVCA9ICJldmVudCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JRCA9ICJpZCI7DQotDQotICAgIC8qKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZSNjb25maWd1cmUob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gew0KLSAgICAgICAgc3VwZXIuY29uZmlndXJlKGNvbmZpZyk7DQotICAgICAgICB0aGlzLmV2ZW50ID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfRVZFTlQpLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvRGVhY3RpdmF0ZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9EZWFjdGl2YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMDM5OTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9EZWFjdGl2YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5Ob2RlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuSW52b2tlV29ya2Zsb3c7Ci0KLS8qKgotICogRGVhY3RpdmF0ZSB1c2VjYXNlIGhhbmRsZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIERlYWN0aXZhdGUgZXh0ZW5kcyBJbnZva2VXb3JrZmxvdyB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LU19UT19ET0NVTUVOVCA9ICJsaW5rc1RvRG9jdW1lbnQiOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSB3b3JrZmxvdyBldmVudCBpcyBzdXBwb3J0ZWQgYW5kIHRoZSBwYXJlbnQgb2YgdGhlIGRvY3VtZW50IGV4aXN0cyBpbiB0aGUgbGl2ZQotICAgICAqIGFyZWEuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLQotICAgICAgICBpZiAoIWhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIGlmICghZG9jLmdldEFyZWEoKS5lcXVhbHMoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBmcm9tIHRoZSBhdXRob3JpbmcgYXJlYS4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZG9jLmV4aXN0c0FyZWFWZXJzaW9uKFB1YmxpY2F0aW9uLkxJVkVfQVJFQSkpIHsKLSAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoaXMgdXNlY2FzZSBjYW4gb25seSBiZSBpbnZva2VkIHdoZW4gdGhlIGxpdmUgdmVyc2lvbiBleGlzdHMuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGxpdmVEb2MgPSBkb2MuZ2V0QXJlYVZlcnNpb24oUHVibGljYXRpb24uTElWRV9BUkVBKTsKLSAgICAgICAgICAgICAgICBOb2RlU2V0IHN1YlNpdGUgPSBTaXRlVXRpbC5nZXRTdWJTaXRlKHRoaXMubWFuYWdlciwgbGl2ZURvYy5nZXRMaW5rKCkuZ2V0Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICBTaXRlTm9kZSBub2RlID0gbGl2ZURvYy5nZXRMaW5rKCkuZ2V0Tm9kZSgpOwotICAgICAgICAgICAgICAgIHN1YlNpdGUucmVtb3ZlKG5vZGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFzdWJTaXRlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIllvdSBjYW4ndCBkZWFjdGl2YXRlIHRoaXMgZG9jdW1lbnQgYmVjYXVzZSBpdCBoYXMgY2hpbGRyZW4uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihMSU5LU19UT19ET0NVTUVOVCwgbmV3IExpbmtMaXN0KHRoaXMubWFuYWdlciwgZG9jKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10gZ2V0Tm9kZXNUb0xvY2soKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbm9kZXMuYWRkKGRvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBsaXZlRG9jID0gZG9jLmdldEFyZWFWZXJzaW9uKFB1YmxpY2F0aW9uLkxJVkVfQVJFQSk7Ci0gICAgICAgICAgICAgICAgbm9kZXMuYWRkKGxpdmVEb2MuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgICAgICAgICAgbm9kZXMuYWRkKGxpdmVEb2MuYXJlYSgpLmdldFNpdGUoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAob3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10pIG5vZGVzLnRvQXJyYXkobmV3IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZVtub2Rlcy5zaXplKCldKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVzZWNhc2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotICAgICAgICBkZWFjdGl2YXRlKGdldFNvdXJjZURvY3VtZW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlYWN0aXZhdGVzIGEgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGF1dGhvcmluZ0RvY3VtZW50IFRoZSBhdXRob3JpbmcgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZShEb2N1bWVudCBhdXRob3JpbmdEb2N1bWVudCkgewotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnQgbGl2ZURvY3VtZW50ID0gYXV0aG9yaW5nRG9jdW1lbnQuZ2V0QXJlYVZlcnNpb24oUHVibGljYXRpb24uTElWRV9BUkVBKTsKLQotICAgICAgICAgICAgZG9jdW1lbnRNYW5hZ2VyID0gKERvY3VtZW50TWFuYWdlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIuZGVsZXRlKGxpdmVEb2N1bWVudCk7Ci0KLSAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJEZWFjdGl2YXRlIGRvY3VtZW50IFsiICsgYXV0aG9yaW5nRG9jdW1lbnQgKyAiXS4gU3VjY2VzczogWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3VjY2VzcyArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShkb2N1bWVudE1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gImRlYWN0aXZhdGUiOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGxpc3Qgb2YgbGlua3MgcG9pbnRpbmcgdG8gYSBkb2N1bWVudC4gQWxsb3dzIGxhenkgbG9hZGluZyByb20gdGhlIHVzZWNhc2Ugdmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpbmtMaXN0IHsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gICAgICAgIHByaXZhdGUgRG9jdW1lbnRbXSBkb2N1bWVudHM7Ci0gICAgICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbWFuYWdlci4KLSAgICAgICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gcmVzb2x2ZSB0aGUgbGlua3MgZnJvbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaW5rTGlzdChTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBEb2N1bWVudCBkb2MpIHsKLSAgICAgICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgbGluayBkb2N1bWVudHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRG9jdW1lbnRbXSBnZXREb2N1bWVudHMoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5kb2N1bWVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzID0gZ2V0TGlua3NUb0RvY3VtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudHM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBEb2N1bWVudFtdIGdldExpbmtzVG9Eb2N1bWVudCgpIHsKLSAgICAgICAgICAgIFNldCBkb2NzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIExpbmtNYW5hZ2VyIGxpbmtNZ3IgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsaW5rTWdyID0gKExpbmtNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKExpbmtNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IGxpdmVWZXJzaW9uID0gdGhpcy5kb2N1bWVudC5nZXRBcmVhVmVyc2lvbihQdWJsaWNhdGlvbi5MSVZFX0FSRUEpOwotICAgICAgICAgICAgICAgIERvY3VtZW50W10gcmVmZXJlbmNpbmdEb2NzID0gbGlua01nci5nZXRSZWZlcmVuY2luZ0RvY3VtZW50cyhsaXZlVmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCByZWZlcmVuY2luZ0RvY3MubGVuZ3RoOyBkKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gcmVmZXJlbmNpbmdEb2NzW2RdOwotICAgICAgICAgICAgICAgICAgICBpZiAoZG9jLmdldEFyZWEoKS5lcXVhbHMoUHVibGljYXRpb24uTElWRV9BUkVBKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZG9jcy5hZGQoZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAobGlua01nciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGxpbmtNZ3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoRG9jdW1lbnRbXSkgZG9jcy50b0FycmF5KG5ldyBEb2N1bWVudFtkb2NzLnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvSGlzdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9IaXN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NjJlOWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9IaXN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkRvY3VtZW50VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dhYmxlOwotCi0vKioKLSAqIERpc3BsYXkgdGhlIHdvcmtmbG93IGhpc3RvcnkgdGFiIGluIHRoZSBzaXRlIGFyZWEKLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgSGlzdG9yeSBleHRlbmRzIERvY3VtZW50VXNlY2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2luaXRQYXJhbWV0ZXJzKCkgVE9ETwotICAgICAqICAgICAgZ2V0IHdmIHZhcmlhYmxlcywgZ2V0IGRhdGUgYW5kIG1hY2hpbmUgaXAgZm9yIHZlcnNpb25zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgaWYgKGdldFNvdXJjZURvY3VtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSA9IFdvcmtmbG93VXRpbC5nZXRXb3JrZmxvd2FibGUodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLCBnZXRTb3VyY2VEb2N1bWVudCgpKTsKLSAgICAgICAgICAgIFZlcnNpb25bXSB2ZXJzaW9ucyA9IHdvcmtmbG93YWJsZS5nZXRWZXJzaW9ucygpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJ2ZXJzaW9ucyIsIHZlcnNpb25zKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL0ludm9rZVdvcmtmbG93LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL0ludm9rZVdvcmtmbG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzE4ODYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9JbnZva2VXb3JrZmxvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci0KLS8qKgotICogSW52b2tlIGEgd29ya2Zsb3cgZXZlbnQgb24gdGhlIGN1cnJlbnQgZG9jdW1lbnQuIFRoZSBldmVudCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGluCi0gKiA8Y29kZT5jb2Nvb24ueGNvbmY8L2NvZGU+Ojxjb2RlPgotICogPHByZT4KLSAqICAgJmx0O2NvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSZxdW90O2RlZmF1bHQvd29ya2Zsb3cuc3VibWl0JnF1b3Q7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPSZxdW90O2xlbnlhLnVzZWNhc2VzLndvcmtmbG93JnF1b3Q7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuSW52b2tlV29ya2Zsb3cmcXVvdDsmZ3Q7Ci0gKiAgICAgJmx0O2V2ZW50IGlkPSZxdW90O3N1Ym1pdCZxdW90Oy8mZ3Q7Ci0gKiAgICZsdDsvY29tcG9uZW50LWluc3RhbmNlJmd0OwotICogPC9wcmU+Ci0gKiA8L2NvZGU+Ci0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEludm9rZVdvcmtmbG93IGV4dGVuZHMgQ2hlY2tXb3JrZmxvdyB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICBOb2RlW10gb2JqZWN0cyA9IG5ldyBOb2RlWzBdOwotICAgICAgICBpZihnZXRTb3VyY2VEb2N1bWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9iamVjdHMgPSBuZXcgTm9kZVtdIHsgZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgV29ya2Zsb3dVdGlsLmludm9rZSh0aGlzLm1hbmFnZXIsIGdldFNlc3Npb24oKSwgZ2V0TG9nZ2VyKCksIGdldFNvdXJjZURvY3VtZW50KCksCi0gICAgICAgICAgICAgICAgZ2V0RXZlbnQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL011bHRpV29ya2Zsb3cuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvTXVsdGlXb3JrZmxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzRhYTQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvTXVsdGlXb3JrZmxvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkFyZWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlOwotCi0vKioKLSAqIE1hbmFnZSB0aGUgd29ya2Zsb3cgb2YgbXVsdGlwbGUgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlXb3JrZmxvdyBleHRlbmRzIEFic3RyYWN0VXNlY2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdCBwcmVPcmRlciA9IGdldE5vZGVzKCk7Ci0gICAgICAgICAgICBMaXN0IHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgU29ydGVkU2V0IHN0YXRlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcmVPcmRlci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFdvcmtmbG93YWJsZVdyYXBwZXIgd3JhcHBlciA9IG5ldyBXb3JrZmxvd2FibGVXcmFwcGVyKHRoaXMsIHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50RmFjdG9yeSgpLmdldFNlc3Npb24oKSwgZG9jLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICAgICAgd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotICAgICAgICAgICAgICAgIHN0YXRlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh3cmFwcGVyLmdldFN0YXRlcygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoImRvY3VtZW50cyIsIHdyYXBwZXJzKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcigic3RhdGVzIiwgc3RhdGVzKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXROb2RlcygpIHRocm93cyBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiwgUHVibGljYXRpb25FeGNlcHRpb24gewotICAgICAgICBMaXN0IHByZU9yZGVyOwotICAgICAgICBTdHJpbmcgc291cmNlVXJsID0gZ2V0U291cmNlVVJMKCk7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCk7Ci0gICAgICAgIGlmIChnZXREb2N1bWVudEZhY3RvcnkoKS5pc0RvY3VtZW50KHNvdXJjZVVybCkpIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGZhY3RvcnkuZ2V0RnJvbVVSTChzb3VyY2VVcmwpOwotICAgICAgICAgICAgcHJlT3JkZXIgPSBnZXRQcmVPcmRlcihkb2MuZ2V0TGluaygpLmdldE5vZGUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmVPcmRlciA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24oZ2V0U291cmNlVVJMKCkpOwotICAgICAgICAgICAgUHVibGljYXRpb24gcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihpbmZvLmdldFB1YmxpY2F0aW9uSWQoKSk7Ci0gICAgICAgICAgICBBcmVhIGFyZWEgPSBwdWIuZ2V0QXJlYShpbmZvLmdldEFyZWEoKSk7Ci0gICAgICAgICAgICBTaXRlU3RydWN0dXJlIHNpdGUgPSBhcmVhLmdldFNpdGUoKTsKLSAgICAgICAgICAgIFNpdGVOb2RlW10gdG9wTGV2ZWxOb2RlcyA9IHNpdGUuZ2V0VG9wTGV2ZWxOb2RlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BMZXZlbE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHJlT3JkZXIuYWRkQWxsKGdldFByZU9yZGVyKHRvcExldmVsTm9kZXNbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJlT3JkZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0UHJlT3JkZXIoU2l0ZU5vZGUgbm9kZSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBMaXN0IHByZU9yZGVyID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBsYW5ncyA9IG5vZGUuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgIEFycmF5cy5zb3J0KGxhbmdzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcHJlT3JkZXIuYWRkKG5vZGUuZ2V0TGluayhsYW5nc1tpXSkuZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU2l0ZU5vZGVbXSBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcHJlT3JkZXIuYWRkQWxsKGdldFByZU9yZGVyKGNoaWxkcmVuW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZU9yZGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIHVzZWNhc2UyZXZlbnQgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZShjb25maWcpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25bXSB1c2VjYXNlQ29uZmlncyA9IGNvbmZpZy5nZXRDaGlsZHJlbigidXNlY2FzZSIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVzZWNhc2VDb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlY2FzZSA9IHVzZWNhc2VDb25maWdzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgICAgICAgICAgU3RyaW5nIGV2ZW50ID0gdXNlY2FzZUNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKCJldmVudCIpOwotICAgICAgICAgICAgdGhpcy51c2VjYXNlMmV2ZW50LnB1dCh1c2VjYXNlLCBldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQuCi0gICAgICogQHJldHVybiBBbGwgdXNlY2FzZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFVzZWNhc2VzKFN0cmluZyBldmVudCkgewotICAgICAgICBTb3J0ZWRTZXQgdXNlY2FzZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLnVzZWNhc2UyZXZlbnQua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlY2FzZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHRoaXMudXNlY2FzZTJldmVudC5nZXQodXNlY2FzZSkuZXF1YWxzKGV2ZW50KSkgewotICAgICAgICAgICAgICAgIHVzZWNhc2VzLmFkZCh1c2VjYXNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSB1c2VjYXNlcy50b0FycmF5KG5ldyBTdHJpbmdbdXNlY2FzZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL011bHRpV29ya2Zsb3dJbnZva2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvTXVsdGlXb3JrZmxvd0ludm9rZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzlmMzY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvTXVsdGlXb3JrZmxvd0ludm9rZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlSW52b2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogSW52b2NhdGlvbiB1c2VjYXNlIGZvciB0aGUgbXVsdGktd29ya2Zsb3cgdXNlY2FzZS4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpV29ya2Zsb3dJbnZva2UgZXh0ZW5kcyBBYnN0cmFjdFVzZWNhc2UgewotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUNBU0VfTkFNRSA9ICJ1c2VjYXNlTmFtZSI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotCi0gICAgICAgIFN0cmluZyB1c2VjYXNlID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVVNFQ0FTRV9OQU1FKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInVzZWNhc2UiLCB1c2VjYXNlKTsKLSAgICAgICAgU3RyaW5nIHVybCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFVSTCk7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJ1cmwiLCB1cmwpOwotCi0gICAgICAgIFVzZWNhc2VJbnZva2VyIGludm9rZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW52b2tlciA9IChVc2VjYXNlSW52b2tlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChVc2VjYXNlSW52b2tlci5ST0xFKTsKLSAgICAgICAgICAgIGludm9rZXIuaW52b2tlKHVybCwgdXNlY2FzZSwgbmV3IEhhc2hNYXAoKSk7Ci0KLSAgICAgICAgICAgIGlmIChpbnZva2VyLmdldFJlc3VsdCgpICE9IFVzZWNhc2VJbnZva2VyLlNVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBMaXN0IG1lc3NhZ2VzID0gaW52b2tlci5nZXRFcnJvck1lc3NhZ2VzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZWNhc2VNZXNzYWdlIG1lc3NhZ2UgPSAoVXNlY2FzZU1lc3NhZ2UpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UobWVzc2FnZS5nZXRNZXNzYWdlKCksIG1lc3NhZ2UuZ2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW52b2tlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoaW52b2tlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvUHVibGlzaC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9QdWJsaXNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NDMzMDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9QdWJsaXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aWZpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua1Jlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua1RhcmdldDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5kdWJsaW5jb3JlLkR1YmxpbkNvcmVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uUmVwb3NpdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLlJlcG9zaXRvcnlFdmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLnNjaGVkdWxpbmcuVXNlY2FzZVNjaGVkdWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuSW52b2tlV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25FdmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZTsKLQotLyoqCi0gKiBQdWJsaXNoIHVzZWNhc2UgaGFuZGxlci4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaCBleHRlbmRzIEludm9rZVdvcmtmbG93IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfU1VCSkVDVCA9ICJub3RpZmljYXRpb24tbWVzc2FnZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9ET0NVTUVOVF9QVUJMSVNIRUQgPSAiZG9jdW1lbnQtcHVibGlzaGVkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFRFVMRSA9ICJzY2hlZHVsZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRURVTEVfVElNRSA9ICJzY2hlZHVsZS50aW1lIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRU5EX05PVElGSUNBVElPTiA9ICJzZW5kTm90aWZpY2F0aW9uIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTlBVQkxJU0hFRF9MSU5LUyA9ICJ1bnB1Ymxpc2hlZExpbmtzIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIGlmIChoYXNFcnJvcnMoKSB8fCBnZXRTb3VyY2VEb2N1bWVudCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGUgbm93ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCkuZ2V0VGltZSgpOwotICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzIik7Ci0gICAgICAgIHNldFBhcmFtZXRlcihTQ0hFRFVMRV9USU1FLCBmb3JtYXQuZm9ybWF0KG5vdykpOwotCi0gICAgICAgIHNldFBhcmFtZXRlcihTRU5EX05PVElGSUNBVElPTiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgCi0gICAgICAgIHNldFBhcmFtZXRlcihVTlBVQkxJU0hFRF9MSU5LUywgbmV3IExpbmtMaXN0KHRoaXMubWFuYWdlciwgZ2V0U291cmNlRG9jdW1lbnQoKSkpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzQnJva2VuTGlua3MoKSB7Ci0gICAgICAgIExpbmtNYW5hZ2VyIGxpbmtNZ3IgPSBudWxsOwotICAgICAgICBMaW5rUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbGlua01nciA9IChMaW5rTWFuYWdlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChMaW5rTWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKExpbmtSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChMaW5rUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtbXSBsaW5rcyA9IGxpbmtNZ3IuZ2V0TGlua3NGcm9tKGdldFNvdXJjZURvY3VtZW50KCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIExpbmtUYXJnZXQgdGFyZ2V0ID0gcmVzb2x2ZXIucmVzb2x2ZShnZXRTb3VyY2VEb2N1bWVudCgpLCBsaW5rc1tpXS5nZXRVcmkoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobGlua01nciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UobGlua01ncik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZ2V0Tm9kZXNUb0xvY2soKQotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZihkb2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5vZGVzLmFkZChkb2MuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gbG9jayB0aGUgYXV0aG9yaW5nIHNpdGUgdG8gYXZvaWQgaGF2aW5nIGxpdmUgbm9kZXMgZm9yIHdoaWNoIG5vIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICAgICAvLyBhdXRob3Jpbmcgbm9kZSBleGlzdHMKLSAgICAgICAgICAgICAgICBub2Rlcy5hZGQoZG9jLmFyZWEoKS5nZXRTaXRlKCkuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gbG9jayB0aGUgbGl2ZSBzaXRlIHRvIGF2b2lkIG92ZXJyaWRpbmcgY2hhbmdlcyBtYWRlIGJ5IG90aGVycwotICAgICAgICAgICAgICAgIFNpdGVTdHJ1Y3R1cmUgbGl2ZVNpdGUgPSBkb2MuZ2V0UHVibGljYXRpb24oKS5nZXRBcmVhKFB1YmxpY2F0aW9uLkxJVkVfQVJFQSkuZ2V0U2l0ZSgpOwotICAgICAgICAgICAgICAgIG5vZGVzLmFkZChsaXZlU2l0ZS5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIChvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbXSkgbm9kZXMKLSAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZVtub2Rlcy5zaXplKCldKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVzZWNhc2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIHdvcmtmbG93IGV2ZW50IGlzIHN1cHBvcnRlZCBhbmQgdGhlIHBhcmVudCBvZiB0aGUgZG9jdW1lbnQKLSAgICAgKiBleGlzdHMgaW4gdGhlIGxpdmUgYXJlYS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvQ2hlY2tQcmVjb25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotICAgICAgICBpZiAoIWhhc0Vycm9ycygpKSB7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRBcmVhKCkuZXF1YWxzKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKSkgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhpcyB1c2VjYXNlIGNhbiBvbmx5IGJlIGludm9rZWQgZnJvbSB0aGUgYXV0aG9yaW5nIGFyZWEuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGRvY3VtZW50LmdldFB1YmxpY2F0aW9uKCk7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gZG9jdW1lbnQuZ2V0RmFjdG9yeSgpOwotICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBsaXZlU2l0ZSA9IHB1YmxpY2F0aW9uLmdldEFyZWEoUHVibGljYXRpb24uTElWRV9BUkVBKS5nZXRTaXRlKCk7Ci0KLSAgICAgICAgICAgIExpc3QgbWlzc2luZ0RvY3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgICAgIFNpdGVNYW5hZ2VyIHNpdGVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgICAgICBzaXRlTWFuYWdlciA9IChTaXRlTWFuYWdlcikgc2VsZWN0b3Iuc2VsZWN0KHB1YmxpY2F0aW9uLmdldFNpdGVNYW5hZ2VySGludCgpKTsKLQotICAgICAgICAgICAgICAgIGlmICghbGl2ZVNpdGUuY29udGFpbnMoZG9jdW1lbnQuZ2V0UGF0aCgpKSkgewotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudExvY2F0b3IgbGl2ZUxvYyA9IGRvY3VtZW50LmdldExvY2F0b3IoKS5nZXRBcmVhVmVyc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWNhdGlvbi5MSVZFX0FSRUEpOwotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudExvY2F0b3JbXSByZXF1aXJlZE5vZGVzID0gc2l0ZU1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVxdWlyZWRSZXNvdXJjZXMobWFwLCBsaXZlTG9jKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVpcmVkTm9kZXNbaV0uZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXZlU2l0ZS5jb250YWlucyhwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgbGluayA9IGdldEV4aXN0aW5nTGluayhwYXRoLCBkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nRG9jdW1lbnRzLmFkZChsaW5rLmdldERvY3VtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2Uoc2l0ZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbWlzc2luZ0RvY3VtZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoInB1Ymxpc2gtbWlzc2luZy1kb2N1bWVudHMiKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtaXNzaW5nRG9jdW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGRvZXNuJ3Qgd29yayB5ZXQsIHNlZQotICAgICAgICAgICAgICAgICAgICAgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NPQ09PTi0yMDU3Ci0gICAgICAgICAgICAgICAgICAgICAqIFN0cmluZ1tdIHBhcmFtcyA9IHsgZG9jLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpLAotICAgICAgICAgICAgICAgICAgICAgKiBkb2MuZ2V0UGF0aCgpICsgIiAoIiArIGRvYy5nZXRMYW5ndWFnZSgpICsgIikiIH07Ci0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IGRvYy5nZXRQYXRoKCkgKyAiOiIgKyBkb2MuZ2V0TGFuZ3VhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdWJsaW5Db3JlSGVscGVyLmdldFRpdGxlKGRvYywgdHJ1ZSkgfTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJtaXNzaW5nLWRvY3VtZW50IiwgcGFyYW1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChoYXNCcm9rZW5MaW5rcygpKSB7Ci0gICAgICAgICAgICAgICAgYWRkSW5mb01lc3NhZ2UoInB1Ymxpc2gtYnJva2VuLWxpbmtzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGluayBvZiBhIGNlcnRhaW4gbm9kZSwgcHJlZmVyYWJseSBpbiB0aGUgZG9jdW1lbnQncyBsYW5ndWFnZSwKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbm9kZSBoYXMgbm8gbGlua3MuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgdGhlIG5vZGUuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgbGluayBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaW5rIGdldEV4aXN0aW5nTGluayhTdHJpbmcgcGF0aCwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IGRvY3VtZW50LmFyZWEoKS5nZXRTaXRlKCkuZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgTGluayBsaW5rID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHV1aWQgPSBub2RlLmdldFV1aWQoKTsKLSAgICAgICAgaWYgKHV1aWQgIT0gbnVsbCAmJiB1dWlkLmVxdWFscyhkb2N1bWVudC5nZXRVVUlEKCkpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZS5oYXNMaW5rKGRvY3VtZW50LmdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgbGluayA9IG5vZGUuZ2V0TGluayhkb2N1bWVudC5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRMYW5ndWFnZXMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgbGluayA9IG5vZGUuZ2V0TGluayhub2RlLmdldExhbmd1YWdlcygpWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGluazsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotICAgICAgICBib29sZWFuIHNjaGVkdWxlID0gQm9vbGVhbi52YWx1ZU9mKGdldEJvb2xlYW5DaGVja2JveFBhcmFtZXRlcihTQ0hFRFVMRSkpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICBpZiAoc2NoZWR1bGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBkYXRlU3RyaW5nID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoU0NIRURVTEVfVElNRSk7Ci0gICAgICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvcm1hdC5wYXJzZShkYXRlU3RyaW5nKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoInNjaGVkdWxlci1kYXRlLWZvcm1hdC1pbnZhbGlkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiBzY2hlZHVsZSA9IEJvb2xlYW4udmFsdWVPZihnZXRCb29sZWFuQ2hlY2tib3hQYXJhbWV0ZXIoU0NIRURVTEUpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgaWYgKHNjaGVkdWxlKSB7Ci0gICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoU0NIRURVTEUpOwotICAgICAgICAgICAgU3RyaW5nIGRhdGVTdHJpbmcgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhTQ0hFRFVMRV9USU1FKTsKLSAgICAgICAgICAgIERhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MiKTsKLSAgICAgICAgICAgIFVzZWNhc2VTY2hlZHVsZXIgc2NoZWR1bGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gZm9ybWF0LnBhcnNlKGRhdGVTdHJpbmcpOwotICAgICAgICAgICAgICAgIHNjaGVkdWxlciA9IChVc2VjYXNlU2NoZWR1bGVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFVzZWNhc2VTY2hlZHVsZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlKHRoaXMsIGRhdGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgic2NoZWR1bGVyLWRhdGUtZm9ybWF0LWludmFsaWQiKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNjaGVkdWxlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgICAgICAgICBwdWJsaXNoKGdldFNvdXJjZURvY3VtZW50KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHVibGlzaChEb2N1bWVudCBhdXRob3JpbmdEb2N1bWVudCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uLCBTaXRlRXhjZXB0aW9uLAotICAgICAgICAgICAgUHVibGljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGNyZWF0ZUFuY2VzdG9yTm9kZXMoYXV0aG9yaW5nRG9jdW1lbnQpOwotCi0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIGRvY3VtZW50TWFuYWdlci5jb3B5VG9BcmVhKGF1dGhvcmluZ0RvY3VtZW50LCBQdWJsaWNhdGlvbi5MSVZFX0FSRUEpOwotCi0gICAgICAgICAgICBib29sZWFuIG5vdGlmeSA9IEJvb2xlYW4udmFsdWVPZihnZXRCb29sZWFuQ2hlY2tib3hQYXJhbWV0ZXIoU0VORF9OT1RJRklDQVRJT04pKQotICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAobm90aWZ5KSB7Ci0gICAgICAgICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbihhdXRob3JpbmdEb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoZG9jdW1lbnRNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNlbmROb3RpZmljYXRpb24oRG9jdW1lbnQgYXV0aG9yaW5nRG9jdW1lbnQpIHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBEb2N1bWVudEV4Y2VwdGlvbiwgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVzZXIgc2VuZGVyID0gZ2V0U2Vzc2lvbigpLmdldElkZW50aXR5KCkuZ2V0VXNlcigpOwotCi0gICAgICAgIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKHRoaXMubWFuYWdlciwgZ2V0U2Vzc2lvbigpLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLCBhdXRob3JpbmdEb2N1bWVudCk7Ci0gICAgICAgIFZlcnNpb24gdmVyc2lvbnNbXSA9IHdvcmtmbG93YWJsZS5nZXRWZXJzaW9ucygpOwotICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSB2ZXJzaW9uc1t2ZXJzaW9ucy5sZW5ndGggLSAyXTsKLQotICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gc3VibWl0dGVkLCBvdGhlcndpc2Ugd2UgZG8KLSAgICAgICAgLy8gbm90aGluZwotICAgICAgICBpZiAodmVyc2lvbi5nZXRFdmVudCgpLmVxdWFscygic3VibWl0IikpIHsKLQotICAgICAgICAgICAgU3RyaW5nIHVzZXJJZCA9IHZlcnNpb24uZ2V0VXNlcklkKCk7Ci0gICAgICAgICAgICBVc2VyIHVzZXIgPSBQb2xpY3lVdGlsLmdldFVzZXIodGhpcy5tYW5hZ2VyLCBhdXRob3JpbmdEb2N1bWVudC5nZXRDYW5vbmljYWxXZWJhcHBVUkwoKSwKLSAgICAgICAgICAgICAgICAgICAgdXNlcklkLCBnZXRMb2dnZXIoKSk7Ci0KLSAgICAgICAgICAgIElkZW50aWZpYWJsZVtdIHJlY2lwaWVudHMgPSB7IHVzZXIgfTsKLQotICAgICAgICAgICAgRG9jdW1lbnQgbGl2ZVZlcnNpb24gPSBhdXRob3JpbmdEb2N1bWVudC5nZXRBcmVhVmVyc2lvbihQdWJsaWNhdGlvbi5MSVZFX0FSRUEpOwotICAgICAgICAgICAgU3RyaW5nIHVybDsKLQotICAgICAgICAgICAgUHJveHkgcHJveHkgPSBsaXZlVmVyc2lvbi5nZXRQdWJsaWNhdGlvbigpLmdldFByb3h5KGxpdmVWZXJzaW9uLCBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVybCA9IHByb3h5LmdldFVSTChsaXZlVmVyc2lvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLmNvbnRleHQpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2ZXJVcmwgPSAiaHR0cDovLyIgKyByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSArICI6IgotICAgICAgICAgICAgICAgICAgICAgICAgKyByZXF1ZXN0LmdldFNlcnZlclBvcnQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2ViYXBwVXJsID0gbGl2ZVZlcnNpb24uZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCk7Ci0gICAgICAgICAgICAgICAgdXJsID0gc2VydmVyVXJsICsgcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgd2ViYXBwVXJsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyB1cmwgfTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKE1FU1NBR0VfU1VCSkVDVCwgbmV3IFN0cmluZ1swXSwKLSAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9ET0NVTUVOVF9QVUJMSVNIRUQsIHBhcmFtcywgc2VuZGVyLCByZWNpcGllbnRzKTsKLQotICAgICAgICAgICAgTm90aWZpY2F0aW9uRXZlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgTm90aWZpY2F0aW9uRXZlbnREZXNjcmlwdG9yKG1lc3NhZ2UpOwotICAgICAgICAgICAgUmVwb3NpdG9yeUV2ZW50IGV2ZW50ID0gUmVwb3NpdG9yeUV2ZW50RmFjdG9yeS5jcmVhdGVFdmVudCh0aGlzLm1hbmFnZXIsIGdldFNlc3Npb24oKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCksIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLmVucXVldWVFdmVudChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbmNlc3Rvck5vZGVzKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBEb2N1bWVudEV4Y2VwdGlvbiwgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgbGl2ZVNpdGUgPSBkb2N1bWVudC5nZXRQdWJsaWNhdGlvbigpLmdldEFyZWEoUHVibGljYXRpb24uTElWRV9BUkVBKS5nZXRTaXRlKCk7Ci0gICAgICAgIFN0cmluZ1tdIHN0ZXBzID0gZG9jdW1lbnQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKS5zcGxpdCgiLyIpOwotICAgICAgICBpbnQgcyA9IDA7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gIiI7Ci0gICAgICAgIHdoaWxlIChzIDwgc3RlcHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpZiAoIWxpdmVTaXRlLmNvbnRhaW5zKHBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgbGl2ZVNpdGUuYWRkKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0aCArPSAiLyIgKyBzdGVwc1tzXTsKLSAgICAgICAgICAgIHMrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGxpc3Qgb2YgbGlua3Mgb3JpZ2luYXRpbmcgZnJvbSBhIGRvY3VtZW50LiBBbGxvd3MgbGF6eSBsb2FkaW5nIHJvbSB0aGUgdXNlY2FzZSB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlua0xpc3QgewotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLSAgICAgICAgcHJpdmF0ZSBEb2N1bWVudFtdIGRvY3VtZW50czsKLSAgICAgICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBtYW5hZ2VyLgotICAgICAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byByZXNvbHZlIHRoZSBsaW5rcyBmcm9tLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpbmtMaXN0KFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIERvY3VtZW50IGRvYykgewotICAgICAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2M7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBsaW5rIGRvY3VtZW50cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEb2N1bWVudFtdIGdldERvY3VtZW50cygpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmRvY3VtZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBnZXRVbnB1Ymxpc2hlZExpbmtzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudHM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBEb2N1bWVudFtdIGdldFVucHVibGlzaGVkTGlua3MoKSB7Ci0gICAgICAgICAgICBTZXQgZG9jcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBMaW5rTWFuYWdlciBsaW5rTWdyID0gbnVsbDsKLSAgICAgICAgICAgIExpbmtSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxpbmtNZ3IgPSAoTGlua01hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoTGlua01hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIgPSAoTGlua1Jlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKExpbmtSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtbXSBsaW5rcyA9IGxpbmtNZ3IuZ2V0TGlua3NGcm9tKHRoaXMuZG9jdW1lbnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTGlua1RhcmdldCB0YXJnZXQgPSByZXNvbHZlci5yZXNvbHZlKHRoaXMuZG9jdW1lbnQsIGxpbmtzW2ldLmdldFVyaSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gdGFyZ2V0LmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvYy5leGlzdHNBcmVhVmVyc2lvbihQdWJsaWNhdGlvbi5MSVZFX0FSRUEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jcy5hZGQoZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChsaW5rTWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UobGlua01ncik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKERvY3VtZW50W10pIGRvY3MudG9BcnJheShuZXcgRG9jdW1lbnRbZG9jcy5zaXplKCldKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL1JlamVjdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9SZWplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhMDM3OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL1JlamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aWZpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5RXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uUmVwb3NpdG9yeUV2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Qcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuSW52b2tlV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXZlbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZTsKLQotLyoqCi0gKiBSZWplY3QgdXNlY2FzZSBoYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgUmVqZWN0IGV4dGVuZHMgSW52b2tlV29ya2Zsb3cgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9TVUJKRUNUID0gIm5vdGlmaWNhdGlvbi1tZXNzYWdlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RPQ1VNRU5UX1JFSkVDVEVEID0gImRvY3VtZW50LXJlamVjdGVkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUpFQ1RfUkVBU09OID0gInJlamVjdFJlYXNvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VORF9OT1RJRklDQVRJT04gPSAic2VuZE5vdGlmaWNhdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBub3RpZnkgPSBCb29sZWFuLnZhbHVlT2YoZ2V0Qm9vbGVhbkNoZWNrYm94UGFyYW1ldGVyKFNFTkRfTk9USUZJQ0FUSU9OKSkKLSAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChub3RpZnkpIHsKLSAgICAgICAgICAgIHNlbmROb3RpZmljYXRpb24oZ2V0U291cmNlRG9jdW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTm90aWZpY2F0aW9uKERvY3VtZW50IGF1dGhvcmluZ0RvY3VtZW50KSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgRG9jdW1lbnRFeGNlcHRpb24sIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIFVzZXIgc2VuZGVyID0gZ2V0U2Vzc2lvbigpLmdldElkZW50aXR5KCkuZ2V0VXNlcigpOwotCi0gICAgICAgIFN0cmluZyByZWFzb24gPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhSRUpFQ1RfUkVBU09OKTsKLSAgICAgICAgV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSA9IFdvcmtmbG93VXRpbC5nZXRXb3JrZmxvd2FibGUodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCksIGF1dGhvcmluZ0RvY3VtZW50KTsKLSAgICAgICAgVmVyc2lvbiB2ZXJzaW9uc1tdID0gd29ya2Zsb3dhYmxlLmdldFZlcnNpb25zKCk7Ci0gICAgICAgIC8vIGN1cnJlbnQgdmVyc2lvbiBpcyByZWplY3QsIHdhbnQgb3JpZ2luYXRpbmcgc3VibWl0Ci0gICAgICAgIFZlcnNpb24gdmVyc2lvbiA9IHZlcnNpb25zW3ZlcnNpb25zLmxlbmd0aCAtIDJdOwotCi0gICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IHRoZSBkb2N1bWVudCBoYXMgYmVlbiBzdWJtaXR0ZWQsIG90aGVyd2lzZSB3ZSBkbwotICAgICAgICAvLyBub3RoaW5nCi0gICAgICAgIGlmICh2ZXJzaW9uLmdldEV2ZW50KCkuZXF1YWxzKCJzdWJtaXQiKSkgewotCi0gICAgICAgICAgICBTdHJpbmcgdXNlcklkID0gdmVyc2lvbi5nZXRVc2VySWQoKTsKLSAgICAgICAgICAgIFVzZXIgdXNlciA9IFBvbGljeVV0aWwuZ2V0VXNlcih0aGlzLm1hbmFnZXIsIGF1dGhvcmluZ0RvY3VtZW50LmdldENhbm9uaWNhbFdlYmFwcFVSTCgpLAotICAgICAgICAgICAgICAgICAgICB1c2VySWQsIGdldExvZ2dlcigpKTsKLQotICAgICAgICAgICAgSWRlbnRpZmlhYmxlW10gcmVjaXBpZW50cyA9IHsgdXNlciB9OwotCi0gICAgICAgICAgICBEb2N1bWVudCBhdXRob3JpbmdWZXJzaW9uID0gYXV0aG9yaW5nRG9jdW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEFyZWFWZXJzaW9uKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmw7Ci0KLSAgICAgICAgICAgIFByb3h5IHByb3h5ID0gYXV0aG9yaW5nVmVyc2lvbi5nZXRQdWJsaWNhdGlvbigpLmdldFByb3h5KGF1dGhvcmluZ1ZlcnNpb24sIGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXJsID0gcHJveHkuZ2V0VVJMKGF1dGhvcmluZ1ZlcnNpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QodGhpcy5jb250ZXh0KTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmVyVXJsID0gImh0dHA6Ly8iICsgcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkgKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdlYmFwcFVybCA9IGF1dGhvcmluZ1ZlcnNpb24uZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCk7Ci0gICAgICAgICAgICAgICAgdXJsID0gc2VydmVyVXJsICsgcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgd2ViYXBwVXJsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyByZWFzb24sIHVybCB9OwotICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoTUVTU0FHRV9TVUJKRUNULCBuZXcgU3RyaW5nWzBdLAotICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX0RPQ1VNRU5UX1JFSkVDVEVELCBwYXJhbXMsIHNlbmRlciwgcmVjaXBpZW50cyk7Ci0KLSAgICAgICAgICAgIE5vdGlmaWNhdGlvbkV2ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IE5vdGlmaWNhdGlvbkV2ZW50RGVzY3JpcHRvcihtZXNzYWdlKTsKLSAgICAgICAgICAgIFJlcG9zaXRvcnlFdmVudCBldmVudCA9IFJlcG9zaXRvcnlFdmVudEZhY3RvcnkuY3JlYXRlRXZlbnQodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGdldFNlc3Npb24oKS5lbnF1ZXVlRXZlbnQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9TdWJtaXQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvU3VibWl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDBhZTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9TdWJtaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5RXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uUmVwb3NpdG9yeUV2ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Qcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuSW52b2tlV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25FdmVudERlc2NyaXB0b3I7Ci0KLS8qKgotICogU3VibWl0IHVzZWNhc2UgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFN1Ym1pdCBleHRlbmRzIEludm9rZVdvcmtmbG93IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfU1VCSkVDVCA9ICJub3RpZmljYXRpb24tbWVzc2FnZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9ET0NVTUVOVF9TVUJNSVRURUQgPSAiZG9jdW1lbnQtc3VibWl0dGVkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRU5EX05PVElGSUNBVElPTiA9ICJzZW5kTm90aWZpY2F0aW9uIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChCb29sZWFuLnZhbHVlT2YoZ2V0Qm9vbGVhbkNoZWNrYm94UGFyYW1ldGVyKFNFTkRfTk9USUZJQ0FUSU9OKSkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIHNlbmROb3RpZmljYXRpb24oZ2V0U291cmNlRG9jdW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTm90aWZpY2F0aW9uKERvY3VtZW50IGF1dGhvcmluZ0RvY3VtZW50KSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgRG9jdW1lbnRFeGNlcHRpb24sIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIFVzZXIgc2VuZGVyID0gZ2V0U2Vzc2lvbigpLmdldElkZW50aXR5KCkuZ2V0VXNlcigpOwotCi0gICAgICAgIFVzZXJbXSByZWNpcGllbnRzID0gUG9saWN5VXRpbC5nZXRVc2Vyc1dpdGhSb2xlKHRoaXMubWFuYWdlciwgYXV0aG9yaW5nRG9jdW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCksICJyZXZpZXciLCBnZXRMb2dnZXIoKSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGN1cnJlbnQgdXNlciBjYW4gcmV2aWV3IHRoZWlyIG93biBzdWJtaXNzaW9uCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjaXBpZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHJlY2lwaWVudHNbaV0uZXF1YWxzKHNlbmRlcikpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHVybDsKLSAgICAgICAgRG9jdW1lbnQgYXV0aG9yaW5nVmVyc2lvbiA9IGF1dGhvcmluZ0RvY3VtZW50LmdldEFyZWFWZXJzaW9uKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKTsKLSAgICAgICAgUHJveHkgcHJveHkgPSBhdXRob3JpbmdWZXJzaW9uLmdldFB1YmxpY2F0aW9uKCkuZ2V0UHJveHkoYXV0aG9yaW5nVmVyc2lvbiwgZmFsc2UpOwotCi0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cmwgPSBwcm94eS5nZXRVUkwoYXV0aG9yaW5nVmVyc2lvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QodGhpcy5jb250ZXh0KTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2ZXJVcmwgPSAiaHR0cDovLyIgKyByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSArICI6IgotICAgICAgICAgICAgICAgICAgICArIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdlYmFwcFVybCA9IGF1dGhvcmluZ1ZlcnNpb24uZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCk7Ci0gICAgICAgICAgICB1cmwgPSBzZXJ2ZXJVcmwgKyByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyB3ZWJhcHBVcmw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IHVybCB9OwotCi0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKE1FU1NBR0VfU1VCSkVDVCwgbmV3IFN0cmluZ1swXSwgTUVTU0FHRV9ET0NVTUVOVF9TVUJNSVRURUQsCi0gICAgICAgICAgICAgICAgcGFyYW1zLCBzZW5kZXIsIHJlY2lwaWVudHMpOwotICAgICAgICBOb3RpZmljYXRpb25FdmVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBOb3RpZmljYXRpb25FdmVudERlc2NyaXB0b3IobWVzc2FnZSk7Ci0gICAgICAgIFJlcG9zaXRvcnlFdmVudCBldmVudCA9IFJlcG9zaXRvcnlFdmVudEZhY3RvcnkuY3JlYXRlRXZlbnQodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCksIGRlc2NyaXB0b3IpOwotICAgICAgICBnZXRTZXNzaW9uKCkuZW5xdWV1ZUV2ZW50KGV2ZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL1VzZWNhc2VXb3JrZmxvd0hlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9Vc2VjYXNlV29ya2Zsb3dIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjYmM1MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3dvcmtmbG93L3VzZWNhc2VzL1VzZWNhc2VXb3JrZmxvd0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuZHVibGluY29yZS5EdWJsaW5Db3JlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LldvcmtmbG93VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93RXhjZXB0aW9uOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3Igd29ya2Zsb3cgcmVsYXRlZCB1c2VjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIFVzZWNhc2VXb3JrZmxvd0hlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZXJyb3IgbWVzc2FnZSB0aGF0IGFuIGV2ZW50IGNhbiBub3QgYmUgaW52b2tlZCBvbiBhIGRvY3VtZW50LiBJdAotICAgICAqIHRha2VzIHR3byBwYXJhbWV0ZXJzOiB0aGUgZXZlbnQgbmFtZSBhbmQgdGhlIGRvY3VtZW50IHRpdGxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0NBTk5PVF9JTlZPS0VfRVZFTlQgPSAiZXJyb3Itd29ya2Zsb3ctZG9jdW1lbnQiOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlcnJvciBtZXNzYWdlIHRvIGEgdXNlY2FzZSB0aGF0IGFuIGV2ZW50IGNhbm5vdCBiZSBpbnZva2VkIG9uIGEKLSAgICAgKiBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gdXNlY2FzZSBUaGUgdXNlY2FzZS4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LgotICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgdm9pZCBhZGRXb3JrZmxvd0Vycm9yKEFic3RyYWN0VXNlY2FzZSB1c2VjYXNlLCBTdHJpbmcgZXZlbnQsIERvY3VtZW50IGRvYykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gRHVibGluQ29yZUhlbHBlci5nZXRUaXRsZShkb2MsIHRydWUpOwotICAgICAgICAgICAgaWYgKHRpdGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aXRsZSA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXNlY2FzZS5hZGRFcnJvck1lc3NhZ2UoRVJST1JfQ0FOTk9UX0lOVk9LRV9FVkVOVCwgbmV3IFN0cmluZ1tdIHsgZXZlbnQsIHRpdGxlIH0pOwotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgZXZlbnQgY2FuIG5vdCBiZSBpbnZva2VkLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIHVzZWNhc2UgVGhlIHVzZWNhc2UuCi0gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudC4KLSAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGNoZWNrV29ya2Zsb3coU2VydmljZU1hbmFnZXIgbWFuYWdlciwgQWJzdHJhY3RVc2VjYXNlIHVzZWNhc2UsCi0gICAgICAgICAgICBTdHJpbmcgZXZlbnQsIERvY3VtZW50IGRvYywgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFXb3JrZmxvd1V0aWwuY2FuSW52b2tlKG1hbmFnZXIsIHVzZWNhc2UuZ2V0U2Vzc2lvbigpLCBsb2dnZXIsIGRvYywgZXZlbnQpKSB7Ci0gICAgICAgICAgICAgICAgVXNlY2FzZVdvcmtmbG93SGVscGVyLmFkZFdvcmtmbG93RXJyb3IodXNlY2FzZSwgZXZlbnQsIGRvYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFdvcmtmbG93RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvd29ya2Zsb3cvdXNlY2FzZXMvV29ya2Zsb3dhYmxlV3JhcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9Xb3JrZmxvd2FibGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTEwMjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy93b3JrZmxvdy91c2VjYXNlcy9Xb3JrZmxvd2FibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dhYmxlOwotCi0vKioKLSAqIFdyYXAgYSB3b3JrZmxvd2FibGUgZm9yIGVhc3kgZXZhbHVhdGlvbiBpbiBKWCB0ZW1wbGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtmbG93YWJsZVdyYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgewotCi0gICAgcHJpdmF0ZSBNdWx0aVdvcmtmbG93IHVzZWNhc2U7Ci0gICAgcHJpdmF0ZSBXb3JrZmxvd2FibGUgd29ya2Zsb3dhYmxlOwotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLSAgICBwcml2YXRlIERvY3VtZW50IGRvY3VtZW50OwotICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gdXNlY2FzZSBUaGUgdXNlY2FzZS4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uLgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgZG9jdW1lbnQgdG8gd3JhcC4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIFdvcmtmbG93YWJsZVdyYXBwZXIoTXVsdGlXb3JrZmxvdyB1c2VjYXNlLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBTZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICB0aGlzLnVzZWNhc2UgPSB1c2VjYXNlOwotICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBXb3JrZmxvd2FibGUgZ2V0V29ya2Zsb3dhYmxlKCkgewotICAgICAgICBpZiAodGhpcy53b3JrZmxvd2FibGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy53b3JrZmxvd2FibGUgPSBXb3JrZmxvd1V0aWwuZ2V0V29ya2Zsb3dhYmxlKHRoaXMubWFuYWdlciwgdGhpcy5zZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSwgdGhpcy5kb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMud29ya2Zsb3dhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBsYXRlc3QgdmVyc2lvbi4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZTsKLSAgICAgICAgaWYgKGdldFdvcmtmbG93YWJsZSgpLmdldFZlcnNpb25zKCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgc3RhdGUgPSBnZXRXb3JrZmxvd2FibGUoKS5nZXRMYXRlc3RWZXJzaW9uKCkuZ2V0U3RhdGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFdvcmtmbG93IHdvcmtmbG93ID0gZ2V0V29ya2Zsb3dTY2hlbWEoKTsKLSAgICAgICAgICAgIHN0YXRlID0gd29ya2Zsb3cuZ2V0SW5pdGlhbFN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQWxsIHN0YXRlcyBzdXBwb3J0ZWQgYnkgdGhlIHdvcmtmbG93IHNjaGVtYS4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFN0YXRlcygpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRXb3JrZmxvd1NjaGVtYSgpLmdldFN0YXRlcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBXb3JrZmxvdyBnZXRXb3JrZmxvd1NjaGVtYSgpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdvcmtmbG93IHdvcmtmbG93ID0gV29ya2Zsb3dVdGlsLmdldFdvcmtmbG93U2NoZW1hKHRoaXMubWFuYWdlciwgdGhpcy5zZXNzaW9uLCBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50KTsKLSAgICAgICAgcmV0dXJuIHdvcmtmbG93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHBhdGggb2YgdGhlIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gSWYgdGhlIGRvY3VtZW50IGlzIG5vdCByZWZlcmVuY2VkIGluIHRoZSBzaXRlCi0gICAgICogICAgICAgICBzdHJ1Y3R1cmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuZ2V0UGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5nZXRMYW5ndWFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHdlYiBhcHBsaWNhdGlvbiBVUkwgb2YgdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5nZXRDYW5vbmljYWxXZWJhcHBVUkwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEFsbCBleGVjdXRhYmxlIGV2ZW50cyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFVzZWNhc2VzKCkgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIHsKLSAgICAgICAgU29ydGVkU2V0IHVzZWNhc2VzID0gbmV3IFRyZWVTZXQoKTsKLSAgICAgICAgU3RyaW5nW10gZXZlbnRzID0gZ2V0V29ya2Zsb3dTY2hlbWEoKS5nZXRFdmVudHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChXb3JrZmxvd1V0aWwuY2FuSW52b2tlKHRoaXMubWFuYWdlciwgdGhpcy5zZXNzaW9uLCBnZXRMb2dnZXIoKSwgdGhpcy5kb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRzW2ldKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV2ZW50VXNlY2FzZXMgPSB0aGlzLnVzZWNhc2UuZ2V0VXNlY2FzZXMoZXZlbnRzW2ldKTsKLSAgICAgICAgICAgICAgICB1c2VjYXNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChldmVudFVzZWNhc2VzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSB1c2VjYXNlcy50b0FycmF5KG5ldyBTdHJpbmdbdXNlY2FzZXMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxhbmd1YWdlcyBvZiB0aGUgZG9jdW1lbnQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldExhbmd1YWdlcygpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IHRoaXMuZG9jdW1lbnQuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgIEFycmF5cy5zb3J0KGxhbmd1YWdlcyk7Ci0gICAgICAgIHJldHVybiBsYW5ndWFnZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvQWJzdHJhY3RDb25kaXRpb24uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL0Fic3RyYWN0Q29uZGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMjZkOTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvQWJzdHJhY3RDb25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dFeGNlcHRpb247Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igd29ya2Zsb3cgY29uZGl0aW9ucy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29uZGl0aW9uIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuaW1wbC5BYnN0cmFjdENvbmRpdGlvbiNzZXRFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihTdHJpbmcgZXgpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4LnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgY29uZGl0aW9uLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb24oKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvaW1wbC9BY3Rpb25JbXBsLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvaW1wbC9BY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWEzYzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvQWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5BY3Rpb247Ci0KLS8qKgotICogQmFzaWMgYWN0aW9uIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uSW1wbCBpbXBsZW1lbnRzIEFjdGlvbiB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBBY3Rpb25JbXBsLgotICAgICAqIEBwYXJhbSBhY3Rpb25JZCBUaGUgYWN0aW9uIElELgotICAgICAqLwotICAgIHByb3RlY3RlZCBBY3Rpb25JbXBsKFN0cmluZyBhY3Rpb25JZCkgewotICAgICAgICB0aGlzLmlkID0gYWN0aW9uSWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gSUQuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJZCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvQm9vbGVhblZhcmlhYmxlQXNzaWdubWVudEltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL0Jvb2xlYW5WYXJpYWJsZUFzc2lnbm1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjIzMmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvQm9vbGVhblZhcmlhYmxlQXNzaWdubWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuQm9vbGVhblZhcmlhYmxlQXNzaWdubWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGJvb2xlYW4gdmFyaWFibGUgYXNzaWdubWVudC4KLSAqLwotcHVibGljIGNsYXNzIEJvb2xlYW5WYXJpYWJsZUFzc2lnbm1lbnRJbXBsIGltcGxlbWVudHMgQm9vbGVhblZhcmlhYmxlQXNzaWdubWVudCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdmFyaWFibGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuVmFyaWFibGVBc3NpZ25tZW50SW1wbChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhcmlhYmxlID0gbmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHZhcmlhYmxlOwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5BY3Rpb24jZXhlY3V0ZShvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlZlcnNpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShWZXJzaW9uIHJlc3VsdGluZ1ZlcnNpb24pIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlc3VsdGluZ1ZlcnNpb24uc2V0VmFsdWUoZ2V0VmFyaWFibGUoKSwgZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBhc3NpZ25tZW50LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBvZiB0aGlzIGFzc2lnbm1lbnQuCi0gICAgICogQHJldHVybiBBIHZhcmlhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL0Jvb2xlYW5WYXJpYWJsZUNvbmRpdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvQm9vbGVhblZhcmlhYmxlQ29uZGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNDA4YWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvQm9vbGVhblZhcmlhYmxlQ29uZGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dhYmxlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIGEgYm9vbGVhbiB2YXJpYWJsZSBjb25kaXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29sZWFuVmFyaWFibGVDb25kaXRpb24gZXh0ZW5kcyBBYnN0cmFjdENvbmRpdGlvbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YXJpYWJsZU5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHZhbHVlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFyaWFibGUgdmFsdWUgdG8gY2hlY2suCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gY2hlY2suCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhcmlhYmxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFibGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Db25kaXRpb24jc2V0RXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0gICAgICAgIFN0cmluZ1tdIHNpZGVzID0gZXhwcmVzc2lvbi5zcGxpdCgiPSIpOwotICAgICAgICBpZiAoc2lkZXMubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0V4Y2VwdGlvbigiVGhlIGV4cHJlc3Npb24gJyIgKyBleHByZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICsgIicgbXVzdCBiZSBvZiB0aGUgZm9ybSAnbmFtZSA9IFt0cnVlfGZhbHNlXSciKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gc2lkZXNbMF0udHJpbSgpOwotICAgICAgICB0aGlzLnZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKHNpZGVzWzFdLnRyaW0oKSkuYm9vbGVhblZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJFeHByZXNzaW9uOiAgICBbIiArIHNpZGVzWzFdLnRyaW0oKSArICJdIik7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiU2V0dGluZyB2YWx1ZTogWyIgKyB0aGlzLnZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Db25kaXRpb24jaXNDb21wbGllZChvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGllZChXb3JrZmxvdyB3b3JrZmxvdywgV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSkKLSAgICAgICAgICAgIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFZlcnNpb24gbGF0ZXN0VmVyc2lvbiA9IHdvcmtmbG93YWJsZS5nZXRMYXRlc3RWZXJzaW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gdmFsdWUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGxhdGVzdFZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWUgPSB3b3JrZmxvdy5nZXRJbml0aWFsVmFsdWUoZ2V0VmFyaWFibGVOYW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsdWUgPSBsYXRlc3RWZXJzaW9uLmdldFZhbHVlKGdldFZhcmlhYmxlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ2hlY2tpbmcgYm9vbGVhbiB2YXJpYWJsZSBjb25kaXRpb24iKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIgICAgQ29uZGl0aW9uIHZhbHVlOiBbIiArIGdldFZhbHVlKCkgKyAiXSIpOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBWYXJpYWJsZSB2YWx1ZTogIFsiICsgdmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZSA9PSBnZXRWYWx1ZSgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvaW1wbC9Cb29sZWFuVmFyaWFibGVJbXBsLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvaW1wbC9Cb29sZWFuVmFyaWFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzgyMjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvQm9vbGVhblZhcmlhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Cb29sZWFuVmFyaWFibGU7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGJvb2xlYW4gdmFyaWFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29sZWFuVmFyaWFibGVJbXBsIGltcGxlbWVudHMgQm9vbGVhblZhcmlhYmxlIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2xlYW5WYXJpYWJsZUltcGwuCi0gICAgICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgdmFyaWFibGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gX2luaXRpYWxWYWx1ZSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBpbnN0YW5jZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJvb2xlYW5WYXJpYWJsZUltcGwoU3RyaW5nIHZhcmlhYmxlTmFtZSwgYm9vbGVhbiBfaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IHZhcmlhYmxlTmFtZTsKLSAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSBfaW5pdGlhbFZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuQm9vbGVhblZhcmlhYmxlI2dldE5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbFZhbHVlOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LkJvb2xlYW5WYXJpYWJsZSNnZXRJbml0aWFsVmFsdWUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEluaXRpYWxWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL0NvbmRpdGlvbkZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL0NvbmRpdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmYjc2NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvaW1wbC9Db25kaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd0V4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEZhY3RvcnkgdG8gYnVpbGQgY29uZGl0aW9ucy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbmRpdGlvbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgewotICAgIAotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZGl0aW9uRmFjdG9yeShMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb25kaXRpb24uCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY29uZGl0aW9uIGNsYXNzIG5hbWUuCi0gICAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNvbmRpdGlvbiBleHByZXNzaW9uLgotICAgICAqIEByZXR1cm4gQSBjb25kaXRpb24uCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIHRoZSBjb25kaXRpb24gZmFpbGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb25kaXRpb24gY3JlYXRlQ29uZGl0aW9uKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBleHByZXNzaW9uKQotICAgICAgICB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotCi0gICAgICAgIENvbmRpdGlvbiBjb25kaXRpb247Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgY29uZGl0aW9uID0gKENvbmRpdGlvbikgY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyhjb25kaXRpb24sIGdldExvZ2dlcigpKTsKLSAgICAgICAgICAgIGNvbmRpdGlvbi5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvaW1wbC9UcmFuc2l0aW9uSW1wbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvVHJhbnNpdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0Yjc2Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvaW1wbC9UcmFuc2l0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuVHJhbnNpdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgYSB0cmFuc2l0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBUcmFuc2l0aW9uIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIHNvdXJjZVN0YXRlIFRoZSBzb3VyY2Ugc3RhdGUuCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uU3RhdGUgVGhlIGRlc3RpbmF0aW9uIHN0YXRlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2l0aW9uSW1wbChTdHJpbmcgc291cmNlU3RhdGUsIFN0cmluZyBkZXN0aW5hdGlvblN0YXRlKSB7Ci0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlU3RhdGU7Ci0gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvblN0YXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5bmNocm9uaXplZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9ucyB3aGljaCBhcmUgYXNzaWduZWQgdG90aGlzIHRyYW5zaXRpb24uCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBhY3Rpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25bXSBnZXRBY3Rpb25zKCkgewotICAgICAgICByZXR1cm4gKEFjdGlvbltdKSB0aGlzLmFjdGlvbnMudG9BcnJheShuZXcgQWN0aW9uW3RoaXMuYWN0aW9ucy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NpZ25zIGFuIGFjdGlvbiB0byB0aGlzIHRyYW5zaXRpb24uCi0gICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEFjdGlvbihBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuYWN0aW9ucy5hZGQoYWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgY29uZGl0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5UcmFuc2l0aW9uI2dldENvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHB1YmxpYyBDb25kaXRpb25bXSBnZXRDb25kaXRpb25zKCkgewotICAgICAgICByZXR1cm4gKENvbmRpdGlvbltdKSB0aGlzLmNvbmRpdGlvbnMudG9BcnJheShuZXcgQ29uZGl0aW9uW3RoaXMuY29uZGl0aW9ucy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NpZ25zIGEgY29uZGl0aW9uIHRvIHRoaXMgdHJhbnNpdGlvbi4KLSAgICAgKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBjb25kaXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29uZGl0aW9uKENvbmRpdGlvbiBjb25kaXRpb24pIHsKLSAgICAgICAgdGhpcy5jb25kaXRpb25zLmFkZChjb25kaXRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGV2ZW50OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXZlbnQgd2hpY2ggaW52b2tlcyB0aGlzIHRyYW5zaXRpb24uCi0gICAgICogQHJldHVybiBBbiBldmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gdGhpcy5ldmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBldmVudCB0byBpbnZva2UgdGhpcyB0cmFuc2l0aW9uLgotICAgICAqIEBwYXJhbSBhbkV2ZW50IEFuIGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50KFN0cmluZyBhbkV2ZW50KSB7Ci0gICAgICAgIHRoaXMuZXZlbnQgPSBhbkV2ZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5UcmFuc2l0aW9uI2dldFNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvbjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5UcmFuc2l0aW9uI2dldERlc3RpbmF0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc3RpbmF0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoZ2V0RXZlbnQoKSArICIgWyIpOwotICAgICAgICBDb25kaXRpb25bXSBfY29uZGl0aW9ucyA9IGdldENvbmRpdGlvbnMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWYuYXBwZW5kKF9jb25kaXRpb25zW2ldLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmLmFwcGVuZCgiXSIpOwotCi0gICAgICAgIEFjdGlvbltdIF9hY3Rpb25zID0gZ2V0QWN0aW9ucygpOwotCi0gICAgICAgIGlmIChfYWN0aW9ucy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCIgLyAiKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX2FjdGlvbnNbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIHRyYW5zaXRpb24gaXMgc3luY2hyb25pemVkLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pc1N5bmNocm9uaXplZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGlmIHRoaXMgdHJhbnNpdGlvbiBpcyBzeW5jaHJvbml6ZWQuCi0gICAgICogQHBhcmFtIF9pc1N5bmNocm9uaXplZCBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3luY2hyb25pemVkKGJvb2xlYW4gX2lzU3luY2hyb25pemVkKSB7Ci0gICAgICAgIHRoaXMuaXNTeW5jaHJvbml6ZWQgPSBfaXNTeW5jaHJvbml6ZWQ7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvVmVyc2lvbkltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL1ZlcnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjZkODAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvVmVyc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotCi0vKioKLSAqIEEgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3cgaGlzdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25JbXBsIGltcGxlbWVudHMgVmVyc2lvbiB7Ci0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTsKLSAgICBwcml2YXRlIFN0cmluZyBpcEFkZHJlc3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXZlbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXNlcklkOwotICAgIHByaXZhdGUgTWFwIHZhcmlhYmxlVmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLSAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuVmVyc2lvbiNnZXRFdmVudCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlZlcnNpb24jZ2V0U3RhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN0YXRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkYXRlLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChEYXRlKXRoaXMuZGF0ZS5jbG9uZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGUuCi0gICAgICogQHBhcmFtIF9kYXRlIEEgZGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlKERhdGUgX2RhdGUpIHsKLSAgICAgICAgdGhpcy5kYXRlID0gKERhdGUpX2RhdGUuY2xvbmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIElELgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VySWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnVzZXJJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB1c2VyIElELgotICAgICAqIEBwYXJhbSBfdXNlcklkIEEgdXNlciBJRC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VySWQoU3RyaW5nIF91c2VySWQpIHsKLSAgICAgICAgdGhpcy51c2VySWQgPSBfdXNlcklkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlwIGFkZHJlc3MuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElQQWRkcmVzcygpIHsKLSAgICAJcmV0dXJuIHRoaXMuaXBBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGlwIGFkZHJlc3MuCi0gICAgICogQHBhcmFtIF9pcGFkZHJlc3MgQSBpcCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElQQWRkcmVzcyhTdHJpbmcgX2lwYWRkcmVzcyl7Ci0gICAgCXRoaXMuaXBBZGRyZXNzID0gX2lwYWRkcmVzczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gX2V2ZW50IFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGUgdmVyc2lvbiBjaGFuZ2UuCi0gICAgICogQHBhcmFtIF9zdGF0ZSBUaGUgZGVzdGluYXRpb24gc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIFZlcnNpb25JbXBsKFN0cmluZyBfZXZlbnQsIFN0cmluZyBfc3RhdGUpIHsKLSAgICAgICAgdGhpcy5ldmVudCA9IF9ldmVudDsKLSAgICAgICAgdGhpcy5zdGF0ZSA9IF9zdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuVmVyc2lvbiNnZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFZhbHVlKFN0cmluZyB2YXJpYWJsZU5hbWUpIHsKLSAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKSB0aGlzLnZhcmlhYmxlVmFsdWVzLmdldCh2YXJpYWJsZU5hbWUpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIHZhbHVlIHNldCBmb3IgdmFyaWFibGUgWyIgKyB2YXJpYWJsZU5hbWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuVmVyc2lvbiNzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YXJpYWJsZU5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YXJpYWJsZVZhbHVlcy5wdXQodmFyaWFibGVOYW1lLCBCb29sZWFuLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL1dvcmtmbG93QnVpbGRlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvV29ya2Zsb3dCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDFlOWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvV29ya2Zsb3dCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYnVpbGQgYSB3b3JrZmxvdyBzY2hlbWEgZnJvbSBhIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrZmxvd0J1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfRUxFTUVOVCA9ICJzdGF0ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJVElPTl9FTEVNRU5UID0gInRyYW5zaXRpb24iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0VMRU1FTlQgPSAiZXZlbnQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkRJVElPTl9FTEVNRU5UID0gImNvbmRpdGlvbiI7Ci0gICAgLy9wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRUxFTUVOVCA9ICJhY3Rpb24iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQlVURSA9ICJpZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTF9BVFRSSUJVVEUgPSAiaW5pdGlhbCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0FUVFJJQlVURSA9ICJzb3VyY2UiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RJTkFUSU9OX0FUVFJJQlVURSA9ICJkZXN0aW5hdGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJMRV9FTEVNRU5UID0gInZhcmlhYmxlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0VMRU1FTlQgPSAiYXNzaWduIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJMRV9BVFRSSUJVVEUgPSAidmFyaWFibGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0FUVFJJQlVURSA9ICJ2YWx1ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ0hST05JWkVEX0FUVFJJQlVURSA9ICJzeW5jaHJvbml6ZWQiOwotCi0gICAgcHJpdmF0ZSBDb25kaXRpb25GYWN0b3J5IGNvbmRpdGlvbkZhY3RvcnkgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIgdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBXb3JrZmxvd0J1aWxkZXIoTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodGhpcywgbG9nZ2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSB3b3JrZmxvdyBzY2hlbWEgZnJvbSBhIGZpbGUuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHdvcmtmbG93IG5hbWUuCi0gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUuCi0gICAgICogQHJldHVybiBBIHdvcmtmbG93IHNjaGVtYSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIGlmIHRoZSBmaWxlIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIHdvcmtmbG93Ci0gICAgICogICAgICAgICAgICAgc2NoZW1hLgotICAgICAqLwotICAgIHB1YmxpYyBXb3JrZmxvd0ltcGwgYnVpbGRXb3JrZmxvdyhTdHJpbmcgbmFtZSwgRmlsZSBmaWxlKSB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotICAgICAgICBXb3JrZmxvd0ltcGwgd29ya2Zsb3c7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KGZpbGUpOwotICAgICAgICAgICAgd29ya2Zsb3cgPSBidWlsZFdvcmtmbG93KG5hbWUsIGRvY3VtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3b3JrZmxvdzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSB3b3JrZmxvdyBvYmplY3QgZnJvbSBhbiBYTUwgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHdvcmtmbG93IG5hbWUuCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBIHdvcmtmbG93IGltcGxlbWVudGF0aW9uLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV29ya2Zsb3dJbXBsIGJ1aWxkV29ya2Zsb3coU3RyaW5nIG5hbWUsIERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotCi0gICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgaW5pdGlhbFN0YXRlID0gbnVsbDsKLQotICAgICAgICAvLyBsb2FkIHN0YXRlcwotICAgICAgICBOb2RlTGlzdCBzdGF0ZUVsZW1lbnRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdvcmtmbG93Lk5BTUVTUEFDRSwgU1RBVEVfRUxFTUVOVCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZUVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBzdGF0ZUVsZW1lbnRzLml0ZW0oaSk7Ci0gICAgICAgICAgICBTdHJpbmcgc3RhdGUgPSBidWlsZFN0YXRlKGVsZW1lbnQpOwotCi0gICAgICAgICAgICBpZiAoaXNJbml0aWFsU3RhdGVFbGVtZW50KGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBXb3JrZmxvd0ltcGwgd29ya2Zsb3cgPSBuZXcgV29ya2Zsb3dJbXBsKG5hbWUsIGluaXRpYWxTdGF0ZSk7Ci0KLSAgICAgICAgLy8gbG9hZCB2YXJpYWJsZXMKLSAgICAgICAgTm9kZUxpc3QgdmFyaWFibGVFbGVtZW50cyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXb3JrZmxvdy5OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgVkFSSUFCTEVfRUxFTUVOVCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZUVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSB2YXJpYWJsZUVsZW1lbnRzLml0ZW0oaSk7Ci0gICAgICAgICAgICBCb29sZWFuVmFyaWFibGVJbXBsIHZhcmlhYmxlID0gYnVpbGRWYXJpYWJsZShlbGVtZW50KTsKLSAgICAgICAgICAgIHdvcmtmbG93LmFkZFZhcmlhYmxlKHZhcmlhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvYWQgZXZlbnRzCi0gICAgICAgIE5vZGVMaXN0IGV2ZW50RWxlbWVudHMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV29ya2Zsb3cuTkFNRVNQQUNFLCBFVkVOVF9FTEVNRU5UKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50RWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGV2ZW50ID0gYnVpbGRFdmVudCgoRWxlbWVudCkgZXZlbnRFbGVtZW50cy5pdGVtKGkpKTsKLSAgICAgICAgICAgIHdvcmtmbG93LmFkZEV2ZW50KGV2ZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvYWQgdHJhbnNpdGlvbnMKLSAgICAgICAgTm9kZUxpc3QgdHJhbnNpdGlvbkVsZW1lbnRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdvcmtmbG93Lk5BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBUUkFOU0lUSU9OX0VMRU1FTlQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNpdGlvbkVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIFRyYW5zaXRpb25JbXBsIHRyYW5zaXRpb24gPSBidWlsZFRyYW5zaXRpb24oKEVsZW1lbnQpIHRyYW5zaXRpb25FbGVtZW50cy5pdGVtKGkpKTsKLSAgICAgICAgICAgIHdvcmtmbG93LmFkZFRyYW5zaXRpb24odHJhbnNpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd29ya2Zsb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgc3RhdGUgZWxlbWVudCBjb250YWlucyB0aGUgaW5pdGlhbCBzdGF0ZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBBbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaXRpYWxTdGF0ZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIFN0cmluZyBpbml0aWFsQXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSU5JVElBTF9BVFRSSUJVVEUpOwotCi0gICAgICAgIHJldHVybiAoaW5pdGlhbEF0dHJpYnV0ZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIChpbml0aWFsQXR0cmlidXRlLmVxdWFscygieWVzIikgfHwgaW5pdGlhbEF0dHJpYnV0ZS5lcXVhbHMoInRydWUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgc3RhdGUgZnJvbSBhbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBBbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIEEgc3RhdGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBidWlsZFN0YXRlKEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSURfQVRUUklCVVRFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSB0cmFuc2l0aW9uIGZyb20gYW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgQW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHJldHVybiBBIHRyYW5zaXRpb24uCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2l0aW9uSW1wbCBidWlsZFRyYW5zaXRpb24oRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQnVpbGRpbmcgdHJhbnNpdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPVVJDRV9BVFRSSUJVVEUpOwotICAgICAgICBTdHJpbmcgZGVzdGluYXRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShERVNUSU5BVElPTl9BVFRSSUJVVEUpOwotCi0gICAgICAgIFRyYW5zaXRpb25JbXBsIHRyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvbkltcGwoc291cmNlLCBkZXN0aW5hdGlvbik7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0cmFuc2l0aW9uLCBnZXRMb2dnZXIoKSk7Ci0KLSAgICAgICAgLy8gc2V0IGV2ZW50Ci0gICAgICAgIEVsZW1lbnQgZXZlbnRFbGVtZW50ID0gKEVsZW1lbnQpIGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXb3JrZmxvdy5OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgRVZFTlRfRUxFTUVOVCkuaXRlbSgwKTsKLSAgICAgICAgU3RyaW5nIGV2ZW50ID0gZXZlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEUpOwotICAgICAgICB0cmFuc2l0aW9uLnNldEV2ZW50KGV2ZW50KTsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBFdmVudDogWyIgKyBldmVudCArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb2FkIGNvbmRpdGlvbnMKLSAgICAgICAgTm9kZUxpc3QgY29uZGl0aW9uRWxlbWVudHMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV29ya2Zsb3cuTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgIENPTkRJVElPTl9FTEVNRU5UKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmRpdGlvbkVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIENvbmRpdGlvbiBjb25kaXRpb24gPSBidWlsZENvbmRpdGlvbigoRWxlbWVudCkgY29uZGl0aW9uRWxlbWVudHMuaXRlbShpKSk7Ci0gICAgICAgICAgICB0cmFuc2l0aW9uLmFkZENvbmRpdGlvbihjb25kaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9hZCBhc3NpZ25tZW50cwotICAgICAgICBOb2RlTGlzdCBhc3NpZ25tZW50RWxlbWVudHMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV29ya2Zsb3cuTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgIEFTU0lHTk1FTlRfRUxFTUVOVCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NpZ25tZW50RWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgQm9vbGVhblZhcmlhYmxlQXNzaWdubWVudEltcGwgYWN0aW9uID0gYnVpbGRBc3NpZ25tZW50KChFbGVtZW50KSBhc3NpZ25tZW50RWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgLml0ZW0oaSkpOwotICAgICAgICAgICAgdHJhbnNpdGlvbi5hZGRBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvYWQgYWN0aW9ucwotICAgICAgICAvKgotICAgICAgICAgKiBOb2RlTGlzdCBhY3Rpb25FbGVtZW50cyA9IGVsZW1lbnQKLSAgICAgICAgICogLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV29ya2Zsb3cuTkFNRVNQQUNFLCBBQ1RJT05fRUxFTUVOVCk7Ci0gICAgICAgICAqIAotICAgICAgICAgKiBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbkVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsgQWN0aW9uIGFjdGlvbiA9Ci0gICAgICAgICAqIGJ1aWxkQWN0aW9uKChFbGVtZW50KSBhY3Rpb25FbGVtZW50cy5pdGVtKGkpKTsKLSAgICAgICAgICogdHJhbnNpdGlvbi5hZGRBY3Rpb24oYWN0aW9uKTsgfQotICAgICAgICAgKi8KLQotICAgICAgICAvLyBzZXQgc3luY2hyb25pemF0aW9uCi0KLSAgICAgICAgLyogRklYTUU6IHRoaXMgaXMgbm90IHVzZWQgaW4gdGhlIGRlZmF1bHQgcHVibGljYXRpb24sIGFuZCBpcyBub3QgY3VycmVudGx5IGFjY2VwdGVkIGJ5IHRoZSB3b3JrZmxvdyB4bWwgdmFsaWRhdGlvbi4gd2hhdCBkb2VzIGl0IGRvPyAqLwotICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoU1lOQ0hST05JWkVEX0FUVFJJQlVURSkpIHsKLSAgICAgICAgICAgIEJvb2xlYW4gaXNTeW5jaHJvbml6ZWQgPSBCb29sZWFuLnZhbHVlT2YoZWxlbWVudC5nZXRBdHRyaWJ1dGUoU1lOQ0hST05JWkVEX0FUVFJJQlVURSkpOwotICAgICAgICAgICAgdHJhbnNpdGlvbi5zZXRTeW5jaHJvbml6ZWQoaXNTeW5jaHJvbml6ZWQuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRyYW5zaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuIGV2ZW50IGZyb20gYW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgQW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHJldHVybiBBbiBldmVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRXZlbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgY29uZGl0aW9uIGZyb20gYW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgQW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHJldHVybiBBIGNvbmRpdGlvbi4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbmRpdGlvbiBidWlsZENvbmRpdGlvbihFbGVtZW50IGVsZW1lbnQpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShDTEFTU19BVFRSSUJVVEUpOwotICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IERvY3VtZW50SGVscGVyLmdldFNpbXBsZUVsZW1lbnRUZXh0KGVsZW1lbnQpOwotICAgICAgICBpZiAodGhpcy5jb25kaXRpb25GYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uRmFjdG9yeSA9IG5ldyBDb25kaXRpb25GYWN0b3J5KGdldExvZ2dlcigpKTsKLSAgICAgICAgfQotICAgICAgICBDb25kaXRpb24gY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb25GYWN0b3J5LmNyZWF0ZUNvbmRpdGlvbihjbGFzc05hbWUsIGV4cHJlc3Npb24pOwotCi0gICAgICAgIHJldHVybiBjb25kaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgYm9vbGVhbiB2YXJpYWJsZSBmcm9tIGFuIFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBlbGVtZW50IEFuIFhNTCBlbGVtZW50LgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhcmlhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuVmFyaWFibGVJbXBsIGJ1aWxkVmFyaWFibGUoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRV9BVFRSSUJVVEUpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShWQUxVRV9BVFRSSUJVVEUpOwotCi0gICAgICAgIHJldHVybiBuZXcgQm9vbGVhblZhcmlhYmxlSW1wbChuYW1lLCBCb29sZWFuLmdldEJvb2xlYW4odmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYW4gYXNzaWdubWVudCBvYmplY3QgZnJvbSBhbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBBbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIEFuIGFzc2lnbm1lbnQgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQm9vbGVhblZhcmlhYmxlQXNzaWdubWVudEltcGwgYnVpbGRBc3NpZ25tZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB2YXJpYWJsZU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShWQVJJQUJMRV9BVFRSSUJVVEUpOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZVN0cmluZyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFZBTFVFX0FUVFJJQlVURSk7Ci0gICAgICAgIGJvb2xlYW4gdmFsdWUgPSBCb29sZWFuLnZhbHVlT2YodmFsdWVTdHJpbmcpLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgICAgIHJldHVybiBuZXcgQm9vbGVhblZhcmlhYmxlQXNzaWdubWVudEltcGwodmFyaWFibGVOYW1lLCB2YWx1ZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL1dvcmtmbG93RW5naW5lSW1wbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvV29ya2Zsb3dFbmdpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzU1NTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvV29ya2Zsb3dFbmdpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LlRyYW5zaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd0VuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dhYmxlOwotCi0vKioKLSAqIFdvcmtmbG93IGVuZ2luZSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgV29ya2Zsb3dFbmdpbmVJbXBsIGltcGxlbWVudHMgV29ya2Zsb3dFbmdpbmUgewotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93RW5naW5lI2Nhbkludm9rZShvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZSwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3csIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuSW52b2tlKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUsIFdvcmtmbG93IHdvcmtmbG93LCBTdHJpbmcgZXZlbnQpCi0gICAgICAgICAgICB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotICAgICAgICBMaXN0IGZpcmluZ1RyYW5zaXRpb25zID0gZ2V0RmlyaW5nVHJhbnNpdGlvbnMod29ya2Zsb3dhYmxlLCB3b3JrZmxvdywgZXZlbnQpOwotICAgICAgICByZXR1cm4gZmlyaW5nVHJhbnNpdGlvbnMuc2l6ZSgpID09IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93RW5naW5lI2ludm9rZShvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZSwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3csIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUsIFdvcmtmbG93IHdvcmtmbG93LCBTdHJpbmcgZXZlbnQpCi0gICAgICAgICAgICB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotCi0gICAgICAgIFRyYW5zaXRpb24gZmlyaW5nVHJhbnNpdGlvbiA9IG51bGw7Ci0gICAgICAgIExpc3QgZmlyaW5nVHJhbnNpdGlvbnMgPSBnZXRGaXJpbmdUcmFuc2l0aW9ucyh3b3JrZmxvd2FibGUsIHdvcmtmbG93LCBldmVudCk7Ci0KLSAgICAgICAgaWYgKGZpcmluZ1RyYW5zaXRpb25zLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dFeGNlcHRpb24oIk5vIHRyYW5zaXRpb24gY2FuIGZpcmUhIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyaW5nVHJhbnNpdGlvbnMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93RXhjZXB0aW9uKCJNb3JlIHRoYW4gb25lIHRyYW5zaXRpb25zIGNhbiBmaXJlISIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlyaW5nVHJhbnNpdGlvbiA9IChUcmFuc2l0aW9uKSBmaXJpbmdUcmFuc2l0aW9ucy5nZXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZGVzdGluYXRpb24gPSBmaXJpbmdUcmFuc2l0aW9uLmdldERlc3RpbmF0aW9uKCk7Ci0KLSAgICAgICAgVmVyc2lvbiBuZXdWZXJzaW9uID0gY3JlYXRlTmV3VmVyc2lvbih3b3JrZmxvd2FibGUsIHdvcmtmbG93LCBldmVudCwgZGVzdGluYXRpb24pOwotCi0gICAgICAgIEFjdGlvbltdIGFjdGlvbnMgPSBmaXJpbmdUcmFuc2l0aW9uLmdldEFjdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhY3Rpb25zW2ldLmV4ZWN1dGUobmV3VmVyc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB3b3JrZmxvd2FibGUubmV3VmVyc2lvbih3b3JrZmxvdywgbmV3VmVyc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB2ZXJzaW9uLgotICAgICAqIEBwYXJhbSB3b3JrZmxvd2FibGUgVGhlIHdvcmtmbG93YWJsZS4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3cgVGhlIHdvcmtmbG93LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQuCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFRoZSBkZXN0aW5hdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgdmVyc2lvbi4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmVyc2lvbiBjcmVhdGVOZXdWZXJzaW9uKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUsIFdvcmtmbG93IHdvcmtmbG93LCBTdHJpbmcgZXZlbnQsCi0gICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb24pIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFZlcnNpb24gbGF0ZXN0VmVyc2lvbiA9IHdvcmtmbG93YWJsZS5nZXRMYXRlc3RWZXJzaW9uKCk7Ci0gICAgICAgIFZlcnNpb24gbmV3VmVyc2lvbiA9IG5ldyBWZXJzaW9uSW1wbChldmVudCwgZGVzdGluYXRpb24pOwotICAgICAgICBTdHJpbmdbXSB2YXJpYWJsZU5hbWVzID0gd29ya2Zsb3cuZ2V0VmFyaWFibGVOYW1lcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdmFyaWFibGVOYW1lc1tpXTsKLSAgICAgICAgICAgIGJvb2xlYW4gdmFsdWU7Ci0gICAgICAgICAgICBpZiAobGF0ZXN0VmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB3b3JrZmxvdy5nZXRJbml0aWFsVmFsdWUobmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlID0gbGF0ZXN0VmVyc2lvbi5nZXRWYWx1ZShuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld1ZlcnNpb24uc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdWZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRyYW5zaXRpb25zIHRoYXQgd291bGQgZmlyZSBpbiBhIGNlcnRhaW4gc2l0dWF0aW9uLgotICAgICAqIEBwYXJhbSB3b3JrZmxvd2FibGUgVGhlIHdvcmtmbG93YWJsZS4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3cgVGhlIHdvcmtmbG93LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQuCi0gICAgICogQHJldHVybiBBIGxpc3Qgb2YgdHJhbnNpdGlvbnMuCi0gICAgICogQHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0RmlyaW5nVHJhbnNpdGlvbnMoV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSwgV29ya2Zsb3cgd29ya2Zsb3csIFN0cmluZyBldmVudCkKLSAgICAgICAgICAgIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFZlcnNpb24gbGFzdFZlcnNpb24gPSB3b3JrZmxvd2FibGUuZ2V0TGF0ZXN0VmVyc2lvbigpOwotCi0gICAgICAgIFN0cmluZyBjdXJyZW50U3RhdGU7Ci0gICAgICAgIGlmIChsYXN0VmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJyZW50U3RhdGUgPSB3b3JrZmxvdy5nZXRJbml0aWFsU3RhdGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IGxhc3RWZXJzaW9uLmdldFN0YXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBUcmFuc2l0aW9uW10gdHJhbnNpdGlvbnMgPSB3b3JrZmxvdy5nZXRMZWF2aW5nVHJhbnNpdGlvbnMoY3VycmVudFN0YXRlKTsKLSAgICAgICAgTGlzdCBmaXJpbmdUcmFuc2l0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodHJhbnNpdGlvbnNbaV0uZ2V0RXZlbnQoKS5lcXVhbHMoZXZlbnQpCi0gICAgICAgICAgICAgICAgICAgICYmIGNhbkZpcmUodHJhbnNpdGlvbnNbaV0sIHdvcmtmbG93LCB3b3JrZmxvd2FibGUpKSB7Ci0gICAgICAgICAgICAgICAgZmlyaW5nVHJhbnNpdGlvbnMuYWRkKHRyYW5zaXRpb25zW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlyaW5nVHJhbnNpdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgdHJhbnNpdGlvbiBjYW4gZmlyZS4KLSAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUaGUgdHJhbnNpdGlvbi4KLSAgICAgKiBAcGFyYW0gd29ya2Zsb3cgVGhlIHdvcmtmbG93LgotICAgICAqIEBwYXJhbSB3b3JrZmxvd2FibGUgVGhlIHdvcmtmbG93YWJsZS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GaXJlKFRyYW5zaXRpb24gdHJhbnNpdGlvbiwgV29ya2Zsb3cgd29ya2Zsb3csIFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUpCi0gICAgICAgICAgICB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotICAgICAgICBDb25kaXRpb25bXSBfY29uZGl0aW9ucyA9IHRyYW5zaXRpb24uZ2V0Q29uZGl0aW9ucygpOwotICAgICAgICBib29sZWFuIGNhbkZpcmUgPSB0cnVlOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGNhbkZpcmUgJiYgaSA8IF9jb25kaXRpb25zLmxlbmd0aCkgewotICAgICAgICAgICAgY2FuRmlyZSA9IGNhbkZpcmUgJiYgX2NvbmRpdGlvbnNbaV0uaXNDb21wbGllZCh3b3JrZmxvdywgd29ya2Zsb3dhYmxlKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjYW5GaXJlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL1dvcmtmbG93SW1wbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvV29ya2Zsb3dJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MzBkMzIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3dvcmtmbG93L2ltcGwvV29ya2Zsb3dJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5UcmFuc2l0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHdvcmtmbG93IHNjaGVtYS4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtmbG93SW1wbCBpbXBsZW1lbnRzIFdvcmtmbG93IHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgV29ya2Zsb3dJbXBsLgotICAgICAqIEBwYXJhbSBfbmFtZSBUaGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gX2luaXRpYWxTdGF0ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgd29ya2Zsb3cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFdvcmtmbG93SW1wbChTdHJpbmcgX25hbWUsIFN0cmluZyBfaW5pdGlhbFN0YXRlKSB7Ci0gICAgICAgIHRoaXMuaW5pdGlhbFN0YXRlID0gX2luaXRpYWxTdGF0ZTsKLSAgICAgICAgdGhpcy5uYW1lID0gX25hbWU7Ci0gICAgICAgIGFkZFN0YXRlKF9pbml0aWFsU3RhdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGluaXRpYWxTdGF0ZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGlzIHdvcmtmbG93LgotICAgICAqIEByZXR1cm4gVGhlIGluaXRpYWwgc3RhdGUuCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFN0YXRlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsU3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXQgdHJhbnNpdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgU2V0IHN0YXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc3RhdGUuCi0gICAgICogQHBhcmFtIHN0YXRlIEEgc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFN0YXRlKFN0cmluZyBzdGF0ZSkgewotICAgICAgICB0aGlzLnN0YXRlcy5hZGQoc3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSB0cmFuc2l0aW9uLgotICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSB0cmFuc2l0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRyYW5zaXRpb24oVHJhbnNpdGlvbkltcGwgdHJhbnNpdGlvbikgewotICAgICAgICB0aGlzLnRyYW5zaXRpb25zLmFkZCh0cmFuc2l0aW9uKTsKLSAgICAgICAgYWRkU3RhdGUodHJhbnNpdGlvbi5nZXRTb3VyY2UoKSk7Ci0gICAgICAgIGFkZFN0YXRlKHRyYW5zaXRpb24uZ2V0RGVzdGluYXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHJhbnNpdGlvbnMuCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiB0cmFuc2l0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNpdGlvbkltcGxbXSBnZXRUcmFuc2l0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIChUcmFuc2l0aW9uSW1wbFtdKSB0aGlzLnRyYW5zaXRpb25zLnRvQXJyYXkobmV3IFRyYW5zaXRpb25JbXBsW3RoaXMudHJhbnNpdGlvbnMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93I2dldExlYXZpbmdUcmFuc2l0aW9ucyhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc2l0aW9uW10gZ2V0TGVhdmluZ1RyYW5zaXRpb25zKFN0cmluZyBzdGF0ZSkgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIHsKLSAgICAgICAgU2V0IGxlYXZpbmdUcmFuc2l0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFRyYW5zaXRpb25JbXBsW10gX3RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdHJhbnNpdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChfdHJhbnNpdGlvbnNbaV0uZ2V0U291cmNlKCkuZXF1YWxzKHN0YXRlKSkgewotICAgICAgICAgICAgICAgIGxlYXZpbmdUcmFuc2l0aW9ucy5hZGQoX3RyYW5zaXRpb25zW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoVHJhbnNpdGlvbltdKSBsZWF2aW5nVHJhbnNpdGlvbnMudG9BcnJheShuZXcgVHJhbnNpdGlvbltsZWF2aW5nVHJhbnNpdGlvbnMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoaXMgd29ya2Zsb3cgY29udGFpbnMgYSBzdGF0ZS4KLSAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0YXRlIGlzIGNvbnRhaW5lZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTdGF0ZShTdHJpbmcgc3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVzLmNvbnRhaW5zKHN0YXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RhdGVzKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSB0aGlzLnN0YXRlcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5zdGF0ZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXQgZXZlbnRzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZXZlbnQuCi0gICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEV2ZW50KFN0cmluZyBldmVudCkgewotICAgICAgICB0aGlzLmV2ZW50cy5hZGQoZXZlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIHZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgdmFyaWFibGUuCi0gICAgICogQHBhcmFtIHZhcmlhYmxlIEEgdmFyaWFibGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFibGUoQm9vbGVhblZhcmlhYmxlSW1wbCB2YXJpYWJsZSkgewotICAgICAgICB0aGlzLnZhcmlhYmxlcy5wdXQodmFyaWFibGUuZ2V0TmFtZSgpLCB2YXJpYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFyaWFibGUgZm9yIGEgY2VydGFpbiBuYW1lLgotICAgICAqIEBwYXJhbSBfbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuCi0gICAgICogQHJldHVybiBBIHZhcmlhYmxlLgotICAgICAqIEB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gaWYgbm8gdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMuCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW5WYXJpYWJsZUltcGwgZ2V0VmFyaWFibGUoU3RyaW5nIF9uYW1lKSB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotICAgICAgICBpZiAoIXRoaXMudmFyaWFibGVzLmNvbnRhaW5zS2V5KF9uYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93RXhjZXB0aW9uKCJXb3JrZmxvdyBkb2VzIG5vdCBjb250YWluIHRoZSB2YXJpYWJsZSAnIiArIF9uYW1lICsgIichIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKEJvb2xlYW5WYXJpYWJsZUltcGwpIHRoaXMudmFyaWFibGVzLmdldChfbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFyaWFibGVzLgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdmFyaWFibGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuVmFyaWFibGVJbXBsW10gZ2V0VmFyaWFibGVzKCkgewotICAgICAgICByZXR1cm4gKEJvb2xlYW5WYXJpYWJsZUltcGxbXSkgdGhpcy52YXJpYWJsZXMudmFsdWVzKCkudG9BcnJheShuZXcgQm9vbGVhblZhcmlhYmxlSW1wbFt0aGlzLnZhcmlhYmxlcwotICAgICAgICAgICAgICAgIC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3cjZ2V0VmFyaWFibGVOYW1lcygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhcmlhYmxlTmFtZXMoKSB7Ci0gICAgICAgIEJvb2xlYW5WYXJpYWJsZUltcGxbXSBfdmFyaWFibGVzID0gZ2V0VmFyaWFibGVzKCk7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tfdmFyaWFibGVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG5hbWVzW2ldID0gX3ZhcmlhYmxlc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvdyNnZXROYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93I2dldEluaXRpYWxWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEluaXRpYWxWYWx1ZShTdHJpbmcgdmFyaWFibGVOYW1lKSB0aHJvd3MgV29ya2Zsb3dFeGNlcHRpb24gewotICAgICAgICBCb29sZWFuVmFyaWFibGVJbXBsW10gdmFyaWFibGVzID0gZ2V0VmFyaWFibGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodmFyaWFibGVzW2ldLmdldE5hbWUoKS5lcXVhbHModmFyaWFibGVOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZXNbaV0uZ2V0SW5pdGlhbFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93RXhjZXB0aW9uKCJUaGUgdmFyaWFibGUgWyIgKyB2YXJpYWJsZU5hbWUgKyAiXSBkb2VzIG5vdCBleGlzdC4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3cjZ2V0RXZlbnRzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXZlbnRzKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSB0aGlzLmV2ZW50cy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5ldmVudHMuc2l6ZSgpXSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL1dvcmtmbG93TWFuYWdlckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS93b3JrZmxvdy9pbXBsL1dvcmtmbG93TWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1OTcxNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvd29ya2Zsb3cvaW1wbC9Xb3JrZmxvd01hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5leGNhbGlidXIucG9vbC5Qb29sYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBXb3JrZmxvdyBtYW5hZ2VyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAdmVyc2lvbiAkSWQ6IFdvcmtmbG93TWFuYWdlckltcGwuamF2YSAxNzk3NTEgMjAwNS0wNi0wMyAwOToxMzozNVogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrZmxvd01hbmFnZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgV29ya2Zsb3dNYW5hZ2VyLAotICAgICAgICBTZXJ2aWNlYWJsZSwgUG9vbGFibGUgewotCi0gICAgcHJpdmF0ZSBNYXAgdXJpMndvcmtmbG93ID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd01hbmFnZXIjaW52b2tlKG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dhYmxlLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2UoV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSwgU3RyaW5nIGV2ZW50LCBib29sZWFuIGZvcmNlKQotICAgICAgICAgICAgdGhyb3dzIFdvcmtmbG93RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGhhc1dvcmtmbG93KHdvcmtmbG93YWJsZSkpIHsKLSAgICAgICAgICAgIFdvcmtmbG93RW5naW5lIGVuZ2luZSA9IG5ldyBXb3JrZmxvd0VuZ2luZUltcGwoKTsKLSAgICAgICAgICAgIFdvcmtmbG93IHdvcmtmbG93ID0gZ2V0V29ya2Zsb3dTY2hlbWEod29ya2Zsb3dhYmxlKTsKLQotICAgICAgICAgICAgaWYgKGZvcmNlICYmICFlbmdpbmUuY2FuSW52b2tlKHdvcmtmbG93YWJsZSwgd29ya2Zsb3csIGV2ZW50KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0V4Y2VwdGlvbigiVGhlIGV2ZW50IFsiICsgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gY2Fubm90IGJlIGludm9rZWQgb24gdGhlIGRvY3VtZW50IFsiICsgd29ya2Zsb3dhYmxlICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuZ2luZS5pbnZva2Uod29ya2Zsb3dhYmxlLCB3b3JrZmxvdywgZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93TWFuYWdlciNpbnZva2Uob3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGUsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZShXb3JrZmxvd2FibGUgd29ya2Zsb3dhYmxlLCBTdHJpbmcgZXZlbnQpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludm9rZSh3b3JrZmxvd2FibGUsIGV2ZW50LCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dNYW5hZ2VyI2Nhbkludm9rZShvcmcuYXBhY2hlLmxlbnlhLndvcmtmbG93LldvcmtmbG93YWJsZSwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuSW52b2tlKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUsIFN0cmluZyBldmVudCkgewotICAgICAgICBib29sZWFuIGNhbkludm9rZSA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaGFzV29ya2Zsb3cod29ya2Zsb3dhYmxlKSkgewotICAgICAgICAgICAgICAgIFdvcmtmbG93IHdvcmtmbG93ID0gZ2V0V29ya2Zsb3dTY2hlbWEod29ya2Zsb3dhYmxlKTsKLSAgICAgICAgICAgICAgICBXb3JrZmxvd0VuZ2luZSBlbmdpbmUgPSBuZXcgV29ya2Zsb3dFbmdpbmVJbXBsKCk7Ci0gICAgICAgICAgICAgICAgY2FuSW52b2tlID0gZW5naW5lLmNhbkludm9rZSh3b3JrZmxvd2FibGUsIHdvcmtmbG93LCBldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuSW52b2tlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd01hbmFnZXIjZ2V0V29ya2Zsb3dTY2hlbWEob3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIFdvcmtmbG93IGdldFdvcmtmbG93U2NoZW1hKFdvcmtmbG93YWJsZSB3b3JrZmxvd2FibGUpIHRocm93cyBXb3JrZmxvd0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdvcmtmbG93SW1wbCB3b3JrZmxvdyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSB3b3JrZmxvd2FibGUuZ2V0V29ya2Zsb3dTY2hlbWFVUkkoKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJXb3JrZmxvdyBVUkk6ICIgKyB1cmkpOwotICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya2Zsb3cgPSAoV29ya2Zsb3dJbXBsKSB0aGlzLnVyaTJ3b3JrZmxvdy5nZXQodXJpKTsKLSAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IFNvdXJjZVV0aWwucmVhZERPTSh1cmksIHRoaXMubWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dFeGNlcHRpb24oIkNvdWxkIG5vdCByZWFkIHdvcmtmbG93IHNjaGVtYSBmcm9tIFVSSSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVyaSArICJdISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFdvcmtmbG93QnVpbGRlciBidWlsZGVyID0gbmV3IFdvcmtmbG93QnVpbGRlcihnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93ID0gYnVpbGRlci5idWlsZFdvcmtmbG93KHVyaSwgZG9jdW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnVyaTJ3b3JrZmxvdy5wdXQodXJpLCB3b3JrZmxvdyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdvcmtmbG93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd01hbmFnZXIjaGFzV29ya2Zsb3cob3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5Xb3JrZmxvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzV29ya2Zsb3coV29ya2Zsb3dhYmxlIHdvcmtmbG93YWJsZSkgewotICAgICAgICByZXR1cm4gd29ya2Zsb3dhYmxlLmdldFdvcmtmbG93U2NoZW1hVVJJKCkgIT0gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjc5NjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0KLSAgPG1lc3NhZ2Uga2V5PSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhZGF0YS93b3JrZmxvdy8xLjAiPldvcmtmbG93PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IndvcmtmbG93VmVyc2lvbiI+V29ya2Zsb3cgdmVyc2lvbnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0id29ya2Zsb3cubXVsdGlXb3JrZmxvdyI+V29ya2Zsb3cgT3ZlcnZpZXc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYmFjay10by1kb2N1bWVudCI+QmFjayB0byBkb2N1bWVudDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0id29ya2Zsb3cucmVqZWN0Ij5SZWplY3Q8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0id29ya2Zsb3cucHVibGlzaCI+UHVibGlzaDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ3b3JrZmxvdy5kZWFjdGl2YXRlIj5EZWFjdGl2YXRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhdGgiPlBhdGg8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWN0aW9ucyI+QWN0aW9uczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzdGF0ZS1hcy10ZXh0Ij5TdGF0ZSBhcyB0ZXh0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InN0YXRlLWFzLWNvbHVtbnMiPlN0YXRlIGFzIGNvbHVtbnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icHVibGlzaC1taXNzaW5nLWRvY3VtZW50cyI+Ci0gICAgVGhlIGRvY3VtZW50IGNhbid0IGJlIHB1Ymxpc2hlZCB1bmxlc3MgdGhlIGZvbGxvd2luZyBkb2N1bWVudHMgYXJlIHB1Ymxpc2hlZDoKLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im1pc3NpbmctZG9jdW1lbnQiPgotICAgIDwhLS0gVGhpcyBkb2Vzbid0IHdvcmsgeWV0LCBzZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DT0NPT04tMjA1NwotICAgIDx4aHRtbDphIGhyZWY9InswfSI+ezF9PC94aHRtbDphPgotICAgIC0tPgotICAgIHswfSAoInsxfSIpCi0gIDwvbWVzc2FnZT4KLSAgCi0gIDwhLS0gc3VibWl0IHVzZWNhc2UgLS0+Ci0gIDxtZXNzYWdlIGtleT0id29ya2Zsb3cuc3VibWl0Ij5TdWJtaXQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm90aWZ5LXJldmlld2VycyI+Tm90aWZ5IHJldmlld2VyczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzdWJtaXQtZm9yLWFwcHJvdmFsPyI+Ci0gICAgRG8geW91IHdhbnQgdG8gc3VibWl0IHRoZSBkb2N1bWVudCA8eGh0bWw6cT57MH08L3hodG1sOnE+IGZvciBhcHByb3ZhbD8KLSAgPC9tZXNzYWdlPgotICAKLSAgPCEtLSByZWplY3QgdXNlY2FlIC0tPgotICA8bWVzc2FnZSBrZXk9IlJlamVjdCI+UmVqZWN0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlamVjdC1kb2M/Ij5EbyB5b3Ugd2FudCB0byByZWplY3QgdGhlIGRvY3VtZW50IDx4aHRtbDpxPnswfTwveGh0bWw6cT4/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vdGlmeS1zdWJtaXR0ZXIiPk5vdGlmeSB0aGUgc3VibWl0dGVyPC9tZXNzYWdlPgotICANCi0gIDxtZXNzYWdlIGtleT0idW5wdWJsaXNoZWQtbGlua3MiPkxpbmtzIHRvIHVucHVibGlzaGVkIGRvY3VtZW50czo8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGlua3MtdG8tZG9jdW1lbnQiPkxpbmtzIGZyb20gb3RoZXIgZG9jdW1lbnRzOjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJwdWJsaXNoLWJyb2tlbi1saW5rcyI+VGhlIGRvY3VtZW50IGNvbnRhaW5zIGJyb2tlbiBsaW5rcy48L21lc3NhZ2U+Ci0gIAotICA8bWVzc2FnZSBrZXk9InNjaGVkdWxlci1kYXRlLWZvcm1hdC1pbnZhbGlkIj5UaGUgc2NoZWR1bGVyIGRhdGUgbXVzdCBiZSBvZiB0aGUgZm9ybSAneXl5eS1NTS1kZCBISDptbTpzcycuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoaXMgdXNlY2FzZSBjYW4gb25seSBiZSBpbnZva2VkIHdoZW4gdGhlIGxpdmUgdmVyc2lvbiBleGlzdHMuIj4KLSAgICBUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCB3aGVuIHRoZSBsaXZlIHZlcnNpb24gZXhpc3RzLgotICA8L21lc3NhZ2U+Ci0gIAotICA8IS0tIGRlYWN0aXZhdGUgdXNlY2FzZSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWFjdGl2YXRlIERvY3VtZW50Ij5EZWFjdGl2YXRlIERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlYWN0aXZhdGUtZG9jPyI+RG8geW91IHdhbnQgdG8gZGVhY3RpdmF0ZSB0aGUgZG9jdW1lbnQgPHhodG1sOnE+ezB9PC94aHRtbDpxPj88L21lc3NhZ2U+Ci0gIAotICAKLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWE5YmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWlfZGUueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvd29ya2Zsb3cvMS4wIj5Xb3JrZmxvdzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ3b3JrZmxvd1ZlcnNpb24iPldvcmtmbG93LVZlcnNpb25lbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ3b3JrZmxvdy5tdWx0aVdvcmtmbG93Ij5Xb3JrZmxvdy3DnGJlcnNpY2h0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImJhY2stdG8tZG9jdW1lbnQiPlp1csO8Y2sgenVtIERva3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IndvcmtmbG93LnB1Ymxpc2giPlB1YmxpemllcmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhdGgiPlBmYWQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWN0aW9ucyI+QWt0aW9uZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic3RhdGUtYXMtdGV4dCI+WnVzdGFuZCBhbHMgVGV4dDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzdGF0ZS1hcy1jb2x1bW5zIj5adXN0YW5kIGFscyBTcGFsdGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InB1Ymxpc2gtbWlzc2luZy1kb2N1bWVudHMiPgotICAgIERhcyBEb2t1bWVudCBrYW5uIG5pY2h0IHB1YmxpemllcnQgd2VyZGVuLCBzb2xhbmdlIGRpZSBmb2xnZW5kZW4gRG9rdW1lbnRlIG5pY2h0IHB1YmxpemllcnQgc2luZDoKLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im1pc3NpbmctZG9jdW1lbnQiPgotICAgIDwhLS0gVGhpcyBkb2Vzbid0IHdvcmsgeWV0LCBzZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DT0NPT04tMjA1NwotICAgICAgPHhodG1sOmEgaHJlZj0iezB9Ij57MX08L3hodG1sOmE+Ci0gICAgLS0+Ci0gICAgezB9ICgiezF9IikKLSAgPC9tZXNzYWdlPgotICANCi0gIDxtZXNzYWdlIGtleT0idW5wdWJsaXNoZWQtbGlua3MiPkxpbmtzIHp1IG5pY2h0IHB1YmxpemllcnRlbiBEb2t1bWVudGVuOjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsaW5rcy10by1kb2N1bWVudCI+TGlua3Mgdm9uIGFuZGVyZW4gRG9rdW1lbnRlbjo8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icHVibGlzaC1icm9rZW4tbGlua3MiPkRhcyBEb2t1bWVudCBlbnRow6RsdCBMaW5rcyB6dSBuaWNodCBleGlzdGllcmVuZGVuIERva3VtZW50ZW4uPC9tZXNzYWdlPgotICAKLSAgPG1lc3NhZ2Uga2V5PSJub3RpZnktcmV2aWV3ZXJzIj5QcsO8ZmVyIGJlbmFjaHJpY2h0aWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzY2hlZHVsZXItZGF0ZS1mb3JtYXQtaW52YWxpZCI+RGFzIFplaXRzdGV1ZXJ1bmdzLURhdHVtIG11c3MgZGVyIEZvcm0gJ3l5eXktTU0tZGQgSEg6bW06c3MnIGVudHNwcmVjaGVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCB3aGVuIHRoZSBsaXZlIHZlcnNpb24gZXhpc3RzLiI+Ci0gICAgRGllc2VyIFVzZWNhc2Uga2FubiBudXIgYXVzZ2Vmw7xocnQgd2VyZGVuLCB3ZW5uIGRpZSBMaXZlLVZlcnNpb24gZXhpc3RpZXJ0LgotICA8L21lc3NhZ2U+Ci0gIAotICA8IS0tIHN1Ym1pdCB1c2VjYXNlIC0tPgotICA8bWVzc2FnZSBrZXk9IndvcmtmbG93LnN1Ym1pdCI+RWlucmVpY2hlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzdWJtaXQtZm9yLWFwcHJvdmFsPyI+Ci0gICAgTcO2Y2h0ZW4gU2llIGRhcyBEb2t1bWVudCA8eGh0bWw6cT57MH08L3hodG1sOnE+IHp1ciBEdXJjaHNpY2h0IGVpbnJlaWNoZW4/Ci0gIDwvbWVzc2FnZT4gIAotICAKLSAgPCEtLSByZWplY3QgdXNlY2FzZSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJ3b3JrZmxvdy5yZWplY3QiPlp1csO8Y2t3ZWlzZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVqZWN0Ij5BYmxlaG5lbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWplY3QtZG9jPyI+Ci0gICAgTcO2Y2h0ZW4gU2llIGRhcyBEb2t1bWVudCA8eGh0bWw6cT57MH08L3hodG1sOnE+IHp1csO8Y2t3ZWlzZW4/Ci0gIDwvbWVzc2FnZT4KLSAgCi0gIDwhLS0gZGVhY3RpdmF0ZSB1c2VjYXNlIC0tPgotICA8bWVzc2FnZSBrZXk9IndvcmtmbG93LmRlYWN0aXZhdGUiPkRlYWt0aXZpZXJlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZWFjdGl2YXRlLWRvYz8iPk3DtmNodGVuIFNpZSBkYXMgRG9rdW1lbnQgPHhodG1sOnE+ezB9PC94aHRtbDpxPiBkZWFrdGl2aWVyZW4/PC9tZXNzYWdlPgotICAKLSAgCi08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L3Rlc3QvY2Fub28vdGVzdC54bWwgYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L3Rlc3QvY2Fub28vdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDE1MWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy90ZXN0L2Nhbm9vL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhRE9DVFlQRSBwcm9qZWN0IFNZU1RFTSAiLi4vLi4vLi4vLi4vbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2Nhbm9vL2xlbnlhX3dlYnRlc3QuZHRkIj4KLQotPHByb2plY3QgbmFtZT0id29ya2Zsb3ciIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Im1haW4iPgotICAKLSAgPGltcG9ydCBmaWxlPSIuLi8uLi8uLi8uLi9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vbWFjcm9zLnhtbCIvPgotICAKLSAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJzZXF1ZW5jZSwgcHVibGlzaGVkLWZvb3Rlciwgb3ZlcnZpZXciLz4KLSAgICAKLSAgPHRhcmdldCBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgPHdlYnRlc3QgbmFtZT0id29ya2Zsb3ctc2VxdWVuY2UiPgotICAgICAgJmRvQ29uZmlnOwotICAgICAgPHN0ZXBzPgotCi0gICAgICAgIDwhLS0gbG9naW4gYXMgbGVueWEgLS0+Ci0gICAgICAgIDxkb0xvZ2luIHVzZXJuYW1lPSJsZW55YSIgcGFzc3dvcmQ9ImxldmkiLz4KLSAgICAgICAgPHZlcmlmeUVsZW1lbnRUZXh0IHR5cGU9InNwYW4iIG5hbWU9IndvcmtmbG93LXN0YXRlIiB0ZXh0PSJhdXRob3JpbmciLz4KLQotICAgICAgICA8IS0tIHB1Ymxpc2ggbm90IGFsbG93ZWQgLS0+Ci0gICAgICAgIDxpbnZva2UgdXJsPSJpbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9d29ya2Zsb3cucHVibGlzaCIvPgotICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJUaGUgZXZlbnQgcHVibGlzaCBpcyBub3QgZXhlY3V0YWJsZSBvbiBkb2N1bWVudCIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0iY2FuY2VsIi8+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9IldlbGNvbWUgdG8gdGhlIERlZmF1bHQgUHVibGljYXRpb24gZnJvbSB0aGUgTGVueWEgY29tbXVuaXR5ISIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBzdWJtaXQgLS0+Ci0gICAgICAgIDxpbnZva2UgdXJsPSJpbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9d29ya2Zsb3cuc3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9IlN1Ym1pdCAmcXVvdDtXZWxjb21lIHRvIHRoZSBMZW55YSBkZWZhdWx0IHB1YmxpY2F0aW9uJnF1b3Q7IGZvciBhcHByb3ZhbCIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJzcGFuIiBuYW1lPSJ3b3JrZmxvdy1zdGF0ZSIgdGV4dD0icmV2aWV3Ii8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIGxvZ291dCAtLT4KLSAgICAgICAgPGRvTG9nb3V0Lz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gbG9naW4gYXMgYWxpY2UgLS0+Ci0gICAgICAgIDxkb0xvZ2luIHVzZXJuYW1lPSJhbGljZSIgcGFzc3dvcmQ9ImxldmkiLz4KLSAgICAgICAgPHZlcmlmeUVsZW1lbnRUZXh0IHR5cGU9InNwYW4iIG5hbWU9IndvcmtmbG93LXN0YXRlIiB0ZXh0PSJyZXZpZXciLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gcmVqZWN0IC0tPgotICAgICAgICA8aW52b2tlIHVybD0iaW5kZXguaHRtbD9sZW55YS51c2VjYXNlPXdvcmtmbG93LnJlamVjdCIvPgotICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJSZWplY3QgZG9jdW1lbnQgJnF1b3Q7V2VsY29tZSB0byB0aGUgTGVueWEgZGVmYXVsdCBwdWJsaWNhdGlvbiZxdW90OyIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJzcGFuIiBuYW1lPSJ3b3JrZmxvdy1zdGF0ZSIgdGV4dD0iYXV0aG9yaW5nIi8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIGxvZ291dCAtLT4KLSAgICAgICAgPGRvTG9nb3V0Lz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gbG9naW4gYXMgbGVueWEgLS0+Ci0gICAgICAgIDxkb0xvZ2luIHVzZXJuYW1lPSJsZW55YSIgcGFzc3dvcmQ9ImxldmkiLz4KLSAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0ic3BhbiIgbmFtZT0id29ya2Zsb3ctc3RhdGUiIHRleHQ9ImF1dGhvcmluZyIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBzdWJtaXQgLS0+Ci0gICAgICAgIDxpbnZva2UgdXJsPSJpbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9d29ya2Zsb3cuc3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9IlN1Ym1pdCAmcXVvdDtXZWxjb21lIHRvIHRoZSBMZW55YSBkZWZhdWx0IHB1YmxpY2F0aW9uJnF1b3Q7IGZvciBhcHByb3ZhbCIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJzcGFuIiBuYW1lPSJ3b3JrZmxvdy1zdGF0ZSIgdGV4dD0icmV2aWV3Ii8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIGxvZ291dCAtLT4KLSAgICAgICAgPGRvTG9nb3V0Lz4KLQotICAgICAgICA8IS0tIGxvZ2luIGFzIGFsaWNlIC0tPgotICAgICAgIDxkb0xvZ2luIHVzZXJuYW1lPSJhbGljZSIgcGFzc3dvcmQ9ImxldmkiLz4KLSAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0ic3BhbiIgbmFtZT0id29ya2Zsb3ctc3RhdGUiIHRleHQ9InJldmlldyIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBwdWJsaXNoIC0tPgotICAgICAgICA8aW52b2tlIHVybD0iaW5kZXguaHRtbD9sZW55YS51c2VjYXNlPXdvcmtmbG93LnB1Ymxpc2giLz4KLSAgICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0ic3BhbiIgbmFtZT0id29ya2Zsb3ctc3RhdGUiIHRleHQ9ImxpdmUiLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gZGVhY3RpdmF0ZSAtLT4KLSAgICAgICAgPGludm9rZSB1cmw9ImluZGV4Lmh0bWw/bGVueWEudXNlY2FzZT13b3JrZmxvdy5kZWFjdGl2YXRlIi8+Ci0gICAgICAgIDxjbGlja0J1dHRvbiBuYW1lPSJzdWJtaXQiLz4KLSAgICAgICAgPHZlcmlmeUVsZW1lbnRUZXh0IHR5cGU9InNwYW4iIG5hbWU9IndvcmtmbG93LXN0YXRlIiB0ZXh0PSJhdXRob3JpbmciLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gbG9nb3V0IC0tPgotICAgICAgICA8ZG9Mb2dvdXQvPgotICAgICAgICAKLSAgICAgIDwvc3RlcHM+Ci0gICAgPC93ZWJ0ZXN0PgotICA8L3RhcmdldD4KLQotCi0gIDx0YXJnZXQgbmFtZT0icHVibGlzaGVkLWZvb3RlciI+Ci0gICAgPHdlYnRlc3QgbmFtZT0iV29ya2Zsb3cgc2VxdWVuY2UiPgotICAgICAgPGNvbmZpZyBob3N0PSIke3dlYnRlc3QuY29uZmlnLmhvc3R9IiBwb3J0PSIke3dlYnRlc3QuY29uZmlnLnBvcnR9IgotICAgICAgICAgICAgIHByb3RvY29sPSJodHRwIiBiYXNlcGF0aD0iZGVmYXVsdCI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iVGhyb3dFeGNlcHRpb25PbkZhaWxpbmdTdGF0dXNDb2RlIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwvY29uZmlnPgotICAgICAgPHN0ZXBzPgotCi0gICAgICAgIDwhLS0gbG9naW4gYXMgYWxpY2UgLS0+Ci0gICAgICAgPGRvTG9naW4gdXNlcm5hbWU9ImFsaWNlIiBwYXNzd29yZD0ibGV2aSIgdXJsPSJhdXRob3JpbmcvdHV0b3JpYWwuaHRtbCIvPgotICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0ic3BhbiIgbmFtZT0id29ya2Zsb3ctc3RhdGUiIHRleHQ9ImF1dGhvcmluZyIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBzdWJtaXQgLS0+Ci0gICAgICAgIDxpbnZva2UgdXJsPSJhdXRob3JpbmcvdHV0b3JpYWwuaHRtbD9sZW55YS51c2VjYXNlPXdvcmtmbG93LnN1Ym1pdCIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJzcGFuIiBuYW1lPSJ3b3JrZmxvdy1zdGF0ZSIgdGV4dD0icmV2aWV3Ii8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIGxpdmUgdmVyc2lvbiBzaG91bGQgbm90IGV4aXN0IC0tPgotICAgICAgICA8aW52b2tlIHVybD0ibGl2ZS90dXRvcmlhbC5odG1sIi8+Ci0gICAgICAgIDxzdG9yZVJlc3BvbnNlQ29kZSBwcm9wZXJ0eT0ic3RhdHVzIiAvPgotICAgICAgICA8dmVyaWZ5UHJvcGVydHkgbmFtZT0ic3RhdHVzIiB0ZXh0PSI0MDQiLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gcHVibGlzaCAtLT4KLSAgICAgICAgPGludm9rZSB1cmw9ImF1dGhvcmluZy90dXRvcmlhbC5odG1sIi8+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9IlRoaXMgcGFnZSBoYXMgbm90IGJlZW4gcHVibGlzaGVkIHlldC4iLz4KLSAgICAgICAgPGludm9rZSB1cmw9ImF1dGhvcmluZy90dXRvcmlhbC5odG1sP2xlbnlhLnVzZWNhc2U9d29ya2Zsb3cucHVibGlzaCIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJzcGFuIiBuYW1lPSJ3b3JrZmxvdy1zdGF0ZSIgdGV4dD0ibGl2ZSIvPgotICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJUaGlzIHBhZ2Ugd2FzIGxhc3QgcHVibGlzaGVkIGF0Ii8+Ci0gICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9ImJ5IEFsaWNlLiIvPgotICAgICAgICAKLSAgICAgICAgPGludm9rZSB1cmw9ImxpdmUvdHV0b3JpYWwuaHRtbCIvPgotICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJUaGlzIHBhZ2Ugd2FzIGxhc3QgcHVibGlzaGVkIGF0Ii8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIGxvZ291dCAtLT4KLSAgICAgICAgPGRvTG9nb3V0IHVybD0iYXV0aG9yaW5nL3R1dG9yaWFsLmh0bWwiLz4KLSAgICAgICAgCi0gICAgICA8L3N0ZXBzPgotICAgIDwvd2VidGVzdD4KLSAgPC90YXJnZXQ+Ci0KLQotICA8dGFyZ2V0IG5hbWU9Im92ZXJ2aWV3Ij4KLSAgICA8d2VidGVzdCBuYW1lPSJ3b3JrZmxvdy5tdWx0aVdvcmtmbG93Ij4KLSAgICAgICZkb0NvbmZpZzsKLSAgICAgIDxzdGVwcz4KLQotICAgICAgICA8IS0tIGxvZ2luIGFzIGxlbnlhIC0tPgotICAgICAgICA8ZG9Mb2dpbiB1c2VybmFtZT0ibGVueWEiIHBhc3N3b3JkPSJsZXZpIi8+Ci0gICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJzcGFuIiBuYW1lPSJ3b3JrZmxvdy1zdGF0ZSIgdGV4dD0iYXV0aG9yaW5nIi8+Ci0KLSAgICAgICA8IS0tIHJlcXVlc3Qgd29ya2Zsb3cgb3ZlcnZpZXcgLS0+Ci0gICAgICAgIDxpbnZva2UgdXJsPSJpbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9d29ya2Zsb3cubXVsdGlXb3JrZmxvdyIvPgotICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0iaDEiIHRleHQ9IldvcmtmbG93IE92ZXJ2aWV3Ii8+Ci0KLSAgICAgICA8IS0tIGxvZ291dCAtLT4KLSAgICAgICAgPGRvTG9nb3V0Lz4KLQotICAgICAgPC9zdGVwcz4KLSAgICA8L3dlYnRlc3Q+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvdXNlY2FzZXMvZGVhY3RpdmF0ZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvdXNlY2FzZXMvZGVhY3RpdmF0ZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5OGRlOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L3VzZWNhc2VzL2RlYWN0aXZhdGUuangKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiIAotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgPgotICAKLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5EZWFjdGl2YXRlPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PkRlYWN0aXZhdGU8L2kxOG46dGV4dD4KLSAgICAgIDwvZGl2PgotICAgICAgCi0gICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAKLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgCi0gICAgICAgIDxqeDpzZXQgdmFyPSJ0aXRsZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykKLSAgICAgICAgICAuZ2V0TWV0YURhdGEoJ2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJykKLSAgICAgICAgICAuZ2V0Rmlyc3RWYWx1ZSgndGl0bGUnKX0iLz4KLSAgICAgICAgCi0gICAgICAgIDxmb3JtIGlkPSJmb3JtLWRlYWN0aXZhdGUiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0iZGVhY3RpdmF0ZS1kb2M/Ii8+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke3RpdGxlfSIvPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgIDxici8+PGJyLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8ang6c2V0IHZhcj0ibGlua3NUb0RvY3VtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbGlua3NUb0RvY3VtZW50JykuZ2V0RG9jdW1lbnRzKCl9Ii8+Ci0gICAgICAgICAgICA8ang6aWYgdGVzdD0iJHshdXNlY2FzZS5oYXNFcnJvcnMoKSAmYW1wOyZhbXA7IGxpbmtzVG9Eb2N1bWVudC5zaXplKCkgJmd0OyAwfSI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PmxpbmtzLXRvLWRvY3VtZW50PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0ibGluayIgaXRlbXM9IiR7bGlua3NUb0RvY3VtZW50fSI+Ci0gICAgICAgICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJHtsaW5rLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7bGluay5nZXRNZXRhRGF0YSgnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nKS5nZXRGaXJzdFZhbHVlKCd0aXRsZScpfSIvPjwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAoPGp4Om91dCB2YWx1ZT0iJHtsaW5rLmdldFBhdGgoKX0iLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7bGluay5nZXRMYW5ndWFnZSgpfSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iRGVhY3RpdmF0ZSIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvdXNlY2FzZXMvbXVsdGlXb3JrZmxvdy5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvdXNlY2FzZXMvbXVsdGlXb3JrZmxvdy5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZjI5ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L3VzZWNhc2VzL211bHRpV29ya2Zsb3cuangKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiBlbXB0eVRyYXNoLmp4IDE2NDIzMyAyMDA1LTA0LTIyIDEzOjAxOjQ1WiBqd2thbHR6ICQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPjwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6c2V0IHZhcj0ic3R5bGUiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzdHlsZScpfSIvPgotICAgIAotICAgIDxmb3JtIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmU7Ij4KLSAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJiYWNrLXRvLWRvY3VtZW50IiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgPC9mb3JtPgotICAgIAotICAgIDxmb3JtIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmU7Ij4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPgotICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgPGp4OndoZW4gdGVzdD0iJHtzdHlsZS5lcXVhbHMoJ3RleHQnKX0iPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InN0eWxlIiB2YWx1ZT0iY29sdW1ucyIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9InN0YXRlLWFzLWNvbHVtbnMiIGkxOG46YXR0cj0idmFsdWUiLz4KLSAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InN0eWxlIiB2YWx1ZT0idGV4dCIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9InN0YXRlLWFzLXRleHQiIGkxOG46YXR0cj0idmFsdWUiLz4KLSAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICA8L2p4OmNob29zZT4KLSAgICA8L2Zvcm0+Ci0gICAgCi0gICAgPGJyLz48YnIvPgotICAgIAotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAKLSAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLWxpc3QiPgotICAgICAgCi0gICAgICA8dHI+Ci0gICAgICAgIDx0aD48aTE4bjp0ZXh0PlBhdGg8L2kxOG46dGV4dD48L3RoPgotICAgICAgICA8dGg+PGkxOG46dGV4dD5MYW5ndWFnZTwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHtzdHlsZS5lcXVhbHMoJ3RleHQnKX0iPgotICAgICAgICAgICAgPHRoPjxpMThuOnRleHQ+U3RhdGU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJzdGF0ZSIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3N0YXRlcycpfSI+Ci0gICAgICAgICAgICAgIDx0aD48aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7c3RhdGV9Ii8+PC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgIDx0aD48aTE4bjp0ZXh0PkFjdGlvbnM8L2kxOG46dGV4dD48L3RoPgotICAgICAgPC90cj4KLSAgICAgIAotICAgICAgPGp4OmZvckVhY2ggdmFyPSJkb2MiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudHMnKX0iPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPGp4OnNldCB2YXI9InBhdGgiIHZhbHVlPSIke2RvYy5nZXRQYXRoKCl9Ii8+Ci0gICAgICAgICAgPGp4OnNldCB2YXI9ImRlcHRoIiB2YWx1ZT0iJHtwYXRoLnNwbGl0KCcvJykuc2l6ZSgpIC0gMn0iLz4KLSAgICAgICAgICA8ang6c2V0IHZhcj0id2hpdGVzcGFjZSIgdmFsdWU9IiYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyIvPgotICAgICAgICAgIDxqeDpzZXQgdmFyPSJpbmRlbnQiIHZhbHVlPSIke3doaXRlc3BhY2Uuc3Vic3RyaW5nKDAsIGRlcHRoLmludFZhbHVlKCkpfSIvPgotICAgICAgICAgIDxqeDpzZXQgdmFyPSJsYXN0U2xhc2hJbmRleCIgdmFsdWU9IiR7amF2YS5sYW5nLkludGVnZXIudmFsdWVPZihwYXRoLmxhc3RJbmRleE9mKCcvJykpfSIvPgotICAgICAgICAgIDxqeDpzZXQgdmFyPSJub2RlTmFtZSIgdmFsdWU9IiR7cGF0aC5zdWJzdHJpbmcobGFzdFNsYXNoSW5kZXguaW50VmFsdWUoKSl9Ii8+Ci0gICAgICAgICAgPGp4OnNldCB2YXI9Imxhbmd1YWdlcyIgdmFsdWU9IiR7ZG9jLmdldExhbmd1YWdlcygpfSIvPgotICAgICAgICAgIDxqeDppZiB0ZXN0PSIke2RvYy5nZXRMYW5ndWFnZSgpLmVxdWFscyhqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChsYW5ndWFnZXMpLmdldCgwKSl9Ij4KLSAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIke2RvYy5nZXRMYW5ndWFnZXMoKS5zaXplKCl9IiBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcCI+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7aW5kZW50fSIvPjxqeDpvdXQgdmFsdWU9IiR7aW5kZW50fSIvPjxqeDpvdXQgdmFsdWU9IiR7aW5kZW50fSIvPjxqeDpvdXQgdmFsdWU9IiR7aW5kZW50fSIvPjxqeDpvdXQgdmFsdWU9IiR7bm9kZU5hbWV9Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGEgaHJlZj0iJHtkb2MuZ2V0VXJsKCl9Ij48ang6b3V0IHZhbHVlPSIke2RvYy5nZXRMYW5ndWFnZSgpfSIvPjwvYT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3N0eWxlLmVxdWFscygndGV4dCcpfSI+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7ZG9jLmdldFN0YXRlKCl9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InN0YXRlIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc3RhdGVzJyl9Ij4KLSAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHtzdGF0ZS5lcXVhbHMoZG9jLmdldFN0YXRlKCkpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj54PC90ZD4KLSAgICAgICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJ1c2VjYXNlTmFtZSIgaXRlbXM9IiR7ZG9jLmdldFVzZWNhc2VzKCl9Ij4KLSAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIke3VzZWNhc2UuZ2V0U291cmNlVVJMKCl9IiBtZXRob2Q9IlBPU1QiIGlkPSJmb3JtLW92ZXJ2aWV3IiBzdHlsZT0iZGlzcGxheTogaW5saW5lOyI+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IndvcmtmbG93Lm11bHRpV29ya2Zsb3dJbnZva2UiLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ1c2VjYXNlTmFtZSIgdmFsdWU9IiR7dXNlY2FzZU5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idXJsIiB2YWx1ZT0iJHtkb2MuZ2V0VXJsKCl9Ii8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iJHt1c2VjYXNlTmFtZX0iIGkxOG46YXR0cj0idmFsdWUiLz4KLSAgICAgICAgICAgICAgPC9mb3JtPgotICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAKLSAgICA8L3RhYmxlPgotICAgIAotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvdXNlY2FzZXMvcHVibGlzaC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvdXNlY2FzZXMvcHVibGlzaC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2NWNjMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L3VzZWNhc2VzL3B1Ymxpc2guangKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLSAgCi0gIDxwYWdlOnRpdGxlPjxpMThuOnRleHQ+d29ya2Zsb3cucHVibGlzaDwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD53b3JrZmxvdy5wdWJsaXNoPC9pMThuOnRleHQ+Ci0gICAgICA8L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgCi0gICAgICAgIDxqeDpzZXQgdmFyPSJ0aXRsZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykKLSAgICAgICAgICAuZ2V0TWV0YURhdGEoJ2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJykKLSAgICAgICAgICAuZ2V0Rmlyc3RWYWx1ZSgndGl0bGUnKX0iLz4KLSAgICAgICAgCi0gICAgICAgIDxmb3JtIGlkPSJmb3JtLXB1Ymxpc2giPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiIgdmFsaWduPSJ0b3AiPjxpMThuOnRleHQ+RG9jdW1lbnQ8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgICAgICAiPGp4Om91dCB2YWx1ZT0iJHt0aXRsZX0iLz4iCi0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+TWVzc2FnZXM8L2kxOG46dGV4dD46Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9Im1lc3NhZ2UiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0RXJyb3JNZXNzYWdlcygpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7bWVzc2FnZS5nZXRNZXNzYWdlKCl9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6aWYgdGVzdD0iJHttZXNzYWdlLmhhc1BhcmFtZXRlcnMoKX0iPiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJwYXJhbSIgaXRlbXM9IiR7bWVzc2FnZS5nZXRQYXJhbWV0ZXJzKCl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke3BhcmFtfSIvPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJtZXNzYWdlIiBpdGVtcz0iJHt1c2VjYXNlLmdldEluZm9NZXNzYWdlcygpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7bWVzc2FnZS5nZXRNZXNzYWdlKCl9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6aWYgdGVzdD0iJHttZXNzYWdlLmhhc1BhcmFtZXRlcnMoKX0iPiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJwYXJhbSIgaXRlbXM9IiR7bWVzc2FnZS5nZXRQYXJhbWV0ZXJzKCl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke3BhcmFtfSIvPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPGp4OnNldCB2YXI9InVucHVibGlzaGVkTGlua3MiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1bnB1Ymxpc2hlZExpbmtzJykuZ2V0RG9jdW1lbnRzKCl9Ii8+Ci0gICAgICAgICAgICA8ang6aWYgdGVzdD0iJHt1bnB1Ymxpc2hlZExpbmtzICE9IG51bGwgJmFtcDsmYW1wOyB1bnB1Ymxpc2hlZExpbmtzLnNpemUoKSAmZ3Q7IDB9Ij4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+dW5wdWJsaXNoZWQtbGlua3M8L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJsaW5rIiBpdGVtcz0iJHt1bnB1Ymxpc2hlZExpbmtzfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJHtsaW5rLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7bGluay5nZXRNZXRhRGF0YSgnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nKS5nZXRGaXJzdFZhbHVlKCd0aXRsZScpfSIvPjwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAoPGp4Om91dCB2YWx1ZT0iJHtsaW5rLmdldFBhdGgoKX0iLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7bGluay5nZXRMYW5ndWFnZSgpfSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+bm90aWZ5LXN1Ym1pdHRlcjwvaTE4bjp0ZXh0PjoKLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0Qm9vbGVhbkNoZWNrYm94UGFyYW1ldGVyKCdzZW5kTm90aWZpY2F0aW9uJykuZXF1YWxzKCd0cnVlJyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InNlbmROb3RpZmljYXRpb24iIHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIi8+Ci0gICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic2VuZE5vdGlmaWNhdGlvbiIgdHlwZT0iY2hlY2tib3giLz4KLSAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PlNjaGVkdWxlPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmdldEJvb2xlYW5DaGVja2JveFBhcmFtZXRlcignc2NoZWR1bGUnKS5lcXVhbHMoJ3RydWUnKX0iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNjaGVkdWxlIiBjaGVja2VkPSJjaGVja2VkIi8+Ci0gICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNjaGVkdWxlIi8+Ci0gICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic2NoZWR1bGUudGltZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3NjaGVkdWxlLnRpbWUnKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8ang6aWYgdGVzdD0iJHshdXNlY2FzZS5oYXNFcnJvcnMoKSB8fCBjb2Nvb24ucmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ3N1Ym1pdCcpICE9IG51bGx9Ij4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IlB1Ymxpc2giLz4KLSAgICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZm9ybT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtY29yZS93b3JrZmxvdy91c2VjYXNlcy9yZWplY3QuanggYi90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L3VzZWNhc2VzL3JlamVjdC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjMWQ5OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L3VzZWNhc2VzL3JlamVjdC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0gIAotICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0PndvcmtmbG93LnJlamVjdDwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgCi0gICAgICA8ang6c2V0IHZhcj0idGl0bGUiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudCcpCi0gICAgICAgIC5nZXRNZXRhRGF0YSgnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nKQotICAgICAgICAuZ2V0Rmlyc3RWYWx1ZSgndGl0bGUnKX0iLz4KLSAgICAgIAotICAgICAgCi0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PndvcmtmbG93LnJlamVjdDwvaTE4bjp0ZXh0PgotICAgICAgPC9kaXY+Ci0gICAgICAKLSAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgIAotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtUmVqZWN0Ij4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQgaTE4bjprZXk9InJlamVjdC1kb2M/Ii8+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke3RpdGxlfSIvPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0Pm5vdGlmeS1zdWJtaXR0ZXI8L2kxOG46dGV4dD46Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc2VuZE5vdGlmaWNhdGlvbicpLmVxdWFscygndHJ1ZScpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzZW5kTm90aWZpY2F0aW9uIiB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD0iY2hlY2tlZCIKLSAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJqYXZhc2NyaXB0OmRvY3VtZW50LmZvcm1SZWplY3QucmVqZWN0UmVhc29uLmRpc2FibGVkID0gIXRoaXMuY2hlY2tlZCIvPgotICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InNlbmROb3RpZmljYXRpb24iIHR5cGU9ImNoZWNrYm94IgotICAgICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuZm9ybVJlamVjdC5yZWplY3RSZWFzb24uZGlzYWJsZWQgPSAhdGhpcy5jaGVja2VkIi8+Ci0gICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5SZWFzb248L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzZW5kTm90aWZpY2F0aW9uJykuZXF1YWxzKCd0cnVlJyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9InJlamVjdFJlYXNvbiIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3JlamVjdFJlYXNvbicpfSIvPgotICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9InJlamVjdFJlYXNvbiIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3JlamVjdFJlYXNvbicpfSIKLSAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+ICAKLSAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJSZWplY3QiLz4KLSAgICAgICAgICAgICAgICAmIzE2MDsKLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9mb3JtPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1jb3JlL3dvcmtmbG93L3VzZWNhc2VzL3N1Ym1pdC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvdXNlY2FzZXMvc3VibWl0Lmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWJjNTBkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWNvcmUvd29ya2Zsb3cvdXNlY2FzZXMvc3VibWl0Lmp4CisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLSAgCi0gIDxwYWdlOnRpdGxlPjxpMThuOnRleHQ+d29ya2Zsb3cuc3VibWl0PC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICAKLSAgICAgIDxqeDpzZXQgdmFyPSJ0aXRsZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykKLSAgICAgICAgLmdldE1ldGFEYXRhKCdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpCi0gICAgICAgIC5nZXRGaXJzdFZhbHVlKCd0aXRsZScpfSIvPgotICAgICAgCi0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PndvcmtmbG93LnN1Ym1pdDwvaTE4bjp0ZXh0PgotICAgICAgPC9kaXY+Ci0gICAgICAKLSAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgIAotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICA8Zm9ybSBpZD0iZm9ybS1zdWJtaXQiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0ic3VibWl0LWZvci1hcHByb3ZhbD8iLz4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnBhcmFtPjxqeDpvdXQgdmFsdWU9IiR7dGl0bGV9Ii8+PC9pMThuOnBhcmFtPgotICAgICAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+bm90aWZ5LXJldmlld2VyczwvaTE4bjp0ZXh0PjoKLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzZW5kTm90aWZpY2F0aW9uJykuZXF1YWxzKCd0cnVlJyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InNlbmROb3RpZmljYXRpb24iIHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIi8+Ci0gICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic2VuZE5vdGlmaWNhdGlvbiIgdHlwZT0iY2hlY2tib3giLz4KLSAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkLz4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTExNmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy50YXNrPC9pZD4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svY29uZmlnL3NpdGVtYXAvYWN0aW9ucy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svY29uZmlnL3NpdGVtYXAvYWN0aW9ucy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYzNmY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2NvbmZpZy9zaXRlbWFwL2FjdGlvbnMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IGFjdGlvbnMueG1hcCAyODAwNjAgMjAwNS0wOS0xMSAwMTo1NjozMVogY2hlc3RudXQgJCAgLS0+Ci0KLTx4bWFwIHhwYXRoPSIvc2l0ZW1hcC9jb21wb25lbnRzL2FjdGlvbnMiIHVubGVzcz0iL3NpdGVtYXAvY29tcG9uZW50cy9hY3Rpb25zL2FjdGlvbltAbmFtZSA9ICd0YXNrJ10iPgotICAgPG1hcDphY3Rpb24gbmFtZT0idGFzayIgbG9nZ2VyPSJzaXRlbWFwLmFjdGlvbi50YXNrIiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3RpbmcuVGFza0FjdGlvbiIvPgotPC94bWFwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9MZW55YVByb2plY3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9MZW55YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0YzljMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hbnQvTGVueWFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Ow0KLQ0KLS8qKg0KLSAqIEFudCBwcm9qZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIG1hbmFnZXIuDQotICogDQotICogQHZlcnNpb24gJElkOiQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTGVueWFQcm9qZWN0IGV4dGVuZHMgUHJvamVjdCB7DQotDQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDdG9yLg0KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLg0KLSAgICAgKi8NCi0gICAgcHVibGljIExlbnlhUHJvamVjdChTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7DQotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBUaGUgc2VydmljZSBtYW5hZ2VyLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFNlcnZpY2VNYW5hZ2VyIGdldFNlcnZpY2VNYW5hZ2VyKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcjsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2FjdGluZy9UYXNrQWN0aW9uLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL1Rhc2tBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxMzE1MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vYWN0aW5nL1Rhc2tBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5hY3RpbmcuU2VydmljZWFibGVBY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVkaXJlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRhc2suQ29jb29uVGFza1dyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5UYXNrV3JhcHBlcjsKLQotLyoqCi0gKiBBbiBhY3Rpb24gdGhhdCBleGVjdXRlcyBhIHRhc2suCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrQWN0aW9uIGV4dGVuZHMgU2VydmljZWFibGVBY3Rpb24gewotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uYWN0aW5nLkFjdGlvbiNhY3Qob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVkaXJlY3Rvciwgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXIsIGphdmEudXRpbC5NYXAsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnMpCi0gICAgICovCi0gICAgcHVibGljIGphdmEudXRpbC5NYXAgYWN0KAotICAgICAgICBSZWRpcmVjdG9yIHJlZGlyZWN0b3IsCi0gICAgICAgIFNvdXJjZVJlc29sdmVyIHNvdXJjZVJlc29sdmVyLAotICAgICAgICBNYXAgb2JqZWN0TW9kZWwsCi0gICAgICAgIFN0cmluZyBzdHIsCi0gICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycykKLSAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIFRhc2tXcmFwcGVyIHdyYXBwZXIgPSBuZXcgQ29jb29uVGFza1dyYXBwZXIob2JqZWN0TW9kZWwsIHBhcmFtZXRlcnMsIHRoaXMubWFuYWdlcik7Ci0gICAgICAgIHdyYXBwZXIuZXhlY3V0ZSgpOwotCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGdldCBzZXNzaW9uCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbih0cnVlKTsKLQotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiTm8gc2Vzc2lvbiBvYmplY3QiKTsKLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBSZXR1cm4gcmVmZXJlcgotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBTdHJpbmcgcGFyZW50X3VyaSA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZy5UYXNrQWN0aW9uLnBhcmVudF91cmkiKTsKLSAgICAgICAgSGFzaE1hcCBhY3Rpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBhY3Rpb25NYXAucHV0KCJwYXJlbnRfdXJpIiwgcGFyZW50X3VyaSk7Ci0gICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKCJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uYWN0aW5nLlRhc2tBY3Rpb24ucGFyZW50X3VyaSIpOwotCi0gICAgICAgIHJldHVybiBhY3Rpb25NYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NjaGVkdWxlci9TY2hlZHVsZXJIZWxwZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9zY2hlZHVsZXIvU2NoZWR1bGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDAyNmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NjaGVkdWxlci9TY2hlZHVsZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCi0gKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICogIAotICovCi0KLS8qICRJZCQgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24udGFzay5Db2Nvb25UYXNrV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zY2hlZHVsZXIuTG9hZFF1YXJ0elNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2NoZWR1bGVyLlNlcnZsZXRKb2I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5UYXNrV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotCi0vKioKLSAqIFNjaGVkdWxlciBoZWxwZXIKLSAqLwotcHVibGljIGNsYXNzIFNjaGVkdWxlckhlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBfb2JqZWN0TW9kZWwgVGhlIENvY29vbiBjb21wb25lbnQgb2JqZWN0IG1vZGVsLgotICAgICAqIEBwYXJhbSBfcGFyYW1ldGVycyBUaGUgQ29jb29uIGNvbXBvbmVudCBwYXJhbWV0ZXJzLgotICAgICAqIEBwYXJhbSBfbG9nZ2VyIFRoZSBsb2dnZXIgdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlZHVsZXJIZWxwZXIoTWFwIF9vYmplY3RNb2RlbCwgUGFyYW1ldGVycyBfcGFyYW1ldGVycywgTG9nZ2VyIF9sb2dnZXIpIHsKLSAgICAgICAgdGhpcy5vYmplY3RNb2RlbCA9IF9vYmplY3RNb2RlbDsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gX3BhcmFtZXRlcnM7Ci0gICAgICAgIHRoaXMubG9nZ2VyID0gX2xvZ2dlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7Ci0gICAgcHJpdmF0ZSBNYXAgb2JqZWN0TW9kZWw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBzY2hlZHVsZXIgcGFyYW1ldGVycy4KLSAgICAgKiBAcmV0dXJuIEEgbWFwLgotICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgY3JlYXRlUGFyYW1ldGVycygpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQotICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGFza1dyYXBwZXIgd3JhcHBlciA9IG5ldyBDb2Nvb25UYXNrV3JhcHBlcih0aGlzLm9iamVjdE1vZGVsLCB0aGlzLnBhcmFtZXRlcnMsIG51bGwpOwotCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygiQWRkaW5nIHRhc2sgd3JhcHBlciBwYXJhbWV0ZXJzIik7Ci0gICAgICAgICAgICBNYXAgd3JhcHBlclBhcmFtZXRlcnMgPSB3cmFwcGVyLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIG1hcC5wdXRBbGwod3JhcHBlclBhcmFtZXRlcnMpOwotCi0gICAgICAgICAgICBOYW1lc3BhY2VNYXAgc2NoZWR1bGVyUGFyYW1ldGVycyA9IG5ldyBOYW1lc3BhY2VNYXAoTG9hZFF1YXJ0elNlcnZsZXQuUFJFRklYKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGlkZW50aXR5TWFwID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50SWRlbnRpdHlNYXAobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJsID0gU2VydmxldEhlbHBlci5nZXRXZWJhcHBVUkkoT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLm9iamVjdE1vZGVsKSk7Ci0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBudWxsOwotCi0gICAgICAgICAgICBzY2hlZHVsZXJQYXJhbWV0ZXJzLnB1dChTZXJ2bGV0Sm9iLlBBUkFNRVRFUl9ET0NVTUVOVF9VUkwsaWRlbnRpdHlNYXAuZ2V0RnJvbVVSTCh1cmwpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxXZWJhcHBVUkwoKSk7Ci0gICAgICAgICAgICBzY2hlZHVsZXJQYXJhbWV0ZXJzLnB1dChMb2FkUXVhcnR6U2VydmxldC5QQVJBTUVURVJfUFVCTElDQVRJT05fSUQsIHB1Yi5nZXRJZCgpKTsKLSAgICAgICAgICAgIG1hcC5wdXRBbGwoc2NoZWR1bGVyUGFyYW1ldGVycy5nZXRQcmVmaXhlZE1hcCgpKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90YXNrL0NvY29vblRhc2tXcmFwcGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdGFzay9Db2Nvb25UYXNrV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgzYzgxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90YXNrL0NvY29vblRhc2tXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRhc2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYWMuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5EZWZhdWx0VGFza1dyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5Ob3RpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrLlRhc2tXcmFwcGVyUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrLldvcmtmbG93SW52b2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwotCi0vKioKLSAqIFRhc2sgd3JhcHBlciB0byBiZSB1c2VkIGZyb20gQ29jb29uIGNvbXBvbmVudHMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGNsYXNzIENvY29vblRhc2tXcmFwcGVyIGV4dGVuZHMgRGVmYXVsdFRhc2tXcmFwcGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvY29vblRhc2tXcmFwcGVyLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIEN0b3IgdG8gYmUgY2FsbGVkIGZyb20gYSBDb2Nvb24gY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBvYmplY3RNb2RlbCBBIENvY29vbiBvYmplY3QgbW9kZWwuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQSBwYXJhbWV0ZXJzIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBDb2Nvb25UYXNrV3JhcHBlcihNYXAgb2JqZWN0TW9kZWwsIFBhcmFtZXRlcnMgcGFyYW1ldGVycywgU2VydmljZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBzdXBlcihtYW5hZ2VyKTsKLQotICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIENvY29vblRhc2tXcmFwcGVyIik7Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb247Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbihtYW5hZ2VyLCBvYmplY3RNb2RlbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotCi0gICAgICAgIGluaXRpYWxpemUocGFyYW1ldGVycywgcHVibGljYXRpb24sIHJlcXVlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29jb29uVGFza1dyYXBwZXIoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBzdXBlcihtYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIHdyYXBwZXIuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHRhc2sgcGFyYW1ldGVycy4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0LgotICAgICAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBSZXF1ZXN0IHJlcXVlc3QpCi0gICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0Tm90aWZ5aW5nKHJlcXVlc3QpOwotCi0gICAgICAgIFBhcmFtZXRlcnMgdGFza1BhcmFtZXRlcnMgPSBleHRyYWN0VGFza1BhcmFtZXRlcnMocGFyYW1ldGVycywgcHVibGljYXRpb24sIHJlcXVlc3QpOwotICAgICAgICBnZXRUYXNrUGFyYW1ldGVycygpLnBhcmFtZXRlcml6ZSh0YXNrUGFyYW1ldGVycyk7Ci0KLSAgICAgICAgU3RyaW5nIHRhc2tJZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFRhc2tXcmFwcGVyUGFyYW1ldGVycy5UQVNLX0lEKTsKLSAgICAgICAgdGFza0lkID0gcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoVGFza1dyYXBwZXJQYXJhbWV0ZXJzLlRBU0tfSUQsIHRhc2tJZCk7Ci0KLSAgICAgICAgU3RyaW5nIHdlYmFwcFVybCA9IFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpOwotICAgICAgICBpbml0aWFsaXplKHRhc2tJZCwgcHVibGljYXRpb24sIHdlYmFwcFVybCwgdGFza1BhcmFtZXRlcnMpOwotCi0gICAgICAgIFN0cmluZyBldmVudE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihXb3JrZmxvd0ludm9rZXIuRVZFTlRfUkVRVUVTVF9QQVJBTUVURVIpOwotICAgICAgICBpZiAoZXZlbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGV2ZW50TmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFdvcmtmbG93SW52b2tlci5MRU5ZQV9FVkVOVF9SRVFVRVNUX1BBUkFNRVRFUik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gc2Vzc2lvbiBmb3VuZCAtIG5vdCBlbmFibGluZyB3b3JrZmxvdyBoYW5kbGluZy4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSBJZGVudGl0eS5nZXRJZGVudGl0eShzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoaWRlbnRpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIGlkZW50aXR5IGZvdW5kIC0gbm90IGVuYWJsaW5nIHdvcmtmbG93IGhhbmRsaW5nLiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSWRlbnRpdHkgZm91bmQgLSBlbmFibGluZyB3b3JrZmxvdyBoYW5kbGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgUm9sZVtdIHJvbGVzOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSBQb2xpY3lVdGlsLmdldFJvbGVzKHJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0V29ya2Zsb3dBd2FyZShldmVudE5hbWUsIGlkZW50aXR5LCByb2xlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIG5vdGlmaWNhdGlvbiBpZiB0aGUgY29ycmVzcG9uZGluZyByZXF1ZXN0IHBhcmFtZXRlcnMgZXhpc3QuCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Tm90aWZ5aW5nKFJlcXVlc3QgcmVxdWVzdCkgewotCi0gICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGluaXRpYWxpemUgbm90aWZpY2F0aW9uIC4uLiIpOwotCi0gICAgICAgIE1hcCByZXF1ZXN0UGFyYW1ldGVycyA9IFNlcnZsZXRIZWxwZXIuZ2V0UGFyYW1ldGVyTWFwKHJlcXVlc3QpOwotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0gICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKLQotICAgICAgICBsb2cuZGVidWcoIiAgICBSZXF1ZXN0IHBhcmFtZXRlcnM6Iik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgICAgICAgWyIgKyBrZXkgKyAiXSA9IFsiICsgdmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTmFtZXNwYWNlTWFwIG5vdGlmaWNhdGlvbk1hcCA9IG5ldyBOYW1lc3BhY2VNYXAocmVxdWVzdFBhcmFtZXRlcnMsIE5vdGlmaWVyLlBSRUZJWCk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCIgICAgTm90aWZpY2F0aW9uIHBhcmFtZXRlcnM6Iik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5vdGlmaWNhdGlvbk1hcC5nZXRNYXAoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgICAgIFsiICsga2V5ICsgIl0gPSBbIiArIHZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChub3RpZmljYXRpb25NYXAuZ2V0TWFwKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgICBObyBub3RpZmljYXRpb24gcGFyYW1ldGVycyBmb3VuZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIEluaXRpYWxpemluZyBub3RpZmljYXRpb24iKTsKLQotICAgICAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSBJZGVudGl0eS5nZXRJZGVudGl0eShyZXF1ZXN0LmdldFNlc3Npb24oKSk7Ci0gICAgICAgICAgICBVc2VyIHVzZXIgPSBpZGVudGl0eS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZU1haWwgPSB1c2VyLmdldEVtYWlsKCk7Ci0gICAgICAgICAgICBub3RpZmljYXRpb25NYXAucHV0KE5vdGlmaWVyLlBBUkFNRVRFUl9GUk9NLCBlTWFpbCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgICBTZXR0aW5nIGZyb20gYWRkcmVzcyBbIiArIE5vdGlmaWVyLlBBUkFNRVRFUl9GUk9NICsgIl0gPSBbIiArIGVNYWlsCi0gICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLQotICAgICAgICAgICAgU3RyaW5nIHRvS2V5ID0gTmFtZXNwYWNlTWFwLmdldEZ1bGxOYW1lKE5vdGlmaWVyLlBSRUZJWCwgTm90aWZpZXIuUEFSQU1FVEVSX1RPKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB0b1ZhbHVlcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKHRvS2V5KTsKLQotICAgICAgICAgICAgaWYgKHRvVmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBbbm90aWZpY2F0aW9uLnRvbGlzdF0gcmVxdWVzdCBwYXJhbWV0ZXIhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9WYWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgISIiLmVxdWFscyhidWYudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBBZGRpbmcgbm90aWZpY2F0aW9uIGFkZHJlc3MgWyIgKyB0b1ZhbHVlc1tpXS50cmltKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodG9WYWx1ZXNbaV0udHJpbSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFwLnB1dChOb3RpZmllci5QQVJBTUVURVJfVE8sIGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNldE5vdGlmeWluZyhub3RpZmljYXRpb25NYXApOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGlzaGluZy9QdWJsaXNoaW5nRW52aXJvbm1lbnQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3B1Ymxpc2hpbmcvUHVibGlzaGluZ0Vudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTE0NmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGlzaGluZy9QdWJsaXNoaW5nRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqDQotICovDQotDQotLyogJElkJCAgKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1Ymxpc2hpbmc7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEEgY2xhc3MgdGhhdCBob2xkcyB2YXJpb3VzIHB1Ymxpc2hpbmcgcGFyYW1ldGVycw0KLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ0Vudmlyb25tZW50IGltcGxlbWVudHMgQ29uZmlndXJhYmxlIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoUHVibGlzaGluZ0Vudmlyb25tZW50LmNsYXNzKTsNCi0gICAgLyoqDQotICAgICAqIDxjb2RlPkNPTkZJR1VSQVRJT05fRklMRTwvY29kZT4gVGhlIHBhdGggdG8gdGhlIHB1Ymxpc2hlciBjb25maWd1cmF0aW9uIGZpbGUNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRklMRSA9ICJjb25maWciICsgRmlsZS5zZXBhcmF0b3IgKyAicHVibGlzaGluZyINCi0gICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInB1Ymxpc2hlci54Y29uZiI7DQotICAgIC8qKg0KLSAgICAgKiA8Y29kZT5QVUJMSUNBVElPTl9QUkVGSVg8L2NvZGU+IFRoZSBwYXRoIHRvIHRoZSBwdWJsaWNhdGlvbnMgZnJvbSB0aGUgd2ViYXBwIHJvb3QNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0FUSU9OX1BSRUZJWCA9ICJsZW55YSIgKyBGaWxlLnNlcGFyYXRvciArICJwdWJzIg0KLSAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3I7DQotICAgIC8qKg0KLSAgICAgKiA8Y29kZT5QVUJMSUNBVElPTl9QQVRIPC9jb2RlPiBUaGUgcHVibGljYXRpb24gcGF0aA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDQVRJT05fUEFUSCA9ICJwdWJsaWNhdGlvbi1wYXRoIjsNCi0gICAgLyoqDQotICAgICAqIDxjb2RlPlBBUkFNRVRFUl9BVVRIT1JJTkdfUEFUSDwvY29kZT4gVGhlIGF1dGhvcmluZyBwYXRoDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfQVVUSE9SSU5HX1BBVEggPSAiYXV0aG9yaW5nLXBhdGgiOw0KLSAgICAvKioNCi0gICAgICogPGNvZGU+UEFSQU1FVEVSX1RSRUVfQVVUSE9SSU5HX1BBVEg8L2NvZGU+IFRoZSBwYXRoIHRvIHRoZSBhdXRob3JpbmcgdHJlZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1RSRUVfQVVUSE9SSU5HX1BBVEggPSAidHJlZS1hdXRob3JpbmctcGF0aCI7DQotICAgIC8qKg0KLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfTElWRV9QQVRIPC9jb2RlPiBUaGUgbGl2ZSBwYXRoDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTElWRV9QQVRIID0gImxpdmUtcGF0aCI7DQotICAgIC8qKg0KLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfVFJFRV9MSVZFX1BBVEg8L2NvZGU+IFRoZSBwYXRoIHRvIHRoZSBsaXZlIHRyZWUNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9UUkVFX0xJVkVfUEFUSCA9ICJ0cmVlLWxpdmUtcGF0aCI7DQotICAgIC8qKg0KLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfUkVQTElDQVRJT05fUEFUSDwvY29kZT4gVGhlIHJlcGxpY2F0aW9uIHBhdGgNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9SRVBMSUNBVElPTl9QQVRIID0gInJlcGxpY2F0aW9uLXBhdGgiOw0KLSAgICAvKioNCi0gICAgICogPGNvZGU+UEFSQU1FVEVSX0VYUE9SVF9QQVRIPC9jb2RlPiBUaGUgZXhwb3J0IHBhdGgNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9FWFBPUlRfUEFUSCA9ICJleHBvcnQtcGF0aCI7DQotICAgIC8qKg0KLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfU1VCU1RJVFVURV9SRUdFWFA8L2NvZGU+IFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIGR1cmluZyBleHBvcnQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9TVUJTVElUVVRFX1JFR0VYUCA9ICJzdWJzdGl0dXRlLXJlZ2V4cCI7DQotICAgIC8qKg0KLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfU1VCU1RJVFVURV9SRVBMQUNFTUVOVDwvY29kZT4gVGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciB0aGUgcmVndWxhcg0KLSAgICAgKiBleHByZXNzaW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfU1VCU1RJVFVURV9SRVBMQUNFTUVOVCA9ICJzdWJzdGl0dXRlLXJlcGxhY2VtZW50IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHVibGljYXRpb25QYXRoOw0KLSAgICBwcml2YXRlIFN0cmluZyByZXBsaWNhdGlvbkRpcmVjdG9yeTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yaW5nUGF0aDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGl2ZVBhdGg7DQotICAgIHByaXZhdGUgU3RyaW5nIHRyZWVBdXRob3JpbmdQYXRoOw0KLSAgICBwcml2YXRlIFN0cmluZyB0cmVlTGl2ZVBhdGg7DQotICAgIHByaXZhdGUgU3RyaW5nIGV4cG9ydERpcmVjdG9yeTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3Vic3RpdHV0ZUV4cHJlc3Npb247DQotICAgIHByaXZhdGUgU3RyaW5nIHN1YnN0aXR1dGVSZXBsYWNlbWVudDsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBuZXcgUHVibGlzaGluZ0Vudmlyb25tZW50IG9iamVjdC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoDQotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbklkIFRoZSBwdWJsaWNhdGlvbiBpZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFB1Ymxpc2hpbmdFbnZpcm9ubWVudChTdHJpbmcgY29udGV4dFBhdGgsIFN0cmluZyBwdWJsaWNhdGlvbklkKSB7DQotICAgICAgICB0aGlzKFB1Ymxpc2hpbmdFbnZpcm9ubWVudC5nZXRQdWJsaWNhdGlvblBhdGgoY29udGV4dFBhdGgsIHB1YmxpY2F0aW9uSWQpKTsNCi0gICAgICAgIGxvZy5kZWJ1ZygiQ29udGV4dCBQYXRoIGFuZCBQdWJsaWNhdGlvbiBJZDogIiArIGNvbnRleHRQYXRoICsgIjo6IiArIHB1YmxpY2F0aW9uSWQpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgbmV3IFB1Ymxpc2hpbmdFbnZpcm9ubWVudCBvYmplY3QuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gX3B1YmxpY2F0aW9uUGF0aCBUaGUgcHVibGljYXRpb24gcGF0aA0KLSAgICAgKi8NCi0gICAgcHVibGljIFB1Ymxpc2hpbmdFbnZpcm9ubWVudChTdHJpbmcgX3B1YmxpY2F0aW9uUGF0aCkgew0KLSAgICAgICAgc2V0UHVibGljYXRpb25QYXRoKF9wdWJsaWNhdGlvblBhdGgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNvbmZpZ3VyYXRpb25GaWxlUGF0aCA9IF9wdWJsaWNhdGlvblBhdGggKyBDT05GSUdVUkFUSU9OX0ZJTEU7DQotDQotICAgICAgICBGaWxlIGNvbmZpZ3VyYXRpb25GaWxlID0gbmV3IEZpbGUoY29uZmlndXJhdGlvbkZpbGVQYXRoKTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyKCk7DQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gYnVpbGRlci5idWlsZEZyb21GaWxlKGNvbmZpZ3VyYXRpb25GaWxlKTsNCi0gICAgICAgICAgICBjb25maWd1cmUoY29uZmlndXJhdGlvbik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJEaWQgbm90IGxvYWQgcHVibGlzaGluZyBjb25maWd1cmF0aW9uIGZyb20gcHVibGlzaGVyLnhjb25mIChObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAiDQotICAgICAgICAgICAgICAgICAgICArIGNvbmZpZ3VyYXRpb25GaWxlDQotICAgICAgICAgICAgICAgICAgICArICIpLiAiDQotICAgICAgICAgICAgICAgICAgICArICJUaGF0IG1lYW5zIHlvdSBjYW4ndCBhY2Nlc3MgYWxsIFB1Ymxpc2hpbmdFbnZpcm9ubWVudCBwYXJhbWV0ZXJzIGFuZCB5b3Ugc2hvdWxkIG9ubHkgIg0KLSAgICAgICAgICAgICAgICAgICAgKyAidXNlIHRoZSBBbnRUYXNrLiBCdXQgZG9uJ3QgcGFuaWMsIHRoaXMgZmlsZSBoYXMgYmVlbiBERVBSRUNBVEVELiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbml0aWFsaXplcyB0aGUgY2xhc3MgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gZmlsZQ0KLSAgICAgKiANCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikNCi0gICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBhdXRob3JpbmcNCi0gICAgICAgIHNldEF1dGhvcmluZ1BhdGgoY29uZmlndXJhdGlvbi5nZXRDaGlsZCgiYXV0aG9yaW5nIikNCi0gICAgICAgICAgICAgICAgLmdldENoaWxkKCJkb2N1bWVudHMiKQ0KLSAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKCJocmVmIikpOw0KLSAgICAgICAgc2V0VHJlZUF1dGhvcmluZ1BhdGgoY29uZmlndXJhdGlvbi5nZXRDaGlsZCgiYXV0aG9yaW5nIikNCi0gICAgICAgICAgICAgICAgLmdldENoaWxkKCJ0cmVlIikNCi0gICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgiaHJlZiIpKTsNCi0NCi0gICAgICAgIC8vIHJlcGxpY2F0aW9uDQotICAgICAgICBzZXRSZXBsaWNhdGlvbkRpcmVjdG9yeShjb25maWd1cmF0aW9uLmdldENoaWxkKCJyZXBsaWNhdGlvbiIpDQotICAgICAgICAgICAgICAgIC5nZXRDaGlsZCgicGVuZGluZy1kb2N1bWVudHMiKQ0KLSAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKCJocmVmIikpOw0KLQ0KLSAgICAgICAgLy8gbGl2ZQ0KLSAgICAgICAgc2V0TGl2ZVBhdGgoY29uZmlndXJhdGlvbi5nZXRDaGlsZCgibGl2ZSIpLmdldENoaWxkKCJkb2N1bWVudHMiKS5nZXRBdHRyaWJ1dGUoImhyZWYiKSk7DQotICAgICAgICBzZXRUcmVlTGl2ZVBhdGgoY29uZmlndXJhdGlvbi5nZXRDaGlsZCgibGl2ZSIpLmdldENoaWxkKCJ0cmVlIikuZ2V0QXR0cmlidXRlKCJocmVmIikpOw0KLQ0KLSAgICAgICAgLy8gZXhwb3J0DQotICAgICAgICBzZXRFeHBvcnREaXJlY3RvcnkoY29uZmlndXJhdGlvbi5nZXRDaGlsZCgiZXhwb3J0IikNCi0gICAgICAgICAgICAgICAgLmdldENoaWxkKCJkZXN0aW5hdGlvbiIpDQotICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoImhyZWYiKSk7DQotICAgICAgICBzZXRTdWJzdGl0dXRlRXhwcmVzc2lvbihjb25maWd1cmF0aW9uLmdldENoaWxkKCJleHBvcnQiKQ0KLSAgICAgICAgICAgICAgICAuZ2V0Q2hpbGQoInN1YnN0aXR1dGlvbiIpDQotICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoInJlZ2V4cCIpKTsNCi0gICAgICAgIHNldFN1YnN0aXR1dGVSZXBsYWNlbWVudEV4cHJlc3Npb24oY29uZmlndXJhdGlvbi5nZXRDaGlsZCgiZXhwb3J0IikNCi0gICAgICAgICAgICAgICAgLmdldENoaWxkKCJzdWJzdGl0dXRpb24iKQ0KLSAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKCJyZXBsYWNlbWVudCIpKTsNCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiQ09ORklHVVJBVElPTjpcbmF1dGhvcmluZyBwYXRoPSIgKyBnZXRBdXRob3JpbmdQYXRoKCkgKyAiXG5saXZlIHBhdGg9Ig0KLSAgICAgICAgICAgICAgICArIGdldExpdmVQYXRoKCkpOw0KLSAgICAgICAgbG9nLmRlYnVnKCJDT05GSUdVUkFUSU9OOlxudHJlZSBhdXRob3JpbmcgcGF0aD0iICsgZ2V0VHJlZUF1dGhvcmluZ1BhdGgoKQ0KLSAgICAgICAgICAgICAgICArICJcbnRyZWUgbGl2ZSBwYXRoPSIgKyBnZXRUcmVlTGl2ZVBhdGgoKSk7DQotDQotICAgICAgICBsb2cuZGVidWcoIkNPTkZJR1VSQVRJT046XG5EaXJlY3RvcnkgUHJlZml4OiBocmVmPSIgKyBnZXRFeHBvcnREaXJlY3RvcnkoKSk7DQotICAgICAgICBsb2cuZGVidWcoIkNPTkZJR1VSQVRJT046XG5QcmVmaXggU3Vic3RpdHV0ZTogaHJlZj0iICsgZ2V0U3Vic3RpdHV0ZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICBsb2cuZGVidWcoIkNPTkZJR1VSQVRJT046XG5SZXBsaWNhdGlvbiBEaXJlY3Rvcnk6IGhyZWY9IiArIGdldFJlcGxpY2F0aW9uRGlyZWN0b3J5KCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNhdGlvbiBwYXRoLg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBUaGUgcHVibGljYXRpb24gcGF0aA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNhdGlvblBhdGgoKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5wdWJsaWNhdGlvblBhdGg7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIHB1YmxpY2F0aW9uIGRpcmVjdG9yeS4NCi0gICAgICogQHJldHVybiBUaGUgcHVibGljYXRpb24gZGlyZWN0b3J5DQotICAgICAqLw0KLSAgICBwdWJsaWMgRmlsZSBnZXRQdWJsaWNhdGlvbkRpcmVjdG9yeSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRmlsZShnZXRQdWJsaWNhdGlvblBhdGgoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UHVibGljYXRpb25QYXRoKFN0cmluZyBwYXRoKSB7DQotICAgICAgICB0aGlzLnB1YmxpY2F0aW9uUGF0aCA9IHBhdGg7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGF1dGhvcmluZyBwYXRoDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIFRoZSBhdXRob3JpbmcgcGF0aA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdXRob3JpbmdQYXRoKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYXV0aG9yaW5nUGF0aDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBdXRob3JpbmdQYXRoKFN0cmluZyBwYXRoKSB7DQotICAgICAgICB0aGlzLmF1dGhvcmluZ1BhdGggPSBwYXRoOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBsaXZlIHBhdGgNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gVGhlIGxpdmUgcGF0aA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRMaXZlUGF0aCgpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmxpdmVQYXRoOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHNldExpdmVQYXRoKFN0cmluZyBwYXRoKSB7DQotICAgICAgICB0aGlzLmxpdmVQYXRoID0gcGF0aDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgYXV0aG9yaW5nIHRyZWUNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gVGhlIHBhdGggdG8gdGhlIGF1dGhvcmluZyB0cmVlDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVBdXRob3JpbmdQYXRoKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudHJlZUF1dGhvcmluZ1BhdGg7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VHJlZUF1dGhvcmluZ1BhdGgoU3RyaW5nIHBhdGgpIHsNCi0gICAgICAgIHRoaXMudHJlZUF1dGhvcmluZ1BhdGggPSBwYXRoOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBsaXZlIHRyZWUNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gVGhlIHBhdGggdG8gdGhlIGxpdmUgdHJlZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRUcmVlTGl2ZVBhdGgoKSB7DQotICAgICAgICByZXR1cm4gdGhpcy50cmVlTGl2ZVBhdGg7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VHJlZUxpdmVQYXRoKFN0cmluZyBwYXRoKSB7DQotICAgICAgICB0aGlzLnRyZWVMaXZlUGF0aCA9IHBhdGg7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHJlcGxpY2F0aW9uIGRpcmVjdG9yeQ0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBUaGUgcGF0aCB0byB0aGUgcmVwbGljYXRpb24gZGlyZWN0b3J5DQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxpY2F0aW9uRGlyZWN0b3J5KCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVwbGljYXRpb25EaXJlY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UmVwbGljYXRpb25EaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgew0KLSAgICAgICAgdGhpcy5yZXBsaWNhdGlvbkRpcmVjdG9yeSA9IGRpcmVjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgZXhwb3J0IGRpcmVjdG9yeQ0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBUaGUgcGF0aCB0byB0aGUgZXhwb3J0IGRpcmVjdG9yeQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHBvcnREaXJlY3RvcnkoKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHBvcnREaXJlY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RXhwb3J0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsNCi0gICAgICAgIHRoaXMuZXhwb3J0RGlyZWN0b3J5ID0gZGlyZWN0b3J5Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gcmVndWxhciBleHByZXNzaW9uIHVzZWQgaW4gdGhlIGV4cG9ydA0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBUaGUgc3Vic3RpdHV0aW9uIHJlZ3VsYXIgZXhwcmVzc2lvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWJzdGl0dXRlRXhwcmVzc2lvbigpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnN1YnN0aXR1dGVFeHByZXNzaW9uOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFN1YnN0aXR1dGVFeHByZXNzaW9uKFN0cmluZyBzdWJzdGl0dXRlKSB7DQotICAgICAgICB0aGlzLnN1YnN0aXR1dGVFeHByZXNzaW9uID0gc3Vic3RpdHV0ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0IHJlcGxhY2VtZW50IHN0cmluZywgd2hpY2ggd2FzIHJlYWQgZnJvbSBwdWJsaXNoZXIueGNvbmYNCi0gICAgICogQHBhcmFtIHJlcGxhY2VtZW50IFRoZSByZXBsYWNlbWVudCBzdHJpbmcNCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFN1YnN0aXR1dGVSZXBsYWNlbWVudEV4cHJlc3Npb24oU3RyaW5nIHJlcGxhY2VtZW50KSB7DQotICAgICAgICB0aGlzLnN1YnN0aXR1dGVSZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlcGxhY2VtZW50IHN0cmluZywgd2hpY2ggd2FzIHJlYWQgZnJvbSBwdWJsaXNoZXIueGNvbmYNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gVGhlIHJlcGxhY2VtZW50IHN0cmluZw0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWJzdGl0dXRlUmVwbGFjZW1lbnQoKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRlUmVwbGFjZW1lbnQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHB1YmxpY2F0aW9uIGdpdmVuIHRoZSBzZXJ2bGV0IGNvbnRleHQgcGF0aCBhbmQgdGhlIHB1YmxpY2F0aW9uIGlkDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gc2VydmxldENvbnRleHRQYXRoIFRoZSBzZXJ2bGV0IGNvbnRleHQgcGF0aA0KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb25JZCBUaGUgcHVibGljYXRpb24gaWQNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gVGhlIHBhdGggdG8gdGhlIHB1YmxpY2F0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQdWJsaWNhdGlvblBhdGgoU3RyaW5nIHNlcnZsZXRDb250ZXh0UGF0aCwgU3RyaW5nIHB1YmxpY2F0aW9uSWQpIHsNCi0gICAgICAgIGlmICghc2VydmxldENvbnRleHRQYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgew0KLSAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0UGF0aCArPSBGaWxlLnNlcGFyYXRvcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzZXJ2bGV0Q29udGV4dFBhdGggKyBQVUJMSUNBVElPTl9QUkVGSVggKyBwdWJsaWNhdGlvbklkICsgRmlsZS5zZXBhcmF0b3I7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL0Fic3RyYWN0U2NoZWR1bGVyTGlzdGVuZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci9BYnN0cmFjdFNjaGVkdWxlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMTljYTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL0Fic3RyYWN0U2NoZWR1bGVyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zY2hlZHVsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5xdWFydHouVHJpZ2dlcjsKLQotLyoqCi0gKiBUaGUgQWJzdHJhY3QgU2NoZWR1bGVyIExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNjaGVkdWxlckxpc3RlbmVyIGltcGxlbWVudHMgU2NoZWR1bGVyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RTY2hlZHVsZXJMaXN0ZW5lci5jbGFzcyk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5xdWFydHouU2NoZWR1bGVyTGlzdGVuZXIjam9iU2NoZWR1bGVkKG9yZy5xdWFydHouVHJpZ2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBqb2JTY2hlZHVsZWQoVHJpZ2dlciB0cmlnZ2VyKSB7Ci0JCWxvZy5kZWJ1ZygiSm9iIHNjaGVkdWxlZCIpOwotCQlsb2cuZGVidWcoIiAgICBUcmlnZ2VyOiBbIiArIHRyaWdnZXIgKyAiXSIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnF1YXJ0ei5TY2hlZHVsZXJMaXN0ZW5lciNqb2JVbnNjaGVkdWxlZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGpvYlVuc2NoZWR1bGVkKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3JvdXApIHsKLQkJbG9nLmRlYnVnKCJKb2IgdW5zY2hlZHVsZWQuIik7Ci0JCWxvZy5kZWJ1ZygiICAgIFRyaWdnZXIgbmFtZTogIFsiICsgbmFtZSArICJdIik7Ci0JCWxvZy5kZWJ1ZygiICAgIFRyaWdnZXIgZ3JvdXA6IFsiICsgZ3JvdXAgKyAiXSIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnF1YXJ0ei5TY2hlZHVsZXJMaXN0ZW5lciN0cmlnZ2VyRmluYWxpemVkKG9yZy5xdWFydHouVHJpZ2dlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmlnZ2VyRmluYWxpemVkKFRyaWdnZXIgdHJpZ2dlcikgewotCQlsb2cuZGVidWcoIlRyaWdnZXIgZmluYWxpemVkLiIpOwotCQlsb2cuZGVidWcoIiAgICBUcmlnZ2VyOiAgWyIgKyB0cmlnZ2VyICsgIl0iKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5xdWFydHouU2NoZWR1bGVyTGlzdGVuZXIjdHJpZ2dlcnNQYXVzZWQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmlnZ2Vyc1BhdXNlZChTdHJpbmcgbmFtZSwgU3RyaW5nIGdyb3VwKSB7Ci0JCWxvZy5kZWJ1ZygiVHJpZ2dlcnMgcGF1c2VkLiIpOwotCQlsb2cuZGVidWcoIiAgICBUcmlnZ2VyIG5hbWU6ICBbIiArIG5hbWUgKyAiXSIpOwotCQlsb2cuZGVidWcoIiAgICBUcmlnZ2VyIGdyb3VwOiBbIiArIGdyb3VwICsgIl0iKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5xdWFydHouU2NoZWR1bGVyTGlzdGVuZXIjdHJpZ2dlcnNSZXN1bWVkKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdHJpZ2dlcnNSZXN1bWVkKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3JvdXApIHsKLQkJbG9nLmRlYnVnKCJUcmlnZ2VycyByZXN1bWVkLiIpOwotCQlsb2cuZGVidWcoIiAgICBUcmlnZ2VyIG5hbWU6ICBbIiArIG5hbWUgKyAiXSIpOwotCQlsb2cuZGVidWcoIiAgICBUcmlnZ2VyIGdyb3VwOiBbIiArIGdyb3VwICsgIl0iKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5xdWFydHouU2NoZWR1bGVyTGlzdGVuZXIjam9ic1BhdXNlZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGpvYnNQYXVzZWQoU3RyaW5nIG5hbWUsIFN0cmluZyBncm91cCkgewotCQlsb2cuZGVidWcoIkpvYnMgcGF1c2VkLiIpOwotCQlsb2cuZGVidWcoIiAgICBKb2IgbmFtZTogIFsiICsgbmFtZSArICJdIik7Ci0JCWxvZy5kZWJ1ZygiICAgIEpvYiBncm91cDogWyIgKyBncm91cCArICJdIik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcucXVhcnR6LlNjaGVkdWxlckxpc3RlbmVyI2pvYnNSZXN1bWVkKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgam9ic1Jlc3VtZWQoU3RyaW5nIG5hbWUsIFN0cmluZyBncm91cCkgewotCQlsb2cuZGVidWcoIkpvYnMgcmVzdW1lZC4iKTsKLQkJbG9nLmRlYnVnKCIgICAgSm9iIG5hbWU6ICBbIiArIG5hbWUgKyAiXSIpOwotCQlsb2cuZGVidWcoIiAgICBKb2IgZ3JvdXA6IFsiICsgZ3JvdXAgKyAiXSIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnF1YXJ0ei5TY2hlZHVsZXJMaXN0ZW5lciNzY2hlZHVsZXJFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLnF1YXJ0ei5TY2hlZHVsZXJFeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2NoZWR1bGVyRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFNjaGVkdWxlckV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJbG9nLmRlYnVnKCJTY2hlZHVsZXIgZXhjZXB0aW9uIG9jY3VyZWQuIik7Ci0JCWxvZy5kZWJ1ZygiICAgIE1lc3NhZ2U6ICBbIiArIG1lc3NhZ2UgKyAiXSIpOwotCQlsb2cuZGVidWcoZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5xdWFydHouU2NoZWR1bGVyTGlzdGVuZXIjc2NoZWR1bGVyU2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNjaGVkdWxlclNodXRkb3duKCkgewotCQlsb2cuZGVidWcoIlNjaGVkdWxlciBzaHV0IGRvd24uIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvSm9iV3JhcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL0pvYldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3OTczNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvSm9iV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2NoZWR1bGVyOwotCi1pbXBvcnQgb3JnLnF1YXJ0ei5Kb2JEZXRhaWw7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5UcmlnZ2VyOwotCi0vKioKLSAqIFdyYXBwZXIgZm9yIGpvYiBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEpvYldyYXBwZXIgewotICAgIAotICAgIHByaXZhdGUgSm9iRGV0YWlsIGpvYkRldGFpbDsKLSAgICBwcml2YXRlIFRyaWdnZXIgdHJpZ2dlcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGpvYiBkZXRhaWwuCi0gICAgICogQHBhcmFtIF90cmlnZ2VyIFRoZSB0cmlnZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBKb2JXcmFwcGVyKEpvYkRldGFpbCBkZXRhaWwsIFRyaWdnZXIgX3RyaWdnZXIpIHsKLSAgICAgICAgdGhpcy5qb2JEZXRhaWwgPSBkZXRhaWw7Ci0gICAgICAgIHRoaXMudHJpZ2dlciA9IF90cmlnZ2VyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBqb2IgZGV0YWlsLgotICAgICAqIEByZXR1cm4gQSBqb2IgZGV0YWlsIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSm9iRGV0YWlsIGdldEpvYkRldGFpbCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuam9iRGV0YWlsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2bGV0IGpvYi4KLSAgICAgKiBAcmV0dXJuIEEgc2VydmxldCBqb2IuCi0gICAgICovCi0gICAgcHVibGljIFNlcnZsZXRKb2IgZ2V0Sm9iKCkgewotICAgICAgICBTZXJ2bGV0Sm9iIGpvYiA9IFNlcnZsZXRKb2JGYWN0b3J5LmNyZWF0ZUpvYih0aGlzLmpvYkRldGFpbC5nZXRKb2JDbGFzcygpKTsKLSAgICAgICAgcmV0dXJuIGpvYjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHJpZ2dlci4KLSAgICAgKiBAcmV0dXJuIEEgdHJpZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJpZ2dlciBnZXRUcmlnZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy50cmlnZ2VyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL0xvYWRRdWFydHpTZXJ2bGV0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvTG9hZFF1YXJ0elNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5ZGJmZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvTG9hZFF1YXJ0elNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zY2hlZHVsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zY2hlZHVsZXIueG1sLlRyaWdnZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBIHNpbXBsZSBzZXJ2bGV0IHRoYXQgc3RhcnRzIGFuIGluc3RhbmNlIG9mIGEgUXVhcnR6IHNjaGVkdWxlci4KLSAqLwotcHVibGljIGNsYXNzIExvYWRRdWFydHpTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotICAgIC8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSXNEaXJlY3RvcnlGaWxlRmlsdGVyIGltcGxlbWVudHMgRmlsZUZpbHRlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAc2VlIGphdmEuaW8uRmlsZUZpbHRlciNhY2NlcHQoamF2YS5pby5GaWxlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGUuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKExvYWRRdWFydHpTZXJ2bGV0LmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBTY2hlZHVsZXJXcmFwcGVyIHNjaGVkdWxlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dDsKLSAgICBwcml2YXRlIFN0cmluZyBzY2hlZHVsZXJDb25maWd1cmF0aW9uczsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPlBSRUZJWDwvY29kZT4gU2NoZWR1bGVyIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAic2NoZWR1bGVyIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfQUNUSU9OPC9jb2RlPiBUaGUgYWN0aW9uIHBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9BQ1RJT04gPSAiYWN0aW9uIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfUFVCTElDQVRJT05fSUQ8L2NvZGU+IFRoZSBwdWJsaWNhdGlvbiBpZCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfUFVCTElDQVRJT05fSUQgPSAicHVibGljYXRpb24taWQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlBBUkFNRVRFUl9ET0NVTUVOVF9VUkw8L2NvZGU+IFRoZSBkb2N1bWVudCBVUkwgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX0RPQ1VNRU5UX1VSTCA9ICJkb2N1bWVudC11cmwiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkNPTkZJR1VSQVRJT05fRUxFTUVOVDwvY29kZT4gVGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRUxFTUVOVCA9ICJzY2hlZHVsZXItY29uZmlndXJhdGlvbnMiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlNFUlZMRVRfVVJMPC9jb2RlPiBUaGUgc2NoZWR1bGVyIHNlcnZsZXQgVVJMCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9VUkwgPSAiL3NlcnZsZXQvUXVhcnR6U2NoZWR1bGVyU2VydmxldCI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlZHVsZXIgd3JhcHBlci4KLSAgICAgKiBAcmV0dXJuIEEgc2NoZWR1bGVyIHdyYXBwZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTY2hlZHVsZXJXcmFwcGVyIGdldFNjaGVkdWxlcigpIHsKLSAgICAgICAgcmV0dXJuIHNjaGVkdWxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIHNlcnZsZXQgY29udGV4dCBuYW1lcyB0byBzZXJ2bGV0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgc2VydmxldHMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIHNlcnZsZXQuCi0gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgc2VydmxldCBjb25maWd1cmF0aW9uLgotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuaW5pdChjb25maWcpOwotCi0gICAgICAgIHRoaXMuc2NoZWR1bGVyQ29uZmlndXJhdGlvbnMgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihDT05GSUdVUkFUSU9OX0VMRU1FTlQpOwotICAgICAgICB0aGlzLnNlcnZsZXRDb250ZXh0ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCIuaW5pdCgpOiBTZXJ2bGV0IENvbnRleHQgUGF0aDogIgotICAgICAgICAgICAgICAgICsgZ2V0U2VydmxldENvbnRleHREaXJlY3RvcnkoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RvcmluZyBzZXJ2bGV0Iik7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBnZXRTZXJ2bGV0Q29udGV4dERpcmVjdG9yeSgpLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBDb250ZXh0IHBhdGg6IFsiICsgY29udGV4dFBhdGggKyAiXSIpOwotICAgICAgICAgICAgc2VydmxldHMucHV0KGNvbnRleHRQYXRoLCB0aGlzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuZGVidWcoIi5pbml0KCk6IFNjaGVkdWxlciBDb25maWd1cmF0aW9uczogIiArIHRoaXMuc2NoZWR1bGVyQ29uZmlndXJhdGlvbnMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiV29ya2luZz8uLi4iKTsKLSAgICAgICAgICAgIHByb2Nlc3MoKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPSyIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJJbml0IG9mIExvYWRRdWFydHpTZXJ2bGV0IGZhaWxlZCIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzLgotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIFNjaGVkdWxlckV4Y2VwdGlvbiB7Ci0gICAgICAgIHNjaGVkdWxlciA9IG5ldyBTY2hlZHVsZXJXcmFwcGVyKGdldFNlcnZsZXRDb250ZXh0RGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXJDb25maWd1cmF0aW9ucyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNodXRkb3duSG9vaygpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3RvcmVKb2JzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2h1dHMgZG93biB0aGUgc2NoZWR1bGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIGRlc3Ryb3lTY2hlZHVsZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaHV0cyBkb3duIHRoZSBzY2hlZHVsZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlc3Ryb3lTY2hlZHVsZXIoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiZGVzdHJveTogIik7Ci0gICAgICAgIGdldFNjaGVkdWxlcigpLnNodXRkb3duKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgc2V0cyBhIFNodXRkb3duSG9vayB0byB0aGUgc3lzdGVtIFRoaXMgdHJhcHMgdGhlIENUUkwrQyBvciBraWxsIHNpZ25hbCBhbmQKLSAgICAgKiBzaHV0ZG93cyBDb3JyZWN0bHkgdGhlIHN5c3RlbS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bkhvb2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLSBTaHV0ZG93bkhvb2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTG9hZFF1YXJ0elNlcnZsZXQuZGVzdHJveVNjaGVkdWxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgU2h1dGRvd25Ib29rIC0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIEdFVCByZXF1ZXN0LgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3VyZWQuCi0gICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZVJlcXVlc3QocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYSBQT1NUIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIHJlcSBUaGUgcmVxdXVzdC4KLSAgICAgKiBAcGFyYW0gcmVzcCBUaGUgcmVzcG9uc2UuCi0gICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJlZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZG9HZXQocmVxLCByZXNwKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRlkgPSAibW9kaWZ5IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEUgPSAiZGVsZXRlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9ERUxFVEVEID0gImRvY3VtZW50LWRlbGV0ZWQiOwotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIHNlcnZsZXQgcmVxdWVzdC4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLSBJbmNvbWluZyByZXF1ZXN0IGF0IFVSSTogIik7Ci0gICAgICAgIGxvZwotICAgICAgICAgICAgICAgIC5kZWJ1ZyhyZXF1ZXN0LmdldFNlcnZlck5hbWUoKSArICI6IiArIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpCi0gICAgICAgICAgICAgICAgICAgICAgICArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKLSAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIGxvZy5kZWJ1ZygiUmVxdWVzdCBwYXJhbWV0ZXJzOiIpOwotCi0gICAgICAgIE5hbWVzcGFjZU1hcCBzY2hlZHVsZXJQYXJhbWV0ZXJzID0gZ2V0U2NoZWR1bGVyUGFyYW1ldGVycyhyZXF1ZXN0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uSWQgPSAoU3RyaW5nKSBzY2hlZHVsZXJQYXJhbWV0ZXJzLmdldChQQVJBTUVURVJfUFVCTElDQVRJT05fSUQpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJTY2hlZHVsZXIgaW52b2tlZC4iKTsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKCJTY2hlZHVsZXIgUGFyYW1ldGVyczoiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIHNjaGVkdWxlci5wdWJsaWNhdGlvbi1pZDogWyIgKyBwdWJsaWNhdGlvbklkICsgIl0iKTsKLQotICAgICAgICAgICAgbG9nU2Vzc2lvbkF0dHJpYnV0ZXMocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSByZXF1ZXN0IHdhbnRzIHRvIHN1Ym1pdCwgbW9kaWZ5IG9yIGRlbGV0ZSBhIGpvYi4KLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSAoU3RyaW5nKSBzY2hlZHVsZXJQYXJhbWV0ZXJzLmdldChQQVJBTUVURVJfQUNUSU9OKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIHNjaGVkdWxlci5hY3Rpb246ICAgICAgICAgWyIgKyBhY3Rpb24gKyAiXSIpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFERCkpIHsKLSAgICAgICAgICAgICAgICBEYXRlIHN0YXJ0VGltZSA9IFRyaWdnZXJIZWxwZXIuZ2V0RGF0ZShzY2hlZHVsZXJQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgICAgICBnZXRTY2hlZHVsZXIoKS5hZGRKb2IocHVibGljYXRpb25JZCwgc3RhcnRUaW1lLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhNT0RJRlkpKSB7Ci0gICAgICAgICAgICAgICAgRGF0ZSBzdGFydFRpbWUgPSBUcmlnZ2VySGVscGVyLmdldERhdGUoc2NoZWR1bGVyUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGpvYklkID0gZ2V0Sm9iSWQoc2NoZWR1bGVyUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgZ2V0U2NoZWR1bGVyKCkubW9kaWZ5Sm9iKGpvYklkLCBwdWJsaWNhdGlvbklkLCBzdGFydFRpbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKERFTEVURSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgam9iSWQgPSBnZXRKb2JJZChzY2hlZHVsZXJQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgICAgICBnZXRTY2hlZHVsZXIoKS5kZWxldGVKb2Ioam9iSWQsIHB1YmxpY2F0aW9uSWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKERPQ1VNRU5UX0RFTEVURUQpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRvY3VtZW50VXJsID0gKFN0cmluZykgc2NoZWR1bGVyUGFyYW1ldGVycy5nZXQoUEFSQU1FVEVSX0RPQ1VNRU5UX1VSTCk7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IG1hcCA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudElkZW50aXR5TWFwKG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50IGRvY3VtZW50ID0gbWFwLmdldEZyb21VUkwoZG9jdW1lbnRVcmwpOwotICAgICAgICAgICAgICAgIGRlbGV0ZURvY3VtZW50Sm9icyhkb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZXF1ZXN0IGJ5IHNpbXBseSByZXR1cm5pbmcgYWxsCi0gICAgICAgICAgICAvLyBzY2hlZHVsZWQgam9icyAoZm9yIHRoZSBnaXZlbiBwdWJsaWNhdGlvbiBJRCkuCi0gICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotCi0gICAgICAgICAgICBEb2N1bWVudCBzbmFwc2hvdCA9IGdldFNjaGVkdWxlcigpLmdldFNuYXBzaG90KCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50SGVscGVyLndyaXRlRG9jdW1lbnQoc25hcHNob3QsIHdyaXRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50QnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYW4ndCBjcmVhdGUgam9iIHNuYXBzaG90OiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSArICIgKHZpZXcgbG9nIGZvciBkZXRhaWxzKSIpOwotICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYW4ndCBjcmVhdGUgam9iIHNuYXBzaG90OiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSArICIgKHZpZXcgbG9nIGZvciBkZXRhaWxzKSIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNhbid0IGNyZWF0ZSBqb2Igc25hcHNob3Q6ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpICsgIiAodmlldyBsb2cgZm9yIGRldGFpbHMpIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVkdWxlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNhbid0IGNyZWF0ZSBqb2Igc25hcHNob3Q6ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpICsgIiAodmlldyBsb2cgZm9yIGRldGFpbHMpIik7Ci0gICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2FuJ3QgY3JlYXRlIGpvYiBzbmFwc2hvdDogIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkgKyAiICh2aWV3IGxvZyBmb3IgZGV0YWlscykiKTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYW4ndCBjcmVhdGUgam9iIHNuYXBzaG90OiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSArICIgKHZpZXcgbG9nIGZvciBkZXRhaWxzKSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdHMgdGhlIHNjaGVkdWxlciBwYXJhbWV0ZXJzIGZyb20gYSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4gQSBuYW1lc3BhY2UgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTmFtZXNwYWNlTWFwIGdldFNjaGVkdWxlclBhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgTWFwIHBhcmFtZXRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIExpc3Qga2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGtleXMuYWRkKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChrZXlzKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0ga2V5cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKGtleSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgICBbIiArIGtleSArICJdID0gWyIgKyB2YWx1ZXNbMF0gKyAiXSIpOwotICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlck1hcC5wdXQoa2V5LCB2YWx1ZXNbMF0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJNYXAucHV0KGtleSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE5hbWVzcGFjZU1hcCBzY2hlZHVsZXJQYXJhbWV0ZXJzID0gbmV3IE5hbWVzcGFjZU1hcChwYXJhbWV0ZXJNYXAsIFBSRUZJWCk7Ci0gICAgICAgIHJldHVybiBzY2hlZHVsZXJQYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVEb2N1bWVudEpvYnMob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiwgU2NoZWR1bGVyRXhjZXB0aW9uLCBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiUmVxdWVzdGVkIHRvIGRlbGV0ZSBqb2JzIGZvciBkb2N1bWVudCBVUkwgWyIgKyBkb2N1bWVudC5nZXRDYW5vbmljYWxXZWJhcHBVUkwoKQotICAgICAgICAgICAgICAgICsgIl0iKTsKLSAgICAgICAgZ2V0U2NoZWR1bGVyKCkuZGVsZXRlSm9icyhkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdHMgdGhlIGpvYiBJRCBmcm9tIHRoZSBzY2hlZHVsZXIgcGFyYW1ldGVycy4KLSAgICAgKiBAcGFyYW0gc2NoZWR1bGVyUGFyYW1ldGVycyBBIG5hbWVzcGFjZSBtYXAuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEpvYklkKE5hbWVzcGFjZU1hcCBzY2hlZHVsZXJQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gTmFtZXNwYWNlTWFwLmdldEZ1bGxOYW1lKFNjaGVkdWxlcldyYXBwZXIuSk9CX1BSRUZJWCwKLSAgICAgICAgICAgICAgICBTY2hlZHVsZXJXcmFwcGVyLkpPQl9JRCk7Ci0gICAgICAgIFN0cmluZyBqb2JJZCA9IChTdHJpbmcpIHNjaGVkdWxlclBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlck5hbWUpOwotICAgICAgICBsb2cuZGVidWcoIiAgICBzY2hlZHVsZXIuam9iLmlkOiAgICAgICAgIFsiICsgam9iSWQgKyAiXSIpOwotICAgICAgICByZXR1cm4gam9iSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyB0aGUgc2Vzc2lvbiBhdHRyaWJ1dGVzIG9mIGEgcmVxdWVzdC4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dTZXNzaW9uQXR0cmlidXRlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBsb2cuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gQXR0cmlidXRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGVOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcobmFtZSArICIgPSAiICsgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKG5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBTZXNzaW9uIEF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2bGV0IGNvbnRleHQgcGF0aC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFNlcnZsZXRDb250ZXh0RGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbmV3IEZpbGUodGhpcy5zZXJ2bGV0Q29udGV4dC5nZXRSZWFsUGF0aCgiLyIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlcyB0aGUgam9icy4KLSAgICAgKiBAdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVKb2JzKCkgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRmlsZSBwdWJsaWNhdGlvbnNEaXJlY3RvcnkgPSBuZXcgRmlsZShnZXRTZXJ2bGV0Q29udGV4dERpcmVjdG9yeSgpLAotICAgICAgICAgICAgICAgIFB1Ymxpc2hpbmdFbnZpcm9ubWVudC5QVUJMSUNBVElPTl9QUkVGSVgpOwotCi0gICAgICAgIEZpbGVbXSBwdWJsaWNhdGlvbkRpcmVjdG9yaWVzID0gcHVibGljYXRpb25zRGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgLmxpc3RGaWxlcyhuZXcgSXNEaXJlY3RvcnlGaWxlRmlsdGVyKCkpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgbG9nLmRlYnVnKCIgIFJlc3RvcmluZyBqb2JzLiIpOwotICAgICAgICBsb2cuZGVidWcoIiAgICBzZXJ2bGV0IGNvbnRleHQ6IFsiICsgZ2V0U2VydmxldENvbnRleHREaXJlY3RvcnkoKSArICJdIik7Ci0gICAgICAgIGxvZy5kZWJ1ZygiICAgIHB1YmxpY2F0aW9ucyBkaXJlY3Rvcnk6IFsiICsgcHVibGljYXRpb25zRGlyZWN0b3J5ICsgIl0iKTsKLSAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVibGljYXRpb25EaXJlY3Rvcmllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBwdWJsaWNhdGlvbkRpcmVjdG9yaWVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uSWQgPSBkaXJlY3RvcnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uTWFuYWdlckltcGwgZmFjdG9yeSA9IFB1YmxpY2F0aW9uTWFuYWdlckltcGwuZ2V0SW5zdGFuY2UobmV3IENvbnNvbGVMb2dnZXIoKSk7Ci0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHVibGljYXRpb24gPSBmYWN0b3J5LmdldFB1YmxpY2F0aW9uKHB1YmxpY2F0aW9uSWQsIGdldFNlcnZsZXRDb250ZXh0RGlyZWN0b3J5KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUHVibGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHVibGljYXRpb24uZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRTY2hlZHVsZXIoKS5yZXN0b3JlSm9icyhwdWJsaWNhdGlvbklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2bGV0IGZvciBhIGNlcnRhaW4gY2Fub25pY2FsIHNlcnZsZXQgY29udGV4dCBwYXRoLgotICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY2Fub25pY2FsIHNlcnZsZXQgY29udGV4dCBwYXRoLgotICAgICAqIEByZXR1cm4gQSBMb2FkUXVhcnR6U2VydmxldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExvYWRRdWFydHpTZXJ2bGV0IGdldFNlcnZsZXQoU3RyaW5nIGNvbnRleHRQYXRoKSB7Ci0gICAgICAgIHJldHVybiAoTG9hZFF1YXJ0elNlcnZsZXQpIHNlcnZsZXRzLmdldChjb250ZXh0UGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSByZXF1ZXN0IFVSSSBuZWVkZWQgdG8gZGVsZXRlIHRoZSBqb2JzIGZvciBhIGNlcnRhaW4gZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgb2YgdGhlIHNlcnZsZXQKLSAgICAgKiBAcGFyYW0gc2VydmxldENvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIHNlcnZsZXQKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVsZXRlRG9jdW1lbnRSZXF1ZXN0VVJJKFN0cmluZyBwb3J0LCBTdHJpbmcgc2VydmxldENvbnRleHRQYXRoLAotICAgICAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQotICAgICAgICBOYW1lc3BhY2VNYXAgcmVxdWVzdFBhcmFtZXRlcnMgPSBuZXcgTmFtZXNwYWNlTWFwKFBSRUZJWCk7Ci0gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnB1dChQQVJBTUVURVJfQUNUSU9OLCBET0NVTUVOVF9ERUxFVEVEKTsKLSAgICAgICAgcmVxdWVzdFBhcmFtZXRlcnMucHV0KFBBUkFNRVRFUl9QVUJMSUNBVElPTl9JRCwgZG9jdW1lbnQuZ2V0UHVibGljYXRpb24oKS5nZXRJZCgpKTsKLSAgICAgICAgcmVxdWVzdFBhcmFtZXRlcnMucHV0KFBBUkFNRVRFUl9ET0NVTUVOVF9VUkwsIGRvY3VtZW50LmdldENhbm9uaWNhbFdlYmFwcFVSTCgpKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBidWYuYXBwZW5kKCJodHRwOi8vMTI3LjAuMC4xOiIgKyBwb3J0ICsgc2VydmxldENvbnRleHRQYXRoICsgIj8iKTsKLSAgICAgICAgTWFwIG1hcCA9IHJlcXVlc3RQYXJhbWV0ZXJzLmdldE1hcCgpOwotCi0gICAgICAgIFN0cmluZ1tdIGtleXMgPSAoU3RyaW5nW10pIG1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbbWFwLmtleVNldCgpLnNpemUoKV0pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1hcC5nZXQoa2V5c1tpXSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKGtleXNbaV0gKyAiPSIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci9TY2hlZHVsZXJTdG9yZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL1NjaGVkdWxlclN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzg4ZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL1NjaGVkdWxlclN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2NoZWR1bGVyLnhtbC5UcmlnZ2VySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLk5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKLWltcG9ydCBvcmcucXVhcnR6LkpvYkRldGFpbDsKLWltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcucXVhcnR6LlRyaWdnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBTdG9yZSBmb3Igc2NoZWR1bGVyIGpvYnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlZHVsZXJTdG9yZSB7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5FTEVNRU5UX0pPQl9HUk9VUDwvY29kZT4gVGhlIGpvYiBncm91cCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9KT0JfR1JPVVAgPSAiam9iLWdyb3VwIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5FTEVNRU5UX0pPQjwvY29kZT4gVGhlIGpvYiBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9KT0IgPSAiam9iIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5USVRMRV9FTEVNRU5UPC9jb2RlPiBUaGUgdGl0bGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0VMRU1FTlQgPSAidGl0bGUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlNOQVBTSE9UX0ZJTEU8L2NvZGU+IFRoZSBwYXRoIHRvIHRoZSBzdG9yZWQgam9icwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UX0ZJTEUgPQotICAgICAgICAiY29uZmlnL3NjaGVkdWxlci9qb2JzLnhtbCIucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLSAgICAvKiogVGhlIG5hbWVzcGFjZSBmb3IgdGhlIDxjb2RlPmpvYnMueG1sPC9jb2RlPiBmaWxlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvc2NoZWR1bGVyLzEuMCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihTY2hlZHVsZXJTdG9yZS5jbGFzcyk7Ci0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFNjaGVkdWxlclN0b3JlKCkgewotCSAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgam9iIHNuYXBzaG90IGZpbGUgZm9yIGEgcHVibGljYXRpb24uLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHJldHVybiBBIGZpbGUuCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiB0aGUgcHVibGljYXRpb24gY291bGQgbm90IGJlIGJ1aWx0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldEpvYnNGaWxlKFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBqb2JzRmlsZTsKLSAgICAgICAgam9ic0ZpbGUgPSBuZXcgRmlsZShwdWJsaWNhdGlvbi5nZXREaXJlY3RvcnkoKSwgU05BUFNIT1RfRklMRSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiUmVzb2x2ZWQgam9iIHNuYXBzaG90IGZpbGU6IFsiICsgam9ic0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXSIpOwotICAgICAgICByZXR1cm4gam9ic0ZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgam9iIHNuYXBzaG90LgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGpvYnMgVGhlIGpvYnMgdG8gcGVyc2lzdAotICAgICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTbmFwc2hvdChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgSm9iV3JhcHBlcltdIGpvYnMpCi0gICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotCi0gICAgICAgIGxvZy5kZWJ1ZygiV3JpdGluZyBqb2Igc25hcHNob3QgZm9yIHB1YmxpY2F0aW9uIFsiICsgcHVibGljYXRpb24uZ2V0SWQoKSArICJdIik7Ci0gICAgICAgIEZpbGUgam9ic0ZpbGUgPSBnZXRKb2JzRmlsZShwdWJsaWNhdGlvbik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gam9ic0ZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCi0gICAgICAgICAgICBpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGRpcmVjdG9yeS5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGpvYiBzbmFwc2hvdCBkaXJlY3Rvcnk6ICIgKyBkaXJlY3RvcnkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGpvYnNGaWxlLmNyZWF0ZU5ld0ZpbGUoKSkgbG9nLmRlYnVnKCJuZXcgam9icyBmaWxlIGNyZWF0ZWQuIik7Ci0gICAgICAgICAgICBEb2N1bWVudEhlbHBlci53cml0ZURvY3VtZW50KGdldFNuYXBzaG90KHB1YmxpY2F0aW9uLCBqb2JzKSwgam9ic0ZpbGUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJXcml0aW5nIGpvYiBzbmFwc2hvdCBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJXcml0aW5nIGpvYiBzbmFwc2hvdCBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJXcml0aW5nIGpvYiBzbmFwc2hvdCBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgU2NoZWR1bGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiV3JpdGluZyBqb2Igc25hcHNob3QgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiB4bWwgZGVzY3JpcHRpb24gb2YgYWxsIHNjaGVkdWxlZCBqb2JzIGZvciB0aGUgZ2l2ZW4gcHVibGljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBqb2JzIFRoZSBqb2JzIHRvIHJldHVybgotICAgICAqIEByZXR1cm4gQW4gWE1MIGRvY3VtZW50LgotICAgICAqIEBleGNlcHRpb24gU2NoZWR1bGVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBnZXRTbmFwc2hvdChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgSm9iV3JhcHBlcltdIGpvYnMpCi0gICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gU2NoZWR1bGVyU3RvcmUuZ2V0TmFtZXNwYWNlSGVscGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gaGVscGVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgam9iIHNuYXBzaG90IGZvciBwdWJsaWNhdGlvbiBbIiArIHB1YmxpY2F0aW9uLmdldElkKCkgKyAiXSIpOwotICAgICAgICByb290LmFwcGVuZENoaWxkKGNyZWF0ZVNuYXBzaG90KGhlbHBlciwgcHVibGljYXRpb24sIGpvYnMpKTsKLQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNjaGVkdWxlciBuYW1lc3BhY2UgaGVscGVyIGZvciBhIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgWE1MIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gYSBuYW1lc3BhY2UgaGVscGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTmFtZXNwYWNlSGVscGVyIGdldE5hbWVzcGFjZUhlbHBlcihEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICByZXR1cm4gbmV3IE5hbWVzcGFjZUhlbHBlcihOQU1FU1BBQ0UsICJzY2giLCBkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBzY2hlZHVsZXIgbmFtZXNwYWNlIGhlbHBlciB3aXRoIGFuIGRvY3VtZW50IGNvbnRhaW5pbmcKLSAgICAgKiBhICZsdDtzY2g6c2NoZWR1bGVyJmd0OyBlbGVtZW50LgotICAgICAqIEByZXR1cm4gYSBuYW1lc3BhY2UgaGVscGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTmFtZXNwYWNlSGVscGVyIGdldE5hbWVzcGFjZUhlbHBlcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTmFtZXNwYWNlSGVscGVyKE5BTUVTUEFDRSwgInNjaCIsICJzY2hlZHVsZXIiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ291bGQgbm90IGNyZWF0ZSBuYW1lc3BhY2UgaGVscGVyOiAiLCBlKTsKLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIFhNTCBlbGVtZW50IGNvbnRhaW5pbmcgYSBzbmFwc2hvdCBvZiBhIGpvYiBncm91cC4KLSAgICAgKiBAcGFyYW0gaGVscGVyIFRoZSBuYW1lc3BhY2UgaGVscGVyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uIHRvIGNyZWF0ZSB0aGUgc25hcHNob3QgZm9yCi0gICAgICogQHBhcmFtIGpvYnMgVGhlIGpvYnMKLSAgICAgKiBAcmV0dXJuIEFuIFhNTCBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlU25hcHNob3QoCi0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLAotICAgICAgICBKb2JXcmFwcGVyW10gam9icykKLSAgICAgICAgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7Ci0gICAgICAgIEVsZW1lbnQgam9iR3JvdXBFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoRUxFTUVOVF9KT0JfR1JPVVApOwotICAgICAgICBqb2JHcm91cEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgcHVibGljYXRpb24uZ2V0SWQoKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIFNlcnZsZXRKb2Igam9iID0gam9ic1tpXS5nZXRKb2IoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgam9iRWxlbWVudCA9IGpvYi5zYXZlKGhlbHBlciwgam9ic1tpXS5nZXRKb2JEZXRhaWwoKSk7Ci0gICAgICAgICAgICBqb2JHcm91cEVsZW1lbnQuYXBwZW5kQ2hpbGQoam9iRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIFRyaWdnZXIgdHJpZ2dlciA9IGpvYnNbaV0uZ2V0VHJpZ2dlcigpOwotCi0gICAgICAgICAgICBpZiAodHJpZ2dlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCB0cmlnZ2VyRWxlbWVudCA9IFRyaWdnZXJIZWxwZXIuY3JlYXRlRWxlbWVudChoZWxwZXIsIHRyaWdnZXIpOwotICAgICAgICAgICAgICAgIGpvYkVsZW1lbnQuYXBwZW5kQ2hpbGQodHJpZ2dlckVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGpvYkdyb3VwRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlcyB0aGUgam9icyBvZiBhIGNlcnRhaW4gam9iIGdyb3VwIGZyb20gdGhlIHNuYXBzaG90IGZpbGUuCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIFRoZSBwdWJsaWNhdGlvbgotICAgICAqIEByZXR1cm4gQSBqb2Igd3JhcHBlcgotICAgICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIEpvYldyYXBwZXJbXSByZXN0b3JlSm9icyhQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBsb2cuZGVidWcoIlJlc3RvcmluZyBqb2JzIGZvciBwdWJsaWNhdGlvbiBbIiArIHB1YmxpY2F0aW9uLmdldElkKCkgKyAiXSIpOwotCi0gICAgICAgIExpc3Qgd3JhcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEZpbGUgam9ic0ZpbGUgPSBnZXRKb2JzRmlsZShwdWJsaWNhdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAoam9ic0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIEVsZW1lbnRbXSBqb2JFbGVtZW50cyA9IGdldEpvYkVsZW1lbnRzKHB1YmxpY2F0aW9uKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudCA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudChqb2JzRmlsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gU2NoZWR1bGVyU3RvcmUuZ2V0TmFtZXNwYWNlSGVscGVyKGRvY3VtZW50KTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHdyYXBwZXJzLmFkZChyZXN0b3JlSm9iKGhlbHBlciwgam9iRWxlbWVudHNbaV0sIHB1YmxpY2F0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCByZXN0b3JlIGpvYnMgZm9yIHB1YmxpY2F0aW9uIFsiICsgcHVibGljYXRpb24uZ2V0SWQoKSArICJdIC0gam9icyBmaWxlIGRvZXMgbm90IGV4aXN0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChKb2JXcmFwcGVyW10pIHdyYXBwZXJzLnRvQXJyYXkobmV3IEpvYldyYXBwZXJbd3JhcHBlcnMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgdGhlIGpvYnMgZnJvbSBhIGNlcnRhaW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGhlbHBlciBUaGUgbmFtZXNwYWNlIGhlbHBlcgotICAgICAqIEBwYXJhbSBqb2JFbGVtZW50IFRoZSBYTUwgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uIHRvIHJlc3RvcmUgam9icyBmb3IKLSAgICAgKiBAcmV0dXJuIEEgam9iIHdyYXBwZXIKLSAgICAgKiBAdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSm9iV3JhcHBlciByZXN0b3JlSm9iKAotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyLAotICAgICAgICBFbGVtZW50IGpvYkVsZW1lbnQsCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uKQotICAgICAgICB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmRlYnVnKCJSZXN0b3Jpbmcgam9iICIpOwotICAgICAgICBKb2JXcmFwcGVyIHdyYXBwZXI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBqb2JDbGFzc05hbWUgPSBqb2JFbGVtZW50LmdldEF0dHJpYnV0ZShTZXJ2bGV0Sm9iLkFUVFJJQlVURV9DTEFTUyk7Ci0gICAgICAgICAgICBTZXJ2bGV0Sm9iIGpvYiA9IFNlcnZsZXRKb2JGYWN0b3J5LmNyZWF0ZUpvYihqb2JDbGFzc05hbWUpOwotICAgICAgICAgICAgSm9iRGV0YWlsIGpvYkRldGFpbCA9Ci0gICAgICAgICAgICAgICAgam9iLmxvYWQoCi0gICAgICAgICAgICAgICAgICAgIGpvYkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgICAgICBUcmlnZ2VyIHRyaWdnZXIgPSBudWxsOwotCi0gICAgICAgICAgICBFbGVtZW50IHRyaWdnZXJFbGVtZW50ID0gaGVscGVyLmdldEZpcnN0Q2hpbGQoam9iRWxlbWVudCwgInRyaWdnZXIiKTsKLSAgICAgICAgICAgIGlmICh0cmlnZ2VyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJpZ2dlciA9Ci0gICAgICAgICAgICAgICAgICAgIFRyaWdnZXJIZWxwZXIuY3JlYXRlVHJpZ2dlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgam9iRGV0YWlsLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYkRldGFpbC5nZXRHcm91cCgpKTsKLQotICAgICAgICAgICAgICAgIERhdGUgbm93ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCkuZ2V0VGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBEYXRlRm9ybWF0IGZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgVHJpZ2dlciB0aW1lOiBbIiArIGZvcm1hdC5mb3JtYXQodHJpZ2dlci5nZXRGaW5hbEZpcmVUaW1lKCkpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgQ3VycmVudCB0aW1lOiBbIiArIGZvcm1hdC5mb3JtYXQobm93KSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlci5nZXRGaW5hbEZpcmVUaW1lKCkuYWZ0ZXIobm93KSkgewotICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cmFwcGVyID0gbmV3IEpvYldyYXBwZXIoam9iRGV0YWlsLCB0cmlnZ2VyKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3JhcHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBqb2IgZWxlbWVudHMgb2YgYSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24KLSAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGVsZW1lbnRzCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudFtdIGdldEpvYkVsZW1lbnRzKFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLSAgICAgICAgRWxlbWVudFtdIGpvYkVsZW1lbnRzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSBqb2JzRmlsZSA9IGdldEpvYnNGaWxlKHB1YmxpY2F0aW9uKTsKLSAgICAgICAgICAgIGlmIChqb2JzRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KGpvYnNGaWxlKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHNjaGVkdWxlckVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gU2NoZWR1bGVyU3RvcmUuZ2V0TmFtZXNwYWNlSGVscGVyKGRvY3VtZW50KTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgam9iR3JvdXBFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgaGVscGVyLmdldEZpcnN0Q2hpbGQoc2NoZWR1bGVyRWxlbWVudCwgU2NoZWR1bGVyU3RvcmUuRUxFTUVOVF9KT0JfR1JPVVApOwotICAgICAgICAgICAgICAgIGlmIChqb2JHcm91cEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZWR1bGVyRXhjZXB0aW9uKCJObyA8am9iLWdyb3VwPiBlbGVtZW50IGZvdW5kISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBqb2JHcm91cEF0dHJpYnV0ZSA9IGpvYkdyb3VwRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQotICAgICAgICAgICAgICAgIGlmICgham9iR3JvdXBBdHRyaWJ1dGUuZXF1YWxzKHB1YmxpY2F0aW9uLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGpvYnMueG1sIGZpbGUgY29udGFpbnMgYSB3cm9uZyBqb2IgZ3JvdXA6IFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBqb2JHcm91cEF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgam9iRWxlbWVudHMgPSBoZWxwZXIuZ2V0Q2hpbGRyZW4oam9iR3JvdXBFbGVtZW50LCBTY2hlZHVsZXJTdG9yZS5FTEVNRU5UX0pPQik7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBqb2JzIGZpbGUgWyIgKyBqb2JzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTY2hlZHVsZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGpvYkVsZW1lbnRzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci9TY2hlZHVsZXJXcmFwcGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvU2NoZWR1bGVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQxNzJhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci9TY2hlZHVsZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNjaGVkdWxlci54bWwuVHJpZ2dlckhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5Kb2JEYXRhTWFwOwotaW1wb3J0IG9yZy5xdWFydHouSm9iRGV0YWlsOwotaW1wb3J0IG9yZy5xdWFydHouU2NoZWR1bGVyOwotaW1wb3J0IG9yZy5xdWFydHouU2NoZWR1bGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5xdWFydHouU2NoZWR1bGVyRmFjdG9yeTsKLWltcG9ydCBvcmcucXVhcnR6LlRyaWdnZXI7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5pbXBsLlN0ZFNjaGVkdWxlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBTY2hlZHVsZXIgd3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU2NoZWR1bGVyV3JhcHBlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihTY2hlZHVsZXJXcmFwcGVyLmNsYXNzKTsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5KT0JfUFJFRklYPC9jb2RlPiBKb2IgTmFtZXNwYWNlIHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9QUkVGSVggPSAiam9iIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5KT0JfSUQ8L2NvZGU+IEpvYiBJRAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9JRCA9ICJpZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGpvYklkID0gMDsKLSAgICBwcml2YXRlIFNjaGVkdWxlciBzY2hlZHVsZXIgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZsZXRDb250ZXh0UGF0aDsKLSAgICBwcml2YXRlIFN0cmluZyBzY2hlZHVsZXJDb25maWd1cmF0aW9uUGF0aDsKLSAgICBwcml2YXRlIFNjaGVkdWxlclN0b3JlIHN0b3JlID0gbmV3IFNjaGVkdWxlclN0b3JlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNjaGVkdWxlcldyYXBwZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBfc2VydmxldENvbnRleHRQYXRoIFRoZSBzZXJ2bGV0IGNvbnRleHQgcGF0aC4KLSAgICAgKiBAcGFyYW0gX3NjaGVkdWxlckNvbmZpZ3VyYXRpb25QYXRoIFRoZSBzY2hlZHVsZXIgY29uZmlndXJhdGlvbiBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlZHVsZXJXcmFwcGVyKFN0cmluZyBfc2VydmxldENvbnRleHRQYXRoLCBTdHJpbmcgX3NjaGVkdWxlckNvbmZpZ3VyYXRpb25QYXRoKSB7Ci0gICAgICAgIHRoaXMuc2VydmxldENvbnRleHRQYXRoID0gX3NlcnZsZXRDb250ZXh0UGF0aDsKLSAgICAgICAgdGhpcy5zY2hlZHVsZXJDb25maWd1cmF0aW9uUGF0aCA9IF9zY2hlZHVsZXJDb25maWd1cmF0aW9uUGF0aDsKLQotICAgICAgICBTY2hlZHVsZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgU3RkU2NoZWR1bGVyRmFjdG9yeSgpOwotICAgICAgICBsb2cuaW5mbygiLS0tLS0tLSBTdGFydGluZyB1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVkdWxlciA9IGZhY3RvcnkuZ2V0U2NoZWR1bGVyKCk7Ci0KLSAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyLmFkZFNjaGVkdWxlckxpc3RlbmVyKG5ldyBBYnN0cmFjdFNjaGVkdWxlckxpc3RlbmVyKCkpOwotICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIuc3RhcnQoKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZWR1bGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBTY2hlZHVsZXJXcmFwcGVyOiAiLCBlKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiLS0tLS0tLSBTdGFydHVwIGZhaWxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbygiLS0tLS0tLSBTdGFydHVwIGNvbXBsZXRlIC0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0b3JlLgotICAgICAqIEByZXR1cm4gQSBzY2hlZHVsZXIgc3RvcmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNjaGVkdWxlclN0b3JlIGdldFN0b3JlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zdG9yZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlZHVsZXIuCi0gICAgICogQHJldHVybiBBIHNjaGVkdWxlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNjaGVkdWxlciBnZXRTY2hlZHVsZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaHV0cyBkb3duIHRoZSBzY2hlZHVsZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0gICAgICAgIGxvZy5pbmZvKCItLS0tLS0tIFNodXR0aW5nIERvd24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0KLSAgICAgICAgLy8gdHJ5IHRvIHNhdmUgc3RhdGUgaGVyZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2NoZWR1bGVyKCkuc2h1dGRvd24oKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZWR1bGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiLS0tLS0tLSBTaHV0ZG93biBGYWlsZWQgLS0tLS0tLS0tLS0tLS0tLS0iLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCItLS0tLS0tIFNodXRkb3duIENvbXBsZXRlIC0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VydmxldCBjb250ZXh0IHBhdGguCi0gICAgICogQHJldHVybiBUaGUgc2VydmxldCBjb250ZXh0IHBhdGguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2bGV0Q29udGV4dFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlcnZsZXRDb250ZXh0UGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzY2hlZHVsZXIgY29uZmlndXJhdGlvbiBwYXRoLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlZHVsZXJDb25maWd1cmF0aW9uUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyQ29uZmlndXJhdGlvblBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBqb2IgSUQgdG8gdXNlIChjYWxjdWxhdGVkIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUpLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBzdGF0aWMgU3RyaW5nIGdldE5leHRKb2JJZCgpIHsKLSAgICAgICAgcmV0dXJuICJqb2JfIiArIGpvYklkKysgK1N5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBqb2IuCi0gICAgICogQHBhcmFtIGpvYkdyb3VwIFRoZSBqb2IgZ3JvdXAuCi0gICAgICogQHBhcmFtIHN0YXJ0VGltZSBUaGUgc3RhcnQgdGltZS4KLSAgICAgKiBAcGFyYW0gam9iQ2xhc3MgVGhlIGNsYXNzIG9mIHRoZSBqb2IuCi0gICAgICogQHBhcmFtIG1hcCBUaGUgam9iIHBhcmFtZXRlcnMuCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEpvYihTdHJpbmcgam9iR3JvdXAsIERhdGUgc3RhcnRUaW1lLCBDbGFzcyBqb2JDbGFzcywgSm9iRGF0YU1hcCBtYXApCi0gICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24sIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHVuaXF1ZUpvYklkID0gZ2V0TmV4dEpvYklkKCk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiSm9iIElEOiBbIiArIHVuaXF1ZUpvYklkICsgIl0iKTsKLSAgICAgICAgCi0gICAgICAgIEpvYkRldGFpbCBqb2JEZXRhaWwgPSBuZXcgSm9iRGV0YWlsKHVuaXF1ZUpvYklkLCBqb2JHcm91cCwgam9iQ2xhc3MpOwotICAgICAgICBqb2JEZXRhaWwuc2V0Sm9iRGF0YU1hcChtYXApOwotICAgICAgICAKLSAgICAgICAgRGF0ZSBub3cgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKS5nZXRUaW1lKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJUcmlnZ2VyIHRpbWU6IFsiICsgZm9ybWF0LmZvcm1hdChzdGFydFRpbWUpICsgIl0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3VycmVudCB0aW1lOiBbIiArIGZvcm1hdC5mb3JtYXQobm93KSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzdGFydFRpbWUuYWZ0ZXIobm93KSkgewotICAgICAgICAgICAgVHJpZ2dlciB0cmlnZ2VyID0KLSAgICAgICAgICAgICAgICBUcmlnZ2VySGVscGVyLmNyZWF0ZVNpbXBsZVRyaWdnZXIodW5pcXVlSm9iSWQsIGpvYkdyb3VwLCBzdGFydFRpbWUpOwotICAgICAgICAgICAgYWRkSm9iKGpvYkRldGFpbCwgdHJpZ2dlcik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNjaGVkdWxpbmcgam9iLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkSm9iKGpvYkRldGFpbCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBqb2Igd2l0aG91dCBzY2hlZHVsaW5nLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsb2cuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuc3RvcmUud3JpdGVTbmFwc2hvdChnZXRQdWJsaWNhdGlvbihqb2JHcm91cCksIGdldEpvYldyYXBwZXJzKGpvYkdyb3VwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGpvYi4KLSAgICAgKiBAcGFyYW0gam9iR3JvdXAgVGhlIGpvYiBncm91cC4KLSAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIFRoZSBzdGFydCB0aW1lLgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHRvIG9idGFpbiB0aGUgcGFyYW1ldGVycyBmcm9tLgotICAgICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSm9iKFN0cmluZyBqb2JHcm91cCwgRGF0ZSBzdGFydFRpbWUsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgICAgICB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoam9iR3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbigiSm9iIGdyb3VwIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBKb2IgZm9yIGdyb3VwIFsiICsgam9iR3JvdXAgKyAiXSIpOwotCi0gICAgICAgICAgICAvLyBGSVhNRTogbW9yZSBmbGV4aWJsZQotICAgICAgICAgICAgQ2xhc3Mgam9iQ2xhc3MgPSBUYXNrSm9iLmNsYXNzOwotCi0gICAgICAgICAgICBTZXJ2bGV0Sm9iIGpvYiA9IFNlcnZsZXRKb2JGYWN0b3J5LmNyZWF0ZUpvYihqb2JDbGFzcyk7Ci0gICAgICAgICAgICBKb2JEYXRhTWFwIG1hcCA9IGpvYi5jcmVhdGVKb2JEYXRhKHJlcXVlc3QpOwotCi0gICAgICAgICAgICBhZGRKb2Ioam9iR3JvdXAsIHN0YXJ0VGltZSwgam9iQ2xhc3MsIG1hcCk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNjaGVkdWxlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkFkZGluZyBqb2IgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQWRkaW5nIGpvYiBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHB1YmxpY2F0aW9uIGZvciBhIGpvYiBncm91cC4KLSAgICAgKiBAcGFyYW0gam9iR3JvdXAgQSBqb2IgZ3JvdXAuCi0gICAgICogQHJldHVybiBBIHB1YmxpY2F0aW9uLgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgcHVibGljYXRpb24gZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKFN0cmluZyBqb2JHcm91cCkgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIC8qCi0gICAgICAgIFB1YmxpY2F0aW9uTWFuYWdlckltcGwgZmFjdG9yeSA9IFB1YmxpY2F0aW9uTWFuYWdlckltcGwuZ2V0SW5zdGFuY2UobmV3IENvbnNvbGVMb2dnZXIoKSk7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5LmdldFB1YmxpY2F0aW9uKGpvYkdyb3VwLCBnZXRTZXJ2bGV0Q29udGV4dFBhdGgoKSk7Ci0gICAgICAgICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGpvYi4KLSAgICAgKiBAcGFyYW0gZGV0YWlsIFRoZSBqb2IgaW5mb3JtYXRpb24uCi0gICAgICogQHBhcmFtIHRyaWdnZXIgVGhlIHRyaWdnZXIgdG8gdHJpZ2dlciB0aGUgam9iLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEpvYihKb2JEZXRhaWwgZGV0YWlsLCBUcmlnZ2VyIHRyaWdnZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRldGFpbC5zZXREdXJhYmlsaXR5KHRydWUpOwotCi0gICAgICAgICAgICBEYXRlIGZ0ID0gZ2V0U2NoZWR1bGVyKCkuc2NoZWR1bGVKb2IoZGV0YWlsLCB0cmlnZ2VyKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSm9iICIgKyBkZXRhaWwuZ2V0RnVsbE5hbWUoKSArICIgd2lsbCBydW4gYXQ6ICIgKyBmdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkFkZGluZyBqb2IgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBqb2IuCi0gICAgICogQHBhcmFtIGRldGFpbCBUaGUgam9iIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEpvYihKb2JEZXRhaWwgZGV0YWlsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXRhaWwuc2V0RHVyYWJpbGl0eSh0cnVlKTsKLSAgICAgICAgICAgIGdldFNjaGVkdWxlcigpLmFkZEpvYihkZXRhaWwsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChTY2hlZHVsZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJBZGRpbmcgam9iIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGEgam9iLgotICAgICAqIEBwYXJhbSBqb2JOYW1lIFRoZSBqb2IgbmFtZS4KLSAgICAgKiBAcGFyYW0gam9iR3JvdXAgVGhlIGpvYiBncm91cC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVKb2IoU3RyaW5nIGpvYk5hbWUsIFN0cmluZyBqb2JHcm91cCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJcbiBEZWxldGluZyBqb2IgWyIgKyBqb2JHcm91cCArICIvIiArIGpvYk5hbWUgKyAiXSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgZ2V0U2NoZWR1bGVyKCkuZGVsZXRlSm9iKGpvYk5hbWUsIGpvYkdyb3VwKTsKLSAgICAgICAgICAgIGdldFN0b3JlKCkud3JpdGVTbmFwc2hvdChnZXRQdWJsaWNhdGlvbihqb2JHcm91cCksIGdldEpvYldyYXBwZXJzKGpvYkdyb3VwKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVkdWxlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkRlbGV0aW5nIGpvYiBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkRlbGV0aW5nIGpvYiBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc2NoZWR1bGVyIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHJldHVybiBBIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gZ2V0U2NoZWR1bGVyQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERlZmF1bHRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uQnVpbGRlcigpOwotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRTZXJ2bGV0Q29udGV4dFBhdGgoKSArIGdldFNjaGVkdWxlckNvbmZpZ3VyYXRpb25QYXRoKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkluaXRpYWxpemluZyBzY2hlZHVsZXIgY29uZmlndXJhdGlvbjogIiArIHBhdGgpOwotCi0gICAgICAgICAgICBGaWxlIGNvbmZpZ3VyYXRpb25GaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBidWlsZGVyLmJ1aWxkRnJvbUZpbGUoY29uZmlndXJhdGlvbkZpbGUpOwotCi0gICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzY2hlZHVsZXIgY29uZmlndXJhdGlvbjogIiwgZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPGNvZGU+RUxFTUVOVF9UUklHR0VSUzwvY29kZT4gVHJpZ2dlcnMgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVFJJR0dFUlMgPSAidHJpZ2dlcnMiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkVMRU1FTlRfVFJJR0dFUjwvY29kZT4gVHJpZ2dlciBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UUklHR0VSID0gInRyaWdnZXIiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlRZUEVfQVRUUklCVVRFPC9jb2RlPiBUeXBlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQVRUUklCVVRFID0gInR5cGUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkNMQVNTX0FUVFJJQlVURTwvY29kZT4gQ2xhc3MgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gWE1MIGVsZW1lbnQgY29udGFpbmluZyB0aGUgdHJpZ2dlciB0eXBlcy4KLSAgICAgKiBAcGFyYW0gaGVscGVyIFRoZSBuYW1lc3BhY2UgaGVscGVyIG9mIHRoZSBkb2N1bWVudCB0aGF0IHNoYWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQuCi0gICAgICogQHJldHVybiBBbiBYTUwgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRUcmlnZ2VyVHlwZXMoTmFtZXNwYWNlSGVscGVyIGhlbHBlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U2NoZWR1bGVyQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgQ29uZmlndXJhdGlvbltdIHRyaWdnZXJDb25maWd1cmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRDaGlsZChFTEVNRU5UX1RSSUdHRVJTKS5nZXRDaGlsZHJlbihFTEVNRU5UX1RSSUdHRVIpOwotCi0gICAgICAgICAgICBFbGVtZW50IHRyaWdnZXJzRWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KCJ0cmlnZ2VycyIpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyaWdnZXJDb25maWd1cmF0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IHRyaWdnZXJDb25maWd1cmF0aW9uc1tpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGNvbmYuZ2V0QXR0cmlidXRlKFRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY29uZi5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUklCVVRFKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgdHJpZ2dlckVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgidHJpZ2dlciIpOwotICAgICAgICAgICAgICAgIHRyaWdnZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHR5cGUpOwotICAgICAgICAgICAgICAgIHRyaWdnZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgic3JjIiwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB0cmlnZ2Vyc0VsZW1lbnQuYXBwZW5kQ2hpbGQodHJpZ2dlckVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJpZ2dlcnNFbGVtZW50OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYW4ndCBjb25maWd1cmUgdHJpZ2dlciB0eXBlczogIiArIGUpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRyaWdnZXIgb2YgYSBjZXJ0YWluIGpvYi4KLSAgICAgKiBAcGFyYW0gam9iTmFtZSBUaGUgam9iIG5hbWUuCi0gICAgICogQHBhcmFtIGpvYkdyb3VwIFRoZSBqb2IgZ3JvdXAuCi0gICAgICogQHJldHVybiBBIHRyaWdnZXIuCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJpZ2dlciBnZXRUcmlnZ2VyKFN0cmluZyBqb2JOYW1lLCBTdHJpbmcgam9iR3JvdXApIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotICAgICAgICBsb2cuZGVidWcoIlJlc29sdmluZyB0cmlnZ2VyIGZvciBqb2IgWyIgKyBqb2JOYW1lICsgIiBdWyAiICsgam9iR3JvdXAgKyAiXSIpOwotICAgICAgICBTdHJpbmdbXSB0cmlnZ2VyR3JvdXBzID0gZ2V0U2NoZWR1bGVyKCkuZ2V0VHJpZ2dlckdyb3VwTmFtZXMoKTsKLQotICAgICAgICBmb3IgKGludCBncm91cEluZGV4ID0gMDsgZ3JvdXBJbmRleCA8IHRyaWdnZXJHcm91cHMubGVuZ3RoOyBncm91cEluZGV4KyspIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHRyaWdnZXJOYW1lcyA9IGdldFNjaGVkdWxlcigpLmdldFRyaWdnZXJOYW1lcyh0cmlnZ2VyR3JvdXBzW2dyb3VwSW5kZXhdKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgbmFtZUluZGV4ID0gMDsgbmFtZUluZGV4IDwgdHJpZ2dlck5hbWVzLmxlbmd0aDsgbmFtZUluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRyaWdnZXIgbmFtZTogICIgKyB0cmlnZ2VyTmFtZXNbbmFtZUluZGV4XSk7Ci0KLSAgICAgICAgICAgICAgICBUcmlnZ2VyIHRyaWdnZXIgPQotICAgICAgICAgICAgICAgICAgICBnZXRTY2hlZHVsZXIoKS5nZXRUcmlnZ2VyKHRyaWdnZXJOYW1lc1tuYW1lSW5kZXhdLCB0cmlnZ2VyR3JvdXBzW2dyb3VwSW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpvYiBncm91cDogICAgICIgKyB0cmlnZ2VyLmdldEpvYkdyb3VwKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRyaWdnZXIuZ2V0Sm9iR3JvdXAoKS5lcXVhbHMoam9iR3JvdXApCi0gICAgICAgICAgICAgICAgICAgICYmIHRyaWdnZXIuZ2V0Sm9iTmFtZSgpLmVxdWFscyhqb2JOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJpZ2dlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gWE1MIGRlc2NyaXB0aW9uIGNlcnRhaW4gam9iIGdyb3Vwcy4KLSAgICAgKiBAcGFyYW0gam9iR3JvdXBOYW1lcyBUaGUgam9iIGdyb3VwIG5hbWVzLgotICAgICAqIEByZXR1cm4gQW4gWE1MIGRvY3VtZW50LgotICAgICAqIEBleGNlcHRpb24gU2NoZWR1bGVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBnZXRTbmFwc2hvdChTdHJpbmdbXSBqb2JHcm91cE5hbWVzKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBqb2Igc25hcHNob3QiKTsKLQotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gU2NoZWR1bGVyU3RvcmUuZ2V0TmFtZXNwYWNlSGVscGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gaGVscGVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgIC8vIHByaW50IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHRyaWdnZXIgdHlwZXMKLSAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChnZXRUcmlnZ2VyVHlwZXMoaGVscGVyKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgZ3JvdXBJbmRleCA9IDA7IGdyb3VwSW5kZXggPCBqb2JHcm91cE5hbWVzLmxlbmd0aDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGpvYiBzbmFwc2hvdCBmb3IgZ3JvdXAgWyIgKyBqb2JHcm91cE5hbWVzW2dyb3VwSW5kZXhdICsgIl0iKTsKLSAgICAgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZ2V0U25hcHNob3QoaGVscGVyLCBqb2JHcm91cE5hbWVzW2dyb3VwSW5kZXhdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc25hcHNob3Qgb2YgYSBjZXJ0YWluIGpvYiBncm91cC4KLSAgICAgKiBAcGFyYW0gaGVscGVyIFRoZSBuYW1lc3BhY2UgaGVscGVyLgotICAgICAqIEBwYXJhbSBncm91cCBUaGUgam9iIGdyb3VwLgotICAgICAqIEByZXR1cm4gQW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRTbmFwc2hvdChOYW1lc3BhY2VIZWxwZXIgaGVscGVyLCBTdHJpbmcgZ3JvdXApIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotICAgICAgICBKb2JXcmFwcGVyW10gam9icyA9IGdldEpvYldyYXBwZXJzKGdyb3VwKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZWxlbWVudCA9IGdldFN0b3JlKCkuY3JlYXRlU25hcHNob3QoaGVscGVyLCBnZXRQdWJsaWNhdGlvbihncm91cCksIGpvYnMpOwotICAgICAgICB9IGNhdGNoIChTY2hlZHVsZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoUHVibGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBqb2Igd3JhcHBlcnMgZm9yIGEgY2VydGFpbiBqb2IgZ3JvdXAuCi0gICAgICogQHBhcmFtIGpvYkdyb3VwTmFtZSBUaGUgam9iIGdyb3VwLgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2Ygam9iIHdyYXBwZXJzLgotICAgICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEpvYldyYXBwZXJbXSBnZXRKb2JXcmFwcGVycyhTdHJpbmcgam9iR3JvdXBOYW1lKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLQotICAgICAgICBMaXN0IHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBqb2JOYW1lcyA9IGdldFNjaGVkdWxlcigpLmdldEpvYk5hbWVzKGpvYkdyb3VwTmFtZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgbmFtZUluZGV4ID0gMDsgbmFtZUluZGV4IDwgam9iTmFtZXMubGVuZ3RoOyBuYW1lSW5kZXgrKykgewotICAgICAgICAgICAgSm9iRGV0YWlsIGpvYkRldGFpbCA9IGdldFNjaGVkdWxlcigpLmdldEpvYkRldGFpbChqb2JOYW1lc1tuYW1lSW5kZXhdLCBqb2JHcm91cE5hbWUpOwotICAgICAgICAgICAgVHJpZ2dlciB0cmlnZ2VyID0gZ2V0VHJpZ2dlcihqb2JOYW1lc1tuYW1lSW5kZXhdLCBqb2JHcm91cE5hbWUpOwotICAgICAgICAgICAgd3JhcHBlcnMuYWRkKG5ldyBKb2JXcmFwcGVyKGpvYkRldGFpbCwgdHJpZ2dlcikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChKb2JXcmFwcGVyW10pIHdyYXBwZXJzLnRvQXJyYXkobmV3IEpvYldyYXBwZXJbd3JhcHBlcnMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIHhtbCBkZXNjcmlwdGlvbiBvZiBhbGwgc2NoZWR1bGVkIGpvYnMuCi0gICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24KLSAgICAgKiBAZXhjZXB0aW9uIFNjaGVkdWxlckV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0U25hcHNob3QoKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gam9iR3JvdXBOYW1lcyA9IGdldFNjaGVkdWxlcigpLmdldEpvYkdyb3VwTmFtZXMoKTsKLSAgICAgICAgcmV0dXJuIGdldFNuYXBzaG90KGpvYkdyb3VwTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIHRoZSBqb2JzIG9mIGEgY2VydGFpbiBqb2IgZ3JvdXAgZnJvbSB0aGUgc25hcHNob3QgZmlsZS4KLSAgICAgKiBAcGFyYW0gam9iR3JvdXAgVGhlIGpvYiBncm91cC4KLSAgICAgKiBAdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVKb2JzKFN0cmluZyBqb2JHcm91cCkgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBsb2cuZGVidWcoIlJlc3RvcmluZyBqb2JzIGZvciBqb2IgZ3JvdXAgWyIgKyBqb2JHcm91cCArICJdIik7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSm9iV3JhcHBlcltdIGpvYnMgPSBnZXRTdG9yZSgpLnJlc3RvcmVKb2JzKGdldFB1YmxpY2F0aW9uKGpvYkdyb3VwKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoam9ic1tpXS5nZXRUcmlnZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIFRyaWdnZXIgdGltZSBpbiBmdXR1cmUgLSBzY2hlZHVsaW5nIGpvYi4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhZGRKb2Ioam9ic1tpXS5nZXRKb2JEZXRhaWwoKSwgam9ic1tpXS5nZXRUcmlnZ2VyKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgVHJpZ2dlciB0aW1lIGhhcyBleHBpcmVkIC0gYWRkaW5nIGpvYiB3aXRob3V0IHNjaGVkdWxpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWRkSm9iKGpvYnNbaV0uZ2V0Sm9iRGV0YWlsKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgU2NoZWR1bGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiIiArZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiIiArZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlZHVsZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vZGlmaWVzIHRoZSBleGVjdXRpb24gdGltZSBvZiBhIGpvYi4KLSAgICAgKiBAcGFyYW0gX2pvYklkIFRoZSBqb2IgSUQuCi0gICAgICogQHBhcmFtIGpvYkdyb3VwIFRoZSBqb2IgZ3JvdXAuCi0gICAgICogQHBhcmFtIHN0YXJ0VGltZSBUaGUgbmV3IHN0YXJ0IHRpbWUuCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiB0aGUgam9iIHdhcyBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5Sm9iKFN0cmluZyBfam9iSWQsIFN0cmluZyBqb2JHcm91cCwgRGF0ZSBzdGFydFRpbWUpCi0gICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotICAgICAgICBsb2cuZGVidWcoIk1vZGlmeWluZyBqb2IgWyIgKyBfam9iSWQgKyAiXVsiICsgam9iR3JvdXAgKyAiXSIpOwotCi0gICAgICAgIEpvYkRldGFpbCBqb2JEZXRhaWwgPSBnZXRTY2hlZHVsZXIoKS5nZXRKb2JEZXRhaWwoX2pvYklkLCBqb2JHcm91cCk7Ci0gICAgICAgIGlmIChqb2JEZXRhaWwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbigiSm9iIG5vdCBmb3VuZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRyaWdnZXIgdHJpZ2dlciA9IGdldFRyaWdnZXIoam9iRGV0YWlsLmdldE5hbWUoKSwgam9iR3JvdXApOwotICAgICAgICBpZiAodHJpZ2dlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgICBObyB0cmlnZ2VyIGZvdW5kLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgVHJpZ2dlciBmb3VuZC4gU2V0dGluZyBuZXcgc3RhcnQgdGltZS4iKTsKLSAgICAgICAgICAgIGpvYkRldGFpbC5zZXREdXJhYmlsaXR5KHRydWUpOwotICAgICAgICAgICAgaWYgKHN0YXJ0VGltZS5hZnRlcihuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKS5nZXRUaW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgU3RhcnQgdGltZSBpcyBpbiBmdXR1cmUgLSByZS1zY2hlZHVsaW5nIGpvYi4iKTsKLSAgICAgICAgICAgICAgICBnZXRTY2hlZHVsZXIoKS51bnNjaGVkdWxlSm9iKHRyaWdnZXIuZ2V0TmFtZSgpLCB0cmlnZ2VyLmdldEdyb3VwKCkpOwotICAgICAgICAgICAgICAgIHRyaWdnZXIgPSBUcmlnZ2VySGVscGVyLmNyZWF0ZVNpbXBsZVRyaWdnZXIoX2pvYklkLCBqb2JHcm91cCwgc3RhcnRUaW1lKTsKLSAgICAgICAgICAgICAgICBnZXRTY2hlZHVsZXIoKS5zY2hlZHVsZUpvYih0cmlnZ2VyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgU3RhcnQgdGltZSBoYXMgYWxyZWFkeSBleHBpcmVkIC0gZGVsZXRpbmcgam9iLiIpOwotICAgICAgICAgICAgICAgIGdldFNjaGVkdWxlcigpLmRlbGV0ZUpvYihfam9iSWQsIGpvYkdyb3VwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2V0U3RvcmUoKS53cml0ZVNuYXBzaG90KGdldFB1YmxpY2F0aW9uKGpvYkdyb3VwKSwgZ2V0Sm9iV3JhcHBlcnMoam9iR3JvdXApKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNjaGVkdWxlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZWR1bGVyRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGUgam9icyBmb3IgYSBjZXJ0YWluIGRvY3VtZW50LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbgotICAgICAqIGEgZG9jdW1lbnQgaGFzIGJlZW4gbW92ZWQgb3IgZGVsZXRlZC4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqIEB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVKb2JzKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50IGRvY3VtZW50KQotICAgICAgICB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uLCBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAKLSAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyBqb2JzIGZvciBkb2N1bWVudCBbIiArIGRvY3VtZW50ICsgIl0iKTsKLSAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgam9iR3JvdXAgPSBkb2N1bWVudC5nZXRQdWJsaWNhdGlvbigpLmdldElkKCk7Ci0gICAgICAgIEpvYldyYXBwZXJbXSBqb2JzID0gZ2V0Sm9iV3JhcHBlcnMoam9iR3JvdXApOwotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTZXJ2bGV0Sm9iIGpvYiA9IGpvYnNbaV0uZ2V0Sm9iKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZG9jdW1lbnRVcmwgPSBqb2IuZ2V0RG9jdW1lbnRVcmwoam9ic1tpXS5nZXRKb2JEZXRhaWwoKSk7Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnRVcmwuZXF1YWxzKGRvY3VtZW50LmdldENhbm9uaWNhbFdlYmFwcFVSTCgpKSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZUpvYihqb2JzW2ldLmdldEpvYkRldGFpbCgpLmdldE5hbWUoKSwgam9iR3JvdXApOwotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICBnZXRTdG9yZSgpLndyaXRlU25hcHNob3QoZ2V0UHVibGljYXRpb24oam9iR3JvdXApLCBnZXRKb2JXcmFwcGVycyhqb2JHcm91cCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvU2VydmxldEpvYi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL1NlcnZsZXRKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyOGQ1MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvU2VydmxldEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNjaGVkdWxlcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLk5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKLWltcG9ydCBvcmcucXVhcnR6LkpvYjsKLWltcG9ydCBvcmcucXVhcnR6LkpvYkRhdGFNYXA7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5Kb2JEZXRhaWw7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5TY2hlZHVsZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogU2NoZWR1bGluZyBqb2IgdGhhdCB1c2VzIGFuIEh0dHBTZXJ2bGV0UmVxdWVzdCB0byBvYnRhaW4gaXRzIEpvYiBkYXRhLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmxldEpvYiBpbXBsZW1lbnRzIEpvYiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihTZXJ2bGV0Sm9iLmNsYXNzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8Y29kZT5FTEVNRU5UX0pPQjwvY29kZT4gVGhlIGpvYiBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9KT0IgPSAiam9iIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5BVFRSSUJVVEVfSUQ8L2NvZGU+IFRoZSBpZCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkFUVFJJQlVURV9DTEFTUzwvY29kZT4gVGhlIGNsYXNzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9DTEFTUyA9ICJjbGFzcyI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+QVRUUklCVVRFX0RPQ1VNRU5UX1VSTDwvY29kZT4gVGhlIGRvY3VtZW50IHVybCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRE9DVU1FTlRfVVJMID0gInVybCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+QVRUUklCVVRFX1NFUlZMRVRfQ09OVEVYVDwvY29kZT4gVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfU0VSVkxFVF9DT05URVhUID0gInNlcnZsZXRjb250ZXh0IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfRE9DVU1FTlRfVVJMPC9jb2RlPiBUaGUgZG9jdW1lbnQgVVJMIHBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9ET0NVTUVOVF9VUkwgPSAiZG9jdW1lbnQtdXJsIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGpvYiBkYXRhIGZyb20gYW4gSFRUUCByZXF1ZXN0LgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4gQSBqb2IgZGF0YSBtYXAuCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSm9iRGF0YU1hcCBjcmVhdGVKb2JEYXRhKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgICAgICB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLSAgICAgICAgSm9iRGF0YU1hcCBtYXAgPSBuZXcgSm9iRGF0YU1hcCgpOwotICAgICAgICBTdHJpbmcga2V5ID0gTmFtZXNwYWNlTWFwLmdldEZ1bGxOYW1lKExvYWRRdWFydHpTZXJ2bGV0LlBSRUZJWCwgUEFSQU1FVEVSX0RPQ1VNRU5UX1VSTCk7Ci0gICAgICAgIFN0cmluZyBkb2N1bWVudFVybCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKGtleSk7Ci0gICAgICAgIGlmIChkb2N1bWVudFVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZWR1bGVyRXhjZXB0aW9uKCJEb2N1bWVudCBVUkwgbXVzdCBub3QgYmUgbnVsbCEiKTsKLSAgICAgICAgfQotICAgICAgICBtYXAucHV0KGtleSwgZG9jdW1lbnRVcmwpOwotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBqb2IgZGF0YSBmcm9tIGFuIFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBlbGVtZW50IEFuIFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBqb2JHcm91cCBUaGUgam9iIGdyb3VwIHRoZSBqb2IgYmVsb25ncyB0by4KLSAgICAgKiBAcGFyYW0gc2VydmxldENvbnRleHRQYXRoIFRoZSBzZXJ2bGV0IGNvbnRleHQgcGF0aC4KLSAgICAgKiBAcmV0dXJuIEEgam9iIGRldGFpbCBvYmplY3QuCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSm9iRGV0YWlsIGxvYWQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgam9iR3JvdXAsIFN0cmluZyBzZXJ2bGV0Q29udGV4dFBhdGgpCi0gICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgam9iSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQpOwotICAgICAgICBKb2JEZXRhaWwgam9iRGV0YWlsID0gbmV3IEpvYkRldGFpbChqb2JJZCwgam9iR3JvdXAsIGdldENsYXNzKCkpOwotICAgICAgICByZXR1cm4gam9iRGV0YWlsOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGpvYiBkYXRhIHRvIGFuIFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBoZWxwZXIgVGhlIG5hbWVzcGFjZSBoZWxwZXIgb2YgdGhlIGRvY3VtZW50IHRoZSBlbGVtZW50IHNoYWxsIGJlbG9uZyB0by4KLSAgICAgKiBAcGFyYW0gam9iRGV0YWlsIFRoZSBqb2IgZGV0YWlsIHRvIHNhdmUuCi0gICAgICogQHJldHVybiBBbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IHNhdmUoTmFtZXNwYWNlSGVscGVyIGhlbHBlciwgSm9iRGV0YWlsIGpvYkRldGFpbCkgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU2F2aW5nIGpvYiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFbGVtZW50IGpvYkVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudChFTEVNRU5UX0pPQik7Ci0gICAgICAgICAgICBqb2JFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQsIGpvYkRldGFpbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgam9iRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0NMQVNTLCBnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkb2N1bWVudFVybCA9IGdldERvY3VtZW50VXJsKGpvYkRldGFpbCk7Ci0gICAgICAgICAgICBqb2JFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfRE9DVU1FTlRfVVJMLCBkb2N1bWVudFVybCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBqb2JFbGVtZW50OwotICAgICAgICB9IGNhdGNoIChmaW5hbCBET01FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCIiICtlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVkdWxlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IFVSTCBvZiBhIGNlcnRhaW4gam9iLgotICAgICAqIEBwYXJhbSBqb2JEZXRhaWwgVGhlIGpvYiBkZXRhaWwuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VXJsKEpvYkRldGFpbCBqb2JEZXRhaWwpIHsKLSAgICAgICAgSm9iRGF0YU1hcCBtYXAgPSBqb2JEZXRhaWwuZ2V0Sm9iRGF0YU1hcCgpOwotICAgICAgICBOYW1lc3BhY2VNYXAgd3JhcHBlciA9IG5ldyBOYW1lc3BhY2VNYXAobWFwLCBMb2FkUXVhcnR6U2VydmxldC5QUkVGSVgpOwotICAgICAgICBTdHJpbmcgZG9jdW1lbnRVcmwgPSAoU3RyaW5nKSB3cmFwcGVyLmdldChQQVJBTUVURVJfRE9DVU1FTlRfVVJMKTsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50VXJsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkb2N1bWVudCBVUkwgb2YgYSBqb2IuCi0gICAgICogQHBhcmFtIGpvYkRldGFpbCBUaGUgam9iIGRldGFpbC4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRVcmwoSm9iRGV0YWlsIGpvYkRldGFpbCwgU3RyaW5nIHVybCkgewotICAgICAgICBKb2JEYXRhTWFwIG1hcCA9IGpvYkRldGFpbC5nZXRKb2JEYXRhTWFwKCk7Ci0gICAgICAgIE5hbWVzcGFjZU1hcCB3cmFwcGVyID0gbmV3IE5hbWVzcGFjZU1hcChtYXAsIExvYWRRdWFydHpTZXJ2bGV0LlBSRUZJWCk7Ci0gICAgICAgIHdyYXBwZXIucHV0KFBBUkFNRVRFUl9ET0NVTUVOVF9VUkwsIHVybCk7Ci0gICAgICAgIGpvYkRldGFpbC5zZXRKb2JEYXRhTWFwKG1hcCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvU2VydmxldEpvYkZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci9TZXJ2bGV0Sm9iRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWU4YTg4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci9TZXJ2bGV0Sm9iRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2NoZWR1bGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBGYWN0b3J5IGZvciBidWlsZGluZyBzZXJsdmV0IGpvYnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2bGV0Sm9iRmFjdG9yeSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNlcnZsZXRKb2JGYWN0b3J5KCkgewotCSAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoU2VydmxldEpvYkZhY3RvcnkuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGpvYi4KLSAgICAgKiBAcGFyYW0gam9iQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHVzZWQgdG8gaW5zdGFuY2lhdGUgdGhlIGpvYiBvYmplY3QuCi0gICAgICogQHJldHVybiBBIHNlcnZsZXQgam9iLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmxldEpvYiBjcmVhdGVKb2IoU3RyaW5nIGpvYkNsYXNzTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2wgPSBDbGFzcy5mb3JOYW1lKGpvYkNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVKb2IoY2wpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgY3JlYXRlIEpvYiBpbnN0YW5jZTogIiArIGUpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBqb2IuIAotICAgICAqIEBwYXJhbSBjbCBUaGUgSmF2YSBjbGFzcyB1c2VkIHRvIGluc3RhbmNpYXRlIHRoZSBqb2Igb2JqZWN0LgotICAgICAqIEByZXR1cm4gQSBzZXJ2bGV0IGpvYi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZsZXRKb2IgY3JlYXRlSm9iKENsYXNzIGNsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2bGV0Sm9iIGpvYiA9IChTZXJ2bGV0Sm9iKSBjbC5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gam9iOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgY3JlYXRlIEpvYiBpbnN0YW5jZTogIiArIGUpOwotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci9UYXNrSm9iLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zY2hlZHVsZXIvVGFza0pvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGM0Mjc0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci9UYXNrSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5EZWZhdWx0VGFza1dyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5UYXNrUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrLlRhc2tXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5OYW1lc3BhY2VNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5xdWFydHouSm9iRGF0YU1hcDsKLWltcG9ydCBvcmcucXVhcnR6LkpvYkRldGFpbDsKLWltcG9ydCBvcmcucXVhcnR6LkpvYkV4ZWN1dGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5Kb2JFeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnF1YXJ0ei5TY2hlZHVsZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIFRhc2tKb2IgaXMgYSBKb2IgdGhhdCBleGVjdXRlcyBhIFRhc2suIFRoZSB0YXNrIElEIGlzIG9idGFpbmVkIGZyb20gdGhlIDxjb2RlPnRhc2staWQ8L2NvZGU+Ci0gKiByZXF1ZXN0IHBhcmFtZXRlci4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tKb2IgZXh0ZW5kcyBTZXJ2bGV0Sm9iIHsKLSAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihUYXNrSm9iLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFVuLXByZWZpeCB0aGUgcGFyYW1ldGVycy4KLSAgICAgKiBAcGFyYW0gd3JhcHBlck1hcCB0aGUgcHJlZml4ZWQgcGFyYW1ldGVycy4KLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXJzCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwIHN0cmlwUHJlZml4ZXMoTWFwIHdyYXBwZXJNYXApCi0gICAgICAgIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgTmFtZXNwYWNlTWFwIHRhc2tQYXJhbWV0ZXJzID0gbmV3IE5hbWVzcGFjZU1hcChUYXNrUGFyYW1ldGVycy5QUkVGSVgpOwotICAgICAgICB0YXNrUGFyYW1ldGVycy5wdXRBbGwod3JhcHBlck1hcCk7Ci0gICAgICAgIHdyYXBwZXJNYXAucHV0QWxsKHRhc2tQYXJhbWV0ZXJzLmdldFByZWZpeGVkTWFwKCkpOwotICAgICAgICAKLSAgICAgICAgRGVmYXVsdFRhc2tXcmFwcGVyIHdyYXBwZXIgPSBuZXcgRGVmYXVsdFRhc2tXcmFwcGVyKHdyYXBwZXJNYXAsIG51bGwpOwotICAgICAgICByZXR1cm4gd3JhcHBlci5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgam9iIGRhdGEgZm9yIGEgam9iLgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4gQSBqb2IgZGF0YSBtYXAuCi0gICAgICogQHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSm9iRGF0YU1hcCBjcmVhdGVKb2JEYXRhKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICAgICAgICB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBqb2IgZGF0YSBtYXA6Iik7Ci0gICAgICAgIEpvYkRhdGFNYXAgbWFwID0gc3VwZXIuY3JlYXRlSm9iRGF0YShyZXF1ZXN0KTsKLQotICAgICAgICBFbnVtZXJhdGlvbiBwYXJhbWV0ZXJzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgICAgICBNYXAgd3JhcHBlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHdoaWxlIChwYXJhbWV0ZXJzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgcGFyYW1ldGVycy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlOwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoa2V5KTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1swXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JhcHBlck1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYXAucHV0QWxsKHN0cmlwUHJlZml4ZXMod3JhcHBlck1hcCkpOwotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENhbGxlZCBieSB0aGUgPGNvZGU+e0BsaW5rIG9yZy5xdWFydHouU2NoZWR1bGVyfTwvY29kZT4gd2hlbiBhIDxjb2RlPntAbGluawotICAgICAqIG9yZy5xdWFydHouVHJpZ2dlcn08L2NvZGU+IGZpcmVzIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5Kb2I8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dAotICAgICAqIEB0aHJvd3MgSm9iRXhlY3V0aW9uRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGV4Y2VwdGlvbiB3aGlsZSBleGVjdXRpbmcgdGhlIGpvYi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkV4ZWN1dGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEpvYkV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5pbmZvKCJFeGVjdXRpbmcgam9iIik7Ci0gICAgICAgIEpvYkRldGFpbCBqb2JEZXRhaWwgPSBjb250ZXh0LmdldEpvYkRldGFpbCgpOwotICAgICAgICAKLSAgICAgICAgRGVmYXVsdFRhc2tXcmFwcGVyIHdyYXBwZXIgPSBuZXcgRGVmYXVsdFRhc2tXcmFwcGVyKGpvYkRldGFpbC5nZXRKb2JEYXRhTWFwKCksIG51bGwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JhcHBlci5leGVjdXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAlsb2cuZXJyb3IoIlRhc2sgZXhlY3V0aW9uIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIAl0aHJvdyBuZXcgSm9iRXhlY3V0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBhIGpvYiBkZXRhaWxzIG9iamVjdCBmcm9tIGFuIFhNTCBlbGVtZW50LiAKLSAgICAgKiBAcGFyYW0gam9iRWxlbWVudCBUaGUgWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGpvYkdyb3VwIFRoZSBqb2IgZ3JvdXAgdGhlIGpvYiBiZWxvbmdzIHRvLgotICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29udGV4dFBhdGggVGhlIHNlcnZsZXQgY29udGV4dCBwYXRoLgotICAgICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICogQHJldHVybiBBIGpvYiBkZXRhaWxzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSm9iRGV0YWlsIGxvYWQoRWxlbWVudCBqb2JFbGVtZW50LCBTdHJpbmcgam9iR3JvdXAsIFN0cmluZyBzZXJ2bGV0Q29udGV4dFBhdGgpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotICAgICAgICBKb2JEZXRhaWwgam9iRGV0YWlsID0gc3VwZXIubG9hZChqb2JFbGVtZW50LCBqb2JHcm91cCwgc2VydmxldENvbnRleHRQYXRoKTsKLSAgICAgICAgCi0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBTY2hlZHVsZXJTdG9yZS5nZXROYW1lc3BhY2VIZWxwZXIoKTsKLSAgICAgICAgRGVmYXVsdFRhc2tXcmFwcGVyIHdyYXBwZXIgPSBuZXcgRGVmYXVsdFRhc2tXcmFwcGVyKGhlbHBlciwgam9iRWxlbWVudCk7Ci0gICAgICAgIHdyYXBwZXIuZ2V0VGFza1BhcmFtZXRlcnMoKS5zZXRTZXJ2bGV0Q29udGV4dFBhdGgoc2VydmxldENvbnRleHRQYXRoKTsKLSAgICAgICAgCi0gICAgICAgIEpvYkRhdGFNYXAgbWFwID0gbmV3IEpvYkRhdGFNYXAod3JhcHBlci5nZXRQYXJhbWV0ZXJzKCkpOwotICAgICAgICBqb2JEZXRhaWwuc2V0Sm9iRGF0YU1hcChtYXApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGpvYkRldGFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGEgam9iIGRldGFpbAotICAgICAqIEBwYXJhbSBqb2JEZXRhaWwgVGhlIGpvYiBkZXRhaWwgdG8gc2F2ZQotICAgICAqIEBwYXJhbSBoZWxwZXIgbmFtZXNwYWNlIGhlbHBlcgotICAgICAqIEB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICogQHJldHVybiBUaGUgam9iIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBzYXZlKE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEpvYkRldGFpbCBqb2JEZXRhaWwpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgRWxlbWVudCBqb2JFbGVtZW50ID0gc3VwZXIuc2F2ZShoZWxwZXIsIGpvYkRldGFpbCk7Ci0gICAgICAgIFRhc2tXcmFwcGVyIHdyYXBwZXIgPSBuZXcgRGVmYXVsdFRhc2tXcmFwcGVyKGpvYkRldGFpbC5nZXRKb2JEYXRhTWFwKCksIG51bGwpOwotICAgICAgICBqb2JFbGVtZW50LmFwcGVuZENoaWxkKHdyYXBwZXIuc2F2ZShoZWxwZXIpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBqb2JFbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NjaGVkdWxlci94bWwvVHJpZ2dlckhlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL3htbC9UcmlnZ2VySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjZkMzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2NoZWR1bGVyL3htbC9UcmlnZ2VySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2NoZWR1bGVyLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zY2hlZHVsZXIuU2NoZWR1bGVyU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5Dcm9uVHJpZ2dlcjsKLWltcG9ydCBvcmcucXVhcnR6LlNpbXBsZVRyaWdnZXI7Ci1pbXBvcnQgb3JnLnF1YXJ0ei5UcmlnZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIHdvcmsgd2l0aCB0cmlnZ2VyIFhNTC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyaWdnZXJIZWxwZXIgewotICAgIAotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUcmlnZ2VySGVscGVyKCkgewotCSAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoVHJpZ2dlckhlbHBlci5jbGFzcyk7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+WUVBUjwvY29kZT4gVGhlIHllYXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRUFSID0gInllYXIiOwotICAgIC8qKgotICAgICAqIDxjb2RlPk1PTlRIPC9jb2RlPiBUaGUgbW9udGgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT05USCA9ICJtb250aCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+REFZPC9jb2RlPiBUaGUgZGF5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFZID0gImRheSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+SE9VUjwvY29kZT4gVGhlIGhvdXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1VSID0gImhvdXIiOwotICAgIC8qKgotICAgICAqIDxjb2RlPk1JTlVURTwvY29kZT4gVGhlIG1pbnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTlVURSA9ICJtaW51dGUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlRSSUdHRVJfVFlQRTwvY29kZT4gVGhlIHRyaWdnZXIgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSUdHRVJfVFlQRSA9ICJ0eXBlIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5PTkNFPC9jb2RlPiBPbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05DRSA9ICJvbmNlIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5SRVBFQVRFRDwvY29kZT4gUmVwZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBFQVRFRCA9ICJyZXBlYXRlZCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+Q1JPTl9FWFBSRVNTSU9OPC9jb2RlPiBUaGUgY3JvbiBleHByZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JPTl9FWFBSRVNTSU9OID0gImV4cHJlc3Npb24iOwotICAgIHByaXZhdGUgc3RhdGljIGludCBpZCA9IDA7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+UFJFRklYPC9jb2RlPiBUaGUgcHJlZml4Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gInRyaWdnZXIiOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRyaWdnZXIgZnJvbSBhbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGpvYk5hbWUgVGhlIGpvYiBuYW1lLgotICAgICAqIEBwYXJhbSBqb2JHcm91cCBUaGUgam9iIGdyb3VwLgotICAgICAqIEByZXR1cm4gQSB0cmlnZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJpZ2dlciBjcmVhdGVUcmlnZ2VyKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGpvYk5hbWUsIFN0cmluZyBqb2JHcm91cCkgewotICAgICAgICBpZiAoIWVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJ0cmlnZ2VyIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0cmlnZ2VyVHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFRSSUdHRVJfVFlQRSk7Ci0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBTY2hlZHVsZXJTdG9yZS5nZXROYW1lc3BhY2VIZWxwZXIoKTsKLQotICAgICAgICAvLyBTaW1wbGVUcmlnZ2VyCi0gICAgICAgIGlmICh0cmlnZ2VyVHlwZS5lcXVhbHMoT05DRSkpIHsKLSAgICAgICAgICAgIEVsZW1lbnRbXSBwYXJhbWV0ZXJFbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbihlbGVtZW50LCAicGFyYW1ldGVyIik7Ci0gICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBkYXRlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcmFtZXRlckVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcmFtZXRlckVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLQotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhZRUFSKSkgewotICAgICAgICAgICAgICAgICAgICBkYXRlLnNldChDYWxlbmRhci5ZRUFSLCBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKE1PTlRIKSkgewotICAgICAgICAgICAgICAgICAgICBkYXRlLnNldChDYWxlbmRhci5NT05USCwgSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoREFZKSkgewotICAgICAgICAgICAgICAgICAgICBkYXRlLnNldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoSE9VUikpIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0ZS5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoTUlOVVRFKSkgewotICAgICAgICAgICAgICAgICAgICBkYXRlLnNldChDYWxlbmRhci5NSU5VVEUsIEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoSE9VUikpIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0ZS5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTaW1wbGVUcmlnZ2VyKGpvYk5hbWUsIGpvYkdyb3VwLCBkYXRlLmdldFRpbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcm9uVHJpZ2dlcgotICAgICAgICBpZiAodHJpZ2dlclR5cGUuZXF1YWxzKFJFUEVBVEVEKSkgewotICAgICAgICAgICAgRWxlbWVudFtdIHBhcmFtZXRlckVsZW1lbnRzID0gaGVscGVyLmdldENoaWxkcmVuKGVsZW1lbnQsICJwYXJhbWV0ZXIiKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyYW1ldGVyRWxlbWVudHNbMF0uZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJhbWV0ZXJFbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0gICAgICAgICAgICBTdHJpbmcgY3Jvbl9leHByZXNzaW9uOwotCi0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoQ1JPTl9FWFBSRVNTSU9OKSkgewotICAgICAgICAgICAgICAgIGNyb25fZXhwcmVzc2lvbiA9IHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjcm9uX2V4cHJlc3Npb24gPSAiNDUgKiAqICogKiA/IjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNyb25UcmlnZ2VyKGpvYk5hbWUsIGpvYkdyb3VwLCBjcm9uX2V4cHJlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJpZ2dlciB0eXBlICciICsgdHJpZ2dlclR5cGUgKyAiJyBub3QgZGVmaW5lZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdW5pcXVlIHRyaWdnZXIgSUQuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjcmVhdGVVbmlxdWVUcmlnZ2VySWQoKSB7Ci0gICAgICAgIHJldHVybiAidHJpZ2dlcl8iICsgaWQrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc2ltcGxlIHRyaWdnZXIuCi0gICAgICogQHBhcmFtIGpvYk5hbWUgVGhlIGpvYiBuYW1lLgotICAgICAqIEBwYXJhbSBqb2JHcm91cCBUaGUgam9iIGdyb3VwLgotICAgICAqIEBwYXJhbSBkYXRlIFRoZSB0cmlnZ2VyIGRhdGUuCi0gICAgICogQHJldHVybiBUaGUgdHJpZ2dlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJpZ2dlciBjcmVhdGVTaW1wbGVUcmlnZ2VyKFN0cmluZyBqb2JOYW1lLCBTdHJpbmcgam9iR3JvdXAsIERhdGUgZGF0ZSkgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRyaWdnZXIoY3JlYXRlVW5pcXVlVHJpZ2dlcklkKCksICJ0cmlnZ2VyR3JvdXAxIiwgam9iTmFtZSwgam9iR3JvdXAsIGRhdGUsCi0gICAgICAgICAgICBudWxsLCAwLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY3JvbiB0cmlnZ2VyLgotICAgICAqIEBwYXJhbSBqb2JOYW1lIFRoZSBqb2IgbmFtZS4KLSAgICAgKiBAcGFyYW0gam9iR3JvdXAgVGhlIGpvYiBncm91cC4KLSAgICAgKiBAcGFyYW0gY3Jvbl9leHByZXNzaW9uIFNlY29uZHMsIE1pbnV0ZXMsIEhvdXJzLCBEYXkgb2YgTW9udGgsIE1vbnRocywgRGF5IG9mIFdlZWsgKGUuZy4gMzQKLSAgICAgKiAgICAgICAgPykKLSAgICAgKiBAcmV0dXJuIEEgdHJpZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyaWdnZXIgY3JlYXRlQ3JvblRyaWdnZXIoU3RyaW5nIGpvYk5hbWUsIFN0cmluZyBqb2JHcm91cCwgU3RyaW5nIGNyb25fZXhwcmVzc2lvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDcm9uVHJpZ2dlcihjcmVhdGVVbmlxdWVUcmlnZ2VySWQoKSwgInRyaWdnZXJHcm91cDEiLCBqb2JOYW1lLCBqb2JHcm91cCwKLSAgICAgICAgICAgICAgICBjcm9uX2V4cHJlc3Npb24pOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIi5jcmVhdGVDcm9uVHJpZ2dlcigpOiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIFhNTCBlbGVtZW50IGNvbnRhaW5pbmcgdHJpZ2dlciBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcGFyYW0gaGVscGVyIFRoZSBuYW1lc3BhY2UgaGVscGVyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gdHJpZ2dlciBUaGUgdHJpZ2dlci4KLSAgICAgKiBAcmV0dXJuIEFuIFhNTCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIFRyaWdnZXIgdHJpZ2dlcikgewotICAgICAgICBFbGVtZW50IHRyaWdnZXJFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoInRyaWdnZXIiKTsKLSAgICAgICAgdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgT05DRSk7Ci0KLSAgICAgICAgaWYgKHRyaWdnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRyaWdnZXJFbGVtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgc3RhcnRUaW1lID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgIHN0YXJ0VGltZS5zZXRUaW1lKHRyaWdnZXIuZ2V0U3RhcnRUaW1lKCkpOwotCi0gICAgICAgIEVsZW1lbnQgeWVhckVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgicGFyYW1ldGVyIik7Ci0gICAgICAgIHllYXJFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIFlFQVIpOwotICAgICAgICB5ZWFyRWxlbWVudC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhzdGFydFRpbWUuZ2V0KENhbGVuZGFyLllFQVIpKSk7Ci0gICAgICAgIHRyaWdnZXJFbGVtZW50LmFwcGVuZENoaWxkKHllYXJFbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IG1vbnRoRWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KCJwYXJhbWV0ZXIiKTsKLSAgICAgICAgbW9udGhFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIE1PTlRIKTsKLSAgICAgICAgbW9udGhFbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0VGltZS5nZXQoQ2FsZW5kYXIuTU9OVEgpICsgMSkpOwotICAgICAgICB0cmlnZ2VyRWxlbWVudC5hcHBlbmRDaGlsZChtb250aEVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgZGF5RWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KCJwYXJhbWV0ZXIiKTsKLSAgICAgICAgZGF5RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBEQVkpOwotICAgICAgICBkYXlFbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0VGltZS5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSkpOwotICAgICAgICB0cmlnZ2VyRWxlbWVudC5hcHBlbmRDaGlsZChkYXlFbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IGhvdXJFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoInBhcmFtZXRlciIpOwotICAgICAgICBob3VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBIT1VSKTsKLSAgICAgICAgaG91ckVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcoc3RhcnRUaW1lLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSkpKTsKLSAgICAgICAgdHJpZ2dlckVsZW1lbnQuYXBwZW5kQ2hpbGQoaG91ckVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgbWludXRlRWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KCJwYXJhbWV0ZXIiKTsKLSAgICAgICAgbWludXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBNSU5VVEUpOwotICAgICAgICBtaW51dGVFbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHN0YXJ0VGltZS5nZXQoQ2FsZW5kYXIuTUlOVVRFKSkpOwotICAgICAgICB0cmlnZ2VyRWxlbWVudC5hcHBlbmRDaGlsZChtaW51dGVFbGVtZW50KTsKLQotICAgICAgICByZXR1cm4gdHJpZ2dlckVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIHRoZSBkYXRlIGZyb20gdGhlIHNjaGVkdWxlciBwYXJhbWV0ZXJzLgotICAgICAqIEBwYXJhbSBzY2hlZHVsZXJQYXJhbWV0ZXJzIFRoZSBzY2hlZHVsZXIgcGFyYW1ldGVycy4KLSAgICAgKiBAcmV0dXJuIEEgZGF0ZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEYXRlIGdldERhdGUoTmFtZXNwYWNlTWFwIHNjaGVkdWxlclBhcmFtZXRlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIE5hbWVzcGFjZU1hcCB0cmlnZ2VyUGFyYW1ldGVycyA9Ci0gICAgICAgICAgICBuZXcgTmFtZXNwYWNlTWFwKHNjaGVkdWxlclBhcmFtZXRlcnMuZ2V0TWFwKCksIFBSRUZJWCk7Ci0gICAgICAgIFN0cmluZyBzdGFydERheSA9IChTdHJpbmcpIHRyaWdnZXJQYXJhbWV0ZXJzLmdldChEQVkpOwotICAgICAgICBTdHJpbmcgc3RhcnRNb250aCA9IChTdHJpbmcpIHRyaWdnZXJQYXJhbWV0ZXJzLmdldChNT05USCk7Ci0gICAgICAgIFN0cmluZyBzdGFydFllYXIgPSAoU3RyaW5nKSB0cmlnZ2VyUGFyYW1ldGVycy5nZXQoWUVBUik7Ci0gICAgICAgIFN0cmluZyBzdGFydEhvdXIgPSAoU3RyaW5nKSB0cmlnZ2VyUGFyYW1ldGVycy5nZXQoSE9VUik7Ci0gICAgICAgIFN0cmluZyBzdGFydE1pbiA9IChTdHJpbmcpIHRyaWdnZXJQYXJhbWV0ZXJzLmdldChNSU5VVEUpOwotCi0gICAgICAgIERhdGUgc3RhcnRUaW1lID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gTW9udGggdmFsdWUgaXMgMC1iYXNlZAotICAgICAgICAgICAgc3RhcnRUaW1lID0KLSAgICAgICAgICAgICAgICBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoCi0gICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoc3RhcnRZZWFyKSwKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChzdGFydE1vbnRoKSAtIDEsCi0gICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoc3RhcnREYXkpLAotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHN0YXJ0SG91ciksCi0gICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoc3RhcnRNaW4pKQotICAgICAgICAgICAgICAgICAgICAuZ2V0VGltZSgpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKAotICAgICAgICAgICAgICAgICJOdW1iZXJGb3JtYXRFeGNlcHRpb24gd2l0aCBwYXJhbWV0ZXJzICIKLSAgICAgICAgICAgICAgICAgICAgKyAic3RhcnRZZWFyLCBzdGFydE1vbnRoLCBzdGFydERheSwgc3RhcnRIb3VyLCBzdGFydE1pbjogIgotICAgICAgICAgICAgICAgICAgICArIHN0YXJ0RGF5Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgIgotICAgICAgICAgICAgICAgICAgICArIHN0YXJ0TW9udGgKLSAgICAgICAgICAgICAgICAgICAgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgc3RhcnREYXkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgc3RhcnRIb3VyCi0gICAgICAgICAgICAgICAgICAgICsgIiwgIgotICAgICAgICAgICAgICAgICAgICArIHN0YXJ0TWluLAotICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJQYXJzaW5nIHNjaGVkdWxpbmcgZGF0ZS90aW1lIGZhaWxlZCEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhcnRUaW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9BYnN0cmFjdFRhc2suamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svQWJzdHJhY3RUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOWNhNWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9BYnN0cmFjdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlY2xhc3MgZm9yIFRhc2sKLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFzayBpbXBsZW1lbnRzIFRhc2sgewotICAgIHByaXZhdGUgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlcnMoKTsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0VGFzaygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgZ2V0U2VydmljZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHBhcmFtZXRlcnMgb2YgdGhlIHRhc2sKLSAgICAgKiBAcmV0dXJuIFRoZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFyYW1ldGVycygpOwotICAgICAgICBwYXJhbXMgPSBwYXJhbXMubWVyZ2UodGhpcy5wYXJhbWV0ZXJzKTsKLQotICAgICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGFyYW1ldGVycwotICAgICAqIEBwYXJhbSBfcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVycwotICAgICAqIEB0aHJvd3MgUGFyYW1ldGVyRXhjZXB0aW9uIGlmIHRoZSBwYXJhbWV0cml6aW5nIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyYW1ldGVyaXplKFBhcmFtZXRlcnMgX3BhcmFtZXRlcnMpIHRocm93cyBQYXJhbWV0ZXJFeGNlcHRpb24gewotICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnMubWVyZ2UoX3BhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbGFiZWwgb2YgdGhlIHRhc2sKLSAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZXN1bHQgPSBTVUNDRVNTOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrLlRhc2sjZ2V0UmVzdWx0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlc3VsdCBvZiB0aGlzIHRhc2suCi0gICAgICogQHBhcmFtIF9yZXN1bHQgQW4gaW50ZWdlciAoe0BsaW5rIFRhc2sjU1VDQ0VTU30sIHtAbGluayBUYXNrI0ZBSUxVUkV9KS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXN1bHQoaW50IF9yZXN1bHQpIHsKLSAgICAgICAgdGhpcy5yZXN1bHQgPSBfcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svQW50VGFzay5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9BbnRUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYTlkMGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9BbnRUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuYW50LkxlbnlhUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5YbWxMb2dnZXI7Ci0KLS8qKgotICogQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBleGVjdXRlIEFudCB0YXNrcy4gVGhlIHRhc2sgcGFyYW1ldGVycyBhcmU6Ci0gKiAKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT48c3Ryb25nPnB1YmxpY2F0aW9uLWlkPC9zdHJvbmc+PC9jb2RlPjogdGhlIHB1YmxpY2F0aW9uIElEPC9saT4KLSAqIDxsaT48Y29kZT48c3Ryb25nPmJ1aWxkZmlsZTwvc3Ryb25nPiAob3B0aW9uYWwpPC9jb2RlPjogdGhlIGxvY2F0aW9uIG9mIHRoZSBidWlsZCBmaWxlCi0gKiByZWxhdGl2ZSB0byB0aGUgcHVibGljYXRpb24gZGlyZWN0b3J5LiBJZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcHJvdmlkZWQsIHRoZSBmaWxlIGlzIGxvYWRlZCBmcm9tCi0gKiB7QGxpbmsgI0RFRkFVTFRfQlVJTERGSUxFfS48L2xpPgotICogPGxpPjxjb2RlPjxzdHJvbmc+dGFyZ2V0PC9zdHJvbmc+IChvcHRpb25hbCk8L2NvZGU+OiB0aGUgYnVpbGQgdGFyZ2V0LiBJZiB0aGlzIHBhcmFtZXRlciBpcwotICogbm90IHByb3ZpZGVkLCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgZXhlY3V0ZWQuPC9saT4KLSAqIDxsaT48Y29kZT48c3Ryb25nPmFudC4qPC9zdHJvbmc+PC9jb2RlPjogdGhlIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzIGZvciBBbnQgPHN0cm9uZz4obm90Ci0gKiBpbXBsZW1lbnRlZCB5ZXQhKSA8L3N0cm9uZz48L2xpPgotICogPGxpPjxjb2RlPjxzdHJvbmc+cHJvcGVydGllcy4qPC9zdHJvbmc+PC9jb2RlPjogdGhlIHByb2plY3QgcHJvcGVydGllczwvbGk+Ci0gKiA8L3VsPgotICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB1c2VjYXNlIGZyYW1ld29yayBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgQW50VGFzayBleHRlbmRzIEFic3RyYWN0VGFzayB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgYW4gQW50IHRhcmdldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVpbGRGaWxlIFRoZSBidWlsZCBYTUwgZmlsZS4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdG8gZXhlY3V0ZS4KLSAgICAgKiBAcGFyYW0gYXJndW1lbnRzIEEgbWFwIG1hcHBpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gdGhlaXIgdmFsdWVzLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIEEgbWFwIG1hcHBpbmcgdGhlIHByb2plY3QgcHJvcGVydGllcyB0byB0aGVpciB2YWx1ZXMuCi0gICAgICogQHBhcmFtIHNlcnZsZXRDb250ZXh0UGF0aCBUaGUgY29udGV4dC1wYXRoIG9mIHRoZSBzZXJ2bGV0Ci0gICAgICogQHBhcmFtIGNvbnRleHRQcmVmaXggVGhlIGNvbnRleHQtcHJlZml4IG9mIHRoZSBzZXJ2bGV0Ci0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uSWQgVGhlIHB1YmxpY2F0aW9uLWlkCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uRGlyZWN0b3J5IFRoZSBkaXJlY3Rvcnkgb2YgdGhlIHB1YmxpY2F0aW9uCi0gICAgICogQHBhcmFtIGxvZ0ZpbGUgVGhlIGZpbGUgd2hlcmUgdGhlIGxvZyBzaG91bGQgZ28gdG8KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0aW9uIGZhaWxlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVBbnRUYXJnZXQoU3RyaW5nIHNlcnZsZXRDb250ZXh0UGF0aCwgU3RyaW5nIGNvbnRleHRQcmVmaXgsCi0gICAgICAgICAgICBTdHJpbmcgcHVibGljYXRpb25JZCwgRmlsZSBwdWJsaWNhdGlvbkRpcmVjdG9yeSwgRmlsZSBidWlsZEZpbGUsIFN0cmluZyB0YXJnZXQsCi0gICAgICAgICAgICBNYXAgYXJndW1lbnRzLCBNYXAgcHJvcGVydGllcywgRmlsZSBsb2dGaWxlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gbmV3IExlbnlhUHJvamVjdChnZXRTZXJ2aWNlTWFuYWdlcigpKTsKLSAgICAgICAgcHJvamVjdC5zZXRDb3JlTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgVGhyb3dhYmxlIGVycm9yID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRhc2sgbG9nIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gICAgICAgICAgICBGaWxlIGxvZ0RpcmVjdG9yeSA9IGxvZ0ZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCi0gICAgICAgICAgICBpZiAoIWxvZ0RpcmVjdG9yeS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGxvZ0RpcmVjdG9yeS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvamVjdC5zZXRVc2VyUHJvcGVydHkoIlhtbExvZ2dlci5maWxlIiwgbG9nRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgIFhtbExvZ2dlciBsb2dnZXIgPSBuZXcgWG1sTG9nZ2VyKCk7Ci0gICAgICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobG9nZ2VyKTsKLSAgICAgICAgICAgIHByb2plY3QuZmlyZUJ1aWxkU3RhcnRlZCgpOwotCi0gICAgICAgICAgICBwcm9qZWN0LmluaXQoKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0QmFzZURpcihwdWJsaWNhdGlvbkRpcmVjdG9yeSk7Ci0KLSAgICAgICAgICAgIFByb2plY3RIZWxwZXIgaGVscGVyID0gUHJvamVjdEhlbHBlci5nZXRQcm9qZWN0SGVscGVyKCk7Ci0gICAgICAgICAgICBoZWxwZXIucGFyc2UocHJvamVjdCwgYnVpbGRGaWxlKTsKLQotICAgICAgICAgICAgcHJvamVjdC5zZXRVc2VyUHJvcGVydHkoUFVCTElDQVRJT05fRElSRUNUT1JZLCBwdWJsaWNhdGlvbkRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eShQVUJMSUNBVElPTl9JRCwgcHVibGljYXRpb25JZCk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eShTRVJWTEVUX0NPTlRFWFRfUEFUSCwgc2VydmxldENvbnRleHRQYXRoKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KENPTlRFWFRfUFJFRklYLCBjb250ZXh0UHJlZml4KTsKLQotICAgICAgICAgICAgU3RyaW5nIGtleTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBwcm9qZWN0LmdldERlZmF1bHRUYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGVycm9yID0gZTsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmZpcmVCdWlsZEZpbmlzaGVkKGVycm9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGVuYW1lIG9mIHRoZSBsb2dmaWxlIHRvIHdyaXRlLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbkRpcmVjdG9yeSBmb3Igd2hpY2ggcHVibGljYXRpb24gdGhlIGZpbGVuYW1lIG9mIHRoZSBsb2dmaWxlIGlzIHJlcXVlc3RlZAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGxvZyBmaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0RGVmYXVsdExvZ0ZpbGUoRmlsZSBwdWJsaWNhdGlvbkRpcmVjdG9yeSkgewotICAgICAgICBDYWxlbmRhciBub3cgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLQotICAgICAgICByZXR1cm4gbmV3IEZpbGUocHVibGljYXRpb25EaXJlY3RvcnksIExPR19QQVRIICsgZGF0ZUZvcm1hdC5mb3JtYXQobm93LmdldFRpbWUoKSkgKyAiLnhtbCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxjb2RlPmRhdGVGb3JtYXQ8L2NvZGU+IFRoZSBkYXRlIGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQtSEgtbW0tc3MtU1NTIik7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+UFVCTElDQVRJT05fRElSRUNUT1JZPC9jb2RlPiBUaGUgcHVibGljYXRpb24gZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDQVRJT05fRElSRUNUT1JZID0gInB1Yi5kaXIiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlBVQkxJQ0FUSU9OX0lEPC9jb2RlPiBUaGUgcHVibGljYXRpb24gaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNBVElPTl9JRCA9ICJwdWIuaWQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlNFUlZMRVRfQ09OVEVYVF9QQVRIPC9jb2RlPiBUaGUgc2VydmxldCBjb250ZXh0IHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0NPTlRFWFRfUEFUSCA9ICJzZXJ2bGV0LmNvbnRleHQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkNPTlRFWFRfUFJFRklYPC9jb2RlPiBUaGUgY29udGV4dCBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1BSRUZJWCA9ICJjb250ZXh0LnByZWZpeCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+QlVJTERGSUxFPC9jb2RlPiBUaGUgYnVpbGQgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERklMRSA9ICJidWlsZGZpbGUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlRBUkdFVDwvY29kZT4gVGhlIHRhcmdldAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVCA9ICJ0YXJnZXQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkFOVF9QUkVGSVg8L2NvZGU+IFRoZSBhbnQgcHJlZml4Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1BSRUZJWCA9ICJhbnQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlBST1BFUlRJRVNfUFJFRklYPC9jb2RlPiBUaGUgcHJvcGVydGllcyBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX1BSRUZJWCA9ICJwcm9wZXJ0aWVzIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ERUZBVUxUX0JVSUxERklMRTwvY29kZT4gVGhlIGRlZmF1bHQgYnVpbGQgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQlVJTERGSUxFID0gImNvbmZpZy90YXNrcy90YXJnZXRzLnhtbCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+TE9HX1BBVEg8L2NvZGU+IFRoZSBsb2cgcGF0aAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19QQVRIID0gImxvZ3MvdGFza3MvIi5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfTE9HRklMRTwvY29kZT4gVGhlIGxvZyBmaWxlIHBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9MT0dGSUxFID0gImxvZ2ZpbGUiOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgdGFzay4gQWxsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gc2V0IHdpdGggcGFyYW1ldGVyaXplKCkuCi0gICAgICogQHBhcmFtIHNlcnZsZXRDb250ZXh0UGF0aCBUaGUgc2VydmxldCBjb250ZXh0IHBhdGguCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gd2hlbiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFN0cmluZyBzZXJ2bGV0Q29udGV4dFBhdGgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHVibGljYXRpb25JZDsKLSAgICAgICAgRmlsZSBwdWJsaWNhdGlvbkRpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIGNvbnRleHRQcmVmaXg7Ci0gICAgICAgIEZpbGUgYnVpbGRGaWxlOwotICAgICAgICBTdHJpbmcgdGFyZ2V0OwotICAgICAgICBNYXAgYXJndW1lbnRzOwotICAgICAgICBNYXAgcHJvcGVydGllczsKLSAgICAgICAgRmlsZSBsb2dGaWxlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgYnVpbGRGaWxlTmFtZSA9IGdldFBhcmFtZXRlcnMoKS5nZXRQYXJhbWV0ZXIoImJ1aWxkZmlsZSIsIERFRkFVTFRfQlVJTERGSUxFKQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLSAgICAgICAgICAgIHB1YmxpY2F0aW9uSWQgPSBnZXRQYXJhbWV0ZXJzKCkuZ2V0UGFyYW1ldGVyKFBBUkFNRVRFUl9QVUJMSUNBVElPTl9JRCk7Ci0gICAgICAgICAgICBjb250ZXh0UHJlZml4ID0gZ2V0UGFyYW1ldGVycygpLmdldFBhcmFtZXRlcihQQVJBTUVURVJfQ09OVEVYVF9QUkVGSVgpOwotCi0gICAgICAgICAgICBpZiAocHVibGljYXRpb25JZC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljYXRpb25EaXJlY3RvcnkgPSBuZXcgRmlsZSgiLiIpOwotICAgICAgICAgICAgICAgIGJ1aWxkRmlsZSA9IG5ldyBGaWxlKGJ1aWxkRmlsZU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQdWJsaXNoaW5nRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBuZXcgUHVibGlzaGluZ0Vudmlyb25tZW50KHNlcnZsZXRDb250ZXh0UGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uSWQpOwotICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uRGlyZWN0b3J5ID0gZW52aXJvbm1lbnQuZ2V0UHVibGljYXRpb25EaXJlY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBidWlsZEZpbGUgPSBuZXcgRmlsZShwdWJsaWNhdGlvbkRpcmVjdG9yeSwgYnVpbGRGaWxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhcmdldCA9IGdldFBhcmFtZXRlcnMoKS5nZXRQYXJhbWV0ZXIoVEFSR0VULCBudWxsKTsKLQotICAgICAgICAgICAgTWFwIHBhcmFtZXRlcnNNYXAgPSBQYXJhbWV0ZXJzLnRvUHJvcGVydGllcyhnZXRQYXJhbWV0ZXJzKCkpOwotCi0gICAgICAgICAgICBOYW1lc3BhY2VNYXAgYW50TWFwID0gbmV3IE5hbWVzcGFjZU1hcChwYXJhbWV0ZXJzTWFwLCBBTlRfUFJFRklYKTsKLSAgICAgICAgICAgIGFyZ3VtZW50cyA9IGFudE1hcC5nZXRNYXAoKTsKLQotICAgICAgICAgICAgTmFtZXNwYWNlTWFwIHByb3BlcnRpZXNNYXAgPSBuZXcgTmFtZXNwYWNlTWFwKHBhcmFtZXRlcnNNYXAsIFBST1BFUlRJRVNfUFJFRklYKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzTWFwLmdldE1hcCgpOwotCi0gICAgICAgICAgICAvLyBzZXQgbG9nZmlsZQotICAgICAgICAgICAgU3RyaW5nIGxvZ0ZpbGVuYW1lID0gZ2V0UGFyYW1ldGVycygpLmdldFBhcmFtZXRlcihQQVJBTUVURVJfTE9HRklMRSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdExvZ0ZpbGUocHVibGljYXRpb25EaXJlY3RvcnkpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIGxvZ0ZpbGUgPSBuZXcgRmlsZShsb2dGaWxlbmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcmFtZXRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhlY3V0ZUFudFRhcmdldChzZXJ2bGV0Q29udGV4dFBhdGgsCi0gICAgICAgICAgICAgICAgY29udGV4dFByZWZpeCwKLSAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbklkLAotICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgIGJ1aWxkRmlsZSwKLSAgICAgICAgICAgICAgICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgYXJndW1lbnRzLAotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgbG9nRmlsZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svQ29tbWFuZExpbmVUYXNrLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL0NvbW1hbmRMaW5lVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDMwOTYyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svQ29tbWFuZExpbmVUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrOwotCi0vKioKLSAqIEEgY29tbWFuZCBsaW5lIHRhc2sKLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lVGFzayBleHRlbmRzIEFic3RyYWN0VGFzayB7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSB0YXNrLiBBbGwgcGFyYW1ldGVycyBtdXN0IGhhdmUgYmVlbiBzZXQgd2l0aCBwYXJhbWV0ZXJpemUoKS4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2suVGFzayNleGVjdXRlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShTdHJpbmcgcGF0aCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb21tYW5kID0gZ2V0UGFyYW1ldGVycygpLmdldFBhcmFtZXRlcigiY29tbWFuZCIsCi0gICAgICAgICAgICAgICAgImVjaG8gXCJFeGNlcHRpb246IE5vIGNvbW1hbmQgcGFyYW1ldGVyXCIiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvY2VzcyBwcm9jZXNzID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kKTsKLQotICAgICAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgICAgIGludCBieXRlc19yZWFkID0gMDsKLSAgICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNfcmVhZCA9IGluLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBiYW91dC53cml0ZShidWZmZXIsIDAsIGJ5dGVzX3JlYWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYmFvdXQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCIlJSVJbnB1dFN0cmVhbTpTIiArIGJhb3V0LnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkVORDpJbnB1dFN0cmVhbSUlJSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtIGluX2UgPSBwcm9jZXNzLmdldEVycm9yU3RyZWFtKCk7Ci0gICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW91dF9lID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNfcmVhZCA9IGluX2UucmVhZChidWZmZXIpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGJhb3V0X2Uud3JpdGUoYnVmZmVyLCAwLCBieXRlc19yZWFkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJhb3V0X2UudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCIjIyNFcnJvclN0cmVhbTpTVEFSVCIgKyBiYW91dF9lLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkVORDpFcnJvclN0cmVhbSMjIyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL0RlZmF1bHRUYXNrV3JhcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9EZWZhdWx0VGFza1dyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0MTI5Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL0RlZmF1bHRUYXNrV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2s7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLk5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCB0YXNrIHdyYXBwZXIKLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRUYXNrV3JhcHBlciBpbXBsZW1lbnRzIFRhc2tXcmFwcGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERlZmF1bHRUYXNrV3JhcHBlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFRhc2tXcmFwcGVyUGFyYW1ldGVycyB3cmFwcGVyUGFyYW1ldGVycyA9IG5ldyBUYXNrV3JhcHBlclBhcmFtZXRlcnMoZ2V0UGFyYW1ldGVyT2JqZWN0KCkpOwotICAgIHByaXZhdGUgVGFza1BhcmFtZXRlcnMgdGFza1BhcmFtZXRlcnM7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGN0b3IgZm9yIHN1YmNsYXNzZXMuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlciB0byB1c2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERlZmF1bHRUYXNrV3JhcHBlcihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIHRoaXMudGFza1BhcmFtZXRlcnMgPSBuZXcgVGFza1BhcmFtZXRlcnMoZ2V0UGFyYW1ldGVyT2JqZWN0KCksIG1hbmFnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IgdG8gYmUgY2FsbGVkIHdoZW4gYWxsIHRhc2sgd3JhcHBlciBwYXJhbWV0ZXJzIGFyZSBrbm93bi4gQWxsIGtleXMgYW5kIHZhbHVlcyBtdXN0IGJlCi0gICAgICogc3RyaW5ncyBvciBzdHJpbmcgYXJyYXlzLgotICAgICAqIEBwYXJhbSBfcGFyYW1ldGVycyBUaGUgcHJlZml4ZWQgcGFyYW1ldGVycy4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdFRhc2tXcmFwcGVyKE1hcCBfcGFyYW1ldGVycywgU2VydmljZU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICB0aGlzKG1hbmFnZXIpOwotICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIik7Ci0KLSAgICAgICAgTGlzdCBrZXlzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcGFyYW1ldGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGtleXMuYWRkKGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGtleXMpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGtleXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZU9iamVjdCA9IF9wYXJhbWV0ZXJzLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoKFN0cmluZykgdmFsdWVPYmplY3QpLnRyaW0oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSAoU3RyaW5nW10pIHZhbHVlT2JqZWN0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqID4gMCAmJiAhIiIuZXF1YWxzKGJ1Zi50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmFsdWVzW2pdLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vdCBhIHN0cmluZyB2YWx1ZTogWyIgKyBrZXkgKyAiXSA9IFsiICsgdmFsdWVPYmplY3QgKyAiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YWx1ZSA9IGJ1Zi50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgcGFyYW1ldGVyOiBbIiArIGtleSArICJdID0gWyIgKyB2YWx1ZSArICJdIik7Ci0gICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4gUmVzdG9yZXMgdGhlIHdyYXBwZXIgcGFyYW1ldGVycyBmcm9tIGFuIFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGUgdGFzayB3cmFwcGVyIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGhlbHBlciBUaGUgbmFtZXNwYWNlIGhlbHBlciBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRUYXNrV3JhcHBlcihOYW1lc3BhY2VIZWxwZXIgaGVscGVyLCBFbGVtZW50IHBhcmVudCkgewotICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIik7Ci0gICAgICAgIHJlc3RvcmUoaGVscGVyLCBwYXJlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSB0YXNrIHdyYXBwZXIuCi0gICAgICogQHBhcmFtIHRhc2tJZCBUaGUgdGFzayBJRC4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSB3ZWJhcHBVcmwgVGhlIHdlYmFwcCBVUkwuCi0gICAgICogQHBhcmFtIF9wYXJhbWV0ZXJzIFRoZSB0YXNrIHBhcmFtZXRlcnMuCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gd2hlbiB0aGUgdGFzayBJRCBpcyBudWxsLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHRhc2tJZCwgUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyB3ZWJhcHBVcmwsCi0gICAgICAgICAgICBQYXJhbWV0ZXJzIF9wYXJhbWV0ZXJzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmRlYnVnKCJJbml0aWFsaXppbmciKTsKLQotICAgICAgICBpZiAodGFza0lkLmVxdWFscygiIikpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgZ2V0VGFza1BhcmFtZXRlcnMoKS5zZXRQdWJsaWNhdGlvbihwdWJsaWNhdGlvbik7Ci0gICAgICAgIGdldFdyYXBwZXJQYXJhbWV0ZXJzKCkuc2V0V2ViYXBwVXJsKHdlYmFwcFVybCk7Ci0KLSAgICAgICAgZ2V0V3JhcHBlclBhcmFtZXRlcnMoKS5zZXRUYXNrSWQodGFza0lkKTsKLSAgICAgICAgZ2V0VGFza1BhcmFtZXRlcnMoKS5wYXJhbWV0ZXJpemUoX3BhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIHRoZSB0YXNrIHBhcmFtZXRlcnMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0cy4KLSAgICAgKiBAcGFyYW0gX3BhcmFtZXRlcnMgQSBwYXJhbWV0ZXJzIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gQSBwdWJsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBBIHJlcXVlc3QuCi0gICAgICogQHJldHVybiBBIHBhcmFtZXRlcnMgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBQYXJhbWV0ZXJzIGV4dHJhY3RUYXNrUGFyYW1ldGVycyhQYXJhbWV0ZXJzIF9wYXJhbWV0ZXJzLCBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBQYXJhbWV0ZXJzIF90YXNrUGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIF90YXNrUGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoVGFzay5QQVJBTUVURVJfU0VSVkxFVF9DT05URVhULAotICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBfdGFza1BhcmFtZXRlcnMuc2V0UGFyYW1ldGVyKFRhc2suUEFSQU1FVEVSX0NPTlRFWFRfUFJFRklYLCByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpOwotICAgICAgICBfdGFza1BhcmFtZXRlcnMuc2V0UGFyYW1ldGVyKFRhc2suUEFSQU1FVEVSX1NFUlZFUl9QT1JULAotICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcocmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkpKTsKLSAgICAgICAgX3Rhc2tQYXJhbWV0ZXJzLnNldFBhcmFtZXRlcihUYXNrLlBBUkFNRVRFUl9TRVJWRVJfVVJJLCAiaHR0cDovLyIgKyByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSk7Ci0gICAgICAgIF90YXNrUGFyYW1ldGVycy5zZXRQYXJhbWV0ZXIoVGFzay5QQVJBTUVURVJfUFVCTElDQVRJT05fSUQsIHB1YmxpY2F0aW9uLmdldElkKCkpOwotCi0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfdGFza1BhcmFtZXRlcnMuc2V0UGFyYW1ldGVyKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBfcGFyYW1ldGVycy5nZXROYW1lcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gX3BhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKG5hbWUsICIiKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX3Rhc2tQYXJhbWV0ZXJzLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF90YXNrUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIHdvcmtmbG93IHRyYW5zaXRpb24gaW52b2NhdGlvbi4KLSAgICAgKiBAcGFyYW0gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lLgotICAgICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgaWRlbnRpdHkgdGhhdCBleGVjdXRlcyB0aGUgdGFzay4KLSAgICAgKiBAcGFyYW0gcm9sZXMgVGhlIHJvbGVzIG9mIHRoZSBpZGVudGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZmxvd0F3YXJlKFN0cmluZyBldmVudE5hbWUsIElkZW50aXR5IGlkZW50aXR5LCBSb2xlW10gcm9sZXMpIHsKLSAgICAgICAgTmFtZXNwYWNlTWFwIHdvcmtmbG93UGFyYW1ldGVycyA9IFdvcmtmbG93SW52b2tlci5leHRyYWN0UGFyYW1ldGVycyhldmVudE5hbWUsCi0gICAgICAgICAgICAgICAgaWRlbnRpdHksCi0gICAgICAgICAgICAgICAgcm9sZXMpOwotICAgICAgICBnZXRQYXJhbWV0ZXJPYmplY3QoKS5wdXRBbGwod29ya2Zsb3dQYXJhbWV0ZXJzLmdldFByZWZpeGVkTWFwKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB0YXNrSWQgPSBnZXRXcmFwcGVyUGFyYW1ldGVycygpLmdldFRhc2tJZCgpOwotCi0gICAgICAgIGlmICh0YXNrSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiTm8gdGFzayBpZCBwcm92aWRlZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICBsb2cuaW5mbygiIEV4ZWN1dGluZyB0YXNrIFsiICsgdGFza0lkICsgIl0iKTsKLSAgICAgICAgbG9nLmluZm8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0KLSAgICAgICAgaWYgKCF0aGlzLndyYXBwZXJQYXJhbWV0ZXJzLmlzQ29tcGxldGUoKSkgewotCi0gICAgICAgICAgICBTdHJpbmdbXSBtaXNzaW5nS2V5cyA9IGdldFdyYXBwZXJQYXJhbWV0ZXJzKCkuZ2V0TWlzc2luZ0tleXMoKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ0tleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAga2V5U3RyaW5nICs9ICIsICI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGtleVN0cmluZyArPSBtaXNzaW5nS2V5c1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlBhcmFtZXRlcnMgbWlzc2luZzogWyIgKyBrZXlTdHJpbmcgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGFza01hbmFnZXIgbWFuYWdlcjsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGdldFRhc2tQYXJhbWV0ZXJzKCkuZ2V0UHVibGljYXRpb24oKTsKLQotICAgICAgICBXb3JrZmxvd0ludm9rZXIgd29ya2Zsb3dJbnZva2VyID0gbmV3IFdvcmtmbG93SW52b2tlcihnZXRQYXJhbWV0ZXJzKCksIHRoaXMubWFuYWdlcik7Ci0gICAgICAgIHdvcmtmbG93SW52b2tlci5zZXR1cChwdWJsaWNhdGlvbiwgZ2V0V3JhcHBlclBhcmFtZXRlcnMoKS5nZXRXZWJhcHBVcmwoKSk7Ci0KLSAgICAgICAgVGFzayB0YXNrOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFuYWdlciA9IG5ldyBUYXNrTWFuYWdlcihwdWJsaWNhdGlvbi5nZXREaXJlY3RvcnkoKS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgICAgIHRhc2sgPSBtYW5hZ2VyLmdldFRhc2sodGFza0lkKTsKLQotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0QWxsKGdldFRhc2tQYXJhbWV0ZXJzKCkuZ2V0TWFwKCkpOwotICAgICAgICAgICAgUGFyYW1ldGVycyBfcGFyYW1ldGVycyA9IFBhcmFtZXRlcnMuZnJvbVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIHRhc2sucGFyYW1ldGVyaXplKF9wYXJhbWV0ZXJzKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJhbWV0ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBsb2cuZGVidWcoIiBUcmlnZ2VyaW5nIHdvcmtmbG93Iik7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICAvLyBGSVhNRSBUaGUgbmV3IHdvcmtmbG93IGlzIHNldCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgdHJhbnNpdGlvbiBiZWNhdXNlIHRoZSBkb2N1bWVudCBpZAotICAgICAgICAvLyBhbmQgc28gdGhlIGRvY3VtZW50IGFyZSBzb21ldGltZXMgY2hhbmdpbmcgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIChleCBhcmNoaXZpbmcgLCAuLi4pCi0gICAgICAgIHdvcmtmbG93SW52b2tlci5pbnZva2VUcmFuc2l0aW9uKCk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBsb2cuZGVidWcoIiBUcmlnZ2VyaW5nIHRhc2siKTsKLSAgICAgICAgbG9nLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIHRhc2suZXhlY3V0ZShwdWJsaWNhdGlvbi5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBsb2cuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIGxvZy5kZWJ1ZygiIFRyaWdnZXJpbmcgbm90aWZpY2F0aW9uIik7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgTm90aWZpZXIgbm90aWZpZXIgPSBuZXcgTm90aWZpZXIobWFuYWdlciwgZ2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgbm90aWZpZXIuc2VuZE5vdGlmaWNhdGlvbihnZXRUYXNrUGFyYW1ldGVycygpKTsKLQotICAgICAgICBsb2cuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIGxvZy5kZWJ1ZygiIEV4ZWN1dGluZyB0YXNrIGZpbmlzaGVkLiIpOwotICAgICAgICBsb2cuZGVidWcoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhc2sgd3JhcHBlciBwYXJhbWV0ZXJzLgotICAgICAqIEByZXR1cm4gQSB0YXNrIHdyYXBwZXIgcGFyYW1ldGVycyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFRhc2tXcmFwcGVyUGFyYW1ldGVycyBnZXRXcmFwcGVyUGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGFzayBwYXJhbWV0ZXJzLgotICAgICAqIEByZXR1cm4gQSB0YXNrIHBhcmFtZXRlcnMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBUYXNrUGFyYW1ldGVycyBnZXRUYXNrUGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGFza1BhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQVNLID0gInRhc2siOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFSQU1FVEVSID0gInBhcmFtZXRlciI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAibmFtZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFID0gInZhbHVlIjsKLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSB3cmFwcGVyIHBhcmFtZXRlcnMgdG8gYW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGhlbHBlciBUaGUgbmFtZXNwYWNlIGhlbHBlciBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBbiBYTUwgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBzYXZlKE5hbWVzcGFjZUhlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jdW1lbnQgPSBoZWxwZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgTmFtZXNwYWNlSGVscGVyIHRhc2tIZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKFRhc2suTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgIFRhc2suREVGQVVMVF9QUkVGSVgsCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSB0YXNrSGVscGVyLmNyZWF0ZUVsZW1lbnQoRUxFTUVOVF9UQVNLKTsKLQotICAgICAgICBMaXN0IGtleXMgPSBuZXcgQXJyYXlMaXN0KGdldFBhcmFtZXRlcnMoKS5rZXlTZXQoKSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoa2V5cyk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0ga2V5cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IHRhc2tIZWxwZXIuY3JlYXRlRWxlbWVudChFTEVNRU5UX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwga2V5KTsKLSAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9WQUxVRSwgKFN0cmluZykgZ2V0UGFyYW1ldGVycygpLmdldChrZXkpKTsKLSAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlcyB0aGUgd3JhcHBlciBwYXJhbWV0ZXJzIGZyb20gYW4gWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoZSB0YXNrIHdyYXBwZXIgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gaGVscGVyIFRoZSBuYW1lc3BhY2UgaGVscGVyIG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlKE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEVsZW1lbnQgcGFyZW50KSB7Ci0gICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvY3VtZW50ID0gaGVscGVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgIE5hbWVzcGFjZUhlbHBlciB0YXNrSGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihUYXNrLk5BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBUYXNrLkRFRkFVTFRfUFJFRklYLAotICAgICAgICAgICAgICAgIGRvY3VtZW50KTsKLSAgICAgICAgRWxlbWVudCB0YXNrRWxlbWVudCA9IHRhc2tIZWxwZXIuZ2V0Rmlyc3RDaGlsZChwYXJlbnQsIEVMRU1FTlRfVEFTSyk7Ci0gICAgICAgIEVsZW1lbnRbXSBwYXJhbWV0ZXJFbGVtZW50cyA9IHRhc2tIZWxwZXIuZ2V0Q2hpbGRyZW4odGFza0VsZW1lbnQsIEVMRU1FTlRfUEFSQU1FVEVSKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhcmFtZXRlckVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJhbWV0ZXJFbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgICAgIGdldFBhcmFtZXRlck9iamVjdCgpLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHByZWZpeGVkIHBhcmFtZXRlcnMuCi0gICAgICogQHJldHVybiBBIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodGhpcy5wYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBwcmVmaXhlZCBwYXJhbWV0ZXJzLgotICAgICAqIEByZXR1cm4gQSBtYXAuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRQYXJhbWV0ZXJPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbm90aWZpY2F0aW9uIHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIG5vdGlmaWNhdGlvblBhcmFtZXRlcnMgVGhlIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE5vdGlmeWluZyhOYW1lc3BhY2VNYXAgbm90aWZpY2F0aW9uUGFyYW1ldGVycykgewotICAgICAgICBsb2cuaW5mbygiRW5hYmxpbmcgbm90aWZpY2F0aW9uIik7Ci0gICAgICAgIGdldFBhcmFtZXRlck9iamVjdCgpLnB1dEFsbChub3RpZmljYXRpb25QYXJhbWV0ZXJzLmdldFByZWZpeGVkTWFwKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9FbXB0eVRhc2suamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svRW1wdHlUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmM1ZWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9FbXB0eVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2s7Ci0KLS8qKgotICogVGhlIGVtcHR5IHRhc2sKLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGNsYXNzIEVtcHR5VGFzayBleHRlbmRzIEFic3RyYWN0VGFzayB7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2suVGFzayNleGVjdXRlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShTdHJpbmcgc2VydmxldENvbnRleHRQYXRoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL0V4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDBlMTYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrOwotCi0vKioKLSAqIEFuIEV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYSB0YXNrIGV4ZWN1dGlvbi4KLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGNsYXNzIEV4ZWN1dGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBFeGVjdXRpb25FeGNlcHRpb24gKi8KLSAgICBwdWJsaWMgRXhlY3V0aW9uRXhjZXB0aW9uKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBFeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBleGNlcHRpb24gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBleGNlcHRpb24gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9IZWxsb1dvcmxkVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9IZWxsb1dvcmxkVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ5MDczLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svSGVsbG9Xb3JsZFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2s7Ci0KLS8qKgotICogQSBzaW1wbGUgdGFzayB0byBkZW1vbnN0cmF0ZSB0aGUgdGFzayBiZWhhdmlvdXIuIEl0IG91dHB1dHMgYSBzdHJpbmcgdG8gdGhlIGxvZzRqIGxvZyBmaWxlLiBUaGUKLSAqIGZvbGxvd2luZyBwYXJhbWV0ZXIgY2FuIGJlIHByb3ZpZGVkOjxici8gPjxjb2RlPjxzdHJvbmc+dGV4dDwvc3Ryb25nPjwvY29kZT46IHRoZSBzdHJpbmcgdG8KLSAqIGJlIHByaW50ZWQ8YnIvID4gSWYgdGhlIHBhcmFtZXRlciBpcyBvbWl0dGVkLCAiSGVsbG8gV29ybGQiIGlzIHByaW50ZWQuCi0gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHVzZWNhc2UgZnJhbWV3b3JrIGluc3RlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkVGFzayBleHRlbmRzIEFic3RyYWN0VGFzayB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBIZWxsb1dvcmxkVGFzawotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkVGFzaygpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5UYXNrI2V4ZWN1dGUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFN0cmluZyBwYXRoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svTm90aWZpZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhNjE3YS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL05vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzazsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKLQotLyoqCi0gKiBUYXNrIE5vdGlmaWNhdGlvbgotICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB1c2VjYXNlIGZyYW1ld29yayBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgTm90aWZpZXIgZXh0ZW5kcyBQYXJhbWV0ZXJXcmFwcGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKE5vdGlmaWVyLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPlBSRUZJWDwvY29kZT4gTm90aWZpY2F0aW9uIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAibm90aWZpY2F0aW9uIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5UQVJHRVQ8L2NvZGU+IE5vdGlmaWNhdGlvbiB0YXJnZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVQgPSAibm90aWZpY2F0aW9uIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfVE88L2NvZGU+IFRvIFBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9UTyA9ICJ0b2xpc3QiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlBBUkFNRVRFUl9GUk9NPC9jb2RlPiBGcm9tIFBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9GUk9NID0gImZyb20iOwotCi0gICAgcHJpdmF0ZSBUYXNrTWFuYWdlciB0YXNrTWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIF90YXNrTWFuYWdlciBUaGUgdGFzayBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSB0YXNrIHdyYXBwZXIgcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm90aWZpZXIoVGFza01hbmFnZXIgX3Rhc2tNYW5hZ2VyLCBNYXAgcGFyYW1ldGVycykgewotICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTsKLSAgICAgICAgdGhpcy50YXNrTWFuYWdlciA9IF90YXNrTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHRhc2tQYXJhbWV0ZXJzIFRoZSB0YXNrIHBhcmFtZXRlcnMuCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kTm90aWZpY2F0aW9uKFRhc2tQYXJhbWV0ZXJzIHRhc2tQYXJhbWV0ZXJzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoZ2V0TWFwKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiTm90IHNlbmRpbmcgbm90aWZpY2F0aW9uOiBubyBwYXJhbWV0ZXJzIHByb3ZpZGVkLiIpOwotICAgICAgICB9IGVsc2UgaWYgKCIiLmVxdWFscyhnZXQoUEFSQU1FVEVSX1RPKS50cmltKCkpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiTm90IHNlbmRpbmcgbm90aWZpY2F0aW9uOiBlbXB0eSBub3RpZmljYXRpb24udG9saXN0IHBhcmFtZXRlci4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJTZW5kaW5nIG5vdGlmaWNhdGlvbiIpOwotCi0gICAgICAgICAgICBUYXNrIHRhc2sgPSB0aGlzLnRhc2tNYW5hZ2VyLmdldFRhc2soVGFza01hbmFnZXIuQU5UX1RBU0spOwotCi0gICAgICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgICAgIHBhcmFtcy5zZXRQYXJhbWV0ZXIoQW50VGFzay5UQVJHRVQsIFRBUkdFVCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGtleXMgPSB7IFRhc2suUEFSQU1FVEVSX1BVQkxJQ0FUSU9OX0lELCBUYXNrLlBBUkFNRVRFUl9DT05URVhUX1BSRUZJWCwKLSAgICAgICAgICAgICAgICAgICAgVGFzay5QQVJBTUVURVJfU0VSVkVSX1BPUlQsIFRhc2suUEFSQU1FVEVSX1NFUlZFUl9VUkksCi0gICAgICAgICAgICAgICAgICAgIFRhc2suUEFSQU1FVEVSX1NFUlZMRVRfQ09OVEVYVCB9OwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwYXJhbXMuc2V0UGFyYW1ldGVyKGtleXNbaV0sIHRhc2tQYXJhbWV0ZXJzLmdldChrZXlzW2ldKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE5hbWVzcGFjZU1hcCBtYWlsTWFwID0gbmV3IE5hbWVzcGFjZU1hcChQUkVGSVgpOwotICAgICAgICAgICAgbWFpbE1hcC5wdXRBbGwoZ2V0TWFwKCkpOwotICAgICAgICAgICAgTmFtZXNwYWNlTWFwIHByb3BlcnRpZXNNYXAgPSBuZXcgTmFtZXNwYWNlTWFwKEFudFRhc2suUFJPUEVSVElFU19QUkVGSVgpOwotICAgICAgICAgICAgcHJvcGVydGllc01hcC5wdXRBbGwobWFpbE1hcC5nZXRQcmVmaXhlZE1hcCgpKTsKLQotICAgICAgICAgICAgTWFwIHByZWZpeE1hcCA9IHByb3BlcnRpZXNNYXAuZ2V0UHJlZml4ZWRNYXAoKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWU7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByZWZpeE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0cmltbWVkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKChjaGFyKSAxNjAsICcgJyk7Ci0gICAgICAgICAgICAgICAgdHJpbW1lZFZhbHVlID0gdHJpbW1lZFZhbHVlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcmltbWluZyB2YWx1ZSBbIiArIHZhbHVlICsgIl0gdG8gWyIgKyB0cmltbWVkVmFsdWUgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZpcnN0IGNoYXJhY3RlcjogWyIgKyB2YWx1ZS5jaGFyQXQoMCkgKyAiXSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoaW50KSB2YWx1ZS5jaGFyQXQoMCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXJhbXMuc2V0UGFyYW1ldGVyKGtleSwgdHJpbW1lZFZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0YXNrLnBhcmFtZXRlcml6ZShwYXJhbXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nLmluZm8oIiAgICBFeGVjdXRpbmcgbm90aWZpY2F0aW9uIHRhcmdldCAuLi4iKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFzay5leGVjdXRlKHRhc2tQYXJhbWV0ZXJzLmdldChUYXNrLlBBUkFNRVRFUl9TRVJWTEVUX0NPTlRFWFQpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciBkdXJpbmcgbm90aWZpY2F0aW9uOiAiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5pbmZvKCIgICAgTm90aWZpY2F0aW9uIHRhcmdldCBleGVjdXRlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhc2sgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIEEgdGFzayBtYW5hZ2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUYXNrTWFuYWdlciBnZXRUYXNrTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGFza01hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrLlBhcmFtZXRlcldyYXBwZXIjZ2V0UHJlZml4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIFBSRUZJWDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2suUGFyYW1ldGVyV3JhcHBlciNnZXRSZXF1aXJlZEtleXMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZXF1aXJlZEtleXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHJlcXVpcmVkS2V5cyA9IHt9OwotICAgICAgICByZXR1cm4gcmVxdWlyZWRLZXlzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9QYXJhbWV0ZXJXcmFwcGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL1BhcmFtZXRlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4YWIyMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL1BhcmFtZXRlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwotCi0vKioKLSAqIFBhcmFtZXRlciB3cmFwcGVyIGNsYXNzCi0gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHVzZWNhc2UgZnJhbWV3b3JrIGluc3RlYWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXJhbWV0ZXJXcmFwcGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBhcmFtZXRlcldyYXBwZXIuY2xhc3MpOwotICAgIHByaXZhdGUgTmFtZXNwYWNlTWFwIHBhcmFtZXRlcnM7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1bi1wcmVmaXhlZCBwYXJhbWV0ZXJzLgotICAgICAqIEByZXR1cm4gQSBtYXAuCi0gICAgICovCi0gICAgcHVibGljIE1hcCBnZXRNYXAoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlcnMuZ2V0TWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gcHJlZml4ZWRQYXJhbWV0ZXJzIFRoZSBwcmVmaXhlZCBwYXJhbWV0ZXJzIHRvIHdyYXAuCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlcldyYXBwZXIoTWFwIHByZWZpeGVkUGFyYW1ldGVycykgewotICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBuZXcgTmFtZXNwYWNlTWFwKHByZWZpeGVkUGFyYW1ldGVycywgZ2V0UHJlZml4KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXguCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByZWZpeCgpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGtleS12YWx1ZSBwYWlyLiBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgbm8gcGFpciBpcyBhZGRlZC4KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgcGFyYW1ldGVyOiBbIiArIGtleSArICJdID0gWyIgKyB2YWx1ZSArICJdIik7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJOb3Qgc2V0dGluZyBwYXJhbWV0ZXI6IFsiICsga2V5ICsgIl0gPSBbIiArIHZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciBhIGtleS4KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCi0gICAgICogQHJldHVybiBUaGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXQoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgdGhpcy5wYXJhbWV0ZXJzLmdldChrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIGtleXMuCi0gICAgICogQHJldHVybiBBIHN0cmluZyBhcnJheS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0UmVxdWlyZWRLZXlzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhpcyBwYXJhbWV0ZXJzIG9iamVjdCBjb250YWlucyBhbGwgbmVjZXNzYXJ5IHBhcmFtZXRlcnMuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBjb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIE1hcCBwYXJhbWV0ZXJNYXAgPSBnZXRNYXAoKTsKLSAgICAgICAgU3RyaW5nW10gcmVxdWlyZWRLZXlzID0gZ2V0UmVxdWlyZWRLZXlzKCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGNvbXBsZXRlICYmIGkgPCByZXF1aXJlZEtleXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIHBhcmFtZXRlcjogWyIgKyByZXF1aXJlZEtleXNbaV0gKyAiXSIpOwotICAgICAgICAgICAgY29tcGxldGUgPSBjb21wbGV0ZSAmJiBwYXJhbWV0ZXJNYXAuY29udGFpbnNLZXkocmVxdWlyZWRLZXlzW2ldKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT0s6IFsiICsgY29tcGxldGUgKyAiXSIpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wbGV0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtaXNzaW5nIHBhcmFtZXRlcnMgcGFyYW1ldGVycy4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNaXNzaW5nS2V5cygpIHsKLSAgICAgICAgU3RyaW5nW10gcmVxdWlyZWRLZXlzID0gZ2V0UmVxdWlyZWRLZXlzKCk7Ci0gICAgICAgIE1hcCBwYXJhbWV0ZXJNYXAgPSBnZXRNYXAoKTsKLSAgICAgICAgTGlzdCBrZXlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkS2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJNYXAuY29udGFpbnNLZXkocmVxdWlyZWRLZXlzW2ldKSkgewotICAgICAgICAgICAgICAgIGtleUxpc3QuYWRkKHJlcXVpcmVkS2V5c1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkga2V5TGlzdC50b0FycmF5KG5ldyBTdHJpbmdba2V5TGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJhbWV0ZXJpemVzIHRoaXMgd3JhcHBlciB3aXRoIHVuLXByZWZpeGVkIHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIF9wYXJhbWV0ZXJzIEEgcGFyYW1ldGVycyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyYW1ldGVyaXplKFBhcmFtZXRlcnMgX3BhcmFtZXRlcnMpIHsKLSAgICAgICAgU3RyaW5nW10ga2V5cyA9IF9wYXJhbWV0ZXJzLmdldE5hbWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcHV0KGtleXNbaV0sIF9wYXJhbWV0ZXJzLmdldFBhcmFtZXRlcihrZXlzW2ldLCBudWxsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmRlOGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcml6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLQotLyoqCi0gKiBBIFRhc2sgaXMgYSBjb21tYW5kIHRoYXQgY2FuIGJlIGV4ZWN1dGVkLiA8YnIvPgotICogV2hlbiBhIFRhc2sgaXMgZXhlY3V0ZWQgZnJvbSBhIFRhc2tBY3Rpb24gb3IgaW5pdGlhbGl6ZWQgZnJvbSBhIFRhc2tKb2IsIHRoZSBkZWZhdWx0Ci0gKiBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4gPHN0cm9uZz5UaGlzIGlzIG5vdCBhIGNvbnRyYWN0ITwvc3Ryb25nPgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHVzZWNhc2UgZnJhbWV3b3JrIGluc3RlYWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFzayBleHRlbmRzIFBhcmFtZXRlcml6YWJsZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPGNvZGU+TkFNRVNQQUNFPC9jb2RlPiBUaGUgdGFzayBuYW1lc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQU1FU1BBQ0UgPSAiaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3Rhc2svMS4wIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5ERUZBVUxUX1BSRUZJWDwvY29kZT4gVGhlIHRhc2sgbmFtZXNwYWNlIHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUFJFRklYID0gInRhc2siOwotICAgIC8qKgotICAgICAqIDxjb2RlPlNVQ0NFU1M8L2NvZGU+IFN1Y2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVUNDRVNTID0gMDsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5GQUlMVVJFPC9jb2RlPiBGYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRkFJTFVSRSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGF0aCBvZiB0aGUgc2VydmxldAotICAgICAqIGNvbnRleHQ6PGJyLz48Y29kZT4vaG9tZS91c2VyX2lkL2J1aWxkL2pha2FydGEtdG9tY2F0L3dlYmFwcHMvbGVueWFjbXM8L2NvZGU+Ci0gICAgICovCi0gICAgU3RyaW5nIFBBUkFNRVRFUl9TRVJWTEVUX0NPTlRFWFQgPSAic2VydmxldC1jb250ZXh0IjsKLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2ZXIKLSAgICAgKiBVUkk6PGJyLz48Y29kZT48c3Ryb25nPmh0dHA6Ly93d3cueW91cmhvc3QuY29tPC9zdHJvbmc+OjgwODAvbGVueWEvcHVibGljYXRpb24vaW5kZXguaHRtbDwvY29kZT4KLSAgICAgKi8KLSAgICBTdHJpbmcgUEFSQU1FVEVSX1NFUlZFUl9VUkkgPSAic2VydmVyLXVyaSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmVyCi0gICAgICogcG9ydDo8YnIvPjxjb2RlPmh0dHA6Ly93d3cueW91cmhvc3QuY29tOjxzdHJvbmc+ODA4MDwvc3Ryb25nPi9sZW55YS9wdWJsaWNhdGlvbi9pbmRleC5odG1sPC9jb2RlPgotICAgICAqLwotICAgIFN0cmluZyBQQVJBTUVURVJfU0VSVkVSX1BPUlQgPSAic2VydmVyLXBvcnQiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhcnQgb2YgdGhlIFVSSSB0aGF0IHByZWNlZGVzIHRoZSBwdWJsaWNhdGlvbgotICAgICAqIElEOjxici8+PGNvZGU+aHR0cDovL3d3dy55b3VyaG9zdC5jb206ODA4MDxzdHJvbmc+L2xlbnlhPC9zdHJvbmc+L3B1YmxpY2F0aW9uL2luZGV4Lmh0bWw8L2NvZGU+Ci0gICAgICovCi0gICAgU3RyaW5nIFBBUkFNRVRFUl9DT05URVhUX1BSRUZJWCA9ICJjb250ZXh0LXByZWZpeCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHVibGljYXRpb24KLSAgICAgKiBJRDo8YnIvPjxjb2RlPmh0dHA6Ly93d3cueW91cmhvc3QuY29tOjgwODAvbGVueWEvPHN0cm9uZz5wdWJsaWNhdGlvbjwvc3Ryb25nPi9pbmRleC5odG1sPC9jb2RlPgotICAgICAqLwotICAgIFN0cmluZyBQQVJBTUVURVJfUFVCTElDQVRJT05fSUQgPSAicHVibGljYXRpb24taWQiOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgdGFzay4gQWxsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGJlZW4gc2V0IHdpdGggcGFyYW1ldGVyaXplKCkuCi0gICAgICogQHBhcmFtIHNlcnZsZXRDb250ZXh0UGF0aCB0aGUgc2VydmxldC1jb250ZXh0Ci0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhlIGV4ZWN1dGlvbiBmYWlscwotICAgICAqLwotICAgIHZvaWQgZXhlY3V0ZShTdHJpbmcgc2VydmxldENvbnRleHRQYXRoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsYWJlbCB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRhc2suCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbAotICAgICAqLwotICAgIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRhc2sgKHtAbGluayAjU1VDQ0VTU30sIHtAbGluayAjRkFJTFVSRX0pLgotICAgICAqIEByZXR1cm4gI1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsICNGQUlMVVJFIGZvciBmYWlsdXJlCi0gICAgICovCi0gICAgaW50IGdldFJlc3VsdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFBhc3NlcyB0aGUgc2VydmljZSBtYW5hZ2VyIHRvIHRoZSB0YXNrLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICovCi0gICAgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTUwYmUxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svVGFza0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7Ci0KLS8qKgotICogQSBUYXNrIGZhY3RvcnkKLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5UYXNrRmFjdG9yeTwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGFza0ZhY3RvcnkoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUYXNrRmFjdG9yeSBmYWN0b3J5OwotICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRhc2tGYWN0b3J5LmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIEdldCBhbiBpbnN0YW5jZSBvZiB0aGUgdGFzayBmYWN0b3J5Ci0gICAgICogQHJldHVybiBBIHRhc2sgZmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGFza0ZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBuZXcgVGFza0ZhY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHRhc2sKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhc2sKLSAgICAgKiBAcmV0dXJuIFRoZSB0YXNrCi0gICAgICovCi0gICAgcHVibGljIFRhc2sgY3JlYXRlVGFzayhDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKCJjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrLlRhc2tTZXF1ZW5jZSIpOwotICAgICAgICAgICAgQ2xhc3MgY2wgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBUYXNrIHRhc2sgPSAoVGFzaykgY2wubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgdGFzay5zZXRMYWJlbChjb25maWd1cmF0aW9uLmdldENoaWxkKCJsYWJlbCIpLmdldFZhbHVlKCJkZWZhdWx0IHRhc2siKSk7Ci0KLSAgICAgICAgICAgIHRhc2sucGFyYW1ldGVyaXplKFBhcmFtZXRlcnMuZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikpOwotCi0gICAgICAgICAgICBpZiAodGFzayBpbnN0YW5jZW9mIFRhc2tTZXF1ZW5jZSkgewotICAgICAgICAgICAgICAgICgoVGFza1NlcXVlbmNlKSB0YXNrKS5pbml0KGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdGFzazsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGNyZWF0ZSBUYXNrOiAiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGNyZWF0ZSBUYXNrOiAiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGNyZWF0ZSBUYXNrOiAiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGNyZWF0ZSBUYXNrOiAiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGNyZWF0ZSBUYXNrOiAiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWI5MWU3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svVGFza01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgdGFzayBtYW5hZ2VyCi0gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHVzZWNhc2UgZnJhbWV3b3JrIGluc3RlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTWFuYWdlciBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoVGFza01hbmFnZXIuY2xhc3MpOwotICAgIC8qKgotICAgICAqIDxjb2RlPlRBU0tfRUxFTUVOVDwvY29kZT4gVGhlIHRhc2sgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfRUxFTUVOVCA9ICJ0YXNrIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5UQVNLX0lEX0FUVFJJQlVURTwvY29kZT4gVGhlIHRhc2sgaWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19JRF9BVFRSSUJVVEUgPSAiaWQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkNPTkZJR1VSQVRJT05fRklMRTwvY29kZT4gVGhlIHBhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRklMRSA9IEZpbGUuc2VwYXJhdG9yICsgImNvbmZpZyIgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgKyAidGFza3MiICsgRmlsZS5zZXBhcmF0b3IgKyAidGFza3MueGNvbmYiOwotCi0gICAgLyoqCi0gICAgICogPGNvZGU+RU1UUFlfVEFTSzwvY29kZT4gQ29uc3RhbnQgZm9yIGFuIGVtcHR5IHRhc2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVRQWV9UQVNLID0gImVtcHR5IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5BTlRfVEFTSzwvY29kZT4gQ29uc3RhbnQgZm9yIGFuIGFudCB0YXNrCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1RBU0sgPSAiYW50IjsKLQotICAgIC8vIG1hcHMgdGFzay1pZHMgdG8gdGFza3MKLSAgICBwcml2YXRlIE1hcCB0YXNrcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFRhc2tNYW5hZ2VyIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza01hbmFnZXIoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVGFza01hbmFnZXIKLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb25QYXRoIHBhdGggdG8gcHVibGljYXRpb24KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkLgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIHdoZW4gcGFyc2luZyB0aGUgY29uZmlnIGZpbGUgZmFpbGVkLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBhbiBJL08gZXJyb3Igb2NjdXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFza01hbmFnZXIoU3RyaW5nIHB1YmxpY2F0aW9uUGF0aCwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhtYW5hZ2VyKTsKLQotICAgICAgICBTdHJpbmcgY29uZmlndXJhdGlvbkZpbGVQYXRoID0gcHVibGljYXRpb25QYXRoICsgQ09ORklHVVJBVElPTl9GSUxFOwotICAgICAgICBsb2cuZGVidWcoIkxvYWRpbmcgdGFza3M6ICIgKyBjb25maWd1cmF0aW9uRmlsZVBhdGgpOwotCi0gICAgICAgIEZpbGUgY29uZmlndXJhdGlvbkZpbGUgPSBuZXcgRmlsZShjb25maWd1cmF0aW9uRmlsZVBhdGgpOwotCi0gICAgICAgIGlmIChjb25maWd1cmF0aW9uRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyKCk7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBidWlsZGVyLmJ1aWxkRnJvbUZpbGUoY29uZmlndXJhdGlvbkZpbGUpOwotICAgICAgICAgICAgY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVGFzayBjb25maWd1cmF0aW9uIG5vdCBsb2FkZWQgLSBmaWxlIFsiICsgY29uZmlndXJhdGlvbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBkb2VzIG5vdCBleGlzdC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRhc2sgZW1wdHkgPSBuZXcgRW1wdHlUYXNrKCk7Ci0gICAgICAgIGVtcHR5LnNlcnZpY2UodGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgdGhpcy50YXNrcy5wdXQoRU1UUFlfVEFTSywgZW1wdHkpOwotCi0gICAgICAgIFRhc2sgYW50ID0gbmV3IEFudFRhc2soKTsKLSAgICAgICAgYW50LnNlcnZpY2UodGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgdGhpcy50YXNrcy5wdXQoQU5UX1RBU0ssIGFudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGUjY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIHRhc2tzOiIpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0YXNrIGxpc3QKLSAgICAgICAgQ29uZmlndXJhdGlvbltdIHRhc2tDb25maWd1cmF0aW9ucyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGRyZW4oVEFTS19FTEVNRU5UKTsKLQotICAgICAgICAvLyBzZXQgdGFzayBJRHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrQ29uZmlndXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB0YXNrSWQgPSB0YXNrQ29uZmlndXJhdGlvbnNbaV0uZ2V0QXR0cmlidXRlKFRBU0tfSURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgdGFzayAnIiArIHRhc2tJZCArICInIik7Ci0KLSAgICAgICAgICAgIFRhc2sgdGFzayA9IFRhc2tGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlVGFzayh0YXNrQ29uZmlndXJhdGlvbnNbaV0pOwotICAgICAgICAgICAgdGFzay5zZXJ2aWNlKHRoaXMubWFuYWdlcik7Ci0gICAgICAgICAgICB0aGlzLnRhc2tzLnB1dCh0YXNrSWQsIHRhc2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCB0YXNrIGlkcwotICAgICAqIEByZXR1cm4gVGhlIHRhc2sgaWRzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFRhc2tJZHMoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHRoaXMudGFza3Mua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW3RoaXMudGFza3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0YXNrIHdpdGggYSBnaXZlbiB0YXNrLWlkCi0gICAgICogQHBhcmFtIHRhc2tJZCB0aGUgdGFzay1pZCBvZiB0aGUgcmVxdWVzdGVkIHRhc2sKLSAgICAgKiBAcmV0dXJuIHRoZSB0YXNrCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gdGFzayB3aXRoIHRoZSBnaXZlbiB0YXNrLWlkLgotICAgICAqLwotICAgIHB1YmxpYyBUYXNrIGdldFRhc2soU3RyaW5nIHRhc2tJZCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghdGhpcy50YXNrcy5jb250YWluc0tleSh0YXNrSWQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJUYXNrIHdpdGggSUQgJyIgKyB0YXNrSWQgKyAiJyBub3QgZm91bmQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFRhc2spIHRoaXMudGFza3MuZ2V0KHRhc2tJZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrUGFyYW1ldGVycy5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzYxMTI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svVGFza1BhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKiAgCi0gKi8KLQotLyogJElkJCAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25VdGlsOwotCi0vKioKLSAqIFRhc2sgUGFyYW1ldGVycwotICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB1c2VjYXNlIGZyYW1ld29yayBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgVGFza1BhcmFtZXRlcnMgZXh0ZW5kcyBQYXJhbWV0ZXJXcmFwcGVyIHsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5SRVFVSVJFRF9LRVlTPC9jb2RlPiBSZXF1aXJlZCB0YXNrIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFUVVJUkVEX0tFWVMgPSB7IFRhc2suUEFSQU1FVEVSX1NFUlZMRVRfQ09OVEVYVCwKLSAgICAgICAgICAgIFRhc2suUEFSQU1FVEVSX1NFUlZFUl9VUkksIFRhc2suUEFSQU1FVEVSX1NFUlZFUl9QT1JULCBUYXNrLlBBUkFNRVRFUl9DT05URVhUX1BSRUZJWCwKLSAgICAgICAgICAgIFRhc2suUEFSQU1FVEVSX1BVQkxJQ0FUSU9OX0lEIH07Ci0gICAgLyoqCi0gICAgICogPGNvZGU+UFJFRklYPC9jb2RlPiBUaGUgdGFzayBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAidGFzayI7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBwcmVmaXhlZFBhcmFtZXRlcnMgVGhlIHByZWZpeGVkIHBhcmFtZXRlcnMgLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIFRhc2tQYXJhbWV0ZXJzKE1hcCBwcmVmaXhlZFBhcmFtZXRlcnMsIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIocHJlZml4ZWRQYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2suUGFyYW1ldGVyV3JhcHBlciNnZXRQcmVmaXgoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gUFJFRklYOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5QYXJhbWV0ZXJXcmFwcGVyI2dldFJlcXVpcmVkS2V5cygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJlcXVpcmVkS2V5cygpIHsKLSAgICAgICAgcmV0dXJuIFJFUVVJUkVEX0tFWVM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHVibGljYXRpb24uCi0gICAgICogQHJldHVybiBBIHB1YmxpY2F0aW9uLgotICAgICAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHVibGljYXRpb24gPSBQdWJsaWNhdGlvblV0aWwuZ2V0UHVibGljYXRpb24odGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICBnZXQoVGFzay5QQVJBTUVURVJfUFVCTElDQVRJT05fSUQpKTsKLSAgICAgICAgfSBjYXRjaCAoUHVibGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHVibGljYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uIEEgcHVibGljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHVibGljYXRpb24oUHVibGljYXRpb24gcHVibGljYXRpb24pIHsKLSAgICAgICAgcHV0KFRhc2suUEFSQU1FVEVSX1BVQkxJQ0FUSU9OX0lELCBwdWJsaWNhdGlvbi5nZXRJZCgpKTsKLSAgICAgICAgcHV0KFRhc2suUEFSQU1FVEVSX1NFUlZMRVRfQ09OVEVYVCwgcHVibGljYXRpb24uZ2V0U2VydmxldENvbnRleHQoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2VydmxldCBjb250ZXh0IHBhdGguCi0gICAgICogQHBhcmFtIHNlcnZsZXRDb250ZXh0UGF0aCBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0Q29udGV4dFBhdGgoU3RyaW5nIHNlcnZsZXRDb250ZXh0UGF0aCkgewotICAgICAgICBwdXQoVGFzay5QQVJBTUVURVJfU0VSVkxFVF9DT05URVhULCBzZXJ2bGV0Q29udGV4dFBhdGgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrU2VxdWVuY2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLWxlZ2FjeS90YXNrL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3Rhc2svVGFza1NlcXVlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYTE3YjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrU2VxdWVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwotCi0vKioKLSAqIEEgVGFza1NlcXVlbmNlIGNvbnRhaW5zIG9mIG11bHRpcGxlIHRhc2tzIHRoYXQgYXJlIGV4ZWN1dGVkIHN1Y2Nlc3NpdmVseS4KLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tTZXF1ZW5jZSBleHRlbmRzIEFic3RyYWN0VGFzayB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoVGFza1NlcXVlbmNlLmNsYXNzKTsKLQotICAgIC8vIGtlZXBzIHRoZSB0YXNrIG9yZGVyCi0gICAgcHJpdmF0ZSBUYXNrW10gdGFza3M7Ci0gICAgcHJpdmF0ZSBUYXNrTWFuYWdlciB0YXNrTWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIHRhc2sKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzLnRhc2tNYW5hZ2VyID0gbmV3IFRhc2tNYW5hZ2VyKGdldFNlcnZpY2VNYW5hZ2VyKCkpOwotICAgICAgICB0aGlzLnRhc2tNYW5hZ2VyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGFzayBsaXN0Ci0gICAgICAgIENvbmZpZ3VyYXRpb25bXSB0YXNrQ29uZmlndXJhdGlvbnMgPSBjb25maWd1cmF0aW9uLmdldENoaWxkcmVuKFRhc2tNYW5hZ2VyLlRBU0tfRUxFTUVOVCk7Ci0gICAgICAgIHRoaXMudGFza3MgPSBuZXcgVGFza1t0YXNrQ29uZmlndXJhdGlvbnMubGVuZ3RoXTsKLQotICAgICAgICAvLyBzZXQgdGFzayBJRHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRhc2tzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGFza0lkID0gdGFza0NvbmZpZ3VyYXRpb25zW2ldLmdldEF0dHJpYnV0ZShUYXNrTWFuYWdlci5UQVNLX0lEX0FUVFJJQlVURSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50YXNrc1tpXSA9IHRoaXMudGFza01hbmFnZXIuZ2V0VGFzayh0YXNrSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiU2VxdWVuY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgdGFzayAnIiArIHRhc2tJZCArICInIHRvIHNlcXVlbmNlLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGFza3MgaW4gdGhpcyBzZXF1ZW5jZS4KLSAgICAgKiBAcmV0dXJuIFRoZSB0YXNrcwotICAgICAqLwotICAgIHB1YmxpYyBUYXNrW10gZ2V0VGFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoVGFza1tdKSB0aGlzLnRhc2tzLmNsb25lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVGFza01hbmFnZXIgdGhhdCBpcyB1c2VkIHRvIG1hbmFnZSB0aGUgdGFza3Mgb2YgdGhpcyBUYXNrU2VxdWVuY2UuCi0gICAgICogQHJldHVybiBUaGUgdGFzayBtYW5hZ2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhc2tNYW5hZ2VyIGdldFRhc2tNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGhpcy50YXNrTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJRCBvZiBhIHNwZWNpZmljIFRhc2suCi0gICAgICogQHBhcmFtIHRhc2sgdGhlIHNwZWNpZmljIHRhc2sgZm9yIHdoaWNoIHRoZSB0YXNrIGlkIGlzIHJlcXVlc3RlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSB0YXNrIGlkIG9mIHRoZSBnaXZlbiB0YXNrCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhlIHRhc2sgY291bGQgbm90IGJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFza0lkKFRhc2sgdGFzaykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIHRhc2tJZHMgPSBnZXRUYXNrTWFuYWdlcigpLmdldFRhc2tJZHMoKTsKLQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRhc2tJZHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChnZXRUYXNrTWFuYWdlcigpLmdldFRhc2sodGFza0lkc1tqXSkgPT0gdGFzaykgewotICAgICAgICAgICAgICAgIHJldHVybiB0YXNrSWRzW2pdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGFzay1JRCBmb3IgIiArIHRhc2sgKyAiIG5vdCBmb3VuZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgdGFza3MuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIHRhc2tzCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhlIGV4ZWN1dGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoU3RyaW5nIHBhdGgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUYXNrW10gX3Rhc2tzID0gZ2V0VGFza3MoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdGFza3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUYXNrIHRhc2sgPSBfdGFza3NbaV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhc2tJZCA9IGdldFRhc2tJZCh0YXNrKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4ZWN1dGluZyB0YXNrICciICsgdGFza0lkICsgIiciKTsKLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0YXNrIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzIHRhc2tQYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IGdldFBhcmFtZXRlcnMoKS5nZXROYW1lcygpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgcGFySW5kZXggPSAwOyBwYXJJbmRleCA8IG5hbWVzLmxlbmd0aDsgcGFySW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW3BhckluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VQYXJhbWV0ZXIgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VQYXJhbWV0ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tQYXJhbWV0ZXJzLnNldFBhcmFtZXRlcihuYW1lLCBnZXRQYXJhbWV0ZXJzKCkuZ2V0UGFyYW1ldGVyKG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGFzawotICAgICAgICAgICAgICAgIHRhc2sucGFyYW1ldGVyaXplKHRhc2tQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgICAgICB0YXNrLmV4ZWN1dGUocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBleGVjdXRlIFRhc2tTZXF1ZW5jZTogIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJhbWV0ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZXhlY3V0ZSBUYXNrU2VxdWVuY2U6ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGV4ZWN1dGUgVGFza1NlcXVlbmNlOiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL1Rhc2tXcmFwcGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL1Rhc2tXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTcyNTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZCQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzazsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIFRhc2tXcmFwcGVyIGVuY2Fwc3VsYXRlcyBhbGwgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWVkZWQgdG8gZXhlY3V0ZSBhIGNlcnRhaW4gdGFzaywgaW5jbHVkaW5nCi0gKiBlLmcuIHdvcmtmbG93IGFuZCBub3RpZmljYXRpb24gcGFyYW1ldGVycy4KLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrV3JhcHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KLSAgICAgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgd3JhcHBlciBwYXJhbWV0ZXJzIHRvIGFuIFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBoZWxwZXIgVGhlIG5hbWVzcGFjZSBoZWxwZXIgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQW4gWE1MIGVsZW1lbnQuCi0gICAgICovCi0gICAgRWxlbWVudCBzYXZlKE5hbWVzcGFjZUhlbHBlciBoZWxwZXIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGhlbHBlciBUaGUgbmFtZXNwYWNlIGhlbHBlciBvZiB0aGUgZG9jdW1lbnQuIFJlc3RvcmVzIHRoZSB3cmFwcGVyIHBhcmFtZXRlcnMgZnJvbSBhbgotICAgICAqICAgICAgICAgICAgWE1MIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgQW4gWE1MIGVsZW1lbnQuCi0gICAgICovCi0gICAgdm9pZCByZXN0b3JlKE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEVsZW1lbnQgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXNrIHdyYXBwZXIgcGFyYW1ldGVycy4KLSAgICAgKiBAcmV0dXJuIEEgbWFwLgotICAgICAqLwotICAgIE1hcCBnZXRQYXJhbWV0ZXJzKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL1Rhc2tXcmFwcGVyUGFyYW1ldGVycy5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9UYXNrV3JhcHBlclBhcmFtZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2YzRjYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL1Rhc2tXcmFwcGVyUGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSB0YXNrIHdyYXBwZXIgcGFyYW1ldGVycwotICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB1c2VjYXNlIGZyYW1ld29yayBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgVGFza1dyYXBwZXJQYXJhbWV0ZXJzIGV4dGVuZHMgUGFyYW1ldGVyV3JhcHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5UQVNLX0lEPC9jb2RlPiBUaGUgdGFzayBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfSUQgPSAidGFzay1pZCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+V0VCQVBQX1VSTDwvY29kZT4gVGhlIHdlYmFwcCBVUkwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJBUFBfVVJMID0gIndlYmFwcC11cmwiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlBSRUZJWDwvY29kZT4gVGhlIHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJ3cmFwcGVyIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVRVUlSRURfS0VZUyA9IHsgVEFTS19JRCwgV0VCQVBQX1VSTCB9OwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyIG1hcCB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIFRhc2tXcmFwcGVyUGFyYW1ldGVycyhNYXAgcGFyYW1ldGVycykgewotICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXF1aXJlZCBrZXlzLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFJlcXVpcmVkS2V5cygpIHsKLSAgICAgICAgcmV0dXJuIFJFUVVJUkVEX0tFWVM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGFzayBJRC4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFza0lkKCkgewotICAgICAgICByZXR1cm4gZ2V0KFRBU0tfSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdlYmFwcCBVUkwuCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdlYmFwcFVybCgpIHsKLSAgICAgICAgcmV0dXJuIGdldChXRUJBUFBfVVJMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3ZWJhcHAgVVJMLgotICAgICAqIEBwYXJhbSB1cmwgQSB1cmwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2ViYXBwVXJsKFN0cmluZyB1cmwpIHsKLSAgICAgICAgcHV0KFdFQkFQUF9VUkwsIHVybCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGFzayBJRC4KLSAgICAgKiBAcGFyYW0gdGFza0lkIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhc2tJZChTdHJpbmcgdGFza0lkKSB7Ci0gICAgICAgIHB1dChUQVNLX0lELCB0YXNrSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudGFzay5QYXJhbWV0ZXJXcmFwcGVyI2dldFByZWZpeCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBQUkVGSVg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL1dvcmtmbG93SW52b2tlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtbGVnYWN5L3Rhc2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdGFzay9Xb3JrZmxvd0ludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmYWQ1Yy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1sZWdhY3kvdGFzay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy90YXNrL1dvcmtmbG93SW52b2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCi0gKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICogIAotICovCi0KLS8qICRJZCQgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQ29uc29sZUxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuTWFjaGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuV29ya2Zsb3dVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5OYW1lc3BhY2VNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7Ci0KLS8qKgotICogVGhlIHdvcmtmbG93IGludm9rZXIKLSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgaW5zdGVhZC4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtmbG93SW52b2tlciBleHRlbmRzIFBhcmFtZXRlcldyYXBwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoV29ya2Zsb3dJbnZva2VyLmNsYXNzKTsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5ST0xFUzwvY29kZT4gVGhlIHJvbGVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVMgPSAicm9sZXMiOwotICAgIC8qKgotICAgICAqIDxjb2RlPlVTRVJfSUQ8L2NvZGU+IFRoZSB1c2VyIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9JRCA9ICJ1c2VyLWlkIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5NQUNISU5FPC9jb2RlPiBUaGUgbWFjaGluZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BQ0hJTkUgPSAibWFjaGluZSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+RVZFTlQ8L2NvZGU+IFRoZSBldmVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UID0gImV2ZW50IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5QUkVGSVg8L2NvZGU+IFRoZSB3b3JrZmxvdyBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIndvcmtmbG93IjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5FVkVOVF9SRVFVRVNUX1BBUkFNRVRFUjwvY29kZT4gVGhlIHdvcmtmbG93IGV2ZW50IHJlcXVlc3QgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfUkVRVUVTVF9QQVJBTUVURVIgPSAid29ya2Zsb3cuZXZlbnQiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkxFTllBX0VWRU5UX1JFUVVFU1RfUEFSQU1FVEVSPC9jb2RlPiBUaGUgTGVueWEgZXZlbnQgcmVxdWVzdCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRU5ZQV9FVkVOVF9SRVFVRVNUX1BBUkFNRVRFUiA9ICJsZW55YS5ldmVudCI7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUuCi0gICAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBpZGVudGl0eS4KLSAgICAgKiBAcGFyYW0gcm9sZXMgVGhlIHJvbGVzLgotICAgICAqIEByZXR1cm4gQSBuYW1lc3BhY2UgbWFwIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOYW1lc3BhY2VNYXAgZXh0cmFjdFBhcmFtZXRlcnMoU3RyaW5nIGV2ZW50TmFtZSwgSWRlbnRpdHkgaWRlbnRpdHksIFJvbGVbXSByb2xlcykgewotICAgICAgICBOYW1lc3BhY2VNYXAgcGFyYW1ldGVycyA9IG5ldyBOYW1lc3BhY2VNYXAoUFJFRklYKTsKLSAgICAgICAgbG9nLmRlYnVnKCJFeHRyYWN0aWduIHdvcmtmbG93IGludm9rZXIgcGFyYW1ldGVycy4iKTsKLSAgICAgICAgbG9nLmRlYnVnKCIgICAgRXZlbnQ6IFsiICsgZXZlbnROYW1lICsgIl0iKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoRVZFTlQsIGV2ZW50TmFtZSk7Ci0gICAgICAgIHNldFJvbGVzKHBhcmFtZXRlcnMsIHJvbGVzKTsKLSAgICAgICAgc2V0SWRlbnRpdHkocGFyYW1ldGVycywgaWRlbnRpdHkpOwotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEEgbWFwIGNvbnRhaW5pbmcgdGhlIHByZWZpeGVkIHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgV29ya2Zsb3dJbnZva2VyKE1hcCBwYXJhbWV0ZXJzLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpOwotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvbGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBBIHN0cmluZyBhcnJheS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Um9sZUlEcygpIHsKLSAgICAgICAgU3RyaW5nIHJvbGVzU3RyaW5nID0gZ2V0KFJPTEVTKTsKLSAgICAgICAgU3RyaW5nW10gcm9sZUlEcyA9IHJvbGVzU3RyaW5nLnNwbGl0KCIsIik7Ci0gICAgICAgIHJldHVybiByb2xlSURzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJvbGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEEgd29ya2Zsb3cgaW52b2tlciBuYW1lc3BhY2UgbWFwLgotICAgICAqIEBwYXJhbSByb2xlcyBBIHJvbGUgYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVzKE5hbWVzcGFjZU1hcCBwYXJhbWV0ZXJzLCBSb2xlW10gcm9sZXMpIHsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHJvbGVzW2ldLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByb2xlU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFJPTEVTLCByb2xlU3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpZGVudGl0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBIHdvcmtmbG93IGludm9rZXIgbmFtZXNwYWNlIG1hcC4KLSAgICAgKiBAcGFyYW0gaWRlbnRpdHkgQW4gaWRlbnRpdHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElkZW50aXR5KE5hbWVzcGFjZU1hcCBwYXJhbWV0ZXJzLCBJZGVudGl0eSBpZGVudGl0eSkgewotCi0gICAgICAgIFN0cmluZyB1c2VySWQgPSAiIjsKLSAgICAgICAgVXNlciB1c2VyID0gaWRlbnRpdHkuZ2V0VXNlcigpOwotICAgICAgICBpZiAodXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1c2VySWQgPSB1c2VyLmdldElkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoVVNFUl9JRCwgdXNlcklkKTsKLQotICAgICAgICBTdHJpbmcgbWFjaGluZUlwID0gIiI7Ci0gICAgICAgIE1hY2hpbmUgbWFjaGluZSA9IGlkZW50aXR5LmdldE1hY2hpbmUoKTsKLSAgICAgICAgaWYgKG1hY2hpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWFjaGluZUlwID0gbWFjaGluZS5nZXRJcCgpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KE1BQ0hJTkUsIG1hY2hpbmVJcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd29ya2Zsb3cgZXZlbnQgbmFtZS4KLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0KEVWRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIElELgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VySWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoVVNFUl9JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFjaGluZSBJUCBhZGRyZXNzLgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNYWNoaW5lSXAoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoTUFDSElORSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSB3b3JrZmxvdyBpbnZva2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIHdlYmFwcFVybCBUaGUgd2ViYXBwIFVSTC4KLSAgICAgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldHVwKFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTdHJpbmcgd2ViYXBwVXJsKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9IGdldEV2ZW50TmFtZSgpOwotICAgICAgICBpZiAoZXZlbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gd29ya2Zsb3cgZXZlbnQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIldvcmtmbG93IGV2ZW50OiBbIiArIGV2ZW50TmFtZSArICJdIik7Ci0gICAgICAgICAgICAvLyBjaGVjayBmb3Igd29ya2Zsb3cgaW5zdGFuY2UgZmlyc3QgKHRhc2sgY2FuIGluaXRpYWxpemUgdGhlIHdvcmtmbG93IGhpc3RvcnkpCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmNyZWF0ZVNlc3Npb24odGhpcy5tYW5hZ2VyLCBudWxsKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50SWRlbnRpdHlNYXAodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50ID0gbWFwLmdldEZyb21VUkwod2ViYXBwVXJsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIHRyYW5zaXRpb24uCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VUcmFuc2l0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmNyZWF0ZVNlc3Npb24odGhpcy5tYW5hZ2VyLCBudWxsKTsKLSAgICAgICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29uc29sZUxvZ2dlcigpLAotICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICBnZXRFdmVudE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy50YXNrLlBhcmFtZXRlcldyYXBwZXIjZ2V0UHJlZml4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIFBSRUZJWDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnRhc2suUGFyYW1ldGVyV3JhcHBlciNnZXRSZXF1aXJlZEtleXMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZXF1aXJlZEtleXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGtleXMgPSB7fTsKLSAgICAgICAgcmV0dXJuIGtleXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvY29uZmlnL2NvY29vbi14Y29uZi9yZXBvc2l0b3J5Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVwb3NpdG9yeS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmNDFmYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvY29uZmlnL2NvY29vbi14Y29uZi9yZXBvc2l0b3J5Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0gIAotICA8IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLSAgCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbiIKLSAgICByZW1vdmU9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ2phdmF4Lmpjci5SZXBvc2l0b3J5J10iCi0gICAgdW5sZXNzPSIvY29jb29uL2NvbXBvbmVudFtAcm9sZSA9ICdqYXZheC5qY3IuUmVwb3NpdG9yeSddW0BjbGFzcyA9ICdvcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3IuTGVueWFSZXBvc2l0b3J5J10iCi0gICAgaWYtcHJvcD0icGF0Y2gud2ViYXBwIj4KLSAgICAKLSAgICA8Y29tcG9uZW50IGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3IuTGVueWFSZXBvc2l0b3J5IiBsb2dnZXI9ImpjciIgcm9sZT0iamF2YXguamNyLlJlcG9zaXRvcnkiPgotICAgICAgPGNyZWRlbnRpYWxzIGxvZ2luPSJhbm9ueW1vdXMiIHBhc3N3b3JkPSIiLz4KLSAgICAgIDxqYWFzIHNyYz0iY29udGV4dDovL2pjci1yZXBvc2l0b3J5L2phYXMuY29uZmlnIi8+Ci0gICAgICA8aG9tZSBzcmM9ImNvbnRleHQ6Ly9qY3ItcmVwb3NpdG9yeS9yZXBvc2l0b3J5Ii8+Ci0gICAgICA8Y29uZmlndXJhdGlvbiBzcmM9ImNvbnRleHQ6Ly9qY3ItcmVwb3NpdG9yeS9yZXBvc2l0b3J5LnhtbCIvPgotICAgICAgCi0gICAgICA8bmFtZXNwYWNlIHByZWZpeD0iZGMiIHVyaT0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgIDxuYW1lc3BhY2UgcHJlZml4PSJkY3Rlcm1zIiB1cmk9Imh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8iLz4KLSAgICAgIDxuYW1lc3BhY2UgcHJlZml4PSJsZW55YSIgdXJpPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiLz4KLSAgICA8L2NvbXBvbmVudD4KLSAgICAKLSAgPC94Y29uZj4KLSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlZmFjdG9yeS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZWZhY3RvcnkueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmRiNTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlZmFjdG9yeS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotICAKLSAgPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0gIAotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vc291cmNlLWZhY3RvcmllcyIKLSAgICByZW1vdmU9Ii9jb2Nvb24vc291cmNlLWZhY3Rvcmllcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnamNyJ10iCi0gICAgdW5sZXNzPSIvY29jb29uL3NvdXJjZS1mYWN0b3JpZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2pjciddW0BjbGFzcyA9ICdvcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3IuTGVueWFKQ1JTb3VyY2VGYWN0b3J5J10iPgotICAgIAotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmpjci5MZW55YUpDUlNvdXJjZUZhY3RvcnkiIG5hbWU9ImpjciI+Ci0gICAgICA8Zm9sZGVyLW5vZGUgbmV3LWZpbGU9Im50OmZpbGUiIG5ldy1mb2xkZXI9Im50OmZvbGRlciIgdHlwZT0icmVwOnJvb3QiLz4KLSAgICAgIDxmb2xkZXItbm9kZSBuZXctZmlsZT0ibnQ6ZmlsZSIgbmV3LWZvbGRlcj0ibnQ6dW5zdHJ1Y3R1cmVkIiB0eXBlPSJudDp1bnN0cnVjdHVyZWQiLz4KLSAgICAgIDxmb2xkZXItbm9kZSB0eXBlPSJudDpmb2xkZXIiIG5ldy1maWxlPSJudDpmaWxlIi8+Ci0gICAgICA8ZmlsZS1ub2RlIGNvbnRlbnQtcGF0aD0iamNyOmNvbnRlbnQiIGNvbnRlbnQtdHlwZT0ibnQ6cmVzb3VyY2UiIHR5cGU9Im50OmZpbGUiLz4KLSAgICAgIDxmaWxlLW5vZGUgY29udGVudC1yZWY9Impjcjpjb250ZW50IiB0eXBlPSJudDpsaW5rZWRGaWxlIi8+Ci0gICAgICA8Y29udGVudC1ub2RlIHR5cGU9Im50OnJlc291cmNlIgotICAgICAgICBjb250ZW50LXByb3A9ImpjcjpkYXRhIgotICAgICAgICBtaW1ldHlwZS1wcm9wPSJqY3I6bWltZVR5cGUiCi0gICAgICAgIGxhc3Rtb2RpZmllZC1wcm9wPSJqY3I6bGFzdE1vZGlmaWVkIgotICAgICAgICB2YWxpZGl0eS1wcm9wPSJqY3I6bGFzdE1vZGlmaWVkIi8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0gICAgCi0gIDwveGNvbmY+Ci0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtZXhwb3J0Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1leHBvcnQueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWJkNTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1leHBvcnQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdqY3IuZXhwb3J0J10iPgotCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iamNyLmV4cG9ydCIgbG9nZ2VyPSJsZW55YS5qY3IiCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRHVtbXlVc2VjYXNlIj4KLSAgICA8dmlldyB1cmk9Ii9tb2R1bGVzL2pjcnNvdXJjZS9sZW55YS1yZXBvc2l0b3J5LWNvbnRlbnQueG1sIiBtZW51PSJmYWxzZSIvPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbXBvcnQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWltcG9ydC54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiMDU0ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWltcG9ydC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2pjci5pbXBvcnQnXSI+Ci0gIAotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9Impjci5pbXBvcnQiIGxvZ2dlcj0ibGVueWEuamNyIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3IudXNlY2FzZXMuSW1wb3J0Ij4KLSAgICA8dmlldyB1cmk9Im1vZHVsZXMvamNyc291cmNlL3VzZWNhc2VzL2ltcG9ydC5qeCIgbWVudT0iZmFsc2UiLz4KLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0gIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW1wb3J0RXhwb3J0LXRhYi54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW1wb3J0RXhwb3J0LXRhYi54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjODVlMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWltcG9ydEV4cG9ydC10YWIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi9ndWktbWFuYWdlci90YWItZ3JvdXBbQG5hbWUgPSAnYWRtaW4nXSIKLSAgICAgICB1bmxlc3M9Ii9jb2Nvb24vZ3VpLW1hbmFnZXIvdGFiLWdyb3VwW0BuYW1lID0gJ2FkbWluJ10vdGFiW0BuYW1lID0gJ2pjciddIj4KLQotICA8dGFiIG5hbWU9ImpjciIgbGFiZWw9IkpDUiIgdXNlY2FzZT0iamNyLmltcG9ydEV4cG9ydCIvPgotICAKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWltcG9ydEV4cG9ydC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW1wb3J0RXhwb3J0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE0OWE2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW1wb3J0RXhwb3J0Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnamNyLmltcG9ydEV4cG9ydCddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9Impjci5pbXBvcnRFeHBvcnQiIGxvZ2dlcj0ibGVueWEuamNyIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3IudXNlY2FzZXMuSkNSSW1wb3J0Ij4KLSAgICA8dmlldyB1cmk9Im1vZHVsZXMvamNyc291cmNlL3VzZWNhc2VzL2ltcG9ydEV4cG9ydC9pbXBvcnRFeHBvcnQuangiIG1lbnU9InRydWUiPgotICAgICAgPHRhYiBncm91cD0iYWRtaW4iIG5hbWU9ImpjciIvPgotICAgIDwvdmlldz4KLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0gIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxOGRkZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bGVueWE6bW9kdWxlIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGxlbnlhOmlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5qY3Jzb3VyY2U8L2xlbnlhOmlkPgotICA8bGVueWE6cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L2xlbnlhOnBhY2thZ2U+Ci0gIDxsZW55YTp2ZXJzaW9uPjEuMC1kZXY8L2xlbnlhOnZlcnNpb24+Ci0gIDxsZW55YTpuYW1lPkpDUiBTb3VyY2UgSW1wbGVtZW50YXRpb248L2xlbnlhOm5hbWU+Ci0gIDxsZW55YTpsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWE6bGVueWEtdmVyc2lvbj4KLSAgPGxlbnlhOmRlc2NyaXB0aW9uPkpDUiBTb3VyY2UgSW1wbGVtZW50YXRpb24gb2YgTGVueWEgTm9kZUZhY3RvcnkgKHNlZSBMZW55YSBjb3JlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkpPC9sZW55YTpkZXNjcmlwdGlvbj4KLTwvbGVueWE6bW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci9KQ1JOb2RlRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci9KQ1JOb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDNmYjkxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9qY3IvSkNSTm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBKQ1Igbm9kZSBmYWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgSkNSTm9kZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBOb2RlRmFjdG9yeSwgU2VydmljZWFibGUgewotCi0gICAgcHVibGljIFJlcG9zaXRvcnlJdGVtIGJ1aWxkSXRlbShTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBrZXkpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQ1JTb3VyY2VOb2RlKHRoaXMuc2Vzc2lvbiwga2V5LCB0aGlzLm1hbmFnZXIsIGdldExvZ2dlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEl0ZW1UeXBlKCkgewotICAgICAgICByZXR1cm4gTm9kZS5JREVOVElGSUFCTEVfVFlQRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTZXNzaW9uIHNlc3Npb247Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2hhcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvamNyL0pDUlNvdXJjZU5vZGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9qY3IvSkNSU291cmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZhMzg3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9qY3IvSkNSU291cmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmpjcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Tb3VyY2VOb2RlOwotCi0vKioKLSAqIEpDUiBiYXNlZCBzb3VyY2Ugbm9kZS4KLSAqLwotcHVibGljIGNsYXNzIEpDUlNvdXJjZU5vZGUgZXh0ZW5kcyBTb3VyY2VOb2RlIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBzb3VyY2VVcmk7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uLgotICAgICAqIEBwYXJhbSBzb3VyY2VVUkkgVGhlIHNvdXJjZSBVUkkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIEpDUlNvdXJjZU5vZGUoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc291cmNlVVJJLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIHN1cGVyKHNlc3Npb24sIHNvdXJjZVVSSSwgbWFuYWdlciwgbG9nZ2VyKTsKLSAgICAgICAgdGhpcy5zb3VyY2VVcmkgPSBzb3VyY2VVUkk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNvdXJjZU5vZGUjZ2V0UmVhbFNvdXJjZVVyaSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWFsU291cmNlVVJJKCkgewotICAgICAgICBTdHJpbmcgcGF0aCA9IHRoaXMuc291cmNlVXJpLnN1YnN0cmluZyhMRU5ZQV9QUk9UT0NPTC5sZW5ndGgoKSk7Ci0gICAgICAgIHJldHVybiAiamNyOi8vIiArIHBhdGg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE5vIHNlcGFyYXRlIG1ldGEgZGF0YSBub2RlLCBzbyBubyBsb2NraW5nIGlzIHJlcXVpcmVkLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Tb3VyY2VOb2RlI2xvY2tNZXRhRGF0YSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9ja01ldGFEYXRhKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci9MZW55YUpDUlNvdXJjZUZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9qY3IvTGVueWFKQ1JTb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MDYwYjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci9MZW55YUpDUlNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3I7Ci0KLWltcG9ydCBqYXZheC5qY3IuTm9kZTsKLWltcG9ydCBqYXZheC5qY3IuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmpjci5zb3VyY2UuSkNSU291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QYWdlRW52ZWxvcGU7Ci0KLXB1YmxpYyBjbGFzcyBMZW55YUpDUlNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBKQ1JTb3VyY2VGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBOb2RlIGNyZWF0ZUZpbGVOb2RlKE5vZGUgZm9sZGVyTm9kZSwgU3RyaW5nIG5hbWUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgTm9kZSBub2RlID0gc3VwZXIuY3JlYXRlRmlsZU5vZGUoZm9sZGVyTm9kZSwgbmFtZSk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBub2RlLmdldFNlc3Npb24oKS5nZXROYW1lc3BhY2VQcmVmaXgoUGFnZUVudmVsb3BlLk5BTUVTUEFDRSk7Ci0gICAgICAgIGlmICghcHJlZml4LmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeCArICI6IjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbm9kZS5hZGRNaXhpbihwcmVmaXggKyBMZW55YVJlcG9zaXRvcnkuQ09OVEVOVF9OT0RFKTsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotLyoKLSAgICBwdWJsaWMgTm9kZSBjcmVhdGVDb250ZW50Tm9kZShOb2RlIGZpbGVOb2RlKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHN1cGVyLmNyZWF0ZUNvbnRlbnROb2RlKGZpbGVOb2RlKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBub2RlLmdldFNlc3Npb24oKS5nZXROYW1lc3BhY2VQcmVmaXgoTGVueWFNZXRhRGF0YS5OQU1FU1BBQ0UpOwotICAgICAgICBpZiAoIXByZWZpeC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggKyAiOiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5vZGUuYWRkTWl4aW4ocHJlZml4ICsgTGVueWFSZXBvc2l0b3J5LkNPTlRFTlRfTk9ERSk7Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLSovCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvamNyL0xlbnlhUmVwb3NpdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci9MZW55YVJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4ZWI2NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvamNyL0xlbnlhUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5qY3IuQWNjZXNzRGVuaWVkRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5Mb2dpbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5qY3IuTmFtZXNwYWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5OYW1lc3BhY2VSZWdpc3RyeTsKLWltcG9ydCBqYXZheC5qY3IuTm9TdWNoV29ya3NwYWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgamF2YXguamNyLlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguamNyLlVuc3VwcG9ydGVkUmVwb3NpdG9yeU9wZXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLm5vZGV0eXBlLkludmFsaWROb2RlVHlwZURlZkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5ub2RldHlwZS5Ob2RlVHlwZURlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5ub2RldHlwZS5Ob2RlVHlwZU1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLm5vZGV0eXBlLk5vZGVUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUubm9kZXR5cGUuUHJvcERlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5ub2RldHlwZS5Qcm9wRGVmSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmphY2tyYWJiaXQubmFtZS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5kdWJsaW5jb3JlLkR1YmxpbkNvcmU7Ci0KLS8qKgotICogTGVueWEtc3BlY2lmaWMgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIExlbnlhUmVwb3NpdG9yeSBleHRlbmRzIG9yZy5hcGFjaGUuY29jb29uLmpjci5KYWNrcmFiYml0UmVwb3NpdG9yeSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX05PREUgPSAiY29udGVudE5vZGUiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9BVFRSSUJVVEUgPSBqYXZheC5qY3IuU2Vzc2lvbi5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICBwcml2YXRlIE1hcCBuYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBzdXBlci5jb25maWd1cmUoY29uZmlnKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uW10gbmFtZXNwYWNlQ29uZmlncyA9IGNvbmZpZy5nZXRDaGlsZHJlbigibmFtZXNwYWNlIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlQ29uZmlncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5hbWVzcGFjZUNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKCJwcmVmaXgiKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuYW1lc3BhY2VDb25maWdzW2ldLmdldEF0dHJpYnV0ZSgidXJpIik7Ci0gICAgICAgICAgICB0aGlzLm5hbWVzcGFjZXMucHV0KHByZWZpeCwgdXJpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YXguamNyLlJlcG9zaXRvcnkjbG9naW4oKQotICAgICAqLwotICAgIHB1YmxpYyBqYXZheC5qY3IuU2Vzc2lvbiBsb2dpbigpIHRocm93cyBMb2dpbkV4Y2VwdGlvbiwgTm9TdWNoV29ya3NwYWNlRXhjZXB0aW9uLAotICAgICAgICAgICAgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgamF2YXguamNyLlNlc3Npb24gamNyU2Vzc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgTWFwIG9iamVjdE1vZGVsID0gQ29udGV4dEhlbHBlci5nZXRPYmplY3RNb2RlbCh0aGlzLmNvbnRleHQpOwotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgamNyU2Vzc2lvbiA9IChqYXZheC5qY3IuU2Vzc2lvbikgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoU0VTU0lPTl9BVFRSSUJVVEUpOwotICAgICAgICAgICAgaWYgKGpjclNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGpjclNlc3Npb24gPSBzdXBlci5sb2dpbigpOwotICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKFNFU1NJT05fQVRUUklCVVRFLCBqY3JTZXNzaW9uKTsKLQotICAgICAgICAgICAgICAgIHJlZ2lzdGVyTmFtZXNwYWNlcyhqY3JTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZWdpc3Rlck5vZGVUeXBlcyhqY3JTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkTm9kZVR5cGVEZWZFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gamNyU2Vzc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhlIExlbnlhLXNwZWNpZmljIG5hbWVzcGFjZXMgYXQgdGhlIEpDUiB3b3Jrc3BhY2UuCi0gICAgICogQHBhcmFtIGpjclNlc3Npb24gVGhlIEpDUiBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBOYW1lc3BhY2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRSZXBvc2l0b3J5T3BlcmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIEFjY2Vzc0RlbmllZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJOYW1lc3BhY2VzKGphdmF4Lmpjci5TZXNzaW9uIGpjclNlc3Npb24pIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uLAotICAgICAgICAgICAgTmFtZXNwYWNlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZFJlcG9zaXRvcnlPcGVyYXRpb25FeGNlcHRpb24sIEFjY2Vzc0RlbmllZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMubmFtZXNwYWNlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKSB0aGlzLm5hbWVzcGFjZXMuZ2V0KHByZWZpeCk7Ci0gICAgICAgICAgICBOYW1lc3BhY2VSZWdpc3RyeSByZWdpc3RyeSA9IGpjclNlc3Npb24uZ2V0V29ya3NwYWNlKCkuZ2V0TmFtZXNwYWNlUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIGlmICghQXJyYXlzLmFzTGlzdChyZWdpc3RyeS5nZXRQcmVmaXhlcygpKS5jb250YWlucyhwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJOYW1lc3BhY2UocHJlZml4LCB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJOb2RlVHlwZXMoamF2YXguamNyLlNlc3Npb24gamNyU2Vzc2lvbikgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnZhbGlkTm9kZVR5cGVEZWZFeGNlcHRpb24gewotCi0gICAgICAgIE5vZGVUeXBlTWFuYWdlckltcGwgbm9kZVR5cGVNYW5hZ2VyID0gKE5vZGVUeXBlTWFuYWdlckltcGwpIGpjclNlc3Npb24uZ2V0V29ya3NwYWNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0Tm9kZVR5cGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGVUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBub2RlVHlwZU1hbmFnZXIuZ2V0Tm9kZVR5cGVSZWdpc3RyeSgpOwotICAgICAgICAvKgotICAgICAgICBpZiAoIXJlZ2lzdHJ5LmlzUmVnaXN0ZXJlZChuZXcgUU5hbWUoTGVueWFNZXRhRGF0YS5OQU1FU1BBQ0UsIENPTlRFTlRfTk9ERSkpKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgcHJvcERlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBNYXAga2V5Mm5hbWVzcGFjZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGxlbnlhS2V5cyA9IExlbnlhTWV0YURhdGEuRUxFTUVOVFM7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbnlhS2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGtleTJuYW1lc3BhY2UucHV0KGxlbnlhS2V5c1tpXSwgTGVueWFNZXRhRGF0YS5OQU1FU1BBQ0UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0IGRjS2V5TGlzdCA9IER1YmxpbkNvcmVJbXBsLmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBkY0tleXMgPSAoU3RyaW5nW10pIGRjS2V5TGlzdC50b0FycmF5KG5ldyBTdHJpbmdbZGNLZXlMaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkY0tleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBrZXkybmFtZXNwYWNlLnB1dChkY0tleXNbaV0sIER1YmxpbkNvcmUuRENfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTm9kZVR5cGVEZWYgZGVmID0gbmV3IE5vZGVUeXBlRGVmKCk7Ci0gICAgICAgICAgICBkZWYuc2V0TWl4aW4odHJ1ZSk7Ci0gICAgICAgICAgICBkZWYuc2V0TmFtZShuZXcgUU5hbWUoTGVueWFNZXRhRGF0YS5OQU1FU1BBQ0UsIENPTlRFTlRfTk9ERSkpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBrZXkybmFtZXNwYWNlLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZykga2V5Mm5hbWVzcGFjZS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBQcm9wRGVmSW1wbCBwcm9wRGVmID0gbmV3IFByb3BEZWZJbXBsKCk7Ci0gICAgICAgICAgICAgICAgcHJvcERlZi5zZXREZWNsYXJpbmdOb2RlVHlwZShkZWYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBwcm9wRGVmLnNldE5hbWUobmV3IFFOYW1lKG5hbWVzcGFjZSwga2V5KSk7Ci0gICAgICAgICAgICAgICAgcHJvcERlZi5zZXRNYW5kYXRvcnkoZmFsc2UpOwotICAgICAgICAgICAgICAgIHByb3BEZWYuc2V0UmVxdWlyZWRUeXBlKFByb3BlcnR5VHlwZS5TVFJJTkcpOwotICAgICAgICAgICAgICAgIHByb3BEZWYuc2V0TXVsdGlwbGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcHJvcERlZnMuYWRkKHByb3BEZWYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWYuc2V0UHJvcGVydHlEZWZzKChQcm9wRGVmW10pIHByb3BEZWZzLnRvQXJyYXkobmV3IFByb3BEZWZbcHJvcERlZnMuc2l6ZSgpXSkpOwotCi0gICAgICAgICAgICByZWdpc3RyeS5yZWdpc3Rlck5vZGVUeXBlKGRlZik7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9qY3IvbWV0YWRhdGEvSkNSTWV0YURhdGEuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9qY3IvbWV0YWRhdGEvSkNSTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZmZmYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvamNyL21ldGFkYXRhL0pDUk1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmpjci5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguamNyLk5vZGU7Ci1pbXBvcnQgamF2YXguamNyLlByb3BlcnR5OwotaW1wb3J0IGphdmF4Lmpjci5WYWx1ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250YWluZXIuQ29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5qY3Iuc291cmNlLkpDUk5vZGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLkVsZW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0vKioKLSAqIEpDUiBiYXNlZCBtZXRhIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBKQ1JNZXRhRGF0YSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIE1ldGFEYXRhIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBzb3VyY2VVcmk7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIE1hcCBrZXkydmFsdWVzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkKLSAgICAgKiBAcGFyYW0gbWFuYWdlcgotICAgICAqIEBwYXJhbSBsb2dnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSkNSTWV0YURhdGEoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHNvdXJjZVVyaSwgU2VydmljZU1hbmFnZXIgbWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5zb3VyY2VVcmkgPSBzb3VyY2VVcmk7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXAgZ2V0S2V5MlZhbHVlcygpIHsKLSAgICAgICAgaWYgKHRoaXMua2V5MnZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2FkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMua2V5MnZhbHVlczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkKCkgewotCi0gICAgICAgIHRoaXMua2V5MnZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgSkNSTm9kZVNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSAoSkNSTm9kZVNvdXJjZSkgcmVzb2x2ZXIucmVzb2x2ZVVSSSh0aGlzLnNvdXJjZVVyaSk7Ci0KLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IHNvdXJjZS5nZXROb2RlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbm9kZS5nZXRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFdvcmtzcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXROYW1lc3BhY2VSZWdpc3RyeSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcmVmaXgodGhpcy5uYW1lc3BhY2UpOwotICAgICAgICAgICAgaWYgKCFwcmVmaXguZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeCArICI6IjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHBvc3NpYmxlS2V5c1tdID0gZ2V0UG9zc2libGVLZXlzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc3NpYmxlS2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwcmVmaXggKyBwb3NzaWJsZUtleXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuaGFzUHJvcGVydHkoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IG5vZGUuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgVmFsdWVbXSB2YWx1ZXMgPSBwcm9wZXJ0eS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5nVmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgdiA9IDA7IHYgPCB2YWx1ZXMubGVuZ3RoOyB2KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlc1t2XSA9IHZhbHVlc1t2XS5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aGlzLmtleTJ2YWx1ZXMucHV0KHBvc3NpYmxlS2V5c1tpXSwgc3RyaW5nVmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBKQ1JOb2RlU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IChKQ1JOb2RlU291cmNlKSByZXNvbHZlci5yZXNvbHZlVVJJKHRoaXMuc291cmNlVXJpKTsKLQotICAgICAgICAgICAgaWYgKCFzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3RyZWFtID0gc291cmNlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBOb2RlIG5vZGUgPSBzb3VyY2UuZ2V0Tm9kZSgpOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5vZGUuZ2V0U2Vzc2lvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRXb3Jrc3BhY2UoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZXNwYWNlUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJlZml4KHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGlmICghcHJlZml4LmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggKyAiOiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBwb3NzaWJsZUtleXNbXSA9IGdldFBvc3NpYmxlS2V5cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NzaWJsZUtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdWYWx1ZXMgPSAoU3RyaW5nW10pIGdldEtleTJWYWx1ZXMoKS5nZXQocG9zc2libGVLZXlzW2ldKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcHJlZml4ICsgcG9zc2libGVLZXlzW2ldOwotICAgICAgICAgICAgICAgIG5vZGUuc2V0UHJvcGVydHkoa2V5LCBzdHJpbmdWYWx1ZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcyhTdHJpbmcga2V5KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBnZXRLZXkyVmFsdWVzKCkuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdFZhbHVlKFN0cmluZyBrZXkpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IChTdHJpbmdbXSkgZ2V0S2V5MlZhbHVlcygpLmdldChrZXkpOwotICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzWzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHsgdmFsdWUgfTsKLSAgICAgICAgZ2V0S2V5MlZhbHVlcygpLnB1dChrZXksIHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSAoU3RyaW5nW10pIGdldEtleTJWYWx1ZXMoKS5nZXQoa2V5KTsKLSAgICAgICAgTGlzdCB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgICAgIHZhbHVlTGlzdC5hZGQodmFsdWUpOwotICAgICAgICB2YWx1ZXMgPSAoU3RyaW5nW10pIHZhbHVlTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbdmFsdWVMaXN0LnNpemUoKV0pOwotICAgICAgICBnZXRLZXkyVmFsdWVzKCkucHV0KGtleSwgdmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlQnkoTWV0YURhdGEgb3RoZXIpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMua2V5MnZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFN0cmluZ1tdIGtleXMgPSBnZXRQb3NzaWJsZUtleXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBvdGhlci5nZXRWYWx1ZXMoa2V5c1tpXSk7Ci0gICAgICAgICAgICB0aGlzLmtleTJ2YWx1ZXMucHV0KGtleXNbaV0sIHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgc2F2ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZvcmNlZFJlcGxhY2VCeShNZXRhRGF0YSBvdGhlcikgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgcmVwbGFjZUJ5KG90aGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwb3NzaWJsZUtleXMgPSBuZXcgU3RyaW5nWzBdOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGtleXMgVGhlIHBvc3NpYmxlIGtleXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9zc2libGVLZXlzKFN0cmluZ1tdIGtleXMpIHsKLSAgICAgICAgdGhpcy5wb3NzaWJsZUtleXMgPSBrZXlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZUtleXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBvc3NpYmxlS2V5czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkQXR0cmlidXRlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgU3RyaW5nW10ga2V5cyA9IGdldFBvc3NpYmxlS2V5cygpOwotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChrZXlzKS5jb250YWlucyhrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBIYXNoTWFwIGdldEF2YWlsYWJsZUtleTJWYWx1ZSgpIHsKLSAgICAgICAgLy8gVE9ETyBXZSBuZWVkIHRvIGltcGxlbWVudCB0aGlzIE1ldGhvZCEKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBKQ1JOb2RlU291cmNlIHNvdXJjZSA9IChKQ1JOb2RlU291cmNlKSByZXNvbHZlci5yZXNvbHZlVVJJKHRoaXMuc291cmNlVXJpKTsKLSAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IHNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbigiRXJyb3IgcmVzb2x2aW5nIG1ldGEgZGF0YSBzb3VyY2UiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBdmFpbGFibGVLZXlzKCkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnRTZXQgZ2V0RWxlbWVudFNldCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFZhbHVlcyhTdHJpbmcga2V5KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci91c2VjYXNlcy9JbXBvcnQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9qY3IvdXNlY2FzZXMvSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjg4YzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci91c2VjYXNlcy9JbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuamNyLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLlNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlOwotCi0vKioKLSAqIEltcG9ydCBhIHB1YmxpY2F0aW9uIGludG8gdGhlIEpDUiByZXBvc2l0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0FUSU9OUyA9ICJwdWJsaWNhdGlvbnMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0FUSU9OID0gInB1YmxpY2F0aW9uIjsKLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICBQdWJsaWNhdGlvbltdIHB1YnMgPSBnZXREb2N1bWVudEZhY3RvcnkoKS5nZXRQdWJsaWNhdGlvbnMoKTsKLSAgICAgICAgTGlzdCBwdWJMaXN0ID0gQXJyYXlzLmFzTGlzdChwdWJzKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKFBVQkxJQ0FUSU9OUywgcHViTGlzdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotICAgICAgICBTdHJpbmcgcHViSWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhQVUJMSUNBVElPTik7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCk7Ci0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIFNpdGVNYW5hZ2VyIHNpdGVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBmYWN0b3J5LmdldFB1YmxpY2F0aW9uKHB1YklkKTsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTaXRlTWFuYWdlci5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICBzaXRlTWFuYWdlciA9IChTaXRlTWFuYWdlcikgc2VsZWN0b3Iuc2VsZWN0KHB1Yi5nZXRTaXRlTWFuYWdlckhpbnQoKSk7Ci0KLSAgICAgICAgICAgIExpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBNYXAgdXJpMm1ldGEgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBhcmVhcyA9IHsgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsIFB1YmxpY2F0aW9uLkxJVkVfQVJFQSwKLSAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24uVFJBU0hfQVJFQSwgUHVibGljYXRpb24uQVJDSElWRV9BUkVBIH07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZWFzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRbXSBkb2NzID0gc2l0ZU1hbmFnZXIuZ2V0RG9jdW1lbnRzKGZhY3RvcnksIHB1YiwgYXJlYXNbaV0pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZG9jcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBub2Rlcy5hZGQoZG9jc1tqXS5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxlbnlhVXJpID0gZG9jc1tqXS5nZXRTb3VyY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZVBhdGggPSBsZW55YVVyaS5zdWJzdHJpbmcoImxlbnlhOi8vIi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZXh0VXJpID0gImNvbnRleHQ6Ly8iICsgc291cmNlUGF0aCArICIubWV0YSI7Ci0gICAgICAgICAgICAgICAgICAgICAqIE1ldGFEYXRhTWFuYWdlciBtZXRhID0gbmV3IE1ldGFEYXRhTWFuYWdlcihjb250ZXh0VXJpLCB0aGlzLm1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAqIGdldExvZ2dlcigpKTsgdXJpMm1ldGEucHV0KGRvY3Nbal0uZ2V0U291cmNlVVJJKCksIG1ldGEpOwotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm9kZXMuYWRkKHNpdGVNYW5hZ2VyLmdldFNpdGVTdHJ1Y3R1cmUoZmFjdG9yeSwgcHViLCBhcmVhc1tpXSkuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGVueWFVcmkgPSBub2RlLmdldFNvdXJjZVVSSSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VQYXRoID0gbGVueWFVcmkuc3Vic3RyaW5nKCJsZW55YTovLyIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZXh0VXJpID0gImNvbnRleHQ6Ly8iICsgc291cmNlUGF0aDsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgamNyVXJpID0gImpjcjovLyIgKyBzb3VyY2VQYXRoOwotICAgICAgICAgICAgICAgIGlmIChTb3VyY2VVdGlsLmV4aXN0cyhjb250ZXh0VXJpLCB0aGlzLm1hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNvdXJjZVV0aWwuY29weShyZXNvbHZlciwgY29udGV4dFVyaSwgamNyVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogTWV0YURhdGFNYW5hZ2VyIHNvdXJjZU1nciA9IChNZXRhRGF0YU1hbmFnZXIpIHVyaTJtZXRhLmdldChsZW55YVVyaSk7IGlmCi0gICAgICAgICAgICAgICAgICAgICAqIChzb3VyY2VNZ3IgIT0gbnVsbCkgeyBNZXRhRGF0YU1hbmFnZXIgamNyTWdyID0gbmV3IEpDUk1ldGFEYXRhTWFuYWdlcihqY3JVcmksCi0gICAgICAgICAgICAgICAgICAgICAqIHRoaXMubWFuYWdlciwgZ2V0TG9nZ2VyKCkpOyBqY3JNZ3IucmVwbGFjZU1ldGFEYXRhKHNvdXJjZU1ncik7IH0KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkSW5mb01lc3NhZ2UoIlRoZSBzb3VyY2UgWyIgKyBjb250ZXh0VXJpICsgIl0gZG9lcyBub3QgZXhpc3QuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzaXRlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2Uoc2l0ZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvamNyL3VzZWNhc2VzL0pDUkltcG9ydC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci91c2VjYXNlcy9KQ1JJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1YjQ0My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvamNyL3VzZWNhc2VzL0pDUkltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogJElkOiQgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuamNyLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4Lmpjci5JbXBvcnRVVUlEQmVoYXZpb3I7Ci1pbXBvcnQgamF2YXguamNyLkl0ZW07Ci1pbXBvcnQgamF2YXguamNyLkxvZ2luRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5OwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5TZXNzaW9uOwotaW1wb3J0IGphdmF4Lmpjci5Xb3Jrc3BhY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuQ2FzY2FkaW5nUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5zZXJ2bGV0Lm11bHRpcGFydC5QYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKLQotLyoqCi0gKiBJbXBvcnQgSkNSIGNvbnRlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKQ1JJbXBvcnQgZXh0ZW5kcyBBYnN0cmFjdFVzZWNhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVEFSR0VUX1BBUkFNID0gImxlbnlhLnVzZWNhc2UuaW1wb3J0RXhwb3J0LmltcG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9UQVJHRVRfUFVCTElDQVRJT04gPSAicHVibGljYXRpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVEFSR0VUX1JFUE9TSVRPUlkgPSAicmVwb3NpdG9yeSI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpDUl9MRU5ZQV9ST09UID0gIi8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQ1JfTEVOWUFfQkFTRV9OQU1FID0gImxlbnlhIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNSX0xFTllBX1BVQkxJQ0FUT05fUk9PVCA9ICIvbGVueWEvcHVicyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QodGhpcy5jb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIFBhcnQgamNySW1wb3J0ID0gKFBhcnQpcmVxdWVzdC5nZXQoImpjcmNvbnRlbnQiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCBuYW1lIG9mIGZpcnN0IEpDUiBub2RlICgnbGVueWEnIG9yIHB1YmxpY2F0aW9uIG5hbWUpLgotICAgICAgICBTdHJpbmcgZmlyc3ROb2RlTmFtZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpcnN0Tm9kZU5hbWUgPSBnZXRGaXJzdE5vZGVOYW1lKG5ldyBJbnB1dFNvdXJjZShqY3JJbXBvcnQuZ2V0SW5wdXRTdHJlYW0oKSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpDUkltcG9ydEV4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyBmaXJzdCBub2RlIG5hbWUgb2YgaW1wb3J0IGRhdGEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlyc3ROb2RlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkNSSW1wb3J0RXhjZXB0aW9uKCJSZWFkaW5nIHJlcG9zaXRvcnkgaW1wb3J0IGRhdGEgZmFpbGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXBvc2l0b3J5IHJlcG8gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVwbyA9IChSZXBvc2l0b3J5KW1hbmFnZXIubG9va3VwKFJlcG9zaXRvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDYXNjYWRpbmdSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgbG9va3VwIHJlcG9zaXRvcnkiLCBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHJlcG8ubG9naW4oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpDUkltcG9ydEV4Y2VwdGlvbigiTG9naW4gdG8gcmVwb3NpdG9yeSBmYWlsZWQiLCBlMSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpDUkltcG9ydEV4Y2VwdGlvbigiQ2Fubm90IGFjY2VzcyByZXBvc2l0b3J5IiwgZTEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBXb3Jrc3BhY2Ugd3MgPSBzZXNzaW9uLmdldFdvcmtzcGFjZSgpOwotICAgIAotICAgICAgICAgICAgU3RyaW5nIGltcG9ydFRhcmdldCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKElNUE9SVF9UQVJHRVRfUEFSQU0pOwotICAgICAgICAgICAgaWYgKElNUE9SVF9UQVJHRVRfUkVQT1NJVE9SWS5lcXVhbHMoaW1wb3J0VGFyZ2V0KSkgewotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBMZW55YSByZXBvc2l0b3J5Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkltcG9ydGluZyBMZW55YSByZXBvc2l0b3J5IGludG8gSkNSIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFKQ1JfTEVOWUFfQkFTRV9OQU1FLmVxdWFscyhmaXJzdE5vZGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkNSSW1wb3J0RXhjZXB0aW9uKCJDb3JydXB0IExlbnlhIHJlcG9zaXRvcnkgZGF0YSBmaWxlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbi5pdGVtRXhpc3RzKEpDUl9MRU5ZQV9ST09UKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkNSSW1wb3J0RXhjZXB0aW9uKCJMZW55YSBKQ1Igcm9vdCBub3QgZm91bmQgWyIgKyBKQ1JfTEVOWUFfUk9PVCArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBMZW55YSByZXBvc2l0b3J5LgotICAgICAgICAgICAgICAgIFN0cmluZyBsZW55YUJhc2VQYXRoID0gSkNSX0xFTllBX1JPT1QgKwotICAgICAgICAgICAgICAgICAgICAoSkNSX0xFTllBX1JPT1QuZW5kc1dpdGgoIi8iKSA/IEpDUl9MRU5ZQV9CQVNFX05BTUUgOiAiLyIgKyBKQ1JfTEVOWUFfQkFTRV9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5pdGVtRXhpc3RzKGxlbnlhQmFzZVBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZW0gamNyTGVueWFCYXNlID0gc2Vzc2lvbi5nZXRJdGVtKGxlbnlhQmFzZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICBqY3JMZW55YUJhc2UucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2F2ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAvLyBJbXBvcnQgTGVueWEgcmVwb3NpdG9yeS4gVXNlIHdvcmtzcGFjZSBpbnN0ZWFkIG9mIHNlc3Npb24gYmVjYXVzZSBvZiBwZXJmb3JtYW5jZS4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3cy5pbXBvcnRYTUwoSkNSX0xFTllBX1JPT1QsIGpjckltcG9ydC5nZXRJbnB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydFVVSURCZWhhdmlvci5JTVBPUlRfVVVJRF9DUkVBVEVfTkVXKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkNSSW1wb3J0RXhjZXB0aW9uKCJFcnJvciBpbXBvcnRpbmcgZGF0YSBpbnRvIHdvcmtzcGFjZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSU1QT1JUX1RBUkdFVF9QVUJMSUNBVElPTi5lcXVhbHMoaW1wb3J0VGFyZ2V0KSkgewotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBMZW55YSBwdWJsaWNhdGlvbiAKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiSW1wb3J0aW5nIExlbnlhIHB1YmxpY2F0aW9uIGludG8gSkNSIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uLml0ZW1FeGlzdHMoSkNSX0xFTllBX1BVQkxJQ0FUT05fUk9PVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpDUkltcG9ydEV4Y2VwdGlvbigiTGVueWEgSkNSIHJvb3Qgbm90IGZvdW5kIFsiICsgSkNSX0xFTllBX1JPT1QgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDcmVhdGUgSkNSX0xFTllBX1BVQkxJQ0FUT05fUk9PVAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgTGVueWEgcmVwb3NpdG9yeS4KLSAgICAgICAgICAgICAgICBTdHJpbmcgbGVueWFQdWJsaWNhdGlvblBhdGggPSBKQ1JfTEVOWUFfUFVCTElDQVRPTl9ST09UICsKLSAgICAgICAgICAgICAgICAgICAgKEpDUl9MRU5ZQV9QVUJMSUNBVE9OX1JPT1QuZW5kc1dpdGgoIi8iKSA/IGZpcnN0Tm9kZU5hbWUgOiAiLyIgKyBmaXJzdE5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5pdGVtRXhpc3RzKGxlbnlhUHVibGljYXRpb25QYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBJdGVtIGpjclB1YmxpY2F0aW9uQmFzZSA9IHNlc3Npb24uZ2V0SXRlbShsZW55YVB1YmxpY2F0aW9uUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGpjclB1YmxpY2F0aW9uQmFzZS5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBMZW55YSBwdWJsaWNhdGlvbi4gVXNlIHdvcmtzcGFjZSBpbnN0ZWFkIG9mIHNlc3Npb24gYmVjYXVzZSBvZiBwZXJmb3JtYW5jZS4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3cy5pbXBvcnRYTUwoSkNSX0xFTllBX1BVQkxJQ0FUT05fUk9PVCwgamNySW1wb3J0LmdldElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0VVVJREJlaGF2aW9yLklNUE9SVF9VVUlEX0NSRUFURV9ORVcpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQ1JJbXBvcnRFeGNlcHRpb24oIkVycm9yIGltcG9ydGluZyBkYXRhIGludG8gd29ya3NwYWNlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQ1JJbXBvcnRFeGNlcHRpb24oIkVycm9yIGFjY2Vzc2luZyBKQ1IgcmVwb3NpdG9yeSB3aGlsZSBpbXBvcnRpbmcgZGF0YSIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEZpcnN0Tm9kZU5hbWUoSW5wdXRTb3VyY2UgeG1sSW5wdXQpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYTUxSZWFkZXIgeG1sUmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIEZpcnN0Tm9kZU5hbWVIYW5kbGVyIGNvbnRlbnRIYW5kbGVyID0gbmV3IEZpcnN0Tm9kZU5hbWVIYW5kbGVyKCk7IAotICAgICAgICB4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoY29udGVudEhhbmRsZXIpOwotICAgICAgICB4bWxSZWFkZXIucGFyc2UoeG1sSW5wdXQpOwotICAgICAgICByZXR1cm4gY29udGVudEhhbmRsZXIuZ2V0Rmlyc3ROb2RlTmFtZSgpOwotICAgIH0KLSAgICAKLSAgICBjbGFzcyBGaXJzdE5vZGVOYW1lSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9OQU1FX1FfQVRUUiA9ICJzdjpuYW1lIjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudCA9IHRydWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0Tm9kZU5hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzRmlyc3RFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3ROb2RlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoTk9ERV9OQU1FX1FfQVRUUik7Ci0gICAgICAgICAgICAgICAgaXNGaXJzdEVsZW1lbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3ROb2RlTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmaXJzdE5vZGVOYW1lOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci91c2VjYXNlcy9KQ1JJbXBvcnRFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9qY3IvdXNlY2FzZXMvSkNSSW1wb3J0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTllNTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2pjci91c2VjYXNlcy9KQ1JJbXBvcnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogJElkOiQgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuamNyLnVzZWNhc2VzOwotCi1wdWJsaWMgY2xhc3MgSkNSSW1wb3J0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLSAgICBwdWJsaWMgSkNSSW1wb3J0RXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSkNSSW1wb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSkNSSW1wb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSkNSSW1wb3J0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjAyZTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDxtYXA6Y29tcG9uZW50cz4KLSAgICA8bWFwOmdlbmVyYXRvcnMgZGVmYXVsdD0iZmlsZSI+Ci0gICAgICA8bWFwOmdlbmVyYXRvciBuYW1lPSJqY3Itc3lzLXZpZXciIGxhYmVsPSJjb250ZW50LGRhdGEiIGxvZ2dlcj0ic2l0ZW1hcC5nZW5lcmF0b3IuamNyLXN5cy12aWV3IiBwb29sLWdyb3c9IjIiIHBvb2wtbWF4PSI1IiBwb29sLW1pbj0iMiIgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZ2VuZXJhdGlvbi5KQ1JTeXNWaWV3R2VuZXJhdG9yIi8+Ci0gICAgPC9tYXA6Z2VuZXJhdG9ycz4KLSAgPC9tYXA6Y29tcG9uZW50cz4KLSAgCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmU+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ibGVueWEtcmVwb3NpdG9yeS1jb250ZW50LnhtbCI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InBhcmFtZXRlciI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyLXNlbGVjdG9yLXRlc3QiIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpzY29wZX0iLz4KLSAgICAgICAgICA8bWFwOndoZW4gdGVzdD0icmVwb3NpdG9yeSI+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9Impjci1zeXMtdmlldyI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJvb3QiIHZhbHVlPSIvbGVueWEiLz4KLSAgICAgICAgICAgIDwvbWFwOmdlbmVyYXRlPgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgPG1hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9Impjci1zeXMtdmlldyI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJvb3QiIHZhbHVlPSIvbGVueWEvcHVicy97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0iLz4KLSAgICAgICAgICAgIDwvbWFwOmdlbmVyYXRlPgotICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotCi08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL3VzZWNhc2VzL2ltcG9ydC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS91c2VjYXNlcy9pbXBvcnQuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTZhMGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMtb3B0aW9uYWwvamNyc291cmNlL3VzZWNhc2VzL2ltcG9ydC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IHJlbmFtZUxhYmVsLmp4IDEyMzM2NCAyMDA0LTEyLTI2IDE2OjExOjI3WiBncmVnb3IgJCAtLT4KLTxwYWdlOnBhZ2UgeG1sbnM6Yz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gICAgICAgICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgCi0gICAgICAgICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gICAgICAgICAgIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgICAgICAgICAgPgotICAgICAgICAgICAKLSAgPHBhZ2U6dGl0bGU+Ci0gICAgPGkxOG46dGV4dD5JbXBvcnQgUHVibGljYXRpb24gaW50byBKQ1I8L2kxOG46dGV4dD4KLSAgPC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PkltcG9ydCBQdWJsaWNhdGlvbiBpbnRvIEpDUjwvaTE4bjp0ZXh0PgotICAgICAgPC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDxmb3JtIG1ldGhvZD0iZ2V0IiBhY3Rpb249IiIgaWQ9ImZvcm0taW1wb3J0X3B1Yl9pbnRvX2pjciI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJ0ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0icHVibGljYXRpb24iPjxpMThuOnRleHQ+UHVibGljYXRpb248L2kxOG46dGV4dD46PC9sYWJlbD48L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJwdWJsaWNhdGlvbiIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCI+Ci0gICAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InB1YmxpY2F0aW9uIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncHVibGljYXRpb25zJyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3B1YmxpY2F0aW9uLmVxdWFscyh1c2VjYXNlLmdldFBhcmFtZXRlcigncHVibGljYXRpb24nKSl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7cHVibGljYXRpb24uZ2V0SWQoKX0iIHNlbGVjdGVkPSJzZWxlY3RlZCI+PGp4Om91dCB2YWx1ZT0iJHtwdWJsaWNhdGlvbi5nZXRJZCgpfSIvPjwvb3B0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHtwdWJsaWNhdGlvbi5nZXRJZCgpfSI+PGp4Om91dCB2YWx1ZT0iJHtwdWJsaWNhdGlvbi5nZXRJZCgpfSIvPjwvb3B0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkltcG9ydCIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy1vcHRpb25hbC9qY3Jzb3VyY2UvdXNlY2FzZXMvaW1wb3J0RXhwb3J0L2ltcG9ydEV4cG9ydC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS91c2VjYXNlcy9pbXBvcnRFeHBvcnQvaW1wb3J0RXhwb3J0Lmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjZjMzJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzLW9wdGlvbmFsL2pjcnNvdXJjZS91c2VjYXNlcy9pbXBvcnRFeHBvcnQvaW1wb3J0RXhwb3J0Lmp4CisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IHNlcnZlclN0YXR1cy5qeCAxNjQyMzMgMjAwNS0wNC0yMiAxMzowMTo0NVogandrYWx0eiAkIC0tPgotCi08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIKLSAgeG1sbnM6Y2luY2x1ZGU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCIKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0idGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICAgIDxoMT48aTE4bjp0ZXh0PkpDUiBJbXBvcnQvRXhwb3J0PC9pMThuOnRleHQ+PC9oMT4KLSAgICAgIDxqeDppbXBvcnQgdXJpPSJ0ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgIAotICAgICAgPHA+PGkxOG46dGV4dD5JbXBvcnQgYW5kIGV4cG9ydCByZXBvc2l0b3J5IGNvbnRlbnQgaW4gWE1MIGRhdGEgZm9ybWF0LjwvaTE4bjp0ZXh0PjwvcD4KLSAgICAgIDxwPjxiPjxpMThuOnRleHQ+Tm90ZTo8L2kxOG46dGV4dD48L2I+IDxpMThuOnRleHQ+V29ya3Mgd2l0aCBKQ1IgcmVwb3NpdG9yeSBvbmx5ITwvaTE4bjp0ZXh0PjwvcD4KLSAgICAgIAotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZSI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGggY2xhc3M9ImxlbnlhLWNhcHRpb24iPjxpMThuOnRleHQ+SW1wb3J0IFB1YmxpY2F0aW9uPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGggY2xhc3M9ImxlbnlhLWNhcHRpb24iPjxpMThuOnRleHQ+RXhwb3J0IFB1YmxpY2F0aW9uPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0iZm9ybS1wdWJfaW1wb3J0X2V4cG9ydCI+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlLmltcG9ydEV4cG9ydC5pbXBvcnQiIHZhbHVlPSJwdWJsaWNhdGlvbiIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InN1Ym1pdCIgdmFsdWU9IiIvPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJqY3Jjb250ZW50IiBtYXhsZW5ndGg9IjAiIGFjY2VwdD0idGV4dC94bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iSW1wb3J0IiBuYW1lPSJpbnB1dC1pbXBvcnRfcHViIiAvPgotICAgICAgICAgICAgICAgIDxici8+PGJyLz4KLSAgICAgICAgICAgICAgICA8c3Ryb25nPjxpMThuOnRleHQ+Tm90ZTo8L2kxOG46dGV4dD48L3N0cm9uZz4gPGkxOG46dGV4dD5FeGlzdGluZyBwdWJsaWNhdGlvbiB3aWxsIGJlIG92ZXJ3cml0dGVuITwvaTE4bjp0ZXh0PiAKLSAgICAgICAgICAgICAgPC9mb3JtPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiR7dXNlY2FzZS5nZXRTb3VyY2VVUkwoKX0/bGVueWEudXNlY2FzZT1qY3IuZXhwb3J0JmFtcDtzY29wZT1wdWJsaWNhdGlvbiIgdGFyZ2V0PSJfYmxhbmsiPkRvd25sb2FkIFB1YmxpY2F0aW9uIENvbnRlbnQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLQotICAgICAgPGJyLz4KLSAgICAgIDxici8+Ci0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRoIGNsYXNzPSJsZW55YS1jYXB0aW9uIj48aTE4bjp0ZXh0PkltcG9ydCBSZXBvc2l0b3J5PC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICA8dGggY2xhc3M9ImxlbnlhLWNhcHRpb24iPjxpMThuOnRleHQ+RXhwb3J0IFJlcG9zaXRvcnk8L2kxOG46dGV4dD48L3RoPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0iZm9ybS1yZXBvc2l0b3J5X2ltcG9ydF9leHBvcnQiPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZS5pbXBvcnRFeHBvcnQuaW1wb3J0IiB2YWx1ZT0icmVwb3NpdG9yeSIvPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzdWJtaXQiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iamNyY29udGVudCIgbWF4bGVuZ3RoPSIwIiBhY2NlcHQ9InRleHQveG1sIi8+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkltcG9ydCIgbmFtZT0iaW5wdXQtaW1wb3J0X3JlcG9zaXRvcnkiLz4KLSAgICAgICAgICAgICAgICA8YnIvPjxici8+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz48aTE4bjp0ZXh0Pk5vdGU6PC9pMThuOnRleHQ+PC9zdHJvbmc+IDxpMThuOnRleHQ+QWxsIGV4aXN0aW5nIExlbnlhIGRhdGEgd2lsbCBiZSBvdmVyd3JpdHRlbiE8L2kxOG46dGV4dD4gCi0gICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPC9mb3JtPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICAgICAgICA8YSBocmVmPSIke3JlcXVlc3QucmVxdWVzdFVSSX0/bGVueWEudXNlY2FzZT1qY3IuZXhwb3J0JmFtcDtzY29wZT1yZXBvc2l0b3J5IiB0YXJnZXQ9Il9ibGFuayI+RG93bmxvYWQgUmVwb3NpdG9yeSBDb250ZW50PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgCi0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9jb25maWcvY29jb29uLXhjb25mL3Jlc291cmNldHlwZXMueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2V0eXBlcy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdkZjI5Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2V0eXBlcy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3Jlc291cmNlLXR5cGVzIiAKLQl1bmxlc3M9Ii9jb2Nvb24vcmVzb3VyY2UtdHlwZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2VudHJ5JyBvciBAbmFtZSA9ICdzaWRlYmFyJyBvciBAbmFtZSA9ICdmZWVkJ10iCi0JPgotCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPSJsZW55YS5yZXNvdXJjZXR5cGVzLmVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGVJbXBsIj4KLSAgICA8c2NoZW1hIAotICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8wLjkiCi0gICAgICAgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvYmxvZy9yZXNvdXJjZXMvc2NoZW1hcy9lbnRyeS5ybmciCi0gICAgLz4KLSAgICA8c2FtcGxlIAotICAgICAgIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veG1sIiAKLSAgICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9ibG9nL3Jlc291cmNlcy9zYW1wbGVzL2VudHJ5LnhtbCIKLSAgICAvPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLSAgCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ic2lkZWJhciIKLSAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI9ImxlbnlhLnJlc291cmNldHlwZXMuc2lkZWJhciIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlSW1wbCI+Ci0gICAgPHNjaGVtYSAKLSAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMC45IgotICAgICAgIHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NjaGVtYXMvc2lkZWJhci5ybmciCi0gICAgLz4KLSAgICA8c2FtcGxlIAotICAgICAgIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veG1sIiAKLSAgICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9ibG9nL3NhbXBsZXMvc2lkZWJhci54bWwiCi0gICAgLz4KLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJmZWVkIgotICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEucmVzb3VyY2V0eXBlcy5mZWVkIgotICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGVJbXBsIj4KLSAgICA8c2NoZW1hIAotICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8wLjkiCi0gICAgICAgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvYmxvZy9yZXNvdXJjZXMvc2NoZW1hcy9mZWVkLnJuZyIKLSAgICAvPgotICAgIDxzYW1wbGUgCi0gICAgICAgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94bWwiIAotICAgICAgIHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NhbXBsZXMvZmVlZC54bWwiCi0gICAgLz4KLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0gIAotPC94Y29uZj4KLQotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS13b3JrZmxvdy1kZWxldGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS13b3JrZmxvdy1kZWxldGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTIyY2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2Utd29ya2Zsb3ctZGVsZXRlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDIzMzE2NSAyMDA1LTA4LTE3IDEyOjU0OjA2WiBhbmRyZWFzICQgLS0+Ci08IS0tCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcwotLS0+Ci0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2Jsb2cvd29ya2Zsb3cuZGVsZXRlJ10iPgotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYmxvZy93b3JrZmxvdy5kZWxldGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI9ImxlbnlhLnVzZWNhc2VzLndvcmtmbG93IgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYmxvZy5jbXMudXNlY2FzZXMuRGVsZXRlIj4KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9ibG9nL3VzZWNhc2VzL3dvcmtmbG93L2RlbGV0ZS5qeCIvPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi0gIDwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtc2l0ZS1jcmVhdGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtc2l0ZS1jcmVhdGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOTM3MmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXNpdGUtY3JlYXRlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYmxvZy5jcmVhdGVFbnRyeSddIj4KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJibG9nLmNyZWF0ZUVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEuc2l0ZSIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DcmVhdGVCbG9nRW50cnkiPgotICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9ibG9nL3VzZWNhc2VzL3NpdGUvY3JlYXRlLmp4Ii8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTA1ZDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMjMzMTY1IDIwMDUtMDgtMTcgMTI6NTQ6MDZaIGFuZHJlYXMgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdibG9nL3dvcmtmbG93LmRlYWN0aXZhdGUnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYmxvZy93b3JrZmxvdy5kZWFjdGl2YXRlIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEudXNlY2FzZXMud29ya2Zsb3ciDQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYmxvZy5jbXMudXNlY2FzZXMuRGVhY3RpdmF0ZSI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2Jsb2cvdXNlY2FzZXMvd29ya2Zsb3cvZGVhY3RpdmF0ZS5qeCIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdvcmtmbG93LXB1Ymxpc2gueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd29ya2Zsb3ctcHVibGlzaC54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2YTY0OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd29ya2Zsb3ctcHVibGlzaC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2Jsb2cvd29ya2Zsb3cucHVibGlzaCddIj4KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJibG9nL3dvcmtmbG93LnB1Ymxpc2giCi0gICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPSJsZW55YS53b3JrZmxvdyIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5ibG9nLmNtcy51c2VjYXNlcy5QdWJsaXNoIj4KLSAgICA8dmlldyB1cmk9Im1vZHVsZXMvYmxvZy91c2VjYXNlcy93b3JrZmxvdy9wdWJsaXNoLmp4Ii8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTg3YjY5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5ibG9nPC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy53b3JrZmxvdyIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPkJsb2c8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPkJsb2cgbW9kdWxlPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vZ2VuZXJhdGlvbi9CbG9nR2VuZXJhdG9yLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2dlbmVyYXRpb24vQmxvZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA5NzVjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vZ2VuZXJhdGlvbi9CbG9nR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLlByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIEJsb2cgZW50cnkgZ2VuZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9nR2VuZXJhdG9yIGV4dGVuZHMgU2VydmljZWFibGVHZW5lcmF0b3IgewotCi0gICAgLyoqIFRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGdlbmVyYXRvci4gKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPSAiaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2Jsb2cvMS4wIjsKLQotICAgIC8qKiBUaGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgdGhpcyBuYW1lc3BhY2UuICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gImJsb2ciOwotCi0gICAgLyoqIE5vZGUgYW5kIGF0dHJpYnV0ZSBuYW1lcyAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJMT0dfTk9ERV9OQU1FID0gImJsb2ciOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUllfTk9ERV9OQU1FID0gImVudHJ5IjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfQVRUUl9OQU1FID0gInBhdGgiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVE1PRF9BVFRSX05BTUUgPSAibGFzdE1vZGlmaWVkIjsKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG9iamVjdCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gQXR0cmlidXRlc0ltcGwgZm9yIGV2ZXJ5IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEF0dHJpYnV0ZXNJbXBsIGF0dHJpYnV0ZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgTGVueWEtQXJlYSB3aGVyZSB0aGUgZ2VuZXJhdG9yIHNob3VsZCB3b3JrIG9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBhcmVhOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVjZW50OwotCi0gICAgLyoqCi0gICAgICogT25seSBnZW5lcmF0ZSB0aGUgI251bXJlY2VudCBlbnRyaWVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBudW1yZWNlbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHJlcXVlc3QgcGFyYW1ldGVycy4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBnZW5lcmF0ZSBtZXRob2QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc29sdmVyIHRoZSBTb3VyY2VSZXNvbHZlciBvYmplY3QKLSAgICAgKiBAcGFyYW0gb2JqZWN0TW9kZWwgYSA8Y29kZT5NYXA8L2NvZGU+IGNvbnRhaW5pbmcgbW9kZWwgb2JqZWN0Ci0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIFVSSSAoaWdub3JlZCkKLSAgICAgKiBAcGFyYW0gcGFyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldHVwKFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBNYXAgb2JqZWN0TW9kZWwsIFN0cmluZyBzcmMsIFBhcmFtZXRlcnMgcGFyKQotICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXR1cChyZXNvbHZlciwgb2JqZWN0TW9kZWwsIHNyYywgcGFyKTsKLQotICAgICAgICBhcmVhID0gcGFyLmdldFBhcmFtZXRlcigiYXJlYSIsIG51bGwpOwotICAgICAgICBpZiAoYXJlYSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIm5vIGFyZWEgc3BlY2lmaWVkIik7Ci0gICAgICAgIGlmIChhcmVhLmVxdWFscyhQdWJsaWNhdGlvbi5MSVZFX0FSRUEpKQotICAgICAgICAgICAgbnVtcmVjZW50ID0gMTY7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG51bXJlY2VudCA9IDA7Ci0KLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgWE1MIGRhdGEuCi0gICAgICogCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIG91dHB1dHRpbmcgdGhlIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQotICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydFByZWZpeE1hcHBpbmcoUFJFRklYLCBVUkkpOwotICAgICAgICBhdHRyaWJ1dGVzLmNsZWFyKCk7Ci0KLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQoVVJJLAotICAgICAgICAgICAgICAgIEJMT0dfTk9ERV9OQU1FLAotICAgICAgICAgICAgICAgIFBSRUZJWCArICc6JyArIEJMT0dfTk9ERV9OQU1FLAotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOwotCi0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIFNpdGVNYW5hZ2VyIHNpdGVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3QodGhpcy5vYmplY3RNb2RlbCk7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKHRoaXMubWFuYWdlciwgcmVxdWVzdCk7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHNlc3Npb24pOwotICAgICAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBQdWJsaWNhdGlvblV0aWwuZ2V0UHVibGljYXRpb24odGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLQotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3QocHVibGljYXRpb24uZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotCi0gICAgICAgICAgICBEb2N1bWVudFtdIGRvY3MgPSBzaXRlTWFuYWdlci5nZXREb2N1bWVudHMobWFwLCBwdWJsaWNhdGlvbiwgYXJlYSk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydCgoT2JqZWN0W10pIGRvY3MsIG5ldyBDb21wYXJhdG9yKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZSBkMSA9IG5ldyBEYXRlKCgoRG9jdW1lbnQpIG8yKS5nZXRMYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEYXRlIGQyID0gbmV3IERhdGUoKChEb2N1bWVudCkgbzEpLmdldExhc3RNb2RpZmllZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkMi5jb21wYXJlVG8oZDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtcmVjZW50ID4gMCAmJiBudW1yZWNlbnQgPD0gaSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkb2NzW2ldLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvZW50cmllcy8iKSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBQQVRIX0FUVFJfTkFNRSwgUEFUSF9BVFRSX05BTUUsICJDREFUQSIsIHBhdGgpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVNUTU9EX0FUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVNUTU9EX0FUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0RBVEEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGRvY3NbaV0uZ2V0TGFzdE1vZGlmaWVkKCkpKTsKLQotICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChVUkksIEVOVFJZX05PREVfTkFNRSwgUFJFRklYICsgJzonCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBFTlRSWV9OT0RFX05BTUUsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoVVJJLCBFTlRSWV9OT0RFX05BTUUsIFBSRUZJWCArICc6JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRU5UUllfTk9ERV9OQU1FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHNpdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KFVSSSwgQkxPR19OT0RFX05BTUUsIFBSRUZJWCArICc6JyArIEJMT0dfTk9ERV9OQU1FKTsKLQotICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoUFJFRklYKTsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vZ2VuZXJhdGlvbi9CbG9nT3ZlcnZpZXdHZW5lcmF0b3IuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vZ2VuZXJhdGlvbi9CbG9nT3ZlcnZpZXdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhZjhjNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2dlbmVyYXRpb24vQmxvZ092ZXJ2aWV3R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aEFQSTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIEJsb2dPdmVydmlld0dlbmVyYXRvcgotICogCi0gKiBCdWlsZHMgYW4gb3JkZXJlZCB0cmVlIGZyb20gdGhlIGJsb2cgZW50cmllcyBpbiB0aGUKLSAqIHJlcG9zaXRvcnksIGFsbG93cyBzaW1wbGUgcXVlcmllcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQmxvZ092ZXJ2aWV3R2VuZXJhdG9yIGV4dGVuZHMgU2VydmljZWFibGVHZW5lcmF0b3IgewotCi0gICAgLyoqIFRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGdlbmVyYXRvci4gKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPSAiaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2Jsb2cvMS4wIjsKLQotICAgIC8qKiBUaGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgdGhpcyBuYW1lc3BhY2UuICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gImJsb2ciOwotCi0gICAgLyoqIE5vZGUgYW5kIGF0dHJpYnV0ZSBuYW1lcyAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJMT0dfTk9ERV9OQU1FID0gIm92ZXJ2aWV3IjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRSWV9OT0RFX05BTUUgPSAiZW50cnkiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9BVFRSX05BTUUgPSAicGF0aCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQVRUUl9OQU1FID0gInVybCI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEVfQVRUUl9OQU1FID0gInRpdGxlIjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUTU9EX0FUVFJfTkFNRSA9ICJsYXN0TW9kaWZpZWQiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUX0FUVFJfTkFNRSA9ICJzdHJ1Y3R1cmUiOwotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFlFQVJfTk9ERV9OQU1FID0gInllYXIiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OVEhfTk9ERV9OQU1FID0gIm1vbnRoIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBWV9OT0RFX05BTUUgPSAiZGF5IjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJfTkFNRSA9ICJpZCI7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBvYmplY3QsIHNvIHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGFuIEF0dHJpYnV0ZXNJbXBsIGZvcgotICAgICAqIGV2ZXJ5IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEF0dHJpYnV0ZXNJbXBsIGF0dHJpYnV0ZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgTGVueWEtQXJlYSB3aGVyZSB0aGUgZ2VuZXJhdG9yIHNob3VsZCB3b3JrIG9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBhcmVhOwotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCAgeWVhcjsKLSAgICBwcm90ZWN0ZWQgaW50ICBtb250aDsKLSAgICBwcm90ZWN0ZWQgaW50ICBkYXk7ICAgICAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0cnVjdHVyZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgcmVxdWVzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZ2VuZXJhdGUgbWV0aG9kLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvbHZlcgotICAgICAqICAgICAgICAgICAgdGhlIFNvdXJjZVJlc29sdmVyIG9iamVjdAotICAgICAqIEBwYXJhbSBvYmplY3RNb2RlbAotICAgICAqICAgICAgICAgICAgYSA8Y29kZT5NYXA8L2NvZGU+IGNvbnRhaW5pbmcgbW9kZWwgb2JqZWN0Ci0gICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBVUkkgKGlnbm9yZWQpCi0gICAgICogQHBhcmFtIHBhcgotICAgICAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0dXAoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RNb2RlbCwgU3RyaW5nIHNyYywKLSAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgc3VwZXIuc2V0dXAocmVzb2x2ZXIsIG9iamVjdE1vZGVsLCBzcmMsIHBhcik7Ci0KLSAgICAgICAgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3QodGhpcy5vYmplY3RNb2RlbCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBwYXJhbSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ5ZWFyIik7Ci0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSAKLSAgICAgICAgICAgIHllYXIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcmFtKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeWVhciA9IDA7Ci0gICAgICAgIHBhcmFtID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm1vbnRoIik7Ci0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSAKLSAgICAgICAgICAgIG1vbnRoID0gSW50ZWdlci5wYXJzZUludChwYXJhbSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1vbnRoID0gMDsKLSAgICAgICAgcGFyYW0gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF5Iik7Ci0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSAKLSAgICAgICAgICAgIGRheSA9IEludGVnZXIucGFyc2VJbnQocGFyYW0pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkYXkgPSAwOwotICAgIAotICAgICAgICBzdHJ1Y3R1cmUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3RydWN0Iik7Ci0gICAgICAgIGlmIChzdHJ1Y3R1cmUgIT0gbnVsbCkgewotICAgICAgICAgICAgeWVhciA9IG1vbnRoID0gZGF5ID0gMDsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICBhcmVhID0gcGFyLmdldFBhcmFtZXRlcigiYXJlYSIsIG51bGwpOwotICAgICAgICBpZiAoYXJlYSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIm5vIGFyZWEgc3BlY2lmaWVkIik7ICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSBYTUwgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBvdXRwdXR0aW5nIHRoZSBkb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKFBSRUZJWCwgVVJJKTsKLSAgICAgICAgYXR0cmlidXRlcy5jbGVhcigpOwotCi0gICAgICAgIGlmIChzdHJ1Y3R1cmUgIT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIFNUUlVDVF9BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIFNUUlVDVF9BVFRSX05BTUUsICJDREFUQSIsIFN0cmluZy52YWx1ZU9mKHN0cnVjdHVyZSkpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KFVSSSwgQkxPR19OT0RFX05BTUUsIFBSRUZJWCArICc6JwotICAgICAgICAgICAgICAgICsgQkxPR19OT0RFX05BTUUsIGF0dHJpYnV0ZXMpOwotCi0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIFNpdGVNYW5hZ2VyIHNpdGVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsgICAgICAgICAgICAKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24odGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KHRoaXMubWFuYWdlciwgc2Vzc2lvbik7Ci0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoU2l0ZU1hbmFnZXIuUk9MRQotICAgICAgICAgICAgICAgICAgICArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgc2l0ZU1hbmFnZXIgPSAoU2l0ZU1hbmFnZXIpIHNlbGVjdG9yLnNlbGVjdChwdWJsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAuZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotCi0gICAgICAgICAgICBEb2N1bWVudFtdIGRvY3MgPSBzaXRlTWFuYWdlci5nZXREb2N1bWVudHMobWFwLCBwdWJsaWNhdGlvbiwgYXJlYSk7Ci0gICAgICAgICAgICBBcnJheUxpc3QgZmlsdGVyZWREb2NzID0gbmV3IEFycmF5TGlzdCgxKTsgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZG9jcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZG9jc1tpXS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiL2VudHJpZXMvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVZZWFyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVNb250aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlRGF5ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSBwYXRoLnNwbGl0KCIvIik7Ci0gICAgICAgICAgICAgICAgICAgIGVZZWFyID0gSW50ZWdlci5wYXJzZUludChwYXR0ZXJuc1syXSk7Ci0gICAgICAgICAgICAgICAgICAgIGVNb250aCA9IEludGVnZXIucGFyc2VJbnQocGF0dGVybnNbM10pOwotICAgICAgICAgICAgICAgICAgICBlRGF5ID0gSW50ZWdlci5wYXJzZUludChwYXR0ZXJuc1s0XSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBtYXRjaGluZyBkb2N1bWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHllYXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeWVhciA9PSBlWWVhcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb250aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbnRoID09IGVNb250aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRheSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF5ID09IGVEYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRheSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXkgPT0gZURheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9udGggPiAwbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbnRoID09IGVNb250aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXkgPT0gZURheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRheSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF5ID09IGVEYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGQpIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREb2NzLmFkZCgoT2JqZWN0KWRvY3NbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHNvcnQgZW50cmllcyBieSB5ZWFyIC0+IG1vbnRoIC0+IGRheSAtPiBsYXN0TW9kaWZpZWQgKi8KLSAgICAgICAgICAgIE9iamVjdFtdIHNvcnRlZExpc3QgPSBmaWx0ZXJlZERvY3MudG9BcnJheSgpOyAgICAgICAgICAgIAotICAgICAgICAgICAgQXJyYXlzLnNvcnQoc29ydGVkTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGQxLGQyOwotICAgICAgICAgICAgICAgICAgICBpbnQgeWVhcjEsbW9udGgxLGRheTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCB5ZWFyMixtb250aDIsZGF5MjsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGQxID0gKERvY3VtZW50KW8xOwotICAgICAgICAgICAgICAgICAgICBkMiA9IChEb2N1bWVudClvMjsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhdHRlcm5zOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybnMgPSBkMS5nZXRQYXRoKCkuc3BsaXQoIi8iKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB5ZWFyMSA9IEludGVnZXIucGFyc2VJbnQocGF0dGVybnNbMl0pOwotICAgICAgICAgICAgICAgICAgICBtb250aDEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhdHRlcm5zWzNdKTsKLSAgICAgICAgICAgICAgICAgICAgZGF5MSA9IEludGVnZXIucGFyc2VJbnQocGF0dGVybnNbNF0pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5zID0gZDIuZ2V0UGF0aCgpLnNwbGl0KCIvIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeWVhcjIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhdHRlcm5zWzJdKTsKLSAgICAgICAgICAgICAgICAgICAgbW9udGgyID0gSW50ZWdlci5wYXJzZUludChwYXR0ZXJuc1szXSk7Ci0gICAgICAgICAgICAgICAgICAgIGRheTIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhdHRlcm5zWzRdKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoeWVhcjEgPiB5ZWFyMikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeWVhcjEgPT0geWVhcjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb250aDEgPiBtb250aDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9udGgxID09IG1vbnRoMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXkxID4gZGF5MikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRheTEgPT0gZGF5MikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXdlc3QgZmlyc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgZGF0ZTEgPSBuZXcgRGF0ZShkMS5nZXRMYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlIGRhdGUyID0gbmV3IERhdGUoZDIuZ2V0TGFzdE1vZGlmaWVkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUyLmNvbXBhcmVUbyhkYXRlMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIGdyb3VwIGVudHJpZXMgYnkgeWVhciAtPiBtb250aCAtPiBkYXkgKi8KLSAgICAgICAgICAgIC8qIHdvcmtzIGJlY2F1c2UgdGhlIGxpc3QgaXMgc29ydGVkID0pICovCi0gICAgICAgICAgICBpbnQgY3VycmVudFllYXIgPSAwOwotICAgICAgICAgICAgaW50IGN1cnJlbnRNb250aCA9IDA7Ci0gICAgICAgICAgICBpbnQgY3VycmVudERheSA9IDA7Ci0gICAgICAgICAgICBib29sZWFuIHllYXJPcGVuID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIG1vbnRoT3BlbiA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBkYXlPcGVuID0gZmFsc2U7ICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c29ydGVkTGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9ICgoRG9jdW1lbnQpc29ydGVkTGlzdFtpXSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSBkb2MuZ2V0UGF0aCgpLnNwbGl0KCIvIik7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCB5ZWFyID0gIEludGVnZXIucGFyc2VJbnQocGF0dGVybnNbMl0pOwotICAgICAgICAgICAgICAgIGludCBtb250aCA9IEludGVnZXIucGFyc2VJbnQocGF0dGVybnNbM10pOwotICAgICAgICAgICAgICAgIGludCBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KHBhdHRlcm5zWzRdKTsKLSAgICAgICAgICAgICAgICBpZiAoeWVhciAhPSBjdXJyZW50WWVhcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGF5T3BlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGF5T3BlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KFVSSSwgREFZX05PREVfTkFNRSwgUFJFRklYICsgJzonCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgREFZX05PREVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbnRoT3BlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhPcGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoVVJJLCBNT05USF9OT0RFX05BTUUsIFBSRUZJWCArICc6JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1PTlRIX05PREVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHllYXJPcGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoVVJJLCBZRUFSX05PREVfTkFNRSwgUFJFRklYICsgJzonCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgWUVBUl9OT0RFX05BTUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgSURfQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0FUVFJfTkFNRSwgIkNEQVRBIiwgU3RyaW5nLnZhbHVlT2YoeWVhcikpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChVUkksIFlFQVJfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFlFQVJfTk9ERV9OQU1FLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgeWVhck9wZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50WWVhciA9IHllYXI7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb250aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXkgPSAwOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBpZiAobW9udGggIT0gY3VycmVudE1vbnRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkYXlPcGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXlPcGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoVVJJLCBEQVlfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBEQVlfTk9ERV9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobW9udGhPcGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoVVJJLCBNT05USF9OT0RFX05BTUUsIFBSRUZJWCArICc6JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1PTlRIX05PREVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBJRF9BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfQVRUUl9OQU1FLCAiQ0RBVEEiLCBTdHJpbmcudmFsdWVPZihtb250aCkpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChVUkksIE1PTlRIX05PREVfTkFNRSwgUFJFRklYICsgJzonCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNT05USF9OT0RFX05BTUUsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICBtb250aE9wZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9udGggPSBtb250aDsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudERheSA9IDA7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBpZiAoZGF5ICE9IGN1cnJlbnREYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRheU9wZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChVUkksIERBWV9OT0RFX05BTUUsIFBSRUZJWCArICc6JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIERBWV9OT0RFX05BTUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgSURfQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0FUVFJfTkFNRSwgIkNEQVRBIiwgU3RyaW5nLnZhbHVlT2YoZGF5KSk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KFVSSSwgREFZX05PREVfTkFNRSwgUFJFRklYICsgJzonCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBEQVlfTk9ERV9OQU1FLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgZGF5T3BlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXkgPSBkYXk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc3RydWN0dXJlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgUEFUSF9BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFUSF9BVFRSX05BTUUsICJDREFUQSIsIGRvYy5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgVVJMX0FUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxfQVRUUl9OQU1FLCAiQ0RBVEEiLCBkb2MuZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCkpOwotICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2NET00gPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoZG9jLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHBhcmVudCA9IGRvY0RPTS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIFhQYXRoQVBJLnNlbGVjdFNpbmdsZU5vZGUocGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIi8qW2xvY2FsLW5hbWUoKSA9ICdlbnRyeSddLypbbG9jYWwtbmFtZSgpID0gJ3RpdGxlJ10iKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIFRJVExFX0FUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVRMRV9BVFRSX05BTUUsICJDREFUQSIsRG9jdW1lbnRIZWxwZXIuZ2V0U2ltcGxlRWxlbWVudFRleHQoZWxlbWVudCkpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgTEFTVE1PRF9BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFTVE1PRF9BVFRSX05BTUUsICJDREFUQSIsIFN0cmluZy52YWx1ZU9mKGRvYy5nZXRMYXN0TW9kaWZpZWQoKSkpOyAKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRIZWxwZXIuZ2V0U2ltcGxlRWxlbWVudFRleHQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KFVSSSwgRU5UUllfTk9ERV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRUZJWCArICc6JyArIEVOVFJZX05PREVfTkFNRSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChVUkksIEVOVFJZX05PREVfTkFNRSwgUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnOicgKyBFTlRSWV9OT0RFX05BTUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGRheU9wZW4pIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoVVJJLCBEQVlfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicKLSAgICAgICAgICAgICAgICAgICAgICAgICsgREFZX05PREVfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobW9udGhPcGVuKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KFVSSSwgTU9OVEhfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicKLSAgICAgICAgICAgICAgICAgICAgICAgICsgTU9OVEhfTk9ERV9OQU1FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh5ZWFyT3BlbikgewotICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChVUkksIFlFQVJfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicKLSAgICAgICAgICAgICAgICAgICAgICAgICsgWUVBUl9OT0RFX05BTUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShzaXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChVUkksIEJMT0dfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicKLSAgICAgICAgICAgICAgICArIEJMT0dfTk9ERV9OQU1FKTsKLQotICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoUFJFRklYKTsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ibG9nL2Ntcy91c2VjYXNlcy9EZWFjdGl2YXRlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYmxvZy9jbXMvdXNlY2FzZXMvRGVhY3RpdmF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM4ODEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ibG9nL2Ntcy91c2VjYXNlcy9EZWFjdGl2YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYmxvZy5jbXMudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci0KLS8qKgotICogRGVhY3RpdmF0ZSB1c2VjYXNlIGhhbmRsZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogRGVhY3RpdmF0ZS5qYXZhIDI2NDgwNSAyMDA1LTA4LTMwIDE2OjIwOjE1WiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIERlYWN0aXZhdGUgZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSB3b3JrZmxvdyBldmVudCBpcyBzdXBwb3J0ZWQgYW5kIHRoZSBwYXJlbnQgb2YgdGhlIGRvY3VtZW50IGV4aXN0cyBpbiB0aGUgbGl2ZQotICAgICAqIGFyZWEuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKCFoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgaWYgKCFnZXRTb3VyY2VEb2N1bWVudCgpLmdldEFyZWEoKS5lcXVhbHMoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBmcm9tIHRoZSBhdXRob3JpbmcgYXJlYS4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgZXZlbnQgPSBnZXRFdmVudCgpOwotICAgICAgICAgICAgaWYgKCFXb3JrZmxvd1V0aWwuY2FuSW52b2tlKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLAotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlRG9jdW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQpKSB7Ci0gICAgICAgICAgICAgICAgYWRkSW5mb01lc3NhZ2UoIlRoZSBkb2N1bWVudCBjYW5ub3QgYmUgZGVhY3RpdmF0ZWQgYmVjYXVzZSB0aGUgd29ya2Zsb3cgZXZlbnQgY2Fubm90IGJlIGludm9rZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10gZ2V0Tm9kZXNUb0xvY2soKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGxpdmVEb2MgPSBkb2MuZ2V0QXJlYVZlcnNpb24oUHVibGljYXRpb24uTElWRV9BUkVBKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIG5vZGVzLmFkZChkb2MuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgICAgICBub2Rlcy5hZGQobGl2ZURvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIG5vZGVzLmFkZChsaXZlRG9jLmFyZWEoKS5nZXRTaXRlKCkuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgICAgICBub2Rlcy5hZGQoZG9jLmFyZWEoKS5nZXRTaXRlKCkuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gKG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZVtdKSBub2Rlcy50b0FycmF5KG5ldyBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbbm9kZXMuc2l6ZSgpXSk7ICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgICAgIGRlYWN0aXZhdGUoZ2V0U291cmNlRG9jdW1lbnQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVhY3RpdmF0ZXMgYSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXV0aG9yaW5nRG9jdW1lbnQgVGhlIGF1dGhvcmluZyBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlKERvY3VtZW50IGF1dGhvcmluZ0RvY3VtZW50KSB7Ci0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0KLSAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBsaXZlRG9jdW1lbnQgPSBhdXRob3JpbmdEb2N1bWVudC5nZXRBcmVhVmVyc2lvbihQdWJsaWNhdGlvbi5MSVZFX0FSRUEpOwotCi0gICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIGRvY3VtZW50TWFuYWdlci5kZWxldGUobGl2ZURvY3VtZW50KTsKLSAgICAgICAgIAotICAgICAgICAgICAgV29ya2Zsb3dVdGlsLmludm9rZSh0aGlzLm1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgIGdldFNlc3Npb24oKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCksCi0gICAgICAgICAgICAgICAgICAgIGF1dGhvcmluZ0RvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICBnZXRFdmVudCgpKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJEZWFjdGl2YXRlIGRvY3VtZW50IFsiICsgYXV0aG9yaW5nRG9jdW1lbnQgKyAiXS4gU3VjY2VzczogWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3VjY2VzcyArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShkb2N1bWVudE1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBldmVudCB0byBpbnZva2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXZlbnQoKSB7Ci0gICAgICAgIHJldHVybiAiZGVhY3RpdmF0ZSI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ibG9nL2Ntcy91c2VjYXNlcy9EZWxldGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ibG9nL2Ntcy91c2VjYXNlcy9EZWxldGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2Y2EyYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYmxvZy9jbXMvdXNlY2FzZXMvRGVsZXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYmxvZy5jbXMudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci0KLS8qKgotICogRGVhY3RpdmF0ZSB1c2VjYXNlIGhhbmRsZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogRGVhY3RpdmF0ZS5qYXZhIDI2NDgwNSAyMDA1LTA4LTMwIDE2OjIwOjE1WiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZSBleHRlbmRzIERvY3VtZW50VXNlY2FzZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSB3b3JrZmxvdyBldmVudCBpcyBzdXBwb3J0ZWQgYW5kIHRoZSBwYXJlbnQgb2YgdGhlIGRvY3VtZW50IGV4aXN0cyBpbiB0aGUgbGl2ZQotICAgICAqIGFyZWEuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKCFoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgaWYgKCFnZXRTb3VyY2VEb2N1bWVudCgpLmdldEFyZWEoKS5lcXVhbHMoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBmcm9tIHRoZSBhdXRob3JpbmcgYXJlYS4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEb2N1bWVudCBsaXZlRG9jdW1lbnQgPSBnZXRTb3VyY2VEb2N1bWVudCgpLmdldEFyZWFWZXJzaW9uKFB1YmxpY2F0aW9uLkxJVkVfQVJFQSk7Ci0gICAgICAgICAgICBpZiAobGl2ZURvY3VtZW50LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGUgZG9jdW1lbnQgY2Fubm90IGJlIGRlbGV0ZWQgYmVjYXVzZSBpdCdzIExpdmUsIGRlYWN0aXZhdGUgaXQgZmlyc3QiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgZXZlbnQgPSBnZXRFdmVudCgpOwotICAgICAgICAgICAgaWYgKCFXb3JrZmxvd1V0aWwuY2FuSW52b2tlKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLAotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlRG9jdW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQpKSB7Ci0gICAgICAgICAgICAgICAgYWRkSW5mb01lc3NhZ2UoIlRoZSBkb2N1bWVudCBjYW5ub3QgYmUgZGVhY3RpdmF0ZWQgYmVjYXVzZSB0aGUgd29ya2Zsb3cgZXZlbnQgY2Fubm90IGJlIGludm9rZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10gZ2V0Tm9kZXNUb0xvY2soKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsgICAgICAgICAgIAotICAgICAgICAgICAgbm9kZXMuYWRkKGRvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIG5vZGVzLmFkZChkb2MuYXJlYSgpLmdldFNpdGUoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAob3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10pIG5vZGVzLnRvQXJyYXkobmV3IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZVtub2Rlcy5zaXplKCldKTsgICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVc2VjYXNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgZGVsZXRlKGdldFNvdXJjZURvY3VtZW50KCkpOyAgICAgICAgCi0gICAgICAgIHNldFRhcmdldERvY3VtZW50KGdldERvY3VtZW50RmFjdG9yeSgpLmdldChnZXRTb3VyY2VEb2N1bWVudCgpLmdldFB1YmxpY2F0aW9uKCksIFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBLCIvZmVlZHMvYWxsL2luZGV4IikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIGRlbGV0ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGUoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jdW1lbnRNYW5hZ2VyID0gKERvY3VtZW50TWFuYWdlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIuZGVsZXRlKGRvY3VtZW50KTsgICAgICAgCi0gICAgICAgICAgICBXb3JrZmxvd1V0aWwuaW52b2tlKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLAotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIGdldEV2ZW50KCkpOwotICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRlbGV0ZSBkb2N1bWVudCBbIiArIGdldFNvdXJjZURvY3VtZW50KCkgKyAiXS4gU3VjY2VzczogWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3VjY2VzcyArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShkb2N1bWVudE1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZXZlbnQgdG8gaW52b2tlLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gImRlbGV0ZSI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ibG9nL2Ntcy91c2VjYXNlcy9QdWJsaXNoLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvYmxvZy9jbXMvdXNlY2FzZXMvUHVibGlzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTkyMzUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ibG9nL2Ntcy91c2VjYXNlcy9QdWJsaXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuYmxvZy5jbXMudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudFNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5Ob2RlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Eb2N1bWVudFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LldvcmtmbG93VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlcy5Vc2VjYXNlV29ya2Zsb3dIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuV29ya2Zsb3dhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhBUEk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBQdWJsaXNoIHVzZWNhc2UgaGFuZGxlci4KLSAqIAotICogQHZlcnNpb24gJElkOiBQdWJsaXNoLmphdmEgMjA5NjEyIDIwMDUtMDctMDcgMTY6NTI6NDRaIGNoZXN0bnV0ICQKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2ggZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19ET0NVTUVOVFMgPSAibWlzc2luZ0RvY3VtZW50cyI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIERvY3VtZW50U2V0IHNldCA9IG5ldyBEb2N1bWVudFNldCgpOwotCi0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICAgICAgTm9kZVNldCBzdWJzaXRlID0gU2l0ZVV0aWwuZ2V0U3ViU2l0ZSh0aGlzLm1hbmFnZXIsIGRvYy5nZXRMaW5rKCkuZ2V0Tm9kZSgpKTsKLSAgICAgICAgICAgIHNldC5hZGRBbGwobmV3IERvY3VtZW50U2V0KHN1YnNpdGUuZ2V0RG9jdW1lbnRzKCkpKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBzZXQuZ2V0RG9jdW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG5vZGVzLmFkZChkb2N1bWVudHNbaV0uZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFyZWEgbGl2ZSA9IGRvYy5nZXRQdWJsaWNhdGlvbigpLmdldEFyZWEoUHVibGljYXRpb24uTElWRV9BUkVBKTsKLSAgICAgICAgICAgIG5vZGVzLmFkZChsaXZlLmdldFNpdGUoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpKTsKLSAgICAgICAgICAgIHJldHVybiAoTm9kZVtdKSBub2Rlcy50b0FycmF5KG5ldyBOb2RlW25vZGVzLnNpemUoKV0pOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgd29ya2Zsb3cgZXZlbnQgaXMgc3VwcG9ydGVkIGFuZCB0aGUgcGFyZW50IG9mIHRoZSBkb2N1bWVudAotICAgICAqIGV4aXN0cyBpbiB0aGUgbGl2ZSBhcmVhLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIGlmICghaGFzRXJyb3JzKCkpIHsKLQotICAgICAgICAgICAgU3RyaW5nIGV2ZW50ID0gZ2V0RXZlbnQoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRBcmVhKCkuZXF1YWxzKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKSkgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhpcyB1c2VjYXNlIGNhbiBvbmx5IGJlIGludm9rZWQgZnJvbSB0aGUgYXV0aG9yaW5nIGFyZWEuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBVc2VjYXNlV29ya2Zsb3dIZWxwZXIuY2hlY2tXb3JrZmxvdyh0aGlzLm1hbmFnZXIsIHRoaXMsIGV2ZW50LCBkb2N1bWVudCwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50IGF1dGhvcmluZ0RvY3VtZW50ID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChhdXRob3JpbmdEb2N1bWVudC5nZXRSZXNvdXJjZVR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJlbnRyeSIpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQmxvZ0VudHJ5KGF1dGhvcmluZ0RvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUZlZWQoKTsKLSAgICAgICAgICAgIGRvY3VtZW50TWFuYWdlciA9IChEb2N1bWVudE1hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoRG9jdW1lbnRNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgZG9jdW1lbnRNYW5hZ2VyLmNvcHlUb0FyZWEoYXV0aG9yaW5nRG9jdW1lbnQsIFB1YmxpY2F0aW9uLkxJVkVfQVJFQSk7Ci0gICAgICAgICAgICBXb3JrZmxvd1V0aWwuaW52b2tlKHRoaXMubWFuYWdlciwgZ2V0U2Vzc2lvbigpLCBnZXRMb2dnZXIoKSwgYXV0aG9yaW5nRG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIGdldEV2ZW50KCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShkb2N1bWVudE1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRmVlZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERvY3VtZW50W10gZG9jcyA9IG5ldyBEb2N1bWVudFsyXTsKLSAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnRbXSBkb21zID0gbmV3IG9yZy53M2MuZG9tLkRvY3VtZW50WzJdOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UHVibGljYXRpb24oKTsKLSAgICAgICAgQXJlYSBhdXRob3JpbmcgPSBwdWIuZ2V0QXJlYShQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSk7Ci0gICAgICAgIEFyZWEgbGl2ZSA9IHB1Yi5nZXRBcmVhKFB1YmxpY2F0aW9uLkxJVkVfQVJFQSk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gIi9mZWVkcy9hbGwvaW5kZXgiOwotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBwdWIuZ2V0RGVmYXVsdExhbmd1YWdlKCk7Ci0KLSAgICAgICAgZG9jc1swXSA9IGxpdmUuZ2V0U2l0ZSgpLmdldE5vZGUocGF0aCkuZ2V0TGluayhsYW5ndWFnZSkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgZG9jc1sxXSA9IGF1dGhvcmluZy5nZXRTaXRlKCkuZ2V0Tm9kZShwYXRoKS5nZXRMaW5rKGxhbmd1YWdlKS5nZXREb2N1bWVudCgpOwotCi0gICAgICAgIERhdGVGb3JtYXQgZGF0ZWZtdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MiKTsKLSAgICAgICAgRGF0ZUZvcm1hdCBvZnNmbXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiWiIpOwotICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotCi0gICAgICAgIFN0cmluZyBkYXRlb2ZzID0gb2ZzZm10LmZvcm1hdChkYXRlKTsKLSAgICAgICAgU3RyaW5nIGRhdGVzdHIgPSBkYXRlZm10LmZvcm1hdChkYXRlKSArIGRhdGVvZnMuc3Vic3RyaW5nKDAsIDMpICsgIjoiCi0gICAgICAgICAgICAgICAgKyBkYXRlb2ZzLnN1YnN0cmluZygzLCA1KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgZG9tc1tpXSA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudChkb2NzW2ldLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSBkb21zW2ldLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgLy8gc2V0IG1vZGlmaWVkIGRhdGUgb24gcHVibGlzaAotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIFhQYXRoQVBJLnNlbGVjdFNpbmdsZU5vZGUocGFyZW50LAotICAgICAgICAgICAgICAgICAgICAiLypbbG9jYWwtbmFtZSgpID0gJ2ZlZWQnXS8qW2xvY2FsLW5hbWUoKSA9ICdtb2RpZmllZCddIik7Ci0gICAgICAgICAgICBEb2N1bWVudEhlbHBlci5zZXRTaW1wbGVFbGVtZW50VGV4dChlbGVtZW50LCBkYXRlc3RyKTsKLSAgICAgICAgICAgIERvY3VtZW50SGVscGVyLndyaXRlRG9jdW1lbnQoZG9tc1tpXSwgZG9jc1tpXS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCbG9nRW50cnkoRG9jdW1lbnQgZG9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9tID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KGRvYy5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgRWxlbWVudCBwYXJlbnQgPSBkb20uZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgRGF0ZUZvcm1hdCBkYXRlZm10ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcyIpOwotICAgICAgICBEYXRlRm9ybWF0IG9mc2ZtdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJaIik7Ci0gICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGRhdGVvZnMgPSBvZnNmbXQuZm9ybWF0KGRhdGUpOwotICAgICAgICBTdHJpbmcgZGF0ZXN0ciA9IGRhdGVmbXQuZm9ybWF0KGRhdGUpICsgZGF0ZW9mcy5zdWJzdHJpbmcoMCwgMykgKyAiOiIKLSAgICAgICAgICAgICAgICArIGRhdGVvZnMuc3Vic3RyaW5nKDMsIDUpOwotCi0gICAgICAgIC8vIHNldCBtb2RpZmllZCBkYXRlIG9uIHJlLXB1Ymxpc2gKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIFhQYXRoQVBJLnNlbGVjdFNpbmdsZU5vZGUocGFyZW50LAotICAgICAgICAgICAgICAgICIvKltsb2NhbC1uYW1lKCkgPSAnZW50cnknXS8qW2xvY2FsLW5hbWUoKSA9ICdtb2RpZmllZCddIik7Ci0gICAgICAgIERvY3VtZW50SGVscGVyLnNldFNpbXBsZUVsZW1lbnRUZXh0KGVsZW1lbnQsIGRhdGVzdHIpOwotCi0gICAgICAgIC8vIHNldCBpc3N1ZWQgZGF0ZSBvbiBmaXJzdCB0aW1lIHB1Ymxpc2gKLSAgICAgICAgV29ya2Zsb3dhYmxlIGR3ID0gV29ya2Zsb3dVdGlsLmdldFdvcmtmbG93YWJsZSh0aGlzLm1hbmFnZXIsIHRoaXMuZ2V0U2Vzc2lvbigpLCB0aGlzCi0gICAgICAgICAgICAgICAgLmdldExvZ2dlcigpLCBkb2MpOwotICAgICAgICBWZXJzaW9uIHZlcnNpb25zW10gPSBkdy5nZXRWZXJzaW9ucygpOwotICAgICAgICBib29sZWFuIHdhc0xpdmUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHZlcnNpb25zW2ldLmdldFZhbHVlKCJpc19saXZlIikpIHsKLSAgICAgICAgICAgICAgICB3YXNMaXZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXdhc0xpdmUpIHsKLSAgICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgWFBhdGhBUEkuc2VsZWN0U2luZ2xlTm9kZShwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICIvKltsb2NhbC1uYW1lKCkgPSAnZW50cnknXS8qW2xvY2FsLW5hbWUoKSA9ICdpc3N1ZWQnXSIpOwotICAgICAgICAgICAgRG9jdW1lbnRIZWxwZXIuc2V0U2ltcGxlRWxlbWVudFRleHQoZWxlbWVudCwgZGF0ZXN0cik7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudEhlbHBlci53cml0ZURvY3VtZW50KGRvbSwgZG9jLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBldmVudCB0byBpbnZva2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXZlbnQoKSB7Ci0gICAgICAgIHJldHVybiAicHVibGlzaCI7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZUJsb2dFbnRyeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZUJsb2dFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDg2Yjc4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DcmVhdGVCbG9nRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLmR1YmxpbmNvcmUuRHVibGluQ29yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQVBJOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVXNlY2FzZSB0byBjcmVhdGUgYSBCbG9nIGVudHJ5LgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVCbG9nRW50cnkgZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0lEID0gInBhcmVudElkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9UWVBFID0gImRvY3R5cGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0lEID0gImRvY3VtZW50SWQiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNnZXROb2Rlc1RvTG9jaygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSBnZXRTb3VyY2VEb2N1bWVudCgpLmFyZWEoKS5nZXRTaXRlKCk7Ci0gICAgICAgIE5vZGVbXSBub2RlcyA9IHsgc3RydWN0dXJlLmdldFJlcG9zaXRvcnlOb2RlKCkgfTsKLSAgICAgICAgcmV0dXJuIG5vZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIERvY3VtZW50IHBhcmVudCA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoUEFSRU5UX0lELCBwYXJlbnQuZ2V0UGF0aCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBkb2N1bWVudElkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoRE9DVU1FTlRfSUQpOwotCi0gICAgICAgIGlmIChkb2N1bWVudElkLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIGRvY3VtZW50IElEIGlzIHJlcXVpcmVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRvY3VtZW50SWQubWF0Y2hlcygiW15hLXpBLVowLTlcXC1dKyIpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlRoZSBkb2N1bWVudCBJRCBpcyBub3QgdmFsaWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5kb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSB2YWx1ZXMgbmVjZXNzYXJ5IGZvciBibG9nIGVudHJ5IGNyZWF0aW9uCi0gICAgICAgIERvY3VtZW50IHBhcmVudCA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IHBhcmVudC5nZXRQdWJsaWNhdGlvbigpLmdldERlZmF1bHRMYW5ndWFnZSgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBuZXcgZG9jdW1lbnQKLSAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gbm90ZTogc2luY2UgYmxvZyBkb2VzIG5vdCBoYXZlIGEgaGllcmFyY2h5LAotICAgICAgICAvLyBkb2N1bWVudCBpZCAoZnVsbCBwYXRoKSBhbmQgZG9jdW1lbnQgaWQtbmFtZSAodGhpcyBsZWFmJ3MgaWQpCi0gICAgICAgIC8vIGFyZSB0aGUgc2FtZQotICAgICAgICBEb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChSZXNvdXJjZVR5cGUuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgcmVzb3VyY2VUeXBlID0gKFJlc291cmNlVHlwZSkgc2VsZWN0b3Iuc2VsZWN0KGdldERvY3VtZW50VHlwZU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGRvY3VtZW50TWFuYWdlciA9IChEb2N1bWVudE1hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoRG9jdW1lbnRNYW5hZ2VyLlJPTEUpOwotCi0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkb2N1bWVudElkID0gZ2V0RG9jdW1lbnRJRCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgc2FtcGxlTmFtZSA9IHJlc291cmNlVHlwZS5nZXRTYW1wbGVOYW1lcygpWzBdOwotICAgICAgICAgICAgU3RyaW5nIHNhbXBsZVVyaSA9IHJlc291cmNlVHlwZS5nZXRTYW1wbGUoc2FtcGxlTmFtZSkuZ2V0VXJpKCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRNYW5hZ2VyLmFkZChtYXAsCi0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlVXJpLAotICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VEb2N1bWVudCgpLmdldFB1YmxpY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZURvY3VtZW50KCkuZ2V0QXJlYSgpLAotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudElkLAotICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSwKLSAgICAgICAgICAgICAgICAgICAgInhtbCIsCi0gICAgICAgICAgICAgICAgICAgIGdldFBhcmFtZXRlckFzU3RyaW5nKER1YmxpbkNvcmUuRUxFTUVOVF9USVRMRSksCi0gICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgICAgICB0cmFuc2Zvcm1YTUwoZG9jdW1lbnQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoZG9jdW1lbnRNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2UocmVzb3VyY2VUeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGJsb2cgcHVibGljYXRpb24gaGFzIGEgc3BlY2lmaWMgc2l0ZSBzdHJ1Y3R1cmluZzogaXQgZ3JvdXBzIG5vZGVzIGJ5IGRhdGUuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZSBzdHJ1Y3R1cmluZyBvZiBibG9nIGVudHJpZXM6Ci0gICAgICogPC9wPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+MjAwNDwvbGk+Ci0gICAgICogPGxpPjIwMDU8L2xpPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+MDE8L2xpPgotICAgICAqIDxsaT4wMjwvbGk+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4yMzwvbGk+Ci0gICAgICogPGxpPjI0PC9saT4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmFydGljbGUtb25lPC9saT4KLSAgICAgKiA8bGk+YXJ0aWNsZS10d288L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPC91bD4KLSAgICAgKiA8L3VsPgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgZG9jdW1lbnQgSUQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREb2N1bWVudElEKCkgewotICAgICAgICBEYXRlRm9ybWF0IGZtdHl5eXkgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eSIpOwotICAgICAgICBEYXRlRm9ybWF0IGZtdE1NID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NIik7Ci0gICAgICAgIERhdGVGb3JtYXQgZm10ZGQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQiKTsKLSAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKLQotICAgICAgICBTdHJpbmcgeWVhciA9IGZtdHl5eXkuZm9ybWF0KGRhdGUpOwotICAgICAgICBTdHJpbmcgbW9udGggPSBmbXRNTS5mb3JtYXQoZGF0ZSk7Ci0gICAgICAgIFN0cmluZyBkYXkgPSBmbXRkZC5mb3JtYXQoZGF0ZSk7Ci0KLSAgICAgICAgU3RyaW5nIGRvY3VtZW50SWQgPSAiL2VudHJpZXMvIiArIHllYXIgKyAiLyIgKyBtb250aCArICIvIiArIGRheSArICIvIgotICAgICAgICAgICAgICAgICsgZ2V0TmV3RG9jdW1lbnROYW1lKCkgKyAiL2luZGV4IjsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZG9jdW1lbnQgbmFtZS4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuQ3JlYXRlI2dldE5ld0RvY3VtZW50TmFtZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdEb2N1bWVudE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJBc1N0cmluZyhET0NVTUVOVF9JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQgdHlwZS4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuQ3JlYXRlI2dldERvY3VtZW50VHlwZU5hbWUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlckFzU3RyaW5nKERPQ1VNRU5UX1RZUEUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRyYW5zZm9ybVhNTChEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWFwIG9iamVjdE1vZGVsID0gQ29udGV4dEhlbHBlci5nZXRPYmplY3RNb2RlbChnZXRDb250ZXh0KCkpOwotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSAoSWRlbnRpdHkpIHNlc3Npb24uZ2V0QXR0cmlidXRlKElkZW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKER1YmxpbkNvcmUuRUxFTUVOVF9USVRMRSk7Ci0KLSAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgeG1sRG9jID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KGRvY3VtZW50LmdldElucHV0U3RyZWFtKCkpOwotCi0gICAgICAgIEVsZW1lbnQgcGFyZW50ID0geG1sRG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIk5ld0Jsb2dFbnRyeUNyZWF0b3IudHJhbnNmb3JtWE1MKCk6ICIgKyBkb2N1bWVudCk7Ci0KLSAgICAgICAgU3RyaW5nW10gc3RlcHMgPSBkb2N1bWVudC5nZXRQYXRoKCkuc3BsaXQoIi8iKTsKLSAgICAgICAgU3RyaW5nIG5vZGVJZCA9IHN0ZXBzWzVdOwotCi0gICAgICAgIC8vIFJlcGxhY2UgaWQKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIFhQYXRoQVBJLnNlbGVjdFNpbmdsZU5vZGUocGFyZW50LAotICAgICAgICAgICAgICAgICIvKltsb2NhbC1uYW1lKCkgPSAnZW50cnknXS8qW2xvY2FsLW5hbWUoKSA9ICdpZCddIik7Ci0KLSAgICAgICAgU3RyaW5nIHllYXIgPSBzdGVwc1syXTsKLSAgICAgICAgU3RyaW5nIG1vbnRoID0gc3RlcHNbM107Ci0gICAgICAgIFN0cmluZyBkYXkgPSBzdGVwc1s0XTsKLQotICAgICAgICBEb2N1bWVudEhlbHBlci5zZXRTaW1wbGVFbGVtZW50VGV4dChlbGVtZW50LCB5ZWFyICsgIi8iICsgbW9udGggKyAiLyIgKyBkYXkgKyAiLyIgKyBub2RlSWQpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgdGl0bGUKLSAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KSBYUGF0aEFQSS5zZWxlY3RTaW5nbGVOb2RlKHBhcmVudCwKLSAgICAgICAgICAgICAgICAiLypbbG9jYWwtbmFtZSgpID0gJ2VudHJ5J10vKltsb2NhbC1uYW1lKCkgPSAndGl0bGUnXSIpOwotICAgICAgICBEb2N1bWVudEhlbHBlci5zZXRTaW1wbGVFbGVtZW50VGV4dChlbGVtZW50LCB0aXRsZSk7Ci0KLSAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KSBYUGF0aEFQSS5zZWxlY3RTaW5nbGVOb2RlKHBhcmVudCwKLSAgICAgICAgICAgICAgICAiLypbbG9jYWwtbmFtZSgpID0gJ2VudHJ5J10vKltsb2NhbC1uYW1lKCkgPSAnbGluayddIik7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJyZWwiLCAiYWx0ZXJuYXRlIik7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJocmVmIiwgIiIpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L3htbCIpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgU3VtbWFyeQotICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpIFhQYXRoQVBJLnNlbGVjdFNpbmdsZU5vZGUocGFyZW50LAotICAgICAgICAgICAgICAgICIvKltsb2NhbC1uYW1lKCkgPSAnZW50cnknXS8qW2xvY2FsLW5hbWUoKSA9ICdzdW1tYXJ5J10iKTsKLSAgICAgICAgRG9jdW1lbnRIZWxwZXIuc2V0U2ltcGxlRWxlbWVudFRleHQoZWxlbWVudCwgIlN1bW1hcnkiKTsKLQotICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpIFhQYXRoQVBJLnNlbGVjdFNpbmdsZU5vZGUocGFyZW50LAotICAgICAgICAgICAgICAgICIvKltsb2NhbC1uYW1lKCkgPSAnZW50cnknXS8qW2xvY2FsLW5hbWUoKSA9ICdhdXRob3InXS8qW2xvY2FsLW5hbWUoKSA9ICduYW1lJ10iKTsKLQotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRWxlbWVudCBlbnRyeS9hdXRob3IvbmFtZSBub3QgZm91bmQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudEhlbHBlci5zZXRTaW1wbGVFbGVtZW50VGV4dChlbGVtZW50LCBpZGVudGl0eS5nZXRVc2VyKCkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSBkYXRlIGNyZWF0ZWQsIGlzc3VlZCBhbmQgbW9kaWZpZWQKLSAgICAgICAgRGF0ZUZvcm1hdCBkYXRlZm10ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcyIpOwotICAgICAgICBEYXRlRm9ybWF0IG9mc2ZtdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJaIik7Ci0gICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGRhdGVvZnMgPSBvZnNmbXQuZm9ybWF0KGRhdGUpOwotICAgICAgICBTdHJpbmcgZGF0ZXN0ciA9IGRhdGVmbXQuZm9ybWF0KGRhdGUpICsgZGF0ZW9mcy5zdWJzdHJpbmcoMCwgMykgKyAiOiIKLSAgICAgICAgICAgICAgICArIGRhdGVvZnMuc3Vic3RyaW5nKDMsIDUpOwotCi0gICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgWFBhdGhBUEkuc2VsZWN0U2luZ2xlTm9kZShwYXJlbnQsCi0gICAgICAgICAgICAgICAgIi8qW2xvY2FsLW5hbWUoKSA9ICdlbnRyeSddLypbbG9jYWwtbmFtZSgpID0gJ2NyZWF0ZWQnXSIpOwotICAgICAgICBEb2N1bWVudEhlbHBlci5zZXRTaW1wbGVFbGVtZW50VGV4dChlbGVtZW50LCBkYXRlc3RyKTsKLSAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KSBYUGF0aEFQSS5zZWxlY3RTaW5nbGVOb2RlKHBhcmVudCwKLSAgICAgICAgICAgICAgICAiLypbbG9jYWwtbmFtZSgpID0gJ2VudHJ5J10vKltsb2NhbC1uYW1lKCkgPSAnaXNzdWVkJ10iKTsKLSAgICAgICAgRG9jdW1lbnRIZWxwZXIuc2V0U2ltcGxlRWxlbWVudFRleHQoZWxlbWVudCwgZGF0ZXN0cik7Ci0gICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgWFBhdGhBUEkuc2VsZWN0U2luZ2xlTm9kZShwYXJlbnQsCi0gICAgICAgICAgICAgICAgIi8qW2xvY2FsLW5hbWUoKSA9ICdlbnRyeSddLypbbG9jYWwtbmFtZSgpID0gJ21vZGlmaWVkJ10iKTsKLSAgICAgICAgRG9jdW1lbnRIZWxwZXIuc2V0U2ltcGxlRWxlbWVudFRleHQoZWxlbWVudCwgZGF0ZXN0cik7Ci0KLSAgICAgICAgRG9jdW1lbnRIZWxwZXIud3JpdGVEb2N1bWVudCh4bWxEb2MsIGRvY3VtZW50LmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3Jlc291cmNlcy9zYW1wbGVzL2VudHJ5LnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NhbXBsZXMvZW50cnkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFlMmI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NhbXBsZXMvZW50cnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY2hvOmVudHJ5IHhtbG5zOmVjaG89Imh0dHA6Ly9wdXJsLm9yZy9hdG9tL25zIyIgeG1sbnM6ZW50PSJodHRwOi8vd3d3LnB1cmwub3JnL05FVC9FTlQvMS4wLyI+Ci0gIDxlY2hvOnRpdGxlPk15IFNhbXBsZSBFbnRyeTwvZWNobzp0aXRsZT4KLSAgPGVjaG86c3VtbWFyeT5TdW1tYXJ5PC9lY2hvOnN1bW1hcnk+Ci0gIDxlY2hvOmF1dGhvcj4KLSAgICA8ZWNobzpuYW1lPkJvYiBCLiBCb2JiaW5ndG9uPC9lY2hvOm5hbWU+Ci0gIDwvZWNobzphdXRob3I+Ci0gIDxlY2hvOmxpbmsgcmVsPSJhbHRlcm5hdGUiIGhyZWY9IiIgdHlwZT0idGV4dC94bWwiLz4KLSAgPGVjaG86aWQ+dGFnOmJvYi5ibG9nLm5ldCwyMDA0OjA0OjE1OnRheGVzPC9lY2hvOmlkPgotICA8ZWNobzpjcmVhdGVkPjIwMDMtMDItMDVUMTI6Mjk6MjktMDQ6MDA8L2VjaG86Y3JlYXRlZD4KLSAgPGVjaG86aXNzdWVkPjIwMDMtMDItMDVUMDg6Mjk6MjktMDQ6MDA8L2VjaG86aXNzdWVkPgotICA8ZWNobzptb2RpZmllZD4yMDAzLTAyLTA1VDEyOjI5OjI5LTA0OjAwPC9lY2hvOm1vZGlmaWVkPgotICA8ZWNobzpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3hodG1sK3htbCI+Ci0gICAgPHA+PGVtPkhlbGxvPC9lbT4sIDxzdHJvbmc+d2VibG9nPC9zdHJvbmc+IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyI+d29ybGQ8L2E+ITwvcD4KLSAgPC9lY2hvOmNvbnRlbnQ+Ci08L2VjaG86ZW50cnk+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3Jlc291cmNlcy9zYW1wbGVzL3NpZGViYXIueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9yZXNvdXJjZXMvc2FtcGxlcy9zaWRlYmFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViZTI5Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3Jlc291cmNlcy9zYW1wbGVzL3NpZGViYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08c2lkZWJhcj4KLSAgPGJsb2NrPgotICAgIDx0aXRsZT5GZWVkczwvdGl0bGU+Ci0gICAgPGNvbnRlbnQ+Ci0gICAgICA8YSBocmVmPSJyZWNlbnRsaW5rLWF0b20iPkVjaG8vQXRvbSBGZWVkPC9hPgotICAgICAgPGJyLz4KLSAgICAgIDxhIGhyZWY9InJlY2VudGxpbmstcnNzIj5SU1MgRmVlZDwvYT4KLSAgICA8L2NvbnRlbnQ+Ci0gIDwvYmxvY2s+Ci0gIDxibG9jaz4KLSAgICA8dGl0bGU+TGlua3M8L3RpdGxlPgotICAgIDxjb250ZW50PgotICAgICAgPGEgaHJlZj0iaHR0cDovL2xlbnlhLmFwYWNoZS5vcmcvIj5MZW55YTwvYT4KLSAgICAgIDxici8+Ci0gICAgICA8YSBocmVmPSJodHRwOi8vY29jb29uLmFwYWNoZS5vcmciPkNvY29vbjwvYT4KLSAgICAgIDxici8+Ci0gICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciPkFwYWNoZTwvYT4KLSAgICA8L2NvbnRlbnQ+Ci0gIDwvYmxvY2s+Ci08L3NpZGViYXI+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3Jlc291cmNlcy9zY2hlbWFzL2VudHJ5LnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NjaGVtYXMvZW50cnkucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjAyODNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NjaGVtYXMvZW50cnkucm5nCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGVudHJ5LnJuZyAxMjQ0MDQgMjAwNS0wMS0wNiAxNjoxNzozNlogYW5kcmVhcyAkIC0tPgotCi08Z3JhbW1hciB4bWxuczplY2hvPSJodHRwOi8vcHVybC5vcmcvYXRvbS9ucyMiIG5zPSIiIHhtbG5zPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCIgZGF0YXR5cGVMaWJyYXJ5PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1kYXRhdHlwZXMiPgotICA8c3RhcnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iZWNobzplbnRyeSI+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvOnRpdGxlIj4KLSAgICAgICAgPHRleHQvPgotICAgICAgPC9lbGVtZW50PgotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNobzpzdW1tYXJ5Ij4KLSAgICAgICAgPHRleHQvPgotICAgICAgPC9lbGVtZW50PgotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNobzphdXRob3IiPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvOm5hbWUiPgotICAgICAgICAgIDxkYXRhIHR5cGU9InN0cmluZyIvPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvOmxpbmsiPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhyZWYiPgotICAgICAgICAgIDxkYXRhIHR5cGU9ImFueVVSSSIvPgotICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWwiPgotICAgICAgICAgIDxkYXRhIHR5cGU9Ik5DTmFtZSIvPgotICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIi8+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvOmlkIj4KLSAgICAgICAgPGRhdGEgdHlwZT0iYW55VVJJIi8+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvOmNyZWF0ZWQiPgotICAgICAgICA8ZGF0YSB0eXBlPSJkYXRlVGltZSIvPgotICAgICAgPC9lbGVtZW50PgotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNobzppc3N1ZWQiPgotICAgICAgICA8ZGF0YSB0eXBlPSJkYXRlVGltZSIvPgotICAgICAgPC9lbGVtZW50PgotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNobzptb2RpZmllZCI+Ci0gICAgICAgIDxkYXRhIHR5cGU9ImRhdGVUaW1lIi8+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvOmNvbnRlbnQiPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiLz4KLSAgICAgICAgPG9uZU9yTW9yZT4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwIj4KLSAgICAgICAgICAgIDxvbmVPck1vcmU+Ci0gICAgICAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHRleHQvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImEiPgotICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICAgICAgICAgICAgPGRhdGEgdHlwZT0iYW55VVJJIi8+Ci0gICAgICAgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgIDx0ZXh0Lz4KLSAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3Ryb25nIj4KLSAgICAgICAgICAgICAgICAgIDx0ZXh0Lz4KLSAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZW0iPgotICAgICAgICAgICAgICAgICAgPHRleHQvPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICAgICA8L29uZU9yTW9yZT4KLSAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDwvb25lT3JNb3JlPgotICAgICAgPC9lbGVtZW50PgotICAgIDwvZWxlbWVudD4KLSAgPC9zdGFydD4KLTwvZ3JhbW1hcj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NjaGVtYXMvZmVlZC5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3Jlc291cmNlcy9zY2hlbWFzL2ZlZWQucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Y4YWU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NjaGVtYXMvZmVlZC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdyYW1tYXIgbnM9Imh0dHA6Ly9wdXJsLm9yZy9hdG9tL25zIyIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIiBkYXRhdHlwZUxpYnJhcnk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyI+Ci0gIDxzdGFydD4KLSAgICA8ZWxlbWVudCBuYW1lPSJmZWVkIj4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgICAgIDxkYXRhIHR5cGU9ImRlY2ltYWwiLz4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGVsZW1lbnQgbmFtZT0idGl0bGUiPgotICAgICAgICA8dGV4dC8+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJsaW5rIj4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICA8ZGF0YSB0eXBlPSJhbnlVUkkiLz4KLSAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVsIj4KLSAgICAgICAgICA8ZGF0YSB0eXBlPSJOQ05hbWUiLz4KLSAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgotICAgICAgPC9lbGVtZW50PgotICAgICAgPGVsZW1lbnQgbmFtZT0ibW9kaWZpZWQiPgotICAgICAgICA8dGV4dC8+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgPC9lbGVtZW50PgotICA8L3N0YXJ0PgotPC9ncmFtbWFyPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9yZXNvdXJjZXMvc2NoZW1hcy9zaWRlYmFyLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NjaGVtYXMvc2lkZWJhci5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYzFhNzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy9yZXNvdXJjZXMvc2NoZW1hcy9zaWRlYmFyLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBzaWRlYmFyLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPGdyYW1tYXIgbnM9IiIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIiBkYXRhdHlwZUxpYnJhcnk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyI+Ci0gIDxzdGFydD4KLSAgICA8ZWxlbWVudCBuYW1lPSJzaWRlYmFyIj4KLSAgICAgIDxvbmVPck1vcmU+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9ImJsb2NrIj4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0aXRsZSI+Ci0gICAgICAgICAgICA8dGV4dC8+Ci0gICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnQiPgotICAgICAgICAgICAgPG9uZU9yTW9yZT4KLSAgICAgICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgICAgICA8dGV4dC8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhyZWYiPgotICAgICAgICAgICAgICAgICAgICA8ZGF0YSB0eXBlPSJhbnlVUkkiLz4KLSAgICAgICAgICAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgPHRleHQvPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJiciI+Ci0gICAgICAgICAgICAgICAgICA8ZW1wdHkvPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICAgICA8L29uZU9yTW9yZT4KLSAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDwvZWxlbWVudD4KLSAgICAgIDwvb25lT3JNb3JlPgotICAgIDwvZWxlbWVudD4KLSAgPC9zdGFydD4KLTwvZ3JhbW1hcj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NjaGVtYXMvdGVzdC5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3Jlc291cmNlcy9zY2hlbWFzL3Rlc3Qucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRiYjM5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvcmVzb3VyY2VzL3NjaGVtYXMvdGVzdC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdyYW1tYXIgbnM9Imh0dHA6Ly9wdXJsLm9yZy9hdG9tL25zIyIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIiBkYXRhdHlwZUxpYnJhcnk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyI+Ci0gIDxzdGFydD4KLSAgICA8ZWxlbWVudCBuYW1lPSJmZWVkIj4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgICAgIDxkYXRhIHR5cGU9ImRlY2ltYWwiLz4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGVsZW1lbnQgbmFtZT0idGl0bGUiPgotICAgICAgICA8dGV4dC8+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJsaW5rIj4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICA8ZGF0YSB0eXBlPSJhbnlVUkkiLz4KLSAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVsIj4KLSAgICAgICAgICA8ZGF0YSB0eXBlPSJOQ05hbWUiLz4KLSAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgotICAgICAgPC9lbGVtZW50PgotICAgICAgPGVsZW1lbnQgbmFtZT0ibW9kaWZpZWQiPgotICAgICAgICA8ZGF0YSB0eXBlPSJOTVRPS0VOIi8+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgPC9lbGVtZW50PgotICA8L3N0YXJ0PgotPC9ncmFtbWFyPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy91c2VjYXNlcy9zaXRlL2NyZWF0ZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvdXNlY2FzZXMvc2l0ZS9jcmVhdGUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDFlNTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy91c2VjYXNlcy9zaXRlL2NyZWF0ZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogY3JlYXRlLmp4IDQ3Mzg2MSAyMDA2LTExLTEyIDAzOjUxOjE0WiBncmVnb3IgJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLQotICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0Pk5ldyBFbnRyeTwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD5OZXcgRW50cnk8L2kxOG46dGV4dD4KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAKLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGZvcm0gaWQ9ImZvcm0tY3JlYXRlIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgCSAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9jdHlwZSIgdmFsdWU9ImVudHJ5Ii8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZG9jdW1lbnRJZCI+PGkxOG46dGV4dD5FbnRyeSBJRDwvaTE4bjp0ZXh0Pio6PC9sYWJlbD48L3RkPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJkb2N1bWVudElkIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRJZCcpfSIvPgotICAgICAgICAgICAgICAgICAgPGJyLz4gKDxpMThuOnRleHQ+Tm8gd2hpdGVzcGFjZSwgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzPC9pMThuOnRleHQ+KTwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idGl0bGUiPjxpMThuOnRleHQ+VGl0bGU8L2kxOG46dGV4dD4qOiA8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9InRpdGxlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndGl0bGUnKX0iLz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4qIDxpMThuOnRleHQ+cmVxdWlyZWQgZmllbGRzPC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAmIzE2MDsKLSAgICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9mb3JtPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3VzZWNhc2VzL3dvcmtmbG93L2RlYWN0aXZhdGUuanggYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3VzZWNhc2VzL3dvcmtmbG93L2RlYWN0aXZhdGUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjEwNTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy91c2VjYXNlcy93b3JrZmxvdy9kZWFjdGl2YXRlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkZWFjdGl2YXRlLmp4IDE2NDc4NSAyMDA1LTA0LTI2IDEzOjE5OjI0WiBqd2thbHR6ICQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0KLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5EZWFjdGl2YXRlPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PkRlYWN0aXZhdGU8L2kxOG46dGV4dD4KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAKLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGZvcm0gaWQ9ImZvcm0tZGVhY3RpdmF0ZSI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIiB2YWxpZ249InRvcCI+PGkxOG46dGV4dD5Eb2N1bWVudDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykuZ2V0SWQoKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJEZWFjdGl2YXRlIi8+Ci0gICAgICAgICAgICAgICAgJiMxNjA7Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZm9ybT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy91c2VjYXNlcy93b3JrZmxvdy9kZWxldGUuanggYi90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3VzZWNhc2VzL3dvcmtmbG93L2RlbGV0ZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNTM3MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ibG9nL3VzZWNhc2VzL3dvcmtmbG93L2RlbGV0ZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZGVhY3RpdmF0ZS5qeCAxNjQ3ODUgMjAwNS0wNC0yNiAxMzoxOToyNFogandrYWx0eiAkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gICAgICAgICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiIAotICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gICAgICAgICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgPgotCi0gIDxwYWdlOnRpdGxlPjxpMThuOnRleHQ+RGVsZXRlPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgICA8aTE4bjp0ZXh0PkRlbGV0ZTwvaTE4bjp0ZXh0PgotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgIAotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICA8Zm9ybSBpZD0iZm9ybS1kZWxldGUiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiIgdmFsaWduPSJ0b3AiPjxpMThuOnRleHQ+RG9jdW1lbnQ8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkb2N1bWVudCcpLmdldElkKCl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iRGVsZXRlIi8+Ci0gICAgICAgICAgICAgICAgJiMxNjA7Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZm9ybT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy91c2VjYXNlcy93b3JrZmxvdy9wdWJsaXNoLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvYmxvZy91c2VjYXNlcy93b3JrZmxvdy9wdWJsaXNoLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTAzZjQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Jsb2cvdXNlY2FzZXMvd29ya2Zsb3cvcHVibGlzaC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGlzaC5qeCAxNjQ3ODUgMjAwNS0wNC0yNiAxMzoxOToyNFogandrYWx0eiAkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gICAgICAgICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiIAotICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gICAgICAgICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgPgotCi0gIDxwYWdlOnRpdGxlPjxpMThuOnRleHQ+UHVibGlzaDwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD5QdWJsaXNoPC9pMThuOnRleHQ+Ci0gICAgICA8L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgPGZvcm0gaWQ9ImZvcm0tcHVibGlzaCI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7cmVxdWVzdC5nZXRQYXJhbWV0ZXIoJ2xlbnlhLnVzZWNhc2UnKX0iLz4KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIiB2YWxpZ249InRvcCI+PGkxOG46dGV4dD5Eb2N1bWVudDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykuZ2V0SWQoKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9Im1lc3NhZ2UiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0RXJyb3JNZXNzYWdlcygpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHttZXNzYWdlfSIvPgotICAgICAgICAgICAgICAgICAgICAgIDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJtZXNzYWdlIiBpdGVtcz0iJHt1c2VjYXNlLmdldEluZm9NZXNzYWdlcygpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHttZXNzYWdlfSIvPgotICAgICAgICAgICAgICAgICAgICAgIDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iUHVibGlzaCIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYnhlLWNsb3NlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1ieGUtY2xvc2UueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTRhMWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1ieGUtY2xvc2UueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMKLS0tPgotCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdieGUuY2xvc2UnXSI+Ci0gICAgCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJieGUuY2xvc2UiIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iIAotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkR1bW15VXNlY2FzZSI+Ci0gICAgICA8dmlldyB1cmk9Ii9tb2R1bGVzL2J4ZS9ieGUuY2xvc2UiIG1lbnU9ImZhbHNlIiBjcmVhdGVDb250aW51YXRpb249ImZhbHNlIi8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0gICAgCi0gIDwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ieGUvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWJ4ZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYnhlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWNlOGU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtYnhlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDE5OTktMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdieGUuZWRpdCddIj4NCi0gICAgDQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iYnhlLmVkaXQiIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iIA0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlcy5JbnZva2VXb3JrZmxvdyI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2J4ZS91c2VjYXNlcy9ieGUuangiIG1lbnU9ImZhbHNlIiBjcmVhdGVDb250aW51YXRpb249ImZhbHNlIi8+Ci0gICAgICA8dHJhbnNhY3Rpb24gcG9saWN5PSJwZXNzaW1pc3RpYyIvPgotICAgICAgPGV2ZW50IGlkPSJlZGl0Ii8+Ci0gICAgICA8cGFyYW1ldGVyIG5hbWU9ImNoZWNrb3V0UmVzdHJpY3RlZFRvU2Vzc2lvbiIgdmFsdWU9ImZhbHNlIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICANCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc0ZTBkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuYnhlPC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPg0KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMud2ViZGF2Ii8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnJlc291cmNlIi8+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MS4wLWFscGhhMTwvdmVyc2lvbj4KLSAgPG5hbWU+QlhFIEVkaXRvcjwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+aHR0cDovL2J4ZS5vc2NvbS5vcmcsIG5vdyB1c2luZyBnZW5lcmljIGVkaXRvciB1c2VjYXNlczwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9yZXNvdXJjZXMvamF2YXNjcmlwdC9ieGVfbGVueWFfZ2x1ZS5qcyBiL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9yZXNvdXJjZXMvamF2YXNjcmlwdC9ieGVfbGVueWFfZ2x1ZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxMWFmNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ieGUvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnhlX2xlbnlhX2dsdWUuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuc2V0T2JqZWN0RGF0YSA9IGZ1bmN0aW9uKG9iamVjdERhdGEsIHdpbmRvd05hbWUpIHsKLSAgdmFyIHVzZWNhc2UgPSB1c2VjYXNlTWFwW3dpbmRvd05hbWVdOwotICB2YXIgbmFtZXNwYWNlOwotCi0gIHN3aXRjaCAodXNlY2FzZSkgewotICAgIGNhc2Ugb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUTElOSzoKLSAgICBjYXNlIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVElNQUdFOgotICAgICAgbmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwotICAgICAgYnJlYWs7Ci0gICAgLy8gRklYTUU6IHRoYXQgaXMgYSBzaG90Z3VuIGFwcHJvYWNoIHRvIGdldHRpbmcgdGhlIGJyb2tlbiA8YXNzZXQ+IHRoaW5nIHRvIHJ1bi4KLSAgICAvLyBXZSBnZXQgYW4gYXNzZXQsIGJ1dCBpdCB0aHJvd3MgdmFsaWRhdGlvbiBlcnJvcnMuCi0gICAgLy8gaXQgbmVlZHMgdG8gYmUgdGhyb3duIG91dCBhbmQgcmVwbGFjZWQgYnkgPGEgaHJlZj0iIiBjbGFzcz0ibGVueWEuYXNzZXQiLz4gYW55d2F5cy4KLSAgICBjYXNlIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVEFTU0VUOgotICAgICAgbmFtZXNwYWNlID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHZhciBzbmlwcGV0ID0gb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdlbmVyYXRlQ29udGVudFNuaXBwZXQodXNlY2FzZSwgb2JqZWN0RGF0YSwgbmFtZXNwYWNlKTsKLSAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsgLy8gdGhpcyB3b3JrcyBjcm9zcy1icm93c2VyLCBiZWNhdXNlIGJ4ZSdzIGVkaXRhYmxlIGFyZWEgaXMgbm90IGEgZm9ybSBmaWVsZAotICB2YXIgY29udGVudCA9IHNuaXBwZXQuYmVmb3JlU2VsZWN0aW9uIAotICAgICsgKHNuaXBwZXQucmVwbGFjZVNlbGVjdGlvbiA/IHNuaXBwZXQucmVwbGFjZVNlbGVjdGlvbiA6IHNlbGVjdGlvbikKLSAgICArIHNuaXBwZXQuYWZ0ZXJTZWxlY3Rpb247Ci0gIAotICAvLyBGSVhNRTogc29tZW9uZSB3aXRoIGJldHRlciBieGUgaW5zaWdodHMgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgb3B0aW9ucyBiZWxvdy4uLgotICBzd2l0Y2ggKHVzZWNhc2UpIHsKLSAgICBjYXNlIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVExJTks6Ci0gICAgY2FzZSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuVVNFQ0FTRV9JTlNFUlRJTUFHRToKLSAgICAgIC8vIElmIHNvbWV0aGluZyB3YXMgc2VsZWN0ZWQsIGl0IGVuZHMgdXAgaW4gdGhlIGFsdCBhdHRyaWJ1dGUgb25seSwgYW5kIGlzIGxvc3QgZnJvbSB2aWV3LgotICAgICAgLy8gYmV0dGVyIHRvIGtlZXAgaXQgaW4gdGhlIHRleHQgYXMgd2VsbCAoY2YuIHJlcGxhY2UgYmVoYXZpb3VyLi4uKQotICAgICAgd2luZG93LmJ4ZV9pbnNlcnRDb250ZW50KGNvbnRlbnQsIHdpbmRvdy5CWEVfU0VMRUNUSU9OLHdpbmRvdy5CWEVfU1BMSVRfSUZfSU5MSU5FKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUQVNTRVQ6Ci0gICAgICB3aW5kb3cuYnhlX2luc2VydENvbnRlbnQoY29udGVudCwgd2luZG93LkJYRV9TRUxFQ1RJT04pOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgdXNlY2FzZU1hcFt3aW5kb3dOYW1lXSA9IHVuZGVmaW5lZDsgLy8gd2UncmUgZG9uZSEKLSAgb2JqZWN0RGF0YVt3aW5kb3dOYW1lXSA9IHVuZGVmaW5lZDsgLy8gd2UncmUgZG9uZSEKLX0KLQotCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2V0T2JqZWN0RGF0YSA9IGZ1bmN0aW9uKHdpbmRvd05hbWUpIHsKLSAgcmV0dXJuIG9iamVjdERhdGFbd2luZG93TmFtZV07Ci19Ci0KLS8vIDMgZnVuY3Rpb25zIGFyZSBuZWVkZWQgYmVjYXVzZSBieGUncyBjb25maWcgZmlsZSBhY2NlcHRzIG9ubHkgZnVuY3Rpb24gbmFtZXMsCi0vLyBubyBwYXJhbWV0ZXJzLgotCi0KLWZ1bmN0aW9uIHRyaWdnZXJJbnNlcnRMaW5rKCkgewotICB2YXIgb2JqZWN0RGF0YSA9IG5ldyBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YSh7Ci0gICAgdXJsICAgOiAiIiwKLSAgICB0ZXh0ICA6ICIiLAotICAgIHRpdGxlIDogIiIKLSAgfSk7Ci0gIHRyaWdnZXJVc2VjYXNlKG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVExJTkssIG9iamVjdERhdGEpOwotfQotCi0KLWZ1bmN0aW9uIHRyaWdnZXJJbnNlcnRJbWFnZSgpIHsKLSAgdmFyIG9iamVjdERhdGEgPSBuZXcgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLk9iamVjdERhdGEoewotICAgIHVybCAgIDogIiIsCi0gICAgdGV4dCAgOiAiIiwKLSAgICB0aXRsZSA6ICIiLAotICAgIHdpZHRoIDogIiIsCi0gICAgaGVpZ2h0OiAiIgotICB9KTsKLSAgdHJpZ2dlclVzZWNhc2Uob3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUSU1BR0UsIG9iamVjdERhdGEpOwotfQotCi0KLWZ1bmN0aW9uIHRyaWdnZXJJbnNlcnRBc3NldCgpIHsKLSB2YXIgb2JqZWN0RGF0YSA9IG5ldyBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YSh7Ci0gICAgdXJsICAgOiAiIiwKLSAgICB0ZXh0ICA6ICIiLAotICAgIHRpdGxlIDogIiIKLSAgfSk7Ci0gIHRyaWdnZXJVc2VjYXNlKG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVEFTU0VULCBvYmplY3REYXRhKTsKLQotfQotCi0KLWZ1bmN0aW9uIHRyaWdnZXJVc2VjYXNlKHVzZWNhc2UsIGRhdGEpIHsKLSAgdmFyIHdpbmRvd05hbWUgPSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2VuZXJhdGVVbmlxdWVXaW5kb3dOYW1lKCk7Ci0gIGRhdGEudGV4dCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsvLyB0aGlzIHdvcmtzIGNyb3NzLWJyb3dzZXIsIGJlY2F1c2UgYnhlJ3MgZWRpdGFibGUgYXJlYSBpcyBub3QgYSBmb3JtIGZpZWxkIAotICBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMub3BlblVzZWNhc2VXaW5kb3codXNlY2FzZSwgd2luZG93TmFtZSk7Ci0gIC8vc3RvcmUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV3IHdpbmRvdyBmb3IgbGF0ZXI6Ci0gIHVzZWNhc2VNYXBbd2luZG93TmFtZV0gPSB1c2VjYXNlOwotICBvYmplY3REYXRhW3dpbmRvd05hbWVdID0gZGF0YTsKLSAgLyogYWxlcnQoIlN0b3JlZCB2YWx1ZXMgZm9yIG5ldyB3aW5kb3cgIiArIHdpbmRvd05hbWUgKyAiOlxuIgotICAgICAgKyAib2JqZWN0RGF0YVt3aW5kb3dOYW1lXSA9ICciICsgb2JqZWN0RGF0YVt3aW5kb3dOYW1lXSArICInXG4iCi0gICAgICArICJ1c2VjYXNlTWFwW3dpbmRvd05hbWVdID0gJyIgKyB1c2VjYXNlTWFwW3dpbmRvd05hbWVdICsgIiciCi0gICk7ICovIAotfQotCi0KLXZhciBvYmplY3REYXRhID0gbmV3IEFycmF5KCk7Ci12YXIgdXNlY2FzZU1hcCA9IG5ldyBBcnJheSgpOwotCi0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9yZXNvdXJjZXMvbWlzYy9jb250ZW50LW5hbWVzcGFjZXMueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3Jlc291cmNlcy9taXNjL2NvbnRlbnQtbmFtZXNwYWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYjc2NWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3Jlc291cmNlcy9taXNjL2NvbnRlbnQtbmFtZXNwYWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGNvbnRlbnQtbmFtZXNwYWNlcy54bWwgNTYxOTMgMjAwNC0xMS0wMSAwMzo1MToyNVogZ3JlZ29yICQgLS0+Ci0KLTxuYW1lc3BhY2VzPgotICA8eG1sbnM+eGh0bWw9aHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbDwveG1sbnM+Ci0gIDx4bWxucz5sZW55YT1odHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjA8L3htbG5zPgotICA8eG1sbnM+ZGM9aHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS88L3htbG5zPgotICA8eG1sbnM+ZGN0ZXJtcz1odHRwOi8vcHVybC5vcmcvZGMvdGVybXMvPC94bWxucz4KLTwvbmFtZXNwYWNlcz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9yZXNvdXJjZXMvbWlzYy9jb250ZXh0bWVudS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9ieGUvcmVzb3VyY2VzL21pc2MvY29udGV4dG1lbnUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGIwYjRhMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ieGUvcmVzb3VyY2VzL21pc2MvY29udGV4dG1lbnUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGNvbnRleHRtZW51LnhtbCA1NjE5MyAyMDA0LTExLTAxIDAzOjUxOjI1WiBncmVnb3IgJCAtLT4KLQotICAgIDxjb250ZXh0IHR5cGU9ImRvbnRTaG93Ij4KLSAgICAgICAgIDwhLS0gaW5saW5lIGVsZW1lbnRzIC0tPiAgICAgICAKLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFiYnIiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJhY3JvbnltIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYmlnIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYnV0dG9uIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY2FwdGlvbiIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRmbiIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImlucHV0IiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0ia2JkIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGFiZWwiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJxIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic2FtcCIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9InNlbGVjdCIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9InNtYWxsIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3BhbiIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHRhcmVhIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0idHQiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXIiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgICA8IS0tIGJsb2NrIGVsZW1lbnRzIC0tPiAKLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJibG9ja3F1b3RlIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGl2IiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGwiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJmaWVsZHNldCIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImZvcm0iIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJoMSIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9Img1IiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaDYiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+ICAgICAgICAgCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJhc3NldCIgbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIvPiAKLSAgICAgICAgIDxlbGVtZW50IG5hbWU9InByZSIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9InRhYmxlIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgPGVsZW1lbnQgbmFtZT0ib2wiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1bCIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLSAgICAgICAgIDwhLS0gYXR0cmlidXRlcyAtLT4gCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIi8+ICAgICAgCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIi8+ICAgICAgCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIi8+ICAgICAgCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFjY2Vzc2tleSIvPiAgICAgIAotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWwiLz4gICAgICAKLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmV2Ii8+ICAgICAgCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhYmluZGV4Ii8+ICAgICAgCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4gICAgICAKLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXhpcyIvPiAgICAgIAotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhYmJyIi8+ICAgICAgCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhlYWRlcnMiLz4gICAgICAKLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiLz4gICAgICAKLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHJlZmxhbmciLz4gICAgICAKLSAgICA8L2NvbnRleHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3Jlc291cmNlcy9taXNjL2luYy9jb25maWcueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3Jlc291cmNlcy9taXNjL2luYy9jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzI0ZmZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9yZXNvdXJjZXMvbWlzYy9pbmMvY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBjb25maWcueG1sIDE2MTg1NCAyMDA1LTA0LTE5IDA4OjE2OjMxWiBhbmRyZWFzICQgLS0+Ci0KLTxjb25maWc+Ci0gICAgPGZpbGVzPgotICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICA8IS0tIFRoZSBYTUwtZG9jdW1lbnQgd2l0aCB0aGUgYWN0dWFsIGRhdGEgLS0+Ci0gICAgICAgICAgICA8ZmlsZSBuYW1lPSJCWF94bWxmaWxlIj5pbmRleC1ieGUueG1sPC9maWxlPgotICAgICAgICAgICA8IS0tIFRoZSB4aHRtbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkaXYgdGFnIChlLmcuIDxkaXYgYnhlX3hwYXRoPSIveGh0bWw6aHRtbC9sZW55YTptZXRhL2RjOnRpdGxlIiAvPikKLSAgICAgICAgICAgICAgICAgQW4geGh0bWwgZmlsZSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGFuIHhzbCB0byBwcm92aWRlIHRoZSBwYWdlIGxheW91dCBvZiB0aGUgbm9uLWVkaXRhYmxlIHBhcnQgLS0+Ci0gICAgICAgICAgICA8ZmlsZSBuYW1lPSJCWF94aHRtbGZpbGUiPnRlc3R4aHRtbC54bWw8L2ZpbGU+Ci0KLSAgICAgICAgICAgIDwhLS0gVGhlIFhTTC1kb2N1bWVudCB3aGljaCB0cmFuc2Zvcm1zIHRoZSB4bWwgdG8gdGhlIG91dHB1dCBmb3JtYXQgLS0+Ci0gICAgICAgICAgICA8ZmlsZSBuYW1lPSJCWF94c2xmaWxlIj5lbnRyeS1ieGUueHNsPC9maWxlPgotICAgICAgICAgICAgPCEtLSBUaGUgUmVsYXhORyAoWE1MIFNjaGVtYSkgLS0+Ci0gICAgICAgICAgICA8ZmlsZSBuYW1lPSJCWF92YWxpZGF0aW9uZmlsZSI+cmVsYXhuZy54bWw8L2ZpbGU+Ci0gICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICA8ZmlsZSBuYW1lPSJCWF9leGl0ZGVzdGluYXRpb24iPmluZGV4Lmh0bWw8L2ZpbGU+Ci0KLSAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAKLSAgICAgICAgPCEtLSBZb3UgY2FuJ3QgcHJvdmlkZSBhIGRpZmZlcmVudCAibWV0aG9kIiB0aGFuIGh0dHAuZ2V0IGZvciB0aGUgZm9sbG93aW5nIGZpbGVzIC0tPgotICAgICAgICA8Y3NzPgotICAgICAgICAgICAgPCEtLSBEb2N1bWVudCBzcGVjaWZpYyBjc3MsIHdoaWNoIHlvdSBzaG91bGQgYWRqdXN0LiAgLS0+Ci0gICAgICAgICAgICAgPGZpbGU+ZW50cnktYnhlLmNzczwvZmlsZT4KLSAgICAgICAgICAKLSAgICAgICAgPC9jc3M+Ci0gICAgICAgIAotICAgICAgICA8c2NyaXB0cz4KLSAgICAgICAgPCEtLSBUaGVzZSBhcmUgdGhlIHRvIGJlIGluY2x1ZGVkIGpzIGZpbGVzIAotICAgICAgICB0aGUgaW1wb3J0YW50IC5qcyBmaWxlcyBhcmUgaW5jbHVkZWQgYnkgYnhlTG9hZGVyLmpzLCBidXQgeW91IHNob3VsZAotICAgICAgICBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGVtLiAKLSAgICAgICAgWW91IGNhbiBhbHNvIGFkZCB5b3VyIG93biBqcy1maWxlcyBoZXJlLgotICAgICAgICAtLT4KLQotICAgICAgICAgICAgPGZpbGU+anMvYnhlaHRtbHRiLmpzPC9maWxlPgotICAgICAgICAgICAgPGZpbGU+anMvdGFibGUuanM8L2ZpbGU+Ci0gICAgICAgICAgICA8ZmlsZT5tb3ppbGUvanNkYXYuanM8L2ZpbGU+Ci0gICAgICAgICAgICA8ZmlsZT5tb3ppbGUvdGQvd2ViZGF2LmpzPC9maWxlPgotICAgICAgICAgICAgPGZpbGU+bW96aWxlL21vemlsZWtiLmpzPC9maWxlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxmaWxlPnJlbGF4bmcvQXR0cmlidXRlVkRPTS5qczwvZmlsZT4KLQotICAgICAgICAgICAgPGZpbGU+cmVsYXhuZy9Ob2RlVkRPTS5qczwvZmlsZT4KLSAgICAgICAgICAgIDxmaWxlPnJlbGF4bmcvRG9jdW1lbnRWRE9NLmpzPC9maWxlPgotICAgICAgICAgICAgPGZpbGU+cmVsYXhuZy9FbGVtZW50VkRPTS5qczwvZmlsZT4KLSAgICAgICAgICAgIDxmaWxlPnJlbGF4bmcvRG9jdW1lbnRWQUwuanM8L2ZpbGU+Ci0gICAgICAgICAgICA8ZmlsZT5yZWxheG5nL05vZGVWQUwuanM8L2ZpbGU+Ci0gICAgICAgICAgICA8ZmlsZT5yZWxheG5nL0VsZW1lbnRWQUwuanM8L2ZpbGU+Ci0KLSAgICAgICAgICAgIDxmaWxlPnJlbGF4bmcvUmVsYXhORy5qczwvZmlsZT4KLSAgICAgICAgCi0gICAgICAgIDwvc2NyaXB0cz4KLSAgICAgICAgCi0gICAgICAgIAotICAgIDwvZmlsZXM+Ci0gICAgPG9wdGlvbnM+IAotICAgIDxvcHRpb24gbmFtZT0iYXV0b1BhcmFFbGVtZW50TmFtZSI+cDwvb3B0aW9uPgotICAgIDxvcHRpb24gbmFtZT0iYXV0b1BhcmFFbGVtZW50TmFtZXNwYWNlIj5odHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sPC9vcHRpb24+Ci0gICAgPG9wdGlvbiBuYW1lPSJzaG93U3BsYXNoU2NyZWVuIj50cnVlPC9vcHRpb24+Ci0gICAgPG9wdGlvbiBuYW1lPSJtZXJnZURpZmZlcmVudEJsb2Nrc09uRGVsZXRlIj50cnVlPC9vcHRpb24+Ci0gICAgPC9vcHRpb25zPgotPCEtLSBoZXJlIHdlIGRlZmluZSB0aGUgYnV0dG9ucyBmb3IgdGhlIHRvcCBidXR0b24gYmFyIC0tPgotICAgIDxidXR0b25zPgotICAgIAotICAgIDwhLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBpbWFnZSBmb3IgdGhlIGJ1dHRvbnMKLSAgICAgICAgICAgaWYgbm9uZSBpcyBwcm92aWRlZCwgdGhlIGltYWdlcy9idXR0b25zLnBuZyBpcyB0YWtlbiAKLSAgICA8bG9jYXRpb24gc3JjPSIuLi8uLi9pbWFnZXMvYnhlLnBuZyIvPgotICAgIC0tPgotICAgICA8IS0tIHRoZSBkaW1lbnNpb24gdGFnIGlzIGZvciBkZWZpbmluZyB0aGUgZGltZW5zaW9ucyBvZiB5b3VyIGJ1dHRvbiBpbWFnZSBhbmQgaG93Ci0gICAgICAgICAgICBsYXJnZSBlYWNoIGJ1dHRvbiBpcy4gLS0+Ci0gICAgPGRpbWVuc2lvbiAgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxNDAiIGJ1dHRvbndpZHRoPSIyMCIgYnV0dG9uaGVpZ2h0PSIyMCIvPgotICAgIDwhLS0gRm9yIGVhY2ggYnV0dG9uLCB3ZSBuZWVkIGEgZGVmaW5pdGlvbgotICAgIGF0dHJpYnV0ZXM6ICAKLSAgICAgICAgY29sOiBpbiB3aGljaCBjb2x1bW4gdGhlIGJ1dHRvbiBpcyBpbiB0aGUgYnV0dG9uIGltYWdlCi0gICAgICAgIHJvdzogaW4gd2hpY2ggcm93IHRoZSBidXR0b24gaXMgaW4gdGhlIGJ1dHRvbiBpbWFnZQotICAgICAgICBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgYnV0dG9uLCB0aGlzIGhhcyB0byBiZSB1bmlxdWUgYW5kIGlzIHVzZWQgYXMgdG9vbCB0aXAgYXQgdGhlIG1vbWVudAotICAgICAgICBuczogYSBuYW1lc3BhY2UgYXNzb2NpYXRlZCB0byB0aGUgYnV0dG9uICh1c3VhbGx5IHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnQgdG8gYmUgaW5zZXJ0ZWQpCi0gICAgICAgIHR5cGU6IFRoZSB0eXBlIG9mIHRoZSAiZXZlbnQiIHdoaWNoIHNob3VsZCBoYXBwZW4KLSAgICAgICAgICAgICJmdW5jdGlvbiI6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQsIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkCi0gICAgICAgICAgICAiaW5zZXJ0RWxlbWVudCI6IFRoaXMgZWxlbWVudCB3aWxsIGJlIGluc2VydGVkCi0gICAgICAgICAgICAiZXZlbnQiOiBUaGlzIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIElmIHRoZXJlJ3Mgbm8gInR5cGUiIGF0dHJpYnV0ZSwgYnV0IGEgImFjdGlvbiIgYXR0cmlidXRlLCB0aGUgZXZlbnQgaW4gdGhlIGFjdGlvbiBhdHRyaWJ1dGUKLSAgICAgICAgICAgIHdpbGwgYmUgdHJpZ2dlcmVkLiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSWYgdHlwZSAiZXZlbnQiIG9yIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIGRlZmluZWQsIHRoZSBldmVudCBnZXRzIHRoZSB2YWx1ZSBvZiBAbmFtZSBhcyBwYXJhbWV0ZXIuCi0gICAgICAgIGV4YW1wbGVzOiAKLSAgICAgICAgLSBpbnNlcnRzIHRoZSBlbGVtZW50IHhodG1sOnN0cm9uZyBhdCBjdXJzb3IgcG9zaXRpb24gCi0gICAgICAgICAgPGJ1dHRvbiBuYW1lPSJzdHJvbmciIGNvbD0iMSIgcm93PSIxIiB0eXBlPSJpbnNlcnRFbGVtZW50IiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+YjwvYnV0dG9uPgotICAgICAgICAtIGNhbGxzIHRoZSBmdW5jdGlvbiBEb1NvbWV0aGluZygpLCB3aGVuIGNsaWNrZWQKLSAgICAgICAgICA8YnV0dG9uIG5hbWU9InN0cm9uZyIgY29sPSIxIiByb3c9IjEiIHR5cGU9ImZ1bmN0aW9uIj5Eb1NvbWV0aGluZzwvYnV0dG9uPgotICAgICAgICAtIHRyaWdnZXJzIHRoZSBldmVudCBUb2dnbGVUZXh0Q2xhc3MgKGFuZCBtYWtlcyB0aGUgc2VsZWN0aW9uIGJvbGQgaW4gdGhpcyBleGFtcGxlKQotICAgICAgICAgIHRoZSAyIGV4YW1wbGVzIGFyZSB0aGUgc2FtZSwgdGhlIGxhdGVyIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotICAgICAgICAgIDxidXR0b24gbmFtZT0ic3Ryb25nIiBjb2w9IjEiIHJvdz0iMSIgdHlwZT0iZXZlbnQiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5Ub2dnbGVUZXh0Q2xhc3M8L2J1dHRvbj4KLSAgICAgICAgICA8YnV0dG9uIG5hbWU9InN0cm9uZyIgY29sPSIxIiByb3c9IjEiIGFjdGlvbj0iVG9nZ2xlVGV4dENsYXNzIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICAgIAotICAgIC0tPgotCi0gICAgICAgIDxidXR0b24gbmFtZT0ic3Ryb25nIiBjb2w9IjEiIHJvdz0iMSIgYWN0aW9uPSJUb2dnbGVUZXh0Q2xhc3MiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIi8+Ci0gICAgICAgIDxidXR0b24gbmFtZT0iZW0iIGNvbD0iMCIgcm93PSIxIiBhY3Rpb249IlRvZ2dsZVRleHRDbGFzcyIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLz4KLQotICAgICAgICA8YnV0dG9uIG5hbWU9InN1YiIgY29sPSI0IiByb3c9IjEiIGFjdGlvbj0iVG9nZ2xlVGV4dENsYXNzIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICA8YnV0dG9uIG5hbWU9InN1cCIgY29sPSI1IiByb3c9IjEiIGFjdGlvbj0iVG9nZ2xlVGV4dENsYXNzIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAgICAgICA8YnV0dG9uIG5hbWU9ImNsZWFuX2lubGluZSIgY29sPSIwIiByb3c9IjYiIGFjdGlvbj0iQ2xlYW5JbmxpbmUiLz4KLSAgICAgICAgPCEtLWJ1dHRvbiBuYW1lPSJsaW5rIiBjb2w9IjAiIHJvdz0iNSIgdHlwZT0iaW5zZXJ0RWxlbWVudCIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPmE8L2J1dHRvbi0tPgotICAgICAgICA8YnV0dG9uIG5hbWU9ImxpbmsiIGNvbD0iMCIgcm93PSI1IiB0eXBlPSJmdW5jdGlvbiI+dHJpZ2dlckluc2VydExpbms8L2J1dHRvbj4KLSAgICAgICAgPGJ1dHRvbiBuYW1lPSJ1bmxpbmsiIGNvbD0iMSIgcm93PSI1IiBhY3Rpb249IkRlbGV0ZUxpbmsiLz4KLSAgICAgICAgPGJ1dHRvbiBuYW1lPSJjcmVhdGVfdGFibGUiIGNvbD0iMiIgcm93PSI1IiBhY3Rpb249Ikluc2VydFRhYmxlIi8+Ci0gICAgICAgIDxidXR0b24gbmFtZT0iVW5vcmRlcmVkX0xpc3QiIGNvbD0iMyIgcm93PSIyIiBhY3Rpb249IlVub3JkZXJlZExpc3QiLz4KLSAgICAgICAgPGJ1dHRvbiBuYW1lPSJPcmRlcmVkX0xpc3QiIGNvbD0iMiIgcm93PSIyIiBhY3Rpb249Ik9yZGVyZWRMaXN0Ii8+Ci0KLSAgICAgICAgPGJ1dHRvbiBuYW1lPSJDb3B5IiBjb2w9IjAiIHJvdz0iNCIgYWN0aW9uPSJDbGlwYm9hcmRDb3B5Ii8+Ci0gICAgICAgIDxidXR0b24gbmFtZT0iQ3V0IiBjb2w9IjEiIHJvdz0iNCIgYWN0aW9uPSJDbGlwYm9hcmRDdXQiLz4KLSAgICAgICAgPCEtLSBzZWUgaHR0cHM6Ly9zc2wuYml0Zmx1eC5jaC9ob3JkZS9jaG9yYS9kaWZmLnBocC90cnVuay9leGFtcGxlcy91bmkvY29uZmlnLnhtbD9ydD1zdm5lZGl0b3Imd3M9MCZyMT0xMDI3JnIyPTE0NDQmdHk9dSAtLT4KLSAgICAgICAgPGJ1dHRvbiBuYW1lPSJQYXN0ZURpYWxvZyIgY29sPSI0IiByb3c9IjQiIGFjdGlvbj0iQ2xpcGJvYXJkUGFzdGVEaWFsb2ciLz4KLQotICAgICAgICA8YnV0dG9uIG5hbWU9IlBhc3RlIiBjb2w9IjIiIHJvdz0iNCIgYWN0aW9uPSJDbGlwYm9hcmRQYXN0ZSIvPgotICAgICAgICA8IS0tYnV0dG9uIG5hbWU9IkltYWdlIiBjb2w9IjMiIHJvdz0iNSIgYWN0aW9uPSJJbnNlcnRJbWFnZSIvLS0+Ci0gICAgICAgIDxidXR0b24gbmFtZT0iSW1hZ2UiIGNvbD0iMyIgcm93PSI1IiB0eXBlPSJmdW5jdGlvbiI+dHJpZ2dlckluc2VydEltYWdlPC9idXR0b24+Ci0gICAgICAgIDxidXR0b24gbmFtZT0iU2F2ZSIgY29sPSIxIiByb3c9IjYiIGFjdGlvbj0iRG9jdW1lbnRTYXZlIi8+Ci0gICAgICAgIDxidXR0b24gbmFtZT0iVW5kbyIgY29sPSIzIiByb3c9IjYiIGFjdGlvbj0iVW5kbyIvPgotICAgICAgICA8YnV0dG9uIG5hbWU9IlJlZG8iIGNvbD0iNCIgcm93PSI2IiBhY3Rpb249IlJlZG8iLz4KLSAgICAgICAgPCEtLSBidXR0b24gbmFtZT0iQXNzZXQiIGNvbD0iMiIgcm93PSI2IiBhY3Rpb249Ikluc2VydEFzc2V0Ii8tLT4KLSAgICAgICAgPGJ1dHRvbiBuYW1lPSJBc3NldCIgY29sPSIyIiByb3c9IjYiIHR5cGU9ImZ1bmN0aW9uIj50cmlnZ2VySW5zZXJ0QXNzZXQ8L2J1dHRvbj4KLSAgICA8L2J1dHRvbnM+Ci0gICAgPGNhbGxiYWNrcz4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0idGFibGUiIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB0eXBlPSJmdW5jdGlvbiI+YnhlX0luc2VydFRhYmxlQ2FsbGJhY2s8L2VsZW1lbnQ+Ci08IS0tCi0gICAgICAgIDxlbGVtZW50IG5hbWU9Im9iamVjdCIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHR5cGU9InBvcHVwIj4/bGVueWEudXNlY2FzZT1ieGUuaW5zZXJ0SW1hZ2U8L2VsZW1lbnQ+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9ImltZyIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHR5cGU9InBvcHVwIj4/bGVueWEudXNlY2FzZT1ieGUuaW5zZXJ0SW1hZ2U8L2VsZW1lbnQ+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9ImFzc2V0IiBucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIiB0eXBlPSJwb3B1cCI+P2xlbnlhLnVzZWNhc2U9YnhlLmluc2VydEFzc2V0PC9lbGVtZW50PgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJhIiBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgcHJlY2hlY2s9ImJ4ZV9jaGVja0lmTm90QUxpbmsiIHR5cGU9InBvcHVwIj4/bGVueWEubW9kdWxlPWJ4ZSZhbXA7bGVueWEuc3RlcD1saW5rLXNob3c8L2VsZW1lbnQ+Ci0tLT4KLSAgICA8L2NhbGxiYWNrcz4KLSAgICA8b3B0aW9ucz4KLSAgICAgPG9wdGlvbiBuYW1lPSJhdXRvUGFyYUVsZW1lbnROYW1lIj5wPC9vcHRpb24+Ci0gICAgIDxvcHRpb24gbmFtZT0iYXV0b1BhcmFFbGVtZW50TmFtZXNwYWNlIj5odHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sPC9vcHRpb24+Ci0gICAgPC9vcHRpb25zPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbiBuYW1lPSJDbGlwYm9hcmRQYXN0ZURpYWxvZyIvPgotICAgIDwvcGx1Z2lucz4KLTwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3Jlc291cmNlcy9taXNjL2luZGV4LnhodG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3Jlc291cmNlcy9taXNjL2luZGV4LnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYzEyOWQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9yZXNvdXJjZXMvbWlzYy9pbmRleC54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogaW5kZXgueGh0bWwgNTU0NzcgMjAwNC0xMC0yNSAwMzozODoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgID4KLTxoZWFkPgotCi08IS0tIE5hbWVzcGFjZXMgYXJlIGRvY3R5cGUgc3BlY2lmaWMgYW5kIHdpbGwgYmUgYWRkZWQgZHVyaW5nIGFnZ3JlZ2F0aW9uIC0tPgotCi08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9IkBFRElUT1JfQ1NTQCIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGhyZWY9Ii9ieGUvY3NzL2VkaXRvci5jc3MiIC0tPgotCi08c2NyaXB0IHNyYz0iQEJYRUxPQURFUl9KU0AiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08IS0tIHNyYz0iL2J4ZS9ieGVMb2FkZXIuanMiIC0tPgotCi0KLTx0aXRsZT5CaXRmbHV4IEVkaXRvcjwvdGl0bGU+Ci0KLTwvaGVhZD4KLQotPGJvZHkgb25sb2FkPSJieGVfc3RhcnQoJ0NPTkZJR19GSUxFJykiPgotPCEtLSBldmVyeXRoaW5nIGluIHRoZSBmb2xsb3dpbmcgZGl2IGVsZW1lbnQgd2lsbCBiZSByZXBsYWNlZCAtLT4KLTxkaXYgaWQ9ImJ4ZV9hcmVhIj4KLTxub3NjcmlwdD4KLTxzcGFuIHN0eWxlPSdmb250LWZhbWlseTogQXJpYWw7IHBhZGRpbmc6IDVweDsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZic+Ci1Zb3UgbmVlZCBKYXZhU2NyaXB0IGVuYWJsZWQuIE90aGVyd2lzZSBub3RoaW5nIGF0IGFsbCB3b3JrcyBoZXJlCi06KTwvc3Bhbj48L25vc2NyaXB0PgotPC9kaXY+Ci0KLTwhLS0gYW5vdGhlciB3YXkgdG8gZG8gaXQgd2l0aG91dCBoYXZpbmcgdG8gdXNlIHhzbHQKLSAgPGRpdiBpZD0iZm9vYmFyIiBieGVfeHBhdGg9Ii94aHRtbDpib2R5Ij48L2Rpdj4KLS0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmEzOGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdXNlY2FzZS1ieGUueG1hcCAzNDU0OTUgMjAwNS0xMS0xOCAxNToxMTozMFogY2hlc3RudXQgJCAtLT4KLTwhLS0gCi0gIFRoaXMgc2l0ZW1hcCBoYW5kbGVzIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBCaXRmbHV4IEVkaXRvciBhbmQgTGVueWEKLS0tPgotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlc291cmNlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPG1hcDpyZXNvdXJjZXM+Ci0gICAgCi0gICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJzdHlsZS1jbXMtcGFnZSI+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4gICAgICAKLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0ie3JlcXVlc3Q6bG9jYWxlfSIvPgotICAgICAgPC9tYXA6dHJhbnNmb3JtPiAgICAKLSAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3V0aWwvcGFnZTJ4aHRtbC54c2wiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iY29udGV4dDovL2xlbnlhL3hzbHQvdXRpbC9zdHJpcF9uYW1lc3BhY2VzLnhzbCIvPgotICAgIDwvbWFwOnJlc291cmNlPgotICAgIAotICAgIDxtYXA6cmVzb3VyY2UgbmFtZT0iY21zLXNjcmVlbi14bWwiPgotICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY29udGVudC97c2VydmVycGFnZX0iIHR5cGU9InNlcnZlcnBhZ2VzIi8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC97c3R5bGVzaGVldH0iPgotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1c2UtcmVxdWVzdC1wYXJhbWV0ZXJzIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9tYXA6dHJhbnNmb3JtPiAgICAgIAotICAgIDwvbWFwOnJlc291cmNlPgotICAgIAotICAgIDxtYXA6cmVzb3VyY2UgbmFtZT0iY21zLXNjcmVlbiI+Ci0gICAgICA8bWFwOmNhbGwgcmVzb3VyY2U9ImNtcy1zY3JlZW4teG1sIj4KLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ic2VydmVycGFnZSIgdmFsdWU9IntzZXJ2ZXJwYWdlfSIvPgotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJzdHlsZXNoZWV0IiB2YWx1ZT0ie3N0eWxlc2hlZXR9Ii8+Ci0gICAgICA8L21hcDpjYWxsPgotICAgICAgPG1hcDpjYWxsIHJlc291cmNlPSJzdHlsZS1jbXMtcGFnZSIvPgotICAgICAgPG1hcDpzZXJpYWxpemUgLz4KLSAgICA8L21hcDpyZXNvdXJjZT4KLSAgICAKLSAgICAKLSAgPC9tYXA6cmVzb3VyY2VzPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBGbG93ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDxtYXA6ZmxvdyBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgPG1hcDpzY3JpcHQgc3JjPSJmYWxsYmFjazovL2xlbnlhL3VzZWNhc2VzL2VkaXQtZG9jdW1lbnQuanMiLz4KLSAgICA8bWFwOnNjcmlwdCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9ieGUvdXNlY2FzZXMvYnhlLmpzIi8+Ci0gIDwvbWFwOmZsb3c+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFBpcGVsaW5lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0ibm9uY2FjaGluZyI+Ci0gICAgCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImJ4ZS5jbG9zZSI+Ci0gICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc2VydmVkLWNoZWNraW4iPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJzZXJ2ZXJwYWdlcyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL2NvbnRlbnQvcmMve2V4Y2VwdGlvbn0ueHNwIj4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlciIgdmFsdWU9Int1c2VyfSIvPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IntmaWxlbmFtZX0iLz4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZGF0ZSIgdmFsdWU9IntkYXRlfSIvPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0ie21lc3NhZ2V9Ii8+Ci0gICAgICAgICAgICA8L21hcDpnZW5lcmF0ZT4KLSAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3JjL3Jjby1leGNlcHRpb24ueHNsIi8+Ci0gICAgICAgICAgICA8bWFwOmNhbGwgcmVzb3VyY2U9InN0eWxlLWNtcy1wYWdlIi8+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSAvPgotICAgICAgICA8L21hcDphY3Q+ICAKLSAgICAgICAgPG1hcDpyZWRpcmVjdC10byB1cmk9Intwcm94eTove3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aH0uaHRtbH0iLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKi8qKi5odG1sIj4KLSAgICAgICAgPCEtLSsKLSAgICAgICAgICB8IEJ1aWxkIHRoZSBCWEUgY29uZmlndXJhdGlvbgotICAgICAgICAgICstLT4KLSAgICAgICAgCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0ic3RlcCIgcGF0dGVybj0iY29uZmlnIj4KLSAgICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJyZXNvdXJjZS1leGlzdHMiPgotICAgICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC10eXBlfS9jb25maWcvYnhlLnhtbCI+Ci0gICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdHlwZX0vY29uZmlnL2J4ZS54bWwiLz4KLSAgICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9ieGUvcmVzb3VyY2VzL21pc2MvaW5jL2NvbmZpZy54bWwiLz4KLSAgICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICAgICAgCi0gICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvYnhlL3hzbHQvY29uZmlnLXhtbC54c2wiPgotICAgICAgICAgICAgPCEtLSBQYXJhbWV0ZXIgQlhfeG1sZmlsZToKLSAgICAgICAgICAgICAgZGVmaW5lcyB0aGUgTGVueWEgVVJMIHdpdGggd2hpY2ggQlhFIGludGVyYWN0cywgdG8KLSAgICAgICAgICAgICAgMS4gZ2V0IHRoZSBkb2N1bWVudCBjb250ZW50cyAoYnkgaXNzdWluZyBhIEdFVCB0byB0aGlzIFVSTCksCi0gICAgICAgICAgICAgIDIuIHNhdmUgdGhlIGNoYW5nZWQgY29udGVudHMgKGJ5IGlzc3VpbmcgYSBQVVQgdG8gdGhpcyBVUkwpCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IkJYX3htbGZpbGUiIHZhbHVlPSJ7cHJveHk6L3suLi8xfS97Li4vMn0vey4uLzN9LnhtbH0/bGVueWEubW9kdWxlPXdlYmRhdiZhbXA7bGVueWEuZXZlbnQ9ZWRpdCIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZGVmYXVsdGxhbmd1YWdlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZGVmYXVsdC1sYW5ndWFnZX0iLz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBJbnN0ZWFkIG9mIGFuIHhzbCB3ZSB1c2UgdGhlIHhodG1sIGZpbGUgdG8gcHJvdmlkZSB0aGUgYmFzaWMgbGF5b3V0Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IkJYX3hzbGZpbGUiIHZhbHVlPSJ7Mn0ueHNsIi8+Ci0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IkJYX3hodG1sZmlsZSIgdmFsdWU9Intwcm94eTovey4uLzF9L3suLi8yfS97Li4vM30uYnhlLmh0bWx9P3JlbmRlcnR5cGU9ZWRpdCIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iQlhfdmFsaWRhdGlvbmZpbGUiIHZhbHVlPSJ7cHJveHk6e3Jlc291cmNlLXR5cGU6aHR0cFNjaGVtYVVyaX19Ii8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjc3MiIHZhbHVlPSJ7cHJveHk6L2xlbnlhL2Nzcy9kZWZhdWx0LmNzc30iLz4KLSAgICAgICAgICAgIDwhLS0gVGhlIGRvY3VtZW50IGlzIGNoZWNrZWQgaW4gd2hlbiB3ZSBleGl0IGZyb20gYnggKGluIGNhc2Ugb2Ygc2F2ZSZleGl0IGFuZCBpbiBjYXNlIG9mIGV4aXQpLCBzbyB3ZSB1c2UgdGhlIHVzZWNhc2UKLSAgICAgICAgICAgICAgZm9yIHRoZSBjaGVja2luIHdoaWxlIHdlIHJlZGlyZWN0IHRvIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJCWF9leGl0ZGVzdGluYXRpb24iIHZhbHVlPSJ7cHJveHk6L3suLi8xfS97Li4vMn0vey4uLzN9Lmh0bWx9P2xlbnlhLnVzZWNhc2U9YnhlLmNsb3NlIi8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjb250ZXh0bWVudWZpbGUiIHZhbHVlPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvYnhlL3Jlc291cmNlcy9taXNjL2NvbnRleHRtZW51LnhtbCIvPgotICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJjaW5jbHVkZSIvPgotICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgCi0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci0gIAotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS91c2VjYXNlcy9hZGRTb3VyY2VUYWdzLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS91c2VjYXNlcy9hZGRTb3VyY2VUYWdzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlNTdiYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ieGUvdXNlY2FzZXMvYWRkU291cmNlVGFncy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGFkZFNvdXJjZVRhZ3MueHNsIDQyNzAzIDIwMDQtMDMtMTMgMTI6NTc6NTNaIGdyZWdvciAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0KLTx4c2w6cGFyYW0gbmFtZT0ic291cmNlIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICA8b3Blbj4KLSAgPHNvdXJjZTp3cml0ZSB4bWxuczpzb3VyY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zb3VyY2UvMS4wIj4KLSAgICA8c291cmNlOnNvdXJjZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvdXJjZSIvPjwvc291cmNlOnNvdXJjZT4KLSAgICA8c291cmNlOmZyYWdtZW50PgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iLiIvPgotICAgIDwvc291cmNlOmZyYWdtZW50PgotICA8L3NvdXJjZTp3cml0ZT4KLSAgICA8Y29udGVudD4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICA8L2NvbnRlbnQ+Ci0gIDwvb3Blbj4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3VzZWNhc2VzL2J4ZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS91c2VjYXNlcy9ieGUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTM2ZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3VzZWNhc2VzL2J4ZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPHBhZ2U6cGFnZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zOmNpPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaW5jbHVkZS8xLjAiCi0gID4KLSAgCi0gIDxwYWdlOmhlYWQ+Ci0gICAgPGp4OnNldCB2YXI9InBhdGhJbmZvIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFNvdXJjZVVSTCgpfSIvPgotICAgIDxqeDpzZXQgdmFyPSJzdGVwcyIgdmFsdWU9IiR7cGF0aEluZm8uc3BsaXQoJy8nKX0iLz4KLSAgICA8ang6c2V0IHZhcj0icHViSWQiIHZhbHVlPSIke2phdmEudXRpbC5BcnJheXMuYXNMaXN0KHN0ZXBzKS5nZXQoMSl9Ii8+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvJHtwdWJJZH0vbW9kdWxlcy9ieGUvYnhlL2Nzcy9lZGl0b3IuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotICAgIDxzY3JpcHQgc3JjPSIvJHtwdWJJZH0vbW9kdWxlcy9ieGUvYnhlL2J4ZUxvYWRlci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ii8+Ci0gICAgPHNjcmlwdCBzcmM9Ii9tb2R1bGVzL2VkaXRvcnMvamF2YXNjcmlwdC9vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuanMiLz4KLSAgICA8c2NyaXB0IHNyYz0iL21vZHVsZXMvYnhlL2phdmFzY3JpcHQvYnhlX2xlbnlhX2dsdWUuanMiLz4KLSAgPC9wYWdlOmhlYWQ+Ci0gIAotICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0PkJpdGZsdXggRWRpdG9yPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICAKLSAgPGp4OnNldCB2YXI9InNvdXJjZVVybCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRTb3VyY2VVUkwoKX0iLz4KLSAgPGp4OnNldCB2YXI9InN0ZXBzIiB2YWx1ZT0iJHtzb3VyY2VVcmwuc3BsaXQoJy8nKX0iLz4KLSAgPGp4OnNldCB2YXI9Imxhc3RTdGVwIiB2YWx1ZT0iJHtzdGVwc1tzdGVwcy5zaXplKCkgLSAxXX0iLz4KLSAgCi0gIDxqeDpjaG9vc2U+Ci0gICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmhhc0Vycm9ycygpfSI+Ci0gICAgICA8cGFnZTpib2R5PgotICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICA8L3BhZ2U6Ym9keT4KLSAgICA8L2p4OndoZW4+Ci0gICAgPGp4Om90aGVyd2lzZT4KLSAgICAgIDxwYWdlOmJvZHkgb25sb2FkPSJieGVfc3RhcnQoJyR7bGFzdFN0ZXB9P2xlbnlhLm1vZHVsZT1ieGUmYW1wO2xlbnlhLnN0ZXA9Y29uZmlnJykiPgotICAgIAotICAgICAgICA8IS0tIGV2ZXJ5dGhpbmcgaW4gdGhlIGZvbGxvd2luZyBkaXYgZWxlbWVudCB3aWxsIGJlIHJlcGxhY2VkIC0tPgotICAgICAgICA8ZGl2IGlkPSJieGVfYXJlYSI+Ci0gICAgICAgIDxub3NjcmlwdD4KLSAgICAgICAgPHNwYW4gc3R5bGU9J2ZvbnQtZmFtaWx5OiBBcmlhbDsgcGFkZGluZzogNXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmJz4KLSAgICAgICAgWW91IG5lZWQgSmF2YVNjcmlwdCBlbmFibGVkLiBPdGhlcndpc2Ugbm90aGluZyBhdCBhbGwgd29ya3MgaGVyZQotICAgICAgICA6KTwvc3Bhbj48L25vc2NyaXB0PgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gYW5vdGhlciB3YXkgdG8gZG8gaXQgd2l0aG91dCBoYXZpbmcgdG8gdXNlIHhzbHQKLSAgICAgICAgICA8ZGl2IGlkPSJmb29iYXIiIGJ4ZV94cGF0aD0iL3hodG1sOmJvZHkiPjwvZGl2PgotICAgICAgICAtLT4KLSAgICAgICAgICAgIAotICAgICAgPC9wYWdlOmJvZHk+Ci0gICAgPC9qeDpvdGhlcndpc2U+Ci0gIDwvang6Y2hvb3NlPgotICAKLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3VzZWNhc2VzL3JlbW92ZVNvdXJjZVRhZ3MueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3VzZWNhc2VzL3JlbW92ZVNvdXJjZVRhZ3MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjIxYzVkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS91c2VjYXNlcy9yZW1vdmVTb3VyY2VUYWdzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcmVtb3ZlU291cmNlVGFncy54c2wgNDI3MDMgMjAwNC0wMy0xMyAxMjo1Nzo1M1ogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gIDx4c2w6Y29weS1vZiBzZWxlY3Q9Ii9vcGVuL2NvbnRlbnQvKiIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ieGUveHNsdC9hZ2dyZWdhdGUueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3hzbHQvYWdncmVnYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkNjUzNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ieGUveHNsdC9hZ2dyZWdhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYnhlIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYnhlIj4KLTxodG1sPgotPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ4aHRtbDpodG1sL3hodG1sOmhlYWQiLz4KLTx4c2w6Y29weS1vZiBzZWxlY3Q9InhodG1sOmh0bWwveGh0bWw6Ym9keSIvPgotPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmhlYWQiPgotPHhodG1sOmhlYWQ+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iL2J4ZS9uYW1lc3BhY2VzL3htbG5zIj4KLSAgPG1ldGEgbmFtZT0iYnhlTlMiIGNvbnRlbnQ9InsufSIvPgotPC94c2w6Zm9yLWVhY2g+Ci08eHNsOmNvcHktb2Ygc2VsZWN0PSJAKnxub2RlKCkiLz4KLTwveGh0bWw6aGVhZD4KLTwveHNsOnRlbXBsYXRlPgotIAotPC94c2w6c3R5bGVzaGVldD4gIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3hzbHQvY2hhbmdlLW9iamVjdC1wYXRoLWJhY2sueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3hzbHQvY2hhbmdlLW9iamVjdC1wYXRoLWJhY2sueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTE1YjRlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS94c2x0L2NoYW5nZS1vYmplY3QtcGF0aC1iYWNrLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIgotICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgID4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpvYmplY3QvQGRhdGFbbm90KHN0YXJ0cy13aXRoKC4sICcvJykpXSI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ1cmwiPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iIC8+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGF0YSI+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCR1cmwsICcvJykiIC8+Ci0gICAgPC94c2w6YXR0cmlidXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiIC8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3hzbHQvY2hhbmdlLW9iamVjdC1wYXRoLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS94c2x0L2NoYW5nZS1vYmplY3QtcGF0aC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OWE1YWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3hzbHQvY2hhbmdlLW9iamVjdC1wYXRoLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgICAKLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIKLSAgICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICA+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iZG9jdW1lbnRpZCIgLz4KLSAgCi0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5vZGVpZCI+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdldG5vZGVpZCI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9IiRkb2N1bWVudGlkIi8+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dmFyaWFibGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6b2JqZWN0L0BkYXRhW25vdChzdGFydHMtd2l0aCguLCAnLycpKV0iPgotICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRhdGEiPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgkbm9kZWlkLCAnLycsIC4pIiAvPgotICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIgLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImdldG5vZGVpZCI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ1cmwiIC8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzbGFzaCI+LzwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCR1cmwsICRzbGFzaCkiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2V0bm9kZWlkIj4KLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkdXJsLCAkc2xhc2gpIiAvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVybCIgLz4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ieGUveHNsdC9jb25maWcteG1sLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS94c2x0L2NvbmZpZy14bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ2NWZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS94c2x0L2NvbmZpZy14bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgCi0gIHhtbG5zOmNpbmNsdWRlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaW5jbHVkZS8xLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQotPHhzbDpwYXJhbSBuYW1lPSJCWF94bWxmaWxlIi8+Ci08eHNsOnBhcmFtIG5hbWU9IkJYX3hodG1sZmlsZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJCWF94c2xmaWxlIi8+Ci08eHNsOnBhcmFtIG5hbWU9IkJYX3ZhbGlkYXRpb25maWxlIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImNzcyIvPgotPHhzbDpwYXJhbSBuYW1lPSJzY3JpcHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY2FsbGJhY2tzY3JpcHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iQlhfZXhpdGRlc3RpbmF0aW9uIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImNvbnRleHRtZW51ZmlsZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJkZWZhdWx0bGFuZ3VhZ2UiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2NvbmZpZyI+Ci0gIDx4c2w6Y29weT4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIHwgbm9kZSgpIi8+Ci0KLSAgPGNpbmNsdWRlOmluY2x1ZGUgc3JjPSJ7JGNvbnRleHRtZW51ZmlsZX0iLz4KLSAgPC94c2w6Y29weT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlcy9pbnB1dC9maWxlW0BuYW1lID0gJ0JYX3htbGZpbGUnXSI+Ci0gIDxmaWxlIG5hbWU9IkJYX3htbGZpbGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQlhfeG1sZmlsZSIvPjwvZmlsZT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlcy9pbnB1dC9maWxlW0BuYW1lID0gJ0JYX3hodG1sZmlsZSddIj4KLSAgPHhzbDppZiB0ZXN0PSIkQlhfeGh0bWxmaWxlIj4KLSAgICA8ZmlsZSBuYW1lPSJCWF94aHRtbGZpbGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQlhfeGh0bWxmaWxlIi8+PC9maWxlPgotICA8L3hzbDppZj4KLQotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGVzL2lucHV0L2ZpbGVbQG5hbWUgPSAnQlhfeHNsZmlsZSddIj4KLSAgPHhzbDppZiB0ZXN0PSIkQlhfeHNsZmlsZSI+Ci0gICAgPGZpbGUgbmFtZT0iQlhfeHNsZmlsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRCWF94c2xmaWxlIi8+PC9maWxlPgotICA8L3hzbDppZj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlcy9pbnB1dC9maWxlW0BuYW1lID0gJ0JYX3ZhbGlkYXRpb25maWxlJ10iPgotICA8eHNsOmlmIHRlc3Q9IiRCWF92YWxpZGF0aW9uZmlsZSI+Ci0gICAgPGZpbGUgbmFtZT0iQlhfdmFsaWRhdGlvbmZpbGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQlhfdmFsaWRhdGlvbmZpbGUiLz48L2ZpbGU+Ci0gIDwveHNsOmlmPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZmlsZXMvb3V0cHV0L2ZpbGVbQG5hbWUgPSAnQlhfZXhpdGRlc3RpbmF0aW9uJ10iPgotICA8ZmlsZSBuYW1lPSJCWF9leGl0ZGVzdGluYXRpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQlhfZXhpdGRlc3RpbmF0aW9uIi8+PC9maWxlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGVzL2Nzcy9maWxlIj4KLSAgPGZpbGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjc3MiLz48L2ZpbGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlcy9zY3JpcHRzL2ZpbGVbcG9zaXRpb24oKT1sYXN0KCldIj4KLSAgICA8ZmlsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvZmlsZT4KLSAgICA8eHNsOmlmIHRlc3Q9IiRzY3JpcHQiPgotICAgICAgPGZpbGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzY3JpcHQiLz48L2ZpbGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSIkY2FsbGJhY2tzY3JpcHQiPgotICAgICAgPGZpbGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYWxsYmFja3NjcmlwdCIvPjwvZmlsZT4KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gcGFzcyBkZWZhdWx0IGxhbmd1YWdlIHRvIGxpbmsgc2NyZWVuIGZvciBzaXRldHJlZSBkaXNwbGF5IC0tPiAgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJjYWxsYmFja3MvZWxlbWVudFtAbmFtZSA9ICdhJ10vdGV4dCgpIj4KLSAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4mYW1wO2xhbmd1YWdlPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVmYXVsdGxhbmd1YWdlIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLSAgCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gIDx4c2w6Y29weT4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotCi0gIDwveHNsOmNvcHk+Ci08L3hzbDp0ZW1wbGF0ZT4KLSAgIAotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ieGUveHNsdC9pbmRleC14aHRtbC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9ieGUveHNsdC9pbmRleC14aHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGUxN2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvYnhlL3hzbHQvaW5kZXgteGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotPgotCi08eHNsOnBhcmFtIG5hbWU9ImNvbmZpZ2ZpbGUiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY29udGV4dCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpoZWFkL3hodG1sOnRpdGxlIj4KLSAgPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29uZmlnZmlsZSIvPjwvdGl0bGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6Ym9keS9Ab25sb2FkIj4KLSAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj5ieGVfc3RhcnQoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29uZmlnZmlsZSIvPicpPC94c2w6YXR0cmlidXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmhlYWQveGh0bWw6bGluay9AaHJlZiI+Ci0gIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGV4dCIvPi9ieGUvY3NzL2VkaXRvci5jc3M8L3hzbDphdHRyaWJ1dGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aGVhZC94aHRtbDpzY3JpcHQvQHNyYyI+Ci0gIDx4c2w6YXR0cmlidXRlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250ZXh0Ii8+L2J4ZS9ieGVMb2FkZXIuanM8L3hzbDphdHRyaWJ1dGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgPHhzbDpjb3B5PgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gIDwveHNsOmNvcHk+Ci08L3hzbDp0ZW1wbGF0ZT4KLSAgIAotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ieGUveHNsdC9zaXRldHJlZTJ0cmVlLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS94c2x0L3NpdGV0cmVlMnRyZWUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThiYTYwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2J4ZS94c2x0L3NpdGV0cmVlMnRyZWUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTwhLS0KLSAgICAgICAgQ29udmVydHMgYSBzaXRldHJlZSBpbnRvIGEgamF2YXNjcmlwdCBhcnJheSBzdWl0YWJsZSBmb3IgdGhlIHRyZWUgd2lkZ2V0LgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM6cz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL25hdmlnYXRpb24vMS4wIj4KLQotPHhzbDppbXBvcnQgaHJlZj0iLi4vdXRpbC9zdHJpbmctZnVuY3Rpb25zLnhzbCIvPgotCi08eHNsOm91dHB1dCBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+ICAgIAotCi08eHNsOnBhcmFtIG5hbWU9ImNvbnRleHRwcmVmaXgiLz4KLTx4c2w6cGFyYW0gbmFtZT0icHVibGljYXRpb25pZCIvPgotPHhzbDpwYXJhbSBuYW1lPSJjaG9zZW5sYW5ndWFnZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJkZWZhdWx0bGFuZ3VhZ2UiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY3V0ZG9jdW1lbnRpZCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbmNyZW1lbnRhbCIvPgotPHhzbDpwYXJhbSBuYW1lPSJhcmVhcyIvPgotICAgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InBhcmVudFBhdGgiLz4KLS8vIFlvdSBjYW4gZmluZCBpbnN0cnVjdGlvbnMgZm9yIHRoaXMgZmlsZSBhdCBodHRwOi8vd3d3LnRyZWV2aWV3Lm5ldAotCi0vL0Vudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgdXN1YWxseSBzZXQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCi1VU0VURVhUTElOS1MgPSAxCi1TVEFSVEFMTE9QRU4gPSAwCi1VU0VGUkFNRVMgPSAwCi1VU0VJQ09OUyA9IDAKLVdSQVBURVhUID0gMQotUFJFU0VSVkVTVEFURSA9IDEKLUhJR0hMSUdIVCA9IDEKLUhJR0hMSUdIVF9CRyA9ICIjREREQ0NGIgotSElHSExJR0hUX0NPTE9SID0gIiM2NjY2NjYiCi1DT05URVhUX1BSRUZJWCA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRleHRwcmVmaXgiLz4iOwotUFVCTElDQVRJT05fSUQgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwdWJsaWNhdGlvbmlkIi8+IjsKLUNIT1NFTl9MQU5HVUFHRSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNob3Nlbmxhbmd1YWdlIi8+IjsKLURFRkFVTFRfTEFOR1VBR0UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZWZhdWx0bGFuZ3VhZ2UiLz4iOwotQ1VUX0RPQ1VNRU5UX0lEID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY3V0ZG9jdW1lbnRpZCIvPiI7Ci1BTExfQVJFQVMgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcmVhcyIvPiIKLVBJUEVMSU5FX1BBVEggPSAnL2F1dGhvcmluZy9pbmZvLXNpdGV0cmVlL3NpdGV0cmVlLWZyYWdtZW50LnhtbCcKLTx4c2w6Y2hvb3NlPgotICA8eHNsOndoZW4gdGVzdD0iJGluY3JlbWVudGFsPSd0cnVlJyI+Ci1JTkNSRU1FTlRBTF9MT0FESU5HID0gdHJ1ZTsKLSAgPC94c2w6d2hlbj4KLSAgPHhzbDpvdGhlcndpc2U+Ci1JTkNSRU1FTlRBTF9MT0FESU5HID0gZmFsc2U7Ci0gIDwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLQotPCEtLSBpbmNyZW1lbnRhbCBsb2FkaW5nIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUgcHJlc2VydmUgc3RhdGUgbWVjaGFuaXNtIChjb29raWVzKSAtLT4KLWlmIChJTkNSRU1FTlRBTF9MT0FESU5HKSBQUkVTRVJWRVNUQVRFPTA7Ci0KLWZvbGRlcnNUcmVlID0gZ0ZsZCgiJmx0O3N0cm9uZyZndDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1YmxpY2F0aW9uaWQiLz4mbHQ7L3N0cm9uZyZndDsiKQotCi0gIDx4c2w6aWYgdGVzdD0iJGluY3JlbWVudGFsIT0ndHJ1ZSciPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGVueWEvczpzaXRlIi8+Ci0gIDwveHNsOmlmPgotCi0vL1NldCB0aGlzIHN0cmluZyBpZiBUcmVldmlldyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcyBtYXkgYWxzbyBiZSBsb2FkZWQgaW4gdGhlIHNhbWUgc2Vzc2lvbgotZm9sZGVyc1RyZWUudHJlZUlEID0gInQyIgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InM6c2l0ZSI+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icGFyZW50UGF0aCIvPgotICA8eHNsOnZhcmlhYmxlIG5hbWU9InN1ZmZpeCI+Ci0gIAk8eHNsOmlmIHRlc3Q9Im5vdCgkY2hvc2VubGFuZ3VhZ2UgPSAkZGVmYXVsdGxhbmd1YWdlKSI+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2hvc2VubGFuZ3VhZ2UiLz48L3hzbDppZj4KLSAgPC94c2w6dmFyaWFibGU+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImxpbmsiPgotICAgICAgPHhzbDp0ZXh0PiwgJ2phdmFzY3JpcHQ6c2V0TGluayhcJzwveHNsOnRleHQ+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCcvJywgJHN1ZmZpeCkiLz4KLSAgICAgIDx4c2w6dGV4dD5cJyknPC94c2w6dGV4dD4KLSAgPC94c2w6dmFyaWFibGU+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3RlY3RlZC1wcmUiPjx4c2w6aWYgdGVzdD0iQHByb3RlY3RlZCA9ICd0cnVlJyI+Jmx0O3NwYW4gY2xhc3M9XCJsZW55YS1pbmZvLXByb3RlY3RlZFwiJmd0OzwveHNsOmlmPjwveHNsOnZhcmlhYmxlPgotICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3RlY3RlZC1wb3N0Ij48eHNsOmlmIHRlc3Q9IkBwcm90ZWN0ZWQgPSAndHJ1ZSciPiZsdDsvc3BhbiZndDs8L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLSAgCi0gIDx4c2w6dmFyaWFibGUgbmFtZT0icHJlIiBzZWxlY3Q9IiRwcm90ZWN0ZWQtcHJlIi8+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zdCIgc2VsZWN0PSIkcHJvdGVjdGVkLXBvc3QiLz4KLSAgCi0gIDx4c2w6Y2hvb3NlPgotICAJPHhzbDp3aGVuIHRlc3Q9ImRlc2NlbmRhbnQ6OnM6bm9kZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImdlbmVyYXRlLWlkKC4pIi8+ID0gaW5zRmxkKGZvbGRlcnNUcmVlLCBnRmxkKCImIzE2MDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc3QiLz4mIzE2MDsiIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluayIvPikpPC94c2w6d2hlbj4KLSAgICA8eHNsOm90aGVyd2lzZT5pbnNEb2MoZm9sZGVyc1RyZWUsIGdMbmsoIlMiLCAiJiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3N0Ii8+JiMxNjA7IiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpbmsiLz4pKTwveHNsOm90aGVyd2lzZT4KLSAgPC94c2w6Y2hvb3NlPgotICA8eHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50UGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4gICAKLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJzOm5vZGUiPgotICA8eHNsOnBhcmFtIG5hbWU9InBhcmVudFBhdGgiLz4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0cmVlLWFyZWEiIHNlbGVjdD0iYW5jZXN0b3I6OnM6c2l0ZS9AYXJlYSIvPgotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImxpbmsiPgotICAgIDx4c2w6aWYgdGVzdD0ibm90KEBwcm90ZWN0ZWQgPSAndHJ1ZScpIj4KLSAgICAgIDx4c2w6dGV4dD4sICdqYXZhc2NyaXB0OnNldExpbmsoXCc8L3hzbDp0ZXh0PgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgnLycsIEBiYXNpYy11cmwsIEBsYW5ndWFnZS1zdWZmaXgsIEBzdWZmaXgpIi8+Ci0gICAgICA8eHNsOnRleHQ+XCcpJzwveHNsOnRleHQ+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnZhcmlhYmxlPgotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImV4aXN0cy1sYW5ndWFnZSIgc2VsZWN0PSJzOmxhYmVsW2xhbmcoJGNob3Nlbmxhbmd1YWdlKV0iLz4KLSAgCi0gIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvdGVjdGVkLXByZSI+PHhzbDppZiB0ZXN0PSJAcHJvdGVjdGVkID0gJ3RydWUnIj4mbHQ7c3BhbiBjbGFzcz1cImxlbnlhLWluZm8tcHJvdGVjdGVkXCImZ3Q7PC94c2w6aWY+PC94c2w6dmFyaWFibGU+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvdGVjdGVkLXBvc3QiPjx4c2w6aWYgdGVzdD0iQHByb3RlY3RlZCA9ICd0cnVlJyI+Jmx0Oy9zcGFuJmd0OzwveHNsOmlmPjwveHNsOnZhcmlhYmxlPgotICAKLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuby1sYW5ndWFnZS1wcmUiPjx4c2w6aWYgdGVzdD0ibm90KCRleGlzdHMtbGFuZ3VhZ2UpIj4mbHQ7c3BhbiBjbGFzcz1cImxlbnlhLWluZm8tbm9sYW5ndWFnZVwiJmd0OzwveHNsOmlmPjwveHNsOnZhcmlhYmxlPgotICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5vLWxhbmd1YWdlLXBvc3QiPjx4c2w6aWYgdGVzdD0ibm90KCRleGlzdHMtbGFuZ3VhZ2UpIj4mbHQ7L3NwYW4mZ3Q7PC94c2w6aWY+PC94c2w6dmFyaWFibGU+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImN1dC1wcmUiPjx4c2w6aWYgdGVzdD0iJGN1dGRvY3VtZW50aWQgPSBjb25jYXQoJy8nLCBAYmFzaWMtdXJsKSI+Jmx0O3NwYW4gY2xhc3M9J2xlbnlhLWluZm8tY3V0JyZndDtbPC94c2w6aWY+PC94c2w6dmFyaWFibGU+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0iY3V0LXBvc3QiPjx4c2w6aWYgdGVzdD0iJGN1dGRvY3VtZW50aWQgPSBjb25jYXQoJy8nLCBAYmFzaWMtdXJsKSI+XSZsdDsvc3BhbiZndDs8L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLSAgCi0gIDx4c2w6dmFyaWFibGUgbmFtZT0icHJlIiBzZWxlY3Q9ImNvbmNhdCgkbm8tbGFuZ3VhZ2UtcHJlLCAkcHJvdGVjdGVkLXByZSwgJGN1dC1wcmUpIi8+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zdCIgc2VsZWN0PSJjb25jYXQoJGN1dC1wb3N0LCAkcHJvdGVjdGVkLXBvc3QsICRuby1sYW5ndWFnZS1wb3N0KSIvPgotCi0gIDx4c2w6Y2hvb3NlPgotICAJPHhzbDp3aGVuIHRlc3Q9ImRlc2NlbmRhbnQ6OnM6bm9kZSI+Ci0gIAkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImdlbmVyYXRlLWlkKC4pIi8+Ci0gIAkJPSBpbnNGbGQoCi0gIAkJCSAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJnZW5lcmF0ZS1pZCguLikiLz4sCi0gICAgICAgICAgIGdGbGQoIiZsdDtzcGFuIHN0eWxlPVwicGFkZGluZzogMHB4IDVweDtcIiZndDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZSIvPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJnZXRMYWJlbCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zdCIvPiZsdDsvc3BhbiZndDsiCi0gICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluayIvPikKLSAgICAgICk7Ci0gICAgPC94c2w6d2hlbj4KLSAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAJaW5zRG9jKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJnZW5lcmF0ZS1pZCguLikiLz4sCi0gICAgCSAgICAgICBnTG5rKAotICAgIAkgICAgICAgICAgICJTIiwKLSAgICAJICAgICAgICAgICAiJmx0O3NwYW4gc3R5bGU9XCJwYWRkaW5nOiAwcHggNXB4O1wiJmd0Ozx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJlIi8+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdldExhYmVsIi8+Jmx0Oy9zcGFuJmd0OyIKLSAgICAJICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpbmsiLz4pCi0gICAgICApOwotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICA8L3hzbDpjaG9vc2U+Ci0gIDx4c2w6YXBwbHktdGVtcGxhdGVzPgotICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnRQYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudFBhdGgiLz4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImdldExhYmVsIj4KLSAgPHhzbDpjaG9vc2U+Ci0gICAgPHhzbDp3aGVuIHRlc3Q9InM6bGFiZWxbbGFuZygkY2hvc2VubGFuZ3VhZ2UpXSI+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZXNjYXBlLWNoYXJhY3RlcnMiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5wdXQiIHNlbGVjdD0iczpsYWJlbFtsYW5nKCRjaG9zZW5sYW5ndWFnZSldIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOndoZW4+Ci0gICAgPHhzbDp3aGVuIHRlc3Q9InM6bGFiZWxbbGFuZygkZGVmYXVsdGxhbmd1YWdlKV0iPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImVzY2FwZS1jaGFyYWN0ZXJzIj4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImlucHV0IiBzZWxlY3Q9InM6bGFiZWxbbGFuZygkZGVmYXVsdGxhbmd1YWdlKV0iLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC94c2w6d2hlbj4KLSAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJlc2NhcGUtY2hhcmFjdGVycyI+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbnB1dCIgc2VsZWN0PSJzOmxhYmVsIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOm90aGVyd2lzZT4KLSAgPC94c2w6Y2hvb3NlPgkKLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJzOmxhYmVsIi8+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJlc2NhcGUtY2hhcmFjdGVycyI+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iaW5wdXQiLz4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlc2NhcGUtbHQiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImlucHV0IiBzZWxlY3Q9IiRpbnB1dCIvPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNlYXJjaC1zdHJpbmciPiZsdDs8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2Utc3RyaW5nIj4mYW1wO2x0OzwveHNsOndpdGgtcGFyYW0+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dmFyaWFibGU+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0iZXNjYXBlLWd0Ij4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VhcmNoLWFuZC1yZXBsYWNlIj4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbnB1dCIgc2VsZWN0PSIkZXNjYXBlLWx0Ii8+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2VhcmNoLXN0cmluZyI+Jmd0OzwveHNsOndpdGgtcGFyYW0+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwbGFjZS1zdHJpbmciPiZhbXA7Z3Q7PC94c2w6d2l0aC1wYXJhbT4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICA8L3hzbDp2YXJpYWJsZT4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlc2NhcGUtcXVvdCI+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlYXJjaC1hbmQtcmVwbGFjZSI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5wdXQiIHNlbGVjdD0iJGVzY2FwZS1ndCIvPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNlYXJjaC1zdHJpbmciPiI8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2Utc3RyaW5nIj5cIjwveHNsOndpdGgtcGFyYW0+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dmFyaWFibGU+Ci0gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXNjYXBlLXF1b3QiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9jb25maWcvY29jb29uLXhjb25mL21vZHVsZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9jb25maWcvY29jb29uLXhjb25mL21vZHVsZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyOWMwYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvY29uZmlnL2NvY29vbi14Y29uZi9tb2R1bGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi9yZXNvdXJjZS10eXBlcyIgdW5sZXNzPSIvY29jb29uL3Jlc291cmNlLXR5cGVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdjZm9ybXMnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJjZm9ybXMiCi0gICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPSJsZW55YS5yZXNvdXJjZXR5cGVzLmNmb3JtcyIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlSW1wbCI+Ci0gICAgPHNjaGVtYSAKLSAgICAgIHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2Nmb3Jtcy9zY2hlbWFzL2Nmb3Jtcy5ybmciIAotICAgICAgbmFtZXNwYWNlPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzAuOSIKLSAgICAvPgotICAgIDxzYW1wbGUgCi0gICAgICBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3htbCIKLSAgICAgIHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2Nmb3Jtcy9zYW1wbGVzL2Nmb3Jtcy54bWwiCi0gICAgLz4KLSAgICA8bGluay1hdHRyaWJ1dGUgeHBhdGg9Ii8vKltuYW1lc3BhY2UtdXJpKCkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCddL0BocmVmIi8+Ci0gICAgPGZvcm1hdCBuYW1lPSJ4aHRtbCIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL2Nmb3Jtcy94aHRtbC54bWwiLz4KLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0KLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWVkaXQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWVkaXQueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNGI1ZWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1lZGl0Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2Nmb3Jtcy5lZGl0J10iPgotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImNmb3Jtcy5lZGl0IgotICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEuc2l0ZSIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy5jZm9ybXMuQ0Zvcm1zIj4KLSAgICA8dmlldyAKLSAgICAgICB1cmk9Im1vZHVsZXMvY2Zvcm1zL3VzZWNhc2VzL2R5bmFtaWNyZXBlYXRlcl90ZW1wbGF0ZS54bWwiIAotICAgICAgIGN1c3RvbUZsb3c9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9jZm9ybXMvZmxvdy9jdXN0b21GbG93LmpzIgotICAgIC8+Ci0gICAgPGV2ZW50IGlkPSJlZGl0Ii8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotPC94Y29uZj4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL2NvbmZpZy9tZW51LnhzcCBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9jb25maWcvbWVudS54c3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDNmYWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL2NvbmZpZy9tZW51LnhzcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZ2VuZXJpYy54c3AgMTU1ODA2IDIwMDUtMDMtMDEgMTc6NTU6NDJaIGFuZHJlYXMgJCAtLT4KLQotPHhzcDpwYWdlIAotICAgIGxhbmd1YWdlPSJqYXZhIiAKLSAgICB4bWxuczp4c3A9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcCIKLSAgICB4bWxuczp4c3AtcmVxdWVzdD0iaHR0cDovL2FwYWNoZS5vcmcveHNwL3JlcXVlc3QvMi4wIgotICAgIHhtbG5zOmlucHV0PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24veHNwL2lucHV0LzEuMCIKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICAgIHhtbG5zOndmPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvd29ya2Zsb3cvMS4wIgotICAgIHhtbG5zOnVjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLT4KLQotICA8eHNwOnN0cnVjdHVyZT4KLSAgICA8eHNwOmluY2x1ZGU+b3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ8L3hzcDppbmNsdWRlPgotICAgIDx4c3A6aW5jbHVkZT5vcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjwveHNwOmluY2x1ZGU+Ci0gIDwveHNwOnN0cnVjdHVyZT4KLSAgCi0gIDxtZW51PgotCi0gICAgPG1lbnVzPgotICAgICAgPG1lbnUgaTE4bjphdHRyPSJuYW1lIiBuYW1lPSJGaWxlIj4KLSAgICAgICAgPGJsb2NrIGFyZWFzPSJzaXRlIGF1dGhvcmluZyIgaWQ9ImNyZWF0ZSI+Ci0gICAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZW1hbmFnZW1lbnQuY3JlYXRlIiBocmVmPSI/ZG9jdHlwZT1jZm9ybXMiPgotICAgICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICA8aTE4bjp0ZXh0Pk5ldyAuLi4gRG9jdW1lbnQ8L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgPGkxOG46cGFyYW0+PGkxOG46dGV4dD5yZXNvdXJjZVR5cGUtY2Zvcm1zPC9pMThuOnRleHQ+PC9pMThuOnBhcmFtPgotICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDwvYmxvY2s+Ci0gICAgICA8L21lbnU+Ci0gICAgICAKLSAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iRWRpdCI+Ci0gICAgICAgICAgPHhzcDpsb2dpYz4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGRvYyA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9Im9iamVjdCIgbmFtZT0iZG9jdW1lbnQiLz47Ci0gICAgICAgICAgICAgICAgaWYgKGRvYyBpbnN0YW5jZW9mIERvY3VtZW50ICZhbXA7JmFtcDsgKChEb2N1bWVudCkgZG9jKS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG9jdHlwZSA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9InN0cmluZyIgbmFtZT0iZG9jdW1lbnQtdHlwZSIvPjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJjZm9ybXMiLmVxdWFscyhkb2N0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgPGJsb2NrIGFyZWFzPSJhdXRob3JpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbSB3ZjpldmVudD0iZWRpdCIgdWM6dXNlY2FzZT0iY2Zvcm1zLmVkaXQiIGhyZWY9Ij8iPjxpMThuOnRleHQ+V2l0aCBDRm9ybXM8L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVE9ETzogYWRkIFJlbGF4Tkcgc2NoZW1hcyBmb3IgY2Zvcm1zIGRvY3R5cGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtIHdmOmV2ZW50PSJlZGl0IiB1Yzp1c2VjYXNlPSJlZGl0b3JzLmZvcm1zIj48eHNwOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNwOmV4cHI+Ij9mb3JtPSIgKyBkb2N0eXBlPC94c3A6ZXhwcj48L3hzcDphdHRyaWJ1dGU+PGkxOG46dGV4dD5XaXRoIEZvcm1zPC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbSB3ZjpldmVudD0iZWRpdCIgdWM6dXNlY2FzZT0iZWRpdG9ycy5vbmVmb3JtIiBocmVmPSI/Ij48aTE4bjp0ZXh0PldpdGggb25lIEZvcm08L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9ibG9jaz4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgbWVudSBnZW5lcmF0aW9uOiAiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICA8L3hzcDpsb2dpYz4KLSAgICAgIDwvbWVudT4KLSAgICAgIAotICAgIDwvbWVudXM+Ci0gICAgCi0gIDwvbWVudT4KLTwveHNwOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODRiZDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuY2Zvcm1zPC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPkNGb3JtcyBFZGl0b3I8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPkNGb3JtcyBFZGl0b3I8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL2Zsb3cvY3VzdG9tRmxvdy5qcyBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9mbG93L2N1c3RvbUZsb3cuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTg2ZjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL2Zsb3cvY3VzdG9tRmxvdy5qcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLWZ1bmN0aW9uIGN1c3RvbUxvb3BGbG93KHZpZXcscHJveHksZ2VuZXJpYykgewotICAgLy8gbG9hZCBzb21lIGhlbHBlciBmdW5jdGlvbnMKLSAgIC8vIGNvY29vbi5sb2FkKCJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvY2Zvcm1zL2Zsb3cvbGVueWFkb2MtdXRpbHMuanMiKTsKLSAgICB0cnkgewotICAgICAgICB2YXIgZm9ybURlZiA9ICJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvY2Zvcm1zL3VzZWNhc2VzL2R5bmFtaWNyZXBlYXRlci54bWwiOwotICAgICAgICB2YXIgZm9ybUJpbmQgPSAiZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2Nmb3Jtcy91c2VjYXNlcy9keW5hbWljcmVwZWF0ZXJfYmluZGluZy54bWwiOwotICAgICAgICB2YXIgZm9ybVZpZXcgPSAidXNlY2FzZXMtdmlldy9tZW51L21vZHVsZXMvY2Zvcm1zL3VzZWNhc2VzL2R5bmFtaWNyZXBlYXRlcl90ZW1wbGF0ZS54bWwiOwotICAgICAgICBnZW5lcmljLmZvcm0gPSBuZXcgRm9ybShmb3JtRGVmKTsKLSAgICAgICAgZ2VuZXJpYy5mb3JtLnNldEF0dHJpYnV0ZSgiY291bnRlciIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlcigwKSk7Ci0gICAgICAgIGdlbmVyaWMuZm9ybS5jcmVhdGVCaW5kaW5nKGZvcm1CaW5kKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdmFyIHBhcnNlciA9IGNvY29vbi5nZXRDb21wb25lbnQoUGFja2FnZXMub3JnLmFwYWNoZS5leGNhbGlidXIueG1sLmRvbS5ET01QYXJzZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgdmFyIHJlc29sdmVyID0gY29jb29uLmdldENvbXBvbmVudChQYWNrYWdlcy5vcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSShwcm94eS5nZXRQYXJhbWV0ZXIoJ3NvdXJjZVVyaScpKTsKLSAgICAgICAgICAgICAgICB2YXIgaXMgPSBuZXcgUGFja2FnZXMub3JnLnhtbC5zYXguSW5wdXRTb3VyY2Uoc291cmNlLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIGlzLnNldFN5c3RlbUlkKHNvdXJjZS5nZXRVUkkoKSk7Ci0gICAgICAgICAgICAgICAgZ2VuZXJpYy5kb2MgPSBwYXJzZXIucGFyc2VEb2N1bWVudChpcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICBjb2Nvb24ucmVsZWFzZUNvbXBvbmVudChwYXJzZXIpOwotICAgICAgICAgICAgICAgIGNvY29vbi5yZWxlYXNlQ29tcG9uZW50KHJlc29sdmVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZ2VuZXJpYy5mb3JtLmxvYWQoZ2VuZXJpYy5kb2MpOwotICAgICAgICBnZW5lcmljLmZvcm0uc2hvd0Zvcm0oZm9ybVZpZXcsIHsidXNlY2FzZSIgOiBwcm94eX0pOwotICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewotICAgICAgICAvLyBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93biBieSB0aGUgdmlldywgYWxsb3cgdGhlIHVzZWNhc2UgdG8gcm9sbGJhY2sgdGhlIHRyYW5zaXRpb24KLSAgICAgICAgbG9nKCJlcnJvciIsICJFeGNlcHRpb24gZHVyaW5nIGN1c3RvbUxvb3BGbG93OiAiICsgZXhjZXB0aW9uKTsKLSAgICAgICAgdGhyb3cgZXhjZXB0aW9uOwotICAgIH0KLX0KLQotZnVuY3Rpb24gY3VzdG9tU3VibWl0Rmxvdyh1c2VjYXNlLCBnZW5lcmljKSB7Ci0gICAgZ2VuZXJpYy5mb3JtLnNhdmUoZ2VuZXJpYy5kb2MpOwotICAgIHVzZWNhc2Uuc2V0UGFyYW1ldGVyKCJ4bWwiLCBnZW5lcmljLmRvYyk7Ci0gICAgZGVmYXVsdFN1Ym1pdEZsb3codXNlY2FzZSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvZmxvdy9sZW55YWRvYy11dGlscy5qcyBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9mbG93L2xlbnlhZG9jLXV0aWxzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzBlNWVkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9mbG93L2xlbnlhZG9jLXV0aWxzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQ6IHVzZWNhc2VzLmpzIDI2NTU0NCAyMDA1LTA4LTMxIDE4OjQwOjMxWiB0aG9yc3RlbiAkICovCi0KLXZhciBsb2FkRG9jdW1lbnQ7Ci0KLWZ1bmN0aW9uIGxvYWREb2N1bWVudCh1cmkpIHsKLSAgICB2YXIgcGFyc2VyID0gbnVsbDsKLSAgICB2YXIgc291cmNlID0gbnVsbDsKLSAgICB2YXIgcmVzb2x2ZXIgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICAgIHBhcnNlciA9IGNvY29vbi5nZXRDb21wb25lbnQoUGFja2FnZXMub3JnLmFwYWNoZS5leGNhbGlidXIueG1sLmRvbS5ET01QYXJzZXIuUk9MRSk7Ci0gICAgICAgIHJlc29sdmVyID0gY29jb29uLmdldENvbXBvbmVudChQYWNrYWdlcy5vcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSSh1cmkpOwotICAgICAgICB2YXIgaXMgPSBuZXcgUGFja2FnZXMub3JnLnhtbC5zYXguSW5wdXRTb3VyY2Uoc291cmNlLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICBpcy5zZXRTeXN0ZW1JZChzb3VyY2UuZ2V0VVJJKCkpOwotICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlRG9jdW1lbnQoaXMpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgY29jb29uLnJlbGVhc2VDb21wb25lbnQocGFyc2VyKTsKLSAgICAgICAgY29jb29uLnJlbGVhc2VDb21wb25lbnQocmVzb2x2ZXIpOwotICAgIH0KLX0KLQotdmFyIHNhdmVEb2N1bWVudDsKLQotZnVuY3Rpb24gc2F2ZURvY3VtZW50KGRvY3VtZW50LCB1cmkpIHsKLSAgICB2YXIgc291cmNlID0gbnVsbDsKLSAgICB2YXIgcmVzb2x2ZXIgPSBudWxsOwotICAgIHZhciBvdXRwdXRTdHJlYW0gPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICAgIHJlc29sdmVyID0gY29jb29uLmdldENvbXBvbmVudChQYWNrYWdlcy5vcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSSh1cmkpOwotCi0gICAgICAgIHZhciB0ZiA9IFBhY2thZ2VzLmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFBhY2thZ2VzLm9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Nb2RpZmlhYmxlU291cmNlCi0gICAgICAgICAgICAmJiB0Zi5nZXRGZWF0dXJlKFBhY2thZ2VzLmphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeS5GRUFUVVJFKSkgewotCi0gICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBzb3VyY2UuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgdHJhbnNmb3JtZXJIYW5kbGVyID0gdGYubmV3VHJhbnNmb3JtZXJIYW5kbGVyKCk7Ci0gICAgICAgICAgICB2YXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckhhbmRsZXIuZ2V0VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KFBhY2thZ2VzLmphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5cy5JTkRFTlQsICJ0cnVlIik7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShQYWNrYWdlcy5qYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lckhhbmRsZXIuc2V0UmVzdWx0KG5ldyBQYWNrYWdlcy5qYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQob3V0cHV0U3RyZWFtKSk7Ci0KLSAgICAgICAgICAgIHZhciBzdHJlYW1lciA9IG5ldyBQYWNrYWdlcy5vcmcuYXBhY2hlLmNvY29vbi54bWwuZG9tLkRPTVN0cmVhbWVyKHRyYW5zZm9ybWVySGFuZGxlcik7Ci0gICAgICAgICAgICBzdHJlYW1lci5zdHJlYW0oZG9jdW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhY2thZ2VzLm9yZy5hcGFjaGUuY29jb29uLlByb2Nlc3NpbmdFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSB0byBzb3VyY2UgIiArIHVyaSk7Ci0gICAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICBpZiAoc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgIGNvY29vbi5yZWxlYXNlQ29tcG9uZW50KHJlc29sdmVyKTsKLSAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBjb2Nvb24ubG9nLmVycm9yKCJDb3VsZCBub3QgZmx1c2gvY2xvc2Ugb3V0cHV0c3RyZWFtOiAiICsgZXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZDogdXNlY2FzZXMuanMgMjY1NTQ0IDIwMDUtMDgtMzEgMTg6NDA6MzFaIHRob3JzdGVuICQgKi8KLQotdmFyIGxvYWREb2N1bWVudDsKLQotZnVuY3Rpb24gbG9hZERvY3VtZW50KHVyaSkgewotICAgIHZhciBwYXJzZXIgPSBudWxsOwotICAgIHZhciBzb3VyY2UgPSBudWxsOwotICAgIHZhciByZXNvbHZlciA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgICAgcGFyc2VyID0gY29jb29uLmdldENvbXBvbmVudChQYWNrYWdlcy5vcmcuYXBhY2hlLmV4Y2FsaWJ1ci54bWwuZG9tLkRPTVBhcnNlci5ST0xFKTsKLSAgICAgICAgcmVzb2x2ZXIgPSBjb2Nvb24uZ2V0Q29tcG9uZW50KFBhY2thZ2VzLm9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHVyaSk7Ci0gICAgICAgIHZhciBpcyA9IG5ldyBQYWNrYWdlcy5vcmcueG1sLnNheC5JbnB1dFNvdXJjZShzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgIGlzLnNldFN5c3RlbUlkKHNvdXJjZS5nZXRVUkkoKSk7Ci0gICAgICAgIHJldHVybiBwYXJzZXIucGFyc2VEb2N1bWVudChpcyk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICBjb2Nvb24ucmVsZWFzZUNvbXBvbmVudChwYXJzZXIpOwotICAgICAgICBjb2Nvb24ucmVsZWFzZUNvbXBvbmVudChyZXNvbHZlcik7Ci0gICAgfQotfQotCi12YXIgc2F2ZURvY3VtZW50OwotCi1mdW5jdGlvbiBzYXZlRG9jdW1lbnQoZG9jdW1lbnQsIHVyaSkgewotICAgIHZhciBzb3VyY2UgPSBudWxsOwotICAgIHZhciByZXNvbHZlciA9IG51bGw7Ci0gICAgdmFyIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgICAgcmVzb2x2ZXIgPSBjb2Nvb24uZ2V0Q29tcG9uZW50KFBhY2thZ2VzLm9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHVyaSk7Ci0KLSAgICAgICAgdmFyIHRmID0gUGFja2FnZXMuamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUGFja2FnZXMub3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLk1vZGlmaWFibGVTb3VyY2UKLSAgICAgICAgICAgICYmIHRmLmdldEZlYXR1cmUoUGFja2FnZXMuamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5LkZFQVRVUkUpKSB7Ci0KLSAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IHNvdXJjZS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lckhhbmRsZXIgPSB0Zi5uZXdUcmFuc2Zvcm1lckhhbmRsZXIoKTsKLSAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVySGFuZGxlci5nZXRUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoUGFja2FnZXMuamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzLklOREVOVCwgInRydWUiKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KFBhY2thZ2VzLmphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVySGFuZGxlci5zZXRSZXN1bHQobmV3IFBhY2thZ2VzLmphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLQotICAgICAgICAgICAgdmFyIHN0cmVhbWVyID0gbmV3IFBhY2thZ2VzLm9yZy5hcGFjaGUuY29jb29uLnhtbC5kb20uRE9NU3RyZWFtZXIodHJhbnNmb3JtZXJIYW5kbGVyKTsKLSAgICAgICAgICAgIHN0cmVhbWVyLnN0cmVhbShkb2N1bWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFja2FnZXMub3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIHRvIHNvdXJjZSAiICsgdXJpKTsKLSAgICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgY29jb29uLnJlbGVhc2VDb21wb25lbnQocmVzb2x2ZXIpOwotICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewotICAgICAgICAgICAgICAgIGNvY29vbi5sb2cuZXJyb3IoIkNvdWxkIG5vdCBmbHVzaC9jbG9zZSBvdXRwdXRzdHJlYW06ICIgKyBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy9jZm9ybXMvQ0Zvcm1zLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy9jZm9ybXMvQ0Zvcm1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YjE4MjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2VkaXRvcnMvY2Zvcm1zL0NGb3Jtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy5jZm9ybXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLkNvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuSW52b2tlV29ya2Zsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci0KLS8qKgotICogRHVtbXkgQ0Zvcm1zIHVzZWNhc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDRm9ybXMgZXh0ZW5kcyBJbnZva2VXb3JrZmxvdyB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNpbml0UGFyYW1ldGVycygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb1ByZXBhcmF0aW9uKHRoaXMubWFuYWdlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCB4bWwgPSAob3JnLnczYy5kb20uRG9jdW1lbnQpIGdldFBhcmFtZXRlcigieG1sIik7Ci0gICAgICAgIERvY3VtZW50SGVscGVyLndyaXRlRG9jdW1lbnQoeG1sLCBnZXRTb3VyY2VEb2N1bWVudCgpLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHsKLSAgICAgICAgTm9kZVtdIG5vZGVzID0geyBnZXRTb3VyY2VEb2N1bWVudCgpLmdldFJlcG9zaXRvcnlOb2RlKCkgfTsKLSAgICAgICAgcmV0dXJuIG5vZGVzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZG9QcmVwYXJhdGlvbihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLmNvbnRleHQpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBTdHJpbmcgc291cmNlVXJpID0gZG9jLmdldFNvdXJjZVVSSSgpOwotICAgICAgICBzZXRQYXJhbWV0ZXIoInNvdXJjZVVyaSIsIHNvdXJjZVVyaSk7Ci0gICAgICAgIFN0cmluZyBwdWJJZCA9IGRvYy5nZXRQdWJsaWNhdGlvbigpLmdldElkKCk7Ci0gICAgICAgIHNldFBhcmFtZXRlcigicHViSWQiLCBwdWJJZCk7Ci0gICAgICAgIFN0cmluZyBob3N0PSJodHRwOi8vIityZXF1ZXN0LmdldFNlcnZlck5hbWUoKSsiOiIrcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkgIDsKLSAgICAgICAgc2V0UGFyYW1ldGVyKCJob3N0IiwgaG9zdCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvbWVudXMueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9tZW51cy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVkYjMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9tZW51cy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBtZW51cy54bWFwIDE3ODczOCAyMDA1LTA1LTI3IDAzOjQyOjA5WiBncmVnb3IgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgCQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2VydmVycGFnZXMiIHNyYz0iY29uZmlnL21lbnUueHNwIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdhOGFlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU0MiAyMDA2LTA5LTE1IDA4OjE0OjM5WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0icmVzb3VyY2VUeXBlLWNmb3JtcyI+Q0Zvcm1zPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldpdGggQ0Zvcm1zIj5XaXRoIENGb3JtczwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzQxYWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aV9kZS54bWwgNDQ2NTQyIDIwMDYtMDktMTUgMDg6MTQ6MzlaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJkZSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUtY2Zvcm1zIj5DRm9ybXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV2l0aCBDRm9ybXMiPk1pdCBDRm9ybXM8L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KLQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9zYW1wbGVzL2Nmb3Jtcy54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvc2FtcGxlcy9jZm9ybXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFkYzU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9zYW1wbGVzL2Nmb3Jtcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZGF0YT4KLSAgPGNvbnRhY3RzPgotICA8L2NvbnRhY3RzPgotPC9kYXRhPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMWMwN2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54bWFwIDE3OTQ4OCAyMDA1LTA2LTAyIDAyOjI5OjM5WiBncmVnb3IgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0KLSAgICAgIDwhLS0gcGFyYW1ldHJpemVkIGRvY3R5cGUgbWF0Y2hlciAtLT4KLSAgICAgIDwhLS0gcGF0dGVybj0ie3JlbmRlcnR5cGV9IiAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi54bWwiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0ibGVueWEtZG9jdW1lbnQ6e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0sbGFuZz17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX17bGluazpyZXZ9Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2Nmb3Jtcy94c2x0L2Nmb3JtczJ4aHRtbC54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJlbmRlcnR5cGUiIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpyZW5kZXJ0eXBlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Im5vZGVpZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LW5hbWV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibGFuZ3VhZ2UiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvdXNlY2FzZXMvZHluYW1pY3JlcGVhdGVyLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy91c2VjYXNlcy9keW5hbWljcmVwZWF0ZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWJiOTczLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy91c2VjYXNlcy9keW5hbWljcmVwZWF0ZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0KLSAgQHZlcnNpb24gJElkOiBkeW5hbWljcmVwZWF0ZXIueG1sIDE5MDk2MiAyMDA1LTA2LTE2IDE3OjE3OjAwWiBzeWx2YWluICQKLS0tPgotCi08ZmQ6Zm9ybSB4bWxuczpmZD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2Zvcm1zLzEuMCNkZWZpbml0aW9uIgotICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIj4KLQotICA8ZmQ6d2lkZ2V0cz4KLSAgCi0gICAgPGZkOnJlcGVhdGVyIGlkPSJjb250YWN0cyI+Ci0gICAgICA8ZmQ6d2lkZ2V0cz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gVGhlIElEIGlzIGhlcmUgdG8ga2VlcCB0cmFjayBvZiByb3cgY3JlYXRpb24gb3JkZXIsIHdoaWNoIGNhbgotICAgICAgICAgICAgaGF2ZSBubyByZWxhdGlvbiB3aXRoIHJvdyBpbmRleCB3aGVuIHRoZSB1c2VycyB1c2VkIG1vdmUgdXAvZG93biAtLT4KLSAgICAgICAgPGZkOm91dHB1dCBpZD0iSUQiPgotICAgICAgICAgIDxmZDpsYWJlbD5JRDwvZmQ6bGFiZWw+Ci0gICAgICAgICAgPGZkOmRhdGF0eXBlIGJhc2U9ImludGVnZXIiLz4KLSAgICAgICAgPC9mZDpvdXRwdXQ+Ci0gICAgICAgIAotICAgICAgICA8ZmQ6ZmllbGQgaWQ9ImZpcnN0bmFtZSI+Ci0gICAgICAgICAgPGZkOmxhYmVsPkZpcnN0bmFtZTwvZmQ6bGFiZWw+Ci0gICAgICAgICAgPGZkOmRhdGF0eXBlIGJhc2U9InN0cmluZyIvPgotICAgICAgICA8L2ZkOmZpZWxkPgotICAgICAgICAKLSAgICAgICAgPGZkOmZpZWxkIGlkPSJsYXN0bmFtZSI+Ci0gICAgICAgICAgPGZkOmxhYmVsPkxhc3RuYW1lPC9mZDpsYWJlbD4KLSAgICAgICAgICA8ZmQ6ZGF0YXR5cGUgYmFzZT0ic3RyaW5nIi8+Ci0gICAgICAgIDwvZmQ6ZmllbGQ+Ci0gICAgICAgIAotICAgICAgICA8ZmQ6cm93LWFjdGlvbiBpZD0idXAiIGNvbW1hbmQ9Im1vdmUtdXAiLz4KLSAgICAgICAgCi0gICAgICAgIDxmZDpyb3ctYWN0aW9uIGlkPSJkb3duIiBjb21tYW5kPSJtb3ZlLWRvd24iLz4KLSAgICAgICAgCi0gICAgICAgIDxmZDpib29sZWFuZmllbGQgaWQ9InNlbGVjdCI+Ci0gICAgICAgICAgPGZkOmxhYmVsPlNlbGVjdDwvZmQ6bGFiZWw+Ci0gICAgICAgIDwvZmQ6Ym9vbGVhbmZpZWxkPgotICAgICAgICAKLSAgICAgIDwvZmQ6d2lkZ2V0cz4KLSAgICA8L2ZkOnJlcGVhdGVyPgotICAKLSAgICA8ZmQ6cmVwZWF0ZXItYWN0aW9uIGlkPSJhZGRjb250YWN0IiBjb21tYW5kPSJhZGQtcm93IiByZXBlYXRlcj0iY29udGFjdHMiPgotICAgICAgPGZkOmxhYmVsPkFkZCBjb250YWN0PC9mZDpsYWJlbD4KLSAgICAgIDxmZDpvbi1hY3Rpb24+Ci0gICAgICAgIDxmZDpqYXZhc2NyaXB0PgotICAgICAgICAgIC8vIEluY3JlbWVudCB0aGUgcm93IGNyZWF0aW9uIElEIGNvdW50ZXIgKGl0IGhhcyBiZWVuIGluaXRpYWxpemVkIGluCi0gICAgICAgICAgLy8gdGhlIGZsb3dzY3JpcHQgd2hlbiB0aGUgZm9ybSB3YXMgY3JlYXRlZCkuCi0gICAgICAgICAgLy8gVGhpcyBzaG93cyBob3cgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gbWVhbnMgYmV0d2VlbgotICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGxvZ2ljIGFuZCB3aWRnZXQgZXZlbnQgaGFuZGxlcnMuCi0gICAgICAgICAgdmFyIGZvcm0gPSBldmVudC5zb3VyY2UuZm9ybTsKLSAgICAgICAgICB2YXIgY291bnQgPSBuZXcgamF2YS5sYW5nLkludGVnZXIoZm9ybS5nZXRBdHRyaWJ1dGUoImNvdW50ZXIiKS5pbnRWYWx1ZSgpICsgMSk7Ci0gICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoImNvdW50ZXIiLCBjb3VudCk7Ci0gICAgICAgICAgdmFyIHJlcGVhdGVyID0gZm9ybS5nZXRDaGlsZCgiY29udGFjdHMiKTsKLSAgICAgICAgICByZXBlYXRlci5nZXRSb3cocmVwZWF0ZXIuZ2V0U2l6ZSgpIC0gMSkuZ2V0Q2hpbGQoIklEIikuc2V0VmFsdWUoY291bnQpOwotICAgICAgICA8L2ZkOmphdmFzY3JpcHQ+Ci0gICAgICA8L2ZkOm9uLWFjdGlvbj4KLSAgICA8L2ZkOnJlcGVhdGVyLWFjdGlvbj4KLSAgCi0gICAgPGZkOnJlcGVhdGVyLWFjdGlvbiBpZD0icmVtb3ZlY29udGFjdHMiIGNvbW1hbmQ9ImRlbGV0ZS1yb3dzIiByZXBlYXRlcj0iY29udGFjdHMiIHNlbGVjdD0ic2VsZWN0Ij4KLSAgICAgIDxmZDpsYWJlbD5SZW1vdmUgc2VsZWN0ZWQgY29udGFjdHM8L2ZkOmxhYmVsPgotICAgIDwvZmQ6cmVwZWF0ZXItYWN0aW9uPgotCi0gICAgPGZkOnN1Ym1pdCBpZD0ib2siPgotICAgICAgPGZkOmxhYmVsPjxpMThuOnRleHQ+U3VibWl0PC9pMThuOnRleHQ+PC9mZDpsYWJlbD4KLSAgICA8L2ZkOnN1Ym1pdD4KLSAgPC9mZDp3aWRnZXRzPgotCi08L2ZkOmZvcm0+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvdXNlY2FzZXMvZHluYW1pY3JlcGVhdGVyX2JpbmRpbmcueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3VzZWNhc2VzL2R5bmFtaWNyZXBlYXRlcl9iaW5kaW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0OTJkMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9jZm9ybXMvdXNlY2FzZXMvZHluYW1pY3JlcGVhdGVyX2JpbmRpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0KLSAgQHZlcnNpb24gJElkOiBkeW5hbWljcmVwZWF0ZXJfYmluZGluZy54bWwgMTUxMDQ1IDIwMDUtMDItMDIgMjA6MzY6MDFaIHRpbSAkCi0tLT4KLQotPGZiOmNvbnRleHQgeG1sbnM6ZmI9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9mb3Jtcy8xLjAjYmluZGluZyIKLSAgICB4bWxuczpmZD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2Zvcm1zLzEuMCNkZWZpbml0aW9uIgotICAgIHBhdGg9Ii9kYXRhIj4KLSAgICAKLSAgPGZiOnNpbXBsZS1yZXBlYXRlciBpZD0iY29udGFjdHMiIHBhcmVudC1wYXRoPSJjb250YWN0cyIgcm93LXBhdGg9ImNvbnRhY3QiPgotICAgIDxmYjp2YWx1ZSBpZD0iSUQiIHBhdGg9IkBpZCI+Ci0gICAgICA8ZmQ6Y29udmVydG9yIGRhdGF0eXBlPSJpbnRlZ2VyIi8+Ci0gICAgPC9mYjp2YWx1ZT4KLSAgICA8ZmI6dmFsdWUgaWQ9ImZpcnN0bmFtZSIgcGF0aD0iZmlyc3RuYW1lIi8+Ci0gICAgPGZiOnZhbHVlIGlkPSJsYXN0bmFtZSIgcGF0aD0ibGFzdG5hbWUiLz4KLSAgPC9mYjpzaW1wbGUtcmVwZWF0ZXI+Ci0KLTwvZmI6Y29udGV4dD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy91c2VjYXNlcy9keW5hbWljcmVwZWF0ZXJfdGVtcGxhdGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3VzZWNhc2VzL2R5bmFtaWNyZXBlYXRlcl90ZW1wbGF0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNDU4ZjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3VzZWNhc2VzL2R5bmFtaWNyZXBlYXRlcl90ZW1wbGF0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cGFnZTpwYWdlIHhtbG5zOmZ0PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vZm9ybXMvMS4wI3RlbXBsYXRlIgotICAgICAgeG1sbnM6Zmk9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9mb3Jtcy8xLjAjaW5zdGFuY2UiCi0gICAgICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIj4KLSAgICAgIAotICA8IS0tIEltcG9ydCB0aGUgbWFjcm9zIHRoYXQgZGVmaW5lIENGb3JtcyB0ZW1wbGF0ZSBlbGVtZW50cyAtLT4KLSAgPGp4OmltcG9ydCB1cmk9InJlc291cmNlOi8vb3JnL2FwYWNoZS9jb2Nvb24vZm9ybXMvZ2VuZXJhdGlvbi9qeC1tYWNyb3MueG1sIi8+Ci0KLSAgPHBhZ2U6aGVhZD4KLSAgPC9wYWdlOmhlYWQ+Ci0KLSAgPHBhZ2U6dGl0bGU+Ci0gICAgPGkxOG46dGV4dD5DRm9ybSBFeGFtcGxlPC9pMThuOnRleHQ+Ci0gIDwvcGFnZTp0aXRsZT4KLQotICA8cGFnZTpib2R5PgotICAgIDxmdDpmb3JtLXRlbXBsYXRlIG1ldGhvZD0iUE9TVCIgYWpheD0iZmFsc2UiPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIgotICAgICAgICB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImxlbnlhLnN1Ym1pdCIgbmFtZT0ibGVueWEuc3VibWl0IiB2YWx1ZT0ib2siLz4KLSAgICAgIDxwPgotICAgICAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgaG93IGR5bmFtaWMgdGVtcGxhdGVzICh1c2luZyB0aGUgSlggbWFjcm9zKSBhbGxvdyB0byBjaGFuZ2UgdGhlCi0gICAgICAgIHBhZ2Ugc3RydWN0dXJlIGRlcGVuZGluZyBvbiB0aGUgZm9ybSBjb250ZW50cy4gQnkgYWRkaW5nIG9yIHJlbW92aW5nIHJvd3MgaW4gdGhlIHJlcGVhdGVyCi0gICAgICAgIGJlbG93IHlvdSB3aWxsIHNlZToKLSAgICAgIDwvcD4KLSAgICAgIDx1bD4KLSAgICAgICAgPGxpPndoZW4gdGhlcmUgYXJlIG5vIGNvbnRhY3RzLCBvbmx5IHRoZSAiQWRkIGNvbnRhY3QiIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIHRoZSB0YWJsZSBpc24ndCBzaG93biw8L2xpPgotICAgICAgICA8bGk+d2hlbiB0aGVyZSBhcmUgc29tZSBjb250YWN0cywgdGhlICJtb3ZlIHVwIiBhbmQgIm1vdmUgZG93biIgYnV0dG9ucyBhcmUgbm90IHNob3duIG9uIHRoZSBmaXJzdCBhbmQgbGFzdCBsaW5lcywgcmVzcGVjdGl2ZWx5LjwvbGk+Ci0gICAgICA8L3VsPgotICAgIDxmdDpyZXBlYXRlciBpZD0iY29udGFjdHMiPgotICAgICAgPGRpdj4KLSAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3JlcGVhdGVyLmdldFNpemUoKSA9PSAwfSI+Ci0gICAgICAgICAgICA8cD48c3Ryb25nPjxlbT5UaGVyZSBhcmUgbm8gY29udGFjdHMgdG8gZGlzcGxheTwvZW0+PC9zdHJvbmc+PC9wPgotICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotCi0gICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aD48ZnQ6cmVwZWF0ZXItd2lkZ2V0LWxhYmVsIHdpZGdldC1pZD0iZmlyc3RuYW1lIi8+PC90aD4KLSAgICAgICAgICAgICAgICA8dGg+PGZ0OnJlcGVhdGVyLXdpZGdldC1sYWJlbCB3aWRnZXQtaWQ9Imxhc3RuYW1lIi8+PC90aD4KLSAgICAgICAgICAgICAgICA8dGg+PGZ0OnJlcGVhdGVyLXdpZGdldC1sYWJlbCB3aWRnZXQtaWQ9IklEIi8+PC90aD4KLSAgICAgICAgICAgICAgICA8dGg+PGZ0OnJlcGVhdGVyLXdpZGdldC1sYWJlbCB3aWRnZXQtaWQ9InNlbGVjdCIvPjwvdGg+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDwhLS0gVGhlIGNvbnRlbnRzIG9mIHRoZSByZXBlYXRlci13aWRnZXQgZWxlbWVudCBpcyBhIHRlbXBsYXRlIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gZWFjaCByb3cgaW4gdGhlIHJlcGVhdGVyLiAtLT4KLSAgICAgICAgICAgICAgPGZ0OnJlcGVhdGVyLXJvd3M+Ci0gICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJmb3Jtcy1yb3ctJHtyZXBlYXRlckxvb3AuaW5kZXggJSAyfSI+Ci0gICAgICAgICAgICAgICAgICA8dGQ+PGZ0OndpZGdldCBpZD0iZmlyc3RuYW1lIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgIDx0ZD48ZnQ6d2lkZ2V0IGlkPSJsYXN0bmFtZSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQ+PGZ0OndpZGdldCBpZD0iSUQiLz48L3RkPgotICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICA8IS0tIERvbid0IGRpc3BsYXkgdGhlICJtb3ZlIHVwIiBidXR0b24gb24gdGhlIGZpcnN0IHJvdyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3JlcGVhdGVyTG9vcC5maXJzdH0iPgotICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9jZm9ybXMvZm9ybXMvaW1nL2JsYW5rX2J0bi5naWYiLz4KLSAgICAgICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmdDp3aWRnZXQgaWQ9InVwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpOnN0eWxpbmcgdHlwZT0iaW1hZ2UiIHNyYz0iL2Nmb3Jtcy9mb3Jtcy9pbWcvbW92ZV91cC5naWYiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZnQ6d2lkZ2V0PgotICAgICAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBEb24ndCBkaXNwbGF5IHRoZSAibW92ZSBkb3duIiBidXR0b24gb24gdGhlIGZpcnN0IHJvdyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3JlcGVhdGVyTG9vcC5sYXN0fSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2Nmb3Jtcy9mb3Jtcy9pbWcvYmxhbmtfYnRuLmdpZiIvPgotICAgICAgICAgICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGZ0OndpZGdldCBpZD0iZG93biI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxmaTpzdHlsaW5nIHR5cGU9ImltYWdlIiBzcmM9Ii9jZm9ybXMvZm9ybXMvaW1nL21vdmVfZG93bi5naWYiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZnQ6d2lkZ2V0PgotICAgICAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDxmdDp3aWRnZXQgaWQ9InNlbGVjdCIvPgotICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8L2Z0OnJlcGVhdGVyLXJvd3M+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGZ0OndpZGdldCBpZD0iLi4vYWRkY29udGFjdCIvPgotICAgICAgICAgIDxqeDppZiB0ZXN0PSIke3dpZGdldC5nZXRDaGlsZCgnY29udGFjdHMnKS5nZXRTaXplKCkgPiAwfSI+Ci0gICAgICAgICAgICA8ZnQ6d2lkZ2V0IGlkPSIuLi9yZW1vdmVjb250YWN0cyIvPgotICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgIDwvcD4KLSAgICAgIDwvZGl2PgotICAgICAgPC9mdDpyZXBlYXRlcj4KLSAgICAgIDxmdDp3aWRnZXQgaWQ9Im9rIi8+Ci0gICAgICA8IS0tIElmIHlvdSB3YW50IGEgY2FuY2VsIGJ1dHRvbiB5b3UgYmV3YXJlIHRvIGNoYW5nZSB0aGUgbGVueWEuc3VibWl0IHZhbHVlISEhIGxpa2U6IC0tPgotICAgICAgPGJyLz4KLSAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIgb25DbGljaz0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlbnlhLnN1Ym1pdCcpLnZhbHVlPSdjYW5jZWwnIi8+Ci0gICAgPC9mdDpmb3JtLXRlbXBsYXRlPgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3hzbHQvY2Zvcm1zMnhodG1sLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2Nmb3Jtcy94c2x0L2Nmb3JtczJ4aHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNmJlYzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY2Zvcm1zL3hzbHQvY2Zvcm1zMnhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogeGh0bWwyeGh0bWwueHNsIDIwMTc3NiAyMDA1LTA2LTI1IDE4OjI1OjI2WiBncmVnb3IgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIiAKLSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhodG1sIGxlbnlhIgotICAgID4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8ZGl2IGlkPSJib2R5Ij4KLSAgICAgIDxib2R5PgotICAgICAgICA8aDE+Q0Zvcm1zL0FqYXggRXhhbXBsZTwvaDE+Ci0gICAgICAgIDxwPgotICAgICAgICAgIFBsZWFzZSBlZGl0IHdpdGggQ0Zvcm1zIGVkaXRvciB0byBhZGQgbW9yZSBjb250YWN0cy4gVGhlIENGb3JtcyBlZGl0b3IgdXNlcyBBamF4IHRvIHJlZHVjZSBuZXR3b3JrIHRyYWZmaWMKLSAgICAgICAgICBhbmQgdG8gaW5jcmVhc2UgcmVzcG9uc2UgdGltZXMuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJkYXRhIi8+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9kaXY+Ci0KLSA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbnRhY3RzIj4KLSAgICA8cD4KLSAgICAgIDxzdHJvbmc+Q29udGFjdHM6PC9zdHJvbmc+Ci0gICAgICA8cD4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhY3QiPgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPGk+Tm8gY29udGFjdHMgdG8gZGlzcGxheS48L2k+Ci0gICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICA8L3A+Ci0gICAgPC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb250YWN0Ij4KLSAgICA8bGk+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZmlyc3RuYW1lIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsYXN0bmFtZSIvPgotICAgIDwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2V0eXBlLWNvbGxlY3Rpb24ueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2V0eXBlLWNvbGxlY3Rpb24ueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzA2MzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9jb25maWcvY29jb29uLXhjb25mL3Jlc291cmNldHlwZS1jb2xsZWN0aW9uLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vcmVzb3VyY2UtdHlwZXMiIHVubGVzcz0iL2NvY29vbi9yZXNvdXJjZS10eXBlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnY29sbGVjdGlvbiddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImNvbGxlY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPSJsZW55YS5yZXNvdXJjZXR5cGVzLmNvbGxlY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZUltcGwiPgotICAgIDwhLS0gRklYTUU6IHNob3VsZG4ndCB0aGlzIHJlc291cmNlIHR5cGUgcHJvdmlkZSB2YWxpZGF0aW9uPyAKLSAgICA8c2NoZW1hCi0gICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMC45IgotICAgICAgdXJpPSIiCi0gICAgLz4KLSAgICAtLT4KLSAgICA8c2FtcGxlIG5hbWU9Ik1hbnVhbCIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94bWwiIHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2NvbGxlY3Rpb24vc2FtcGxlcy9jb2xsZWN0aW9uLnhtbCIvPgotICAgIDxzYW1wbGUgbmFtZT0iQ2hpbGRyZW4iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veG1sIiB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9jb2xsZWN0aW9uL3NhbXBsZXMvY2hpbGRyZW4ueG1sIi8+Ci0gICAgPGZvcm1hdCBuYW1lPSJjb2xsZWN0aW9uIiB1cmk9ImNvY29vbjovL21vZHVsZXMvY29sbGVjdGlvbi9jb2xsZWN0aW9uLnhtbCIvPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLQotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkyMDE2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uPC9pZD4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuY29sbGVjdGlvbiIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPkNvbGxlY3Rpb248L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPkNvbGxlY3Rpb24gcmVzb3VyY2UgdHlwZTwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvbW9kdWxlcy9jb2xsZWN0aW9uL0NvbGxlY3Rpb24uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL2NvbGxlY3Rpb24vQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjZiYTBlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL2NvbGxlY3Rpb24vQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogQSBkb2N1bWVudCByZXByZXNlbnRpbmcgYSBjb2xsZWN0aW9uIG9mIGRvY3VtZW50cy4KLSAqIFRoaXMgY2xhc3MgaXMgaW4gcHJvdG90eXBpbmcgc3RhZ2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvbiB7Ci0KLSAgICAvKiogY29sbGVjdGlvbiBuYW1lc3BhY2UgKi8KLSAgICBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jb2xsZWN0aW9uLzEuMCI7Ci0gICAgCi0gICAgLyoqIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeCAqLwotICAgIFN0cmluZyBERUZBVUxUX1BSRUZJWCA9ICJjb2wiOwotICAgIAotICAgIC8qKiBkb2N1bWVudCBlbGVtZW50ICovCi0gICAgU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTiA9ICJjb2xsZWN0aW9uIjsKLSAgICAKLSAgICAvKiogZWxlbWVudCBmb3Igc2luZ2xlIGRvY3VtZW50IHJlZmVyZW5jZXMgKi8KLSAgICBTdHJpbmcgRUxFTUVOVF9ET0NVTUVOVCA9ICJkb2N1bWVudCI7Ci0gICAgCi0gICAgLyoqIGF0dHJpYnV0ZSBmb3IgZG9jdW1lbnQgSURzICovCi0gICAgU3RyaW5nIEFUVFJJQlVURV9VVUlEID0gInV1aWQiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgdHlwZSBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgU3RyaW5nIEFUVFJJQlVURV9UWVBFID0gInR5cGUiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgaHJlZiBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgU3RyaW5nIEFUVFJJQlVURV9IUkVGID0gImhyZWYiOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudHMgaW4gdGhpcyBjb2xsZWN0aW9uLgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgZG9jdW1lbnRzLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBEb2N1bWVudFtdIGdldERvY3VtZW50cygpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb2N1bWVudCB0byB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgYWRkKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgZG9jdW1lbnQgaW50byB0aGUgY29sbGVjdGlvbiBhdCBhIHNwZWNpZmljIHBvc2l0aW9uLgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBBIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGRvY3VtZW50IGFmdGVyIGluc2VydGlvbiwKLSAgICAgKiBzdGFydGluZyB3aXRoIDAuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHZvaWQgYWRkKGludCBwb3NpdGlvbiwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBBIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gd2hlbiB0aGUgZG9jdW1lbnQgaXMgbm90IGNvbnRhaW5lZAotICAgICAqIG9yIGFub3RoZXIgZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZG9jdW1lbnRzIGZyb20gdGhpcyBjb2xsZWN0aW9uLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICB2b2lkIGNsZWFyKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgYSBzcGVjaWZpYyBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBib29sZWFuIGNvbnRhaW5zKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhpcyBkb2N1bWVudCBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQW4gaW50ZWdlci4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHdoZW4gdGhlIGRvY3VtZW50IGlzIG5vdCBjb250YWluZWQuCi0gICAgICovCi0gICAgaW50IGdldEZpcnN0UG9zaXRpb24oRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIGluIHRoaXMgY29sbGVjdGlvbi4KLSAgICAgKiBAcmV0dXJuIEFuIGludGVnZXIgdmFsdWUuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIGludCBzaXplKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGRvY3VtZW50IHdoaWNoIHRoZSBjb2xsZWN0aW9uIGlzIHN0b3JlZCBpbi4KLSAgICAgKi8KLSAgICBEb2N1bWVudCBnZXREZWxlZ2F0ZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFR5cGUgZm9yIGF1dG9tYXRpYyBpbmNsdXNpb24gb2YgY2hpbGQgZG9jdW1lbnRzLgotICAgICAqLwotICAgIFN0cmluZyBUWVBFX0NISUxEUkVOID0gImNoaWxkcmVuIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUeXBlIGZvciBtYW51YWwgYWRkaXRpb24gb2YgZG9jdW1lbnRzLgotICAgICAqLwotICAgIFN0cmluZyBUWVBFX01BTlVBTCA9ICJtYW51YWwiOwotCi0gICAgLyoqCi0gICAgICogVHlwZSBmb3IgbWFudWFsIGFkZGl0aW9uIG9mIGRvY3VtZW50cy4KLSAgICAgKi8KLSAgICBTdHJpbmcgVFlQRV9MSU5LID0gImxpbmsiOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHR5cGUgT25lIG9mIHtAbGluayAjVFlQRV9DSElMRFJFTn0sIHtAbGluayAjVFlQRV9NQU5VQUx9LCB7QGxpbmsgI1RZUEVfTElOS30uCi0gICAgICovCi0gICAgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gT25lIG9mIHtAbGluayAjVFlQRV9DSElMRFJFTn0sIHtAbGluayAjVFlQRV9NQU5VQUx9LCB7QGxpbmsgI1RZUEVfTElOS30uCi0gICAgICovCi0gICAgU3RyaW5nIGdldFR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBsaW5rIHRhcmdldC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SHJlZigpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBocmVmIFRoZSBsaW5rIHRhcmdldC4gSWYgdGhlIHR5cGUgaXMgbm90IHtAbGluayAjVFlQRV9MSU5LfSwgY2FsbGluZwotICAgICAqIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0gICAgICovCi0gICAgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL2NvbGxlY3Rpb24vQ29sbGVjdGlvbldyYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL2NvbGxlY3Rpb24vQ29sbGVjdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3MTVlYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvbW9kdWxlcy9jb2xsZWN0aW9uL0NvbGxlY3Rpb25XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguWFBhdGhBUEk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogRG9jdW1lbnQgd3JhcHBlciBmb3IgY29sbGVjdGlvbiBmdW5jdGlvbmFsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbldyYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBDb2xsZWN0aW9uIHsKLQotICAgIHByaXZhdGUgRG9jdW1lbnQgZGVsZWdhdGU7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRZUEVTID0geyBUWVBFX0NISUxEUkVOLCBUWVBFX01BTlVBTCwgVFlQRV9MSU5LIH07Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbldyYXBwZXIoRG9jdW1lbnQgZG9jLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIGVuYWJsZUxvZ2dpbmcobG9nZ2VyKTsKLSAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRvYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RGVsZWdhdGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBkb2N1bWVudHNMaXN0OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCB0aGF0IGhvbGRzIHRoZSBkb2N1bWVudHMuIFVzZSB0aGlzIG1ldGhvZCB0byBpbnZva2UgbGF6eQotICAgICAqIGxvYWRpbmcuCi0gICAgICogQHJldHVybiBBIGxpc3QuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGRvY3VtZW50cygpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvYWQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRzTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uLkNvbGxlY3Rpb24jZ2V0RG9jdW1lbnRzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRbXSBnZXREb2N1bWVudHMoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKERvY3VtZW50W10pIGRvY3VtZW50cygpLnRvQXJyYXkobmV3IERvY3VtZW50W2RvY3VtZW50cygpLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmNvbGxlY3Rpb24uQ29sbGVjdGlvbiNhZGQob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBkb2N1bWVudHMoKS5hZGQoZG9jdW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmNvbGxlY3Rpb24uQ29sbGVjdGlvbiNhZGQoaW50LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBwb3NpdGlvbiwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvY3VtZW50cygpLmFkZChwb3NpdGlvbiwgZG9jdW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmNvbGxlY3Rpb24uQ29sbGVjdGlvbiNyZW1vdmUob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWRvY3VtZW50cygpLmNvbnRhaW5zKGRvY3VtZW50KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RXhjZXB0aW9uKCJDb2xsZWN0aW9uIFsiICsgdGhpcyArICJdIGRvZXMgbm90IGNvbnRhaW4gZG9jdW1lbnQgWyIKLSAgICAgICAgICAgICAgICAgICAgKyBkb2N1bWVudCArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgZG9jdW1lbnRzKCkucmVtb3ZlKGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2FkZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBjb2xsZWN0aW9uIGZyb20gaXRzIFhNTCBzb3VyY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgbG9hZCgpIHsKLSAgICAgICAgaWYgKCF0aGlzLmlzTG9hZGVkKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiTG9hZGluZzogIik7Ci0gICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoZWxwZXIgPSBnZXROYW1lc3BhY2VIZWxwZXIoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2FkWG1sKGhlbHBlcik7Ci0gICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxvYWRYbWwoTmFtZXNwYWNlSGVscGVyIGhlbHBlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5kb2N1bWVudHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBFbGVtZW50IGNvbGxlY3Rpb25FbGVtZW50ID0gaGVscGVyLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBFbGVtZW50W10gZG9jdW1lbnRFbGVtZW50cyA9IGhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW4oY29sbGVjdGlvbkVsZW1lbnQsIEVMRU1FTlRfRE9DVU1FTlQpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3VtZW50RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50RWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBsb2FkRG9jdW1lbnQoZG9jdW1lbnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50c0xpc3QuYWRkKGRvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25FbGVtZW50Lmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBjb2xsZWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY29sbGVjdGlvbkVsZW1lbnQuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9IUkVGKSkgewotICAgICAgICAgICAgICAgIHRoaXMuaHJlZiA9IGNvbGxlY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSFJFRik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYSBkb2N1bWVudCBmcm9tIGFuIFhNTCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBkb2N1bWVudEVsZW1lbnQgVGhlIFhNTCBlbGVtZW50LgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgbG9hZERvY3VtZW50KEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50KSB0aHJvd3MgRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBkb2N1bWVudElkID0gZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVVJRCk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0RGVsZWdhdGUoKS5nZXRGYWN0b3J5KCkuZ2V0KGdldERlbGVnYXRlKCkuZ2V0UHVibGljYXRpb24oKSwKLSAgICAgICAgICAgICAgICBnZXREZWxlZ2F0ZSgpLmdldEFyZWEoKSwgZG9jdW1lbnRJZCwgZ2V0RGVsZWdhdGUoKS5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBjb2xsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNhdmUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gZ2V0TmFtZXNwYWNlSGVscGVyKCk7Ci0gICAgICAgICAgICBzYXZlWG1sKGhlbHBlcik7Ci0gICAgICAgICAgICBEb2N1bWVudEhlbHBlci53cml0ZURvY3VtZW50KGhlbHBlci5nZXREb2N1bWVudCgpLCBnZXREZWxlZ2F0ZSgpLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGhlbHBlciBTYXZlIHRoZSBYTUwgdG8gdGhlIHByb3ZpZGVkIG5hbWVzcGFjZSBoZWxwZXIuCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2F2ZVhtbChOYW1lc3BhY2VIZWxwZXIgaGVscGVyKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgRWxlbWVudCBjb2xsZWN0aW9uRWxlbWVudCA9IGhlbHBlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBpZiAoY29sbGVjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlTlMobnVsbCwgQVRUUklCVVRFX1VVSUQpLmVxdWFscygiIikKLSAgICAgICAgICAgICAgICB8fCBjb2xsZWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VVSUQpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25FbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIEFUVFJJQlVURV9VVUlELCBnZXREZWxlZ2F0ZSgpLmdldFVVSUQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRWxlbWVudFtdIGV4aXN0aW5nRG9jdW1lbnRFbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbihjb2xsZWN0aW9uRWxlbWVudCwKLSAgICAgICAgICAgICAgICBFTEVNRU5UX0RPQ1VNRU5UKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ0RvY3VtZW50RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25FbGVtZW50LnJlbW92ZUNoaWxkKGV4aXN0aW5nRG9jdW1lbnRFbGVtZW50c1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb2xsZWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1RZUEUsIGdldFR5cGUoKSk7Ci0gICAgICAgIAotICAgICAgICBjb2xsZWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0hSRUYsIGdldEhyZWYoKSk7Ci0KLSAgICAgICAgY29sbGVjdGlvbkVsZW1lbnQubm9ybWFsaXplKCk7Ci0KLSAgICAgICAgTm9kZUxpc3QgZW1wdHlUZXh0Tm9kZXMgPSBYUGF0aEFQSS5zZWxlY3ROb2RlTGlzdChjb2xsZWN0aW9uRWxlbWVudCwgInRleHQoKSIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVtcHR5VGV4dE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGVtcHR5VGV4dE5vZGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICBub2RlID0gY29sbGVjdGlvbkVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudFtdIGRvY3VtZW50cyA9IGdldERvY3VtZW50cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBjcmVhdGVEb2N1bWVudEVsZW1lbnQoZG9jdW1lbnRzW2ldLCBoZWxwZXIpOwotICAgICAgICAgICAgY29sbGVjdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnRFbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgbG9hZCgpOwotICAgICAgICByZXR1cm4gdGhpcy50eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZWxlbWVudCB0byBzdG9yZSBhIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBoZWxwZXIgVGhlIG5hbWVzcGFjZSBoZWxwZXIgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgZG9jdW1lbnQuCi0gICAgICogQHJldHVybiBBbiBYTUwgZWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRG9jdW1lbnRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBOYW1lc3BhY2VIZWxwZXIgaGVscGVyKQotICAgICAgICAgICAgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoRUxFTUVOVF9ET0NVTUVOVCk7Ci0gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgQVRUUklCVVRFX1VVSUQsIGRvY3VtZW50LmdldFVVSUQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnRFbGVtZW50OwotICAgICAgICB9IGNhdGNoIChmaW5hbCBET01FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERvY3VtZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIGhlbHBlciBmb3IgdGhlIFhNTCBzb3VyY2UuCi0gICAgICogQHJldHVybiBBIG5hbWVzcGFjZSBoZWxwZXIuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VIZWxwZXIgZ2V0TmFtZXNwYWNlSGVscGVyKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uLAotICAgICAgICAgICAgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTmFtZXNwYWNlSGVscGVyIGhlbHBlcjsKLQotICAgICAgICBpZiAoZ2V0RGVsZWdhdGUoKS5leGlzdHMoKSkgewotICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jdW1lbnQgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoZ2V0RGVsZWdhdGUoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKENvbGxlY3Rpb24uTkFNRVNQQUNFLCBDb2xsZWN0aW9uLkRFRkFVTFRfUFJFRklYLCBkb2N1bWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoZWxwZXIgPSBpbml0aWFsaXplTmFtZXNwYWNlSGVscGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgbmV3LCBlbXB0eSBuYW1lc3BhY2UgaGVscGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VIZWxwZXIgaW5pdGlhbGl6ZU5hbWVzcGFjZUhlbHBlcigpIHsKLSAgICAgICAgTmFtZXNwYWNlSGVscGVyIGhlbHBlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoQ29sbGVjdGlvbi5OQU1FU1BBQ0UsIENvbGxlY3Rpb24uREVGQVVMVF9QUkVGSVgsCi0gICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQ09MTEVDVElPTik7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uLkNvbGxlY3Rpb24jY29udGFpbnMob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudHMoKS5jb250YWlucyhkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuY29sbGVjdGlvbi5Db2xsZWN0aW9uI2NsZWFyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvY3VtZW50cygpLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuY29sbGVjdGlvbi5Db2xsZWN0aW9uI2dldEZpcnN0UG9zaXRpb24ob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRGaXJzdFBvc2l0aW9uKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBsb2FkKCk7Ci0gICAgICAgIGlmICghY29udGFpbnMoZG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oIlRoZSBjb2xsZWN0aW9uIFsiICsgdGhpcwotICAgICAgICAgICAgICAgICAgICArICJdIGRvZXMgbm90IGNvbnRhaW4gdGhlIGRvY3VtZW50IFsiICsgZG9jdW1lbnQgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb2N1bWVudHMoKS5pbmRleE9mKGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uLkNvbGxlY3Rpb24jc2l6ZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50cygpLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gVFlQRV9NQU5VQUw7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGxvYWQoKTsKLSAgICAgICAgaWYgKCFBcnJheXMuYXNMaXN0KFRZUEVTKS5jb250YWlucyh0eXBlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHR5cGUgWyIgKyB0eXBlICsgIl0gaXMgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBocmVmID0gIiI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0gICAgICAgIGxvYWQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaHJlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB7Ci0gICAgICAgIGxvYWQoKTsKLSAgICAgICAgdGhpcy5ocmVmID0gaHJlZjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvbW9kdWxlcy9jb2xsZWN0aW9uL0NvbGxlY3Rpb25XcmFwcGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL2NvbGxlY3Rpb24vQ29sbGVjdGlvbldyYXBwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzBjM2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL2NvbGxlY3Rpb24vQ29sbGVjdGlvbldyYXBwZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIENvbGxlY3Rpb24gd3JhcHBlciB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbldyYXBwZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RYTGlua0NvbGxlY3Rpb24oKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24sIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24sCi0gICAgICAgICAgICBUcmFuc2FjdGlvbkV4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbG9naW4oImxlbnlhIik7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBtYXAgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KGdldE1hbmFnZXIoKSwgc2Vzc2lvbik7Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZ2V0UHVibGljYXRpb24oInRlc3QiKTsKLQotICAgICAgICBEb2N1bWVudCBjb2xsZWN0aW9uRG9jID0gY3JlYXRlQ29sbGVjdGlvbkRvY3VtZW50KHB1Yik7Ci0KLSAgICAgICAgQ29sbGVjdGlvbldyYXBwZXIgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uV3JhcHBlcihjb2xsZWN0aW9uRG9jLCBnZXRMb2dnZXIoKSk7Ci0KLSAgICAgICAgU2l0ZVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSBwdWIuZ2V0QXJlYSgiYXV0aG9yaW5nIikuZ2V0U2l0ZSgpOwotICAgICAgICBzdHJ1Y3R1cmUuZ2V0UmVwb3NpdG9yeU5vZGUoKS5sb2NrKCk7Ci0KLSAgICAgICAgU2l0ZU1hbmFnZXIgc2l0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSBnZXRNYW5hZ2VyKCkubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3QocHViLmdldFNpdGVNYW5hZ2VySGludCgpKTsKLQotICAgICAgICAgICAgc2l0ZU1hbmFnZXIuYWRkKCIvY29sbGVjdGlvbiIsIGNvbGxlY3Rpb24uZ2V0RGVsZWdhdGUoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHNpdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50IGRvYyA9IG1hcC5nZXQocHViLCBQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSwgIi9pbmRleCIsICJlbiIpOwotICAgICAgICBjb2xsZWN0aW9uLmFkZChkb2MpOwotICAgICAgICBjb2xsZWN0aW9uLnNhdmUoKTsKLQotICAgICAgICBjb2xsZWN0aW9uLmdldERlbGVnYXRlKCkuZ2V0UmVwb3NpdG9yeU5vZGUoKS51bmxvY2soKTsKLSAgICAgICAgc3RydWN0dXJlLmdldFJlcG9zaXRvcnlOb2RlKCkudW5sb2NrKCk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbldyYXBwZXIgY29sbDIgPSBuZXcgQ29sbGVjdGlvbldyYXBwZXIoY29sbGVjdGlvbkRvYywgZ2V0TG9nZ2VyKCkpOwotCi0gICAgICAgIGFzc2VydFNhbWUoY29sbGVjdGlvbi5nZXREZWxlZ2F0ZSgpLmdldFJlcG9zaXRvcnlOb2RlKCksIGNvbGwyLmdldERlbGVnYXRlKCkKLSAgICAgICAgICAgICAgICAuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbGwyLnNpemUoKSwgMSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29sbDIuY29udGFpbnMoZG9jKSk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlQ29sbGVjdGlvbkRvY3VtZW50KFB1YmxpY2F0aW9uIHB1YikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24sCi0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkRXhjZXB0aW9uLCBQdWJsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlcnZpY2VTZWxlY3RvciB0eXBlU2VsZWN0b3IgPSBudWxsOwotICAgICAgICBSZXNvdXJjZVR5cGUgdHlwZSA9IG51bGw7Ci0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2NNZ3IgPSBudWxsOwotICAgICAgICBEb2N1bWVudCBkb2M7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0eXBlU2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSBnZXRNYW5hZ2VyKCkubG9va3VwKFJlc291cmNlVHlwZS5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICB0eXBlID0gKFJlc291cmNlVHlwZSkgdHlwZVNlbGVjdG9yLnNlbGVjdCgiY29sbGVjdGlvbiIpOwotICAgICAgICAgICAgZG9jTWdyID0gKERvY3VtZW50TWFuYWdlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBSZXNvdXJjZVR5cGUuU2FtcGxlIHNhbXBsZSA9IHR5cGUuZ2V0U2FtcGxlKHR5cGUuZ2V0U2FtcGxlTmFtZXMoKVswXSk7Ci0gICAgICAgICAgICBkb2MgPSBkb2NNZ3IuYWRkKGdldEZhY3RvcnkoKSwgdHlwZSwgc2FtcGxlLmdldFVyaSgpLCBwdWIsICJhdXRob3JpbmciLCAiZW4iLCAieG1sIik7Ci0gICAgICAgICAgICBkb2Muc2V0TWltZVR5cGUoc2FtcGxlLmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZG9jTWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShkb2NNZ3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGVTZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UodHlwZVNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkNmQxMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aS54bWwgNDQ2NTQyIDIwMDYtMDktMTUgMDg6MTQ6MzlaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJlbiIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUtY29sbGVjdGlvbiI+Q29sbGVjdGlvbjwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MGYwZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aV9kZS54bWwgNDQ2NTQyIDIwMDYtMDktMTUgMDg6MTQ6MzlaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJkZSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUtY29sbGVjdGlvbiI+U2FtbWx1bmc8L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KLQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vc2FtcGxlcy9jaGlsZHJlbi54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3NhbXBsZXMvY2hpbGRyZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTRkMGZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vc2FtcGxlcy9jaGlsZHJlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29sbGVjdGlvbiB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2NvbGxlY3Rpb24vMS4wIiB0eXBlPSJjaGlsZHJlbiIvPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9zYW1wbGVzL2NvbGxlY3Rpb24ueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9zYW1wbGVzL2NvbGxlY3Rpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmE1Y2JmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vc2FtcGxlcy9jb2xsZWN0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb2xsZWN0aW9uIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY29sbGVjdGlvbi8xLjAiLz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24vc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZDkxOTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi9zaXRlbWFwLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueG1hcCAxNzk0ODggMjAwNS0wNi0wMiAwMjoyOTozOVogZ3JlZ29yICQgLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8IS0tIGNvbGxlY3Rpb25XaXRoQ2hpbGRyZW4ve3V1aWR9L3tsYW5ndWFnZX0ueG1sIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJjb2xsZWN0aW9uV2l0aENoaWxkcmVuLyovKi54bWwiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNpdGV0cmVlLWZyYWdtZW50Ij4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhcmVhcyIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmFyZWF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmFyZWF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdmFsdWU9Intkb2MtaW5mbzp7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH06e3BhZ2UtZW52ZWxvcGU6YXJlYX06ezF9OnsyfTpwYXRofSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImluaXRpYWwiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Im1pbWV0eXBlIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvbWFwOmdlbmVyYXRlPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9jb2xsZWN0aW9uL3hzbHQvc2l0ZXRyZWUyY2hpbGRyZW4ueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9InsyfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0gbWV0YWRhdGEve3V1aWR9L3tsYW5ndWFnZX0ueG1sIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJtZXRhZGF0YS8qLyoueG1sIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJsZW55YU1ldGFEYXRhIiBzcmM9ImxlbnlhLWRvY3VtZW50OnsxfSxsYW5nPXsyfSIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIGNvbGxlY3Rpb24gZm9ybWF0IC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJjb2xsZWN0aW9uLnhtbC8qLyovKi8qIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImxlbnlhLWRvY3VtZW50OnszfSxwdWI9ezF9LGFyZWE9ezJ9LGxhbmc9ezR9e2xpbms6cmV2fSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9jb2xsZWN0aW9uL3hzbHQvcHJlcGFyZUNpbmNsdWRlLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXVpZCIgdmFsdWU9InszfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0iezR9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iY2luY2x1ZGUiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4gICAgICAgIAotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3hzbHQvY29sbGVjdGlvbjJjaW5jbHVkZS54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3hzbHQvY29sbGVjdGlvbjJjaW5jbHVkZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZGUxMzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29sbGVjdGlvbi94c2x0L2NvbGxlY3Rpb24yY2luY2x1ZGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICB4bWxuczpjb2w9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jb2xsZWN0aW9uLzEuMCIKLSAgeG1sbnM6Y2k9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCI+Ci0gIAotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJ1dWlkIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibGFuZ3VhZ2UiLz4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb2w6Y29sbGVjdGlvbiI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCoiLz4KLSAgICAgIDxjaTppbmNsdWRlIHNyYz0iY29jb29uOi8vbW9kdWxlcy9jb2xsZWN0aW9uL21ldGFkYXRhL3skdXVpZH0veyRsYW5ndWFnZX0ueG1sIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbDpkb2N1bWVudCIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbDpkb2N1bWVudCI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCoiLz4KLSAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCopIj4KLSAgICAgICAgPGNpOmluY2x1ZGUgc3JjPSJjb2Nvb246Ly9tb2R1bGVzL2NvbGxlY3Rpb24vbWV0YWRhdGEve0B1dWlkfS97JGxhbmd1YWdlfS54bWwiLz4KLSAgICAgICAgPGNpOmluY2x1ZGUgc3JjPSJsZW55YS1kb2N1bWVudDp7QHV1aWR9LGxhbmc9eyRsYW5ndWFnZX0/Zm9ybWF0PXhodG1sIi8+Ci0gICAgICA8L3hzbDppZj4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IioiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3hzbHQvcHJlcGFyZUNpbmNsdWRlLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24veHNsdC9wcmVwYXJlQ2luY2x1ZGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NThmNmQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24veHNsdC9wcmVwYXJlQ2luY2x1ZGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICB4bWxuczpjb2w9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jb2xsZWN0aW9uLzEuMCIKLSAgeG1sbnM6Y2k9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCI+Ci0gIAotICA8eHNsOnBhcmFtIG5hbWU9InV1aWQiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJsYW5ndWFnZSIvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29sOmNvbGxlY3Rpb24iPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IkAqIi8+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlID0gJ2NoaWxkcmVuJyI+Ci0gICAgICAgICAgPGNpOmluY2x1ZGUgc3JjPSJjb2Nvb246Ly9tb2R1bGVzL2NvbGxlY3Rpb24vY29sbGVjdGlvbldpdGhDaGlsZHJlbi97JHV1aWR9L3skbGFuZ3VhZ2V9LnhtbCIKLSAgICAgICAgICAgIHNlbGVjdD0iKi8qIi8+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZSA9ICdsaW5rJyI+Ci0gICAgICAgICAgPGNpOmluY2x1ZGUgc3JjPSJ7QGhyZWZ9IiBzZWxlY3Q9IiovKiIvPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJjb2w6ZG9jdW1lbnQiLz4KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24veHNsdC9zaXRldHJlZTJjaGlsZHJlbi54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9jb2xsZWN0aW9uL3hzbHQvc2l0ZXRyZWUyY2hpbGRyZW4ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmY3N2UxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbGxlY3Rpb24veHNsdC9zaXRldHJlZTJjaGlsZHJlbi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnNpdGU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9zaXRldHJlZS8xLjAiCi0gIHhtbG5zOmNvbD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2NvbGxlY3Rpb24vMS4wIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ic2l0ZSI+Ci0gIAotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJsYW5ndWFnZSIvPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNpdGU6ZnJhZ21lbnQiPgotICAgIDxjb2w6Y29sbGVjdGlvbj4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ic2l0ZTpub2RlIi8+Ci0gICAgPC9jb2w6Y29sbGVjdGlvbj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2l0ZTpub2RlIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InNpdGU6bGFiZWxbbGFuZygkbGFuZ3VhZ2UpXSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzaXRlOmxhYmVsIj4KLSAgICA8Y29sOmRvY3VtZW50IHV1aWQ9InsuLi9AdXVpZH0iLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWNvbnRhY3RGb3JtLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWNvbnRhY3RGb3JtLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGFjZGU0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbnRhY3Rmb3JtL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jb250YWN0Rm9ybS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdjb250YWN0Zm9ybS5zZW5kTWVzc2FnZSddIj4NCi0NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJjb250YWN0Zm9ybS5zZW5kTWVzc2FnZSIgbG9nZ2VyPSJsZW55YS51c2VjYXNlIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb250YWN0Zm9ybS5Db250YWN0Rm9ybSI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2NvbnRhY3Rmb3JtL3VzZWNhc2VzL2NvbnRhY3RGb3JtLmp4Ii8+DQotICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kZXIiIHZhbHVlPSJsZW55YSIvPg0KLSAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icmVjaXBpZW50IiB2YWx1ZT0iYWxpY2UiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICAgIA0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9jb25maWcvbWVudS54c3AgYi90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9jb25maWcvbWVudS54c3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OWQ1ZTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vY29uZmlnL21lbnUueHNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBnZW5lcmljLnhzcCAxNTU4MDYgMjAwNS0wMy0wMSAxNzo1NTo0MlogYW5kcmVhcyAkIC0tPgotCi08eHNwOnBhZ2UgCi0gICAgbGFuZ3VhZ2U9ImphdmEiIAotICAgIHhtbG5zOnhzcD0iaHR0cDovL2FwYWNoZS5vcmcveHNwIgotICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gICAgeG1sbnM6dWM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91c2VjYXNlLzEuMCIKLSAgICB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21lbnViYXIvMS4wIgotPgotCi0gIDxtZW51PgotICAgIDxtZW51cz4KLSAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iRmlsZSI+Ci0gICAgICAgIDxibG9jayBhZG1pbj0iZmFsc2UiPgotICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9InVzZWNhc2Vkb2N1bWVudC5jcmVhdGUiIGhyZWY9Ij91c2VjYXNlPWNvbnRhY3Rmb3JtLnNlbmRNZXNzYWdlIj48aTE4bjp0ZXh0Pk5ldyBDb250YWN0IEZvcm08L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgIDwvYmxvY2s+Ci0gICAgICA8L21lbnU+Ci0gICAgPC9tZW51cz4KLSAgPC9tZW51PgotICAKLTwveHNwOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2NvbnRhY3Rmb3JtL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzYxNmUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbnRhY3Rmb3JtL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuY29udGFjdGZvcm08L2lkPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy51c2VjYXNlIi8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLm5vdGlmaWNhdGlvbiIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPkNvbnRhY3QgRm9ybTwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+Q29udGFjdCBGb3JtPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29udGFjdGZvcm0vQ29udGFjdEZvcm0uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2NvbnRhY3Rmb3JtL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvbnRhY3Rmb3JtL0NvbnRhY3RGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MjQ5NjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29udGFjdGZvcm0vQ29udGFjdEZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29udGFjdGZvcm07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbGxlclJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uVXRpbDsKLQotLyoqCi0gKiBDb250YWN0IGZvcm0uIFRoZSByZWNpcGllbnQgdXNlciBJRCBpcyBzZXQgdXNpbmcgdGhlICJyZWNpcGllbnQiIHBhcmFtZXRlci4gVGhlIHNlbmRlciB1c2VyIElEIGlzCi0gKiBzZXQgdXNpbmcgdGhlICJzZW5kZXIiIHBhcmFtZXRlcjsKLSAqLwotcHVibGljIGNsYXNzIENvbnRhY3RGb3JtIGV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0lQSUVOVCA9ICJyZWNpcGllbnQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRFUiA9ICJzZW5kZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAibWVzc2FnZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGUk9NID0gImVtYWlsIjsKLQotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIGlmIChnZXRQYXJhbWV0ZXJBc1N0cmluZyhTRU5ERVIpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIHNlbmRlciBpcyBub3QgY29uZmlndXJlZCEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCk7Ci0KLSAgICAgICAgaWYgKGdldFBhcmFtZXRlckFzU3RyaW5nKE5BTUUpLnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlBsZWFzZSBlbnRlciB5b3VyIG5hbWUhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldFBhcmFtZXRlckFzU3RyaW5nKEZST00pLnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlBsZWFzZSBlbnRlciB5b3VyIGUtbWFpbCBhZGRyZXNzISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRQYXJhbWV0ZXJBc1N0cmluZyhNRVNTQUdFKS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJQbGVhc2UgZW50ZXIgYSBtZXNzYWdlISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRQYXJhbWV0ZXJBc1N0cmluZyhSRUNJUElFTlQpLnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlBsZWFzZSBjaG9vc2UgYSByZWNpcGllbnQhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlbmRlclVzZXJJZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFNFTkRFUik7Ci0gICAgICAgIFN0cmluZyByZWNpcGllbnRVc2VySWQgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhSRUNJUElFTlQpOwotCi0gICAgICAgIFVzZXIgc2VuZGVyID0gZ2V0VXNlcihzZW5kZXJVc2VySWQpOwotICAgICAgICBVc2VyIHJlY2lwaWVudCA9IGdldFVzZXIocmVjaXBpZW50VXNlcklkKTsKLSAgICAgICAgVXNlcltdIHJlY2lwaWVudHMgPSB7IHJlY2lwaWVudCB9OwotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoTkFNRSk7Ci0gICAgICAgIFN0cmluZyBib2R5ID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoTUVTU0FHRSk7Ci0gICAgICAgIFN0cmluZyBmcm9tID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoRlJPTSk7Ci0KLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoIkNvbnRhY3QgZm9ybSBzdWJtaXR0ZWQgYnkgIiArIG5hbWUgKyAiICgiICsgZnJvbSArICIpIiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdLAotICAgICAgICAgICAgICAgIGJvZHksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSwKLSAgICAgICAgICAgICAgICBzZW5kZXIsCi0gICAgICAgICAgICAgICAgcmVjaXBpZW50cyk7Ci0gICAgICAgIAotICAgICAgICBOb3RpZmljYXRpb25VdGlsLm5vdGlmeSh0aGlzLm1hbmFnZXIsIG1lc3NhZ2UpOwotCi0gICAgICAgIHNldERlZmF1bHRUYXJnZXRVUkwoZ2V0U291cmNlVVJMKCkgKyAiP3NlbnQ9dHJ1ZSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBVc2VyIGdldFVzZXIoU3RyaW5nIHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVzZXIgdXNlcjsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlclJlc29sdmVyIGFjUmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBBY2Nlc3NDb250cm9sbGVyIGFjY2Vzc0NvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5ST0xFCi0gICAgICAgICAgICAgICAgICAgICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICBhY1Jlc29sdmVyID0gKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcikgc2VsZWN0b3Iuc2VsZWN0KEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5ERUZBVUxUX1JFU09MVkVSKTsKLSAgICAgICAgICAgIGFjY2Vzc0NvbnRyb2xsZXIgPSBhY1Jlc29sdmVyLnJlc29sdmVBY2Nlc3NDb250cm9sbGVyKGdldFNvdXJjZVVSTCgpKTsKLQotICAgICAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSBhY2Nlc3NDb250cm9sbGVyLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpOwotICAgICAgICAgICAgdXNlciA9IHVzZXJNYW5hZ2VyLmdldFVzZXIodXNlcklkKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWNSZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjUmVzb2x2ZXIucmVsZWFzZShhY2Nlc3NDb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKGFjUmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVzZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9tZW51cy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vbWVudXMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlOGFlMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9tZW51cy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBtZW51cy54bWFwIDE3ODczOCAyMDA1LTA1LTI3IDAzOjQyOjA5WiBncmVnb3IgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgCQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2VydmVycGFnZXMiIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2NvbnRhY3Rmb3JtL2NvbmZpZy9tZW51LnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMDk3N2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDczOTUgMjAwNi0wOS0xOCAxMzowMTozM1ogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotICANCi0gIDxtZXNzYWdlIGtleT0iTmV3IENvbnRhY3QgRm9ybSI+TmV3IENvbnRhY3QgRm9ybTwvbWVzc2FnZT4KLSAgCi08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9jb250YWN0Zm9ybS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2ZhOTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDczOTUgMjAwNi0wOS0xOCAxMzowMTozM1ogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImRlIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotICANCi0gIDxtZXNzYWdlIGtleT0iTmV3IENvbnRhY3QgRm9ybSI+TmV1ZXMgS29udGFrdGZvcm11bGFyPC9tZXNzYWdlPgotICAKLSAgPG1lc3NhZ2Uga2V5PSJDb250YWN0Ij5Lb250YWt0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IllvdXIgTmFtZSI+SWhyIE5hbWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iWW91ciBFLU1haWwgQWRkcmVzcyI+SWhyZSBFLU1haWwtQWRyZXNzZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJZb3VyIE1lc3NhZ2UiPklocmUgTmFjaHJpY2h0PC9tZXNzYWdlPgotICAKLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2NvbnRhY3Rmb3JtL3VzZWNhc2VzL2NvbnRhY3RGb3JtLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vdXNlY2FzZXMvY29udGFjdEZvcm0uangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTEzODguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvY29udGFjdGZvcm0vdXNlY2FzZXMvY29udGFjdEZvcm0uangKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogY2hhbmdlUGFzc3dvcmQuanggNDEyOTg3IDIwMDYtMDYtMDkgMDk6MDE6NThaIGFuZHJlYXMgJCAtLT4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIj4KLSAgCi0gIDxib2R5PgotICAgIAotICAgIDxoMj48aTE4bjp0ZXh0PkNvbnRhY3Q8L2kxOG46dGV4dD48L2gyPgotICAgIAotICAgIDxqeDpjaG9vc2U+Ci0gICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzZW50JykuZXF1YWxzKCd0cnVlJyl9Ij4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgWW91ciBtZXNzYWdlIHdhcyBzZW50Ljxici8+Ci0gICAgICAgICAgVGhhbmtzIGEgbG90IQotICAgICAgICA8L3A+Ci0gICAgICA8L2p4OndoZW4+Ci0gICAgICA8ang6b3RoZXJ3aXNlPgotCi0gICAgICAgIDxmb3JtIGlkPSJmb3JtLWNvbnRhY3QiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIAotICAgICAgICAgIDx0YWJsZSBzdHlsZT0iZm9udC1zaXplOiBzbWFsbCI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD48bGFiZWwgZm9yPSJuYW1lIj48aTE4bjp0ZXh0PllvdXIgTmFtZTwvaTE4bjp0ZXh0PiAqPC9sYWJlbD48L3RkPgotICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCduYW1lJyl9Ii8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD48bGFiZWwgZm9yPSJlbWFpbCI+PGkxOG46dGV4dD5Zb3VyIEUtTWFpbCBBZGRyZXNzPC9pMThuOnRleHQ+ICo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZW1haWwiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdlbWFpbCcpfSIvPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+PGxhYmVsIGZvcj0ibWVzc2FnZSI+PGkxOG46dGV4dD5Zb3VyIE1lc3NhZ2U8L2kxOG46dGV4dD4gKjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPjx0ZXh0YXJlYSBuYW1lPSJtZXNzYWdlIj48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdtZXNzYWdlJyl9Ii8+PC90ZXh0YXJlYT48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZm9ybT4KLSAgICAgICAgCi0gICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICA8L2p4OmNob29zZT4KLSAgICAKLSAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L2NvbmZpZy9tZW51LnhzcCBiL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L2NvbmZpZy9tZW51LnhzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwMDA5Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9jb25maWcvbWVudS54c3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGdlbmVyaWMueHNwIDE1NTgwNiAyMDA1LTAzLTAxIDE3OjU1OjQyWiBhbmRyZWFzICQgLS0+Ci0KLTx4c3A6cGFnZSAKLSAgICBsYW5ndWFnZT0iamF2YSIgCi0gICAgeG1sbnM6eHNwPSJodHRwOi8vYXBhY2hlLm9yZy94c3AiCi0gICAgeG1sbnM6eHNwLXJlcXVlc3Q9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcC9yZXF1ZXN0LzIuMCIKLSAgICB4bWxuczppbnB1dD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3hzcC9pbnB1dC8xLjAiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgICB4bWxuczp3Zj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3dvcmtmbG93LzEuMCIKLSAgICB4bWxuczp1Yz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3VzZWNhc2UvMS4wIgotICAgIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiCi0+Ci0KLSAgPG1lbnU+Ci0gIAotICAgIDx4c3A6bG9naWM+Ci0gICAgICBTdHJpbmcgYmFzZVVybCA9IChTdHJpbmcpIDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icmVxdWVzdCIgbmFtZT0iY29udGV4dFBhdGgiLz47Ci0gICAgPC94c3A6bG9naWM+Ci0KLSAgICA8bWVudXM+Ci0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkRldmVsb3BtZW50Ij4KLSAgICAgICAgPGJsb2NrIGFyZWFzPSJzaXRlIGF1dGhvcmluZyI+Ci0gICAgICAgICAgPGl0ZW0gaHJlZj0iP2xlbnlhLm1vZHVsZT1kZXZlbG9wbWVudCZhbXA7bGVueWEuYWN0aW9uPXNob3dMb2ciPgotICAgICAgICAgICAgPHhzcDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzcDpleHByPmJhc2VVcmw8L3hzcDpleHByPi9tb2R1bGVzL2RldmVsb3BtZW50L2xvZzRqLmxvZzwveHNwOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxpMThuOnRleHQ+U2hvdyBMb2c8L2kxOG46dGV4dD4KLSAgICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDwvYmxvY2s+Ci0gICAgICA8L21lbnU+Ci0gICAgICAKLSAgICA8L21lbnVzPgotICAgIAotICA8L21lbnU+Ci08L3hzcDpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjMmUyYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmRldmVsb3BtZW50PC9pZD4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5EZXZlbG9wbWVudCB0b29sczwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+RGV2ZWxvcG1lbnQgdG9vbHM8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9jb25maWcvc2l0ZW1hcC90cmFuc2Zvcm1lcnMueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVycy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWEwYjdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVycy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx4bWFwIHhwYXRoPSIvc2l0ZW1hcC9jb21wb25lbnRzL3RyYW5zZm9ybWVycyIgDQotICB1bmxlc3M9Ii9zaXRlbWFwL2NvbXBvbmVudHMvdHJhbnNmb3JtZXJzL3RyYW5zZm9ybWVyW0BuYW1lID0gJ3RlZSddIg0KLSAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPg0KLSAgPG1hcDp0cmFuc2Zvcm1lciBuYW1lPSJ0ZWUiIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24udHJhbnNmb3JtYXRpb24uVGVlVHJhbnNmb3JtZXIiLz4KLTwveG1hcD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9tZW51cy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvbWVudXMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlODQxZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9tZW51cy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBtZW51cy54bWFwIDE3ODczOCAyMDA1LTA1LTI3IDAzOjQyOjA5WiBncmVnb3IgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgCQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2VydmVycGFnZXMiIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2RldmVsb3BtZW50L2NvbmZpZy9tZW51LnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NmQyNTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDY1NjQgMjAwNi0wOS0xNSAxMDoxMzoxNlogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotDQotICA8bWVzc2FnZSBrZXk9IlNob3cgTG9nIj5TaG93IExvZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZXZlbG9wbWVudCI+RGV2ZWxvcG1lbnQ8L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3MzZiMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWlfZGUueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0iU2hvdyBMb2ciPkxvZ2ZpbGUgYW56ZWlnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGV2ZWxvcG1lbnQiPkVudHdpY2tsdW5nPC9tZXNzYWdlPgotICANCi08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9zaXRlbWFwLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOTllNDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhtYXAgMTc5NDg4IDIwMDUtMDYtMDIgMDI6Mjk6MzlaIGdyZWdvciAkIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICAKLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ibG9nNGoubG9nIj4KLSAgICAgICAgPG1hcDpyZWFkIG1pbWUtdHlwZT0idGV4dC9wbGFpbiIgc3JjPSJjb250ZXh0Oi8vV0VCLUlORi9sb2dzL2xvZzRqLmxvZyIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2Nhbm9vL2RvY29uZmlnLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vZG9jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg2ZThiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vZG9jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08Y29uZmlnIGhvc3Q9IiR7d2VidGVzdC5jb25maWcuaG9zdH0iCi0gICAgICAgIHBvcnQ9IiR7d2VidGVzdC5jb25maWcucG9ydH0iCi0gICAgICAgIHByb3RvY29sPSJodHRwIgotICAgICAgICBiYXNlcGF0aD0iJHt3ZWJ0ZXN0LmNvbmZpZy5iYXNlcGF0aH0iPgotICA8aGVhZGVyIG5hbWU9IkFjY2VwdC1MYW5ndWFnZSIgdmFsdWU9ImVuIi8+Ci0gIDxvcHRpb24gbmFtZT0iSmF2YVNjcmlwdEVuYWJsZWQiIHZhbHVlPSJmYWxzZSIvPgotPC9jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby9sZW55YV93ZWJ0ZXN0LmR0ZCBiL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vbGVueWFfd2VidGVzdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZWZlMGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby9sZW55YV93ZWJ0ZXN0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IUVOVElUWSBkb0NvbmZpZyBTWVNURU0gImRvY29uZmlnLnhtbCI+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2Nhbm9vL21hY3Jvcy54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2Nhbm9vL21hY3Jvcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjlhNzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby9tYWNyb3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJsZW55YV93ZWJ0ZXN0X21hY3JvcyI+Ci0KLSAgPGltcG9ydCBmaWxlPSIke3dlYnRlc3QuaG9tZX0vbGliL3Rhc2tkZWYueG1sIi8+Ci0KLSAgPG1hY3JvZGVmIG5hbWU9ImRvTG9naW4iIGRlc2NyaXB0aW9uPSJwZXJmb3JtIGEgbG9naW4gdG8gTGVueWEiPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIGRlZmF1bHQ9ImluZGV4Lmh0bWwiLz4KLSAgICA8c2VxdWVudGlhbD4KLQotICAgICAgPCEtLSBsb2dpbiAtLT4KLSAgICAgIDxpbnZva2UgdXJsPSJAe3VybH0iLz4KLSAgICAgIDxpZlN0ZXAgZGVzY3JpcHRpb249ImxvZ2luIGlmIHdlIGFyZSBhc2tlZCBmb3IiPgotICAgICAgICA8Y29uZGl0aW9uPgotICAgICAgICAgIDx2ZXJpZnlUaXRsZSB0ZXh0PSJMb2dpbiB0byB0aGUgRGVmYXVsdCBQdWJsaWNhdGlvbiIgLz4KLSAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9InVzZXJuYW1lIiB2YWx1ZT0iQHt1c2VybmFtZX0iLz4KLSAgICAgICAgPHNldElucHV0RmllbGQgbmFtZT0icGFzc3dvcmQiIHZhbHVlPSJAe3Bhc3N3b3JkfSIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICA8L2lmU3RlcD4KLQotICAgICAgPCEtLSBpbXBvcnQgZXhhbXBsZSBjb250ZW50IC0tPgotICAgICAgPGlmU3RlcCBkZXNjcmlwdGlvbj0iaW1wb3J0IGV4YW1wbGUgY29udGVudCI+Ci0gICAgICAgIDxjb25kaXRpb24+Ci0gICAgICAgICAgPHZlcmlmeVRleHQgdGV4dD0iZXhwb3J0LmltcG9ydEV4YW1wbGVDb250ZW50IiAvPgotICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICAgICAgPHNlbGVjdEZvcm0gbmFtZT0iaW1wb3J0Ii8+Ci0gICAgICAgIDxjbGlja0J1dHRvbiBuYW1lPSJzdWJtaXQiLz4KLSAgICAgIDwvaWZTdGVwPgotCi0gICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJXZWxjb21lIi8+Ci0gICAgPC9zZXF1ZW50aWFsPgotICA8L21hY3JvZGVmPgotCi0gIDxtYWNyb2RlZiBuYW1lPSJkb0xvZ291dCIgZGVzY3JpcHRpb249ImxvZ291dCBmcm9tIExlbnlhIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9InVybCIgZGVmYXVsdD0iIi8+Ci0gICAgPHNlcXVlbnRpYWw+Ci0KLSAgICAgIDwhLS0gbG9nb3V0IC0tPgotICAgICAgPGludm9rZSB1cmw9IkB7dXJsfT9sZW55YS51c2VjYXNlPWFjLmxvZ291dCIvPgotICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotCi0gICAgPC9zZXF1ZW50aWFsPgotICA8L21hY3JvZGVmPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby90ZXN0LnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWM1MjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCFET0NUWVBFIHByb2plY3QgU1lTVEVNICIuLi8uLi8uLi8uLi9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vbGVueWFfd2VidGVzdC5kdGQiPgotCi08cHJvamVjdCBuYW1lPSJzdHJlc3N0ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIj4KLQotICA8aW1wb3J0IGZpbGU9Ii4uLy4uLy4uLy4uL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby9tYWNyb3MueG1sIi8+Ci0KLSAgPHRhcmdldCBuYW1lPSJtYWluIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ibnVtYmVyIiB2YWx1ZT0iMSIvPgotICAgIDx3ZWJ0ZXN0IG5hbWU9InN0cmVzc3Rlc3QiPgotICAgICAgJmRvQ29uZmlnOwotICAgICAgPHN0ZXBzPgotICAgICAgICA8ZG9Mb2dpbiB1c2VybmFtZT0ibGVueWEiIHBhc3N3b3JkPSJsZXZpIi8+Ci0KLSAgICAgICAgPCEtLSBjcmVhdGUgLS0+Ci0gICAgICAgIDxyZXBlYXQgY291bnQ9IiR7bnVtYmVyfSI+Ci0gICAgICAgICAgPGVjaG8+Q3JlYXRpbmcgZG9jdW1lbnQgI3tjb3VudH0gb2YgJHtudW1iZXJ9PC9lY2hvPgotICAgICAgICAgIDxpbnZva2UgdXJsPSJpbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9c2l0ZW1hbmFnZW1lbnQuY3JlYXRlJmFtcDtkb2N0eXBlPXhodG1sIi8+Ci0gICAgICAgICAgPHZlcmlmeUVsZW1lbnRUZXh0IHR5cGU9ImgxIiB0ZXh0PSJOZXcgeGh0bWwgRG9jdW1lbnQiLz4KLSAgICAgICAgICA8c2V0SW5wdXRGaWVsZCBuYW1lPSJub2RlTmFtZSIgdmFsdWU9InN0cmVzc3Rlc3Qje2NvdW50fSIvPgotICAgICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9ImR1YmxpbmNvcmUudGl0bGUiIHZhbHVlPSJTdHJlc3MgVGVzdCAje2NvdW50fSIvPgotICAgICAgICAgIDxzZXRTZWxlY3RGaWVsZCBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9ImVuIi8+Ci0gICAgICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotICAgICAgICAgIDx2ZXJpZnlUZXh0IHRleHQ9IldlbGNvbWUiLz4KLSAgICAgICAgPC9yZXBlYXQ+Ci0KLSAgICAgICAgPCEtLSBkZWxldGUgLS0+Ci0gICAgICAgIDxyZXBlYXQgY291bnQ9IiR7bnVtYmVyfSI+Ci0gICAgICAgICAgPGVjaG8+RGVsZXRpbmcgZG9jdW1lbnQgI3tjb3VudH0gb2YgJHtudW1iZXJ9PC9lY2hvPgotICAgICAgICAgIDxpbnZva2UgdXJsPSJpbmRleC9zdHJlc3N0ZXN0I3tjb3VudH0uaHRtbD9sZW55YS51c2VjYXNlPXNpdGVtYW5hZ2VtZW50LmRlbGV0ZSIvPgotICAgICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iRGVsZXRlIERvY3VtZW50Ii8+Ci0gICAgICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotICAgICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iT3ZlcnZpZXciLz4KLSAgICAgICAgPC9yZXBlYXQ+Ci0KLSAgICAgICAgPGRvTG9nb3V0Lz4KLSAgICAgIDwvc3RlcHM+Ci0gICAgPC93ZWJ0ZXN0PgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3Qvam1ldGVyL2xlbnlhLmNzdiBiL3RydW5rL3NyYy9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3Qvam1ldGVyL2xlbnlhLmNzdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YTlhZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2ptZXRlci9sZW55YS5jc3YKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWxlbnlhO2xldmkNCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2ptZXRlci9sZW55YUpNZXRlclRlc3Quam14IGIvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9qbWV0ZXIvbGVueWFKTWV0ZXJUZXN0LmpteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkMmFiNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2ptZXRlci9sZW55YUpNZXRlclRlc3Quam14CisrKyAvZGV2L251bGwKQEAgLTEsOTAzICswLDAgQEAKLTxqbWV0ZXJUZXN0UGxhbiB2ZXJzaW9uPSIxLjIiIHByb3BlcnRpZXM9IjEuOCI+Ci0gIDxoYXNoVHJlZT4KLSAgICA8VGVzdFBsYW4gZ3VpY2xhc3M9IlRlc3RQbGFuR3VpIiB0ZXN0Y2xhc3M9IlRlc3RQbGFuIiB0ZXN0bmFtZT0iQ01TIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJUZXN0UGxhbi51c2VyX2RlZmluZWRfdmFyaWFibGVzIiBlbGVtZW50VHlwZT0iQXJndW1lbnRzIiBndWljbGFzcz0iQXJndW1lbnRzUGFuZWwiIHRlc3RjbGFzcz0iQXJndW1lbnRzIiB0ZXN0bmFtZT0iQmVudXR6ZXIgZGVmaW5pZXJ0ZSBWYXJpYWJsZW4iIGVuYWJsZWQ9InRydWUiPgotICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iQXJndW1lbnRzLmFyZ3VtZW50cyI+Ci0gICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9InNlcnZlciIgZWxlbWVudFR5cGU9IkFyZ3VtZW50Ij4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPmxvY2FsaG9zdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnNlcnZlcjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJjb250ZW50IiBlbGVtZW50VHlwZT0iQXJndW1lbnQiPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+Jmx0O3AmZ3Q7IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBBZW5lYW4gZXUgbG9yZW0gZGljdHVtIHVybmEgY29tbW9kbyBjb25zZWN0ZXR1ZXIuIERvbmVjIGV1aXNtb2QuIFNlZCB0b3J0b3IgbWV0dXMsIHNvbGxpY2l0dWRpbiB2ZWwsIHVsdHJpY2llcyBhYywgdGluY2lkdW50IHN1c2NpcGl0LCBkb2xvci4gUXVpc3F1ZSBncmF2aWRhIGxlbyBhIG1hZ25hLiBQZWxsZW50ZXNxdWUgbG9ib3J0aXMgc2NlbGVyaXNxdWUgZXN0LiBEb25lYyB0dXJwaXMgb3JjaSwgZWxlaWZlbmQgZXUsIHRpbmNpZHVudCB1dCwgdGluY2lkdW50IGV0LCB0dXJwaXMuIFBlbGxlbnRlc3F1ZSBmZWxpcy4gRHVpcyBudWxsYSBtZXR1cywgYmxhbmRpdCBxdWlzLCBub251bW15IGEsIHRyaXN0aXF1ZSBlZ2V0LCBtaS4gUHJhZXNlbnQgdmVuZW5hdGlzIG5pc2wgZXQgcHVydXMgZmVybWVudHVtIGVsZWlmZW5kLiBWaXZhbXVzIGRvbG9yIG51bmMsIHBoYXJldHJhIHZpdGFlLCBjb252YWxsaXMgZXUsIHZlc3RpYnVsdW0gYXQsIHNhcGllbi4gU2VkIGVnZXQganVzdG8uIEludGVnZXIgaW50ZXJkdW0gY29udmFsbGlzIG5pYmguIFN1c3BlbmRpc3NlIHZpdGFlIG5lcXVlLiBTZWQgc2l0IGFtZXQgbnVsbGEgYXQgbGlndWxhIGRhcGlidXMgYmxhbmRpdC4gVmVzdGlidWx1bSB0cmlzdGlxdWUgdHVycGlzIHZpdGFlIG51bGxhLiBGdXNjZSBkdWkgbmVxdWUsIHBvc3VlcmUgaW4sIHByZXRpdW0gaWQsIHZlbmVuYXRpcyBlZ2V0LCBtYWduYS4gTnVuYyBxdWFtIHZlbGl0LCBhbGlxdWV0IG5lYywgc29kYWxlcyB1dCwgbWF0dGlzIGFjLCBpcHN1bS4gJmx0Oy9wJmd0OyAmbHQ7cCZndDsgTW9yYmkgc2l0IGFtZXQgbnVuYy4gQ3JhcyB1bGxhbWNvcnBlciBsZW8gdmVsIG9kaW8uIEN1cmFiaXR1ciB0aW5jaWR1bnQgZXN0IGluIGp1c3RvLiBVdCBjb21tb2RvLiBJbnRlZ2VyIGNvbmd1ZSB0ZWxsdXMgaWQgZGlhbS4gSW4gZWxlbWVudHVtIHBvcnRhIG1hZ25hLiBDcmFzIGluIGxpYmVybyBlZ2V0IGR1aSBncmF2aWRhIGxhY2luaWEuIE5hbSBldCBlcmF0LiBNYXVyaXMgb3JuYXJlLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdC4gSW4gaGFjIGhhYml0YXNzZSBwbGF0ZWEgZGljdHVtc3QuIFV0IGJpYmVuZHVtLiBNYWVjZW5hcyBxdWFtLiBOdWxsYW0gbm9uIGxpZ3VsYSBjb25zZXF1YXQgbWV0dXMgcmhvbmN1cyBtb2xsaXMuIE1vcmJpIGVnZXQgbGlndWxhIGFjIGlwc3VtIHRlbXBvciBhZGlwaXNjaW5nLiBGdXNjZSBpZCBsZWN0dXMuICZsdDsvcCZndDsgJmx0O3AmZ3Q7IERvbmVjIGluIGxpZ3VsYS4gTnVsbGEgZGlhbSBlbmltLCBjb21tb2RvIHNlZCwgYWxpcXVhbSB2ZW5lbmF0aXMsIHRpbmNpZHVudCB2aXRhZSwgbWFzc2EuIEN1cmFiaXR1ciB2dWxwdXRhdGUgdGVsbHVzIGEgYXVndWUuIFBlbGxlbnRlc3F1ZSB0cmlzdGlxdWUsIGxpZ3VsYSBpbiBtb2xsaXMgaWFjdWxpcywgc2VtIGVsaXQgZmVybWVudHVtIGRpYW0sIGV1IGRpZ25pc3NpbSBxdWFtIGVyb3MgdXQgb2Rpby4gVmVzdGlidWx1bSBzZW0gb3JjaSwgaWFjdWxpcyBhLCB2aXZlcnJhIGV0LCB0cmlzdGlxdWUgYXQsIHVybmEuIFF1aXNxdWUgZXQgZW5pbSBuZWMgbGFjdXMgbG9ib3J0aXMgaW1wZXJkaWV0LiBQaGFzZWxsdXMgcXVpcyBsZWN0dXMuIE1hdXJpcyBsb2JvcnRpcy4gVXQgY29tbW9kbyBncmF2aWRhIGxvcmVtLiBRdWlzcXVlIHBlbGxlbnRlc3F1ZS4gVmVzdGlidWx1bSBsYWNpbmlhLiBVdCBpbiBqdXN0by4gTWFlY2VuYXMgbnVsbGEgbGVvLCBtYXR0aXMgYSwgdml2ZXJyYSBzaXQgYW1ldCwgbWF0dGlzIHZvbHV0cGF0LCBsZWN0dXMuIER1aXMgdHJpc3RpcXVlIHBvcnRhIHBlZGUuIEluIG5lYyBtYWduYS4gJmx0Oy9wJmd0OyAmbHQ7cCZndDsgTWFlY2VuYXMgbW9sbGlzIHRlbXB1cyBtYWduYS4gVXQgb3JuYXJlIGZlbGlzIGF0IGFyY3UuIFByYWVzZW50IHV0IG1hdXJpcyB2aXRhZSBuaWJoIGFkaXBpc2NpbmcgZmV1Z2lhdC4gUXVpc3F1ZSBxdWlzIG1hZ25hLiBJbnRlZ2VyIGNvbmd1ZSBuaWJoIGEgbWFnbmEuIERvbmVjIGNvbmRpbWVudHVtLCBuZXF1ZSBpbiBzdXNjaXBpdCBsdWN0dXMsIG1pIG1hdXJpcyB2ZXN0aWJ1bHVtIHRvcnRvciwgYWxpcXVldCB0ZW1wb3IgaXBzdW0gbmlzaSBpZCBxdWFtLiBRdWlzcXVlIGZhY2lsaXNpcyBtYXNzYSBub24gdHVycGlzLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdC4gTW9yYmkgbW9sZXN0aWUgbGVjdHVzIGF0IG9kaW8uIE1hZWNlbmFzIGltcGVyZGlldCBlZ2VzdGFzIG9kaW8uIE51bGxhIG5pc2wgbGVjdHVzLCB2b2x1dHBhdCB2ZWwsIGNvbnNlY3RldHVlciBlZ2V0LCBsdWN0dXMgdmVsLCBtaS4gTmFtIG5pc2wuIFZpdmFtdXMgdHVycGlzIHZlbGl0LCBjb25kaW1lbnR1bSBldSwgb3JuYXJlIHZlbmVuYXRpcywgY29uZGltZW50dW0gbm9uLCBtYXVyaXMuIFNlZCB2b2x1dHBhdC4gSW4gaGFjIGhhYml0YXNzZSBwbGF0ZWEgZGljdHVtc3QuIFZpdmFtdXMgbmliaC4gQ3JhcyBwcmV0aXVtLCBuaXNpIHZpdGFlIHBlbGxlbnRlc3F1ZSBwbGFjZXJhdCwgZXJhdCBtaSBvcm5hcmUgdmVsaXQsIGluIHNvbGxpY2l0dWRpbiBlc3QgdHVycGlzIGFjIGFudGUuIEludGVnZXIgYSBuaXNsLiBDdW0gc29jaWlzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsIG5hc2NldHVyIHJpZGljdWx1cyBtdXMuIEN1bSBzb2NpaXMgbmF0b3F1ZSBwZW5hdGlidXMgZXQgbWFnbmlzIGRpcyBwYXJ0dXJpZW50IG1vbnRlcywgbmFzY2V0dXIgcmlkaWN1bHVzIG11cy4gJmx0Oy9wJmd0OyAmbHQ7cCZndDsgSW4gbm9udW1teSBkb2xvciB1dCBsZW8uIE1hZWNlbmFzIG1vbGVzdGllIGxvcmVtIG5vbiBsaWJlcm8uIFBlbGxlbnRlc3F1ZSBpbXBlcmRpZXQsIHVybmEgZWdldCB2dWxwdXRhdGUgcHVsdmluYXIsIGxpYmVybyBzZW0gZXVpc21vZCB0dXJwaXMsIHF1aXMgdmVzdGlidWx1bSB0ZWxsdXMgbWV0dXMgZXQgbWFnbmEuIEluIHRlbXBvciBsaWJlcm8gbmVjIG1hc3NhLiBBbGlxdWFtIHZpdGFlIGVyb3MgZXQgaXBzdW0gaW50ZXJkdW0gc2NlbGVyaXNxdWUuIFN1c3BlbmRpc3NlIHB1cnVzIHR1cnBpcywgc29sbGljaXR1ZGluIHB1bHZpbmFyLCBwbGFjZXJhdCBhLCB0aW5jaWR1bnQgYSwgYW50ZS4gTmFtIHF1YW0uIFN1c3BlbmRpc3NlIGxhY3VzIHRlbGx1cywgdWx0cmljaWVzIHZlbCwgbW9sZXN0aWUgYWMsIG1hbGVzdWFkYSBlZ2V0LCBhdWd1ZS4gTWF1cmlzIHZlc3RpYnVsdW0gbG9yZW0gYSBkb2xvci4gRXRpYW0gdml0YWUgbWFzc2Egdml0YWUgc2VtIGZyaW5naWxsYSB0aW5jaWR1bnQuIFN1c3BlbmRpc3NlIHBvdGVudGkuICZsdDsvcCZndDs8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5uYW1lIj5jb250ZW50PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgIDwvY29sbGVjdGlvblByb3A+Ci0gICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iVGVzdFBsYW4udXNlcl9kZWZpbmVfY2xhc3NwYXRoIj48L3N0cmluZ1Byb3A+Ci0gICAgICA8Ym9vbFByb3AgbmFtZT0iVGVzdFBsYW4uc2VyaWFsaXplX3RocmVhZGdyb3VwcyI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgPGJvb2xQcm9wIG5hbWU9IlRlc3RQbGFuLmZ1bmN0aW9uYWxfbW9kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iVGVzdFBsYW4uY29tbWVudHMiPlN0cmVzc2luZyB0ZXN0IGZvciBsZW55YTwvc3RyaW5nUHJvcD4KLSAgICA8L1Rlc3RQbGFuPgotICAgIDxoYXNoVHJlZT4KLSAgICAgIDxUaHJlYWRHcm91cCBndWljbGFzcz0iVGhyZWFkR3JvdXBHdWkiIHRlc3RjbGFzcz0iVGhyZWFkR3JvdXAiIHRlc3RuYW1lPSJMZW55YSBjcmVhdGlvbiB1c2VjYXNlIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgPGxvbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLnN0YXJ0X3RpbWUiPjExNzg3OTI3NDQwMDA8L2xvbmdQcm9wPgotICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJUaHJlYWRHcm91cC5kZWxheSI+PC9zdHJpbmdQcm9wPgotICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJUaHJlYWRHcm91cC5kdXJhdGlvbiI+PC9zdHJpbmdQcm9wPgotICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJUaHJlYWRHcm91cC5udW1fdGhyZWFkcyI+NTwvc3RyaW5nUHJvcD4KLSAgICAgICAgPGJvb2xQcm9wIG5hbWU9IlRocmVhZEdyb3VwLnNjaGVkdWxlciI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iVGhyZWFkR3JvdXAubWFpbl9jb250cm9sbGVyIiBlbGVtZW50VHlwZT0iTG9vcENvbnRyb2xsZXIiIGd1aWNsYXNzPSJMb29wQ29udHJvbFBhbmVsIiB0ZXN0Y2xhc3M9Ikxvb3BDb250cm9sbGVyIiB0ZXN0bmFtZT0iQ29udHJvbGFkb3IgTG9vcCIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iTG9vcENvbnRyb2xsZXIubG9vcHMiPjE8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGJvb2xQcm9wIG5hbWU9Ikxvb3BDb250cm9sbGVyLmNvbnRpbnVlX2ZvcmV2ZXIiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgPGxvbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLmVuZF90aW1lIj4xMTc4NzkyNzQ0MDAwPC9sb25nUHJvcD4KLSAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iVGhyZWFkR3JvdXAub25fc2FtcGxlX2Vycm9yIj5jb250aW51ZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iVGhyZWFkR3JvdXAucmFtcF90aW1lIj4xMDwvc3RyaW5nUHJvcD4KLSAgICAgIDwvVGhyZWFkR3JvdXA+Ci0gICAgICA8aGFzaFRyZWU+Ci0gICAgICAgIDxDb29raWVNYW5hZ2VyIGd1aWNsYXNzPSJDb29raWVQYW5lbCIgdGVzdGNsYXNzPSJDb29raWVNYW5hZ2VyIiB0ZXN0bmFtZT0iQ29va2llcyBIVFRQIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iQ29va2llTWFuYWdlci5jbGVhckVhY2hJdGVyYXRpb24iPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iQ29va2llTWFuYWdlci5jb29raWVzIi8+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQ29va2llTWFuYWdlci5wb2xpY3kiPmRlZmF1bHQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgIDwvQ29va2llTWFuYWdlcj4KLSAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgPENvbmZpZ1Rlc3RFbGVtZW50IGd1aWNsYXNzPSJIdHRwRGVmYXVsdHNHdWkiIHRlc3RjbGFzcz0iQ29uZmlnVGVzdEVsZW1lbnQiIHRlc3RuYW1lPSJEZWZhdWx0IHZhbHVlcyBmb3IgSFRUUCByZXF1ZXN0IiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wYXRoIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuZG9tYWluIj4ke3NlcnZlcn08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucHJvdG9jb2wiPkhUVFA8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucG9ydCI+ODg4ODwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iSFRUUHNhbXBsZXIuQXJndW1lbnRzIiBlbGVtZW50VHlwZT0iQXJndW1lbnRzIiBndWljbGFzcz0iSFRUUEFyZ3VtZW50c1BhbmVsIiB0ZXN0Y2xhc3M9IkFyZ3VtZW50cyIgdGVzdG5hbWU9IlZhcmlhYmxlcyBkZWZpbmlkYXMgcG9yIGVsIFVzdWFyaW8iIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiLz4KLSAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICA8L0NvbmZpZ1Rlc3RFbGVtZW50PgotICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICA8QXJndW1lbnRzIGd1aWNsYXNzPSJBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgIDxjb2xsZWN0aW9uUHJvcCBuYW1lPSJBcmd1bWVudHMuYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJwYXNzd29yZCIgZWxlbWVudFR5cGU9IkFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50LnZhbHVlIj5mb28xMjM8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnBhc3N3b3JkPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICA8L2NvbGxlY3Rpb25Qcm9wPgotICAgICAgICA8L0FyZ3VtZW50cz4KLSAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgPEdhdXNzaWFuUmFuZG9tVGltZXIgZ3VpY2xhc3M9IkdhdXNzaWFuUmFuZG9tVGltZXJHdWkiIHRlc3RjbGFzcz0iR2F1c3NpYW5SYW5kb21UaW1lciIgdGVzdG5hbWU9IlJhbmRvbSBUaW1lciIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQ29uc3RhbnRUaW1lci5kZWxheSI+MTUwMDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSYW5kb21UaW1lci5yYW5nZSI+NTAwPC9zdHJpbmdQcm9wPgotICAgICAgICA8L0dhdXNzaWFuUmFuZG9tVGltZXI+Ci0gICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgIDxPbmNlT25seUNvbnRyb2xsZXIgZ3VpY2xhc3M9Ik9uY2VPbmx5Q29udHJvbGxlckd1aSIgdGVzdGNsYXNzPSJPbmNlT25seUNvbnRyb2xsZXIiIHRlc3RuYW1lPSJMb2dpbiAmcXVvdDtsZW55YSZxdW90OyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgPGhhc2hUcmVlPgotICAgICAgICAgIDxIVFRQU2FtcGxlciBndWljbGFzcz0iSHR0cFRlc3RTYW1wbGVHdWkiIHRlc3RjbGFzcz0iSFRUUFNhbXBsZXIiIHRlc3RuYW1lPSJMb2dpbiBwYWdlIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBhdGgiPi9kZWZhdWx0L2F1dGhvcmluZy9pbmRleC5odG1sPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5HRVQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIudXNlX2tlZXBhbGl2ZSI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wcm90b2NvbCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmZvbGxvd19yZWRpcmVjdHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucG9ydCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkhUVFBzYW1wbGVyLkFyZ3VtZW50cyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkhUVFBBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMgZGVmaW5pZGFzIHBvciBlbCBVc3VhcmlvIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiLz4KLSAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5taW1ldHlwZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9GSUVMRCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubW9uaXRvciI+ZmFsc2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5kb21haW4iPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfTkFNRSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmF1dG9fcmVkaXJlY3RzIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgPC9IVFRQU2FtcGxlcj4KLSAgICAgICAgICA8aGFzaFRyZWU+Ci0gICAgICAgICAgICA8UmVnZXhFeHRyYWN0b3IgZ3VpY2xhc3M9IlJlZ2V4RXh0cmFjdG9yR3VpIiB0ZXN0Y2xhc3M9IlJlZ2V4RXh0cmFjdG9yIiB0ZXN0bmFtZT0iUmVndWxhciBFeHByZXNzaW9uIEV4dHJhY3RvciIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLmRlZmF1bHQiPmVycm9yPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5yZWdleCI+bGVueWEuY29udGludWF0aW9uPSguKj8pJmFtcDthbXA7bGVueWEudXNlY2FzZT1hYy5sb2dpbiZxdW90OyZndDs8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnVzZUhlYWRlcnMiPmZhbHNlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5tYXRjaF9udW1iZXIiPjA8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnRlbXBsYXRlIj4kMSQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnJlZm5hbWUiPmxlbnlhLmNvbnRpbnVhdGlvbjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDwvUmVnZXhFeHRyYWN0b3I+Ci0gICAgICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgICAgPEhUVFBTYW1wbGVyIGd1aWNsYXNzPSJIdHRwVGVzdFNhbXBsZUd1aSIgdGVzdGNsYXNzPSJIVFRQU2FtcGxlciIgdGVzdG5hbWU9IkxvZ2luIHBhZ2UiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucGF0aCI+L2RlZmF1bHQvYXV0aG9yaW5nL2luZGV4Lmh0bWw/bGVueWEudXNlY2FzZT1hYy5sb2dpbiZhbXA7bGVueWEuY29udGludWF0aW9uPSR7bGVueWEuY29udGludWF0aW9ufTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1ldGhvZCI+UE9TVDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci51c2Vfa2VlcGFsaXZlIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnByb3RvY29sIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuZm9sbG93X3JlZGlyZWN0cyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wb3J0Ij48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iSFRUUHNhbXBsZXIuQXJndW1lbnRzIiBlbGVtZW50VHlwZT0iQXJndW1lbnRzIiBndWljbGFzcz0iSFRUUEFyZ3VtZW50c1BhbmVsIiB0ZXN0Y2xhc3M9IkFyZ3VtZW50cyIgdGVzdG5hbWU9IlZhcmlhYmxlcyBkZWZpbmlkYXMgcG9yIGVsIFVzdWFyaW8iIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iQXJndW1lbnRzLmFyZ3VtZW50cyI+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50LnZhbHVlIj5sZW55YTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5uYW1lIj51c2VybmFtZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50LnZhbHVlIj5sZXZpPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnBhc3N3b3JkPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPkxvZ2luPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnN1Ym1pdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgIDwvY29sbGVjdGlvblByb3A+Ci0gICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWltZXR5cGUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfRklFTEQiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1vbml0b3IiPmZhbHNlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuZG9tYWluIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX05BTUUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5hdXRvX3JlZGlyZWN0cyI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgIDwvSFRUUFNhbXBsZXI+Ci0gICAgICAgICAgPGhhc2hUcmVlPgotICAgICAgICAgICAgPEhlYWRlck1hbmFnZXIgZ3VpY2xhc3M9IkhlYWRlclBhbmVsIiB0ZXN0Y2xhc3M9IkhlYWRlck1hbmFnZXIiIHRlc3RuYW1lPSJIVFRQIEhlYWRlciIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxjb2xsZWN0aW9uUHJvcCBuYW1lPSJIZWFkZXJNYW5hZ2VyLmhlYWRlcnMiPgotICAgICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSIiIGVsZW1lbnRUeXBlPSJIZWFkZXIiPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSGVhZGVyLnZhbHVlIj5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIZWFkZXIubmFtZSI+Q29udGVudC1UeXBlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgIDwvY29sbGVjdGlvblByb3A+Ci0gICAgICAgICAgICA8L0hlYWRlck1hbmFnZXI+Ci0gICAgICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgIDxPbmNlT25seUNvbnRyb2xsZXIgZ3VpY2xhc3M9Ik9uY2VPbmx5Q29udHJvbGxlckd1aSIgdGVzdGNsYXNzPSJPbmNlT25seUNvbnRyb2xsZXIiIHRlc3RuYW1lPSJBZGQgYWRtaW4gdXNlciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgPGhhc2hUcmVlPgotICAgICAgICAgIDxIVFRQU2FtcGxlciBndWljbGFzcz0iSHR0cFRlc3RTYW1wbGVHdWkiIHRlc3RjbGFzcz0iSFRUUFNhbXBsZXIiIHRlc3RuYW1lPSJBZGQgdXNlciIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wYXRoIj4vZGVmYXVsdC9hdXRob3JpbmcvaW5kZXguaHRtbD9sZW55YS51c2VjYXNlPWFkbWluLmFkZFVzZXI8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tZXRob2QiPkdFVDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci51c2Vfa2VlcGFsaXZlIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnByb3RvY29sIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuZm9sbG93X3JlZGlyZWN0cyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wb3J0Ij48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iSFRUUHNhbXBsZXIuQXJndW1lbnRzIiBlbGVtZW50VHlwZT0iQXJndW1lbnRzIiBndWljbGFzcz0iSFRUUEFyZ3VtZW50c1BhbmVsIiB0ZXN0Y2xhc3M9IkFyZ3VtZW50cyIgdGVzdG5hbWU9IlZhcmlhYmxlcyBkZWZpbmlkYXMgcG9yIGVsIFVzdWFyaW8iIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iQXJndW1lbnRzLmFyZ3VtZW50cyIvPgotICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1pbWV0eXBlIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX0ZJRUxEIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tb25pdG9yIj5mYWxzZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmRvbWFpbiI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9OQU1FIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuYXV0b19yZWRpcmVjdHMiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICA8L0hUVFBTYW1wbGVyPgotICAgICAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgICAgIDxSZWdleEV4dHJhY3RvciBndWljbGFzcz0iUmVnZXhFeHRyYWN0b3JHdWkiIHRlc3RjbGFzcz0iUmVnZXhFeHRyYWN0b3IiIHRlc3RuYW1lPSJSZWd1bGFyIEV4cHJlc3Npb24gRXh0cmFjdG9yIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IuZGVmYXVsdCI+ZXJyb3I8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnJlZ2V4Ij5uYW1lPVwmcXVvdDtsZW55YS5jb250aW51YXRpb25cJnF1b3Q7W1xzXXZhbHVlPVwmcXVvdDsoLiopXCZxdW90Ozwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IudXNlSGVhZGVycyI+ZmFsc2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLm1hdGNoX251bWJlciI+MTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IudGVtcGxhdGUiPiQxJDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IucmVmbmFtZSI+bGVueWEuY29udGludWF0aW9uPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPC9SZWdleEV4dHJhY3Rvcj4KLSAgICAgICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgICAgPC9oYXNoVHJlZT4KLSAgICAgICAgICA8SFRUUFNhbXBsZXIgZ3VpY2xhc3M9Ikh0dHBUZXN0U2FtcGxlR3VpIiB0ZXN0Y2xhc3M9IkhUVFBTYW1wbGVyIiB0ZXN0bmFtZT0iQWRkIHVzZXIiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucGF0aCI+L2RlZmF1bHQvYXV0aG9yaW5nL2luZGV4Lmh0bWw/bGVueWEudXNlY2FzZT1hZG1pbi5hZGRVc2VyJmFtcDtsZW55YS5jb250aW51YXRpb249JHtsZW55YS5jb250aW51YXRpb259PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5QT1NUPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnVzZV9rZWVwYWxpdmUiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucHJvdG9jb2wiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5mb2xsb3dfcmVkaXJlY3RzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBvcnQiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJIVFRQc2FtcGxlci5Bcmd1bWVudHMiIGVsZW1lbnRUeXBlPSJBcmd1bWVudHMiIGd1aWNsYXNzPSJIVFRQQXJndW1lbnRzUGFuZWwiIHRlc3RjbGFzcz0iQXJndW1lbnRzIiB0ZXN0bmFtZT0iVmFyaWFibGVzIGRlZmluaWRhcyBwb3IgZWwgVXN1YXJpbyIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxjb2xsZWN0aW9uUHJvcCBuYW1lPSJBcmd1bWVudHMuYXJndW1lbnRzIj4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPmFkbWluJHtfX3RocmVhZE51bX08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+dXNlcklkPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPiR7cGFzc3dvcmR9PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPm5ld1Bhc3N3b3JkPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPlN1Ym1pdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5uYW1lIj5zdWJtaXQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSIiIGVsZW1lbnRUeXBlPSJIVFRQQXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+JHtwYXNzd29yZH08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+Y29uZmlybVBhc3N3b3JkPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPmZvb0BiYXIuY29tPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPmVtYWlsPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPm9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlcjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5uYW1lIj5jbGFzc05hbWU8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICA8L2NvbGxlY3Rpb25Qcm9wPgotICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1pbWV0eXBlIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX0ZJRUxEIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tb25pdG9yIj5mYWxzZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmRvbWFpbiI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9OQU1FIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuYXV0b19yZWRpcmVjdHMiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICA8L0hUVFBTYW1wbGVyPgotICAgICAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgICAgIDxIZWFkZXJNYW5hZ2VyIGd1aWNsYXNzPSJIZWFkZXJQYW5lbCIgdGVzdGNsYXNzPSJIZWFkZXJNYW5hZ2VyIiB0ZXN0bmFtZT0iSFRUUCBIZWFkZXIiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iSGVhZGVyTWFuYWdlci5oZWFkZXJzIj4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSGVhZGVyIj4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhlYWRlci52YWx1ZSI+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSGVhZGVyLm5hbWUiPkNvbnRlbnQtVHlwZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICA8L2NvbGxlY3Rpb25Qcm9wPgotICAgICAgICAgICAgPC9IZWFkZXJNYW5hZ2VyPgotICAgICAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgICA8L2hhc2hUcmVlPgotICAgICAgICA8L2hhc2hUcmVlPgotICAgICAgICA8T25jZU9ubHlDb250cm9sbGVyIGd1aWNsYXNzPSJPbmNlT25seUNvbnRyb2xsZXJHdWkiIHRlc3RjbGFzcz0iT25jZU9ubHlDb250cm9sbGVyIiB0ZXN0bmFtZT0iTG9nb3V0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICA8aGFzaFRyZWU+Ci0gICAgICAgICAgPEhUVFBTYW1wbGVyIGd1aWNsYXNzPSJIdHRwVGVzdFNhbXBsZUd1aSIgdGVzdGNsYXNzPSJIVFRQU2FtcGxlciIgdGVzdG5hbWU9IkxvZ291dCBwYWdlIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBhdGgiPi9kZWZhdWx0L2F1dGhvcmluZy9pbmRleC5odG1sPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5HRVQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIudXNlX2tlZXBhbGl2ZSI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wcm90b2NvbCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmZvbGxvd19yZWRpcmVjdHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucG9ydCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkhUVFBzYW1wbGVyLkFyZ3VtZW50cyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkhUVFBBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMgZGVmaW5pZGFzIHBvciBlbCBVc3VhcmlvIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiPgotICAgICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSIiIGVsZW1lbnRUeXBlPSJIVFRQQXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+YWMubG9nb3V0PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPmxlbnlhLnVzZWNhc2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICA8L2NvbGxlY3Rpb25Qcm9wPgotICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1pbWV0eXBlIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX0ZJRUxEIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tb25pdG9yIj5mYWxzZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmRvbWFpbiI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9OQU1FIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuYXV0b19yZWRpcmVjdHMiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICA8L0hUVFBTYW1wbGVyPgotICAgICAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgICAgIDxSZWdleEV4dHJhY3RvciBndWljbGFzcz0iUmVnZXhFeHRyYWN0b3JHdWkiIHRlc3RjbGFzcz0iUmVnZXhFeHRyYWN0b3IiIHRlc3RuYW1lPSJSZWd1bGFyIEV4cHJlc3Npb24gRXh0cmFjdG9yIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IuZGVmYXVsdCI+ZXJyb3I8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnJlZ2V4Ij5uYW1lPVwmcXVvdDtsZW55YS5jb250aW51YXRpb25cJnF1b3Q7W1xzXXZhbHVlPVwmcXVvdDsoLiopXCZxdW90Ozwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IudXNlSGVhZGVycyI+ZmFsc2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLm1hdGNoX251bWJlciI+MTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IudGVtcGxhdGUiPiQxJDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IucmVmbmFtZSI+bGVueWEuY29udGludWF0aW9uPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPC9SZWdleEV4dHJhY3Rvcj4KLSAgICAgICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgICAgPC9oYXNoVHJlZT4KLSAgICAgICAgICA8SFRUUFNhbXBsZXIgZ3VpY2xhc3M9Ikh0dHBUZXN0U2FtcGxlR3VpIiB0ZXN0Y2xhc3M9IkhUVFBTYW1wbGVyIiB0ZXN0bmFtZT0iTG9nb3V0IHBhZ2UiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucGF0aCI+L2RlZmF1bHQvYXV0aG9yaW5nL2luZGV4Lmh0bWw/bGVueWEudXNlY2FzZT1hYy5sb2dvdXQmYW1wO2xlbnlhLmNvbnRpbnVhdGlvbj0ke2xlbnlhLmNvbnRpbnVhdGlvbn08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tZXRob2QiPlBPU1Q8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIudXNlX2tlZXBhbGl2ZSI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wcm90b2NvbCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmZvbGxvd19yZWRpcmVjdHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucG9ydCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkhUVFBzYW1wbGVyLkFyZ3VtZW50cyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkhUVFBBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMgZGVmaW5pZGFzIHBvciBlbCBVc3VhcmlvIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiPgotICAgICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSIiIGVsZW1lbnRUeXBlPSJIVFRQQXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+TG9naW48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+c3VibWl0PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgPC9jb2xsZWN0aW9uUHJvcD4KLSAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5taW1ldHlwZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9GSUVMRCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubW9uaXRvciI+ZmFsc2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5kb21haW4iPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfTkFNRSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmF1dG9fcmVkaXJlY3RzIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgPC9IVFRQU2FtcGxlcj4KLSAgICAgICAgICA8aGFzaFRyZWU+Ci0gICAgICAgICAgICA8SGVhZGVyTWFuYWdlciBndWljbGFzcz0iSGVhZGVyUGFuZWwiIHRlc3RjbGFzcz0iSGVhZGVyTWFuYWdlciIgdGVzdG5hbWU9IkhUVFAgSGVhZGVyIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkhlYWRlck1hbmFnZXIuaGVhZGVycyI+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhlYWRlciI+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIZWFkZXIudmFsdWUiPmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhlYWRlci5uYW1lIj5Db250ZW50LVR5cGU8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgPC9jb2xsZWN0aW9uUHJvcD4KLSAgICAgICAgICAgIDwvSGVhZGVyTWFuYWdlcj4KLSAgICAgICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgICAgPC9oYXNoVHJlZT4KLSAgICAgICAgPC9oYXNoVHJlZT4KLSAgICAgICAgPE9uY2VPbmx5Q29udHJvbGxlciBndWljbGFzcz0iT25jZU9ubHlDb250cm9sbGVyR3VpIiB0ZXN0Y2xhc3M9Ik9uY2VPbmx5Q29udHJvbGxlciIgdGVzdG5hbWU9IkxvZ2luIGFkbWluIHVzZXIiIGVuYWJsZWQ9InRydWUiLz4KLSAgICAgICAgPGhhc2hUcmVlPgotICAgICAgICAgIDxIVFRQU2FtcGxlciBndWljbGFzcz0iSHR0cFRlc3RTYW1wbGVHdWkiIHRlc3RjbGFzcz0iSFRUUFNhbXBsZXIiIHRlc3RuYW1lPSJMb2dpbiBwYWdlIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBhdGgiPi9kZWZhdWx0L2F1dGhvcmluZy9pbmRleC5odG1sPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5HRVQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIudXNlX2tlZXBhbGl2ZSI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wcm90b2NvbCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmZvbGxvd19yZWRpcmVjdHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucG9ydCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkhUVFBzYW1wbGVyLkFyZ3VtZW50cyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkhUVFBBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMgZGVmaW5pZGFzIHBvciBlbCBVc3VhcmlvIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiLz4KLSAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5taW1ldHlwZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9GSUVMRCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubW9uaXRvciI+ZmFsc2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5kb21haW4iPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfTkFNRSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmF1dG9fcmVkaXJlY3RzIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgPC9IVFRQU2FtcGxlcj4KLSAgICAgICAgICA8aGFzaFRyZWU+Ci0gICAgICAgICAgICA8UmVnZXhFeHRyYWN0b3IgZ3VpY2xhc3M9IlJlZ2V4RXh0cmFjdG9yR3VpIiB0ZXN0Y2xhc3M9IlJlZ2V4RXh0cmFjdG9yIiB0ZXN0bmFtZT0iUmVndWxhciBFeHByZXNzaW9uIEV4dHJhY3RvciIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLmRlZmF1bHQiPmVycm9yPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5yZWdleCI+bGVueWEuY29udGludWF0aW9uPSguKj8pJmFtcDthbXA7bGVueWEudXNlY2FzZT1hYy5sb2dpbiZxdW90OyZndDs8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnVzZUhlYWRlcnMiPmZhbHNlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5tYXRjaF9udW1iZXIiPjA8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnRlbXBsYXRlIj4kMSQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnJlZm5hbWUiPmxlbnlhLmNvbnRpbnVhdGlvbjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDwvUmVnZXhFeHRyYWN0b3I+Ci0gICAgICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgICAgPEhUVFBTYW1wbGVyIGd1aWNsYXNzPSJIdHRwVGVzdFNhbXBsZUd1aSIgdGVzdGNsYXNzPSJIVFRQU2FtcGxlciIgdGVzdG5hbWU9IkxvZ2luIHBhZ2UiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucGF0aCI+L2RlZmF1bHQvYXV0aG9yaW5nL2luZGV4Lmh0bWw/bGVueWEudXNlY2FzZT1hYy5sb2dpbiZhbXA7bGVueWEuY29udGludWF0aW9uPSR7bGVueWEuY29udGludWF0aW9ufTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1ldGhvZCI+UE9TVDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci51c2Vfa2VlcGFsaXZlIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnByb3RvY29sIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuZm9sbG93X3JlZGlyZWN0cyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wb3J0Ij48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iSFRUUHNhbXBsZXIuQXJndW1lbnRzIiBlbGVtZW50VHlwZT0iQXJndW1lbnRzIiBndWljbGFzcz0iSFRUUEFyZ3VtZW50c1BhbmVsIiB0ZXN0Y2xhc3M9IkFyZ3VtZW50cyIgdGVzdG5hbWU9IlZhcmlhYmxlcyBkZWZpbmlkYXMgcG9yIGVsIFVzdWFyaW8iIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iQXJndW1lbnRzLmFyZ3VtZW50cyI+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50LnZhbHVlIj5sZW55YTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5uYW1lIj51c2VybmFtZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50LnZhbHVlIj5sZXZpPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnBhc3N3b3JkPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPkxvZ2luPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnN1Ym1pdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgIDwvY29sbGVjdGlvblByb3A+Ci0gICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWltZXR5cGUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfRklFTEQiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1vbml0b3IiPmZhbHNlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuZG9tYWluIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX05BTUUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5hdXRvX3JlZGlyZWN0cyI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgIDwvSFRUUFNhbXBsZXI+Ci0gICAgICAgICAgPGhhc2hUcmVlPgotICAgICAgICAgICAgPEhlYWRlck1hbmFnZXIgZ3VpY2xhc3M9IkhlYWRlclBhbmVsIiB0ZXN0Y2xhc3M9IkhlYWRlck1hbmFnZXIiIHRlc3RuYW1lPSJIVFRQIEhlYWRlciIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxjb2xsZWN0aW9uUHJvcCBuYW1lPSJIZWFkZXJNYW5hZ2VyLmhlYWRlcnMiPgotICAgICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSIiIGVsZW1lbnRUeXBlPSJIZWFkZXIiPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSGVhZGVyLnZhbHVlIj5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIZWFkZXIubmFtZSI+Q29udGVudC1UeXBlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgIDwvY29sbGVjdGlvblByb3A+Ci0gICAgICAgICAgICA8L0hlYWRlck1hbmFnZXI+Ci0gICAgICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgIDxMb29wQ29udHJvbGxlciBndWljbGFzcz0iTG9vcENvbnRyb2xQYW5lbCIgdGVzdGNsYXNzPSJMb29wQ29udHJvbGxlciIgdGVzdG5hbWU9Ikxvb3AiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9Ikxvb3BDb250cm9sbGVyLmxvb3BzIj4xMDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iTG9vcENvbnRyb2xsZXIuY29udGludWVfZm9yZXZlciI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgIDwvTG9vcENvbnRyb2xsZXI+Ci0gICAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgICA8R2VuZXJpY0NvbnRyb2xsZXIgZ3VpY2xhc3M9IkxvZ2ljQ29udHJvbGxlckd1aSIgdGVzdGNsYXNzPSJHZW5lcmljQ29udHJvbGxlciIgdGVzdG5hbWU9Ik5ld3MiIGVuYWJsZWQ9InRydWUiLz4KLSAgICAgICAgICA8aGFzaFRyZWU+Ci0gICAgICAgICAgICA8SFRUUFNhbXBsZXIgZ3VpY2xhc3M9Ikh0dHBUZXN0U2FtcGxlR3VpIiB0ZXN0Y2xhc3M9IkhUVFBTYW1wbGVyIiB0ZXN0bmFtZT0iQ3JlYXRlIE5ld3MiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wYXRoIj4vZGVmYXVsdC9hdXRob3JpbmcvaW5kZXguaHRtbD9kb2N0eXBlPXhodG1sJmFtcDtsZW55YS51c2VjYXNlPXNpdGVtYW5hZ2VtZW50LmNyZWF0ZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5HRVQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci51c2Vfa2VlcGFsaXZlIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucHJvdG9jb2wiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmZvbGxvd19yZWRpcmVjdHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wb3J0Ij48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJIVFRQc2FtcGxlci5Bcmd1bWVudHMiIGVsZW1lbnRUeXBlPSJBcmd1bWVudHMiIGd1aWNsYXNzPSJIVFRQQXJndW1lbnRzUGFuZWwiIHRlc3RjbGFzcz0iQXJndW1lbnRzIiB0ZXN0bmFtZT0iVmFyaWFibGVzIGRlZmluaWRhcyBwb3IgZWwgVXN1YXJpbyIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+dHJ1ZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+b3B0aW1pc3RpY0xvY2tpbmc8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8L2NvbGxlY3Rpb25Qcm9wPgotICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5taW1ldHlwZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX0ZJRUxEIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1vbml0b3IiPmZhbHNlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5kb21haW4iPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9OQU1FIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5hdXRvX3JlZGlyZWN0cyI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgPC9IVFRQU2FtcGxlcj4KLSAgICAgICAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgICAgICAgPFJlZ2V4RXh0cmFjdG9yIGd1aWNsYXNzPSJSZWdleEV4dHJhY3Rvckd1aSIgdGVzdGNsYXNzPSJSZWdleEV4dHJhY3RvciIgdGVzdG5hbWU9InJlZ2V4IiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5kZWZhdWx0Ij5lcnJvcjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5yZWdleCI+bmFtZT0mcXVvdDtsZW55YS5jb250aW51YXRpb24mcXVvdDsgdmFsdWU9JnF1b3Q7KC4qPykmcXVvdDs8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IudXNlSGVhZGVycyI+ZmFsc2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IubWF0Y2hfbnVtYmVyIj4wPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnRlbXBsYXRlIj4kMSQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IucmVmbmFtZSI+bGVueWEuY29udGludWF0aW9uPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8L1JlZ2V4RXh0cmFjdG9yPgotICAgICAgICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICAgICAgICA8UmVnZXhFeHRyYWN0b3IgZ3VpY2xhc3M9IlJlZ2V4RXh0cmFjdG9yR3VpIiB0ZXN0Y2xhc3M9IlJlZ2V4RXh0cmFjdG9yIiB0ZXN0bmFtZT0icmVnZXggc3VibWl0IiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5kZWZhdWx0Ij5lcnJvcjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5yZWdleCI+dmFsdWU9JnF1b3Q7Q3JlYXRlJnF1b3Q7PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnVzZUhlYWRlcnMiPmZhbHNlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLm1hdGNoX251bWJlciI+MDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci50ZW1wbGF0ZSI+JDEkPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnJlZm5hbWUiPnN1Ym1pdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPC9SZWdleEV4dHJhY3Rvcj4KLSAgICAgICAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgICAgICA8SWZDb250cm9sbGVyIGd1aWNsYXNzPSJJZkNvbnRyb2xsZXJQYW5lbCIgdGVzdGNsYXNzPSJJZkNvbnRyb2xsZXIiIHRlc3RuYW1lPSJJZiBDb250cm9sbGVyIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSWZDb250cm9sbGVyLmNvbmRpdGlvbiI+JnF1b3Q7JHtzdWJtaXR9JnF1b3Q7ICE9ICZxdW90OyZxdW90Ozwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDwvSWZDb250cm9sbGVyPgotICAgICAgICAgICAgPGhhc2hUcmVlPgotICAgICAgICAgICAgICA8SFRUUFNhbXBsZXIgZ3VpY2xhc3M9Ikh0dHBUZXN0U2FtcGxlR3VpIiB0ZXN0Y2xhc3M9IkhUVFBTYW1wbGVyIiB0ZXN0bmFtZT0iVmFsaWRhdGlvbiIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucGF0aCI+L2RlZmF1bHQvYXV0aG9yaW5nL2luZGV4Lmh0bWw8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5HRVQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnVzZV9rZWVwYWxpdmUiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnByb3RvY29sIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmZvbGxvd19yZWRpcmVjdHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBvcnQiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iSFRUUHNhbXBsZXIuQXJndW1lbnRzIiBlbGVtZW50VHlwZT0iQXJndW1lbnRzIiBndWljbGFzcz0iSFRUUEFyZ3VtZW50c1BhbmVsIiB0ZXN0Y2xhc3M9IkFyZ3VtZW50cyIgdGVzdG5hbWU9IlZhcmlhYmxlcyBkZWZpbmlkYXMgcG9yIGVsIFVzdWFyaW8iIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+JHtsZW55YS5jb250aW51YXRpb259PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+bGVueWEuY29udGludWF0aW9uPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+c2l0ZW1hbmFnZW1lbnQuY3JlYXRlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+bGVueWEudXNlY2FzZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPk5vdGljaWEke19fUmFuZG9tKDEsMTAwMDAsRE9DVU1FTlQpfTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPm5vZGVOYW1lPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+Tm90aWNpYSske19fUmFuZG9tKDEsMTAwMDAsRE9DVU1FTlQpfTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPmR1YmxpbmNvcmUudGl0bGU8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSIiIGVsZW1lbnRUeXBlPSJIVFRQQXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50LnZhbHVlIj50cnVlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+dmlzaWJsZUluTmF2PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+Y2hpbGQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5uYW1lIj5yZWxhdGlvbjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPmVuPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+bGFuZ3VhZ2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSIiIGVsZW1lbnRUeXBlPSJIVFRQQXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50LnZhbHVlIj5sZW55YTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPmR1YmxpbmNvcmUuY3JlYXRvcjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPmR1YmxpbmNvcmUuc3ViamVjdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPmR1YmxpbmNvcmUucHVibGlzaGVyPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0iIiBlbGVtZW50VHlwZT0iSFRUUEFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5tZXRhZGF0YSI+PTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+ZHVibGluY29yZS5yaWdodHM8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC5hbHdheXNfZW5jb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSIiIGVsZW1lbnRUeXBlPSJIVFRQQXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50LnZhbHVlIj5EZWZhdWx0K1NhbXBsZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnNhbXBsZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPkNyZWF0ZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LnVzZV9lcXVhbHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnN1Ym1pdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICAgIDwvY29sbGVjdGlvblByb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5taW1ldHlwZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfRklFTEQiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tb25pdG9yIj5mYWxzZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5kb21haW4iPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX05BTUUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuYXV0b19yZWRpcmVjdHMiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgPC9IVFRQU2FtcGxlcj4KLSAgICAgICAgICAgICAgPGhhc2hUcmVlPgotICAgICAgICAgICAgICAgIDxDb3VudGVyQ29uZmlnIGd1aWNsYXNzPSJDb3VudGVyQ29uZmlnR3VpIiB0ZXN0Y2xhc3M9IkNvdW50ZXJDb25maWciIHRlc3RuYW1lPSJjb3VudGVyIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkNvdW50ZXJDb25maWcuc3RhcnQiPjE8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJDb3VudGVyQ29uZmlnLmluY3IiPjE8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJDb3VudGVyQ29uZmlnLm5hbWUiPmNvbnRhZG9yX25vdGljaWE8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJDb3VudGVyQ29uZmlnLmZvcm1hdCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkNvdW50ZXJDb25maWcucGVyX3VzZXIiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkNvdW50ZXJDb25maWcuZW5kIj4xMDAwMDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8L0NvdW50ZXJDb25maWc+Ci0gICAgICAgICAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgICAgICAgPC9oYXNoVHJlZT4KLSAgICAgICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgICAgICA8QXJndW1lbnRzIGd1aWNsYXNzPSJBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iQXJndW1lbnRzLmFyZ3VtZW50cyI+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkRPQ1VNRU5UIiBlbGVtZW50VHlwZT0iQXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+JHtfX1JhbmRvbSgwLDEwMDAwLEZPTyl9PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+RE9DVU1FTlQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudFByb3AgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiBlbGVtZW50VHlwZT0iQXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC52YWx1ZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+bGVueWEuY29udGludWF0aW9uPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9InN1Ym1pdCIgZWxlbWVudFR5cGU9IkFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm1ldGFkYXRhIj49PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkFyZ3VtZW50Lm5hbWUiPnN1Ym1pdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICA8L2NvbGxlY3Rpb25Qcm9wPgotICAgICAgICAgICAgPC9Bcmd1bWVudHM+Ci0gICAgICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgIDxSZXN1bHRDb2xsZWN0b3IgZ3VpY2xhc3M9IlN0YXRWaXN1YWxpemVyIiB0ZXN0Y2xhc3M9IlJlc3VsdENvbGxlY3RvciIgdGVzdG5hbWU9IlJlcG9ydCIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPG9ialByb3A+Ci0gICAgICAgICAgICA8dmFsdWUgY2xhc3M9IlNhbXBsZVNhdmVDb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgICAgPHRpbWU+dHJ1ZTwvdGltZT4KLSAgICAgICAgICAgICAgPGxhdGVuY3k+dHJ1ZTwvbGF0ZW5jeT4KLSAgICAgICAgICAgICAgPHRpbWVzdGFtcD50cnVlPC90aW1lc3RhbXA+Ci0gICAgICAgICAgICAgIDxzdWNjZXNzPnRydWU8L3N1Y2Nlc3M+Ci0gICAgICAgICAgICAgIDxsYWJlbD50cnVlPC9sYWJlbD4KLSAgICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgICAgICAgICAgPG1lc3NhZ2U+dHJ1ZTwvbWVzc2FnZT4KLSAgICAgICAgICAgICAgPHRocmVhZE5hbWU+dHJ1ZTwvdGhyZWFkTmFtZT4KLSAgICAgICAgICAgICAgPGRhdGFUeXBlPnRydWU8L2RhdGFUeXBlPgotICAgICAgICAgICAgICA8ZW5jb2Rpbmc+ZmFsc2U8L2VuY29kaW5nPgotICAgICAgICAgICAgICA8YXNzZXJ0aW9ucz50cnVlPC9hc3NlcnRpb25zPgotICAgICAgICAgICAgICA8c3VicmVzdWx0cz50cnVlPC9zdWJyZXN1bHRzPgotICAgICAgICAgICAgICA8cmVzcG9uc2VEYXRhPmZhbHNlPC9yZXNwb25zZURhdGE+Ci0gICAgICAgICAgICAgIDxzYW1wbGVyRGF0YT5mYWxzZTwvc2FtcGxlckRhdGE+Ci0gICAgICAgICAgICAgIDx4bWw+ZmFsc2U8L3htbD4KLSAgICAgICAgICAgICAgPGZpZWxkTmFtZXM+ZmFsc2U8L2ZpZWxkTmFtZXM+Ci0gICAgICAgICAgICAgIDxyZXNwb25zZUhlYWRlcnM+ZmFsc2U8L3Jlc3BvbnNlSGVhZGVycz4KLSAgICAgICAgICAgICAgPHJlcXVlc3RIZWFkZXJzPmZhbHNlPC9yZXF1ZXN0SGVhZGVycz4KLSAgICAgICAgICAgICAgPHJlc3BvbnNlRGF0YU9uRXJyb3I+ZmFsc2U8L3Jlc3BvbnNlRGF0YU9uRXJyb3I+Ci0gICAgICAgICAgICAgIDxzYXZlQXNzZXJ0aW9uUmVzdWx0c0ZhaWx1cmVNZXNzYWdlPmZhbHNlPC9zYXZlQXNzZXJ0aW9uUmVzdWx0c0ZhaWx1cmVNZXNzYWdlPgotICAgICAgICAgICAgICA8YXNzZXJ0aW9uc1Jlc3VsdHNUb1NhdmU+MDwvYXNzZXJ0aW9uc1Jlc3VsdHNUb1NhdmU+Ci0gICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPG5hbWU+c2F2ZUNvbmZpZzwvbmFtZT4KLSAgICAgICAgICA8L29ialByb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iZmlsZW5hbWUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iUmVzdWx0Q29sbGVjdG9yLmVycm9yX2xvZ2dpbmciPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgPC9SZXN1bHRDb2xsZWN0b3I+Ci0gICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgIDxSZXN1bHRDb2xsZWN0b3IgZ3VpY2xhc3M9IlZpZXdSZXN1bHRzRnVsbFZpc3VhbGl6ZXIiIHRlc3RjbGFzcz0iUmVzdWx0Q29sbGVjdG9yIiB0ZXN0bmFtZT0iUmVzdWx0IHRyZWUiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgIDxvYmpQcm9wPgotICAgICAgICAgICAgPHZhbHVlIGNsYXNzPSJTYW1wbGVTYXZlQ29uZmlndXJhdGlvbiI+Ci0gICAgICAgICAgICAgIDx0aW1lPnRydWU8L3RpbWU+Ci0gICAgICAgICAgICAgIDxsYXRlbmN5PnRydWU8L2xhdGVuY3k+Ci0gICAgICAgICAgICAgIDx0aW1lc3RhbXA+dHJ1ZTwvdGltZXN0YW1wPgotICAgICAgICAgICAgICA8c3VjY2Vzcz50cnVlPC9zdWNjZXNzPgotICAgICAgICAgICAgICA8bGFiZWw+dHJ1ZTwvbGFiZWw+Ci0gICAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICAgICAgICAgIDxtZXNzYWdlPnRydWU8L21lc3NhZ2U+Ci0gICAgICAgICAgICAgIDx0aHJlYWROYW1lPnRydWU8L3RocmVhZE5hbWU+Ci0gICAgICAgICAgICAgIDxkYXRhVHlwZT50cnVlPC9kYXRhVHlwZT4KLSAgICAgICAgICAgICAgPGVuY29kaW5nPmZhbHNlPC9lbmNvZGluZz4KLSAgICAgICAgICAgICAgPGFzc2VydGlvbnM+dHJ1ZTwvYXNzZXJ0aW9ucz4KLSAgICAgICAgICAgICAgPHN1YnJlc3VsdHM+dHJ1ZTwvc3VicmVzdWx0cz4KLSAgICAgICAgICAgICAgPHJlc3BvbnNlRGF0YT5mYWxzZTwvcmVzcG9uc2VEYXRhPgotICAgICAgICAgICAgICA8c2FtcGxlckRhdGE+ZmFsc2U8L3NhbXBsZXJEYXRhPgotICAgICAgICAgICAgICA8eG1sPmZhbHNlPC94bWw+Ci0gICAgICAgICAgICAgIDxmaWVsZE5hbWVzPmZhbHNlPC9maWVsZE5hbWVzPgotICAgICAgICAgICAgICA8cmVzcG9uc2VIZWFkZXJzPmZhbHNlPC9yZXNwb25zZUhlYWRlcnM+Ci0gICAgICAgICAgICAgIDxyZXF1ZXN0SGVhZGVycz5mYWxzZTwvcmVxdWVzdEhlYWRlcnM+Ci0gICAgICAgICAgICAgIDxyZXNwb25zZURhdGFPbkVycm9yPmZhbHNlPC9yZXNwb25zZURhdGFPbkVycm9yPgotICAgICAgICAgICAgICA8c2F2ZUFzc2VydGlvblJlc3VsdHNGYWlsdXJlTWVzc2FnZT5mYWxzZTwvc2F2ZUFzc2VydGlvblJlc3VsdHNGYWlsdXJlTWVzc2FnZT4KLSAgICAgICAgICAgICAgPGFzc2VydGlvbnNSZXN1bHRzVG9TYXZlPjA8L2Fzc2VydGlvbnNSZXN1bHRzVG9TYXZlPgotICAgICAgICAgICAgPC92YWx1ZT4KLSAgICAgICAgICAgIDxuYW1lPnNhdmVDb25maWc8L25hbWU+Ci0gICAgICAgICAgPC9vYmpQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9ImZpbGVuYW1lIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IlJlc3VsdENvbGxlY3Rvci5lcnJvcl9sb2dnaW5nIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgIDwvUmVzdWx0Q29sbGVjdG9yPgotICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgPC9oYXNoVHJlZT4KLSAgICAgIDxUaHJlYWRHcm91cCBndWljbGFzcz0iVGhyZWFkR3JvdXBHdWkiIHRlc3RjbGFzcz0iVGhyZWFkR3JvdXAiIHRlc3RuYW1lPSJMZW55YSB2aXNpdCIgZW5hYmxlZD0iZmFsc2UiPgotICAgICAgICA8bG9uZ1Byb3AgbmFtZT0iVGhyZWFkR3JvdXAuc3RhcnRfdGltZSI+MTE3ODc5Mjc0NDAwMDwvbG9uZ1Byb3A+Ci0gICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLmRlbGF5Ij48L3N0cmluZ1Byb3A+Ci0gICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLmR1cmF0aW9uIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLm51bV90aHJlYWRzIj41PC9zdHJpbmdQcm9wPgotICAgICAgICA8Ym9vbFByb3AgbmFtZT0iVGhyZWFkR3JvdXAuc2NoZWR1bGVyIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJUaHJlYWRHcm91cC5tYWluX2NvbnRyb2xsZXIiIGVsZW1lbnRUeXBlPSJMb29wQ29udHJvbGxlciIgZ3VpY2xhc3M9Ikxvb3BDb250cm9sUGFuZWwiIHRlc3RjbGFzcz0iTG9vcENvbnRyb2xsZXIiIHRlc3RuYW1lPSJDb250cm9sYWRvciBMb29wIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJMb29wQ29udHJvbGxlci5sb29wcyI+MTAwMDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iTG9vcENvbnRyb2xsZXIuY29udGludWVfZm9yZXZlciI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICA8bG9uZ1Byb3AgbmFtZT0iVGhyZWFkR3JvdXAuZW5kX3RpbWUiPjExNzg3OTI3NDQwMDA8L2xvbmdQcm9wPgotICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJUaHJlYWRHcm91cC5vbl9zYW1wbGVfZXJyb3IiPmNvbnRpbnVlPC9zdHJpbmdQcm9wPgotICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJUaHJlYWRHcm91cC5yYW1wX3RpbWUiPjYwPC9zdHJpbmdQcm9wPgotICAgICAgPC9UaHJlYWRHcm91cD4KLSAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgPENvb2tpZU1hbmFnZXIgZ3VpY2xhc3M9IkNvb2tpZVBhbmVsIiB0ZXN0Y2xhc3M9IkNvb2tpZU1hbmFnZXIiIHRlc3RuYW1lPSJDb29raWVzIEhUVFAiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJDb29raWVNYW5hZ2VyLmNsZWFyRWFjaEl0ZXJhdGlvbiI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkNvb2tpZU1hbmFnZXIuY29va2llcyIvPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkNvb2tpZU1hbmFnZXIucG9saWN5Ij5kZWZhdWx0PC9zdHJpbmdQcm9wPgotICAgICAgICA8L0Nvb2tpZU1hbmFnZXI+Ci0gICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgIDxDb25maWdUZXN0RWxlbWVudCBndWljbGFzcz0iSHR0cERlZmF1bHRzR3VpIiB0ZXN0Y2xhc3M9IkNvbmZpZ1Rlc3RFbGVtZW50IiB0ZXN0bmFtZT0iRGVmYXVsdCB2YWx1ZXMgZm9yIEhUVFAgcmVxdWVzdCIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucGF0aCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmRvbWFpbiI+JHtzZXJ2ZXJ9PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnByb3RvY29sIj5IVFRQPC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBvcnQiPjg4ODg8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkhUVFBzYW1wbGVyLkFyZ3VtZW50cyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkhUVFBBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMgZGVmaW5pZGFzIHBvciBlbCBVc3VhcmlvIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxjb2xsZWN0aW9uUHJvcCBuYW1lPSJBcmd1bWVudHMuYXJndW1lbnRzIi8+Ci0gICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgPC9Db25maWdUZXN0RWxlbWVudD4KLSAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgPENTVkRhdGFTZXQgZ3VpY2xhc3M9IlRlc3RCZWFuR1VJIiB0ZXN0Y2xhc3M9IkNTVkRhdGFTZXQiIHRlc3RuYW1lPSJDU1YgRGF0YSBTZXQiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9ImRlbGltaXRlciI+Ozwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJ2YXJpYWJsZU5hbWVzIj51c2VyLHBhc3M8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGJvb2xQcm9wIG5hbWU9InJlY3ljbGUiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9ImZpbGVuYW1lIj5sZW55YS5jc3Y8L3N0cmluZ1Byb3A+Ci0gICAgICAgIDwvQ1NWRGF0YVNldD4KLSAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgPEdhdXNzaWFuUmFuZG9tVGltZXIgZ3VpY2xhc3M9IkdhdXNzaWFuUmFuZG9tVGltZXJHdWkiIHRlc3RjbGFzcz0iR2F1c3NpYW5SYW5kb21UaW1lciIgdGVzdG5hbWU9IlJhbmRvbSB0aW1lciIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQ29uc3RhbnRUaW1lci5kZWxheSI+MTUwMDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSYW5kb21UaW1lci5yYW5nZSI+NTAwPC9zdHJpbmdQcm9wPgotICAgICAgICA8L0dhdXNzaWFuUmFuZG9tVGltZXI+Ci0gICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgIDxIVFRQU2FtcGxlciBndWljbGFzcz0iSHR0cFRlc3RTYW1wbGVHdWkiIHRlc3RjbGFzcz0iSFRUUFNhbXBsZXIiIHRlc3RuYW1lPSJMb2dpbiBwYWdlIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wYXRoIj4vZGVmYXVsdC9hdXRob3JpbmcvaW5kZXguaHRtbDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tZXRob2QiPkdFVDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIudXNlX2tlZXBhbGl2ZSI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucHJvdG9jb2wiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuZm9sbG93X3JlZGlyZWN0cyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucG9ydCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJIVFRQc2FtcGxlci5Bcmd1bWVudHMiIGVsZW1lbnRUeXBlPSJBcmd1bWVudHMiIGd1aWNsYXNzPSJIVFRQQXJndW1lbnRzUGFuZWwiIHRlc3RjbGFzcz0iQXJndW1lbnRzIiB0ZXN0bmFtZT0iVmFyaWFibGVzIGRlZmluaWRhcyBwb3IgZWwgVXN1YXJpbyIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iQXJndW1lbnRzLmFyZ3VtZW50cyIvPgotICAgICAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWltZXR5cGUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX0ZJRUxEIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubW9uaXRvciI+ZmFsc2U8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuZG9tYWluIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9OQU1FIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmF1dG9fcmVkaXJlY3RzIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgIDwvSFRUUFNhbXBsZXI+Ci0gICAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgICA8UmVnZXhFeHRyYWN0b3IgZ3VpY2xhc3M9IlJlZ2V4RXh0cmFjdG9yR3VpIiB0ZXN0Y2xhc3M9IlJlZ2V4RXh0cmFjdG9yIiB0ZXN0bmFtZT0icmVnZXgiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iUmVnZXhFeHRyYWN0b3IuZGVmYXVsdCI+ZXJyb3I8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5yZWdleCI+bGVueWEuY29udGludWF0aW9uPSguKj8pJmFtcDthbXA7bGVueWEudXNlY2FzZT1hYy5sb2dpbiZxdW90OyZndDs8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci51c2VIZWFkZXJzIj5mYWxzZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLm1hdGNoX251bWJlciI+MDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlJlZ2V4RXh0cmFjdG9yLnRlbXBsYXRlIj4kMSQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJSZWdleEV4dHJhY3Rvci5yZWZuYW1lIj5sZW55YS5jb250aW51YXRpb248L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPC9SZWdleEV4dHJhY3Rvcj4KLSAgICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICA8L2hhc2hUcmVlPgotICAgICAgICA8SFRUUFNhbXBsZXIgZ3VpY2xhc3M9Ikh0dHBUZXN0U2FtcGxlR3VpIiB0ZXN0Y2xhc3M9IkhUVFBTYW1wbGVyIiB0ZXN0bmFtZT0iTG9naW4gcGFnZSIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucGF0aCI+L2RlZmF1bHQvYXV0aG9yaW5nL2ptZXRlci5odG1sP2xlbnlhLnVzZWNhc2U9YWMubG9naW4mYW1wO2xlbnlhLmNvbnRpbnVhdGlvbj0ke2xlbnlhLmNvbnRpbnVhdGlvbn08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5QT1NUPC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci51c2Vfa2VlcGFsaXZlIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wcm90b2NvbCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5mb2xsb3dfcmVkaXJlY3RzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wb3J0Ij48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkhUVFBzYW1wbGVyLkFyZ3VtZW50cyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkhUVFBBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMgZGVmaW5pZGFzIHBvciBlbCBVc3VhcmlvIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxjb2xsZWN0aW9uUHJvcCBuYW1lPSJBcmd1bWVudHMuYXJndW1lbnRzIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPiR7dXNlcn08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5uYW1lIj51c2VybmFtZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPiR7cGFzc308L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBBcmd1bWVudC51c2VfZXF1YWxzIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJBcmd1bWVudC5uYW1lIj5wYXNzd29yZDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUEFyZ3VtZW50LmFsd2F5c19lbmNvZGUiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhUVFBBcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubWV0YWRhdGEiPj08L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQudmFsdWUiPkxvZ2luPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQudXNlX2VxdWFscyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iQXJndW1lbnQubmFtZSI+c3VibWl0PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQQXJndW1lbnQuYWx3YXlzX2VuY29kZSI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgPC9jb2xsZWN0aW9uUHJvcD4KLSAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1pbWV0eXBlIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9GSUVMRCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1vbml0b3IiPmZhbHNlPC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmRvbWFpbiI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfTkFNRSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5hdXRvX3JlZGlyZWN0cyI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICA8L0hUVFBTYW1wbGVyPgotICAgICAgICA8aGFzaFRyZWU+Ci0gICAgICAgICAgPEhlYWRlck1hbmFnZXIgZ3VpY2xhc3M9IkhlYWRlclBhbmVsIiB0ZXN0Y2xhc3M9IkhlYWRlck1hbmFnZXIiIHRlc3RuYW1lPSJIVFRQIGhlYWRlciIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iSGVhZGVyTWFuYWdlci5oZWFkZXJzIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IiIgZWxlbWVudFR5cGU9IkhlYWRlciI+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSGVhZGVyLnZhbHVlIj5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSGVhZGVyLm5hbWUiPkNvbnRlbnQtVHlwZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgIDwvY29sbGVjdGlvblByb3A+Ci0gICAgICAgICAgPC9IZWFkZXJNYW5hZ2VyPgotICAgICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgIDwvaGFzaFRyZWU+Ci0gICAgICAgIDxJbnRlcmxlYXZlQ29udHJvbCBndWljbGFzcz0iSW50ZXJsZWF2ZUNvbnRyb2xHdWkiIHRlc3RjbGFzcz0iSW50ZXJsZWF2ZUNvbnRyb2wiIHRlc3RuYW1lPSJJbnRlcmxlYXZlIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICA8aW50UHJvcCBuYW1lPSJJbnRlcmxlYXZlQ29udHJvbC5zdHlsZSI+MTwvaW50UHJvcD4KLSAgICAgICAgPC9JbnRlcmxlYXZlQ29udHJvbD4KLSAgICAgICAgPGhhc2hUcmVlPgotICAgICAgICAgIDxHZW5lcmljQ29udHJvbGxlciBndWljbGFzcz0iTG9naWNDb250cm9sbGVyR3VpIiB0ZXN0Y2xhc3M9IkdlbmVyaWNDb250cm9sbGVyIiB0ZXN0bmFtZT0iTmV3cyIgZW5hYmxlZD0idHJ1ZSIvPgotICAgICAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgICAgIDxIVFRQU2FtcGxlciBndWljbGFzcz0iSHR0cFRlc3RTYW1wbGVHdWkiIHRlc3RjbGFzcz0iSFRUUFNhbXBsZXIiIHRlc3RuYW1lPSJzdGF0aWMgcGFnZSIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBhdGgiPi9kZWZhdWx0L2F1dGhvcmluZy9qbWV0ZXIvTm90aWNpYTEuaHRtbDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5HRVQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci51c2Vfa2VlcGFsaXZlIj50cnVlPC9ib29sUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucHJvdG9jb2wiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmZvbGxvd19yZWRpcmVjdHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wb3J0Ij48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJIVFRQc2FtcGxlci5Bcmd1bWVudHMiIGVsZW1lbnRUeXBlPSJBcmd1bWVudHMiIGd1aWNsYXNzPSJIVFRQQXJndW1lbnRzUGFuZWwiIHRlc3RjbGFzcz0iQXJndW1lbnRzIiB0ZXN0bmFtZT0iVmFyaWFibGVzIGRlZmluaWRhcyBwb3IgZWwgVXN1YXJpbyIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiLz4KLSAgICAgICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWltZXR5cGUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9GSUVMRCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tb25pdG9yIj5mYWxzZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuZG9tYWluIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfTkFNRSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuYXV0b19yZWRpcmVjdHMiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgICAgIDwvSFRUUFNhbXBsZXI+Ci0gICAgICAgICAgICA8aGFzaFRyZWUvPgotICAgICAgICAgICAgPEhUVFBTYW1wbGVyIGd1aWNsYXNzPSJIdHRwVGVzdFNhbXBsZUd1aSIgdGVzdGNsYXNzPSJIVFRQU2FtcGxlciIgdGVzdG5hbWU9IkR5bmFtaWMgcGFnZSIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBhdGgiPi9kZWZhdWx0L2F1dGhvcmluZy9qbWV0ZXIvTm90aWNpYSR7X19SYW5kb20oMSw1MCwpfS5odG1sPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tZXRob2QiPkdFVDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnVzZV9rZWVwYWxpdmUiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5wcm90b2NvbCI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuZm9sbG93X3JlZGlyZWN0cyI+dHJ1ZTwvYm9vbFByb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBvcnQiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkhUVFBzYW1wbGVyLkFyZ3VtZW50cyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkhUVFBBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMgZGVmaW5pZGFzIHBvciBlbCBVc3VhcmlvIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8Y29sbGVjdGlvblByb3AgbmFtZT0iQXJndW1lbnRzLmFyZ3VtZW50cyIvPgotICAgICAgICAgICAgICA8L2VsZW1lbnRQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5taW1ldHlwZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX0ZJRUxEIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLm1vbml0b3IiPmZhbHNlPC9zdHJpbmdQcm9wPgotICAgICAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5kb21haW4iPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIuRklMRV9OQU1FIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5hdXRvX3JlZGlyZWN0cyI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICAgICAgPC9IVFRQU2FtcGxlcj4KLSAgICAgICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgICAgPC9oYXNoVHJlZT4KLSAgICAgICAgICA8R2VuZXJpY0NvbnRyb2xsZXIgZ3VpY2xhc3M9IkxvZ2ljQ29udHJvbGxlckd1aSIgdGVzdGNsYXNzPSJHZW5lcmljQ29udHJvbGxlciIgdGVzdG5hbWU9IkZpbGVzIiBlbmFibGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgPC9oYXNoVHJlZT4KLSAgICAgICAgPFJlc3VsdENvbGxlY3RvciBndWljbGFzcz0iU3RhdFZpc3VhbGl6ZXIiIHRlc3RjbGFzcz0iUmVzdWx0Q29sbGVjdG9yIiB0ZXN0bmFtZT0iUmVwb3J0IiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICA8b2JqUHJvcD4KLSAgICAgICAgICAgIDx2YWx1ZSBjbGFzcz0iU2FtcGxlU2F2ZUNvbmZpZ3VyYXRpb24iPgotICAgICAgICAgICAgICA8dGltZT50cnVlPC90aW1lPgotICAgICAgICAgICAgICA8bGF0ZW5jeT50cnVlPC9sYXRlbmN5PgotICAgICAgICAgICAgICA8dGltZXN0YW1wPnRydWU8L3RpbWVzdGFtcD4KLSAgICAgICAgICAgICAgPHN1Y2Nlc3M+dHJ1ZTwvc3VjY2Vzcz4KLSAgICAgICAgICAgICAgPGxhYmVsPnRydWU8L2xhYmVsPgotICAgICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPgotICAgICAgICAgICAgICA8bWVzc2FnZT50cnVlPC9tZXNzYWdlPgotICAgICAgICAgICAgICA8dGhyZWFkTmFtZT50cnVlPC90aHJlYWROYW1lPgotICAgICAgICAgICAgICA8ZGF0YVR5cGU+dHJ1ZTwvZGF0YVR5cGU+Ci0gICAgICAgICAgICAgIDxlbmNvZGluZz5mYWxzZTwvZW5jb2Rpbmc+Ci0gICAgICAgICAgICAgIDxhc3NlcnRpb25zPnRydWU8L2Fzc2VydGlvbnM+Ci0gICAgICAgICAgICAgIDxzdWJyZXN1bHRzPnRydWU8L3N1YnJlc3VsdHM+Ci0gICAgICAgICAgICAgIDxyZXNwb25zZURhdGE+ZmFsc2U8L3Jlc3BvbnNlRGF0YT4KLSAgICAgICAgICAgICAgPHNhbXBsZXJEYXRhPmZhbHNlPC9zYW1wbGVyRGF0YT4KLSAgICAgICAgICAgICAgPHhtbD5mYWxzZTwveG1sPgotICAgICAgICAgICAgICA8ZmllbGROYW1lcz5mYWxzZTwvZmllbGROYW1lcz4KLSAgICAgICAgICAgICAgPHJlc3BvbnNlSGVhZGVycz5mYWxzZTwvcmVzcG9uc2VIZWFkZXJzPgotICAgICAgICAgICAgICA8cmVxdWVzdEhlYWRlcnM+ZmFsc2U8L3JlcXVlc3RIZWFkZXJzPgotICAgICAgICAgICAgICA8cmVzcG9uc2VEYXRhT25FcnJvcj5mYWxzZTwvcmVzcG9uc2VEYXRhT25FcnJvcj4KLSAgICAgICAgICAgICAgPHNhdmVBc3NlcnRpb25SZXN1bHRzRmFpbHVyZU1lc3NhZ2U+ZmFsc2U8L3NhdmVBc3NlcnRpb25SZXN1bHRzRmFpbHVyZU1lc3NhZ2U+Ci0gICAgICAgICAgICAgIDxhc3NlcnRpb25zUmVzdWx0c1RvU2F2ZT4wPC9hc3NlcnRpb25zUmVzdWx0c1RvU2F2ZT4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgICA8bmFtZT5zYXZlQ29uZmlnPC9uYW1lPgotICAgICAgICAgIDwvb2JqUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJmaWxlbmFtZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJSZXN1bHRDb2xsZWN0b3IuZXJyb3JfbG9nZ2luZyI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICA8L1Jlc3VsdENvbGxlY3Rvcj4KLSAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgPFJlc3VsdENvbGxlY3RvciBndWljbGFzcz0iVmlld1Jlc3VsdHNGdWxsVmlzdWFsaXplciIgdGVzdGNsYXNzPSJSZXN1bHRDb2xsZWN0b3IiIHRlc3RuYW1lPSJSZXN1bHQgdHJlZSIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPG9ialByb3A+Ci0gICAgICAgICAgICA8dmFsdWUgY2xhc3M9IlNhbXBsZVNhdmVDb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgICAgPHRpbWU+dHJ1ZTwvdGltZT4KLSAgICAgICAgICAgICAgPGxhdGVuY3k+dHJ1ZTwvbGF0ZW5jeT4KLSAgICAgICAgICAgICAgPHRpbWVzdGFtcD50cnVlPC90aW1lc3RhbXA+Ci0gICAgICAgICAgICAgIDxzdWNjZXNzPnRydWU8L3N1Y2Nlc3M+Ci0gICAgICAgICAgICAgIDxsYWJlbD50cnVlPC9sYWJlbD4KLSAgICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgICAgICAgICAgPG1lc3NhZ2U+dHJ1ZTwvbWVzc2FnZT4KLSAgICAgICAgICAgICAgPHRocmVhZE5hbWU+dHJ1ZTwvdGhyZWFkTmFtZT4KLSAgICAgICAgICAgICAgPGRhdGFUeXBlPnRydWU8L2RhdGFUeXBlPgotICAgICAgICAgICAgICA8ZW5jb2Rpbmc+ZmFsc2U8L2VuY29kaW5nPgotICAgICAgICAgICAgICA8YXNzZXJ0aW9ucz50cnVlPC9hc3NlcnRpb25zPgotICAgICAgICAgICAgICA8c3VicmVzdWx0cz50cnVlPC9zdWJyZXN1bHRzPgotICAgICAgICAgICAgICA8cmVzcG9uc2VEYXRhPmZhbHNlPC9yZXNwb25zZURhdGE+Ci0gICAgICAgICAgICAgIDxzYW1wbGVyRGF0YT5mYWxzZTwvc2FtcGxlckRhdGE+Ci0gICAgICAgICAgICAgIDx4bWw+ZmFsc2U8L3htbD4KLSAgICAgICAgICAgICAgPGZpZWxkTmFtZXM+ZmFsc2U8L2ZpZWxkTmFtZXM+Ci0gICAgICAgICAgICAgIDxyZXNwb25zZUhlYWRlcnM+ZmFsc2U8L3Jlc3BvbnNlSGVhZGVycz4KLSAgICAgICAgICAgICAgPHJlcXVlc3RIZWFkZXJzPmZhbHNlPC9yZXF1ZXN0SGVhZGVycz4KLSAgICAgICAgICAgICAgPHJlc3BvbnNlRGF0YU9uRXJyb3I+ZmFsc2U8L3Jlc3BvbnNlRGF0YU9uRXJyb3I+Ci0gICAgICAgICAgICAgIDxzYXZlQXNzZXJ0aW9uUmVzdWx0c0ZhaWx1cmVNZXNzYWdlPmZhbHNlPC9zYXZlQXNzZXJ0aW9uUmVzdWx0c0ZhaWx1cmVNZXNzYWdlPgotICAgICAgICAgICAgICA8YXNzZXJ0aW9uc1Jlc3VsdHNUb1NhdmU+MDwvYXNzZXJ0aW9uc1Jlc3VsdHNUb1NhdmU+Ci0gICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPG5hbWU+c2F2ZUNvbmZpZzwvbmFtZT4KLSAgICAgICAgICA8L29ialByb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iZmlsZW5hbWUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iUmVzdWx0Q29sbGVjdG9yLmVycm9yX2xvZ2dpbmciPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgPC9SZXN1bHRDb2xsZWN0b3I+Ci0gICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICA8L2hhc2hUcmVlPgotICAgIDwvaGFzaFRyZWU+Ci0gIDwvaGFzaFRyZWU+Ci08L2ptZXRlclRlc3RQbGFuPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9qbWV0ZXIvc2ltcGxlTG9hZC5qbXggYi90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2ptZXRlci9zaW1wbGVMb2FkLmpteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkZGY2Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9kZXZlbG9wbWVudC90ZXN0L2ptZXRlci9zaW1wbGVMb2FkLmpteAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08am1ldGVyVGVzdFBsYW4gdmVyc2lvbj0iMS4yIiBwcm9wZXJ0aWVzPSIxLjgiPgotICA8aGFzaFRyZWU+Ci0gICAgPFRlc3RQbGFuIGd1aWNsYXNzPSJUZXN0UGxhbkd1aSIgdGVzdGNsYXNzPSJUZXN0UGxhbiIgdGVzdG5hbWU9IlRlc3QgUGxhbiIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICA8ZWxlbWVudFByb3AgbmFtZT0iVGVzdFBsYW4udXNlcl9kZWZpbmVkX3ZhcmlhYmxlcyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkFyZ3VtZW50c1BhbmVsIiB0ZXN0Y2xhc3M9IkFyZ3VtZW50cyIgdGVzdG5hbWU9IkJlbnV0emVyIGRlZmluaWVydGUgVmFyaWFibGVuIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgPGNvbGxlY3Rpb25Qcm9wIG5hbWU9IkFyZ3VtZW50cy5hcmd1bWVudHMiLz4KLSAgICAgIDwvZWxlbWVudFByb3A+Ci0gICAgICA8c3RyaW5nUHJvcCBuYW1lPSJUZXN0UGxhbi51c2VyX2RlZmluZV9jbGFzc3BhdGgiPjwvc3RyaW5nUHJvcD4KLSAgICAgIDxib29sUHJvcCBuYW1lPSJUZXN0UGxhbi5zZXJpYWxpemVfdGhyZWFkZ3JvdXBzIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICA8Ym9vbFByb3AgbmFtZT0iVGVzdFBsYW4uZnVuY3Rpb25hbF9tb2RlIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICA8c3RyaW5nUHJvcCBuYW1lPSJUZXN0UGxhbi5jb21tZW50cyI+PC9zdHJpbmdQcm9wPgotICAgIDwvVGVzdFBsYW4+Ci0gICAgPGhhc2hUcmVlPgotICAgICAgPFRocmVhZEdyb3VwIGd1aWNsYXNzPSJUaHJlYWRHcm91cEd1aSIgdGVzdGNsYXNzPSJUaHJlYWRHcm91cCIgdGVzdG5hbWU9IlRocmVhZCBHcnVwcGUiIGVuYWJsZWQ9InRydWUiPgotICAgICAgICA8bG9uZ1Byb3AgbmFtZT0iVGhyZWFkR3JvdXAuc3RhcnRfdGltZSI+MTE3ODc5Mjc0NDAwMDwvbG9uZ1Byb3A+Ci0gICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLmRlbGF5Ij48L3N0cmluZ1Byb3A+Ci0gICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLmR1cmF0aW9uIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLm51bV90aHJlYWRzIj4xPC9zdHJpbmdQcm9wPgotICAgICAgICA8Ym9vbFByb3AgbmFtZT0iVGhyZWFkR3JvdXAuc2NoZWR1bGVyIj5mYWxzZTwvYm9vbFByb3A+Ci0gICAgICAgIDxlbGVtZW50UHJvcCBuYW1lPSJUaHJlYWRHcm91cC5tYWluX2NvbnRyb2xsZXIiIGVsZW1lbnRUeXBlPSJMb29wQ29udHJvbGxlciIgZ3VpY2xhc3M9Ikxvb3BDb250cm9sUGFuZWwiIHRlc3RjbGFzcz0iTG9vcENvbnRyb2xsZXIiIHRlc3RuYW1lPSJDb250cm9sYWRvciBMb29wIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJMb29wQ29udHJvbGxlci5sb29wcyI+MjA8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGJvb2xQcm9wIG5hbWU9Ikxvb3BDb250cm9sbGVyLmNvbnRpbnVlX2ZvcmV2ZXIiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgPGxvbmdQcm9wIG5hbWU9IlRocmVhZEdyb3VwLmVuZF90aW1lIj4xMTc4NzkyNzQ0MDAwPC9sb25nUHJvcD4KLSAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iVGhyZWFkR3JvdXAub25fc2FtcGxlX2Vycm9yIj5jb250aW51ZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iVGhyZWFkR3JvdXAucmFtcF90aW1lIj4xPC9zdHJpbmdQcm9wPgotICAgICAgPC9UaHJlYWRHcm91cD4KLSAgICAgIDxoYXNoVHJlZT4KLSAgICAgICAgPEhUVFBTYW1wbGVyIGd1aWNsYXNzPSJIdHRwVGVzdFNhbXBsZUd1aSIgdGVzdGNsYXNzPSJIVFRQU2FtcGxlciIgdGVzdG5hbWU9IkhUVFAgUmVxdWVzdCIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIucGF0aCI+L2RlZmF1bHQvYXV0aG9yaW5nL2luZGV4Lmh0bWw8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iSFRUUFNhbXBsZXIubWV0aG9kIj5HRVQ8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnVzZV9rZWVwYWxpdmUiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnByb3RvY29sIj48L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGJvb2xQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLmZvbGxvd19yZWRpcmVjdHMiPnRydWU8L2Jvb2xQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLnBvcnQiPjg4ODg8L3N0cmluZ1Byb3A+Ci0gICAgICAgICAgPGVsZW1lbnRQcm9wIG5hbWU9IkhUVFBzYW1wbGVyLkFyZ3VtZW50cyIgZWxlbWVudFR5cGU9IkFyZ3VtZW50cyIgZ3VpY2xhc3M9IkhUVFBBcmd1bWVudHNQYW5lbCIgdGVzdGNsYXNzPSJBcmd1bWVudHMiIHRlc3RuYW1lPSJWYXJpYWJsZXMgZGVmaW5pZGFzIHBvciBlbCBVc3VhcmlvIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxjb2xsZWN0aW9uUHJvcCBuYW1lPSJBcmd1bWVudHMuYXJndW1lbnRzIi8+Ci0gICAgICAgICAgPC9lbGVtZW50UHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5taW1ldHlwZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxzdHJpbmdQcm9wIG5hbWU9IkhUVFBTYW1wbGVyLkZJTEVfRklFTEQiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5tb25pdG9yIj5mYWxzZTwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5kb21haW4iPmxvY2FsaG9zdDwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJIVFRQU2FtcGxlci5GSUxFX05BTUUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iSFRUUFNhbXBsZXIuYXV0b19yZWRpcmVjdHMiPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgPC9IVFRQU2FtcGxlcj4KLSAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgPFJlc3VsdENvbGxlY3RvciBndWljbGFzcz0iU3VtbWFyeVJlcG9ydCIgdGVzdGNsYXNzPSJSZXN1bHRDb2xsZWN0b3IiIHRlc3RuYW1lPSJTdW1tYXJ5IFJlcG9ydCIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPG9ialByb3A+Ci0gICAgICAgICAgICA8dmFsdWUgY2xhc3M9IlNhbXBsZVNhdmVDb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgICAgPHRpbWU+dHJ1ZTwvdGltZT4KLSAgICAgICAgICAgICAgPGxhdGVuY3k+dHJ1ZTwvbGF0ZW5jeT4KLSAgICAgICAgICAgICAgPHRpbWVzdGFtcD50cnVlPC90aW1lc3RhbXA+Ci0gICAgICAgICAgICAgIDxzdWNjZXNzPnRydWU8L3N1Y2Nlc3M+Ci0gICAgICAgICAgICAgIDxsYWJlbD50cnVlPC9sYWJlbD4KLSAgICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgICAgICAgICAgPG1lc3NhZ2U+dHJ1ZTwvbWVzc2FnZT4KLSAgICAgICAgICAgICAgPHRocmVhZE5hbWU+dHJ1ZTwvdGhyZWFkTmFtZT4KLSAgICAgICAgICAgICAgPGRhdGFUeXBlPnRydWU8L2RhdGFUeXBlPgotICAgICAgICAgICAgICA8ZW5jb2Rpbmc+ZmFsc2U8L2VuY29kaW5nPgotICAgICAgICAgICAgICA8YXNzZXJ0aW9ucz50cnVlPC9hc3NlcnRpb25zPgotICAgICAgICAgICAgICA8c3VicmVzdWx0cz50cnVlPC9zdWJyZXN1bHRzPgotICAgICAgICAgICAgICA8cmVzcG9uc2VEYXRhPmZhbHNlPC9yZXNwb25zZURhdGE+Ci0gICAgICAgICAgICAgIDxzYW1wbGVyRGF0YT5mYWxzZTwvc2FtcGxlckRhdGE+Ci0gICAgICAgICAgICAgIDx4bWw+ZmFsc2U8L3htbD4KLSAgICAgICAgICAgICAgPGZpZWxkTmFtZXM+ZmFsc2U8L2ZpZWxkTmFtZXM+Ci0gICAgICAgICAgICAgIDxyZXNwb25zZUhlYWRlcnM+ZmFsc2U8L3Jlc3BvbnNlSGVhZGVycz4KLSAgICAgICAgICAgICAgPHJlcXVlc3RIZWFkZXJzPmZhbHNlPC9yZXF1ZXN0SGVhZGVycz4KLSAgICAgICAgICAgICAgPHJlc3BvbnNlRGF0YU9uRXJyb3I+ZmFsc2U8L3Jlc3BvbnNlRGF0YU9uRXJyb3I+Ci0gICAgICAgICAgICAgIDxzYXZlQXNzZXJ0aW9uUmVzdWx0c0ZhaWx1cmVNZXNzYWdlPmZhbHNlPC9zYXZlQXNzZXJ0aW9uUmVzdWx0c0ZhaWx1cmVNZXNzYWdlPgotICAgICAgICAgICAgICA8YXNzZXJ0aW9uc1Jlc3VsdHNUb1NhdmU+MDwvYXNzZXJ0aW9uc1Jlc3VsdHNUb1NhdmU+Ci0gICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPG5hbWU+c2F2ZUNvbmZpZzwvbmFtZT4KLSAgICAgICAgICA8L29ialByb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iZmlsZW5hbWUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iUmVzdWx0Q29sbGVjdG9yLmVycm9yX2xvZ2dpbmciPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgPC9SZXN1bHRDb2xsZWN0b3I+Ci0gICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICAgIDxSZXN1bHRDb2xsZWN0b3IgZ3VpY2xhc3M9IkdyYXBoVmlzdWFsaXplciIgdGVzdGNsYXNzPSJSZXN1bHRDb2xsZWN0b3IiIHRlc3RuYW1lPSJHcmFwaCBSZXN1bHRzIiBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICAgICA8b2JqUHJvcD4KLSAgICAgICAgICAgIDx2YWx1ZSBjbGFzcz0iU2FtcGxlU2F2ZUNvbmZpZ3VyYXRpb24iPgotICAgICAgICAgICAgICA8dGltZT50cnVlPC90aW1lPgotICAgICAgICAgICAgICA8bGF0ZW5jeT50cnVlPC9sYXRlbmN5PgotICAgICAgICAgICAgICA8dGltZXN0YW1wPnRydWU8L3RpbWVzdGFtcD4KLSAgICAgICAgICAgICAgPHN1Y2Nlc3M+dHJ1ZTwvc3VjY2Vzcz4KLSAgICAgICAgICAgICAgPGxhYmVsPnRydWU8L2xhYmVsPgotICAgICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPgotICAgICAgICAgICAgICA8bWVzc2FnZT50cnVlPC9tZXNzYWdlPgotICAgICAgICAgICAgICA8dGhyZWFkTmFtZT50cnVlPC90aHJlYWROYW1lPgotICAgICAgICAgICAgICA8ZGF0YVR5cGU+dHJ1ZTwvZGF0YVR5cGU+Ci0gICAgICAgICAgICAgIDxlbmNvZGluZz5mYWxzZTwvZW5jb2Rpbmc+Ci0gICAgICAgICAgICAgIDxhc3NlcnRpb25zPnRydWU8L2Fzc2VydGlvbnM+Ci0gICAgICAgICAgICAgIDxzdWJyZXN1bHRzPnRydWU8L3N1YnJlc3VsdHM+Ci0gICAgICAgICAgICAgIDxyZXNwb25zZURhdGE+ZmFsc2U8L3Jlc3BvbnNlRGF0YT4KLSAgICAgICAgICAgICAgPHNhbXBsZXJEYXRhPmZhbHNlPC9zYW1wbGVyRGF0YT4KLSAgICAgICAgICAgICAgPHhtbD5mYWxzZTwveG1sPgotICAgICAgICAgICAgICA8ZmllbGROYW1lcz5mYWxzZTwvZmllbGROYW1lcz4KLSAgICAgICAgICAgICAgPHJlc3BvbnNlSGVhZGVycz5mYWxzZTwvcmVzcG9uc2VIZWFkZXJzPgotICAgICAgICAgICAgICA8cmVxdWVzdEhlYWRlcnM+ZmFsc2U8L3JlcXVlc3RIZWFkZXJzPgotICAgICAgICAgICAgICA8cmVzcG9uc2VEYXRhT25FcnJvcj5mYWxzZTwvcmVzcG9uc2VEYXRhT25FcnJvcj4KLSAgICAgICAgICAgICAgPHNhdmVBc3NlcnRpb25SZXN1bHRzRmFpbHVyZU1lc3NhZ2U+ZmFsc2U8L3NhdmVBc3NlcnRpb25SZXN1bHRzRmFpbHVyZU1lc3NhZ2U+Ci0gICAgICAgICAgICAgIDxhc3NlcnRpb25zUmVzdWx0c1RvU2F2ZT4wPC9hc3NlcnRpb25zUmVzdWx0c1RvU2F2ZT4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgICA8bmFtZT5zYXZlQ29uZmlnPC9uYW1lPgotICAgICAgICAgIDwvb2JqUHJvcD4KLSAgICAgICAgICA8c3RyaW5nUHJvcCBuYW1lPSJmaWxlbmFtZSI+PC9zdHJpbmdQcm9wPgotICAgICAgICAgIDxib29sUHJvcCBuYW1lPSJSZXN1bHRDb2xsZWN0b3IuZXJyb3JfbG9nZ2luZyI+ZmFsc2U8L2Jvb2xQcm9wPgotICAgICAgICA8L1Jlc3VsdENvbGxlY3Rvcj4KLSAgICAgICAgPGhhc2hUcmVlLz4KLSAgICAgICAgPFJlc3VsdENvbGxlY3RvciBndWljbGFzcz0iVmlld1Jlc3VsdHNGdWxsVmlzdWFsaXplciIgdGVzdGNsYXNzPSJSZXN1bHRDb2xsZWN0b3IiIHRlc3RuYW1lPSJWaWV3IFJlc3VsdHMgVHJlZSIgZW5hYmxlZD0idHJ1ZSI+Ci0gICAgICAgICAgPG9ialByb3A+Ci0gICAgICAgICAgICA8dmFsdWUgY2xhc3M9IlNhbXBsZVNhdmVDb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgICAgPHRpbWU+dHJ1ZTwvdGltZT4KLSAgICAgICAgICAgICAgPGxhdGVuY3k+dHJ1ZTwvbGF0ZW5jeT4KLSAgICAgICAgICAgICAgPHRpbWVzdGFtcD50cnVlPC90aW1lc3RhbXA+Ci0gICAgICAgICAgICAgIDxzdWNjZXNzPnRydWU8L3N1Y2Nlc3M+Ci0gICAgICAgICAgICAgIDxsYWJlbD50cnVlPC9sYWJlbD4KLSAgICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgICAgICAgICAgPG1lc3NhZ2U+dHJ1ZTwvbWVzc2FnZT4KLSAgICAgICAgICAgICAgPHRocmVhZE5hbWU+dHJ1ZTwvdGhyZWFkTmFtZT4KLSAgICAgICAgICAgICAgPGRhdGFUeXBlPnRydWU8L2RhdGFUeXBlPgotICAgICAgICAgICAgICA8ZW5jb2Rpbmc+ZmFsc2U8L2VuY29kaW5nPgotICAgICAgICAgICAgICA8YXNzZXJ0aW9ucz50cnVlPC9hc3NlcnRpb25zPgotICAgICAgICAgICAgICA8c3VicmVzdWx0cz50cnVlPC9zdWJyZXN1bHRzPgotICAgICAgICAgICAgICA8cmVzcG9uc2VEYXRhPmZhbHNlPC9yZXNwb25zZURhdGE+Ci0gICAgICAgICAgICAgIDxzYW1wbGVyRGF0YT5mYWxzZTwvc2FtcGxlckRhdGE+Ci0gICAgICAgICAgICAgIDx4bWw+ZmFsc2U8L3htbD4KLSAgICAgICAgICAgICAgPGZpZWxkTmFtZXM+ZmFsc2U8L2ZpZWxkTmFtZXM+Ci0gICAgICAgICAgICAgIDxyZXNwb25zZUhlYWRlcnM+ZmFsc2U8L3Jlc3BvbnNlSGVhZGVycz4KLSAgICAgICAgICAgICAgPHJlcXVlc3RIZWFkZXJzPmZhbHNlPC9yZXF1ZXN0SGVhZGVycz4KLSAgICAgICAgICAgICAgPHJlc3BvbnNlRGF0YU9uRXJyb3I+ZmFsc2U8L3Jlc3BvbnNlRGF0YU9uRXJyb3I+Ci0gICAgICAgICAgICAgIDxzYXZlQXNzZXJ0aW9uUmVzdWx0c0ZhaWx1cmVNZXNzYWdlPmZhbHNlPC9zYXZlQXNzZXJ0aW9uUmVzdWx0c0ZhaWx1cmVNZXNzYWdlPgotICAgICAgICAgICAgICA8YXNzZXJ0aW9uc1Jlc3VsdHNUb1NhdmU+MDwvYXNzZXJ0aW9uc1Jlc3VsdHNUb1NhdmU+Ci0gICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPG5hbWU+c2F2ZUNvbmZpZzwvbmFtZT4KLSAgICAgICAgICA8L29ialByb3A+Ci0gICAgICAgICAgPHN0cmluZ1Byb3AgbmFtZT0iZmlsZW5hbWUiPjwvc3RyaW5nUHJvcD4KLSAgICAgICAgICA8Ym9vbFByb3AgbmFtZT0iUmVzdWx0Q29sbGVjdG9yLmVycm9yX2xvZ2dpbmciPmZhbHNlPC9ib29sUHJvcD4KLSAgICAgICAgPC9SZXN1bHRDb2xsZWN0b3I+Ci0gICAgICAgIDxoYXNoVHJlZS8+Ci0gICAgICA8L2hhc2hUcmVlPgotICAgIDwvaGFzaFRyZWU+Ci0gIDwvaGFzaFRyZWU+Ci08L2ptZXRlclRlc3RQbGFuPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY3JlYXRlUmVzb3VyY2UueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jcmVhdGVSZXNvdXJjZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxOTg1OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jcmVhdGVSZXNvdXJjZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZWRpdG9ycy5jcmVhdGVSZXNvdXJjZSddIj4KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSAKLSAgICAgIG5hbWU9ImVkaXRvcnMuY3JlYXRlUmVzb3VyY2UiIAotICAgICAgbG9nZ2VyPSJsZW55YS5zaXRlIiAKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLkNyZWF0ZVJlc291cmNlIgotICA+Ci0gICAgPHZpZXcgdXJpPSJtb2R1bGVzL3Jlc291cmNlL3VzZWNhc2VzL2NyZWF0ZS1yZXNvdXJjZS5qeCIgbWVudT0iZmFsc2UiLz4KLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtZWRpdC1mb3Jtcy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWVkaXQtZm9ybXMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWZkMDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtZWRpdC1mb3Jtcy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdlZGl0b3JzLmZvcm1zJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImVkaXRvcnMuZm9ybXMiIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmVkaXRvcnMuZm9ybXMuRm9ybXNFZGl0b3IiPg0KLSAgICAgIDx0cmFuc2FjdGlvbiBwb2xpY3k9InBlc3NpbWlzdGljIi8+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvZm9ybXMuangiIG1lbnU9ImZhbHNlIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1lZGl0LW9uZWZvcm0ueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1lZGl0LW9uZWZvcm0ueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTg4OTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtZWRpdC1vbmVmb3JtLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2VkaXRvcnMub25lZm9ybSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJlZGl0b3JzLm9uZWZvcm0iIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmVkaXRvcnMuZm9ybXMuT25lRm9ybUVkaXRvciI+DQotICAgICAgPHRyYW5zYWN0aW9uIHBvbGljeT0icGVzc2ltaXN0aWMiLz4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9mb3Jtcy9vbmVmb3JtLmp4IiBtZW51PSJmYWxzZSIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW5zZXJ0QXNzZXQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbnNlcnRBc3NldC54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiZTcxNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbnNlcnRBc3NldC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZWRpdG9ycy5pbnNlcnRBc3NldCddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIAotICAgICAgbmFtZT0iZWRpdG9ycy5pbnNlcnRBc3NldCIKLSAgICAgIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy5JbnNlcnRBc3NldCIKLSAgPgotICAgIDx2aWV3IAotICAgICAgdGVtcGxhdGU9Im1vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9pbnNlcnRBc3NldC5qeCIgCi0gICAgICBtZW51PSJmYWxzZSIKLSAgICAgIGNyZWF0ZUNvbnRpbnVhdGlvbj0iZmFsc2UiCi0gICAgLz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHZhbHVlPSJBc3NldCIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXNzZXQtdXNlY2FzZSIgdmFsdWU9InRhYi5hc3NldCIvPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLQotPC94Y29uZj4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW5zZXJ0SW1hZ2UueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbnNlcnRJbWFnZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxNjVjNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbnNlcnRJbWFnZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZWRpdG9ycy5pbnNlcnRJbWFnZSddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIAotICAgICAgbmFtZT0iZWRpdG9ycy5pbnNlcnRJbWFnZSIKLSAgICAgIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy5JbnNlcnRBc3NldCIKLSAgPgotICAgIDx2aWV3IAotICAgICAgdGVtcGxhdGU9Im1vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9pbnNlcnRBc3NldC5qeCIgCi0gICAgICBtZW51PSJmYWxzZSIKLSAgICAgIGNyZWF0ZUNvbnRpbnVhdGlvbj0iZmFsc2UiCi0gICAgLz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHZhbHVlPSJJbWFnZSIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXNzZXQtdXNlY2FzZSIgdmFsdWU9InRhYi5hc3NldCIvPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLQotPC94Y29uZj4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW5zZXJ0TGluay54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWluc2VydExpbmsueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZjliZDcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW5zZXJ0TGluay54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdlZGl0b3JzLmluc2VydExpbmsnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSAKLSAgICAgIG5hbWU9ImVkaXRvcnMuaW5zZXJ0TGluayIgCi0gICAgICBsb2dnZXI9ImxlbnlhLnB1YmxpY2F0aW9uIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRHVtbXlVc2VjYXNlIgotICA+Ci0gICAgPHZpZXcgCi0gICAgICB1cmk9ImNvY29vbjovL21vZHVsZXMvZWRpdG9ycy9lZGl0b3JzLmluc2VydExpbmsiIAotICAgICAgbWVudT0iZmFsc2UiCi0gICAgICBjcmVhdGVDb250aW51YXRpb249ImZhbHNlIgotICAgIC8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtcHVibGljYXRpb25FZGl0Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtcHVibGljYXRpb25FZGl0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjE3NDI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLXB1YmxpY2F0aW9uRWRpdC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdlZGl0b3JzLnB1YmxpY2F0aW9uRWRpdCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJlZGl0b3JzLnB1YmxpY2F0aW9uRWRpdCIgbG9nZ2VyPSJsZW55YS5wdWJsaWNhdGlvbiINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy5FZGl0RG9jdW1lbnQiPg0KLSAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic291cmNlVXJpIiB2YWx1ZT0iY29jb29uOi8vbW9kdWxlcy9lZGl0b3JzL3N0cmVhbS54bWwiLz4KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWUwZmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmVkaXRvcnM8L2lkPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy51c2VjYXNlIi8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnJlc291cmNlIi8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnNpdGVtYW5hZ2VtZW50Ii8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmxpbmtpbmciLz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjMtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5FZGl0b3JzPC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBFZGl0b3IgYmFzZSBhbmQgc3VwcG9ydCBjbGFzc2VzLCAgCi0gICAgZ2VuZXJpYyBpbnNlcnRMaW5rLCBpbnNlcnRBc3NldCBhbmQgaW5zZXJ0SW1hZ2UgdXNlY2FzZSBpbXBsZW1lbnRhdGlvbnMsCi0gICAgRm9ybXMgYW5kIE9uZWZvcm0gZWRpdG9yIGltcGxlbWVudGF0aW9ucwotICA8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2phdmEvbGliL3hpbmRpY2UtMS4xLmphciBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9saWIveGluZGljZS0xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjgxMzNmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9saWIveGluZGljZS0xLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9qYXZhL2xpYi94bWxkYi1jb21tb24tMjAwMzA3MDEuamFyIGIvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9qYXZhL2xpYi94bWxkYi1jb21tb24tMjAwMzA3MDEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmIwMzAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9saWIveG1sZGItY29tbW9uLTIwMDMwNzAxLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9saWIveG1sZGIteHVwZGF0ZS0yMDA0MDIwNS5qYXIgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2phdmEvbGliL3htbGRiLXh1cGRhdGUtMjAwNDAyMDUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjdmOTMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9saWIveG1sZGIteHVwZGF0ZS0yMDA0MDIwNS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2VkaXRvcnMvRWRpdERvY3VtZW50LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2VkaXRvcnMvRWRpdERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMGZkN2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9lZGl0b3JzL0VkaXREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Eb2N1bWVudFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UueG1sLlVzZWNhc2VFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuV29ya2Zsb3dVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5WYWxpZGF0aW9uVXRpbDsKLQotLyoqCi0gKiA8cD4KLSAqIFlvdSBjYW4gdXNlIHRoaXMgdXNlY2FzZSB0byBzYXZlIGEgZG9jdW1lbnQuIEl0IHJlYWRzIFhNTCBkYXRhIGZyb20gYSBzb3VyY2UKLSAqIGFuZCBzYXZlcyBhcyB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT5JZiB0aGUgZG9jdW1lbnQncyByZXNvdXJjZSB0eXBlIHN1cHBvcnRzIHZhbGlkYXRpb24sIHRoZSBYTUwgZG9jdW1lbnQgaXMKLSAqIHZhbGlkYXRlZCBhbmQgbm90IHNhdmVkIGlmIHZhbGlkYXRpb24gZXJyb3JzIG9jY3VyLjwvbGk+Ci0gKiA8bGk+QWxsIFVSTC1iYXNlZCBpbnRlcm5hbCBsaW5rcyBpbiB0aGUgWE1MIHNvdXJjZSBhcmUgY29udmVydGVkIHRvCi0gKiBVVUlELWJhc2VkIGxpbmtzIGJlZm9yZSBzYXZpbmcuPC9saT4KLSAqIDxsaT5BIHdvcmtmbG93IGV2ZW50IGlzIGludm9rZWQuIFRoZSBldmVudCBkZWZhdWx0cyB0byAiZWRpdCIsIHlvdSBjYW4KLSAqIG92ZXJyaWRlIGl0IHVzaW5nIHRoZSA8ZW0+ZXZlbnQ8L2VtPiBwYXJhbWV0ZXIuPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFBhcmFtZXRlcnM6Ci0gKiA8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+PGVtPnNvdXJjZVVyaTwvZW0+IC0gdGhlIFVSSSB0byByZWFkIHRoZSBYTUwgZGF0YSBmcm9tPC9saT4KLSAqIDxsaT48ZW0+ZXZlbnQ8L2VtPiAtIHRoZSB3b3JrZmxvdyBldmVudCB0byBpbnZva2U8L2xpPgotICogPC91bD4KLSAqIDxwPgotICogQSB0eXBpY2FsIHVzYWdlIHNjZW5hcmlvIGlzIHRvIHNhdmUgWE1MIGRhdGEgZW50ZXJlZCBpbiBhIGZvcm0uIEluIHRoaXMgY2FzZSwKLSAqIHRoZSA8ZW0+c291cmNlVXJpPC9lbT4gcGFyYW1ldGVyIHJlZmVycyB0byBhIENvY29vbiBwaXBlbGluZSBmZWF0dXJpbmcgdGhlCi0gKiBzdHJlYW0gZ2VuZXJhdG9yLgotICogPC9wPgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0RG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlQgPSAiZXZlbnQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVZFTlQgPSAiZWRpdCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVVJJIHRvIGNvcHkgdGhlIGRvY3VtZW50IHNvdXJjZSBmcm9tLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9VUkkgPSAic291cmNlVXJpIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgc291cmNlRG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLQotICAgICAgICBTdHJpbmcgc291cmNlVXJpID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoU09VUkNFX1VSSSk7Ci0gICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IHhtbERvYyA9IFNvdXJjZVV0aWwucmVhZERPTShzb3VyY2VVcmksIHRoaXMubWFuYWdlcik7Ci0KLSAgICAgICAgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHNvdXJjZURvYy5nZXRSZXNvdXJjZVR5cGUoKTsKLSAgICAgICAgU2NoZW1hIHNjaGVtYSA9IHJlc291cmNlVHlwZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgVmFsaWRhdGlvblV0aWwudmFsaWRhdGUodGhpcy5tYW5hZ2VyLCB4bWxEb2MsIHNjaGVtYSwgbmV3IFVzZWNhc2VFcnJvckhhbmRsZXIodGhpcykpOwotCi0gICAgICAgIGlmICghaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIFNvdXJjZVV0aWwud3JpdGVET00oeG1sRG9jLCBzb3VyY2VEb2MuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgU3RyaW5nIGV2ZW50ID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoRVZFTlQsIERFRkFVTFRfRVZFTlQpOwotICAgICAgICAgICAgV29ya2Zsb3dVdGlsCi0gICAgICAgICAgICAgICAgICAgIC5pbnZva2UodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBnZXRTb3VyY2VEb2N1bWVudCgpLCBldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICBOb2RlW10gb2JqZWN0cyA9IHsgZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpIH07Ci0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9lZGl0b3JzL0luc2VydEFzc2V0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2VkaXRvcnMvSW5zZXJ0QXNzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0NWMzMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2VkaXRvcnMvSW5zZXJ0QXNzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5jb250ZXh0LkNvbnRleHRVdGlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua1Jld3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuT3V0Z29pbmdMaW5rUmV3cml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUludm9rZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLkNyZWF0ZVJlc291cmNlOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gaW5zZXJ0IGFuIGltYWdlIGludG8gYSBkb2N1bWVudC4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgSW5zZXJ0QXNzZXQgZXh0ZW5kcyBDcmVhdGVSZXNvdXJjZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVCA9ICJkb2N1bWVudCI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2luaXRQYXJhbWV0ZXJzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLQotICAgICAgICBkZWxldGVQYXJhbWV0ZXIoUkVMQVRJT05TKTsKLSAgICAgICAgbG9hZFJlc291cmNlcygpOwotCi0gICAgICAgIHNldFBhcmFtZXRlcihET0NVTUVOVCwgZ2V0U291cmNlRG9jdW1lbnQoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVc2VyIHVzZXIgPSBnZXRTZXNzaW9uKCkuZ2V0SWRlbnRpdHkoKS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICBpZiAodXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJjcmVhdG9yIiwgdXNlci5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFTZXJ2bGV0SGVscGVyLmlzVXBsb2FkRW5hYmxlZChtYW5hZ2VyKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJVcGxvYWQgaXMgbm90IGVuYWJsZWQgcGxlYXNlIGNoZWNrIGxvY2FsLmJ1aWxkLnByb3BlcnRpZXMhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnRbXSBnZXRSZXNvdXJjZURvY3VtZW50cygpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtaW1lVHlwZVByZWZpeCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKCJtaW1lVHlwZVByZWZpeCIsICIiKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBEb2N1bWVudFtdIGRvY3MgPSBnZXRTb3VyY2VEb2N1bWVudCgpLmFyZWEoKS5nZXREb2N1bWVudHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZG9jc1tpXS5nZXRSZXNvdXJjZVR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJyZXNvdXJjZSIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc01pbWVUeXBlID0gZG9jc1tpXS5nZXRNaW1lVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChyZXNNaW1lVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc01pbWVUeXBlID0gInVua25vd24iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzTWltZVR5cGUuc3RhcnRzV2l0aChtaW1lVHlwZVByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZG9jc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRG9jdW1lbnRbXSkgbGlzdC50b0FycmF5KG5ldyBEb2N1bWVudFtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxvYWRSZXNvdXJjZXMoKSB7Ci0gICAgICAgIENvbnRleHRVdGlsaXR5IGNvbnRleHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0VXRpbGl0eSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChDb250ZXh0VXRpbGl0eS5ST0xFKTsKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IGNvbnRleHQuZ2V0UmVxdWVzdCgpOwotICAgICAgICAgICAgYm9vbGVhbiBzc2wgPSByZXF1ZXN0LmlzU2VjdXJlKCk7Ci0KLSAgICAgICAgICAgIExpbmtSZXdyaXRlciByZXdyaXRlciA9IG5ldyBPdXRnb2luZ0xpbmtSZXdyaXRlcih0aGlzLm1hbmFnZXIsIGdldFNlc3Npb24oKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlVVJMKCksIHNzbCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIE1hcCBhc3NldDJwcm94eVVybCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoImFzc2V0MnByb3h5VXJsIiwgYXNzZXQycHJveHlVcmwpOwotCi0gICAgICAgICAgICBEb2N1bWVudFtdIHJlc291cmNlcyA9IGdldFJlc291cmNlRG9jdW1lbnRzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxVcmwgPSByZXNvdXJjZXNbaV0uZ2V0Q2Fub25pY2FsV2ViYXBwVVJMKCk7Ci0gICAgICAgICAgICAgICAgaW50IGxhc3REb3RJbmRleCA9IG9yaWdpbmFsVXJsLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IHJlc291cmNlc1tpXS5nZXRTb3VyY2VFeHRlbnNpb24oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gb3JpZ2luYWxVcmwuc3Vic3RyaW5nKDAsIGxhc3REb3RJbmRleCkgKyAiLiIgKyBleHRlbnNpb247Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlVcmwgPSByZXdyaXRlci5yZXdyaXRlKHVybCk7Ci0gICAgICAgICAgICAgICAgYXNzZXQycHJveHlVcmwucHV0KHJlc291cmNlc1tpXSwgcHJveHlVcmwpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFBhcmFtZXRlcigiYXNzZXRzIiwgcmVzb3VyY2VzKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZWdhdGVzIHRvIHRoZSBtYWluIGFzc2V0cyB1c2VjYXNlOyB0aGUgbmFtZSBvZiB0aGUgdXNlY2FzZSBiZWluZwotICAgICAqIGRlbGVnYXRlZCB0byBpcyBzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICJhc3NldC11c2VjYXNlIi4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNhZHZhbmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZHZhbmNlKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICBzdXBlci5hZHZhbmNlKCk7Ci0gICAgICAgIGlmIChnZXRQYXJhbWV0ZXJBc0Jvb2xlYW4oInVwbG9hZCIsIGZhbHNlKSkgewotICAgICAgICAgICAgVXNlY2FzZUludm9rZXIgaW52b2tlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludm9rZXIgPSAoVXNlY2FzZUludm9rZXIpIHRoaXMubWFuYWdlci5sb29rdXAoVXNlY2FzZUludm9rZXIuUk9MRSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVzZWNhc2VOYW1lID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoImFzc2V0LXVzZWNhc2UiKTsKLQotICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5zZXJ0QXNzZXQ6OmFkdmFuY2UoKSBjYWxsaW5nIGludm9rZXIgd2l0aCB1c2VjYXNlTmFtZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1c2VjYXNlTmFtZSArICJdIik7Ci0gICAgICAgICAgICAgICAgaW52b2tlci5pbnZva2UoZ2V0U291cmNlVVJMKCksIHVzZWNhc2VOYW1lLCBnZXRQYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgICAgIGlmIChpbnZva2VyLmdldFJlc3VsdCgpID09IFVzZWNhc2VJbnZva2VyLlNVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoInRpdGxlIik7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVBhcmFtZXRlcigiY3JlYXRvciIpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoInJpZ2h0cyIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgbWVzc2FnZXMgPSBpbnZva2VyLmdldEVycm9yTWVzc2FnZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVc2VjYXNlTWVzc2FnZSBtZXNzYWdlID0gKFVzZWNhc2VNZXNzYWdlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZShtZXNzYWdlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUaGUgPGlucHV0IHR5cGU9ImZpbGUiLz4gdmFsdWUgY2Fubm90IGJlIHBhc3NlZCB0byB0aGUgbmV4dAotICAgICAgICAgICAgICAgICAqIHNjcmVlbiBiZWNhdXNlIHRoZSBicm93c2VyIGRvZXNuJ3QgYWxsb3cgdGhpcyBmb3Igc2VjdXJpdHkKLSAgICAgICAgICAgICAgICAgKiByZWFzb25zLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGRlbGV0ZVBhcmFtZXRlcigiZmlsZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlY2FzZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludm9rZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShpbnZva2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy9TYXZlRG9jdW1lbnQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy9TYXZlRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2NzBhOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2VkaXRvcnMvU2F2ZURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Eb2N1bWVudFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlSW52b2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIHVzZWNhc2Ugc2F2ZXMgdGhlIGRvY3VtZW50IGZyb20gdGhlIHJlcXVlc3Qgc3RyZWFtIDxlbT5iZWZvcmU8L2VtPiB0aGUKLSAqIHZpZXcgaXMgZGlzcGxheWVkIHVzaW5nIHRoZSB7QGxpbmsgRWRpdERvY3VtZW50fSB1c2VjYXNlLiBUaGF0J3Mga2luZCBvZiBhCi0gKiBoYWNrLCBzaW5jZSBpdCB2aW9sYXRlcyB0aGUgc3RhbmRhcmQgdXNlY2FzZSBwcmluY2lwbGUsIGJ1dCBpdCBpcyB2ZXJ5Ci0gKiBjb252ZW5pZW50IGJlY2F1c2UgeW91IGNhbiBzYXZlIGFuZCByZS1sb2FkIHRoZSBkb2N1bWVudCB3aXRob3V0IGEgcmVkaXJlY3QuCi0gKiA8L3A+Ci0gKiAKLSAqIEB2ZXJzaW9uICRJZDogRWRpdERvY3VtZW50LmphdmEgNDk1MzI0IDIwMDctMDEtMTEgMTg6NDQ6MDRaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZURvY3VtZW50IGV4dGVuZHMgRG9jdW1lbnRVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUNBU0VfTkFNRSA9ICJ1c2VjYXNlTmFtZSI7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotCi0gICAgICAgIFN0cmluZyB1c2VjYXNlID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVVNFQ0FTRV9OQU1FKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInVzZWNhc2UiLCB1c2VjYXNlKTsKLQotICAgICAgICBVc2VjYXNlSW52b2tlciBpbnZva2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludm9rZXIgPSAoVXNlY2FzZUludm9rZXIpIHRoaXMubWFuYWdlci5sb29rdXAoVXNlY2FzZUludm9rZXIuUk9MRSk7Ci0gICAgICAgICAgICBNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHBhcmFtcy5wdXQoRWRpdERvY3VtZW50LlNPVVJDRV9VUkksIGdldFBhcmFtZXRlcihFZGl0RG9jdW1lbnQuU09VUkNFX1VSSSkpOwotICAgICAgICAgICAgcGFyYW1zLnB1dChFZGl0RG9jdW1lbnQuRVZFTlQsIGdldFBhcmFtZXRlcihFZGl0RG9jdW1lbnQuRVZFTlQpKTsKLSAgICAgICAgICAgIGludm9rZXIuaW52b2tlKGdldFNvdXJjZVVSTCgpLCB1c2VjYXNlLCBwYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoaW52b2tlci5nZXRSZXN1bHQoKSAhPSBVc2VjYXNlSW52b2tlci5TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBtZXNzYWdlcyA9IGludm9rZXIuZ2V0RXJyb3JNZXNzYWdlcygpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1lc3NhZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBVc2VjYXNlTWVzc2FnZSBtZXNzYWdlID0gKFVzZWNhc2VNZXNzYWdlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCBtZXNzYWdlLmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGludm9rZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGludm9rZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy9mb3Jtcy9Gb3Jtc0VkaXRvci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9lZGl0b3JzL2Zvcm1zL0Zvcm1zRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTJlMTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9lZGl0b3JzL2Zvcm1zL0Zvcm1zRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmVkaXRvcnMuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Nb2RpZmlhYmxlU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UueG1sLlVzZWNhc2VFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuV29ya2Zsb3dVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzLlVzZWNhc2VXb3JrZmxvd0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5WYWxpZGF0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5YUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnhpbmRpY2UuY29yZS54dXBkYXRlLlhQYXRoUXVlcnlGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhpbmRpY2UuY29yZS54dXBkYXRlLlhVcGRhdGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGluZGljZS54bWwuTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlByZWZpeFJlc29sdmVyRGVmYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoQVBJOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YT2JqZWN0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWxkYi5jb21tb24ueG1sLnF1ZXJpZXMuWFBhdGhRdWVyeUZhY3Rvcnk7Ci0KLS8qKgotICogTXVsdGlwbGUgZm9ybXMgZWRpdG9yIHVzZWNhc2UuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEZvcm1zRWRpdG9yIGV4dGVuZHMgRG9jdW1lbnRVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRVJST1JTID0gInByaXZhdGUudmFsaWRhdGlvbkVycm9ycyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBYVXBkYXRlQXR0cmlidXRlcyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiA8Y29kZT54dXBkYXRlQXR0ckV4cHI8L2NvZGU+IFRoZSBYdXBkYXRlIGV4cHJlc3Npb24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgeHVwZGF0ZUF0dHJFeHByID0gIiI7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiA8Y29kZT50YWdJRDwvY29kZT4gVGhlIHRhZyBJRAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyB0YWdJRCA9ICIiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgWHVwZGF0ZSBhdHRyaWJ1dGVzCi0gICAgICAgICAqIEBwYXJhbSBfeHVwZGF0ZUF0dHJFeHByIFRoZSB4dXBkYXRlIGV4cHJlc3Npb24KLSAgICAgICAgICogQHBhcmFtIF90YWdJRCBUaGUgdGFnIGlkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgWFVwZGF0ZUF0dHJpYnV0ZXMoU3RyaW5nIF94dXBkYXRlQXR0ckV4cHIsIFN0cmluZyBfdGFnSUQpIHsKLSAgICAgICAgICAgIHRoaXMueHVwZGF0ZUF0dHJFeHByID0gX3h1cGRhdGVBdHRyRXhwcjsKLSAgICAgICAgICAgIHRoaXMudGFnSUQgPSBfdGFnSUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRkxPV19JTlZPS0VEID0gInByaXZhdGUud29ya2Zsb3dJbnZva2VkIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZ2V0Tm9kZXNUb0xvY2soKQotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgU2V0IG5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgaWYgKGRvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBub2Rlcy5hZGQoZG9jLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAob3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10pCi0gICAgICAgICAgICBub2Rlcy50b0FycmF5KG5ldyBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbbm9kZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKCFoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIFVzZWNhc2VXb3JrZmxvd0hlbHBlci5jaGVja1dvcmtmbG93KHRoaXMubWFuYWdlciwgdGhpcywgZ2V0RXZlbnQoKSwgZG9jLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZSNhZHZhbmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZHZhbmNlKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICBzdXBlci5hZHZhbmNlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHVubnVtYmVyVGFnc1hzbFVyaSA9ICJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9mb3Jtcy91bm51bWJlclRhZ3MueHNsIjsKLSAgICAgICAgU3RyaW5nIG51bWJlclRhZ3NYc2xVcmkgPSAiZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvbnVtYmVyVGFncy54c2wiOwotCi0gICAgICAgIFNvdXJjZSB1bm51bWJlclRhZ3NYc2xTb3VyY2UgPSBudWxsOwotICAgICAgICBTb3VyY2UgbnVtYmVyVGFnc1hzbFNvdXJjZSA9IG51bGw7Ci0KLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIHVubnVtYmVyVGFnc1hzbFNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkodW5udW1iZXJUYWdzWHNsVXJpKTsKLSAgICAgICAgICAgIG51bWJlclRhZ3NYc2xTb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKG51bWJlclRhZ3NYc2xVcmkpOwotCi0gICAgICAgICAgICBpZiAoZ2V0UGFyYW1ldGVyQXNTdHJpbmcoImNhbmNlbCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCJFZGl0aW5nIGhhcyBiZWVuIGNhbmNlbGVkIik7Ci0gICAgICAgICAgICAgICAgLy8gbW9kaWZpYWJsZVhtbFNvdXJjZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLmNvbnRleHQpOwotICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOwotICAgICAgICAgICAgc2F2ZShyZXNvbHZlciwgZ2V0U291cmNlRG9jdW1lbnQoKSwgdW5udW1iZXJUYWdzWHNsU291cmNlLCBudW1iZXJUYWdzWHNsU291cmNlLCBlbmNvZGluZyk7Ci0KLSAgICAgICAgICAgIGlmIChoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihWQUxJREFUSU9OX0VSUk9SUywgZ2V0RXJyb3JNZXNzYWdlcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWdldFBhcmFtZXRlckFzQm9vbGVhbihXT1JLRkxPV19JTlZPS0VELCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoVkFMSURBVElPTl9FUlJPUlMpOwotICAgICAgICAgICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VEb2N1bWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXZlbnQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFdPUktGTE9XX0lOVk9LRUQsIEJvb2xlYW4udmFsdWVPZih0cnVlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVc2VjYXNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAodW5udW1iZXJUYWdzWHNsU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZSh1bm51bWJlclRhZ3NYc2xTb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnVtYmVyVGFnc1hzbFNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2UobnVtYmVyVGFnc1hzbFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgCi0gICAgICAgIGFkdmFuY2UoKTsKLQotICAgICAgICBMaXN0IGVycm9ycyA9IChMaXN0KSBnZXRQYXJhbWV0ZXIoVkFMSURBVElPTl9FUlJPUlMpOwotICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVycm9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBVc2VjYXNlTWVzc2FnZSBtZXNzYWdlID0gKFVzZWNhc2VNZXNzYWdlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UobWVzc2FnZS5nZXRNZXNzYWdlKCksIG1lc3NhZ2UuZ2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIEZvcm0KLSAgICAgKiBAcGFyYW0gcmVzb2x2ZXIKLSAgICAgKiBAcGFyYW0gbGVueWFEb2N1bWVudAotICAgICAqIEBwYXJhbSB1bm51bWJlclRhZ3NYc2xTb3VyY2UKLSAgICAgKiBAcGFyYW0gbnVtYmVyVGFnc1hzbFNvdXJjZQotICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWFBhdGhRdWVyeUNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmUoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50IGxlbnlhRG9jdW1lbnQsCi0gICAgICAgICAgICBTb3VyY2UgdW5udW1iZXJUYWdzWHNsU291cmNlLCBTb3VyY2UgbnVtYmVyVGFnc1hzbFNvdXJjZSxTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWxlbnlhRG9jdW1lbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJUaGUgZG9jdW1lbnQgWyIgKyBsZW55YURvY3VtZW50ICsgIl0gZG9lcyBub3QgZXhpc3QuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJTYXZlIG1vZGlmaWNhdGlvbnMgdG8gWyIgKyBsZW55YURvY3VtZW50ICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBwYXJzZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICBwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBwYXJzZXJGYWN0b3J5LnNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IHBhcnNlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0KLSAgICAgICAgSW5wdXRTb3VyY2UgeG1sSW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobGVueWFEb2N1bWVudC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKHhtbElucHV0U291cmNlKTsKLQotICAgICAgICBEb2N1bWVudCByZW51bWJlcmVkRG9jdW1lbnQgPSByZW51bWJlckRvY3VtZW50KGRvY3VtZW50LCB1bm51bWJlclRhZ3NYc2xTb3VyY2UsbnVtYmVyVGFnc1hzbFNvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoWFBhdGhRdWVyeUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBYUGF0aFF1ZXJ5RmFjdG9yeUltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBYVXBkYXRlSW1wbCB4VXBkYXRlID0gbmV3IFhVcGRhdGVJbXBsKCk7Ci0KLSAgICAgICAgU3RyaW5nIGVkaXRTZWxlY3QgPSBwcm9jZXNzRWxlbWVudHMocmVudW1iZXJlZERvY3VtZW50LCB4VXBkYXRlKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKCJlZGl0U2VsZWN0IiwgZWRpdFNlbGVjdCk7Ci0KLSAgICAgICAgU291cmNlIHZhbGlkYXRpb25Tb3VyY2UgPSBudWxsOwotICAgICAgICBTb3VyY2UgdW5udW1iZXJUYWdzU291cmNlID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25VcmkgPSBsZW55YURvY3VtZW50LmdldFNvdXJjZVVSSSgpICsgIi52YWxpZGF0ZSI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSSh2YWxpZGF0aW9uVXJpKTsKLSAgICAgICAgICAgIGNoZWNrTW9kaWZpYWJpbGl0eSh2YWxpZGF0aW9uU291cmNlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHVubnVtYmVyVGFnc1VyaSA9IGxlbnlhRG9jdW1lbnQuZ2V0U291cmNlVVJJKCkgKyAiLnZhbGlkYXRlLnVubnVtYmVyIjsKLSAgICAgICAgICAgIHVubnVtYmVyVGFnc1NvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkodW5udW1iZXJUYWdzVXJpKTsKLSAgICAgICAgICAgIGNoZWNrTW9kaWZpYWJpbGl0eSh1bm51bWJlclRhZ3NTb3VyY2UpOwotCi0gICAgICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSB0cmFuc2Zvcm1YbWxTb3VyY2UgPSBuZXcgRE9NU291cmNlKHJlbnVtYmVyZWREb2N1bWVudCk7Ci0gICAgICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSB0cmFuc2Zvcm1Yc2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHVubnVtYmVyVGFnc1hzbFNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKTsKLQotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIFN0cmVhbVJlc3VsdCB1bm51bWJlclhtbFJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3V0KTsKLQotICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcih0cmFuc2Zvcm1Yc2xTb3VyY2UpOwotICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHRyYW5zZm9ybVhtbFNvdXJjZSwgdW5udW1iZXJYbWxSZXN1bHQpOwotCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBkb2MgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoaW4pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBWYWxpZGF0aW9uVXRpbC52YWxpZGF0ZSh0aGlzLm1hbmFnZXIsIGRvYywgZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRSZXNvdXJjZVR5cGUoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U2NoZW1hKCksIG5ldyBVc2VjYXNlRXJyb3JIYW5kbGVyKHRoaXMpKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25Tb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2UodmFsaWRhdGlvblNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodW5udW1iZXJUYWdzU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHVubnVtYmVyVGFnc1NvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZG9jICE9IG51bGwpewotICAgICAgICAJd3JpdGVEb2N1bWVudChkb2MsIGdldFNvdXJjZURvY3VtZW50KCkuZ2V0T3V0cHV0U3RyZWFtKCksIGVuY29kaW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgZWxlbWVudHMKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0geHEKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0VsZW1lbnRzKERvY3VtZW50IGRvY3VtZW50LCBYVXBkYXRlSW1wbCB4cSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBlZGl0U2VsZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nW10gcGFyYW1OYW1lcyA9IGdldFBhcmFtZXRlck5hbWVzKCk7Ci0gICAgICAgIGZvciAoaW50IHBhcmFtSW5kZXggPSAwOyBwYXJhbUluZGV4IDwgcGFyYW1OYW1lcy5sZW5ndGg7IHBhcmFtSW5kZXgrKykgewotICAgICAgICAgICAgU3RyaW5nIHBuYW1lID0gcGFyYW1OYW1lc1twYXJhbUluZGV4XTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJQYXJhbWV0ZXI6ICIgKyBwbmFtZSArICIgPSAiICsgZ2V0UGFyYW1ldGVyQXNTdHJpbmcocG5hbWUpKTsKLQotICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgeHBhdGggdG8gZWRpdAotICAgICAgICAgICAgaWYgKHBuYW1lLmluZGV4T2YoImVkaXRbIikgPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChwbmFtZS5lbmRzV2l0aCgiXS54IikpIHsKLSAgICAgICAgICAgICAgICAgICAgZWRpdFNlbGVjdCA9IHBuYW1lLnN1YnN0cmluZyg1LCBwbmFtZS5sZW5ndGgoKSAtIDMpOwotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiRWRpdDogIiArIGVkaXRTZWxlY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIocG5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIGRlYWxpbmcgd2l0aCBhbiB4dXBkYXRlIHN0YXRlbWVudCwKLSAgICAgICAgICAgIC8vIGVsc2Ugc2tpcAotICAgICAgICAgICAgaWYgKHBuYW1lLnN0YXJ0c1dpdGgoIjx4dXBkYXRlOiIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdCA9IHBuYW1lLnN1YnN0cmluZyhwbmFtZS5pbmRleE9mKCJzZWxlY3QiKSArIDgpOwotICAgICAgICAgICAgICAgIHNlbGVjdCA9IHNlbGVjdC5zdWJzdHJpbmcoMCwgc2VsZWN0LmluZGV4T2YoIlwiIikpOwotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJTZWxlY3QgTm9kZTogIiArIHNlbGVjdCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBub2RlIGV4aXN0cwotICAgICAgICAgICAgICAgIFByZWZpeFJlc29sdmVyIHJlc29sdmVyID0gbmV3IEZvcm1QcmVmaXhSZXNvbHZlcihkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgWE9iamVjdCB4T2JqZWN0ID0gWFBhdGhBUEkuZXZhbChkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwgc2VsZWN0LCByZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZXMgPSB4T2JqZWN0Lm5vZGVsaXN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIi5hY3QoKTogTm9kZSBkb2VzIG5vdCBleGlzdCAobWlnaHQgaGF2ZSBiZWVuIGRlbGV0ZWQgZHVyaW5nIHVwZGF0ZSk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlbGVjdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHh1cGRhdGVNb2RpZmljYXRpb25zID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IGNoZWNrIGZvciB0aGUgZGlmZmVyZW50IHh1cGRhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGVtZW50cywgYW5kIGhhbmRsZSBhcHByb3ByaWF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwbmFtZS5pbmRleE9mKCJ4dXBkYXRlOnVwZGF0ZS1wYXJlbnQiKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJVUERBVEUgUEFSRU5UIE5vZGU6ICIgKyBwbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDREFUQSB1cGRhdGVzIG5lZWQgdG8gYmUgaGFuZGxlZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VwZXJhdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBuYW1lLmluZGV4T2YoIjwhW0NEQVRBWyIpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh1cGRhdGVNb2RpZmljYXRpb25zID0gdXBkYXRlQ0RBVEEocG5hbWUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dXBkYXRlTW9kaWZpY2F0aW9ucyA9IHVwZGF0ZShwbmFtZSwgc2VsZWN0LCBub2Rlcy5pdGVtKDApLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbmFtZS5pbmRleE9mKCJ4dXBkYXRlOnVwZGF0ZSIpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVQREFURSBOb2RlOiAiICsgcG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0RBVEEgdXBkYXRlcyBuZWVkIHRvIGJlIGhhbmRsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcGVyYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbmFtZS5pbmRleE9mKCI8IVtDREFUQVsiKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dXBkYXRlTW9kaWZpY2F0aW9ucyA9IHVwZGF0ZUNEQVRBKHBuYW1lLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh1cGRhdGVNb2RpZmljYXRpb25zID0gdXBkYXRlKHBuYW1lLCBzZWxlY3QsIG5vZGVzLml0ZW0oMCksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbmFtZS5pbmRleE9mKCJ4dXBkYXRlOmFwcGVuZCIpID4gMCAmJiBwbmFtZS5lbmRzV2l0aCgiPi54IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHh1cGRhdGVNb2RpZmljYXRpb25zID0gYXBwZW5kKHBuYW1lLnN1YnN0cmluZygwLCBwbmFtZS5sZW5ndGgoKSAtIDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydC1iZWZvcmU6IGluIGNhc2Ugb2Ygc2VsZWN0L29wdGlvbgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBuYW1lLmluZGV4T2YoInh1cGRhdGU6aW5zZXJ0LWJlZm9yZSIpID4gMCAmJiBwbmFtZS5lbmRzV2l0aCgiLz4iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRQYXJhbWV0ZXJBc1N0cmluZyhwbmFtZSkuZXF1YWxzKCJudWxsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dXBkYXRlTW9kaWZpY2F0aW9ucyA9IGluc2VydEJlZm9yZShnZXRQYXJhbWV0ZXJBc1N0cmluZyhwbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRTZWxlY3QgPSBwbmFtZS5zdWJzdHJpbmcoMzEscG5hbWUubGVuZ3RoKCkgLSAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0U2VsZWN0ID0gY2hhbmdlVGFnTnVtYmVyKGVkaXRTZWxlY3QsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydC1iZWZvcmU6IGluIGNhc2Ugb2YgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbmFtZS5pbmRleE9mKCJ4dXBkYXRlOmluc2VydC1iZWZvcmUiKSA+IDAgJiYgcG5hbWUuZW5kc1dpdGgoIj4ueCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAl4dXBkYXRlTW9kaWZpY2F0aW9ucyA9IGluc2VydEJlZm9yZShwbmFtZS5zdWJzdHJpbmcoMCwgcG5hbWUubGVuZ3RoKCkgLSAyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQtYWZ0ZXI6IGluIGNhc2Ugb2Ygc2VsZWN0L29wdGlvbgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBuYW1lLmluZGV4T2YoInh1cGRhdGU6aW5zZXJ0LWFmdGVyIikgPiAwICYmIHBuYW1lLmVuZHNXaXRoKCIvPiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdldFBhcmFtZXRlckFzU3RyaW5nKHBuYW1lKS5lcXVhbHMoIm51bGwiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh1cGRhdGVNb2RpZmljYXRpb25zID0gaW5zZXJ0QWZ0ZXIoZ2V0UGFyYW1ldGVyQXNTdHJpbmcocG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0U2VsZWN0ID0gcG5hbWUuc3Vic3RyaW5nKDMwLHBuYW1lLmxlbmd0aCgpIC0gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFNlbGVjdCA9IGNoYW5nZVRhZ051bWJlcihlZGl0U2VsZWN0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydC1hZnRlcjogaW4gY2FzZSBvZiBpbWFnZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBuYW1lLmluZGV4T2YoInh1cGRhdGU6aW5zZXJ0LWFmdGVyIikgPiAwICYmIHBuYW1lLmVuZHNXaXRoKCI+LngiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeHVwZGF0ZU1vZGlmaWNhdGlvbnMgPSBpbnNlcnRBZnRlcihwbmFtZS5zdWJzdHJpbmcoMCwgcG5hbWUubGVuZ3RoKCkgLSAyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG5hbWUuaW5kZXhPZigieHVwZGF0ZTpyZW1vdmUiKSA+IDAgJiYgcG5hbWUuZW5kc1dpdGgoIi8+LngiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeHVwZGF0ZU1vZGlmaWNhdGlvbnMgPSByZW1vdmUocG5hbWUuc3Vic3RyaW5nKDAsIHBuYW1lLmxlbmd0aCgpIC0gMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFNlbGVjdCA9IHBuYW1lLnN1YnN0cmluZygyNCxwbmFtZS5sZW5ndGgoKSAtIDMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBuYW1lLmVuZHNXaXRoKCI+LnkiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRvbid0IGhhbmRsZSB0aGlzOiAiICsgcG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkRvbid0IGhhbmRsZSB0aGlzIGVpdGhlcjogIiArIHBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIEdldCBoaWRkZW4gbmFtZXNwYWNlcwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlcyA9IGdldFBhcmFtZXRlckFzU3RyaW5nKCJuYW1lc3BhY2VzIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQWRkIFhNTCBkZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBzZWxlY3Qvb3B0aW9uIGlzIGdlbmVyYXRpbmcgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIG51bGwKLSAgICAgICAgICAgICAgICAgICAgaWYgKHh1cGRhdGVNb2RpZmljYXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHh1cGRhdGVNb2RpZmljYXRpb25zID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArIHh1cGRhdGVNb2RpZmljYXRpb25zOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgYXNzZW1ibGVkIHh1cGRhdGUgcXVlcnkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHh1cGRhdGVNb2RpZmljYXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmluZm8oIkV4ZWN1dGUgWFVwZGF0ZSBNb2RpZmljYXRpb25zOiAiICsgeHVwZGF0ZU1vZGlmaWNhdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgeHEuc2V0UVN0cmluZyh4dXBkYXRlTW9kaWZpY2F0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4cS5zZXROYW1lc3BhY2VNYXAoZ2V0TmFtZXNwYWNlTWFwKG5hbWVzcGFjZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhxLmV4ZWN1dGUoZG9jdW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlBhcmFtZXRlciBkaWQgbm90IG1hdGNoIGFueSB4dXBkYXRlIGNvbW1hbmQ6ICIgKyBwbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsZXRlUGFyYW1ldGVyKHBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWRpdFNlbGVjdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTmFtZXNwYWNlTWFwIGdldE5hbWVzcGFjZU1hcChTdHJpbmcgbmFtZXNwYWNlcykgewotICAgICAgICBOYW1lc3BhY2VNYXAgbnNNYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuc3BsaXQoIltcXHNdKyIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nW10gcHJlZml4QW5kVXJpID0gbmFtZXNwYWNlW2ldLnNwbGl0KCI9Iik7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcHJlZml4QW5kVXJpWzBdOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHByZWZpeEFuZFVyaVsxXS5yZXBsYWNlQWxsKCJcIiIsICIiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGNvbG9uSW5kZXggPSBwcmVmaXguaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgaWYgKGNvbG9uSW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBuc01hcC5zZXREZWZhdWx0TmFtZXNwYWNlKHVyaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeC5zdWJzdHJpbmcoY29sb25JbmRleCArIDEpOwotICAgICAgICAgICAgICAgIGlmICghbnNNYXAuY29udGFpbnNLZXkocHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICBuc01hcC5zZXROYW1lc3BhY2UocHJlZml4LCB1cmkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnNNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlIHRoZSB0YWcgbnVtYmVyIG9mIHRoZSBzZWxlY3RlZCBub2RlLgotICAgICAqIFRoZSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgamF2YXNjcmlwdCBpbiBvcmRlciB0byBqdW1wIHRvIHRoZSAKLSAgICAgKiBhcHByb3ByaWF0ZSBub2RlIGFmdGVyIGRlbGV0aW5nIG9yIGluc2VydGluZyBhIG5vZGUuCi0gICAgICogQHBhcmFtIHRhZ0lEIFRoZSB0YWdJRCB3aGVyZSB0aGUgbmV3IG5vZGUgaXMgaW5zZXJ0ZWQuCi0gICAgICogQHBhcmFtIHN0ZXAgIGludCB2YWx1ZSBmb3IgY2hhbmdpbmcgdGhlIHRhZ0lELgotICAgICAqLyAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgY2hhbmdlVGFnTnVtYmVyKFN0cmluZyB0YWdJRCwgaW50IHN0ZXApewotICAgICAgICBTdHJpbmcgbnVtYmVyID0gdGFnSUQuc3Vic3RyaW5nKHRhZ0lELmxhc3RJbmRleE9mKCIuIikrMSx0YWdJRC5sYXN0SW5kZXhPZigiXSIpLTEpOwotICAgICAgICBpbnQgbnVtID0gSW50ZWdlci5wYXJzZUludChudW1iZXIpICsgc3RlcDsKLSAgICAgICAgU3RyaW5nIG5ld1RhZ051bWJlciA9IHRhZ0lELnN1YnN0cmluZygwLCB0YWdJRC5sYXN0SW5kZXhPZigiLiIpKzEpOwotICAgICAgICByZXR1cm4gbmV3VGFnTnVtYmVyLmNvbmNhdChJbnRlZ2VyLnRvU3RyaW5nKG51bSkrIiddIik7Ci0gICAgfQotIAotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgZG9jdW1lbnQgdG8gYSBtb2RpZmlhYmxlIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBvU3RyZWFtIFRoZSBzb3VyY2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIG9TdHJlYW0sIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9TdHJlYW0sIGVuY29kaW5nKTsKLSAgICAgICAgRG9jdW1lbnRIZWxwZXIud3JpdGVEb2N1bWVudChkb2N1bWVudCwgd3JpdGVyKTsKLSAgICAgICAgaWYgKG9TdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgb1N0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJFeGNlcHRpb24gY2xvc2luZyBvdXRwdXQgc3RyZWFtOiAiLCB0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIkNvdWxkIG5vdCB3cml0ZSBkb2N1bWVudDogIiwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBzb3VyY2UgaXMgbW9kaWZpYWJsZS4KLSAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UuCi0gICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgaXMgbm90IG1vZGlmaWFibGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNb2RpZmlhYmlsaXR5KFNvdXJjZSBzb3VyY2UpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgTW9kaWZpYWJsZVNvdXJjZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgdG8gc291cmNlIFsiICsgc291cmNlLmdldFVSSSgpICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhdHRyaWJ1dGVzIGZyb20gb3JpZ2luYWwgbm9kZQotICAgICAqIEBwYXJhbSBub2RlIE9yaWdpbmFsIG5vZGUKLSAgICAgKiBAcmV0dXJuIEFuIFh1cGRhdGVBdHRyaWJ1dGVzIGNsYXNzIGhvbGRpbmcgdGhlIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFhVcGRhdGVBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoTm9kZSBub2RlKSB7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIHh1cGRhdGVTdHJpbmcgPSAiIjsKLSAgICAgICAgU3RyaW5nIHRhZ0lEID0gIiI7Ci0gICAgICAgIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0ciBhdHRyaWJ1dGUgPSAob3JnLnczYy5kb20uQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIuZ2V0QXR0cmlidXRlcygpOiAiICsgYXR0cmlidXRlLmdldE5hbWUoKSArICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUuZ2V0TmFtZSgpLmVxdWFscygidGFnSUQiKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gYXR0cmlidXRlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiLmdldEF0dHJpYnV0ZXMoKTogTmFtZXNwYWNlOiAiICsgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZUF0dHJpYnV0ZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUF0dHJpYnV0ZSA9ICIgbmFtZXNwYWNlPVwiIiArIG5hbWVzcGFjZSArICJcIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiPHh1cGRhdGU6YXR0cmlidXRlIG5hbWU9XCIiICsgYXR0cmlidXRlLmdldE5hbWUoKSArICJcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWVzcGFjZUF0dHJpYnV0ZSArICI+IiArIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC94dXBkYXRlOmF0dHJpYnV0ZT4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCI8eHVwZGF0ZTphdHRyaWJ1dGUgbmFtZT1cInRhZ0lEXCI+dGVtcDwveHVwZGF0ZTphdHRyaWJ1dGU+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRhZ0lEID0gYXR0cmlidXRlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeHVwZGF0ZVN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeHVwZGF0ZVN0cmluZyA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJBdHRyaWJ1dGVzOiAiICsgeHVwZGF0ZVN0cmluZyk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBYVXBkYXRlQXR0cmlidXRlcyh4dXBkYXRlU3RyaW5nLCB0YWdJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGF0dHJpYnV0ZXMgZnJvbSBhY3R1YWwgdXBkYXRlCi0gICAgICogQHBhcmFtIHVwZGF0ZSBUaGUgYWN0dWFsIHVwZGF0ZQotICAgICAqIEBwYXJhbSB0YWdJRCBUaGUgdGFnIGlkIHRvIGdldCB0aGUgdXBkYXRlcyBmb3IKLSAgICAgKiBAcmV0dXJuIEFuIFh1cGRhdGVBdHRyaWJ1dGVzIGNsYXNzIGhvbGRpbmcgdGhlIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFhVcGRhdGVBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIHVwZGF0ZSwgU3RyaW5nIHRhZ0lEKSB7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKHVwZGF0ZSk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHh1cGRhdGVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCI8eHVwZGF0ZTphdHRyaWJ1dGUgbmFtZT1cInRhZ0lEXCI+dGVtcDwveHVwZGF0ZTphdHRyaWJ1dGU+Iik7Ci0KLSAgICAgICAgU3RyaW5nW10gYXR0cmlidXRlcyA9IHVwZGF0ZS5zdWJzdHJpbmcoMCwgdXBkYXRlLmluZGV4T2YoIj4iKSkuc3BsaXQoIiAiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBiZXdhcmUgb2Ygd2hpdGUgc3BhY2VzCi0gICAgICAgICAgICBpbnQgaW5kZXggPSBhdHRyaWJ1dGVzW2ldLmluZGV4T2YoIj0iKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXNbaV0uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzW2ldLnN1YnN0cmluZyhpbmRleCArIDIsIGF0dHJpYnV0ZXNbaV0ubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCJ4bWxucyIpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICB4dXBkYXRlQnVmZmVyLmFwcGVuZCgiPHh1cGRhdGU6YXR0cmlidXRlIG5hbWU9XCIiICsgbmFtZSArICJcIj4iKTsKLSAgICAgICAgICAgICAgICAgICAgeHVwZGF0ZUJ1ZmZlci5hcHBlbmQodmFsdWUpLmFwcGVuZCgiPC94dXBkYXRlOmF0dHJpYnV0ZT4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQXR0cmlidXRlczogIiArIHh1cGRhdGVCdWZmZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBYVXBkYXRlQXR0cmlidXRlcyh4dXBkYXRlQnVmZmVyLnRvU3RyaW5nKCksIHRhZ0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB4dXBkYXRlOnVwZGF0ZQotICAgICAqIEBwYXJhbSBwbmFtZSBOYW1lIG9mIHRoZSBwYXJlbnQgZWxlbWVudAotICAgICAqIEBwYXJhbSBzZWxlY3QgVGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUKLSAgICAgKiBAcGFyYW0gbm9kZVRvVXBkYXRlIFRoZSBub2RlIHRvIHVwZGF0ZQotICAgICAqIEBwYXJhbSBwYXJlbnQgSWYgdHJ1ZSB0aGVuIHBhcmVudCBlbGVtZW50IGlzIHBhcnQgb2YgdXBkYXRlIGFuZCBhdHRyaWJ1dGVzIG5lZWQgdG8gYmUgdXBkYXRlZAotICAgICAqICAgICAgICAgICAgcmVzcC4gYWRkZWQgb3IgZGVsZXRlZAotICAgICAqIEByZXR1cm4gdGhlIFh1cGRhdGUgc3RhdGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXBkYXRlKFN0cmluZyBwbmFtZSwgU3RyaW5nIHNlbGVjdCwgTm9kZSBub2RlVG9VcGRhdGUsIGJvb2xlYW4gcGFyZW50KSB7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJVcGRhdGUgbm9kZTogIiArIHNlbGVjdCk7Ci0KLSAgICAgICAgLy8gZGVhbCB3aXRoIGF0dHJpYnV0ZSB2YWx1ZXMgaGVyZS4uCi0gICAgICAgIGlmIChub2RlVG9VcGRhdGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiVXBkYXRlIGF0dHJpYnV0ZTogIiArIHNlbGVjdCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB4dXBkYXRlVXBkYXRlID0gcG5hbWUgKyBnZXRQYXJhbWV0ZXJBc1N0cmluZyhwbmFtZSkgKyAiPC94dXBkYXRlOnVwZGF0ZT4iOwotICAgICAgICAgICAgcmV0dXJuICI8eHVwZGF0ZTptb2RpZmljYXRpb25zIHhtbG5zOnh1cGRhdGU9XCJodHRwOi8vd3d3LnhtbGRiLm9yZy94dXBkYXRlXCI+IgotICAgICAgICAgICAgICAgICAgICArIHh1cGRhdGVVcGRhdGUgKyAiPC94dXBkYXRlOm1vZGlmaWNhdGlvbnM+IjsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBBbmQgZGVhbCB3aXRoIG1peGVkIGNvbnRlbnQgaGVyZS4uIE5PVEU6IExleHVzIGhhcyB0cm91YmxlIHdpdGggbWl4ZWQgY29udGVudC4gQXMKLSAgICAgICAgICAgICAqIFdvcmthcm91bmQgd2UgaW5zZXJ0LWFmdGVyIHRoZSBuZXcgbm9kZSwgcmVtb3ZlIHRoZSBvcmlnaW5hbCBub2RlIGFuZCByZXBsYWNlIHRoZQotICAgICAgICAgICAgICogdGVtcG9yYXJ5IHRhZ0lEIGJ5IHRoZSBvcmlnaW5hbCB0YWdJRC4KLSAgICAgICAgICAgICAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlVwZGF0ZSBlbGVtZW50OiAiICsgc2VsZWN0KTsKLQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbm9kZVRvVXBkYXRlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlQXR0cmlidXRlID0gIiI7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbmFtZXNwYWNlQXR0cmlidXRlID0gIiBuYW1lc3BhY2U9XCIiICsgbmFtZXNwYWNlICsgIlwiIjsKLSAgICAgICAgfQotICAgICAgICAvLyBOT1RFOiBnZXRBdHRyaWJ1dGVzIGFkZHMgdGhlIGF0dHJpYnV0ZSB0YWdJRCB3aXRoIHZhbHVlICJ0ZW1wIiwKLSAgICAgICAgLy8gd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBmdXJ0aGVyIGRvd24KLSAgICAgICAgWFVwZGF0ZUF0dHJpYnV0ZXMgeGEgPSBnZXRBdHRyaWJ1dGVzKG5vZGVUb1VwZGF0ZSk7Ci0gICAgICAgIFN0cmluZyB4dXBkYXRlSW5zZXJ0QWZ0ZXIgPSBudWxsOwotICAgICAgICBpZiAocGFyZW50KSB7Ci0gICAgICAgICAgICB4YSA9IGdldEF0dHJpYnV0ZXMoZ2V0UGFyYW1ldGVyQXNTdHJpbmcocG5hbWUpLCB4YS50YWdJRCk7Ci0gICAgICAgICAgICB4dXBkYXRlSW5zZXJ0QWZ0ZXIgPSAiPHh1cGRhdGU6aW5zZXJ0LWFmdGVyIHNlbGVjdD1cIiIgKyBzZWxlY3QKLSAgICAgICAgICAgICAgICAgICAgKyAiIFwiPjx4dXBkYXRlOmVsZW1lbnQgbmFtZT1cIiIgKyBuZXcgWFBhdGgoc2VsZWN0KS5nZXROYW1lV2l0aG91dFByZWRpY2F0ZXMoKQotICAgICAgICAgICAgICAgICAgICArICJcIiIgKyBuYW1lc3BhY2VBdHRyaWJ1dGUgKyAiPiIgKyB4YS54dXBkYXRlQXR0ckV4cHIKLSAgICAgICAgICAgICAgICAgICAgKyByZW1vdmVQYXJlbnQoZ2V0UGFyYW1ldGVyQXNTdHJpbmcocG5hbWUpKQotICAgICAgICAgICAgICAgICAgICArICI8L3h1cGRhdGU6ZWxlbWVudD48L3h1cGRhdGU6aW5zZXJ0LWFmdGVyPiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4dXBkYXRlSW5zZXJ0QWZ0ZXIgPSAiPHh1cGRhdGU6aW5zZXJ0LWFmdGVyIHNlbGVjdD1cIiIgKyBzZWxlY3QKLSAgICAgICAgICAgICAgICAgICAgKyAiIFwiPjx4dXBkYXRlOmVsZW1lbnQgbmFtZT1cIiIgKyBuZXcgWFBhdGgoc2VsZWN0KS5nZXROYW1lV2l0aG91dFByZWRpY2F0ZXMoKQotICAgICAgICAgICAgICAgICAgICArICJcIiIgKyBuYW1lc3BhY2VBdHRyaWJ1dGUgKyAiPiIgKyB4YS54dXBkYXRlQXR0ckV4cHIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRQYXJhbWV0ZXJBc1N0cmluZyhwbmFtZSkgKyAiPC94dXBkYXRlOmVsZW1lbnQ+PC94dXBkYXRlOmluc2VydC1hZnRlcj4iOwotICAgICAgICB9Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIudXBkYXRlKCk6IFVwZGF0ZSBOb2RlIChpbnNlcnQtYWZ0ZXIpOiAiICsgeHVwZGF0ZUluc2VydEFmdGVyKTsKLQotICAgICAgICBTdHJpbmcgeHVwZGF0ZVJlbW92ZSA9ICI8eHVwZGF0ZTpyZW1vdmUgc2VsZWN0PVwiIiArIHNlbGVjdCArICIgXCIvPiI7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIudXBkYXRlKCk6IFVwZGF0ZSBOb2RlIChyZW1vdmUpOiAiICsgeHVwZGF0ZVJlbW92ZSk7Ci0KLSAgICAgICAgU3RyaW5nIHh1cGRhdGVVcGRhdGVBdHRyaWJ1dGUgPSAiPHh1cGRhdGU6dXBkYXRlIHNlbGVjdD1cIiIKLSAgICAgICAgICAgICAgICArIG5ldyBYUGF0aChzZWxlY3QpLnJlbW92ZVByZWRpY2F0ZXMoc2VsZWN0KSArICJbQHRhZ0lEPSd0ZW1wJ10vQHRhZ0lEIiArICIgXCI+IgotICAgICAgICAgICAgICAgICsgeGEudGFnSUQgKyAiPC94dXBkYXRlOnVwZGF0ZT4iOwotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiLnVwZGF0ZSgpOiBVcGRhdGUgTm9kZSAodXBkYXRlIHRhZ0lEIGF0dHJpYnV0ZSk6ICIKLSAgICAgICAgICAgICAgICArIHh1cGRhdGVVcGRhdGVBdHRyaWJ1dGUpOwotCi0gICAgICAgIHJldHVybiAiPHh1cGRhdGU6bW9kaWZpY2F0aW9ucyB4bWxuczp4dXBkYXRlPVwiaHR0cDovL3d3dy54bWxkYi5vcmcveHVwZGF0ZVwiPiIKLSAgICAgICAgICAgICAgICArIHh1cGRhdGVJbnNlcnRBZnRlciArIHh1cGRhdGVSZW1vdmUgKyB4dXBkYXRlVXBkYXRlQXR0cmlidXRlCi0gICAgICAgICAgICAgICAgKyAiPC94dXBkYXRlOm1vZGlmaWNhdGlvbnM+IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB4dXBkYXRlOnVwZGF0ZSBDREFUQQotICAgICAqIEBwYXJhbSBwbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcGFyZW50IGlmIHRydWUgdGhlbiBhdHRyaWJ1dGVzIG9mIHBhcmVudCB3aWxsIGFsc28gYmUgdXBkYXRlZAotICAgICAqIEByZXR1cm4gVGhlIFh1cGRhdGUgZXhwcmVzc2lvbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVwZGF0ZUNEQVRBKFN0cmluZyBwbmFtZSwgYm9vbGVhbiBwYXJlbnQpIHsKLSAgICAgICAgU3RyaW5nIHh1cGRhdGVVcGRhdGUgPSBwbmFtZSArIGdldFBhcmFtZXRlckFzU3RyaW5nKHBuYW1lKSArICJdXT48L3h1cGRhdGU6dXBkYXRlPiI7Ci0gICAgICAgIHJldHVybiAiPHh1cGRhdGU6bW9kaWZpY2F0aW9ucyB4bWxuczp4dXBkYXRlPVwiaHR0cDovL3d3dy54bWxkYi5vcmcveHVwZGF0ZVwiPiIKLSAgICAgICAgICAgICAgICArIHh1cGRhdGVVcGRhdGUgKyAiPC94dXBkYXRlOm1vZGlmaWNhdGlvbnM+IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB4dXBkYXRlOmFwcGVuZAotICAgICAqIEBwYXJhbSBwbmFtZSBUaGUgbm9kZSB0byBhcHBlbmQgdG8KLSAgICAgKiBAcmV0dXJuIFRoZSBYdXBkYXRlIHN0YXRlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFwcGVuZChTdHJpbmcgcG5hbWUpIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIi5hcHBlbmQoKSBBUFBFTkQgTm9kZTogIiArIHBuYW1lKTsKLSAgICAgICAgcmV0dXJuICI8eHVwZGF0ZTptb2RpZmljYXRpb25zIHhtbG5zOnh1cGRhdGU9XCJodHRwOi8vd3d3LnhtbGRiLm9yZy94dXBkYXRlXCI+IiArIHBuYW1lCi0gICAgICAgICAgICAgICAgKyAiPC94dXBkYXRlOm1vZGlmaWNhdGlvbnM+IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB4dXBkYXRlOmluc2VydC1iZWZvcmUKLSAgICAgKiBAcGFyYW0gcG5hbWUgVGhlIG5vZGUgdG8gaW5zZXJ0IGJlZm9yZQotICAgICAqIEByZXR1cm4gVGhlIFh1cGRhdGUgc3RhdGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5zZXJ0QmVmb3JlKFN0cmluZyBwbmFtZSkgewotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiLmluc2VydEJlZm9yZSgpIElOU0VSVC1CRUZPUkUgTm9kZTogIiArIHBuYW1lKTsKLSAgICAgICAgcmV0dXJuICI8eHVwZGF0ZTptb2RpZmljYXRpb25zIHhtbG5zOnh1cGRhdGU9XCJodHRwOi8vd3d3LnhtbGRiLm9yZy94dXBkYXRlXCI+IiArIHBuYW1lCi0gICAgICAgICAgICAgICAgKyAiPC94dXBkYXRlOm1vZGlmaWNhdGlvbnM+IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB4dXBkYXRlOmluc2VydC1hZnRlcgotICAgICAqIEBwYXJhbSBwbmFtZSBUaGUgbm9kZSB0byBpbnNlcnQgYWZ0ZXIKLSAgICAgKiBAcmV0dXJuIFRoZSBYdXBkYXRlIHN0YXRlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGluc2VydEFmdGVyKFN0cmluZyBwbmFtZSkgewotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiLmluc2VydEFmdGVyKCkgSU5TRVJULUFGVEVSIE5vZGU6ICIgKyBwbmFtZSk7Ci0gICAgICAgIHJldHVybiAiPHh1cGRhdGU6bW9kaWZpY2F0aW9ucyB4bWxuczp4dXBkYXRlPVwiaHR0cDovL3d3dy54bWxkYi5vcmcveHVwZGF0ZVwiPiIgKyBwbmFtZQotICAgICAgICAgICAgICAgICsgIjwveHVwZGF0ZTptb2RpZmljYXRpb25zPiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogeHVwZGF0ZTpyZW1vdmUKLSAgICAgKiBAcGFyYW0gcG5hbWUgVGhlIG5vZGUgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiBUaGUgWHVwZGF0ZSBzdGF0ZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZW1vdmUoU3RyaW5nIHBuYW1lKSB7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIucmVtb3ZlKCkgUkVNT1ZFIE5vZGU6ICIgKyBwbmFtZSk7Ci0gICAgICAgIHJldHVybiAiPHh1cGRhdGU6bW9kaWZpY2F0aW9ucyB4bWxuczp4dXBkYXRlPVwiaHR0cDovL3d3dy54bWxkYi5vcmcveHVwZGF0ZVwiPiIgKyBwbmFtZQotICAgICAgICAgICAgICAgICsgIjwveHVwZGF0ZTptb2RpZmljYXRpb25zPiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVudW1iZXIgdGhlIHRhZ3Mgd2l0aGluIGEgZG9jdW1lbnQuIEVhY2ggdGFnIGdldHMgYSB1bmlxdWUgbnVtYmVyIHVzZWQgaW4gWHVwZGF0ZQotICAgICAqIGV4cHJlc3Npb25zLgotICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHJlbnVtYmVyCi0gICAgICogQHBhcmFtIHVubnVtYmVyVGFnc1hTTCBUaGUgWFNMIHN0eWxlc2hlZXQgdG8gcmVtb3ZlIHRoZSB0YWdJRCBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gbnVtYmVyVGFnc1hTTCBUaGUgWFNMIHN0eWxlc2hlZXQgdG8gYWRkIHRoZSB0YWdJRCBhdHRyaWJ1dGUKLSAgICAgKiBAcmV0dXJuIFRoZSByZW51bWJlcmVkIGRvY3VtZW50Ci0gICAgICogQHRocm93cyBVc2VjYXNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBEb2N1bWVudCByZW51bWJlckRvY3VtZW50KERvY3VtZW50IGRvYywgU291cmNlIHVubnVtYmVyVGFnc1hTTCwgU291cmNlIG51bWJlclRhZ3NYU0wpCi0gICAgICAgICAgICB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHBhcnNlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgICAgICAgICBwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgICAgcGFyc2VyRmFjdG9yeS5zZXRJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gcGFyc2VyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQotICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0YWdJRHMKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHV0ID0gdGYubmV3VHJhbnNmb3JtZXIobmV3IFN0cmVhbVNvdXJjZSh1bm51bWJlclRhZ3NYU0wuZ2V0SW5wdXRTdHJlYW0oKSkpOwotICAgICAgICAgICAgRG9jdW1lbnQgdW5udW1iZXJlZERvY3VtZW50ID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICAgICAgdXQudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jKSwgbmV3IERPTVJlc3VsdCh1bm51bWJlcmVkRG9jdW1lbnQpKTsKLQotICAgICAgICAgICAgLy8gQWRkIHRhZ0lEcwotICAgICAgICAgICAgVHJhbnNmb3JtZXIgbnQgPSB0Zi5uZXdUcmFuc2Zvcm1lcihuZXcgU3RyZWFtU291cmNlKG51bWJlclRhZ3NYU0wuZ2V0SW5wdXRTdHJlYW0oKSkpOwotICAgICAgICAgICAgRG9jdW1lbnQgcmVudW1iZXJlZERvY3VtZW50ID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICAgICAgbnQudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UodW5udW1iZXJlZERvY3VtZW50KSwgbmV3IERPTVJlc3VsdChyZW51bWJlcmVkRG9jdW1lbnQpKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlbnVtYmVyZWREb2N1bWVudDsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVc2VjYXNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHBhcmVudCBlbGVtZW50Ci0gICAgICogQHBhcmFtIHhtbFNuaXBwZXQgVGhlIFhNTCBzbmlwcGV0IHRvIHJlbW92ZSB0aGUgcGFyZW50IGZyb20KLSAgICAgKiBAcmV0dXJuIFRoZSBYTUwgc25pcHBldCB3aXRoIHRoZSBwYXJlbnQgcmVtb3ZlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJlbW92ZVBhcmVudChTdHJpbmcgeG1sU25pcHBldCkgewotICAgICAgICBTdHJpbmcgeG1sU25pcHBldFdpdGhvdXRQYXJlbnQgPSB4bWxTbmlwcGV0OwotICAgICAgICB4bWxTbmlwcGV0V2l0aG91dFBhcmVudCA9IHhtbFNuaXBwZXRXaXRob3V0UGFyZW50LnN1YnN0cmluZyh4bWxTbmlwcGV0V2l0aG91dFBhcmVudC5pbmRleE9mKCI+IikgKyAxKTsKLSAgICAgICAgeG1sU25pcHBldFdpdGhvdXRQYXJlbnQgPSBTdHJpbmdVdGlscy5yZXZlcnNlKHhtbFNuaXBwZXRXaXRob3V0UGFyZW50KTsKLSAgICAgICAgeG1sU25pcHBldFdpdGhvdXRQYXJlbnQgPSB4bWxTbmlwcGV0V2l0aG91dFBhcmVudC5zdWJzdHJpbmcoeG1sU25pcHBldFdpdGhvdXRQYXJlbnQuaW5kZXhPZigiPCIpICsgMSk7Ci0gICAgICAgIHhtbFNuaXBwZXRXaXRob3V0UGFyZW50ID0gU3RyaW5nVXRpbHMucmV2ZXJzZSh4bWxTbmlwcGV0V2l0aG91dFBhcmVudCk7Ci0gICAgICAgIHJldHVybiB4bWxTbmlwcGV0V2l0aG91dFBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmVmaXggcmVzb2x2ZXIgd2hpY2ggdXNlcyB0aGUgdXNlY2FzZSBwYXJhbWV0ZXJzIGxpa2UKLSAgICAgKiAibmFtZXNwYWNlLnhodG1sPWh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHRvIHJlc29sdmUgcHJlZml4ZXMuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIEZvcm1QcmVmaXhSZXNvbHZlciBleHRlbmRzIFByZWZpeFJlc29sdmVyRGVmYXVsdCB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEN0b3IuCi0gICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG5vZGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRm9ybVByZWZpeFJlc29sdmVyKE5vZGUgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnhtbC51dGlscy5QcmVmaXhSZXNvbHZlciNnZXROYW1lc3BhY2VGb3JQcmVmaXgoamF2YS5sYW5nLlN0cmluZywKLSAgICAgICAgICogICAgICBvcmcudzNjLmRvbS5Ob2RlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCwgTm9kZSBjb250ZXh0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gc3VwZXIuZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCwgY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cmkgPSBGb3Jtc0VkaXRvci50aGlzLmdldFBhcmFtZXRlckFzU3RyaW5nKCJuYW1lc3BhY2UuIiArIHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdXJpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gImVkaXQiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9lZGl0b3JzL2Zvcm1zL09uZUZvcm1FZGl0b3IuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy9mb3Jtcy9PbmVGb3JtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODM2Y2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9lZGl0b3JzL2Zvcm1zL09uZUZvcm1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy5mb3JtczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkRvY3VtZW50VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS54bWwuVXNlY2FzZUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuVXNlY2FzZVdvcmtmbG93SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5WYWxpZGF0aW9uVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogT25lIGZvcm0gZWRpdG9yLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVGb3JtRWRpdG9yIGV4dGVuZHMgRG9jdW1lbnRVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZ2V0Tm9kZXNUb0xvY2soKQotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgU2V0IG5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgaWYgKGRvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBub2Rlcy5hZGQoZG9jLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAob3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10pCi0gICAgICAgICAgICBub2Rlcy50b0FycmF5KG5ldyBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbbm9kZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKCFoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgVXNlY2FzZVdvcmtmbG93SGVscGVyLmNoZWNrV29ya2Zsb3codGhpcy5tYW5hZ2VyLCB0aGlzLCBnZXRFdmVudCgpLCBnZXRTb3VyY2VEb2N1bWVudCgpLAotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpKTsKLSAgICAgICAgfQotICAgICAgICBzZXRQYXJhbWV0ZXIoImV4ZWN1dGFibGUiLCBCb29sZWFuLnZhbHVlT2YoIWhhc0Vycm9ycygpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLQotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBnZXRFbmNvZGluZygpOwotICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldFhtbFN0cmluZyhlbmNvZGluZyk7Ci0gICAgICAgIHNhdmVEb2N1bWVudChlbmNvZGluZywgY29udGVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gQ29udGV4dEhlbHBlci5nZXRSZXF1ZXN0KHRoaXMuY29udGV4dCk7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0WG1sU3RyaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICAvLyBHZXQgbmFtZXNwYWNlcwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlcyA9IHJlbW92ZVJlZHVuZGFudE5hbWVzcGFjZXMoZ2V0UGFyYW1ldGVyQXNTdHJpbmcoIm5hbWVzcGFjZXMiKSk7Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyhuYW1lc3BhY2VzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBBZ2dyZWdhdGUgY29udGVudAotICAgICAgICBTdHJpbmcgY29udGVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCI/PlxuIgotICAgICAgICAgICAgICAgICsgYWRkTmFtZXNwYWNlcyhuYW1lc3BhY2VzLCBnZXRQYXJhbWV0ZXJBc1N0cmluZygiY29udGVudCIpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWR2YW5jZSgpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgY2xlYXJFcnJvck1lc3NhZ2VzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudCB4bWwgPSBnZXRYbWwoKTsKLSAgICAgICAgICAgIGlmICh4bWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlKHhtbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICAgICAgU291cmNlVXRpbC53cml0ZURPTSh4bWwsIGdldFNvdXJjZURvY3VtZW50KCkuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIGRlbGV0ZVBhcmFtZXRlcigiY29udGVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVzZWNhc2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotICAgICAgICBpZiAoaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50IHhtbCA9IGdldFhtbCgpOwotICAgICAgICBpZiAoeG1sICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlKHhtbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShEb2N1bWVudCB4bWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRSZXNvdXJjZVR5cGUoKTsKLSAgICAgICAgU2NoZW1hIHNjaGVtYSA9IHJlc291cmNlVHlwZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgVmFsaWRhdGlvblV0aWwudmFsaWRhdGUodGhpcy5tYW5hZ2VyLCB4bWwsIHNjaGVtYSwgbmV3IFVzZWNhc2VFcnJvckhhbmRsZXIodGhpcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudCBnZXRYbWwoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBnZXRFbmNvZGluZygpOwotICAgICAgICBTdHJpbmcgeG1sU3RyaW5nID0gZ2V0WG1sU3RyaW5nKGVuY29kaW5nKTsKLQotICAgICAgICBEb2N1bWVudCB4bWwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgeG1sID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KHhtbFN0cmluZywgZW5jb2RpbmcpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJlcnJvci1kb2N1bWVudC1mb3JtIiwgbmV3IFN0cmluZ1tdIHsgZS5nZXRNZXNzYWdlKCkgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50IHRvIHRoZSBkb2N1bWVudCBzb3VyY2UuIEFmdGVyIHNhdmluZywgdGhlIFhNTCBpcwotICAgICAqIHZhbGlkYXRlZC4gSWYgdmFsaWRhdGlvbiBlcnJvcnMgb2NjdXIsIHRoZSB1c2VjYXNlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZAotICAgICAqIGJhY2ssIHNvIHRoZSBjaGFuZ2VzIGFyZSBub3QgcGVyc2lzdGVudC4gSWYgdGhlIHZhbGlkYXRpb24gc3VjY2VlZGVkLCB0aGUKLSAgICAgKiB3b3JrZmxvdyBldmVudCBpcyBpbnZva2VkLgotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2RpbmcgdG8gdXNlLgotICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHNhdmUuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVEb2N1bWVudChTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2F2ZVhNTEZpbGUoZW5jb2RpbmcsIGNvbnRlbnQsIGdldFNvdXJjZURvY3VtZW50KCkpOwotCi0gICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBnZXRTb3VyY2VEb2N1bWVudCgpLAotICAgICAgICAgICAgICAgIGdldEV2ZW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIFhNTCBmaWxlCi0gICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZwotICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBzb3VyY2UKLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSB3YXMgbm90IGZvdW5kCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIHRoZSBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZVhNTEZpbGUoU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgY29udGVudCwKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLAotICAgICAgICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihkb2N1bWVudC5nZXRPdXRwdXRTdHJlYW0oKSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNvbnRlbnQsIDAsIGNvbnRlbnQubGVuZ3RoKCkpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIkZpbGUgbm90IGZvdW5kICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJFbmNvZGluZyBub3Qgc3VwcG9ydGVkICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiSU8gZXJyb3IgIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBjbG9zZSBhbGwgc3RyZWFtcwotICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHJlZHVuZGFudCBuYW1lc3BhY2VzCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIG5hbWVzcGFjZXMgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiBUaGUgbmFtZXNwYWNlIHN0cmluZyB3aXRob3V0IHRoZSByZW1vdmVkIG5hbWVzcGFjZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZW1vdmVSZWR1bmRhbnROYW1lc3BhY2VzKFN0cmluZyBuYW1lc3BhY2VzKSB7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuc3BsaXQoIiAiKTsKLQotICAgICAgICBTdHJpbmcgbnMgPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChucy5pbmRleE9mKG5hbWVzcGFjZVtpXSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbnMgPSBucyArICIgIiArIG5hbWVzcGFjZVtpXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlZHVuZGFudCBuYW1lc3BhY2U6ICIgKyBuYW1lc3BhY2VbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIG5hbWVzcGFjZXMKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbmFtZXNwYWNlcyB0byBhZGQKLSAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byBhZGQgdGhlbSB0bwotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgd2l0aCB0aGUgYWRkZWQgbmFtZXNwYWNlcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFkZE5hbWVzcGFjZXMoU3RyaW5nIG5hbWVzcGFjZXMsIFN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgIGludCBpID0gY29udGVudC5pbmRleE9mKCI+Iik7Ci0gICAgICAgIHJldHVybiBjb250ZW50LnN1YnN0cmluZygwLCBpKSArICIgIiArIG5hbWVzcGFjZXMgKyBjb250ZW50LnN1YnN0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gImVkaXQiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwMGIwZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aS54bWwgNDQ3Mzk1IDIwMDYtMDktMTggMTM6MDE6MzNaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJlbiIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLSAgDQotICA8bWVzc2FnZSBrZXk9IlJlZm9ybWF0Ij5SZWZvcm1hdDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0TGluay5oZWFkaW5nIj5JbnNlcnQgTGluazwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0TGluay5jbGlja1RyZWVPclR5cGUiPg0KLSAgICBZb3UgY2FuIGVpdGhlciBjbGljayBvbiBhIG5vZGUgaW4gdGhlIHRyZWUgZm9yIGFuIGludGVybmFsIGxpbmsgb3IgZW50ZXIgYSBsaW5rIGluIHRoZSBVUkwgZmllbGQuDQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydExpbmsuVVJMIj5VUkw8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydExpbmsudGV4dCI+TGluayB0ZXh0PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRMaW5rLnRpdGxlIj5MaW5rIHRpdGxlPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRMaW5rLnN1Ym1pdCI+SW5zZXJ0IExpbms8L21lc3NhZ2U+DQotICANCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0QXNzZXQuaGVhZGluZ0Fzc2V0Ij5JbnNlcnQgQXNzZXQ8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LmhlYWRpbmdJbWFnZSI+SW5zZXJ0IEltYWdlPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5hdmFpbGFibGVBc3NldCI+QXZhaWxhYmxlIGFzc2V0czwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0QXNzZXQuYXZhaWxhYmxlSW1hZ2UiPkF2YWlsYWJsZSBpbWFnZXM8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LmZpbGUiPkZpbGU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LnByZXZpZXciPlByZXZpZXc8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LnRpdGxlIj5UaXRsZTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0QXNzZXQuZmlsZVNpemUiPlNpemU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LmltYWdlU2l6ZSI+VyB4IEg8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LmNyZWF0aW9uRGF0ZSI+Y3JlYXRlZDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0QXNzZXQuY2FwdGlvbkltYWdlIj5JbWFnZSBkZXNjcmlwdGlvbjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0QXNzZXQuY2FwdGlvbkFzc2V0Ij5Bc3NldCB0ZXh0PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC53aWR0aCI+V2lkdGg8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LmhlaWdodCI+aGVpZ2h0PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5pbnNlcnRBc3NldCI+SW5zZXJ0IGFzc2V0PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5pbnNlcnRJbWFnZSI+SW5zZXJ0IGltYWdlPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5jcmVhdGVSZXNvdXJjZSI+VXBsb2FkIG5ldyByZXNvdXJjZTwvbWVzc2FnZT4KLSAgCi0gIDxtZXNzYWdlIGtleT0iQ2hvb3NlIGVsZW1lbnQgLi4uIj5DaG9vc2UgZWxlbWVudCAuLi48L21lc3NhZ2U+DQotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhOTljMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aS54bWwgNDQ3Mzk1IDIwMDYtMDktMTggMTM6MDE6MzNaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJkZSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLSAgDQotICA8bWVzc2FnZSBrZXk9IlJlZm9ybWF0Ij5Gb3JtYXRpZXJlbjwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0TGluay5oZWFkaW5nIj5MaW5rIGVpbmbDvGdlbjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0TGluay5jbGlja1RyZWVPclR5cGUiPg0KLSAgICBTaWUga8O2bm5lbiBlbnR3ZWRlciBlaW4gRG9rdW1lbnQgaW0gQmF1bSBhdXN3w6RobGVuIG9kZXIgZWluZSBiZWxpZWJpZ2UgVVJMIGVpbmdlYmVuLg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRMaW5rLlVSTCI+VVJMPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRMaW5rLnRleHQiPkxpbmstVGV4dDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0TGluay50aXRsZSI+TGluay1UaXRlbDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0TGluay5zdWJtaXQiPkxpbmsgZWluZsO8Z2VuPC9tZXNzYWdlPiANCi0gICANCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0QXNzZXQuaGVhZGluZ0Fzc2V0Ij5BbmxhZ2UgZWluZsO8Z2VuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5oZWFkaW5nSW1hZ2UiPkJpbGQgZWluZsO8Z2VuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5hdmFpbGFibGVBc3NldCI+VmVyZsO8Z2JhcmUgQW5sYWdlbjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0QXNzZXQuYXZhaWxhYmxlSW1hZ2UiPlZlcmbDvGdiYXJlIEJpbGRlcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW5zZXJ0QXNzZXQuZmlsZSI+RGF0ZWk8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LnByZXZpZXciPlZvcnNjaGF1PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC50aXRsZSI+VGl0ZWw8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LmZpbGVTaXplIj5HcsO2w59lPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5pbWFnZVNpemUiPkIgeCBIPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5jcmVhdGlvbkRhdGUiPmVyc3RlbGx0IGFtPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5jYXB0aW9uQXNzZXQiPkFubGFnZW50ZXh0PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5jYXB0aW9uSW1hZ2UiPkJpbGRiZXNjaHJlaWJ1bmc8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LndpZHRoIj5CcmVpdGU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LmhlaWdodCI+SMO2aGU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0Lmluc2VydEFzc2V0Ij5BbmxhZ2UgZWluZsO8Z2VuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJpbnNlcnRBc3NldC5pbnNlcnRJbWFnZSI+QmlsZCBlaW5mw7xnZW48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Imluc2VydEFzc2V0LmNyZWF0ZVJlc291cmNlIj5OZXVlIERhdGVpIGhvY2hsYWRlbi4uLjwvbWVzc2FnZT4NCi0KLSAgPG1lc3NhZ2Uga2V5PSJDaG9vc2UgZWxlbWVudCAuLi4iPkVsZW1lbnQgd8OkaGxlbiAuLi48L21lc3NhZ2U+Ci08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9qYXZhc2NyaXB0L2Rpc2FibGViYWNrc3BhY2UuanMgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9qYXZhc2NyaXB0L2Rpc2FibGViYWNrc3BhY2UuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjA4ZjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kaXNhYmxlYmFja3NwYWNlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0qIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0qIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0qICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0qIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8qIAotKiBQcm9jZXNzZXMgdGhlIGV2ZW50LiBPcmRlcmluZyBpcyBpbXBvcnRhbnQgZm9yIE9wZXJhIDkgb24gV2luZG93cywKLSogYXMgaXQgbXVzdCB1c2UgdGhlIE1vemlsbGEgc3R5bGUgY29kZSwgYnV0IHdpbGwgbWF0Y2ggSUUgc3R5bGUgY29kZS4KLSovCi1mdW5jdGlvbiBMZW55YURpc2FibGVCYWNrc3BhY2UoZSkKLXsKLSAgLy8gTW96aWxsYSBzdHlsZSBjb2RlIGZvciBPcGVyYSBhbmQgU2FmYXJpIGFzIHdlbGwKLSAgLy8gRm9yIE9wZXJhIDkgdW5kZXIgV2luZG93cyB0byB3b3JrIHByb3Blcmx5LCB0aGUgTW96aWxsYSB0ZXN0IG11c3QgYmUgZmlyc3QuCi0gIGlmKHR5cGVvZiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICE9ICd1bmRlZmluZWQnKSB7Ci0gICAgdmFyIHNyYyA9IGUudGFyZ2V0LnR5cGU7Ci0gICAgdmFyIGtleSA9IGUud2hpY2g7Ci0gICAgaWYoIGtleSA9PSA4ICYmIChzcmMgIT0gJ3RleHQnICYmIHNyYyAhPSAndGV4dGFyZWEnKSkgewotICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgLy8gSUUgc3R5bGUgY29kZSBmb3IgSUUgNiBhbmQgSUUgNy4gU2hvdWxkIHdvcmsgb24gSUUgNS41KwotICBlbHNlIGlmKHR5cGVvZiBkb2N1bWVudC5hdHRhY2hFdmVudCAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZXZlbnQpIHsKLSAgICB2YXIgc3JjID0gZXZlbnQuc3JjRWxlbWVudC50eXBlOwotICAgIHZhciBrZXkgPSB3aW5kb3cuZXZlbnQua2V5Q29kZTsKLSAgICBpZihrZXkgPT0gOCAmJiAoc3JjICE9ICd0ZXh0JyAmJiBzcmMgIT0gJ3RleHRhcmVhJykpIHsKLSAgICAgIHdpbmRvdy5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSogUmVnaXN0ZXIgZXZlbnQgaGFuZGxlci4KLSogVGhpcyBkb2VzIG5vdCBuZWVkIHRvIHdhaXQgZm9yIG9ubG9hZCB0byBmaXJlLgotKi8KLS8vIE1vemlsbGEgc3R5bGUgZm9yIE9wZXJhIGFuZCBTYWZhcmkgYXMgd2VsbAotaWYodHlwZW9mIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgIT0gJ3VuZGVmaW5lZCcpIHsKLSAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLExlbnlhRGlzYWJsZUJhY2tzcGFjZSxmYWxzZSk7Ci19Ci0vLyBJRSBzdHlsZSBjb2RlIGZvciBJRSA2IGFuZCBJRSA3LiBTaG91bGQgd29yayBvbiBJRSA1LjUrCi1lbHNlIGlmKHR5cGVvZiBkb2N1bWVudC5hdHRhY2hFdmVudCAhPSAndW5kZWZpbmVkJykgewotICBkb2N1bWVudC5hdHRhY2hFdmVudCgnb25rZXlkb3duJyxMZW55YURpc2FibGVCYWNrc3BhY2UpOwotfQotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9qYXZhc2NyaXB0L2luc2VydEFzc2V0LmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9yZXNvdXJjZXMvamF2YXNjcmlwdC9pbnNlcnRBc3NldC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5MmEzNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9qYXZhc2NyaXB0L2luc2VydEFzc2V0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqCi0gICogdXBkYXRlcyB0aGUgaGlkZGVuIGZvcm0gZGF0YSB3aGVuZXZlciB0aGUgdXNlciBzZWxlY3RzIGEgbmV3IGFzc2V0IHJhZGlvYnV0dG9uLgotICAqLwotZnVuY3Rpb24gdXBkYXRlRGF0YSh1cmwsIHRpdGxlLCBoZWlnaHQsIHdpZHRoLCB0eXBlKSB7IAotICAKLSAgdmFyIHRleHQgPSBkb2N1bWVudC5mb3Jtc1siaW5zZXJ0QXNzZXQiXS50ZXh0LnZhbHVlOwotICBpZiAodGV4dCAmJiB0ZXh0ICE9IGRvY3VtZW50LmZvcm1zWyJpbnNlcnRBc3NldCJdLnRpdGxlLnZhbHVlKSB7Ci0gICAgLy8gaWYgdGhlIHVzZXIgaGFzIHByb3ZpZGVkIGFuIGVudHJ5IGZvciAidGV4dCIgCi0gICAgLy8gICAgKG90aGVyIHRoYW4gYSBjb3B5IG9mICJ0aXRsZSIpLCB1c2UgdGhhdDoKLSAgICB0ZXh0ICA9IGRvY3VtZW50LmZvcm1zWyJpbnNlcnRBc3NldCJdLnRleHQudmFsdWU7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gb3RoZXJ3aXNlIGp1c3QgY29weSB0aGUgdGl0bGUgdmFsdWU6Ci0gICAgdGV4dCA9IHRpdGxlOwotICB9Ci0gIC8vIHdlIHN0b3JlIHRoZSByYXRpbyB3aXRoIGV2ZXJ5IGltYWdlIGZvciBjb3JyZWN0IHJlLXNjYWxpbmcuCi0gIHZhciByYXRpbyA9IDE7Ci0gIGlmICh3aWR0aCAhPSAwKSB7Ci0gICAgcmF0aW8gPSBoZWlnaHQgLyB3aWR0aDsKLSAgfQotICBkb2N1bWVudC5mb3Jtc1siaW5zZXJ0QXNzZXQiXS5yYXRpby52YWx1ZSA9IHJhdGlvOwotCi0gIHZhciBvYmplY3REYXRhID0gbmV3IG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5PYmplY3REYXRhKHsKLSAgICB1cmwgICAgOiB1cmwsCi0gICAgdGl0bGUgIDogdGl0bGUsCi0gICAgdGV4dCAgIDogdGV4dCwKLSAgICBoZWlnaHQgOiBoZWlnaHQsCi0gICAgd2lkdGggIDogd2lkdGgsCi0gICAgdHlwZSAgIDogdHlwZQotICB9KTsKLSAgLy9hbGVydCgiU2V0dGluZyBmb3JtIGRhdGE6IiArIG9iamVjdERhdGEudG9TdHJpbmcoKSk7Ci0gIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5zZXRGb3JtVmFsdWVzKCJpbnNlcnRBc3NldCIsIG9iamVjdERhdGEpOwotfQotCi0vKioKLSAgKiB1cGRhdGVzIHRoZSBoZWlnaHQgdG8gbWFpbnRhaW4gY29ycmVjdCByYXRpbyB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHdpZHRoCi0gICovCi1mdW5jdGlvbiBzY2FsZUhlaWdodCh3aWR0aCkgewotICB2YXIgcmF0aW8gPSBkb2N1bWVudC5mb3Jtc1snaW5zZXJ0QXNzZXQnXS5yYXRpby52YWx1ZTsKLSAgZG9jdW1lbnQuZm9ybXNbJ2luc2VydEFzc2V0J10uaGVpZ2h0LnZhbHVlID0gd2lkdGggKiByYXRpbzsKLSAgZm9jdXMoKTsgCi19IAotCi0vKioKLSAgKiB1cGRhdGVzIHRoZSB3aWR0aCB0byBtYWludGFpbiBjb3JyZWN0IHJhdGlvIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyB0aGUgaGVpZ2h0Ci0gICovCi1mdW5jdGlvbiBzY2FsZVdpZHRoKGhlaWdodCkgewotICB2YXIgcmF0aW8gPSBkb2N1bWVudC5mb3Jtc1snaW5zZXJ0QXNzZXQnXS5yYXRpby52YWx1ZTsKLSAgZG9jdW1lbnQuZm9ybXNbJ2luc2VydEFzc2V0J10ud2lkdGgudmFsdWUgPSBoZWlnaHQgKiByYXRpbzsKLSAgZm9jdXMoKTsgCi19IAotCi13aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7Ci0gIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5oYW5kbGVGb3JtTG9hZCgiaW5zZXJ0QXNzZXQiKTsKLX07CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9qYXZhc2NyaXB0L2luc2VydExpbmsuanMgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9qYXZhc2NyaXB0L2luc2VydExpbmsuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTBlMzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9yZXNvdXJjZXMvamF2YXNjcmlwdC9pbnNlcnRMaW5rLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vKiBDb25zdHJ1Y3RvciBmb3IgTGlua1RyZWUgb2JqZWN0ICovCi1mdW5jdGlvbiBMaW5rVHJlZShkb2MsIHRyZWVFbGVtZW50KSB7Ci0gICAgdGhpcy5kb2MgPSBkb2M7Ci0gICAgdGhpcy50cmVlRWxlbWVudCA9IHRyZWVFbGVtZW50OwotICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsOwotfQotCi0vKioKLSAgKiBGSVhNRTogQ0hPU0VOX0xBTkdVQUdFIHNob3VsZCBub3QgYmUgYSBnbG9iYWwgdmFyaWFibGUhCi0gICogYSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBMaW5rVHJlZSBvYmplY3QuCi0gICovCi1mdW5jdGlvbiBzZXRMaW5rKHV1aWQpIHsKLSAgICB2YXIgbGFuZ3VhZ2UgPSBDSE9TRU5fTEFOR1VBR0U7Ci0gICAgZG9jdW1lbnQuZm9ybXNbImluc2VydExpbmsiXS51cmwudmFsdWUgPSAibGVueWEtZG9jdW1lbnQ6IiArIHV1aWQgKyAiLGxhbmc9IiArIGxhbmd1YWdlOwotfQotCi0KLWZ1bmN0aW9uIGJ1aWxkVHJlZSgpIHsKLSAgICB2YXIgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJlZScpOwotICAgIHZhciB0cmVlID0gbmV3IExpbmtUcmVlKGRvY3VtZW50LCBwbGFjZWhvbGRlcik7Ci0gICAgdHJlZS5pbml0KFBVQkxJQ0FUSU9OX0lEKTsKLSAgICB0cmVlLnJlbmRlcigpOwotICAgIHRyZWUubG9hZEluaXRpYWxUcmVlKEFSRUEsIERPQ1VNRU5UX0lEKTsKLX0KLQotTGlua1RyZWUucHJvdG90eXBlID0gbmV3IE5hdlRyZWU7Ci1MaW5rVHJlZS5wcm90b3R5cGUuaGFuZGxlSXRlbUNsaWNrID0gZnVuY3Rpb24oaXRlbSwgZXZlbnQpIHsKLSAgICBzZXRMaW5rKGl0ZW0udXVpZCk7Ci19Ci0KLXdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKLSAgYnVpbGRUcmVlKCk7Ci0gIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5oYW5kbGVGb3JtTG9hZCgnaW5zZXJ0TGluaycpOwotfTsKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvcmVzb3VyY2VzL2phdmFzY3JpcHQvb25lZm9ybV9sZW55YV9nbHVlLmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9yZXNvdXJjZXMvamF2YXNjcmlwdC9vbmVmb3JtX2xlbnlhX2dsdWUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMGIxZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy9yZXNvdXJjZXMvamF2YXNjcmlwdC9vbmVmb3JtX2xlbnlhX2dsdWUuanMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuc2V0T2JqZWN0RGF0YSA9IGZ1bmN0aW9uKG9iamVjdERhdGEsIHdpbmRvd05hbWUpIHsKLSAgdmFyIGN1cnJlbnRVc2VjYXNlID0gdXNlY2FzZU1hcFt3aW5kb3dOYW1lXTsKLSAgdmFyIHNuaXBwZXQgPSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2VuZXJhdGVDb250ZW50U25pcHBldChjdXJyZW50VXNlY2FzZSwgb2JqZWN0RGF0YSk7Ci0gIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5pbnNlcnRDb250ZW50KAotICAgIGRvY3VtZW50LmZvcm1zWydvbmVmb3JtJ10uZWxlbWVudHNbJ2NvbnRlbnQnXSwgCi0gICAgc25pcHBldAotICApOwotICB1c2VjYXNlTWFwW3dpbmRvd05hbWVdID0gdW5kZWZpbmVkOyAvLyB3ZSdyZSBkb25lIQotICBvYmplY3REYXRhW3dpbmRvd05hbWVdID0gdW5kZWZpbmVkOyAvLyB3ZSdyZSBkb25lIQotfQotCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2V0T2JqZWN0RGF0YSA9IGZ1bmN0aW9uKHdpbmRvd05hbWUpIHsKLSAgcmV0dXJuIG9iamVjdERhdGFbd2luZG93TmFtZV07Ci19Ci0KLWZ1bmN0aW9uIHRyaWdnZXJVc2VjYXNlKHVzZWNhc2UpIHsKLSAgdmFyIHdpbmRvd05hbWUgPSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2VuZXJhdGVVbmlxdWVXaW5kb3dOYW1lKCk7Ci0gIHZhciBzZWxlY3RlZFRleHQgPSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2V0U2VsZWN0ZWRUZXh0KGRvY3VtZW50LmZvcm1zWzBdLmVsZW1lbnRzWydjb250ZW50J10pOwotICBzd2l0Y2ggKHVzZWNhc2UpIHsKLQotICAgIGNhc2Ugb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUTElOSzoKLSAgICAgIG9iamVjdERhdGFbd2luZG93TmFtZV0gPSBuZXcgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLk9iamVjdERhdGEoewotICAgICAgICB1cmwgICA6ICIiLAotICAgICAgICB0ZXh0ICA6IHNlbGVjdGVkVGV4dCwKLSAgICAgICAgdGl0bGUgOiAiIgotICAgICAgfSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUSU1BR0U6Ci0gICAgICBvYmplY3REYXRhW3dpbmRvd05hbWVdID0gbmV3IG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5PYmplY3REYXRhKHsKLSAgICAgICAgdXJsICAgOiAiIiwKLSAgICAgICAgdGV4dCAgOiBzZWxlY3RlZFRleHQsCi0gICAgICAgIHRpdGxlIDogIiIsCi0gICAgICAgIHdpZHRoIDogIiIsCi0gICAgICAgIGhlaWdodDogIiIKLSAgICAgIH0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVEFTU0VUOgotICAgICAgb2JqZWN0RGF0YVt3aW5kb3dOYW1lXSA9IG5ldyBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YSh7Ci0gICAgICAgIHVybCAgIDogIiIsCi0gICAgICAgIHRleHQgIDogc2VsZWN0ZWRUZXh0LAotICAgICAgICB0aXRsZSA6ICIiCi0gICAgICB9KQotICAgICAgYnJlYWs7Ci0gIH0KLSAgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLm9wZW5Vc2VjYXNlV2luZG93KHVzZWNhc2UsIHdpbmRvd05hbWUpOwotICB1c2VjYXNlTWFwW3dpbmRvd05hbWVdID0gdXNlY2FzZTsKLSAgLyogIGFsZXJ0KCJTdG9yZWQgdmFsdWVzIGZvciBuZXcgd2luZG93ICIgKyB3aW5kb3dOYW1lICsgIjpcbiIKLSAgICAgICsgIm9iamVjdERhdGFbd2luZG93TmFtZV0gPSAnIiArIG9iamVjdERhdGFbd2luZG93TmFtZV0gKyAiJ1xuIgotICAgICAgKyAidXNlY2FzZU1hcFt3aW5kb3dOYW1lXSA9ICciICsgdXNlY2FzZU1hcFt3aW5kb3dOYW1lXSArICInIgotICApOyAqLyAKLX0KLQotdmFyIG9iamVjdERhdGEgPSBuZXcgQXJyYXkoKTsKLXZhciB1c2VjYXNlTWFwID0gbmV3IEFycmF5KCk7CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3Jlc291cmNlcy9qYXZhc2NyaXB0L29yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5qcyBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvcmVzb3VyY2VzL2phdmFzY3JpcHQvb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGVhNjQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvcmVzb3VyY2VzL2phdmFzY3JpcHQvb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8vIGNyZWF0ZSBhIGRvbWFpbi1iYXNlZCAicGFja2FnZSIgdG8ga2VlcCB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBjbGVhbgotdmFyIG9yZzsKLWlmICghb3JnKSBvcmcgPSBuZXcgT2JqZWN0KCk7Ci1pZiAoIW9yZy5hcGFjaGUpIG9yZy5hcGFjaGUgPSBuZXcgT2JqZWN0KCk7Ci1pZiAoIW9yZy5hcGFjaGUubGVueWEpIG9yZy5hcGFjaGUubGVueWEgPSBuZXcgT2JqZWN0KCk7Ci1pZiAoIW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycykgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzID0gbmV3IE9iamVjdCgpOwotCi0vL2FsZXJ0KCJNb2R1bGUgJ29yZy5hcGFjaGUubGVueWEuZWRpdG9ycycgbG9hZGVkLiIpOwotCi0vKioKLSAgKiBPYmplY3REYXRhIGNvbnN0cnVjdG9yLCB0aGUgaW50ZXJmYWNlIGJldHdlZW4gZ2VuZXJpYyBlZGl0b3IgdXNlY2FzZXMKLSAgKiBhbmQgZWRpdG9yIG1vZHVsZXMuCi0gICoKLSAgKiBUaGUgaWRlYSBpcyB0byB1c2UgdGhlIHNhbWUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGxpbmtzLCBpbWFnZXMgYW5kIGFzc2V0cy4KLSAgKiBUaHVzLCBpbnNlcnRMaW5rLCBpbnNlcnRJbWFnZSBhbmQgaW5zZXJ0QXNzZXQgY2FuIGFsbCBzaGFyZSBtb3N0IG9mIHRoZSBqYXZhc2NyaXB0IGNvZGUuCi0gICoKLSAgKiBGSVhNRTogb2JqZWN0RGF0YSBpcyBhbiBleGNlcHRpb25hbGx5IHN0dXBpZCB0ZXJtLiBQbGVhc2UgZml4IGlmIHlvdSBjYW4gdGhpbmsgb2YgCi0gICogc29tZXRoaW5nIHRoYXQgZW5jb21wYXNzZXMgImRhdGEgZm9yIHRvLWJlLWluc2VydGVkIGxpbmtzLCBpbWFnZXMgYW5kIGFzc2V0cyBpbiBnZW5lcmFsIi4KLSAgKgotICAqIEBwYXJhbSBhbiBvcHRpb25hbCBoYXNoIG1hcCBvZiBpbml0aWFsIHZhbHVlcwotICAqLwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLk9iamVjdERhdGEgPSBmdW5jdGlvbihpbml0KSB7Ci0gIGlmIChpbml0KSB7Ci0gICAgZm9yICh2YXIgaSBpbiB0aGlzKSB7Ci0gICAgICBpZiAodHlwZW9mIHRoaXNbaV0gPT0gImZ1bmN0aW9uIikgY29udGludWU7IC8vIHNraXAgdGhlIG1ldGhvZHMhCi0gICAgICAvL2FsZXJ0KCJDaGVja2luZyB0aGlzWyIgKyBpICsgIl0sIGluaXRbIiArIGkgKyAiXSBpcyAnIiArIGluaXRbaV0gKyAiJy4iKTsKLSAgICAgIHRoaXNbaV0gPSBpbml0W2ldOwotICAgIH0KLSAgLy9hbGVydCgiQ3JlYXRlZCBuZXcgT2JqZWN0RGF0YSA9ICIgKyB0aGlzLnRvU3RyaW5nKCkpOwotICB9Ci19Ci0KLQotLyoqCi0gICogaHJlZiBmb3IgbGlua3MsIHNyYyBmb3IgYXNzZXRzIGFuZCBpbWFnZXMKLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5PYmplY3REYXRhLnByb3RvdHlwZS51cmwgPSB1bmRlZmluZWQ7Ci0KLS8qKgotICAqIFhIVE1MIHRpdGxlIGF0dHJpYnV0ZToKLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5PYmplY3REYXRhLnByb3RvdHlwZS50aXRsZSA9IHVuZGVmaW5lZDsKLQotLyoqCi0gICogZWxlbWVudCBjb250ZW50IGZvciBsaW5rcyBhbmQgYXNzZXRzLCBhbHQgdGV4dCBmb3IgaW1hZ2VzOiAKLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5PYmplY3REYXRhLnByb3RvdHlwZS50ZXh0ID0gdW5kZWZpbmVkOwotCi0vKioKLSAgKiB3aWR0aCBmb3IgaW1hZ2VzCi0gICovCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YS5wcm90b3R5cGUud2lkdGggPSB1bmRlZmluZWQ7Ci0KLS8qKgotICAqIGhlaWdodCBmb3IgaW1hZ2VzCi0gICovCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YS5wcm90b3R5cGUuaGVpZ2h0ID0gdW5kZWZpbmVkOwotCi0vKiogCi0gICogTUlNRSBUeXBlIGZvciBpbWFnZXMgYW5kIGFzc2V0cy4KLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5PYmplY3REYXRhLnByb3RvdHlwZS50eXBlID0gdW5kZWZpbmVkOwotCi0KLS8qKgotICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZWFzZSBkZWJ1Z2dpbmcuIFdpbGwgZHVtcCBhbGwgZmllbGRzIGluCi0gICogYSBodW1hbi1yZWFkYWJsZSBmYXNoaW9uLCBpbmNsdWRpbmcgdGhlaXIgdHlwZXMuCi0gICovCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgdmFyIHMgPSAiXG4iOwotICBmb3IgKHZhciBpIGluIHRoaXMpIHsKLSAgICBpZiAodHlwZW9mIHRoaXNbaV0gIT0gImZ1bmN0aW9uIikgewotICAgICAgcyArPSAiXHQiICsgaSArICI6IFsiICsgdGhpc1tpXSArICJdICgiICsgdHlwZW9mIHRoaXNbaV0gKyAiKVxuIjsKLSAgICB9Ci0gIH0gCi0gIHJldHVybiBzOwotfQotCi0KLS8qKgotICAqIHNldCBvYmplY3REYXRhIG9iamVjdCBpbiBlZGl0b3IKLSAgKgotICAqIFRoaXMgY2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgZWRpdG9yIHdpbmRvdy4KLSAgKiBJdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1c2VjYXNlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IAotICAqIGFuZCBtYWtlIHRoZSBvYnRhaW5lZCBkYXRhIGF2YWlsYWJsZSB0byB5b3VyIGVkaXRvci4KLSAgKiBIZXJlIHlvdSBtdXN0IGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IGNvZGUgdG8gZWl0aGVyIGFkZCB0aGUKLSAgKiBkYXRhIHRvIHlvdXIgZWRpdG9yIGFyZWEgZGlyZWN0bHkgKHlvdSBtYXkgd2FudCB0byB1c2UgCi0gICogb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdlbmVyYXRlQ29udGVudFNuaXBwZXQgIGFuZCAKLSAgKiBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuaW5zZXJ0Q29udGVudCBhcyBoZWxwZXJzKSwgb3IKLSAgKiB0byBmaWxsIHRoZSB2YWx1ZXMgaW50byBzb21lIGVkaXRvci1zcGVjaWZpYyBkaWFsb2cuCi0gICoKLSAgKiBJZiB5b3Ugd2FudCB0byBhbGxvdyBmb3IgbXVsdGlwbGUgYWN0aXZlIHVzZWNhc2Ugd2luZG93cyBpbiBwYXJhbGxlbCwKLSAgKiB5b3UgY2FuIHVzZSB0aGUgd2luZG93TmFtZSBwYXJhbWV0ZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCB3aW5kb3cKLSAgKiBhbmQgZG8geW91ciBvd24gYm9va2tlZXBpbmcuIAotICAqIENvbnNpZGVyIHVzaW5nIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5vcGVuVXNlY2FzZVdpbmRvdyB0byAKLSAgKiBtYW5hZ2UgeW91ciB3aW5kb3dzLgotICAqIAotICAqIEBwYXJhbSBvYmplY3REYXRhIGEgZGF0YSBvYmplY3QgYXMgZGVmaW5lZCBieSBvYmplY3REYXRhVGVtcGxhdGUKLSAgKiBAcGFyYW0gd2luZG93TmFtZSB0aGUgSUQgb2YgdGhlIHVzZWNhc2Ugd2luZG93ICh3aW5kb3cubmFtZSkuCi0gICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YQotICAqLwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLnNldE9iamVjdERhdGEgPSBmdW5jdGlvbihvYmplY3REYXRhLCB3aW5kb3dOYW1lKSB7Ci0gIGFsZXJ0KCJQcm9ncmFtbWluZyBlcnJvcjpcbiAgWW91IG11c3Qgb3ZlcnJpZGUgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLnNldE9iamVjdERhdGEob2JqZWN0RGF0YSwgd2luZG93TmFtZSkhIik7Ci19OwotCi0KLS8qKgotICAqIGdldCBvYmplY3REYXRhIG9iamVjdCBmcm9tIGVkaXRvcgotICAqCi0gICogVGhpcyBjYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSBlZGl0b3Igd2luZG93LiAKLSAgKiBUaGUgdXNlY2FzZSB3aWxsIHF1ZXJ5IHlvdXIgZWRpdG9yIGZvciBhbiBvYmplY3REYXRhIG9iamVjdCwgd2hpY2gKLSAgKiBpdCB3aWxsIHVzZSB0byBmaWxsIGZvcm0gZmllbGRzIHdpdGggZGVmYXVsdCB2YWx1ZXMgKGlmIHByb3ZpZGVkKS4KLSAgKiBBbGwgZm9ybSBmaWVsZHMgd2hvc2UgdmFsdWVzIGluIG9iamVjdERhdGEgYXJlIHVuZGVmaW5lZCB3aWxsIGJlIAotICAqIGRlYWN0aXZhdGVkLCBzbyB0aGF0IHlvdXIgZWRpdG9yIGNhbiBoYW5kbGUgdGhlbS4KLSAgKgotICAqIFVzdWFsbHksIGRlZmF1bHQgdmFsdWVzIGFyZSBiYXNlZCBvbiBzZWxlY3RlZCB0ZXh0IG9yIHVzZXIgc2V0dGluZ3MuCi0gICogQHBhcmFtIHdpbmRvd05hbWUgdGhlIElEIG9mIHRoZSB1c2VjYXNlIHdpbmRvdyAod2luZG93Lm5hbWUpLgotICAqIEByZXR1cm5zIGFuIG9iamVjdERhdGEgb2JqZWN0LgotICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLk9iamVjdERhdGEKLSAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5zZXRPYmplY3REYXRhCi0gICAqLwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdldE9iamVjdERhdGEgPSBmdW5jdGlvbih3aW5kb3dOYW1lKSB7Ci0gIGFsZXJ0KCJQcm9ncmFtbWluZyBlcnJvcjpcbiAgWW91IG11c3Qgb3ZlcnJpZGUgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdldE9iamVjdERhdGEod2luZG93TmFtZSkhIik7Ci19OwotCi0KLS8qKgotICAqIHNldHMgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIHVzZWNhc2UgZm9ybQotICAqCi0gICogVGhlIGZvcm0gZmllbGQgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBwcm9wZXJ0aWVzIG9mCi0gICogb2JqZWN0RGF0YVRlbXBsYXRlLgotICAqIE5vdGU6IGlmIGEgdmFsdWUgaW4gb2JqZWN0RGF0YSBpcyB1bmRlZmluZWQgKGFzIG9wcG9zZWQgdG8gIiIpLAotICAqIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0gZmllbGQgd2lsbCBiZSBkaXNhYmxlZCAoZ3JleWVkIG91dCkuCi0gICogRWRpdG9ycyBzaG91bGQgdXNlIHRoaXMgdG8gZGVhY3RpdmF0ZSBwcm9wZXJ0aWVzIHRoZXkgd2lzaAotICAqIHRvIGhhbmRsZSB0aGVtc2VsdmVzLgotICAqIEBwYXJhbSBmb3JtTmFtZSB0aGUgIm5hbWUiIGF0dHJpYnV0ZSBvZiB0aGUgZm9ybQotICAqIEBwYXJhbSBvYmplY3REYXRhIAotICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLm9iamVjdERhdGFUZW1wbGF0ZQotICAqLwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLnNldEZvcm1WYWx1ZXMgPSBmdW5jdGlvbihmb3JtTmFtZSwgb2JqZWN0RGF0YSkgewotICB2YXIgZm9ybSA9IGRvY3VtZW50LmZvcm1zW2Zvcm1OYW1lXTsKLSAgZm9yICh2YXIgaSBpbiBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YS5wcm90b3R5cGUpIHsKLSAgICBpZiAoZm9ybVtpXSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICBpZiAob2JqZWN0RGF0YVtpXSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgIGZvcm1baV0udmFsdWUgPSBvYmplY3REYXRhW2ldOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9ybVtpXS5kaXNhYmxlZCA9IHRydWU7Ci0gICAgICAgIGZvcm1baV0udGl0bGUgPSAiZGlzYWJsZWQgYnkgZWRpdG9yIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gCi19Ci0KLQotLyoqCi0gICogcmVhZHMgdGhlIHZhbHVlcyBmcm9tIHRoZSB1c2VjYXNlIGZvcm0KLSAgKgotICAqIFRoZSBmb3JtIGZpZWxkIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgcHJvcGVydGllcyBvZgotICAqIG9iamVjdERhdGFUZW1wbGF0ZS4KLSAgKiBAcGFyYW0gZm9ybU5hbWUgdGhlICJuYW1lIiBhdHRyaWJ1dGUgb2YgdGhlIGZvcm0KLSAgKiBAcmV0dXJucyBvYmplY3REYXRhCi0gICovCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2V0Rm9ybVZhbHVlcyA9IGZ1bmN0aW9uKGZvcm1OYW1lKSB7Ci0gIHZhciBmb3JtID0gZG9jdW1lbnQuZm9ybXNbZm9ybU5hbWVdOwotICB2YXIgb2JqZWN0RGF0YSA9IG5ldyBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YSgpOwotICBmb3IgKHZhciBpIGluIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5PYmplY3REYXRhLnByb3RvdHlwZSkgewotICAgIGlmIChmb3JtW2ldICE9PSB1bmRlZmluZWQpIHsKLSAgICAgIG9iamVjdERhdGFbaV0gPSBmb3JtW2ldLnZhbHVlOwotICAgIH0KLSAgfQotICByZXR1cm4gb2JqZWN0RGF0YTsKLX0KLQotLyoKLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5maW5kQW5jZXN0b3IgPSBmdW5jdGlvbigpIHsKLSAgLy8gY2hlY2sgb3VyIHBhcmVudCB3aW5kb3c6Ci0gIHJldHVybiBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuX19maW5kQW5jZXN0b3Iod2luZG93Lm9wZW5lci50b3ApOwotfQotCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuX19maW5kQW5jZXN0b3IgPSBmdW5jdGlvbihhbmNlc3RvcikgewotICAvLyBpZiBhbmNlc3RvciBpcyB1bmRlZmluZWQsIHdlIGRvbid0IGhhdmUgYW4gYW5jZXN0b3IgdGhhdAotICAvLyBwcm92aWRlcyB0aGUgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzIHBhY2thZ2UuCi0gIGlmICghYW5jZXN0b3IpIHsKLSAgICBhbGVydCgibm8gYW5jZXN0b3IgZm91bmQuIGJhbGluZyBvdXQuLi4iKTsKLSAgICByZXR1cm4gdW5kZWZpbmVkOwotICB9Ci0gIHRyeSB7Ci0gIC8vIHByb2JlIGZvciB0aGUgcGFja2FnZSBpbiB0aGUgYW5jZXN0b3I6Ci0gICAgIHZhciBwcm9iZSA9IGFuY2VzdG9yLm9yZy5hcGFjaGUubGVueWEuZWRpdG9yczsKLSAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7IAotICAgICBhbGVydCgicHJvYmU6ICIgKyBwcm9iZSArICJcbiIgKyBleGNlcHRpb24pOwotICAgLy8gd29vcHMuIG5vIHBhY2thZ2UuIGNoZWNrIHRoZSBhbmNlc3RvcidzIHBhcmVudC4KLSAgICByZXR1cm4gb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLl9fZmluZEFuY2VzdG9yKGFuY2VzdG9yLm9wZW5lci50b3ApOwotICB9Ci0gIC8vIGdvdGNoYTogYW5jZXN0b3IgaGFzIHRoZSBwYWNrYWdlLgotICBhbGVydCgiZm91bmQgYW5jZXN0b3IgJyIgKyBhbmNlc3Rvci5uYW1lICsgIicgd2l0aCBwYWNrYWdlISIpOwotICByZXR1cm4gYW5jZXN0b3I7Ci19Ci0qLwotCi0vKioKLSAgKiBoYW5kbGUgdGhlIHN1Ym1pdCBldmVudCBvZiB0aGUgZm9ybQotICAqCi0gICogQHBhcmFtIGZvcm1OYW1lIHRoZSAibmFtZSIgYXR0cmlidXRlIG9mIHRoZSBmb3JtCi0gICovCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuaGFuZGxlRm9ybVN1Ym1pdCA9IGZ1bmN0aW9uKGZvcm1OYW1lKSB7Ci0gIHZhciBvYmplY3REYXRhID0gb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdldEZvcm1WYWx1ZXMoZm9ybU5hbWUpOwotICB3aW5kb3cub3BlbmVyLm9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5zZXRPYmplY3REYXRhKG9iamVjdERhdGEsIHdpbmRvdy5uYW1lKTsKLSAgd2luZG93LmNsb3NlKCk7Ci19Ci0KLQotLyoqCi0gICogaGFuZGxlIHRoZSBsb2FkIGV2ZW50IG9mIHRoZSBmb3JtCi0gICoKLSAgKiBAcGFyYW0gZm9ybU5hbWUgdGhlICJuYW1lIiBhdHRyaWJ1dGUgb2YgdGhlIGZvcm0KLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5oYW5kbGVGb3JtTG9hZCA9IGZ1bmN0aW9uKGZvcm1OYW1lKSB7Ci0gIHZhciBvYmplY3REYXRhID0gd2luZG93Lm9wZW5lci5vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2V0T2JqZWN0RGF0YSh3aW5kb3cubmFtZSk7Ci0gIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5zZXRGb3JtVmFsdWVzKGZvcm1OYW1lLCBvYmplY3REYXRhKTsKLX0KLQotCi0vKioKLSAgKiBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHVzZWNhc2Ugd2luZG93cyAod2luZG93Lm9wZW4oKS4uLikKLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy51c2VjYXNlV2luZG93T3B0aW9ucyA9IAotICAgICAgInRvb2xiYXI9bm8sIgotICAgICsgInNjcm9sbGJhcnM9eWVzLCIKLSAgICArICJzdGF0dXM9bm8sIgotICAgICsgInJlc2l6YWJsZT15ZXMsIgotLy8gICsgImRlcGVuZGVudD15ZXMsIiAgbm90IGluIElFNiwgYW5kIHRoZSBtb3ogcGVvcGxlIHdhbnQgdG8gZ2V0IHJpZCBvZiBpdCwgdG9vLi4uCi0gICAgKyAid2lkdGg9NjAwLCIKLSAgICArICJoZWlnaHQ9NzAwIjsKLQotCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuVVNFQ0FTRV9JTlNFUlRMSU5LID0gJ2luc2VydExpbmsnOwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUSU1BR0UgPSAnaW5zZXJ0SW1hZ2UnOwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUQVNTRVQgPSAnaW5zZXJ0QXNzZXQnOwotCi0KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5nZW5lcmF0ZVVuaXF1ZVdpbmRvd05hbWUgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIG5ldyBTdHJpbmcoIkxlbnlhXyIgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyKDIpKTsKLX0KLQotCi0vKioKLSAgKiBhIGhlbHBlciBmdW5jdGlvbiB0byBvcGVuIG5ldyB1c2VjYXNlIHdpbmRvd3MuCi0gICoKLSAgKiBJZiBldmVyeW9uZSB1c2VkIHRoaXMsIHdlJ2Qgc2F2ZSBzb21lIG1haW50ZW5hbmNlIHdvcmsgaW4gdGhlIGxvbmcgcnVuIAotICAqIGFuZCBjYW4gZW5zdXJlIGNvbnNpc3RlbnQgYmVoYXZpb3VyIGFjcm9zcyBkaWZmZXJlbnQgZWRpdG9ycy4KLSAgKgotICAqIEBwYXJhbSB1c2VjYXNlIHRoZSBuYW1lIG9mIHRoZSB1c2VjYXNlIHRvIGludm9rZSwgb25lIG9mCi0gICogICBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuVVNFQ0FTRV9JTlNFUlRMSU5LIAotICAqICAgfCBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuVVNFQ0FTRV9JTlNFUlRJTUFHRSAKLSAgKiAgIHwgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUQVNTRVQKLSAgKiBAcGFyYW0gd2luZG93TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IHdpbmRvdywgaW4gY2FzZSB0aGUgZWRpdG9yIG5lZWRzIAotICAqICAgdGhhdCBpbmZvIGxhdGVyIG9uLgotICAqIEByZXR1cm5zIHRoZSBuZXcgd2luZG93IG9iamVjdAotICAqLwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLm9wZW5Vc2VjYXNlV2luZG93ID0gZnVuY3Rpb24odXNlY2FzZSwgd2luZG93TmFtZSkgewotICB2YXIgY3VycmVudEJhc2VVUkw7Ci0gIHZhciB1c2VjYXNlV2luZG93OwotCi0gIHN3aXRjaCAodXNlY2FzZSkgewotICAgIGNhc2Ugb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUTElOSzoKLSAgICBjYXNlIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVEFTU0VUOgotICAgIGNhc2Ugb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUSU1BR0U6Ci0gICAgICBjdXJyZW50QmFzZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1w/LiokLywiIik7Ci0gICAgICB1c2VjYXNlV2luZG93ID0gd2luZG93Lm9wZW4oCi0gICAgICAgIGN1cnJlbnRCYXNlVVJMICsgIj9sZW55YS51c2VjYXNlPWVkaXRvcnMuIiArIHVzZWNhc2UsCi0gICAgICAgIHdpbmRvd05hbWUsCi0gICAgICAgIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy51c2VjYXNlV2luZG93T3B0aW9ucwotICAgICAgKTsKLSAgICAgIHVzZWNhc2VXaW5kb3cuZm9jdXMoKTsgLy9JRTYgbGlrZXMgdG8gb3BlbiB3aW5kb3dzIGluIHRoZSBiYWNrLi4uCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWxlcnQoIm9wZW5Vc2VjYXNlV2luZG93OiBVbmtub3duIHVzZWNhc2UgJyIgKyB1c2VjYXNlICsgIicuIFRoaXMgaXMgbGlrZWx5IGEgcHJvZ3JhbW1pbmcgZXJyb3IuIik7Ci0gIH0KLSAgcmV0dXJuIHVzZWNhc2VXaW5kb3c7Ci19Ci0KLQotLyoqCi0gICogdGhpcyBkYXRhIHN0cnVjdHVyZSBoZWxwcyB3aXRoIHRoZSBpbnNlcnRpb24gb2YgZ2VuZXJhdGVkIHRhZ3MgCi0gICovCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuQ29udGVudFNuaXBwZXQgPSBmdW5jdGlvbigKLSAgICBiZWZvcmVTZWxlY3Rpb24sIAotICAgIGFmdGVyU2VsZWN0aW9uLCAKLSAgICByZXBsYWNlU2VsZWN0aW9uCi0pIHsKLSAgdGhpcy5iZWZvcmVTZWxlY3Rpb24gPSBiZWZvcmVTZWxlY3Rpb24sCi0gIHRoaXMuYWZ0ZXJTZWxlY3Rpb24gPSBhZnRlclNlbGVjdGlvbiwKLSAgdGhpcy5yZXBsYWNlU2VsZWN0aW9uID0gcmVwbGFjZVNlbGVjdGlvbgotfQotCi0KLS8qKgotICAqIHRoZSBjaGFyYWN0ZXJzIHRvIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgc2VsZWN0ZWQgdGV4dAotICAqLwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLkNvbnRlbnRTbmlwcGV0LnByb3RvdHlwZS5iZWZvcmVTZWxlY3Rpb24gPSAiIjsKLQotLyoqCi0gICogdGhlIGNoYXJhY3RlcnMgdG8gYmUgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIHNlbGVjdGVkIHRleHQKLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5Db250ZW50U25pcHBldC5wcm90b3R5cGUuYWZ0ZXJTZWxlY3Rpb24gPSAiIjsKLQotLyoqCi0gICogdGhlIHRleHQgdG8gcmVwbGFjZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGFyZWEgKGlmIGFueSkKLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5Db250ZW50U25pcHBldC5wcm90b3R5cGUucmVwbGFjZVNlbGVjdGlvbiA9IHVuZGVmaW5lZDsKLQotLyoqCi0gICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YS5wcm90b3R5cGUudG9TdHJpbmcKLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5Db250ZW50U25pcHBldC5wcm90b3R5cGUudG9TdHJpbmcgPSAgCi0gICAgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLk9iamVjdERhdGEucHJvdG90eXBlLnRvU3RyaW5nOwotCi0KLS8qKgotICAqIGdlbmVyYXRlcyBhIGNvbnRlbnQgc25pcHBldCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBlZGl0b3IgYXJlYQotICAqIAotICAqIEBwYXJhbSB1c2VjYXNlIHRoZSB1c2VjYXNlIGZvciB3aGljaCB0aGUgc25pcHBldCBzaG91bGQgYmUgZ2VuZXJhdGVkCi0gICogQHBhcmFtIG9iamVjdERhdGEgYW4gb2JqZWN0RGF0YSBvYmplY3QgZm9yIHRoZSBjb250ZW50cwotICAqIEBwYXJhbSBuYW1lc3BhY2UgYW4gb3B0aW9uYWwgbmFtZXNwYWNlIFVSSSAodXN1YWxseSBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sKQotICAqIEByZXR1cm5zIGFuIG9iamVjdCBvZiB0eXBlIENvbnRlbnRTbmlwcGV0IAotICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLkNvbnRlbnRTbmlwcGV0Ci0gICovCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2VuZXJhdGVDb250ZW50U25pcHBldCA9IGZ1bmN0aW9uKHVzZWNhc2UsIG9iamVjdERhdGEsIG5hbWVzcGFjZSkgewotICB2YXIgc25pcHBldCA9IG5ldyBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuQ29udGVudFNuaXBwZXQoKTsKLQotICBzd2l0Y2ggKHVzZWNhc2UpIHsKLQotICAgIGNhc2Ugb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUTElOSzoKLSAgICAgIHNuaXBwZXQuYmVmb3JlU2VsZWN0aW9uID0gJzxhJwotICAgICAgICArIChuYW1lc3BhY2UgPyAnIHhtbG5zPSInICsgbmFtZXNwYWNlICsgJyInIDogJycpCi0gICAgICAgICsgKG9iamVjdERhdGEudXJsID8gJyBocmVmPSInICsgb2JqZWN0RGF0YS51cmwgKyAnIicgOiAnJykKLSAgICAgICAgKyAob2JqZWN0RGF0YS50aXRsZSA/ICcgdGl0bGU9IicgKyBvYmplY3REYXRhLnRpdGxlICsgJyInIDogJycpCi0gICAgICAgICsgJz4nOwotICAgICAgc25pcHBldC5hZnRlclNlbGVjdGlvbiA9ICc8L2E+JzsKLSAgICAgIHNuaXBwZXQucmVwbGFjZVNlbGVjdGlvbiA9Ci0gICAgICAgIG9iamVjdERhdGEudGV4dCA/IG9iamVjdERhdGEudGV4dCA6IHVuZGVmaW5lZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuVVNFQ0FTRV9JTlNFUlRBU1NFVDoKLSAgICAgIHNuaXBwZXQuYmVmb3JlU2VsZWN0aW9uID0gJzxhJwotICAgICAgICArIChuYW1lc3BhY2UgPyAnIHhtbG5zPSInICsgbmFtZXNwYWNlICsgJyInIDogJycpCi0gICAgICAgICsgKG9iamVjdERhdGEudXJsID8gJyBocmVmPSInICsgb2JqZWN0RGF0YS51cmwgKyAnIicgOiAnJykKLSAgICAgICAgKyAob2JqZWN0RGF0YS50aXRsZSA/ICcgdGl0bGU9IicgKyBvYmplY3REYXRhLnRpdGxlICsgJyInIDogJycpCi0gICAgICAgICsgJyBjbGFzcz0ibGVueWEuYXNzZXQiPic7Ci0gICAgICBzbmlwcGV0LmFmdGVyU2VsZWN0aW9uID0gJzwvYT4nOwotICAgICAgc25pcHBldC5yZXBsYWNlU2VsZWN0aW9uID0KLSAgICAgICAgb2JqZWN0RGF0YS50ZXh0ID8gb2JqZWN0RGF0YS50ZXh0IDogdW5kZWZpbmVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVElNQUdFOgotICAgICAgc25pcHBldC5iZWZvcmVTZWxlY3Rpb24gPSAnPGltZycKLSAgICAgICAgKyAobmFtZXNwYWNlID8gJyB4bWxucz0iJyArIG5hbWVzcGFjZSArICciJyA6ICcnKQotICAgICAgICArIChvYmplY3REYXRhLnVybCA/ICcgc3JjPSInICsgb2JqZWN0RGF0YS51cmwgKyAnIicgOiAnJykKLSAgICAgICAgKyAob2JqZWN0RGF0YS50aXRsZSA/ICcgdGl0bGU9IicgKyBvYmplY3REYXRhLnRpdGxlICsgJyInIDogJycpCi0gICAgICAgICsgKG9iamVjdERhdGEudGV4dCA/ICcgYWx0PSInICsgb2JqZWN0RGF0YS50ZXh0ICsgJyInIDogJycpCi0gICAgICAgICsgKG9iamVjdERhdGEud2lkdGggPyAnIHdpZHRoPSInICsgb2JqZWN0RGF0YS53aWR0aCArICciJyA6ICcnKQotICAgICAgICArIChvYmplY3REYXRhLmhlaWdodCA/ICcgaGVpZ2h0PSInICsgb2JqZWN0RGF0YS5oZWlnaHQgKyAnIicgOiAnJykKLSAgICAgICAgKyAnLz4nOwotICAgICAgc25pcHBldC5hZnRlclNlbGVjdGlvbiA9ICIiOwotICAgICAgc25pcHBldC5yZXBsYWNlU2VsZWN0aW9uID0gdW5kZWZpbmVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWxlcnQoInNldE9iamVjdERhdGE6IFVua25vd24gdXNlY2FzZSAiICsgY3VycmVudFVzZWNhc2UgKyAiLiBUaGlzIGlzIGxpa2VseSBhIHByb2dyYW1taW5nIGVycm9yLiIpOwotICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgfQotICByZXR1cm4gc25pcHBldDsKLX0KLQotCi0vKioKLSAgKiBhIGNyb3NzLWJyb3dzZXIgaGVscGVyIHRvIG9idGFpbiBzZWxlY3RlZCB0ZXh0Ci0gICoKLSAgKiBAcGFyYW0gc291cmNlRWxlbWVudCBhbiBYSFRNTCBpbnB1dCBvciB3aW5kb3cgb2JqZWN0IChvcHRpb25hbCksIHN1Y2ggYXMKLSAgKiAgIGRvY3VtZW50LmZvcm1zWyd5b3VyZWRpdG9yJ10uZWxlbWVudHNbJ2NvbnRlbnQnXSBvciB3aW5kb3cudG9wLgotICAqIFlvdSBtdXN0IHNwZWNpZnkgaXQgaWYgeW91IHdhbnQgdG8gcmV0cmlldmUgc2VsZWN0aW9ucyBmcm9tIAotICAqIGZvcm0gZmllbGRzLCBvciBmcm9tIGZyYW1lcyBvdGhlciB0aGFuICJ3aW5kb3ciICh0aGUgZGVmYXVsdCkuCi0gICoKLSAgKiBAcmV0dXJucyB0aGUgc2VsZWN0ZWQgdGV4dCBvciB0aGUgZW1wdHkgc3RyaW5nLgotICAqCi0gICogTk9URTogVGhpcyBmdW5jdGlvbiBpcyByZWFsbHkgdmVyc2F0aWxlIGFuZCBwb3dlcmZ1bC4gSXQgaXMgYWxzbyBub3QKLSAgKiBwYXJ0aWN1bGFybHkgd2VsbCB0ZXN0ZWQgZXhjZXB0IHdpdGggSUUgNi83IGFuZCBGaXJlZm94IHVuZGVyIFdpbmRvd3MgYW5kIExpbnV4LgotICAqLwotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdldFNlbGVjdGVkVGV4dCA9IGZ1bmN0aW9uKHNvdXJjZUVsZW1lbnQpIHsKLSAgdmFyIGRlYnVnID0gZmFsc2U7Ci0KLSAgaWYgKCFzb3VyY2VFbGVtZW50KSBzb3VyY2VFbGVtZW50ID0gd2luZG93OwotCi0gIC8vIEZGIGFuZCBmcmllbmRzIGlmIGEgZm9ybSBpbnB1dCBlbGVtZW50IHdhcyBzcGVjaWZpZWQKLSAgaWYgKHNvdXJjZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQpIHsKLSAgICBkZWJ1ZyAmJiBhbGVydCgiRkYgb3Igc2ltaWxhciwgdXNpbmcgJ3NlbGVjdGlvblN0YXJ0JyBvbiBhbiBYSFRNTCA8aW5wdXQ+IGVsZW1lbnQgbmFtZWQgJyIgKyBzb3VyY2VFbGVtZW50Lm5hbWUgKyAiJy4iKTsKLSAgICByZXR1cm4gc291cmNlRWxlbWVudC52YWx1ZS5zdWJzdHIoCi0gICAgICAgICBzb3VyY2VFbGVtZW50LnNlbGVjdGlvblN0YXJ0LCAKLSAgICAgICAgIHNvdXJjZUVsZW1lbnQuc2VsZWN0aW9uRW5kIC0gc291cmNlRWxlbWVudC5zZWxlY3Rpb25TdGFydCk7Ci0gIH0gZWxzZSAKLSAgLy8gRkYgYW5kIGZyaWVuZHMgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGRvY3VtZW50Ci0gIGlmIChzb3VyY2VFbGVtZW50LmdldFNlbGVjdGlvbikgewotICAgIGRlYnVnICYmIGFsZXJ0KCJGRiBvciBzaW1pbGFyLCB1c2luZyBhICdnZXRTZWxlY3Rpb24oKScgb24gYSB3aW5kb3cgZWxlbWVudCBuYW1lZCAnIiArIHNvdXJjZUVsZW1lbnQubmFtZSArICInLiIpOwotICAgIHJldHVybiBzb3VyY2VFbGVtZW50LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7Ci0gIH0gZWxzZQotICAvLyBJRSBpZiBhIHdpbmRvdyBlbGVtZW50IHdhcyBzcGVjaWZpZWQKLSAgaWYgKHNvdXJjZUVsZW1lbnQuZG9jdW1lbnQuc2VsZWN0aW9uKSB7Ci0gICAgZGVidWcgJiYgYWxlcnQoIklFLCB1c2luZyB1c2luZyAnc2VsZWN0aW9uJyBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudCBvZiBhIHdpbmRvdyBuYW1lZCAnIiArIHNvdXJjZUVsZW1lbnQubmFtZSArICInLiIpOwotICAgIHJldHVybiBzb3VyY2VFbGVtZW50LmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnRleHQ7Ci0gIH0gZWxzZSB7Ci0gIC8vIElFIGlmIGEgZm9ybSBvYmplY3Qgd2FzIHNwZWNpZmllZCAoaWdub3JlIGl0IGFuZCB1c2UgZG9jdW1lbnQgaW5zdGVhZCkKLSAgaWYgKHdpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb24pIHsKLSAgICBkZWJ1ZyAmJiBhbGVydCgiSUUsIGlnbm9yaW5nIGZvcm0gZWxlbWVudCBhbmQgdXNpbmcgJ3NlbGVjdGlvbicgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQgb2YgdGhlIGN1cnJlbnQgd2luZG93ICciICsgd2luZG93Lm5hbWUgKyAiJy4iKTsKLSAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnRleHQ7Ci0gIH0gZWxzZQotICAgIGRlYnVnICYmIGFsZXJ0KCJTb3JyeSwgeW91ciBicm93c2VyIGFwcGFyZW50bHkgZG9lc24ndCBzdXBwb3J0IHRleHQgc2VsZWN0aW9uIHZpYSBqYXZhc2NyaXB0LiIpOwotICAgIHJldHVybiAiIjsKLSAgfQotfQotCi0KLS8qKgotICAqIGEgY3Jvc3MtYnJvd3NlciBoZWxwZXIgdG8gaW5zZXJ0IGRhdGEgYXQgdGhlIHNlbGVjdGVkIHBvc2l0aW9uIGluIGEgZm9ybSBmaWVsZCAodGV4dGFyZWEgZXRjLikKLSAgKgotICAqIEBwYXJhbSBmb3JtRWxlbWVudCBhIFhIVE1MIGZvcm0gZWxlbWVudCAoZG9jdW1lbnQuZm9ybXNbZm9vXS5iYXIpCi0gICogQHBhcmFtIGNvbnRlbnRTbmlwcGV0IGEgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLkNvbnRlbnRTbmlwcGV0IHdpdGggdGhlIHRleHQgdG8gaW5zZXJ0Ci0gICoKLSAgKiBpbnNwaXJlZCBieSBodHRwOi8vYWt0dWVsbC5kZS5zZWxmaHRtbC5vcmcvYXJ0aWtlbC9qYXZhc2NyaXB0L2JiY29kZS8KLSAgKi8KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5pbnNlcnRDb250ZW50ID0gZnVuY3Rpb24oZm9ybUVsZW1lbnQsIHNuaXBwZXQpIHsKLQotICAvL2FsZXJ0KCJzbmlwcGV0OiAnIiArIHNuaXBwZXQudG9TdHJpbmcoKSArICInXG4iKTsKLSAKLSAgLy8gRGFuZ2VyLCBXaWxsIFJvYmluc29uOiB5b3UgYXJlIGxlYXZpbmcgdGhlIHczYyBzZWN0b3IhCi0gIC8vIFNlbGVjdGlvbnMgYXJlIG5vdCBwcm9wZXJseSBzdGFuZGFyZGl6ZWQgeWV0Li4uCi0gIGZvcm1FbGVtZW50LmZvY3VzKCk7Ci0gIC8vIEZpcmVmb3ggYW5kIGZyaWVuZHMgd2lsbCBzdXBwb3J0IHRoaXMgZm9yIHRleHRhcmVhcyBldGMuCi0gIGlmIChmb3JtRWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgdmFyIGJlZ2luID0gZm9ybUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7Ci0gICAgdmFyIGVuZCA9IGZvcm1FbGVtZW50LnNlbGVjdGlvbkVuZDsKLSAgICB2YXIgY29udGVudCA9IGZvcm1FbGVtZW50LnZhbHVlOyAKLSAgICB2YXIgc2VsZWN0aW9uID0gY29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCk7Ci0gICAgLy8gYWxlcnQoIkZvdW5kIHNlbGVjdGlvbiBiZWdpbm5pbmcgYXQgWyIgKyBiZWdpbiArICJdLCBlbmRpbmcgYXQgWyIgKyBlbmQgKyAiXS4iKTsKLSAgICBmb3JtRWxlbWVudC52YWx1ZSA9IGNvbnRlbnQuc3Vic3RyKDAsIGJlZ2luKQotICAgICAgKyBzbmlwcGV0LmJlZm9yZVNlbGVjdGlvbgotICAgICAgKyAoc25pcHBldC5yZXBsYWNlU2VsZWN0aW9uID8gc25pcHBldC5yZXBsYWNlU2VsZWN0aW9uIDogc2VsZWN0aW9uKQotICAgICAgKyBzbmlwcGV0LmFmdGVyU2VsZWN0aW9uCi0gICAgICArIGNvbnRlbnQuc3Vic3RyKGVuZCk7Ci0gICAgLy8gdXBkYXRlIGN1cnNvciBwb3NpdGlvbjoKLSAgICBmb3JtRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IGJlZ2luOwotICAgIGZvcm1FbGVtZW50LnNlbGVjdGlvbkVuZCA9IGJlZ2luOwotICB9IGVsc2UgCi0gIC8vIElFIGRvZXMgaXQgdGh1c2x5OgotICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7Ci0gICAgYWxlcnQoIkhleSwgeW91IGFyZSB1c2luZyBJRSwgcmlnaHQ/IFBsZWFzZSBnZXQgaW4gdG91Y2ggd2l0aCBkZXZAbGVueWEuYXBhY2hlLm9yZyB0byB0ZXN0IHRoaXMgZmVhdHVyZSEiKTsKLSAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKLSAgICB2YXIgc2VsZWN0aW9uID0gcmFuZ2UudGV4dDsKLSAgICByYW5nZS50ZXh0ID0gc25pcHBldC5iZWZvcmVTZWxlY3Rpb24KLSAgICAgICsgKHNuaXBwZXQucmVwbGFjZVNlbGVjdGlvbiA/IHNuaXBwZXQucmVwbGFjZVNlbGVjdGlvbiA6IHNlbGVjdGlvbikKLSAgICAgICsgc25pcHBldC5hZnRlclNlbGVjdGlvbjsKLSAgICByYW5nZS5zZWxlY3QoKTsKLSAgfSBlbHNlIHsKLSAgLy8gZm9yIGFsbCBvdGhlciBicm93c2VycywgcGFzdGUgdGhlIHN0dWZmIGF0IHRoZSBlbmQuLi4KLSAgICBhbGVydCgiSGV5LCB3aGF0IGtpbmQgb2YgYnJvd3NlciBpcyB0aGlzPyBQbGVhc2UgZ2V0IGluIHRvdWNoIHdpdGggZGV2QGxlbnlhLmFwYWNoZS5vcmcgdG8gbWFrZSB0aGlzIGZlYXR1cmUgd29yayBwcm9wZXJseSBmb3IgeW91ISIpOwotICAgIGZvcm1FbGVtZW50LnZhbHVlID0gZm9ybUVsZW1lbnQudmFsdWUKLSAgICAgICsgc25pcHBldC5iZWZvcmVTZWxlY3Rpb24KLSAgICAgICsgKHNuaXBwZXQucmVwbGFjZVNlbGVjdGlvbiA/IHNuaXBwZXQucmVwbGFjZVNlbGVjdGlvbiA6IHNlbGVjdGlvbikKLSAgICAgICsgc25pcHBldC5hZnRlclNlbGVjdGlvbjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNkMjVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAKLSAgPG1hcDpyZXNvdXJjZXM+Ci0gCi0gICA8bWFwOnJlc291cmNlIG5hbWU9InN0eWxlLWNtcy1wYWdlIj4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPiAgICAgIAotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm0+ICAgIAotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9wYWdlMnhodG1sLnhzbCI+Ci0gICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InB1YmxpY2F0aW9uaWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0iLz4KLSAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iY29udGV4dDovL2xlbnlhL3hzbHQvdXRpbC9zdHJpcF9uYW1lc3BhY2VzLnhzbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icHJveHkiLz4KLSAgICA8L21hcDpyZXNvdXJjZT4KLQotICA8L21hcDpyZXNvdXJjZXM+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgCi0gICAgPG1hcDpjb21wb25lbnQtY29uZmlndXJhdGlvbnM+Ci0gICAgICA8Z2xvYmFsLXZhcmlhYmxlcz4KLSAgICAgICAgPCEtLSBUbyBhY2Nlc3MgY29yZSByZXNvdXJjZXMgLS0+Ci0gICAgICAgIDxiYXNlZGlyPi4uLy4uPC9iYXNlZGlyPgotICAgICAgPC9nbG9iYWwtdmFyaWFibGVzPgotICAgIDwvbWFwOmNvbXBvbmVudC1jb25maWd1cmF0aW9ucz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImZvcm0vKi8qKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJsZW55YS1kb2N1bWVudDp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSxsYW5nPXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfT9zZXNzaW9uPXVzZWNhc2UiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9mb3Jtcy9udW1iZXJUYWdzLnhzbCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL3sxfS54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY2lkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJub2RlaWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1uYW1lfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImZvcm0iIHZhbHVlPSJ7MX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2Zvcm0tbGF5b3V0LnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFByZWZpeCIgdmFsdWU9Intwcm94eTp9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibm9kZWlkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbmFtZX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ3ZmV2ZW50IiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06bGVueWEuZXZlbnR9Ii8+Ci08IS0tICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImVkaXQiIHZhbHVlPSJ7Zmxvdy1hdHRyaWJ1dGU6dXNlY2FzZS9wYXJhbWV0ZXJbQG5hbWUgPSAnZWRpdFNlbGVjdCddfSIvPiAtLT4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJlZGl0IiB2YWx1ZT0iezJ9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJvbmVmb3JtIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImxlbnlhLWRvY3VtZW50OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9LGxhbmc9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9P3Nlc3Npb249dXNlY2FzZSIvPgotICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJwYXJhbWV0ZXIiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlci1zZWxlY3Rvci10ZXN0IiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06cmVmb3JtYXR9Ii8+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9IiIvPgotICAgICAgICAgIDxtYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvcHJldHR5cHJpbnRpbmcveHNsdC94bWwybmljZXhtbC54c2wiLz4KLSAgICAgICAgICA8L21hcDpvdGhlcndpc2U+Ci0gICAgICAgIDwvbWFwOnNlbGVjdD4gCi0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvb25lZm9ybS54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY2lkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ic3RyZWFtLnhtbCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic3RyZWFtIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImluY29taW5nLXByb3h5Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InVybDJ1dWlkIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gCi0gICAgIDwhLS0gdGhpcyBpcyBhIHVzZWNhc2UgdmlldyAoc2VlIGNvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbnNlcnRMaW5rLnhjb25mKSAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iZWRpdG9ycy5pbnNlcnRMaW5rIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRleHQ6Ly9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2VkaXRvcnMveHNsdC9pbnNlcnRMaW5rLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHVibGljYXRpb25JZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJhdXRob3JpbmciLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudFBhdGgiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50TGFuZ3VhZ2UiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudEV4dGVuc2lvbiIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWV4dGVuc2lvbn0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkZWZhdWx0TGFuZ3VhZ2UiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkZWZhdWx0LWxhbmd1YWdlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlcyIgdmFsdWU9IntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWxhbmd1YWdlcy1jc3Z9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYUJhc2VQYXRoIgotICAgICAgICAgICAgIHZhbHVlPSJ7cHJveHk6L3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOmNhbGwgcmVzb3VyY2U9InN0eWxlLWNtcy1wYWdlIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIC8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioqIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0ibGVueWEtZG9jdW1lbnQ6L3twYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9Ii8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci0KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2NvcHktbWl4ZWQtY29udGVudC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2NvcHktbWl4ZWQtY29udGVudC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNGJlZGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9mb3Jtcy9jb3B5LW1peGVkLWNvbnRlbnQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogY29weS1taXhlZC1jb250ZW50LnhzbCA0MjkwOCAyMDA0LTA0LTI2IDE0OjU3OjI1WiBtaWNoaSAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLT4KLQotCi08IS0tIEZJWE1FOiB3b3JrcyBidWdmcmVlLCBidXQgaXMga2luZCBvZiB1Z2x5LCBiZWNhdXNlIGVhY2ggZWxlbWVudCB3aWxsIGxpc3QgYWxsIG5hbWVzcGFjZXMgLS0+Ci08IS0tCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvLyoiIG1vZGU9Im1peGVkY29udGVudCIgcHJpb3JpdHk9Ii0xIj4KLTx4c2w6dmFyaWFibGUgbmFtZT0icHJlZml4Ij48eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKG5hbWUoKSwnOicpIj46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUobmFtZSgpLCc6JykiLz48L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLQotPHhzbDpjaG9vc2U+Ci08eHNsOndoZW4gdGVzdD0ibm9kZSgpIj4KLTx4c2w6dGV4dD4mbHQ7PC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSgpIi8+Ci0KLTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCpbbG9jYWwtbmFtZSgpIT0ndGFnSUQnXSIgbW9kZT0ibWl4ZWRjb250ZW50Ii8+Ci0KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJuYW1lc3BhY2U6OioiPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVmaXgiPjx4c2w6aWYgdGVzdD0ibG9jYWwtbmFtZSgpICE9ICcnIj46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxvY2FsLW5hbWUoKSIvPjwveHNsOmlmPjwveHNsOnZhcmlhYmxlPgotPHhzbDppZiB0ZXN0PSIuICE9ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnIj4KLTx4c2w6dGV4dD4gPC94c2w6dGV4dD54bWxuczx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJlZml4Ii8+PSI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjx4c2w6dGV4dD4iPC94c2w6dGV4dD4KLTwveHNsOmlmPgotPC94c2w6Zm9yLWVhY2g+Ci0KLTx4c2w6dGV4dD4mZ3Q7PC94c2w6dGV4dD4KLQotPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCkiIG1vZGU9Im1peGVkY29udGVudCIvPgotCi08eHNsOnRleHQ+Jmx0Oy88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKCkiLz48eHNsOnRleHQ+Jmd0OzwveHNsOnRleHQ+Ci0KLTwveHNsOndoZW4+Ci0KLTx4c2w6b3RoZXJ3aXNlPgotCi08eHNsOnRleHQ+Jmx0OzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoKSIvPgotCi08eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqW2xvY2FsLW5hbWUoKSE9J3RhZ0lEJ10iIG1vZGU9Im1peGVkY29udGVudCIvPgotCi08eHNsOmZvci1lYWNoIHNlbGVjdD0ibmFtZXNwYWNlOjoqIj4KLTx4c2w6dmFyaWFibGUgbmFtZT0icHJlZml4Ij48eHNsOmlmIHRlc3Q9ImxvY2FsLW5hbWUoKSAhPSAnJyI+Ojx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsb2NhbC1uYW1lKCkiLz48L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLTx4c2w6aWYgdGVzdD0iLiAhPSAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyI+Ci08eHNsOnRleHQ+IDwveHNsOnRleHQ+eG1sbnM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZWZpeCIvPj0iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48eHNsOnRleHQ+IjwveHNsOnRleHQ+Ci08L3hzbDppZj4KLTwveHNsOmZvci1lYWNoPgotCi08eHNsOnRleHQ+LyZndDs8L3hzbDp0ZXh0PjwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKiIgbW9kZT0ibWl4ZWRjb250ZW50Ij48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoKSIvPj0iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4iPC94c2w6dGVtcGxhdGU+Ci0tLT4KLQotCi0KLQotCi0KLQotCi0KLQotPCEtLSBMaXN0IGFsbCB0aGUgbmFtZXNwYWNlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vKiIgbW9kZT0ibmFtZXNwYWNlcyIgcHJpb3JpdHk9Ii0xIj4KLTx4c2w6dmFyaWFibGUgbmFtZT0icHJlZml4Ij48eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKG5hbWUoKSwnOicpIj46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUobmFtZSgpLCc6JykiLz48L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLQotPHhzbDppZiB0ZXN0PSJuYW1lc3BhY2UtdXJpKCkiPjx4c2w6dGV4dD4gPC94c2w6dGV4dD54bWxuczx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJlZml4Ii8+PSI8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZXNwYWNlLXVyaSgpIi8+IjwveHNsOmlmPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCpbbG9jYWwtbmFtZSgpIT0ndGFnSUQnXSIgbW9kZT0ibmFtZXNwYWNlcyIvPgotPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCkiIG1vZGU9Im5hbWVzcGFjZXMiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKiIgbW9kZT0ibmFtZXNwYWNlcyI+Ci08eHNsOnZhcmlhYmxlIG5hbWU9InByZWZpeCI+PHhzbDppZiB0ZXN0PSJjb250YWlucyhuYW1lKCksJzonKSI+Ojx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKG5hbWUoKSwnOicpIi8+PC94c2w6aWY+PC94c2w6dmFyaWFibGU+Ci0KLTx4c2w6aWYgdGVzdD0ibmFtZXNwYWNlLXVyaSgpIj48eHNsOnRleHQ+IDwveHNsOnRleHQ+eG1sbnM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZWZpeCIvPj0iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWVzcGFjZS11cmkoKSIvPiI8L3hzbDppZj48L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dCgpIiBtb2RlPSJuYW1lc3BhY2VzIi8+Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi08IS0tIEZJWE1FOiBuYW1lc3BhY2VzIG9jY3VyIG11bHRpcGxlIHRpbWVzLCBlLmcuIHhsaW5rOnNob3c9IiIgeGxpbms6aHJlZj0iIiB4bWxuczp4bGluaz0iIiB4bWxuczp4bGluaz0iIiAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vKiIgbW9kZT0ibWl4ZWRjb250ZW50IiBwcmlvcml0eT0iLTEiPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVmaXgiPjx4c2w6aWYgdGVzdD0iY29udGFpbnMobmFtZSgpLCc6JykiPjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShuYW1lKCksJzonKSIvPjwveHNsOmlmPjwveHNsOnZhcmlhYmxlPgotCi08eHNsOmNob29zZT4KLTx4c2w6d2hlbiB0ZXN0PSJub2RlKCkiPgotPHhzbDp0ZXh0PiZsdDs8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKCkiLz48IS0tPHhzbDppZiB0ZXN0PSJuYW1lc3BhY2UtdXJpKCkiPjx4c2w6dGV4dD4gPC94c2w6dGV4dD54bWxuczx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJlZml4Ii8+PSI8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZXNwYWNlLXVyaSgpIi8+IjwveHNsOmlmPi0tPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCpbbG9jYWwtbmFtZSgpIT0ndGFnSUQnXSIgbW9kZT0ibWl4ZWRjb250ZW50Ii8+PHhzbDp0ZXh0PiZndDs8L3hzbDp0ZXh0PgotPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCkiIG1vZGU9Im1peGVkY29udGVudCIvPgotPHhzbDp0ZXh0PiZsdDsvPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSgpIi8+PHhzbDp0ZXh0PiZndDs8L3hzbDp0ZXh0PgotPC94c2w6d2hlbj4KLQotPCEtLSBFbXB0eSBlbGVtZW50ICh3aHkgaXMgdGhpcyBub3Qgbm9kZT8pIC0tPgotPHhzbDpvdGhlcndpc2U+Ci08eHNsOnRleHQ+Jmx0OzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoKSIvPjwhLS08eHNsOmlmIHRlc3Q9Im5hbWVzcGFjZS11cmkoKSI+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PnhtbG5zPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmVmaXgiLz49Ijx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lc3BhY2UtdXJpKCkiLz4iPC94c2w6aWY+LS0+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKltsb2NhbC1uYW1lKCkhPSd0YWdJRCddIiBtb2RlPSJtaXhlZGNvbnRlbnQiLz48eHNsOnRleHQ+IC8mZ3Q7PC94c2w6dGV4dD4KLTwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIEF0dHJpYnV0ZXMgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKiIgbW9kZT0ibWl4ZWRjb250ZW50Ij4KLTx4c2w6dmFyaWFibGUgbmFtZT0icHJlZml4Ij48eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKG5hbWUoKSwnOicpIj46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUobmFtZSgpLCc6JykiLz48L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLQotPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKCkiLz49Ijx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iLiIvPjwveHNsOmNhbGwtdGVtcGxhdGU+IjwhLS08eHNsOmlmIHRlc3Q9Im5hbWVzcGFjZS11cmkoKSI+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PnhtbG5zPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmVmaXgiLz49Ijx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lc3BhY2UtdXJpKCkiLz4iPC94c2w6aWY+LS0+PC94c2w6dGVtcGxhdGU+Ci0KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KCkiIG1vZGU9Im1peGVkY29udGVudCI+Ci0gIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPgotICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iLiIvPgotICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0ic2VhcmNoLWFuZC1yZXBsYWNlIj4KLTx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+Ci0KLTx4c2w6Y2hvb3NlPgotPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCRzdHJpbmcsICcmbHQ7JykiPgotICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VhcmNoLWFuZC1yZXBsYWNlIj48eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHN0cmluZywgJyZsdDsnKSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+JmFtcDtsdDs8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VhcmNoLWFuZC1yZXBsYWNlIj48eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nLCAnJmx0OycpIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KLTwveHNsOndoZW4+Ci08eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHN0cmluZywgJyZndDsnKSI+Ci0gIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkc3RyaW5nLCAnJmd0OycpIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4mYW1wO2d0Ozx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRzdHJpbmcsICcmZ3Q7JykiLz48L3hzbDpjYWxsLXRlbXBsYXRlPgotPC94c2w6d2hlbj4KLTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucygkc3RyaW5nLCAnJmFtcDsnKSI+Ci0gIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkc3RyaW5nLCAnJmFtcDsnKSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+JmFtcDthbXA7PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlYXJjaC1hbmQtcmVwbGFjZSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHN0cmluZywgJyZhbXA7JykiLz48L3hzbDpjYWxsLXRlbXBsYXRlPgotPC94c2w6d2hlbj4KLTwhLS0gRklYTUU6ICZxdW90OyBhbmQgJmFwb3M7IC0tPgotPHhzbDpvdGhlcndpc2U+Ci0gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RyaW5nIi8+Ci08L3hzbDpvdGhlcndpc2U+Ci08L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLSAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2Zvcm0tbGF5b3V0LnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvZm9ybS1sYXlvdXQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDZhMmYyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvZm9ybS1sYXlvdXQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZm9ybS1sYXlvdXQueHNsIDE1NTI2NyAyMDA1LTAyLTI0IDIyOjQxOjI3WiBncmVnb3IgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0+Ci0KLTx4c2w6cGFyYW0gbmFtZT0ibm9kZWlkIiBzZWxlY3Q9IicnIi8+Ci0KLTx4c2w6cGFyYW0gbmFtZT0iY29udGV4dFByZWZpeCIgc2VsZWN0PSInL2xlbnlhJyIvPgotPHhzbDpwYXJhbSBuYW1lPSJlZGl0IiBzZWxlY3Q9IidObyBub2RlIHNlbGVjdGVkIHlldCciLz4KLTx4c2w6cGFyYW0gbmFtZT0id2ZldmVudCIgc2VsZWN0PSInbnVsbCciLz4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZXNQYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRleHRQcmVmaXgiLz4vbGVueWEvaW1hZ2VzL2VkaXRvcjwveHNsOnZhcmlhYmxlPgotCi08eHNsOmluY2x1ZGUgaHJlZj0iY29weS1taXhlZC1jb250ZW50LnhzbCIvPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iYnV0dG9ucyI+Ci0gICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiIG5hbWU9InN1Ym1pdCIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2FuY2VsIiBuYW1lPSJjYW5jZWwiIGkxOG46YXR0cj0idmFsdWUiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZm9ybSI+Ci08ZGl2PgotPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im5hbWVzcGFjZXMiPgotICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLy9uYW1lc3BhY2UiPgotICAgICAgICAgIDx4c2w6dGV4dD54bWxuczo8L3hzbDp0ZXh0PgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJlZml4Ii8+PSI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVyaSIvPiIKLSAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii8vKiIgbW9kZT0ibmFtZXNwYWNlcyIgLz4KLSAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICA8L2lucHV0PgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJidXR0b25zIi8+Ci0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gIAotICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJub2RlcyIvPgotICA8L3RhYmxlPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodCI+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJ1dHRvbnMiLz4KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI3N5bnRheCI+UHJlZGVmaW5lZCBFbnRpdGllczwvYT48L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotPHVsPgotPGxpPiZhbXA7bHQ7IGluc3RlYWQgb2YgJmx0OyAobGVmdCBhbmdsZSBicmFja2V0IDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBiZSBlc2NhcGVkKTwvbGk+Ci08bGk+JmFtcDthbXA7IGluc3RlYWQgb2YgJmFtcDsgKGFtcGVyc2FuZCA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gYmUgZXNjYXBlZCk8L2xpPgotPGxpPiZhbXA7Z3Q7IGluc3RlYWQgb2YgPiAocmlnaHQgYW5nbGUgYnJhY2tldCk8L2xpPgotPGxpPiZhbXA7YXBvczsgaW5zdGVhZCBvZiAnIChzaW5nbGUtcXVvdGUpPC9saT4KLTxsaT4mYW1wO3F1b3Q7IGluc3RlYWQgb2YgIiAoZG91YmxlLXF1b3RlKTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLQotIDx4c2w6dmFyaWFibGUgbmFtZT0iY3VycmVudFRhZ0lEIj4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShzdWJzdHJpbmctYWZ0ZXIoJGVkaXQsICZxdW90O0B0YWdJRD0nJnF1b3Q7KSwgJnF1b3Q7JyZxdW90OykiLz4KLSAgPC94c2w6dmFyaWFibGU+Ci0gIDx4c2w6aWYgdGVzdD0iJGN1cnJlbnRUYWdJRCAhPSAnJyI+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCi0gICAgICBmdW5jdGlvbiBhZGRMb2FkRXZlbnQoZnVuYykgewotICAgICAgICB2YXIgb2xkb25sb2FkID0gd2luZG93Lm9ubG9hZDsKLSAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cub25sb2FkICE9ICdmdW5jdGlvbicpIHsKLSAgICAgICAgICB3aW5kb3cub25sb2FkID0gZnVuYzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBvbGRvbmxvYWQoKTsKLSAgICAgICAgICAgIGZ1bmMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICBhZGRMb2FkRXZlbnQoZ29BbmNob3IpOwotCi0gICAgICBmdW5jdGlvbiBnb0FuY2hvcigpIHsKLSAgICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLmhhc2ggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjdXJyZW50VGFnSUQiLz4nOwotICAgICAgICAgd2luZG93LnNjcm9sbEJ5KDAsIC0xNTApOwotICAgICAgfQotICAgIDwvc2NyaXB0PgotICA8L3hzbDppZj4KLQotPC9kaXY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmFtZXNwYWNlIiBtb2RlPSJub2RlcyI+Ci0gIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im5hbWVzcGFjZS57QHByZWZpeH0iIHZhbHVlPSJ7QHVyaX0iLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJub2RlIiBtb2RlPSJub2RlcyI+Ci08dHI+Ci0gIDx0ZCB2YWxpZ249InRvcCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNCRkJGQTIiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYWN0aW9uIi8+PHhzbDppZiB0ZXN0PSJub3QoYWN0aW9uKSI+JiMxNjA7PC94c2w6aWY+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAc2VsZWN0Ii8+PC90ZD4KLSAgPHhzbDpjaG9vc2U+Ci0gICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRlbnQiPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojRENEQkJGIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb250ZW50Ii8+PC90ZD4KLSAgICA8L3hzbDp3aGVuPgotICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgPHRkIGNvbHNwYW49IjIiIHZhbGlnbj0idG9wIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojRENEQkJGIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KLSAgICA8L3hzbDpvdGhlcndpc2U+Ci0gIDwveHNsOmNob29zZT4KLTwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaW5zZXJ0LWJlZm9yZSIgbW9kZT0ibm9kZXMiPgotICAgIDx0cj4KLSAgICAgIDx0ZCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0JGQkZBMiI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ikluc2VydCBiZWZvcmUiIG5hbWU9Imluc2VydC1iZWZvcmUiIGkxOG46YXR0cj0idmFsdWUiLz48L3RkPgotICAgICAgPHRkIGNvbHNwYW49IjIiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRENEQkJGIj4KLSAgICAgICAgPHNlbGVjdCBuYW1lPSImbHQ7eHVwZGF0ZTppbnNlcnQtYmVmb3JlIHNlbGVjdD0mcXVvdDt7QHNlbGVjdH0mcXVvdDsvJmd0OyIgc2l6ZT0iMSI+Ci0gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJudWxsIj5DaG9vc2UgZWxlbWVudCAuLi48L29wdGlvbj4KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZWxlbWVudCI+Ci0gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ7QHh1cGRhdGV9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L29wdGlvbj4KLSAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaW5zZXJ0LWFmdGVyIiBtb2RlPSJub2RlcyI+Ci0gICAgPHRyPgotICAgICAgPHRkIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjQkZCRkEyIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iSW5zZXJ0IiBuYW1lPSJpbnNlcnQtYWZ0ZXIiIGkxOG46YXR0cj0idmFsdWUiLz48L3RkPgotICAgICAgPHRkIGNvbHNwYW49IjIiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRENEQkJGIj4KLSAgICAgICAgPHNlbGVjdCBuYW1lPSImbHQ7eHVwZGF0ZTppbnNlcnQtYWZ0ZXIgc2VsZWN0PSZxdW90O3tAc2VsZWN0fSZxdW90Oy8mZ3Q7IiBzaXplPSIxIj4KLSAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJudWxsIj48aTE4bjp0ZXh0PkNob29zZSBlbGVtZW50IC4uLjwvaTE4bjp0ZXh0Pjwvb3B0aW9uPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJlbGVtZW50Ij4KLSAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IntAeHVwZGF0ZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvb3B0aW9uPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJub2RlKCkiIG1vZGU9Im5vZGVzIiBwcmlvcml0eT0iLTEiPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFjdGlvbiI+Ci08eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29udGVudCI+Ci08eHNsOmNob29zZT4KLTx4c2w6d2hlbiB0ZXN0PSIkZWRpdCA9IC4uL0BzZWxlY3QiPgotICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRleHRhcmVhIi8+Ci0gIDx4c2w6Y29weS1vZiBzZWxlY3Q9ImlucHV0Ii8+Ci08L3hzbDp3aGVuPgotPHhzbDpvdGhlcndpc2U+Ci0gIDxwPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiguLi9AbmFtZT0nT2JqZWN0JykiPgotICAgICAgICA8aW1nIHNyYz0ieyRub2RlaWR9L3tpbnB1dC9AdmFsdWV9Ii8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9AdmFsdWUiLz4KLSAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0idGV4dGFyZWEvbm9kZSgpIi8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3A+Ci08L3hzbDpvdGhlcndpc2U+Ci08L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dGFyZWEiPgotPHhzbDpjb3B5PgotICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAKiIvPgotICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJtaXhlZGNvbnRlbnQiLz4KLTwveHNsOmNvcHk+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaW5zZXJ0Ij4KLTwhLS0KLTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IntAbmFtZX0iIHZhbHVlPSJJTlNFUlQiLz4KLS0tPgotPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotPGlucHV0IHR5cGU9ImltYWdlIiBzcmM9InskaW1hZ2VzUGF0aH0vYWRkLnBuZyIgbmFtZT0ie0BuYW1lfSIgdmFsdWU9IkxFTllBIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGVsZXRlIj4KLTx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLTxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJ7JGltYWdlc1BhdGh9L2RlbGV0ZS5wbmciIG5hbWU9IntAbmFtZX0iIHZhbHVlPSJ0cnVlIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQHNlbGVjdCI+Ci08eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci08IS0tIEZJWE1FOiBJbnRlcm5ldCBFeHBsb3JlciBkb2VzIG5vdCBzZW5kIHRoZSB2YWx1ZSBvZiBpbnB1dCB0eXBlIGVxdWFscyBpbWFnZS4gTW96aWxsYSBkb2VzLiAtLT4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWdJRCI+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoc3Vic3RyaW5nLWFmdGVyKC4sICZxdW90O0B0YWdJRD0nJnF1b3Q7KSwgJnF1b3Q7JyZxdW90OykiLz4KLTwveHNsOnZhcmlhYmxlPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0YWdJRCIvPgotPGEgbmFtZT0ieyR0YWdJRH0iLz4KLTxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJ7JGltYWdlc1BhdGh9L2VkaXQucG5nIiBuYW1lPSJlZGl0W3sufV0iIHZhbHVlPSJ7Ln0iLz4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PiAgCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2Zvcm0ueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9mb3Jtcy9mb3JtLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4YTIyZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2Zvcm0ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBmb3JtLnhzbCA0MjkwOCAyMDA0LTA0LTI2IDE0OjU3OjI1WiBtaWNoaSAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iZG9jaWQiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImZvcm0iLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im1lc3NhZ2UiLz4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICAgICAgPGZvcm0gaWQ9ImZvcm0iPgotICAgICAgICAgICAgPGRvY2lkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZG9jaWQiLz48L2RvY2lkPgotICAgICAgICAgICAgPGZ0eXBlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZm9ybSIvPjwvZnR5cGU+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtZXNzYWdlIj4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1lc3NhZ2UiLz48L21lc3NhZ2U+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgPC9mb3JtPgotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvZm9ybXMuanggYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2Zvcm1zLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDllOWY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvZm9ybXMuangKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxuczpjaW5jbHVkZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2luY2x1ZGUvMS4wIgotICA+Ci0gIAotICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0PkVkaXQ8L2kxOG46dGV4dD48L3BhZ2U6dGl0bGU+Ci0gIDxwYWdlOmhlYWQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL21vZHVsZXMvZWRpdG9ycy9qYXZhc2NyaXB0L2Rpc2FibGViYWNrc3BhY2UuanMiLz4KLSAgPC9wYWdlOmhlYWQ+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgCi0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgIAotICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0tZWRpdCI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPgotICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgPGp4OndoZW4gdGVzdD0iJHshIHVzZWNhc2UuaGFzRXJyb3JzKCl9Ij4KLSAgICAgICAgICAKLSAgICAgICAgICA8cD4KLSAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJ0aXRsZSIKLSAgICAgICAgICAgICAgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50JykKLSAgICAgICAgICAgICAgLmdldE1ldGFEYXRhKCdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpCi0gICAgICAgICAgICAgIC5nZXRGaXJzdFZhbHVlKCd0aXRsZScpfSIvPgotICAgICAgICAgICAgPGkxOG46dGV4dD5Eb2N1bWVudDwvaTE4bjp0ZXh0PjogPHE+PGp4Om91dCB2YWx1ZT0iJHt0aXRsZX0iLz48L3E+Ci0gICAgICAgICAgPC9wPgotICAgICAgICAgIAotICAgICAgICAgIDxjaW5jbHVkZTppbmNsdWRleG1sPgotICAgICAgICAgICAgPGNpbmNsdWRlOnNyYz5jb2Nvb246Ly9tb2R1bGVzL2VkaXRvcnMvZm9ybS88ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdmb3JtJyl9Ii8+LzxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2VkaXRTZWxlY3QnKX0iLz48L2NpbmNsdWRlOnNyYz4KLSAgICAgICAgICA8L2NpbmNsdWRlOmluY2x1ZGV4bWw+Ci0gICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICA8L2p4OmNob29zZT4KLSAgICA8L2Zvcm0+Ci0gICAgCi0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL251bWJlclRhZ3MueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9mb3Jtcy9udW1iZXJUYWdzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1ZGM5My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL251bWJlclRhZ3MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBudW1iZXJUYWdzLnhzbCAxNTUzNTYgMjAwNS0wMi0yNSAxODoyNTo1OVogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIHZlcnNpb249IjEuMCIgaW5kZW50PSJ5ZXMiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKiI+Ci0gICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudElEIiBzZWxlY3Q9Iid0YWcnIi8+Ci0gIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIqfHRleHQoKXxAKiI+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icGFyZW50SUQiLz4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aGlzSUQiIHNlbGVjdD0iY29uY2F0KCRwYXJlbnRJRCwnLicsIGNvdW50KHByZWNlZGluZy1zaWJsaW5nOjoqKSkiLz4KLSAgPHhzbDpjb3B5PgotICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRhZ0lEIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRoaXNJRCIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAKiIvPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKnx0ZXh0KCl8QCoiPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudElEIiBzZWxlY3Q9IiR0aGlzSUQiLz4KLSAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gIDwveHNsOmNvcHk+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvb25lZm9ybS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvb25lZm9ybS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3N2JjMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL29uZWZvcm0uangKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIKLSAgeG1sbnM6Y2luY2x1ZGU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCIKLSAgPgotICAKLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5FZGl0PC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpoZWFkPgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9tb2R1bGVzL2VkaXRvcnMvamF2YXNjcmlwdC9vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuanMiLz4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvbW9kdWxlcy9lZGl0b3JzL2phdmFzY3JpcHQvb25lZm9ybV9sZW55YV9nbHVlLmpzIi8+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL21vZHVsZXMvZWRpdG9ycy9qYXZhc2NyaXB0L2Rpc2FibGViYWNrc3BhY2UuanMiLz4KLSAgPC9wYWdlOmhlYWQ+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgCi0KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgCi0gICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBuYW1lPSJvbmVmb3JtIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXROYW1lKCl9Ii8+Ci0gICAgICA8ang6Y2hvb3NlPgotICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdleGVjdXRhYmxlJykuYm9vbGVhblZhbHVlKCl9Ij4KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdG9nZ2xlZCIgc3R5bGU9ImZsb2F0OiBsZWZ0OyBtYXJnaW4tcmlnaHQ6IDEwcHg7Ij4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+SW5mb3JtYXRpb248L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgICAgICAgPGp4OnNldCB2YXI9ImRvYyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50Jyl9Ii8+Ci0gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5UaXRlbDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICAgICAgPHRkPjxqeDpvdXQgdmFsdWU9IiR7ZG9jLmdldE1ldGFEYXRhKCdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpLmdldEZpcnN0VmFsdWUoJ3RpdGxlJyl9Ii8+PC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5VVUlEPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQ+PGp4Om91dCB2YWx1ZT0iJHtkb2MuZ2V0VVVJRCgpfSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+TGFuZ3VhZ2U8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtkb2MuZ2V0TGFuZ3VhZ2UoKX0iLz4KLSAgICAgICAgICAgICAgICAgICAgKDxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHtkb2MuZ2V0TGFuZ3VhZ2UoKX0iLz48L2kxOG46dGV4dD4pCi0gICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdG9nZ2xlZCIgc3R5bGU9ImZsb2F0OiBsZWZ0OyBtYXJnaW4tcmlnaHQ6IDEwcHg7Ij4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjc3ludGF4Ij5QcmVkZWZpbmVkIEVudGl0aWVzPC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgICA8bGk+JmFtcDtsdDsgaW5zdGVhZCBvZiAmbHQ7IChsZWZ0IGFuZ2xlIGJyYWNrZXQgPHN0cm9uZz5tdXN0PC9zdHJvbmc+IGJlIGVzY2FwZWQpPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+JmFtcDthbXA7IGluc3RlYWQgb2YgJmFtcDsgKGFtcGVyc2FuZCA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gYmUgZXNjYXBlZCk8L2xpPgotICAgICAgICAgICAgICAgIDxsaT4mYW1wO2d0OyBpbnN0ZWFkIG9mICZndDsgKHJpZ2h0IGFuZ2xlIGJyYWNrZXQpPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+JmFtcDthcG9zOyBpbnN0ZWFkIG9mICcgKHNpbmdsZS1xdW90ZSk8L2xpPgotICAgICAgICAgICAgICAgIDxsaT4mYW1wO3F1b3Q7IGluc3RlYWQgb2YgIiAoZG91YmxlLXF1b3RlKTwvbGk+Ci0gICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjogYm90aDsiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiIG5hbWU9InN1Ym1pdCIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNhbmNlbCIgbmFtZT0iY2FuY2VsIiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iUmVmb3JtYXQiIG5hbWU9InJlZm9ybWF0IiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iaW5zZXJ0TGluay5zdWJtaXQiIGkxOG46YXR0cj0idmFsdWUiCi0gICAgICAgICAgICAgIG9uY2xpY2s9InRyaWdnZXJVc2VjYXNlKCdpbnNlcnRMaW5rJykiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJpbnNlcnRBc3NldC5pbnNlcnRJbWFnZSIgaTE4bjphdHRyPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgb25jbGljaz0idHJpZ2dlclVzZWNhc2UoJ2luc2VydEltYWdlJykiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJpbnNlcnRBc3NldC5pbnNlcnRBc3NldCIgaTE4bjphdHRyPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgb25jbGljaz0idHJpZ2dlclVzZWNhc2UoJ2luc2VydEFzc2V0JykiLz4KLSAgICAgICAgICA8L2Rpdj4KLQotICAgICAgICAgIDxkaXYgc3R5bGU9ImNsZWFyOiBib3RoOyI+Ci0gICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdjb250ZW50Jyl9Ij4KLSAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iY29udGVudCIgY29scz0iMTIwIiByb3dzPSI4MCI+Ci0gICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdjb250ZW50Jyl9Ii8+Ci0gICAgICAgICAgICAgICAgPC90ZXh0YXJlYT4KLSAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDxjaW5jbHVkZTppbmNsdWRleG1sPgotICAgICAgICAgICAgICAgICAgPGNpbmNsdWRlOnNyYz5jb2Nvb246Ly9tb2R1bGVzL2VkaXRvcnMvb25lZm9ybTwvY2luY2x1ZGU6c3JjPgotICAgICAgICAgICAgICAgIDwvY2luY2x1ZGU6aW5jbHVkZXhtbD4KLSAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICA8L2Rpdj4KLQotICAgICAgICAgIDxkaXY+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2F2ZSIgbmFtZT0ic3VibWl0IiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2FuY2VsIiBuYW1lPSJjYW5jZWwiIGkxOG46YXR0cj0idmFsdWUiLz4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgIDwvang6Y2hvb3NlPgotICAgIDwvZm9ybT4KLSAgICAKLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvb25lZm9ybS54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL29uZWZvcm0ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTZmYjE4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvb25lZm9ybS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG9uZWZvcm0ueHNsIDQyOTA4IDIwMDQtMDQtMjYgMTQ6NTc6MjVaIG1pY2hpICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gID4KLQotICA8eHNsOm91dHB1dCBpbmRlbnQ9Im5vIiAvPgotICA8eHNsOnBhcmFtIG5hbWU9ImRvY2lkIiAvPgotICA8eHNsOnBhcmFtIG5hbWU9Imxhbmd1YWdlIiAvPgotCi0gIDx4c2w6aW5jbHVkZSBocmVmPSJjb3B5LW1peGVkLWNvbnRlbnQueHNsIiAvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibmFtZXNwYWNlcyI+PHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9Im5hbWVzcGFjZXMiIC8+PC94c2w6YXR0cmlidXRlPjwvaW5wdXQ+Ci0gICAgPHRleHRhcmVhIG5hbWU9ImNvbnRlbnQiIGNvbHM9IjEyMCIgcm93cz0iODAiPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0ibWl4ZWRjb250ZW50IiAvPgotICAgIDwvdGV4dGFyZWE+Ci0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvdW5udW1iZXJUYWdzLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvdW5udW1iZXJUYWdzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiZjgxZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL3VubnVtYmVyVGFncy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHVubnVtYmVyVGFncy54c2wgNDI3MDMgMjAwNC0wMy0xMyAxMjo1Nzo1M1ogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIHZlcnNpb249IjEuMCIgaW5kZW50PSJ5ZXMiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKiIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gRklYTUU6IHRoZXJlIHNlZW1zIHRvIGJlIHNvbWV0aGluZyB3cm9uZyEhISAoWGFsYW4/KSBpZiBzb21ldGhpbmcgaXMgd3JpdHRlbiBpbiBmcm9udCBvZiBDb3B5LCB0aGVuIGl0IHdvcmtzLCBlbHNlIGl0IGRvZXNuJ3QgLi4uIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKnx0ZXh0KCkiPgotICA8eHNsOmNvcHk+Ci0gICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCpbbmFtZSgpIT0ndGFnSUQnXSIvPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKnx0ZXh0KCkiLz4KLSAgPC94c2w6Y29weT4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9pbnNlcnRBc3NldC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvaW5zZXJ0QXNzZXQuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWY1OGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9pbnNlcnRBc3NldC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGluc2VydEFzc2V0Lmp4IDUwODAzMiAyMDA3LTAyLTE1IDE3OjQxOjUzWiBhbmRyZWFzICQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0gIAotICA8cGFnZTpoZWFkPgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9tb2R1bGVzL2VkaXRvcnMvamF2YXNjcmlwdC9vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuanMiPiYjMTYwOzwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9tb2R1bGVzL2VkaXRvcnMvamF2YXNjcmlwdC9pbnNlcnRBc3NldC5qcyI+JiMxNjA7PC9zY3JpcHQ+Ci0gIDwvcGFnZTpoZWFkPgotICAKLSAgPCEtLSBUaGlzIHZpZXcgY2FuIGhhbmRsZSBib3RoIGluc2VydEFzc2V0IGFuZCBpbnNlcnRJbWFnZSwgCi0gICAgICAgZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5nIG9mIHRoZSBtb2RlIHBhcmFtZXRlciAoIkFzc2V0InwiSW1hZ2UiKSAtLT4KLSAgPGp4OnNldCB2YXI9Im1vZGUiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyQXNTdHJpbmcoJ21vZGUnKX0iLz4KLSAgCi0gIDxwYWdlOnRpdGxlPgotICAgIDxpMThuOnRleHQ+aW5zZXJ0QXNzZXQuaGVhZGluZzxqeDpvdXQgdmFsdWU9IiR7bW9kZX0iLz48L2kxOG46dGV4dD4KLSAgPC9wYWdlOnRpdGxlPgotICAKLSAgPHBhZ2U6Ym9keT4KLQotICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgbmFtZT0iaW5zZXJ0QXNzZXQiPgotCi0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgIAotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXROYW1lKCl9Ii8+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICAgICAgPGkxOG46dGV4dD5pbnNlcnRBc3NldC5hdmFpbGFibGU8ang6b3V0IHZhbHVlPSIke21vZGV9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLWxpc3QiIHN0eWxlPSJib3JkZXI6IG5vbmUiPgotCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0aCBzdHlsZT0iYmFja2dyb3VuZDogbm9uZTsiLz4KLSAgICAgICAgICAgICAgPHRoIHN0eWxlPSJiYWNrZ3JvdW5kOiBub25lOyI+PGkxOG46dGV4dD5pbnNlcnRBc3NldC5maWxlPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgICAgPHRoIHN0eWxlPSJiYWNrZ3JvdW5kOiBub25lOyI+PGkxOG46dGV4dD5pbnNlcnRBc3NldC5wcmV2aWV3PC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgICAgPHRoIHN0eWxlPSJiYWNrZ3JvdW5kOiBub25lOyI+PGkxOG46dGV4dD5pbnNlcnRBc3NldC50aXRsZTwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgICAgIDx0aCBzdHlsZT0iYmFja2dyb3VuZDogbm9uZTsiPjxpMThuOnRleHQ+aW5zZXJ0QXNzZXQuZmlsZVNpemU8L2kxOG46dGV4dD48L3RoPgotICAgICAgICAgICAgICA8dGggc3R5bGU9ImJhY2tncm91bmQ6IG5vbmU7Ij48aTE4bjp0ZXh0Pmluc2VydEFzc2V0LmltYWdlU2l6ZTwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICAgICAgICAgIDx0aCBzdHlsZT0iYmFja2dyb3VuZDogbm9uZTsiPjxpMThuOnRleHQ+aW5zZXJ0QXNzZXQuY3JlYXRpb25EYXRlPC9pMThuOnRleHQ+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJhc3NldDJwcm94eVVybCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2Fzc2V0MnByb3h5VXJsJyl9Ii8+Ci0gICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9ImFzc2V0IiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignYXNzZXRzJyl9Ij4KLSAgICAgICAgICAgICAgPGp4OnNldCB2YXI9Im1pbWVUeXBlIiB2YWx1ZT0iJHthc3NldC5nZXRNaW1lVHlwZSgpfSIvPgotICAgICAgICAgICAgICA8IS0tIEltYWdlcyBhcmUgZGlzcGxheWVkIGluIGJvdGggIkFzc2V0IiBhbmQgIkltYWdlIiBtb2RlLiBPdGhlciByZXNvdXJjZXMKLSAgICAgICAgICAgICAgICAgICBhcmUgZGlzcGxheWVkIG9ubHkgaW4gIkFzc2V0IiBtb2RlLiAtLT4KLSAgICAgICAgICAgICAgPGp4OmlmIHRlc3Q9IiR7bW9kZS5lcXVhbHMoJ0Fzc2V0JykgfHwgbWltZVR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJyl9Ij4KLSAgICAgICAgICAgICAgICA8IS0tIFdlIG11c3QgZGlmZmVyZW5jaWF0ZSBiZXR3ZWVuIGltYWdlcyBhbmQgYXNzZXRzIGhlcmU6IAotICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzIGdldCBhIHBhdGgtYmFzZWQgVVJMIHRvIGFsbG93IFdZU0lXWUcgZWRpdG9ycyB0byByZW5kZXIgdGhlbSAKLSAgICAgICAgICAgICAgICAgICAgICh0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvIGxlbnlhLWRvY3VtZW50OiBVUiBsYXRlcikuIAotICAgICAgICAgICAgICAgICAgICAgQXNzZXRzIGdldCBhIFVVSUQtYmFzZWQgbGVueWEtZG9jdW1lbnQgVVJMLgotICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7bW9kZS5lcXVhbHMoJ0ltYWdlJyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4OnNldCB2YXI9InVybCIgdmFsdWU9IiR7YXNzZXQycHJveHlVcmwuZ2V0KGFzc2V0KX0iLz4KLSAgICAgICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJ1cmwiIHZhbHVlPSIkeygnbGVueWEtZG9jdW1lbnQ6JyArIGFzc2V0LmdldFVVSUQoKSArICcsbGFuZz0nICsgYXNzZXQuZ2V0TGFuZ3VhZ2UoKSl9Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlICIrJyciIGNvbnN0cnVjdGlvbiBpcyB0byBhdm9pZCBudWxscyAoaXQgZm9yY2VzIHRoZW0gdG8gYmUgY2FzdCB0byB0aGUgZW1wdHkgc3RyaW5nKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICBVbmRlZmluZWQgdmFsdWVzIHdvdWxkIGNhdXNlIHRoZSBmb3JtIGZpZWxkIHRvIGJlIGRpc2FibGVkLgotICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJhc3NldCIgdmFsdWU9IiR7YXNzZXQuZ2V0UGF0aCgpfSIgCi0gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz0idXBkYXRlRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJyR7dXJsfScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICcke2Fzc2V0LmdldE1ldGFEYXRhKCdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpLmdldEZpcnN0VmFsdWUoJ3RpdGxlJykgKyAnJ30nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnJHthc3NldC5nZXRNZXRhRGF0YSgnaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvbWVkaWEvMS4wJykuZ2V0Rmlyc3RWYWx1ZSgnaGVpZ2h0JykgKyAnJ30nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnJHthc3NldC5nZXRNZXRhRGF0YSgnaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvbWVkaWEvMS4wJykuZ2V0Rmlyc3RWYWx1ZSgnd2lkdGgnKSArICcnfScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICcke2Fzc2V0LmdldE1pbWVUeXBlKCkgKyAnJ30nCi0gICAgICAgICAgICAgICAgICAgICAgKSIKLSAgICAgICAgICAgICAgICAgICAgLz4gCi0gICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke2Fzc2V0LmdldFBhdGgoKX0iLz4KLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHttaW1lVHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA/Pz8gLS0+PGp4OnNldCB2YXI9ImRvYyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50Jyl9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJHt1cmx9IiBzdHlsZT0iaGVpZ2h0OiAzMnB4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW46IDNweCAwcHg7Ii8+JiMxNjA7Ci0gICAgICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke21pbWVUeXBlfSIvPgotICAgICAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7YXNzZXQuZ2V0TWV0YURhdGEoJ2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJykuZ2V0Rmlyc3RWYWx1ZSgndGl0bGUnKX0iLz4KLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHthc3NldC5nZXRDb250ZW50TGVuZ3RoKCkgLyAxMDAwfSIvPiBrQgotICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgotICAgICAgICAgICAgICAgICAgICA8ang6aWYgdGVzdD0iJHttaW1lVHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKX0iPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7YXNzZXQuZ2V0TWV0YURhdGEoJ2h0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL21lZGlhLzEuMCcpLmdldEZpcnN0VmFsdWUoJ3dpZHRoJyl9Ii8+IHggPGp4Om91dCB2YWx1ZT0iJHthc3NldC5nZXRNZXRhRGF0YSgnaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvbWVkaWEvMS4wJykuZ2V0Rmlyc3RWYWx1ZSgnaGVpZ2h0Jyl9Ii8+PC9qeDppZj4KLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHtqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQoYXNzZXQuZ2V0TGFzdE1vZGlmaWVkKCkpfSIvPgotICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotCi0gICAgICAgICAgPC90YWJsZT4KLQotICAgICAgICAgIDxici8+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idXJsIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHlwZSIgdmFsdWU9IiIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJhdGlvIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idGV4dCI+PGkxOG46dGV4dD5pbnNlcnRBc3NldC5jYXB0aW9uPGp4Om91dCB2YWx1ZT0iJHttb2RlfSIvPjwvaTE4bjp0ZXh0PjwvbGFiZWw+OgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9InRleHQiIHRpdGxlPSIiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idGl0bGUiPjxpMThuOnRleHQ+aW5zZXJ0QXNzZXQudGl0bGU8L2kxOG46dGV4dD48L2xhYmVsPjoKLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJ0aXRsZSIgdGl0bGU9IiIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgPGp4OmlmIHRlc3Q9IiR7bW9kZS5lcXVhbHMoJ0ltYWdlJyl9Ij4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJ3aWR0aCI+PGkxOG46dGV4dD5pbnNlcnRBc3NldC53aWR0aDwvaTE4bjp0ZXh0PjwvbGFiZWw+OgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9IndpZHRoIiB0aXRsZT0iIiBvbmNoYW5nZT0ic2NhbGVIZWlnaHQodGhpcy52YWx1ZSkiLz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImhlaWdodCI+PGkxOG46dGV4dD5pbnNlcnRBc3NldC5oZWlnaHQ8L2kxOG46dGV4dD48L2xhYmVsPjoKLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJoZWlnaHQiIHRpdGxlPSIiIG9uY2hhbmdlPSJzY2FsZVdpZHRoKHRoaXMudmFsdWUpIi8+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvang6aWY+Ci0KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgICAgIDxpbnB1dCAKLSAgICAgICAgICAgICAgICAgIGkxOG46YXR0cj0idmFsdWUiIAotICAgICAgICAgICAgICAgICAgdHlwZT0ic3VibWl0IiAKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJpbnNlcnRBc3NldC5pbnNlcnQke21vZGV9IgotICAgICAgICAgICAgICAgICAgb25jbGljaz0ib3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmhhbmRsZUZvcm1TdWJtaXQoJ2luc2VydEFzc2V0Jyk7IiAKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCAKLSAgICAgICAgICAgICAgICAgIGkxOG46YXR0cj0idmFsdWUiIAotICAgICAgICAgICAgICAgICAgdHlwZT0ic3VibWl0IiAKLSAgICAgICAgICAgICAgICAgIG5hbWU9ImNhbmNlbCIgCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iQ2FuY2VsIgotICAgICAgICAgICAgICAgICAgb25DbGljaz0id2luZG93LmNsb3NlKCk7IiAKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCAKLSAgICAgICAgICAgICAgICAgIGkxOG46YXR0cj0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iYnV0dG9uIgotICAgICAgICAgICAgICAgICAgIHZhbHVlPSJpbnNlcnRBc3NldC5jcmVhdGVSZXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJsb2NhdGlvbi5ocmVmPSc/ZG9jdHlwZT1yZXNvdXJjZSZhbXA7bGVueWEudXNlY2FzZT1lZGl0b3JzLmNyZWF0ZVJlc291cmNlJmFtcDtsZW55YS5leGl0VXNlY2FzZT0ke3VzZWNhc2UuZ2V0TmFtZSgpfSciCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICA8L2Rpdj4KLQotICAgIDwvZm9ybT4KLQotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy94c2x0L2luc2VydExpbmsueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvZWRpdG9ycy94c2x0L2luc2VydExpbmsueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTg3MjQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2VkaXRvcnMveHNsdC9pbnNlcnRMaW5rLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tCi0gICRJZDogbGluay54c2wgNTU1NjU2IDIwMDctMDctMTIgMTU6MTc6NDdaIG5ldHRpbmdzICQKLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICB4bWxuczp1c2VjYXNlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiICAgICAKLSAgPgotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJwdWJsaWNhdGlvbklkIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iYXJlYSIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImRvY3VtZW50UGF0aCIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImRvY3VtZW50TGFuZ3VhZ2UiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJkb2N1bWVudEV4dGVuc2lvbiIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImRlZmF1bHRMYW5ndWFnZSIvPgotICA8eHNsOnBhcmFtIG5hbWU9Imxhbmd1YWdlcyIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImFyZWFCYXNlUGF0aCIvPgotICAKLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlbnNpb24iPgotICAgIDx4c2w6aWYgdGVzdD0iJGRvY3VtZW50RXh0ZW5zaW9uICE9ICcnIj4KLSAgICAgIDx4c2w6dGV4dD4uPC94c2w6dGV4dD4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRvY3VtZW50RXh0ZW5zaW9uIi8+Ci0gIDwveHNsOnZhcmlhYmxlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPHBhZ2U6cGFnZT4KLSAgICAgIDxwYWdlOnRpdGxlPjxpMThuOnRleHQ+aW5zZXJ0TGluay5oZWFkaW5nPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICAgICAgPHBhZ2U6Ym9keSBzdHlsZT0id2lkdGg6YXV0bzsiPgotCi0gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9tb2R1bGVzL3NpdGV0cmVlL2phdmFzY3JpcHQvdHJlZS5qcyI+JiMxNjA7PC9zY3JpcHQ+Ci0gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9tb2R1bGVzL3NpdGV0cmVlL2phdmFzY3JpcHQvbGVueWF0cmVlLmpzIj4mIzE2MDs8L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL21vZHVsZXMvc2l0ZXRyZWUvamF2YXNjcmlwdC9uYXZ0cmVlLmpzIj4mIzE2MDs8L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL21vZHVsZXMvZWRpdG9ycy9qYXZhc2NyaXB0L29yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5qcyI+JiMxNjA7PC9zY3JpcHQ+Ci0gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9tb2R1bGVzL2VkaXRvcnMvamF2YXNjcmlwdC9pbnNlcnRMaW5rLmpzIj4mIzE2MDs8L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgICAgICAgIEFSRUEgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcmVhIi8+IjsKLSAgICAgICAgICBET0NVTUVOVF9JRCA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRvY3VtZW50UGF0aCIvPiI7Ci0gICAgICAgICAgUFVCTElDQVRJT05fSUQgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwdWJsaWNhdGlvbklkIi8+IjsKLSAgICAgICAgICBDSE9TRU5fTEFOR1VBR0UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb2N1bWVudExhbmd1YWdlIi8+IjsKLSAgICAgICAgICBERUZBVUxUX0xBTkdVQUdFID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVmYXVsdExhbmd1YWdlIi8+IjsKLSAgICAgICAgICBJTUFHRV9QQVRIID0gIi9sZW55YS9pbWFnZXMvdHJlZS8iOwotICAgICAgICAgIENVVF9ET0NVTUVOVF9JRCA9ICcnOwotICAgICAgICAgIEFMTF9BUkVBUyA9ICJhdXRob3JpbmciOwotICAgICAgICAgIFBJUEVMSU5FX1BBVEggPSAnL3NpdGV0cmVlLWZyYWdtZW50LnhtbCc7Ci0gICAgICAgICAgQVJFQV9CQVNFX1BBVEggPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcmVhQmFzZVBhdGgiLz4iOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8ZGl2IGlkPSJsZW55YS1pbmZvLXRyZWVjYW52YXMiIHN0eWxlPSJ3aWR0aDogMjUwcHg7Ij4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS10YWJzIj4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJsYW5ndWFnZVRhYnMiPgotICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGFuZ3VhZ2VzIiBzZWxlY3Q9IiRsYW5ndWFnZXMiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPGRpdiBpZD0ibGVueWEtaW5mby10cmVlIj4KLSAgICAgICAgICAgIDxkaXYgaWQ9InRyZWUiPiYjMTYwOwotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giIHN0eWxlPSJtYXJnaW4tbGVmdDogMjYwcHg7Ij4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPjxpMThuOnRleHQ+aW5zZXJ0TGluay5oZWFkaW5nPC9pMThuOnRleHQ+PC9kaXY+Ci0gICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotCi0gICAgICAgICAgICA8Zm9ybSBuYW1lPSJpbnNlcnRMaW5rIj4KLQotICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImxlbnlhLWZvcm0tY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+aW5zZXJ0TGluay5jbGlja1RyZWVPclR5cGU8L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZm9ybS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD5pbnNlcnRMaW5rLlVSTDwvaTE4bjp0ZXh0PjoKLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJ1cmwiLz4KLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWZvcm0tY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+aW5zZXJ0TGluay50aXRsZTwvaTE4bjp0ZXh0PjoKLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJ0aXRsZSIvPgotICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZm9ybS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD5pbnNlcnRMaW5rLnRleHQ8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9InRleHQiLz4KLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IAotICAgICAgICAgICAgICAgICAgICAgIGkxOG46YXR0cj0idmFsdWUiIAotICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InN1Ym1pdCIgCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Imluc2VydExpbmsuc3VibWl0IiAKLSAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuaGFuZGxlRm9ybVN1Ym1pdCgnaW5zZXJ0TGluaycpIgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAmIzE2MDsKLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IAotICAgICAgICAgICAgICAgICAgICAgIGkxOG46YXR0cj0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic3VibWl0IgotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJDYW5jZWwiIAotICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImNhbmNlbCIKLSAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJ3aW5kb3cuY2xvc2UoKSIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgJiMxNjA7Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAKLSAgICAgICAgICAgICAgICAgICAgICBpMThuOmF0dHI9InZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJidXR0b24iIAotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJpbnNlcnRBc3NldC5jcmVhdGVSZXNvdXJjZSIgCi0gICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0ibG9jYXRpb24uaHJlZj0nP2xlbnlhLnVzZWNhc2U9ZWRpdG9ycy5jcmVhdGVSZXNvdXJjZSZhbXA7ZG9jdHlwZT1yZXNvdXJjZSZhbXA7bGVueWEuZXhpdFVzZWNhc2U9ZWRpdG9ycy5pbnNlcnRMaW5rJyIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPC9kaXY+Ci0gICAgICA8L3BhZ2U6Ym9keT4KLSAgICA8L3BhZ2U6cGFnZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9Imxhbmd1YWdlVGFicyI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJsYW5ndWFnZXMiLz4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoY29udGFpbnMoJGxhbmd1YWdlcywnLCcpKSI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJsYW5ndWFnZVRhYiI+Ci0gICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imxhbmd1YWdlIj4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGFuZ3VhZ2VzIi8+Ci0gICAgICAgICAgPC94c2w6d2l0aC1wYXJhbT4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWFkIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGxhbmd1YWdlcywnLCcpIiAvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhaWwiIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRsYW5ndWFnZXMsJywnKSIgLz4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imxhbmd1YWdlVGFiIj4KLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGFuZ3VhZ2UiIHNlbGVjdD0iJGhlYWQiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imxhbmd1YWdlVGFicyI+Ci0gICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imxhbmd1YWdlcyIgc2VsZWN0PSIkdGFpbCIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJsYW5ndWFnZVRhYiI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJsYW5ndWFnZSIvPgotICAgIDxhIGlkPSJ7JGxhbmd1YWdlfSI+Ci0gICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgPHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1YmxpY2F0aW9uSWQiLz4KLSAgICAgICAgPHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFyZWEiLz4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb2N1bWVudFBhdGgiLz4KLSAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxhbmd1YWdlIi8+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5zaW9uIi8+Ci0gICAgICAgIDx4c2w6dGV4dD4/bGVueWEudXNlY2FzZT1lZGl0b3JzLmluc2VydExpbms8L3hzbDp0ZXh0PgotICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICA8eHNsOnRleHQ+bGVueWEtdGFibGluazwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGRvY3VtZW50TGFuZ3VhZ2UgPSAkbGFuZ3VhZ2UiPgotICAgICAgICAgIDx4c2w6dGV4dD4tYWN0aXZlPC94c2w6dGV4dD4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxhbmd1YWdlIi8+Ci0gICAgPC9hPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW1wb3J0Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbXBvcnQueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmZjMzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbXBvcnQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZXhwb3J0LmltcG9ydCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJleHBvcnQuaW1wb3J0IiBsb2dnZXI9ImxlbnlhLmV4cG9ydCINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuZXhwb3J0LkltcG9ydCI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL2V4cG9ydC91c2VjYXNlcy9pbXBvcnQuangiIG1lbnU9ImZhbHNlIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWltcG9ydEV4YW1wbGVDb250ZW50Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbXBvcnRFeGFtcGxlQ29udGVudC54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliOGMxOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWltcG9ydEV4YW1wbGVDb250ZW50Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2V4cG9ydC5pbXBvcnRFeGFtcGxlQ29udGVudCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJleHBvcnQuaW1wb3J0RXhhbXBsZUNvbnRlbnQiIGxvZ2dlcj0ibGVueWEuZXhwb3J0Ig0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5leHBvcnQuSW1wb3J0Ij4NCi0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvZXhwb3J0L3VzZWNhc2VzL2ltcG9ydEV4YW1wbGVDb250ZW50Lmp4IiBtZW51PSJmYWxzZSIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmUyMDU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmV4cG9ydDwvaWQ+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnVzZWNhc2UiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuc2l0ZXRyZWUiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMubGlua2luZyIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPkV4cG9ydCBhbmQgaW1wb3J0PC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj5FeHBvcnQgYW5kIGltcG9ydCBkb2N1bWVudHM8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZXhwb3J0L0ltcG9ydC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2V4cG9ydC9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlNjQ2Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZXhwb3J0L0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5leHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLlNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2U7Ci0KLS8qKgotICogSW1wb3J0IGNvbnRlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBBYnN0cmFjdFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb247Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLCBnZXREb2N1bWVudEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlVVJMKCkpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcGF0aCA9IGdldEV4YW1wbGVDb250ZW50UGF0aChwdWJsaWNhdGlvbik7Ci0gICAgICAgIGlmICghbmV3IEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHBhdGggPSBnZXRFeGFtcGxlQ29udGVudFBhdGgoZ2V0RGVmYXVsdFB1YigpKTsKLSAgICAgICAgfQotICAgICAgICBzZXRQYXJhbWV0ZXIoInBhdGgiLCBwYXRoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4YW1wbGVDb250ZW50UGF0aChQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbikgewotICAgICAgICByZXR1cm4gcHVibGljYXRpb24uZ2V0RGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLSAgICAgICAgICAgICAgICArICIvZXhhbXBsZS1jb250ZW50IjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHVibGljYXRpb24gZ2V0RGVmYXVsdFB1YigpIHsKLSAgICAgICAgUHVibGljYXRpb24gZGVmYXVsdFB1YjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlZmF1bHRQdWIgPSBnZXREb2N1bWVudEZhY3RvcnkoKS5nZXRQdWJsaWNhdGlvbigiZGVmYXVsdCIpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmYXVsdFB1YjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotICAgICAgICBBcmVhIGFyZWEgPSBnZXRBcmVhKCk7Ci0gICAgICAgIGlmIChhcmVhLmdldERvY3VtZW50cygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiWW91IGNhbid0IGltcG9ydCBhbnl0aGluZyBiZWNhdXNlIHRoaXMgcHVibGljYXRpb24gYWxyZWFkeSBjb250YWlucyBjb250ZW50LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFyZWEgZ2V0QXJlYSgpIHsKLSAgICAgICAgU3RyaW5nIHVybCA9IGdldFNvdXJjZVVSTCgpOwotICAgICAgICBVUkxJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFVSTEluZm9ybWF0aW9uKHVybCk7Ci0gICAgICAgIFN0cmluZyBwdWJJZCA9IGluZm8uZ2V0UHVibGljYXRpb25JZCgpOwotICAgICAgICBTdHJpbmcgYXJlYU5hbWUgPSBpbmZvLmdldEFyZWEoKTsKLSAgICAgICAgQXJlYSBhcmVhOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXJlYSA9IGdldERvY3VtZW50RmFjdG9yeSgpLmdldFB1YmxpY2F0aW9uKHB1YklkKS5nZXRBcmVhKGFyZWFOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoUHVibGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFyZWE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRQYXJhbWV0ZXJBc1N0cmluZygicGF0aCIpOwotICAgICAgICBTdHJpbmcgYmFzZVVyaSA9ICJmaWxlOi8vIiArIHBhdGg7Ci0gICAgICAgIFN0cmluZyBzaXRldHJlZVVyaSA9IGJhc2VVcmkgKyAiL3NpdGV0cmVlLnhtbCI7Ci0gICAgICAgIGlmICghU291cmNlVXRpbC5leGlzdHMoc2l0ZXRyZWVVcmksIHRoaXMubWFuYWdlcikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIHNpdGV0cmVlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBkaXJlY3RvcnkuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoInBhdGgiKTsKLSAgICAgICAgSW1wb3J0ZXIgaW1wb3J0ZXIgPSBuZXcgSW1wb3J0ZXIodGhpcy5tYW5hZ2VyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIGltcG9ydGVyLmltcG9ydENvbnRlbnQoZ2V0RGVmYXVsdFB1YigpLCBnZXRBcmVhKCksIHBhdGgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2V4cG9ydC9JbXBvcnRlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2V4cG9ydC9JbXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGZiY2ZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9leHBvcnQvSW1wb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi9wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmV4cG9ydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5BcmVhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLkRlZmF1bHRTaXRlVHJlZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBJbXBvcnQgY29udGVudC4KLSAqLwotcHVibGljIGNsYXNzIEltcG9ydGVyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIHsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIEltcG9ydGVyKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgZW5hYmxlTG9nZ2luZyhsb2dnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcG9ydHMgY29udGVudCBpbnRvIGFuIGFyZWEuCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggY29udGFpbmluZyB0aGUgY29udGVudC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW1wb3J0Q29udGVudChBcmVhIGFyZWEsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW1wb3J0Q29udGVudChhcmVhLmdldFB1YmxpY2F0aW9uKCksIGFyZWEsIHBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcG9ydHMgY29udGVudCBmcm9tIGEgZGlmZmVyZW50IHB1YmxpY2F0aW9uIGludG8gYW4gYXJlYS4KLSAgICAgKiBAcGFyYW0gc3JjUHViIFRoZSBzb3VyY2UgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggY29udGFpbmluZyB0aGUgY29udGVudC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW1wb3J0Q29udGVudChQdWJsaWNhdGlvbiBzcmNQdWIsIEFyZWEgYXJlYSwgU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJJbXBvcnRpbmcgZG9jdW1lbnRzIGludG8gYXJlYSBbIiArIGFyZWEgKyAiXSIpOwotCi0gICAgICAgIFN0cmluZyBiYXNlVXJpID0gImZpbGU6Ly8iICsgcGF0aDsKLSAgICAgICAgU3RyaW5nIHNpdGV0cmVlVXJpID0gYmFzZVVyaSArICIvc2l0ZXRyZWUueG1sIjsKLQotICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCB4bWwgPSBTb3VyY2VVdGlsLnJlYWRET00oc2l0ZXRyZWVVcmksIHRoaXMubWFuYWdlcik7Ci0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKERlZmF1bHRTaXRlVHJlZS5OQU1FU1BBQ0VfVVJJLCAiIiwgeG1sKTsKLQotICAgICAgICBFbGVtZW50IHNpdGVFbGVtZW50ID0geG1sLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBpbXBvcnRDaGlsZHJlbihhcmVhLCBoZWxwZXIsIHNpdGVFbGVtZW50LCBiYXNlVXJpLCAiIik7Ci0KLSAgICAgICAgY29udmVydExpbmtzKHNyY1B1YiwgYXJlYSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW1wb3J0RWxlbWVudChBcmVhIGFyZWEsIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgIFN0cmluZyBiYXNlVXJpLCBTdHJpbmcgcGFyZW50UGF0aCkgewotICAgICAgICBTdHJpbmcgcGF0aCA9IHBhcmVudFBhdGggKyAiLyIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQotICAgICAgICBib29sZWFuIHZpc2libGUgPSB0cnVlOwotICAgICAgICBTdHJpbmcgdmlzaWJsZVN0cmluZyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2aXNpYmxlaW5uYXYiKTsKLSAgICAgICAgaWYgKHZpc2libGVTdHJpbmcgIT0gbnVsbCAmJiAhdmlzaWJsZVN0cmluZy5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB2aXNpYmxlID0gQm9vbGVhbi52YWx1ZU9mKHZpc2libGVTdHJpbmcpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgRWxlbWVudFtdIGxhYmVsRWxlbWVudHMgPSBoZWxwZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCwgImxhYmVsIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW1wb3J0RG9jdW1lbnQoYXJlYSwgbGFiZWxFbGVtZW50c1tpXSwgYmFzZVVyaSwgcGF0aCwgdmlzaWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW1wb3J0Q2hpbGRyZW4oYXJlYSwgaGVscGVyLCBlbGVtZW50LCBiYXNlVXJpLCBwYXRoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbXBvcnREb2N1bWVudChBcmVhIGFyZWEsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGJhc2VVcmksIFN0cmluZyBwYXRoLAotICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlSW5OYXYpIHsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIik7Ci0gICAgICAgIFN0cmluZyBuYXZpZ2F0aW9uVGl0bGUgPSBEb2N1bWVudEhlbHBlci5nZXRTaW1wbGVFbGVtZW50VGV4dChlbGVtZW50KTsKLQotICAgICAgICBTdHJpbmcgY29udGVudFVyaSA9IGJhc2VVcmkgKyBwYXRoICsgIi9pbmRleF8iICsgbGFuZ3VhZ2U7Ci0gICAgICAgIFN0cmluZyBtZXRhVXJpID0gY29udGVudFVyaSArICIubWV0YSI7Ci0KLSAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY01hbmFnZXIgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gbnVsbDsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCB4bWwgPSBTb3VyY2VVdGlsLnJlYWRET00obWV0YVVyaSwgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIiwgIiIsIHhtbCk7Ci0gICAgICAgICAgICBFbGVtZW50IG1ldGFFbGVtZW50ID0gaGVscGVyLmdldEZpcnN0Q2hpbGQoeG1sLmdldERvY3VtZW50RWxlbWVudCgpLCAibWV0YSIpOwotICAgICAgICAgICAgRWxlbWVudCBpbnRlcm5hbEVsZW1lbnQgPSBoZWxwZXIuZ2V0Rmlyc3RDaGlsZChtZXRhRWxlbWVudCwgImludGVybmFsIik7Ci0gICAgICAgICAgICBFbGVtZW50IHJlc291cmNlVHlwZUVsZW1lbnQgPSBoZWxwZXIuZ2V0Rmlyc3RDaGlsZChpbnRlcm5hbEVsZW1lbnQsICJyZXNvdXJjZVR5cGUiKTsKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVR5cGVOYW1lID0gRG9jdW1lbnRIZWxwZXIuZ2V0U2ltcGxlRWxlbWVudFRleHQocmVzb3VyY2VUeXBlRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgbWltZVR5cGVFbGVtZW50ID0gaGVscGVyLmdldEZpcnN0Q2hpbGQoaW50ZXJuYWxFbGVtZW50LCAibWltZVR5cGUiKTsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IERvY3VtZW50SGVscGVyLmdldFNpbXBsZUVsZW1lbnRUZXh0KG1pbWVUeXBlRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChSZXNvdXJjZVR5cGUuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgcmVzb3VyY2VUeXBlID0gKFJlc291cmNlVHlwZSkgc2VsZWN0b3Iuc2VsZWN0KHJlc291cmNlVHlwZU5hbWUpOwotCi0gICAgICAgICAgICBkb2NNYW5hZ2VyID0gKERvY3VtZW50TWFuYWdlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBEb2N1bWVudCBuZXdEb2M7Ci0gICAgICAgICAgICBTaXRlU3RydWN0dXJlIHNpdGUgPSBhcmVhLmdldFNpdGUoKTsKLSAgICAgICAgICAgIGlmICghc2l0ZS5jb250YWlucyhwYXRoKSB8fCBzaXRlLmdldE5vZGUocGF0aCkuZ2V0TGFuZ3VhZ2VzKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICBuZXdEb2MgPSBkb2NNYW5hZ2VyLmFkZChhcmVhLmdldFB1YmxpY2F0aW9uKCkuZ2V0RmFjdG9yeSgpLCByZXNvdXJjZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VXJpLCBhcmVhLmdldFB1YmxpY2F0aW9uKCksIGFyZWEuZ2V0TmFtZSgpLCBwYXRoLCBsYW5ndWFnZSwgInhtbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uVGl0bGUsIHZpc2libGVJbk5hdik7Ci0gICAgICAgICAgICAgICAgbmV3RG9jLnNldE1pbWVUeXBlKG1pbWVUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IHNpdGUuZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBub2RlLmdldExpbmsobm9kZS5nZXRMYW5ndWFnZXMoKVswXSkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBuZXdEb2MgPSBkb2NNYW5hZ2VyLmFkZFZlcnNpb24oZG9jLCBhcmVhLmdldE5hbWUoKSwgbGFuZ3VhZ2UsIHRydWUpOwotICAgICAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgICAgIFNvdXJjZVV0aWwuY29weShyZXNvbHZlciwgY29udGVudFVyaSwgbmV3RG9jLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBuZXdEb2MuZ2V0TGluaygpLnNldExhYmVsKG5hdmlnYXRpb25UaXRsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBkY05hbWVzcGFjZSA9ICJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgZGNFbGVtZW50ID0gaGVscGVyLmdldEZpcnN0Q2hpbGQobWV0YUVsZW1lbnQsICJkYyIpOwotICAgICAgICAgICAgTmFtZXNwYWNlSGVscGVyIGRjSGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihkY05hbWVzcGFjZSwgImRjIiwgeG1sKTsKLSAgICAgICAgICAgIEVsZW1lbnRbXSBkY0VsZW1lbnRzID0gZGNIZWxwZXIuZ2V0Q2hpbGRyZW4oZGNFbGVtZW50KTsKLQotICAgICAgICAgICAgTWV0YURhdGEgbWV0YSA9IG5ld0RvYy5nZXRNZXRhRGF0YShkY05hbWVzcGFjZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRjRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZGNFbGVtZW50c1tpXS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBEb2N1bWVudEhlbHBlci5nZXRTaW1wbGVFbGVtZW50VGV4dChkY0VsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgICAgICBtZXRhLnNldFZhbHVlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkb2NNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShkb2NNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbXBvcnRDaGlsZHJlbihBcmVhIGFyZWEsIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgIFN0cmluZyBiYXNlVXJpLCBTdHJpbmcgcGF0aCkgewotICAgICAgICBFbGVtZW50W10gZWxlbWVudHMgPSBoZWxwZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCwgIm5vZGUiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW1wb3J0RWxlbWVudChhcmVhLCBoZWxwZXIsIGVsZW1lbnRzW2ldLCBiYXNlVXJpLCBwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbnZlcnRMaW5rcyhQdWJsaWNhdGlvbiBzcmNQdWIsIEFyZWEgYXJlYSkgewotICAgICAgICBEb2N1bWVudFtdIGRvY3MgPSBhcmVhLmdldERvY3VtZW50cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIExpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IExpbmtDb252ZXJ0ZXIodGhpcy5tYW5hZ2VyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICBjb252ZXJ0ZXIuY29udmVydFVybHNUb1V1aWRzKHNyY1B1YiwgZG9jc1tpXSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2V4cG9ydC9JbXBvcnRUZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2V4cG9ydC9JbXBvcnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjI1ODYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9leHBvcnQvSW1wb3J0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmV4cG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuTGlua01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotCi0vKioKLSAqIEltcG9ydCBleGFtcGxlIGNvbnRlbnQgaW50byB0ZXN0IHB1YmxpY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0VGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgLyoqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGxvZ2luKCJsZW55YSIpOwotICAgICAgICAKLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZ2V0UHVibGljYXRpb24oc2Vzc2lvbiwgInRlc3QiKTsKLSAgICAgICAgQXJlYSBhcmVhID0gcHViLmdldEFyZWEoImF1dGhvcmluZyIpOwotICAgICAgICAKLSAgICAgICAgaWYgKGFyZWEuZ2V0RG9jdW1lbnRzKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIGRlZmF1bHRQdWIgPSBnZXRQdWJsaWNhdGlvbihzZXNzaW9uLCAiZGVmYXVsdCIpOwotICAgICAgICAgICAgQXJlYSBkZWZhdWx0QXJlYSA9IGRlZmF1bHRQdWIuZ2V0QXJlYSgiYXV0aG9yaW5nIik7Ci0gICAgICAgICAgICBTdHJpbmcgcHViUGF0aCA9IGRlZmF1bHRBcmVhLmdldFB1YmxpY2F0aW9uKCkuZ2V0RGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHB1YlBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykgKyAiL2V4YW1wbGUtY29udGVudCI7Ci0gICAgICAgICAgICBJbXBvcnRlciBpbXBvcnRlciA9IG5ldyBJbXBvcnRlcihnZXRNYW5hZ2VyKCksIGdldExvZ2dlcigpKTsKLSAgICAgICAgICAgIGltcG9ydGVyLmltcG9ydENvbnRlbnQoZGVmYXVsdFB1YiwgYXJlYSwgcGF0aCk7Ci0gICAgICAgICAgICBzZXNzaW9uLmNvbW1pdCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGFyZWEuZ2V0U2l0ZSgpLmNvbnRhaW5zKCIvdHV0b3JpYWwiKSk7Ci0gICAgICAgIGNoZWNrTGlua3MoYXJlYSk7Ci0gICAgICAgIAotICAgICAgICBTZXNzaW9uIGFsaWNlU2Vzc2lvbiA9IGxvZ2luKCJhbGljZSIpOwotICAgICAgICBQdWJsaWNhdGlvbiBhbGljZVB1YiA9IGdldFB1YmxpY2F0aW9uKGFsaWNlU2Vzc2lvbiwgInRlc3QiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhbGljZVB1Yi5nZXRBcmVhKCJhdXRob3JpbmciKS5nZXRTaXRlKCkuY29udGFpbnMoIi90dXRvcmlhbCIpKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tMaW5rcyhBcmVhIGFyZWEpIHRocm93cyBQdWJsaWNhdGlvbkV4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgc2l0ZSA9IGFyZWEuZ2V0U2l0ZSgpOwotICAgICAgICBEb2N1bWVudCBzb3VyY2UgPSBzaXRlLmdldE5vZGUoIi9pbmRleCIpLmdldExpbmsoImVuIikuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIExpbmtNYW5hZ2VyIGxpbmtNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxpbmtNYW5hZ2VyID0gKExpbmtNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkubG9va3VwKExpbmtNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgTGlua1tdIGxpbmtzID0gbGlua01hbmFnZXIuZ2V0TGlua3NGcm9tKHNvdXJjZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGxpbmtzLmxlbmd0aCA+IDApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGxpbmtNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShsaW5rTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzgyNjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aS54bWwgNDQ3Mzk1IDIwMDYtMDktMTggMTM6MDE6MzNaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJlbiIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLSAgDQotICA8bWVzc2FnZSBrZXk9ImdldHRpbmctc3RhcnRlZCI+R2V0dGluZyBTdGFydGVkPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ0aGFua3MiPlRoYW5rIHlvdSBmb3IgY29uc2lkZXJpbmcgQXBhY2hlIExlbnlhITwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW1wb3J0LWV4YW1wbGUtY29udGVudCI+SW1wb3J0IGV4YW1wbGUgcGFnZXM8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImNyZWF0ZS1vd24tcGFnZSI+U3RhcnQgd2l0aCBvd24gcGFnZTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0ibWF5LXRha2UtYS13aGlsZSI+VGhpcyBtYXkgdGFrZSBhIGNvdXBsZSBvZiBzZWNvbmRzLjwvbWVzc2FnZT4NCi0gIA0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWM2ZmViLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NzM5NSAyMDA2LTA5LTE4IDEzOjAxOjMzWiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0gIA0KLSAgPG1lc3NhZ2Uga2V5PSJnZXR0aW5nLXN0YXJ0ZWQiPkVyc3RlIFNjaHJpdHRlPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ0aGFua3MiPlZpZWxlbiBEYW5rLCBkYXNzIFNpZSBzaWNoIEFwYWNoZSBMZW55YSBuw6RoZXIgYW5zY2hhdWVuITwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iaW1wb3J0LWV4YW1wbGUtY29udGVudCI+QmVpc3BpZWwtSW5oYWx0IGltcG9ydGllcmVuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJjcmVhdGUtb3duLXBhZ2UiPkVpZ2VuZSBTZWl0ZSBhbmxlZ2VuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJtYXktdGFrZS1hLXdoaWxlIj5EaWVzIGthbm4gZWluaWdlIFNla3VuZGVuIGRhdWVybi48L21lc3NhZ2U+DQotICANCi08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L3NpdGVtYXAueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyZTQ3NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICA8bWFwOnBpcGVsaW5lcz4KLSAgICAKLSAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJkaXJlY3RvcnkvKio6KiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0iZGlyZWN0b3J5IiBzcmM9Ii97MX0iLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJ4c2x0L2RpcjJ4aHRtbC54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InBhdGgiIHZhbHVlPSJ7MX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjb250aW51YXRpb25JZCIgdmFsdWU9InsyfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVyaSIgdmFsdWU9IntyZXF1ZXN0OnJlcXVlc3RVcml9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotCi08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L3VzZWNhc2VzL2ltcG9ydC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC91c2VjYXNlcy9pbXBvcnQuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NDM5MDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L3VzZWNhc2VzL2ltcG9ydC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IGZvcm1zLmp4IDQxNjY0NiAyMDA2LTA2LTIzIDA5OjAyOjAzWiBhbmRyZWFzICQgLS0+Ci08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIKLSAgeG1sbnM6Y2k9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCIKLSAgPgotICAKLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5JbXBvcnQ8L2kxOG46dGV4dD48L3BhZ2U6dGl0bGU+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgCi0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgIAotICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPgotICAgICAgCi0gICAgICA8ang6Y2hvb3NlPgotICAgICAgICA8ang6d2hlbiB0ZXN0PSIkeyEgdXNlY2FzZS5oYXNFcnJvcnMoKX0iPgotICAgICAgICAgIDxwPjxpMThuOnRleHQ+U2VsZWN0IGltcG9ydCBkaXJlY3Rvcnk8L2kxOG46dGV4dD46PC9wPgotICAgICAgICAgIDxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwIj4KLSAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJwYXRoIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncGF0aCcpfSIvPgotICAgICAgICAgICAgPGp4OnNldCB2YXI9Imxhc3RJbmRleCIgdmFsdWU9IiR7cGF0aC5sYXN0SW5kZXhPZignLycpfSIvPgotICAgICAgICAgICAgPGp4OmlmIHRlc3Q9IiR7bGFzdEluZGV4ICZndDsgLTF9Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iP2xlbnlhLnVzZWNhc2U9JHt1c2VjYXNlLmdldE5hbWUoKX0mYW1wO2xlbnlhLmNvbnRpbnVhdGlvbj0ke2NvbnRpbnVhdGlvbi5pZH0mYW1wO3BhdGg9JHtwYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpfSI+Li48L2E+Ci0gICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgIDwvcD4KLSAgICAgICAgICA8Y2k6aW5jbHVkZSBzcmM9ImNvY29vbjovL21vZHVsZXMvZXhwb3J0L2RpcmVjdG9yeS8ke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdwYXRoJyl9OiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iSW1wb3J0IiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2FuY2VsIiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgPC9wPgotICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2FuY2VsIiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgPC9wPgotICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgIDwvang6Y2hvb3NlPgotICAgICAgCi0gICAgPC9mb3JtPgotICAgIAotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC91c2VjYXNlcy9pbXBvcnRFeGFtcGxlQ29udGVudC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC91c2VjYXNlcy9pbXBvcnRFeGFtcGxlQ29udGVudC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0Yzg0MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9leHBvcnQvdXNlY2FzZXMvaW1wb3J0RXhhbXBsZUNvbnRlbnQuangKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZm9ybXMuanggNDE2NjQ2IDIwMDYtMDYtMjMgMDk6MDI6MDNaIGFuZHJlYXMgJCAtLT4KLQotPHBhZ2U6cGFnZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zOmNpPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaW5jbHVkZS8xLjAiCi0gID4KLQotICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0PmdldHRpbmctc3RhcnRlZDwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLQotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLQotICAgIDxqeDpjaG9vc2U+Ci0gICAgICA8ang6d2hlbiB0ZXN0PSIkeyEgdXNlY2FzZS5oYXNFcnJvcnMoKX0iPgotICAgICAgICA8cD48aTE4bjp0ZXh0PnRoYW5rczwvaTE4bjp0ZXh0PjwvcD4KLSAgICAgICAgPGZvcm0gbmFtZT0iaW1wb3J0IiBtZXRob2Q9InBvc3QiPgotICAgICAgICAgIDxwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImltcG9ydC1leGFtcGxlLWNvbnRlbnQiIGkxOG46YXR0cj0idmFsdWUiLz4KLSAgICAgICAgICAgIDxpMThuOnRleHQ+bWF5LXRha2UtYS13aGlsZTwvaTE4bjp0ZXh0PgotICAgICAgICAgIDwvcD4KLSAgICAgICAgPC9mb3JtPgotICAgICAgICA8Zm9ybSBuYW1lPSJjcmVhdGUiIG1ldGhvZD0iZ2V0Ij4KLSAgICAgICAgICA8cD4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSJzaXRlbWFuYWdlbWVudC5jcmVhdGUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhdGgiIHZhbHVlPSIvaW5kZXgiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImNyZWF0ZS1vd24tcGFnZSIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgICAgIDwvcD4KLSAgICAgICAgPC9mb3JtPgotICAgICAgPC9qeDp3aGVuPgotICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXROYW1lKCl9Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2FuY2VsIiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgPC9mb3JtPgotICAgICAgICA8L3A+Ci0gICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICA8L2p4OmNob29zZT4KLQotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L3hzbHQvZGlyMnhodG1sLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2V4cG9ydC94c2x0L2RpcjJ4aHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzkxMGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZXhwb3J0L3hzbHQvZGlyMnhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHhpbmNsdWRlLnhzbCAxMjM0MTQgMjAwNC0xMi0yNyAxNDo1MjoyNFogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczpkaXI9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9kaXJlY3RvcnkvMi4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgPgotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0idXJpIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29udGludWF0aW9uSWQiLz4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvZGlyOmRpcmVjdG9yeSI+Ci0gICAgPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDAiPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXRoIi8+Ci0gICAgPC9wPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjaGlsZHJlbiIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkaXI6ZGlyZWN0b3J5Ij4KLSAgICA8bGk+Ci0gICAgICA8YSBocmVmPSJ7JHVyaX0/bGVueWEudXNlY2FzZT1leHBvcnQuaW1wb3J0JmFtcDtsZW55YS5jb250aW51YXRpb249eyRjb250aW51YXRpb25JZH0mYW1wO3BhdGg9eyRwYXRofS97QG5hbWV9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+Ci0gICAgPC9saT4KLSAgICA8eHNsOmlmIHRlc3Q9IioiPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNoaWxkcmVuIi8+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iY2hpbGRyZW4iPgotICAgIDx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMDsgbGlzdC1zdHlsZS10eXBlOiBub25lOyI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IioiPgotICAgICAgICA8eHNsOnNvcnQvPgotICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgIDwvdWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtZWRpdC1mY2tlZGl0b3IueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy1lZGl0LWZja2VkaXRvci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMjMzZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy1lZGl0LWZja2VkaXRvci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZmNrZWRpdG9yLmVkaXQnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJmY2tlZGl0b3IuZWRpdCIgbG9nZ2VyPSJsZW55YS5wdWJsaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy5mY2tlZGl0b3IuRmNrZWRpdG9yIj4KLSAgICA8dHJhbnNhY3Rpb24gcG9saWN5PSJwZXNzaW1pc3RpYyIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0idGlkeUNvbmZpZyIgdmFsdWU9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9mY2tlZGl0b3IvY29uZmlnL2p0aWR5LnByb3BlcnRpZXMiLz4gCi0gICAgPHZpZXcgdXJpPSIvbW9kdWxlcy9mY2tlZGl0b3IvZmNrZWRpdG9yLm9wZW4iIG1lbnU9ImZhbHNlIi8+Ci0gICAgPGV2ZW50IGlkPSJlZGl0IiAvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY2hlY2tvdXRSZXN0cmljdGVkVG9TZXNzaW9uIiB2YWx1ZT0iZmFsc2UiLz4KLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0gICAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL2NvbmZpZy9qdGlkeS5wcm9wZXJ0aWVzIGIvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL2NvbmZpZy9qdGlkeS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmViOTExLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9jb25maWcvanRpZHkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLWFkZC14bWwtZGVjbD15ZXMKLWFkZC14bWwtc3BhY2U9eWVzCi1hbHQtdGV4dD0iIgotYXNzdW1lLXhtbC1wcm9jaW5zPXllcwotYmFyZT15ZXMKLWNsZWFuPXllcwotZHJvcC1lbXB0eS1wYXJhcz15ZXMKLWRyb3AtZm9udC10YWdzPXllcwotZHJvcC1wcm9wcmlldGFyeS1hdHRyaWJ1dGVzPXllcwotZW5jbG9zZS10ZXh0PXllcwotaW5kZW50LWNkYXRhPXllcwotbG9naWNhbC1lbXBoYXNpcz15ZXMKLW51bWVyaWMtZW50aXRpZXM9eWVzCi1vdXRwdXQteGh0bWw9eWVzCi1xdW90ZS1uYnNwPW5vCi13b3JkLTIwMDA9eWVzCi1icmVhay1iZWZvcmUtYnI9eWVzCi1pbmRlbnQ9YXV0bwotdmVydGljYWwtc3BhY2U9eWVzCi1tYXJrdXA9bm8KLXRpZHktbWFyaz1ubwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL2NvbmZpZy9tZW51LnhzcCBiL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9jb25maWcvbWVudS54c3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjcwNDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL2NvbmZpZy9tZW51LnhzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eHNwOnBhZ2UgCi0gICAgbGFuZ3VhZ2U9ImphdmEiIAotICAgIHhtbG5zOnhzcD0iaHR0cDovL2FwYWNoZS5vcmcveHNwIgotICAgIHhtbG5zOnhzcC1yZXF1ZXN0PSJodHRwOi8vYXBhY2hlLm9yZy94c3AvcmVxdWVzdC8yLjAiCi0gICAgeG1sbnM6aW5wdXQ9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi94c3AvaW5wdXQvMS4wIgotICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gICAgeG1sbnM6d2Y9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS93b3JrZmxvdy8xLjAiCi0gICAgeG1sbnM6dWM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91c2VjYXNlLzEuMCIKLSAgICB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21lbnViYXIvMS4wIgotPgotCi0gIDxtZW51PgotICAgIDxtZW51cz4KLSAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iRWRpdCI+Ci0gICAgICAgICAgPHhzcDpsb2dpYz4KLSAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlID0gPGlucHV0OmdldC1hdHRyaWJ1dGUgbW9kdWxlPSJwYWdlLWVudmVsb3BlIiBhcz0ic3RyaW5nIiBuYW1lPSJkb2N1bWVudC10eXBlIi8+OwotICAgICAgICAgICAgaWYgKCJ4aHRtbCIuZXF1YWxzKGRvY3R5cGUpIHx8ICJob21lcGFnZSIuZXF1YWxzKGRvY3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgPGJsb2NrIGluZm89ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgIDxpdGVtIHdmOmV2ZW50PSJlZGl0IiB1Yzp1c2VjYXNlPSJmY2tlZGl0b3IuZWRpdCIgaHJlZj0iPyI+PGkxOG46dGV4dD5XaXRoIEZDS0VkaXRvcjwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICAgICAgICA8L2Jsb2NrPgotICAgICAgICAgICAgfQotICAgICAgICAgIDwveHNwOmxvZ2ljPgotICAgICAgPC9tZW51PgotICAgICAgCi0gICAgPC9tZW51cz4KLSAgICAKLSAgPC9tZW51PgotPC94c3A6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWE1NDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuZmNrZWRpdG9yPC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMi1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPkZDSyBFZGl0b3I8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPkZDSyBFZGl0b3IsIG5vdyB1c2VzIGdlbmVyaWMgdXNlY2FzZXMgdG8gaW5zZXJ0IGxpbmtzLCBpbWFnZXMgYW5kCi0gIGFzc2V0czwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy9mY2tlZGl0b3IvRmNrZWRpdG9yLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy9mY2tlZGl0b3IvRmNrZWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWJjMGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2VkaXRvcnMvZmNrZWRpdG9yL0Zja2VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5lZGl0b3JzLmZja2VkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuTW9kaWZpYWJsZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5saW5raW5nLkxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5MaW5rUmV3cml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubGlua2luZy5PdXRnb2luZ0xpbmtSZXdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Eb2N1bWVudFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UueG1sLlVzZWNhc2VFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuV29ya2Zsb3dVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzLlVzZWNhc2VXb3JrZmxvd0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuVmFsaWRhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MudGlkeS5UaWR5OwotCi0vKioKLSAqIEZja2VkaXRvciBVc2VjYXNlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZja2VkaXRvciBleHRlbmRzIERvY3VtZW50VXNlY2FzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSURZX0NPTkZJRyA9ICJ0aWR5Q29uZmlnIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX0NMRUFOX0ZPUk1BVCA9ICJ4c2x0LWNsZWFuIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZ2V0Tm9kZXNUb0xvY2soKQotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10gb2JqZWN0cyA9IHsgZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpIH07Ci0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLmNvbnRleHQpOwotICAgICAgICBTdHJpbmcgcmVxdWVzdHVyaSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICBzZXRQYXJhbWV0ZXIoInJlcXVlc3R1cmkiLCByZXF1ZXN0dXJpKTsKLSAgICAgICAgVVJMSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBVUkxJbmZvcm1hdGlvbihnZXRTb3VyY2VVUkwoKSk7Ci0gICAgICAgIFN0cmluZyBwdWJJZCA9IGluZm8uZ2V0UHVibGljYXRpb25JZCgpOwotICAgICAgICBMaW5rUmV3cml0ZXIgcmV3cml0ZXIgPSBuZXcgT3V0Z29pbmdMaW5rUmV3cml0ZXIodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZVVSTCgpLCByZXF1ZXN0LmlzU2VjdXJlKCksIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBzZXRQYXJhbWV0ZXIoInByb3h5VXJsIixyZXdyaXRlci5yZXdyaXRlKCIvIiArIHB1YklkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0NoZWNrUHJlY29uZGl0aW9ucygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLQotICAgICAgICBVc2VjYXNlV29ya2Zsb3dIZWxwZXIuY2hlY2tXb3JrZmxvdyh0aGlzLm1hbmFnZXIsIHRoaXMsIGdldEV2ZW50KCksIGdldFNvdXJjZURvY3VtZW50KCksCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0KLSAgICAgICAgLy8gR2V0IG5hbWVzcGFjZXMKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZXMgPSByZW1vdmVSZWR1bmRhbnROYW1lc3BhY2VzKGdldFBhcmFtZXRlckFzU3RyaW5nKCJuYW1lc3BhY2VzIikpOwotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcobmFtZXNwYWNlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZ2dyZWdhdGUgY29udGVudAotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QodGhpcy5jb250ZXh0KTsKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOwotICAgICAgICBTdHJpbmcgY29udGVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCI/PlxuIgotICAgICAgICAgICAgICAgICsgYWRkTmFtZXNwYWNlcyhuYW1lc3BhY2VzLCBnZXRQYXJhbWV0ZXJBc1N0cmluZygiY29udGVudCIpKTsKLSAgICAgICAgc2F2ZURvY3VtZW50KGVuY29kaW5nLCBjb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50IHRvIHRoZSBkb2N1bWVudCBzb3VyY2UuIEFmdGVyIHNhdmluZywgdGhlIFhNTCBpcwotICAgICAqIHZhbGlkYXRlZC4gSWYgdmFsaWRhdGlvbiBlcnJvcnMgb2NjdXIsIHRoZSB1c2VjYXNlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZAotICAgICAqIGJhY2ssIHNvIHRoZSBjaGFuZ2VzIGFyZSBub3QgcGVyc2lzdGVudC4gSWYgdGhlIHZhbGlkYXRpb24gc3VjY2VlZGVkLCB0aGUKLSAgICAgKiB3b3JrZmxvdyBldmVudCBpcyBpbnZva2VkLgotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2RpbmcgdG8gdXNlLgotICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHNhdmUuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVEb2N1bWVudChTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBTb3VyY2UgaW5kZXhTb3VyY2UgPSBudWxsOwotICAgICAgICBTb3VyY2UgdGlkeVNvdXJjZSA9IG51bGw7Ci0gICAgICAgIE1vZGlmaWFibGVTb3VyY2UgeHNsdFNvdXJjZSA9IG51bGw7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNhdmVYTUxGaWxlKGVuY29kaW5nLCBjb250ZW50LCBnZXRTb3VyY2VEb2N1bWVudCgpLmdldE91dHB1dFN0cmVhbSgpKTsKLQotICAgICAgICAgICAgRG9jdW1lbnQgeG1sRG9jID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gU2V0dXAgYW4gaW5zdGFuY2Ugb2YgVGlkeS4KLSAgICAgICAgICAgIFRpZHkgdGlkeSA9IG5ldyBUaWR5KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB0aWR5UHJvcHMgPSB0aGlzLmdldFBhcmFtZXRlckFzU3RyaW5nKFRJRFlfQ09ORklHLCBudWxsKTsKLSAgICAgICAgICAgIGlmICh0aWR5UHJvcHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRpZHlTb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHRpZHlQcm9wcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkxvYWRpbmcgY29uZmlndXJhdGlvbiBmcm9tICIgKyB0aWR5U291cmNlLmdldFVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKHRpZHlTb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpZHkuc2V0WEhUTUwodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGlkeS5zZXRDb25maWd1cmF0aW9uRnJvbVByb3BzKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNldCBKdGlkeSB3YXJuaW5ncyBvbi1vZmYKLSAgICAgICAgICAgICAgICB0aWR5LnNldFNob3dXYXJuaW5ncyhnZXRMb2dnZXIoKS5pc1dhcm5FbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIC8vIFNldCBKdGlkeSBmaW5hbCByZXN1bHQgc3VtbWFyeSBvbi1vZmYKLSAgICAgICAgICAgICAgICB0aWR5LnNldFF1aWV0KCFnZXRMb2dnZXIoKS5pc0luZm9FbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIC8vIFNldCBKdGlkeSBpbmZvcyB0byBhIFN0cmluZyAod2lsbCBiZSBsb2dnZWQpIGluc3RlYWQgb2YKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBlcnJvcldyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOwotICAgICAgICAgICAgICAgIHRpZHkuc2V0RXJyb3V0KGVycm9yV3JpdGVyKTsKLQotICAgICAgICAgICAgICAgIHhtbERvYyA9IHRpZHkucGFyc2VET00oZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRJbnB1dFN0cmVhbSgpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBKdGlkeSBkb2Vzbid0IHdhcm4gb3Igc3RyaXAgZHVwbGljYXRlIGF0dHJpYnV0ZXMgaW4KLSAgICAgICAgICAgICAgICAvLyBzYW1lCi0gICAgICAgICAgICAgICAgLy8gdGFnOyBzdHJpcHBpbmcuCi0gICAgICAgICAgICAgICAgWE1MVXRpbHMuc3RyaXBEdXBsaWNhdGVBdHRyaWJ1dGVzKHhtbERvYywgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgb3V0cHV0ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIFN0cmVhbVJlc3VsdCBzdHJSZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWMgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0ID0gdGZhYy5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgICAgICAgICB0LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIGVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgdC5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgICAgICAgICAgICAgICB0LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIHQuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsKLSAgICAgICAgICAgICAgICAgICAgdC50cmFuc2Zvcm0obmV3IERPTVNvdXJjZSh4bWxEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpLCBzdHJSZXN1bHQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzdHJSZXN1bHQuZ2V0V3JpdGVyKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNhdmVYTUxGaWxlKGVuY29kaW5nLCBjb250ZW50LCBnZXRTb3VyY2VEb2N1bWVudCgpLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgeG1sRG9jID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KGdldFNvdXJjZURvY3VtZW50KCkuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJlcnJvci1kb2N1bWVudC1mb3JtIiwgbmV3IFN0cmluZ1tdIHsgZS5nZXRNZXNzYWdlKCkgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLQotICAgICAgICAgICAgLy8gVHJ5IHRvIGNsZWFuIHRoZSB4bWwgdXNpbmcgeHNsdAotICAgICAgICAgICAgUmVzb3VyY2VUeXBlIHJlc1R5cGUgPSBnZXRTb3VyY2VEb2N1bWVudCgpLmdldFJlc291cmNlVHlwZSgpOwotICAgICAgICAgICAgU3RyaW5nW10gZm9ybWF0cyA9IHJlc1R5cGUuZ2V0Rm9ybWF0cygpOwotICAgICAgICAgICAgaWYgKEFycmF5cy5hc0xpc3QoZm9ybWF0cykuY29udGFpbnMoWFNMVF9DTEVBTl9GT1JNQVQpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIG91dHB1dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBTdHJlYW1SZXN1bHQgc3RyUmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXRwdXQpOwotICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZmFjID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgeHNsdFNvdXJjZSA9IChNb2RpZmlhYmxlU291cmNlKSByZXNvbHZlci5yZXNvbHZlVVJJKHJlc1R5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rm9ybWF0VVJJKFhTTFRfQ0xFQU5fRk9STUFUKSk7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHQgPSB0ZmFjLm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoeHNsdFNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHQuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZW5jb2RpbmcpOwotICAgICAgICAgICAgICAgICAgICB0LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIHQuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgdC5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiNCIpOwotICAgICAgICAgICAgICAgICAgICB4bWxEb2MgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdC50cmFuc2Zvcm0obmV3IERPTVNvdXJjZSh4bWxEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpLCBzdHJSZXN1bHQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzdHJSZXN1bHQuZ2V0V3JpdGVyKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNhdmVYTUxGaWxlKGVuY29kaW5nLCBjb250ZW50LCBnZXRTb3VyY2VEb2N1bWVudCgpLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgVVJMcyBiYWNrIHRvIFVVSURzLiBjb252ZXJ0KCkgZG9lcyBhIHNhdmUKLSAgICAgICAgICAgIExpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IExpbmtDb252ZXJ0ZXIodGhpcy5tYW5hZ2VyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICBjb252ZXJ0ZXIuY29udmVydFVybHNUb1V1aWRzKGdldFNvdXJjZURvY3VtZW50KCksZmFsc2UpOwotCi0gICAgICAgICAgICB4bWxEb2MgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRJbnB1dFN0cmVhbSgpKTsKLQotICAgICAgICAgICAgaWYgKHhtbERvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgU2NoZW1hIHNjaGVtYSA9IHJlc291cmNlVHlwZS5nZXRTY2hlbWEoKTsKLQotICAgICAgICAgICAgICAgIFZhbGlkYXRpb25VdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAudmFsaWRhdGUodGhpcy5tYW5hZ2VyLCB4bWxEb2MsIHNjaGVtYSwgbmV3IFVzZWNhc2VFcnJvckhhbmRsZXIodGhpcykpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd1V0aWwuaW52b2tlKHRoaXMubWFuYWdlciwgZ2V0U2Vzc2lvbigpLCBnZXRMb2dnZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VEb2N1bWVudCgpLCBnZXRFdmVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4U291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShpbmRleFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aWR5U291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZSh0aWR5U291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHhzbHRTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHhzbHRTb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBYTUwgZmlsZQotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2RpbmcKLSAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudAotICAgICAqIEBwYXJhbSBvdXQgVGhlIHN0cmVhbSB0byB3cml0ZSB0bwotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBmaWxlIHdhcyBub3QgZm91bmQKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgdGhlIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzYXZlWE1MRmlsZShTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBjb250ZW50LCBPdXRwdXRTdHJlYW0gb3V0KQotICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIGVuY29kaW5nKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZShjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJGaWxlIG5vdCBmb3VuZCAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiRW5jb2Rpbmcgbm90IHN1cHBvcnRlZCAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIklPIGVycm9yICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gY2xvc2UgYWxsIHN0cmVhbXMKLSAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSByZWR1bmRhbnQgbmFtZXNwYWNlcwotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VzIFRoZSBuYW1lc3BhY2VzIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gVGhlIG5hbWVzcGFjZSBzdHJpbmcgd2l0aG91dCB0aGUgcmVtb3ZlZCBuYW1lc3BhY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlUmVkdW5kYW50TmFtZXNwYWNlcyhTdHJpbmcgbmFtZXNwYWNlcykgewotICAgICAgICBTdHJpbmdbXSBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzLnNwbGl0KCIgIik7Ci0KLSAgICAgICAgU3RyaW5nIG5zID0gIiI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobnMuaW5kZXhPZihuYW1lc3BhY2VbaV0pIDwgMCkgewotICAgICAgICAgICAgICAgIG5zID0gbnMgKyAiICIgKyBuYW1lc3BhY2VbaV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJSZWR1bmRhbnQgbmFtZXNwYWNlOiAiICsgbmFtZXNwYWNlW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBuYW1lc3BhY2VzCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIG5hbWVzcGFjZXMgdG8gYWRkCi0gICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gYWRkIHRoZW0gdG8KLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IHdpdGggdGhlIGFkZGVkIG5hbWVzcGFjZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBhZGROYW1lc3BhY2VzKFN0cmluZyBuYW1lc3BhY2VzLCBTdHJpbmcgY29udGVudCkgewotICAgICAgICBpbnQgaSA9IGNvbnRlbnQuaW5kZXhPZigiPiIpOwotICAgICAgICByZXR1cm4gY29udGVudC5zdWJzdHJpbmcoMCwgaSkgKyAiICIgKyBuYW1lc3BhY2VzICsgY29udGVudC5zdWJzdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuICJlZGl0IjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9tZW51cy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL21lbnVzLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTVlNjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL21lbnVzLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG1lbnVzLnhtYXAgMTc4NzM4IDIwMDUtMDUtMjcgMDM6NDI6MDlaIGdyZWdvciAkIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAJCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioqIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJzZXJ2ZXJwYWdlcyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvZmNrZWRpdG9yL2NvbmZpZy9tZW51LnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL1VOUEFDS19GQ0tFRElUT1JfQVJDSElWRV9IRVJFIGIvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL3Jlc291cmNlcy9VTlBBQ0tfRkNLRURJVE9SX0FSQ0hJVkVfSEVSRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL1VOUEFDS19GQ0tFRElUT1JfQVJDSElWRV9IRVJFCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvamF2YXNjcmlwdC9mY2tjb25maWcuanMgYi90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL2phdmFzY3JpcHQvZmNrY29uZmlnLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGNlZWI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvamF2YXNjcmlwdC9mY2tjb25maWcuanMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi0vKgotICogdG9vbGJhciBmb3IgbGVueWEKLSAqLwotCi1GQ0tDb25maWcuVG9vbGJhclNldHNbIkxlbnlhIl0gPSBbCi0JWydTb3VyY2UnLCdEb2NQcm9wcycsJy0nLCdMZW55YV9zYXZlJywnUHJldmlldycsJy0nLCdUZW1wbGF0ZXMnXSwKLQlbJ0N1dCcsJ0NvcHknLCdQYXN0ZScsJ1Bhc3RlVGV4dCcsJ1Bhc3RlV29yZCcsJy0nLCdQcmludCddLAotCVsnVW5kbycsJ1JlZG8nLCctJywnRmluZCcsJ1JlcGxhY2UnLCctJywnU2VsZWN0QWxsJywnUmVtb3ZlRm9ybWF0J10sCi0JWydCb2xkJywnSXRhbGljJywnVW5kZXJsaW5lJywnU3RyaWtlVGhyb3VnaCcsJy0nLCdTdWJzY3JpcHQnLCdTdXBlcnNjcmlwdCddLAotCVsnT3JkZXJlZExpc3QnLCdVbm9yZGVyZWRMaXN0JywnLScsJ091dGRlbnQnLCdJbmRlbnQnXSwKLQlbJ0p1c3RpZnlMZWZ0JywnSnVzdGlmeUNlbnRlcicsJ0p1c3RpZnlSaWdodCcsJ0p1c3RpZnlGdWxsJ10sCi0JWydMaW5rJywgJ0xlbnlhX2luc2VydExpbmsnLCdVbmxpbmsnLCdBbmNob3InXSwKLQlbJ0ltYWdlJywgJ0xlbnlhX2luc2VydEltYWdlJywnVGFibGUnLCdSdWxlJywnU21pbGV5JywnU3BlY2lhbENoYXInLCdQYWdlQnJlYWsnXSwKLQlbJ0Zvcm0nLCdDaGVja2JveCcsJ1JhZGlvJywnVGV4dEZpZWxkJywnVGV4dGFyZWEnLCdTZWxlY3QnLCdCdXR0b24nLCdJbWFnZUJ1dHRvbicsJ0hpZGRlbkZpZWxkJ10sCi0JJy8nLAotCVsnU3R5bGUnLCdGb250Rm9ybWF0JywnRm9udE5hbWUnLCdGb250U2l6ZSddLAotCVsnVGV4dENvbG9yJywnQkdDb2xvciddLAotCVsnQWJvdXQnXQotICBdOyAgCi0gIAotIC8qCi0gKiBwbHVnaW4gZm9yIHNhdmUgaW4gbGVueWEKLSAqLyAgCi1GQ0tDb25maWcuUGx1Z2lucy5BZGQoICdmY2tfbGVueWFfZ2x1ZScsICdkZSxlbicsICcuLi8uLi9wbHVnaW5zLycgKSA7Ci0KLS8qCi0gKiBkaXNhYmxlIHVwbG9hZHMgc2luY2UgaXQgbmVlZHMgdG8gYmUgZG9uZSBmcm9tIHdpdGhpbiBMZW55YQotICovCi1GQ0tDb25maWcuSW1hZ2VVcGxvYWQgPSBmYWxzZTsKLUZDS0NvbmZpZy5MaW5rVXBsb2FkICA9IGZhbHNlOwotRkNLQ29uZmlnLkZsYXNoVXBsb2FkID0gZmFsc2U7Ci0KLS8qCi0gKiBkaXNhYmxlIHNlcnZlciBicm93c2luZyBzaW5jZSB3ZSBub3cgdXNlIHBsdWdpbnMgZm9yIHRoYXQKLSAqLwotRkNLQ29uZmlnLkltYWdlQnJvd3NlciA9IGZhbHNlOwotRkNLQ29uZmlnLkxpbmtCcm93c2VyID0gZmFsc2U7Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvamF2YXNjcmlwdC9mY2tsb2FkZXIuanMgYi90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL2phdmFzY3JpcHQvZmNrbG9hZGVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZhZWJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvamF2YXNjcmlwdC9mY2tsb2FkZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotZnVuY3Rpb24gZmNrbG9hZGVyKHJlcXVlc3R1cmksIGNvbnRleHRQYXRoKQotewotICB2YXIgb0ZDS2VkaXRvciA9IG5ldyBGQ0tlZGl0b3IoICdjb250ZW50JyApIDsKLSAgb0ZDS2VkaXRvci5CYXNlUGF0aAk9IGNvbnRleHRQYXRoICsgJy9tb2R1bGVzL2Zja2VkaXRvci9mY2tlZGl0b3IvJyA7Ci0gIG9GQ0tlZGl0b3IuV2lkdGg9IjgwMCI7Ci0gIG9GQ0tlZGl0b3IuSGVpZ2h0PSI3MDAiOwotICBvRkNLZWRpdG9yLkNvbmZpZ1sgIkZ1bGxQYWdlIiBdID0gdHJ1ZSA7Ci0gIG9GQ0tlZGl0b3IuQ29uZmlnWyAiUHJvY2Vzc0hUTUxFbnRpdGllcyIgXSA9IHRydWUgOwotICBvRkNLZWRpdG9yLkNvbmZpZ1sgIlByb2Nlc3NOdW1lcmljRW50aXRpZXMiIF0gPSB0cnVlIDsKLSAgb0ZDS2VkaXRvci5Db25maWdbIkN1c3RvbUNvbmZpZ3VyYXRpb25zUGF0aCJdID0gY29udGV4dFBhdGggKyAiL21vZHVsZXMvZmNrZWRpdG9yL2phdmFzY3JpcHQvZmNrY29uZmlnLmpzIiAgOwotICBvRkNLZWRpdG9yLlRvb2xiYXJTZXQgPSAnTGVueWEnIDsKLS8vIHRoZSBjdXJyZW50IEFQSSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYW55bW9yZS4gdGhlcmUgaXMgYSBwbHVnaW4gZm9yIHRoYXQgam9iIG5vdy4KLS8vIHdpdGggYW4gZXh0cmEgaHRtbCBwYWdlLCB0aGlzIGZ1bmN0aW9uIGNvdWxkIHByb2JhYmx5IGJlIHJlc3RvcmVkIGVhc2lseSwgd2hpY2ggd291bGQgYmUKLS8vIG5pY2UgYmVjYXVzZSBpdCBwbHVncyBpbnRvIHRoZSByYXRoZXIgY29tZm9ydGFibGUgaW1hZ2UgYW5kIGxpbmsgZGlhbG9ncyBvZiBGQ0suLi4KLS8vICBvRkNLZWRpdG9yLkNvbmZpZ1sgIkltYWdlQnJvd3NlclVSTCIgXSA9IHJlcXVlc3R1cmkgKyc/bGVueWEudXNlY2FzZT1lZGl0b3JzLmluc2VydEltYWdlJyA7Ci0vLyAgb0ZDS2VkaXRvci5Db25maWdbICJMaW5rQnJvd3NlclVSTCIgXSA9IHJlcXVlc3R1cmkgKyc/bGVueWEudXNlY2FzZT1lZGl0b3JzLmluc2VydExpbmsnIDsKLSAgb0ZDS2VkaXRvci5SZXBsYWNlVGV4dGFyZWEoKSA7Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL3BsdWdpbnMvZmNrX2xlbnlhX2dsdWUvZmNrcGx1Z2luLmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL3Jlc291cmNlcy9wbHVnaW5zL2Zja19sZW55YV9nbHVlL2Zja3BsdWdpbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2ZWNjZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL3BsdWdpbnMvZmNrX2xlbnlhX2dsdWUvZmNrcGx1Z2luLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0KLS8qKgotICAqIGltcGxlbWVudHMgYSAic2F2ZSIgYnV0dG9uIHRoYXQgd29ya3Mgd2l0aCBMZW55YQotICAqCi0gICogQWxsIGl0IGRvZXMgaXMgdHJpZ2dlciBhIHN1Ym1pdCBldmVudCwgYW5kIHRoZW4gdGhlIG5vcm1hbCAKLSAgKiB1c2VjYXNlIGhhbmRsZXIgdGFrZXMgb3ZlciwgYXMgaWYgdGhlIHVzZXIgaGFkIGNsaWNrZWQgCi0gICogdGhlIFhIVE1MIHN1Ym1pdCBidXR0b24uCi0gICovCi1mdW5jdGlvbiBMZW55YVNhdmVDb21tYW5kKCkgeyAgdGhpcy5OYW1lID0gJ0xlbnlhX3NhdmUnOyB9Ci0KLS8qKgotICAqIGFuIEZDS2VkaXRvciBjYWxsYmFjayB0aGF0IGlzIHJ1biB3aGVuIHRoZSBjb21tYW5kIGlzIGludm9rZWQKLSAgKi8KLUxlbnlhU2F2ZUNvbW1hbmQucHJvdG90eXBlLkV4ZWN1dGUgPSBmdW5jdGlvbigpIHsKLSAgdmFyIG9Gb3JtID0gRkNLLkxpbmtlZEZpZWxkLmZvcm0gOwotICBvRm9ybS5zdWJtaXQuY2xpY2soKQotfQotLyoqCi0gICogYW4gRkNLZWRpdG9yIGNhbGxiYWNrIHRoYXQgdGFrZXMgY2FyZSBvZiBidXR0b24gc3RhdGUKLSAgKi8gCi1MZW55YVNhdmVDb21tYW5kLnByb3RvdHlwZS5HZXRTdGF0ZSA9IGZ1bmN0aW9uKCkgeyAKLSAgcmV0dXJuIEZDS19UUklTVEFURV9PRkY7Ci19Ci0KLQotLyoqCi0gICogaW1wbGVtZW50cyBhbiAiaW5zZXJ0IGxpbmsiIGJ1dHRvbiB0aGF0IHdvcmtzIHdpdGggTGVueWEKLSAgKgotICAqIEl0IHdpbGwgb3BlbiB0aGUgZWRpdG9ycy5pbnNlcnRMaW5rIHVzZWNhc2UgaW4gYSBuZXcgd2luZG93LgotICAqLwotZnVuY3Rpb24gTGVueWFJbnNlcnRMaW5rQ29tbWFuZCgpIHsgdGhpcy5OYW1lID0gJ0xlbnlhX2luc2VydExpbmsnOyB9Ci0KLS8qKgotICAqIGFuIEZDS2VkaXRvciBjYWxsYmFjayB0aGF0IGlzIHJ1biB3aGVuIHRoZSBjb21tYW5kIGlzIGludm9rZWQKLSAgKi8KLUxlbnlhSW5zZXJ0TGlua0NvbW1hbmQucHJvdG90eXBlLkV4ZWN1dGUgPSBmdW5jdGlvbigpIHsKLSAgLy9hbGVydCgiTGVueWFfaW5zZXJ0TGluayBleGVjdXRlZC4iKTsKLSAgdmFyIHdpbmRvd05hbWUgPSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2VuZXJhdGVVbmlxdWVXaW5kb3dOYW1lKCk7Ci0gIHZhciBzZWxlY3Rpb24gPSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2V0U2VsZWN0ZWRUZXh0KEZDSy5FZGl0b3JXaW5kb3cpOwotICB1c2VjYXNlTWFwW3dpbmRvd05hbWVdID0gb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLlVTRUNBU0VfSU5TRVJUTElOSzsKLSAgb2JqZWN0RGF0YVt3aW5kb3dOYW1lXSA9IG5ldyBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuT2JqZWN0RGF0YSh7Ci0gICAgdXJsICAgOiAiIiwKLSAgICB0aXRsZSA6ICIiLAotICAgIHRleHQgIDogc2VsZWN0aW9uCi0gIH0pOwotICBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMub3BlblVzZWNhc2VXaW5kb3coCi0gICAgdXNlY2FzZU1hcFt3aW5kb3dOYW1lXSwKLSAgICB3aW5kb3dOYW1lCi0gICk7Ci19Ci0KLS8qKgotICAqIGFuIEZDS2VkaXRvciBjYWxsYmFjayB0aGF0IHRha2VzIGNhcmUgb2YgYnV0dG9uIHN0YXRlCi0gICovIAotTGVueWFJbnNlcnRMaW5rQ29tbWFuZC5wcm90b3R5cGUuR2V0U3RhdGUgPSBmdW5jdGlvbigpIHsgCi0gIHJldHVybiBGQ0tfVFJJU1RBVEVfT0ZGOyAKLX0KLQotCi0vKioKLSAgKiBpbXBsZW1lbnRzIGFuICJpbnNlcnQgaW1hZ2UiIGJ1dHRvbiB0aGF0IHdvcmtzIHdpdGggTGVueWEKLSAgKgotICAqIEl0IHdpbGwgb3BlbiB0aGUgZWRpdG9ycy5pbnNlcnRJbWFnZSB1c2VjYXNlIGluIGEgbmV3IHdpbmRvdy4KLSAgKi8KLWZ1bmN0aW9uIExlbnlhSW5zZXJ0SW1hZ2VDb21tYW5kKCkgeyB0aGlzLk5hbWUgPSAnTGVueWFfaW5zZXJ0TGluayc7IH0KLQotLyoqCi0gICogYW4gRkNLZWRpdG9yIGNhbGxiYWNrIHRoYXQgaXMgcnVuIHdoZW4gdGhlIGNvbW1hbmQgaXMgaW52b2tlZAotICAqLwotTGVueWFJbnNlcnRJbWFnZUNvbW1hbmQucHJvdG90eXBlLkV4ZWN1dGUgPSBmdW5jdGlvbigpIHsKLSAgLy9hbGVydCgiTGVueWFfaW5zZXJ0SW1hZ2UgZXhlY3V0ZWQuIik7Ci0gIHZhciB3aW5kb3dOYW1lID0gb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdlbmVyYXRlVW5pcXVlV2luZG93TmFtZSgpOwotICB2YXIgc2VsZWN0aW9uID0gb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdldFNlbGVjdGVkVGV4dChGQ0suRWRpdG9yV2luZG93KTsKLSAgdXNlY2FzZU1hcFt3aW5kb3dOYW1lXSA9IG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5VU0VDQVNFX0lOU0VSVElNQUdFOwotICBvYmplY3REYXRhW3dpbmRvd05hbWVdID0gbmV3IG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5PYmplY3REYXRhKHsKLSAgICB1cmwgICA6ICIiLAotICAgIHRpdGxlIDogIiIsCi0gICAgdGV4dCAgOiBzZWxlY3Rpb24sCi0gICAgaGVpZ2h0OiAiIiwKLSAgICB3aWR0aCA6ICIiCi0gIH0pOwotICBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMub3BlblVzZWNhc2VXaW5kb3coCi0gICAgdXNlY2FzZU1hcFt3aW5kb3dOYW1lXSwKLSAgICB3aW5kb3dOYW1lCi0gICk7Ci19Ci0KLS8qKgotICAqIGFuIEZDS2VkaXRvciBjYWxsYmFjayB0aGF0IHRha2VzIGNhcmUgb2YgYnV0dG9uIHN0YXRlCi0gICovIAotTGVueWFJbnNlcnRJbWFnZUNvbW1hbmQucHJvdG90eXBlLkdldFN0YXRlID0gZnVuY3Rpb24oKSB7IAotICByZXR1cm4gRkNLX1RSSVNUQVRFX09GRjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKiogbWFpbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCi0KLS8qKgotICAqIEZDS2VkaXRvciB1c2VzIGZyYW1lcyBoZWF2aWx5LCB3aGljaCBtZWFucyB0aGF0IG91ciBoZWxwZXIgbGlicmFyeQotICAqIHdpbGwgbm90IGJlIGluIHRoZSBjdXJyZW50IHNjb3BlLiBTbyB3ZSBkZWZpbmUgaXQgdG8gcG9pbnQgdG8gdGhlCi0gICogInRvcCIgd2luZG93LCB3aGljaCBob3BlZnVsbHkgaGFzIHRoZSBsaWJyYXJ5IGluY2x1ZGVkLgotICAqLwotdmFyIG9yZzsKLWlmICghb3JnKSB7Ci0gIG9yZyA9IHdpbmRvdy50b3Aub3JnOwotfSBlbHNlIGlmICghb3JnLmFwYWNoZSkgewotICBvcmcuYXBhY2hlID0gd2luZG93LnRvcC5vcmcuYXBhY2hlOwotfSBlbHNlIGlmICghb3JnLmFwYWNoZS5sZW55YSkgewotICBvcmcuYXBhY2hlLmxlbnlhID0gd2luZG93LnRvcC5vcmcuYXBhY2hlLmxlbnlhOwotfSBlbHNlIGlmICghb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzKSB7Ci0gIG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycyA9IHdpbmRvdy50b3Aub3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzOwotfQotCi0vKioKLSAgKiB0byBzdG9yZSB1c2VjYXNlIGRhdGEgcGVyIHdpbmRvdwotICAqLwotdmFyIG9iamVjdERhdGEgPSBuZXcgQXJyYXkoKTsKLQotLyoqCi0gICogdG8gbWFwIHVzZWNhc2UgbmFtZXMgdG8gd2luZG93IG5hbWVzCi0gICovCi12YXIgdXNlY2FzZU1hcCA9IG5ldyBBcnJheSgpOwotCi0KLS8qIEZDS0NvbW1hbmRzLlJlZ2lzdGVyQ29tbWFuZChjb21tYW5kTmFtZSwgY29tbWFuZCkKLSAgICAgICBjb21tYW5kTmFtZSAtIENvbW1hbmQgbmFtZSwgcmVmZXJlbmNlZCBieSB0aGUgVG9vbGJhciwgZXRjLi4uCi0gICAgICAgY29tbWFuZCAtIENvbW1hbmQgb2JqZWN0IChtdXN0IHByb3ZpZGUgYW4gRXhlY3V0ZSgpIGZ1bmN0aW9uKS4KLSovCi0KLS8vIFJlZ2lzdGVyIExlbnlhLXNwZWNpZmljIGNvbW1hbmRzCi0KLUZDS0NvbW1hbmRzLlJlZ2lzdGVyQ29tbWFuZCgnTGVueWFfc2F2ZScsIG5ldyBMZW55YVNhdmVDb21tYW5kKCkpOwotRkNLQ29tbWFuZHMuUmVnaXN0ZXJDb21tYW5kKCdMZW55YV9pbnNlcnRMaW5rJywgbmV3IExlbnlhSW5zZXJ0TGlua0NvbW1hbmQoKSk7Ci1GQ0tDb21tYW5kcy5SZWdpc3RlckNvbW1hbmQoJ0xlbnlhX2luc2VydEltYWdlJywgbmV3IExlbnlhSW5zZXJ0SW1hZ2VDb21tYW5kKCkpOwotCi0KLQotLy8gQ3JlYXRlIExlbnlhLXNwZWNpZmljIHRvb2xiYXIgYnV0dG9uczoKLSAKLXZhciBvTGVueWFfc2F2ZUl0ZW0gPSBuZXcgRkNLVG9vbGJhckJ1dHRvbignTGVueWFfc2F2ZScsIEZDS0xhbmdbJ0RsZ0xlbnlhX3NhdmVUaXRsZSddKTsKLW9MZW55YV9zYXZlSXRlbS5JY29uUGF0aD0gW0ZDS0NvbmZpZy5Ta2luUGF0aCArICdmY2tfc3RyaXAuZ2lmJywgMTYsIDNdOyAvLyB1c2UgRkNLRWRpdG9yJ3MgaWNvbnMKLUZDS1Rvb2xiYXJJdGVtcy5SZWdpc3Rlckl0ZW0oICdMZW55YV9zYXZlJywgb0xlbnlhX3NhdmVJdGVtICkgOwotCi12YXIgb0xlbnlhX2luc2VydExpbmtJdGVtID0gbmV3IEZDS1Rvb2xiYXJCdXR0b24oJ0xlbnlhX2luc2VydExpbmsnLCBGQ0tMYW5nWydEbGdMZW55YV9pbnNlcnRMaW5rVGl0bGUnXSk7Ci1vTGVueWFfaW5zZXJ0TGlua0l0ZW0uSWNvblBhdGggPSBGQ0tQbHVnaW5zLkl0ZW1zWydmY2tfbGVueWFfZ2x1ZSddLlBhdGggKyAnaW5zZXJ0TGluay5naWYnIDsKLUZDS1Rvb2xiYXJJdGVtcy5SZWdpc3Rlckl0ZW0oICdMZW55YV9pbnNlcnRMaW5rJywgb0xlbnlhX2luc2VydExpbmtJdGVtICkgOwotCi12YXIgb0xlbnlhX2luc2VydEltYWdlSXRlbSA9IG5ldyBGQ0tUb29sYmFyQnV0dG9uKCAnTGVueWFfaW5zZXJ0SW1hZ2UnLCBGQ0tMYW5nWydEbGdMZW55YV9pbnNlcnRJbWFnZVRpdGxlJ10pOwotb0xlbnlhX2luc2VydEltYWdlSXRlbS5JY29uUGF0aCA9IEZDS1BsdWdpbnMuSXRlbXNbJ2Zja19sZW55YV9nbHVlJ10uUGF0aCArICdpbnNlcnRJbWFnZS5naWYnOwotRkNLVG9vbGJhckl0ZW1zLlJlZ2lzdGVySXRlbSgnTGVueWFfaW5zZXJ0SW1hZ2UnLCBvTGVueWFfaW5zZXJ0SW1hZ2VJdGVtKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKiogTGVueWEgZWRpdG9yIHVzZWNhc2UgY2FsbGJhY2tzICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLnNldE9iamVjdERhdGEgPSBmdW5jdGlvbihvYmplY3REYXRhLCB3aW5kb3dOYW1lKSB7Ci0gIHZhciB1c2VjYXNlID0gdXNlY2FzZU1hcFt3aW5kb3dOYW1lXTsKLSAgdmFyIHNuaXBwZXQgPSBvcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2VuZXJhdGVDb250ZW50U25pcHBldCh1c2VjYXNlLCBvYmplY3REYXRhKTsKLSAgdmFyIHNlbGVjdGlvbiA9IG9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5nZXRTZWxlY3RlZFRleHQoRkNLLkVkaXRvcldpbmRvdyk7Ci0gIAotICBGQ0suSW5zZXJ0SHRtbCgKLSAgICBzbmlwcGV0LmJlZm9yZVNlbGVjdGlvbiAKLSAgICArIChzbmlwcGV0LnJlcGxhY2VTZWxlY3Rpb24gPyBzbmlwcGV0LnJlcGxhY2VTZWxlY3Rpb24gOiBzZWxlY3Rpb24pCi0gICAgKyBzbmlwcGV0LmFmdGVyU2VsZWN0aW9uCi0gICk7Ci0KLSAgdXNlY2FzZU1hcFt3aW5kb3dOYW1lXSA9IHVuZGVmaW5lZDsgLy8gd2UncmUgZG9uZSEKLSAgb2JqZWN0RGF0YVt3aW5kb3dOYW1lXSA9IHVuZGVmaW5lZDsgLy8gd2UncmUgZG9uZSEKLX0KLQotb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmdldE9iamVjdERhdGEgPSBmdW5jdGlvbih3aW5kb3dOYW1lLCB1c2VjYXNlKSB7Ci0gIHJldHVybiBvYmplY3REYXRhW3dpbmRvd05hbWVdOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL3Jlc291cmNlcy9wbHVnaW5zL2Zja19sZW55YV9nbHVlL2luc2VydEltYWdlLmdpZiBiL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvcGx1Z2lucy9mY2tfbGVueWFfZ2x1ZS9pbnNlcnRJbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzA3OGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL3Jlc291cmNlcy9wbHVnaW5zL2Zja19sZW55YV9nbHVlL2luc2VydEltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvcGx1Z2lucy9mY2tfbGVueWFfZ2x1ZS9pbnNlcnRMaW5rLmdpZiBiL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvcGx1Z2lucy9mY2tfbGVueWFfZ2x1ZS9pbnNlcnRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3MDc4Yy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL3BsdWdpbnMvZmNrX2xlbnlhX2dsdWUvaW5zZXJ0TGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL3BsdWdpbnMvZmNrX2xlbnlhX2dsdWUvbGFuZy9kZS5qcyBiL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvcGx1Z2lucy9mY2tfbGVueWFfZ2x1ZS9sYW5nL2RlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmUyYzVhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9yZXNvdXJjZXMvcGx1Z2lucy9mY2tfbGVueWFfZ2x1ZS9sYW5nL2RlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0qIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0qIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0qICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0qIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLUZDS0xhbmdbJ0RsZ0xlbnlhX3NhdmVUaXRsZSddID0gJ0xlbnlhLURva3VtZW50IHNwZWljaGVybic7IAotRkNLTGFuZ1snRGxnTGVueWFfaW5zZXJ0TGlua1RpdGxlJ10gPSAnTGVueWEtTGluayBlaW5mw7xnZW4nOyAKLUZDS0xhbmdbJ0RsZ0xlbnlhX2luc2VydEltYWdlVGl0bGUnXSA9ICdMZW55YS1CaWxkIGVpbmbDvGdlbic7IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL3Jlc291cmNlcy9wbHVnaW5zL2Zja19sZW55YV9nbHVlL2xhbmcvZW4uanMgYi90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL3BsdWdpbnMvZmNrX2xlbnlhX2dsdWUvbGFuZy9lbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkNDNjMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvcmVzb3VyY2VzL3BsdWdpbnMvZmNrX2xlbnlhX2dsdWUvbGFuZy9lbi5qcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1GQ0tMYW5nWydEbGdMZW55YV9zYXZlVGl0bGUnXSA9ICdTYXZlIExlbnlhIERvY3VtZW50JzsgCi1GQ0tMYW5nWydEbGdMZW55YV9pbnNlcnRMaW5rVGl0bGUnXSA9ICdJbnNlcnQgTGVueWEgbGluayc7IAotRkNLTGFuZ1snRGxnTGVueWFfaW5zZXJ0SW1hZ2VUaXRsZSddID0gJ0luc2VydCBMZW55YSBpbWFnZSc7IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZjZiZTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvZmNrZWRpdG9yL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDxtYXA6cmVzb3VyY2VzPgotICAgICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJzdHlsZS1jbXMtcGFnZSI+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4gICAgICAKLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0ie3JlcXVlc3Q6bG9jYWxlfSIvPgotICAgICAgPC9tYXA6dHJhbnNmb3JtPiAgICAKLSAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3V0aWwvcGFnZTJ4aHRtbC54c2wiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ii8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvbnRleHQ6Ly9sZW55YS94c2x0L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2wiLz4KLSAgICA8L21hcDpyZXNvdXJjZT4KLSAgPC9tYXA6cmVzb3VyY2VzPgotICAKLSAgPG1hcDpjb21wb25lbnRzPgotICAKLSAgICA8bWFwOnNlcmlhbGl6ZXJzIGRlZmF1bHQ9InhodG1sIj4gCi0gICAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0ieG1sLWdldCIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5zZXJpYWxpemF0aW9uLlhNTFNlcmlhbGl6ZXIiIG1pbWUtdHlwZT0idGV4dC94bWwiPgotICAgICAgICA8ZW5jb2Rpbmc+dXRmLTg8L2VuY29kaW5nPgotICAgICAgICA8b21pdC14bWwtZGVjbGFyYXRpb24+eWVzPC9vbWl0LXhtbC1kZWNsYXJhdGlvbj4KLSAgICAgIDwvbWFwOnNlcmlhbGl6ZXI+Ci0gICAgPC9tYXA6c2VyaWFsaXplcnM+Ci0gCi0gIDwvbWFwOmNvbXBvbmVudHM+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgPG1hcDpwaXBlbGluZT4KLQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJmY2tlZGl0b3Iub3BlbiIgPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9Imp4IiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9mY2tlZGl0b3IvdXNlY2FzZXMvZmNrZWRpdG9yLmp4Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdmFsdWU9IntyZXF1ZXN0OmxvY2FsZX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJjaW5jbHVkZSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvY29vbjovL2xlbnlhLXNjcmVlbi54c2wiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icHJveHkiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9zdHJpcF9uYW1lc3BhY2VzLnhzbCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4aHRtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iY29udGVudCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJsZW55YS1kb2N1bWVudDp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSxsYW5nPXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJ1dWlkMnVybCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJscyIgdmFsdWU9ImFic29sdXRlIi8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sLWdldCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci91c2VjYXNlcy9mY2tlZGl0b3IuanggYi90cnVuay9zcmMvbW9kdWxlcy9mY2tlZGl0b3IvdXNlY2FzZXMvZmNrZWRpdG9yLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2NmI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2Zja2VkaXRvci91c2VjYXNlcy9mY2tlZGl0b3IuangKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxuczpjaW5jbHVkZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2luY2x1ZGUvMS4wIgotICA+Ci0gCi0gIDxqeDpzZXQgdmFyPSJwYXRoSW5mbyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRTb3VyY2VVUkwoKX0iLz4KLSAgPGp4OnNldCB2YXI9InN0ZXBzIiB2YWx1ZT0iJHtwYXRoSW5mby5zcGxpdCgnLycpfSIvPgotICA8ang6c2V0IHZhcj0icHViSWQiIHZhbHVlPSIke2phdmEudXRpbC5BcnJheXMuYXNMaXN0KHN0ZXBzKS5nZXQoMSl9Ii8+Ci0gCi0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii8ke3B1YklkfS9tb2R1bGVzL2Zja2VkaXRvci9mY2tlZGl0b3IvZmNrZWRpdG9yLmpzIj4mIzE2MDs8L3NjcmlwdD4KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLyR7cHViSWR9L21vZHVsZXMvZmNrZWRpdG9yL2phdmFzY3JpcHQvZmNrbG9hZGVyLmpzIj4mIzE2MDs8L3NjcmlwdD4KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLyR7cHViSWR9L21vZHVsZXMvZWRpdG9ycy9qYXZhc2NyaXB0L2Rpc2FibGViYWNrc3BhY2UuanMiPiYjMTYwOzwvc2NyaXB0PgotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvJHtwdWJJZH0vbW9kdWxlcy9lZGl0b3JzL2phdmFzY3JpcHQvb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmpzIj4mIzE2MDs8L3NjcmlwdD4gCi0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICBmdW5jdGlvbiBsb2FkZmNrbG9hZGVyKCkgewotICAgICAgZmNrbG9hZGVyKCcke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdyZXF1ZXN0dXJpJyl9JywgJyR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3Byb3h5VXJsJyl9Jyk7Ci0gICAgfQotCi0gICAgaWYodHlwZW9mIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyICE9ICd1bmRlZmluZWQnKSB7Ci0gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsbG9hZGZja2xvYWRlcixmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UgaWYodHlwZW9mIHdpbmRvdy5hdHRhY2hFdmVudCAhPSAndW5kZWZpbmVkJykgewotICAgICAgd2luZG93LmF0dGFjaEV2ZW50KCdvbmxvYWQnLGxvYWRmY2tsb2FkZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHdpbmRvdy5vbmxvYWQgPSBsb2FkZmNrbG9hZGVyKCk7Ci0gICAgfQotICA8L3NjcmlwdD4KLSAgCi0JPHBhZ2U6dGl0bGU+RkNLZWRpdG9yIC0gU2FtcGxlPC9wYWdlOnRpdGxlPgotCi0gICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmhhc0Vycm9ycygpfSI+Ci0gICAgICAgICAgICA8cGFnZTpib2R5PgotICAgICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgICA8L3BhZ2U6Ym9keT4KLSAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgIDxwYWdlOmJvZHk+Ci0JICAKLSAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj5JbmZvcm1hdGlvbjwvZGl2PgotICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPkRvY3VtZW50OjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKS5nZXRJZCgpfSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPldvcmtmbG93IEV2ZW50OjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6c2V0IHZhcj0iZXZlbnQiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS5ldmVudCcpfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHtldmVudC5lcXVhbHMoJycpIHx8IGV2ZW50LmVxdWFscygnbnVsbCcpfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPk5vIHdvcmtmbG93IGV2ZW50IHNwZWNpZmllZDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGp4Om91dCB2YWx1ZT0iJHtldmVudH0iLz48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBuYW1lPSJmY2tlZGl0b3IiIGlkPSJmY2tlZGl0b3IiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4JCQotICAgICAgICAgICAgPGlucHV0IG5hbWU9Im5hbWVzcGFjZXMiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiB4bWxucz0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJnF1b3Q7IiAvPgotCQkJICAgIDxkaXY+Ci0JCQkJICAgIDx0ZXh0YXJlYSBpZD0iY29udGVudCIgbmFtZT0iY29udGVudCIgc3R5bGU9IldJRFRIOiAxMDAlOyBIRUlHSFQ6IDIwMHB4Ij4KLSAgICAgICAgICAgICAgICAgICAgICA8Y2luY2x1ZGU6aW5jbHVkZXhtbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjaW5jbHVkZTpzcmM+Y29jb29uOi8vbW9kdWxlcy9mY2tlZGl0b3IvY29udGVudDwvY2luY2x1ZGU6c3JjPgotICAgICAgICAgICAgICAgICAgICAgIDwvY2luY2x1ZGU6aW5jbHVkZXhtbD4JCQotCQkJCSAgICA8L3RleHRhcmVhPgotCQkJICAgIDwvZGl2PgotCQkJICAgIDxiciAvPgotCQkJICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiIC8+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iY2FuY2VsIiB2YWx1ZT0iQ2FuY2VsIi8+Ci0JCSAgICAgIDwvZm9ybT4KLSAgICAgICAgICAgIAkJCQotCSAgICA8L3BhZ2U6Ym9keT4KLSAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgPC9qeDpjaG9vc2U+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2t1cHUvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWt1cHUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9rdXB1L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1rdXB1Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQ4NDY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2t1cHUvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWt1cHUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMTk5OS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2t1cHUuZWRpdCddIj4NCi0gICAgDQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ia3VwdS5lZGl0IiBsb2dnZXI9ImxlbnlhLnB1YmxpY2F0aW9uIiANCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuSW52b2tlV29ya2Zsb3ciPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9rdXB1L3VzZWNhc2VzL2t1cHUuangiIG1lbnU9ImZhbHNlIiBjcmVhdGVDb250aW51YXRpb249ImZhbHNlIi8+Ci0gICAgICA8dHJhbnNhY3Rpb24gcG9saWN5PSJwZXNzaW1pc3RpYyIvPg0KLSAgICAgIDxldmVudCBpZD0iZWRpdCIvPg0KLSAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iY2hlY2tvdXRSZXN0cmljdGVkVG9TZXNzaW9uIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gICAgDQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2t1cHUvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9rdXB1L2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMzN2M1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2t1cHUvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5rdXB1PC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPkt1cHUgZWRpdG9yPC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj5LdXB1IGVkaXRvcjwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2t1cHUva3VwdS5qcyBiL3RydW5rL3NyYy9tb2R1bGVzL2t1cHUva3VwdS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0MzUxNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9rdXB1L2t1cHUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1pbXBvcnRDbGFzcyhQYWNrYWdlcy5qYXZhLnV0aWwuQXJyYXlMaXN0KTsKLQotLyoqCi0gKiBLdXB1IHVzZWNhc2UgZmxvdy4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotCi0vKioKLSAqIENvbGxlY3RzIGFsbCBsaW5rL3VybCBpbmZvcm1hdGlvbiBmcm9tIGEgcHVibGljYXRpb24ncyBzaXRlcmVlLgotICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIHhtbCBmb3IgdGhlIEt1cHUgKGxpbmspIGxpYnJhcnkgZHJhd2VyLgotICovCi1mdW5jdGlvbiBzaXRldHJlZV9saW5rX2xpYnJhcnkoKSB7Ci0gICAgCi0gICAgdmFyIGZsb3dIZWxwZXIgPSBjb2Nvb24uZ2V0Q29tcG9uZW50KCJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZmxvdy5GbG93SGVscGVyIik7Ci0gICAgdmFyIGRvY3VtZW50SGVscGVyID0gZmxvd0hlbHBlci5nZXREb2N1bWVudEhlbHBlcihjb2Nvb24pOwotICAgIHZhciBwYWdlRW52ZWxvcGUgPSBmbG93SGVscGVyLmdldFBhZ2VFbnZlbG9wZShjb2Nvb24pOwotICAgIHZhciBhcmVhTmFtZSA9IHBhZ2VFbnZlbG9wZS5nZXRBcmVhKCk7Ci0gICAgdmFyIGFyZWEgPSBwYWdlRW52ZWxvcGUuZ2V0UHVibGljYXRpb24oKS5nZXRBcmVhKGFyZWFOYW1lKTsKLSAgICB2YXIgc2l0ZVRyZWUgPSBhcmVhLmdldFNpdGUoKTsKLSAgICB2YXIgYWxsTm9kZXMgPSBzaXRlVHJlZS5wcmVPcmRlcigpOwotICAgIHZhciByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KGFsbE5vZGVzLmxlbmd0aCAtIDEpOwotICAgIHZhciBhZGRlZFJlc291cmNlc0NvdW50ID0gMDsKLSAgICB2YXIgbGFuZ3VhZ2UgPSBwYWdlRW52ZWxvcGUuZ2V0RG9jdW1lbnQoKS5nZXRMYW5ndWFnZSgpOwotICAgIAotICAgIGZvcih2YXIgaT0xOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKGFsbE5vZGVzW2ldLmhhc0xpbmsobGFuZ3VhZ2UpKSB7Ci0gICAgCQl2YXIgbGFuZ3VhZ2VMYWJlbCA9IGFsbE5vZGVzW2ldLmdldExpbmsobGFuZ3VhZ2UpOwotCQkJLyogSWYgdGhlIGN1cnJlbnQgc2l0cmVlIG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRpc3BsYXllZCBkb2N1bWVudCdzIGxhbmd1YWdlCi0JCSAJICogQ29udGludWUgd2l0aCBuZXh0IG5vZGUuIFRoaXMgaXMgYSBxdWljayBmaXggZm9yIGJ1ZyAjMzI4MDguCi0JCSAJICogTmV4dCBzdGVwIHdvdWxkIGJlIHRvIG9mZmVyIGFsbCBsaW5rcyB0byB0aGUgYXZhaWxhYmxlIGxhbmd1YWdlcy4KLQkJIAkgKiBieSByb2t1IAotCQkgCSovCi0JCQotICAgICAgICAJcmVzb3VyY2VzLmFkZChhZGRlZFJlc291cmNlc0NvdW50LCB7Ci0gICAgICAgICAgICAgICAgInVybCIgOiAibGVueWEtZG9jdW1lbnQ6IiArIGFsbE5vZGVzW2ldLmdldFV1aWQoKSwKLSAgICAgICAgICAgICAgICAidGl0bGUiIDogZ2V0VGl0bGUoYWxsTm9kZXNbaV0uZ2V0TGluayhsYW5ndWFnZSkuZ2V0RG9jdW1lbnQoKSksCi0gICAgICAgICAgICAgICAgImxhYmVsIiA6IGxhbmd1YWdlTGFiZWwuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAiaWQiIDogYWxsTm9kZXNbaV0uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICJmdWxsaWQiIDogYWxsTm9kZXNbaV0uZ2V0UGF0aCgpLAotICAgICAgICAgICAgICAgICJsYW5ndWFnZSIgOiBwYWdlRW52ZWxvcGUuZ2V0RG9jdW1lbnQoKS5nZXRMYW5ndWFnZSgpfSk7Ci0gICAgICAgIAlhZGRlZFJlc291cmNlc0NvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY29jb29uLnJlbGVhc2VDb21wb25lbnQoZmxvd0hlbHBlcik7Ci0gICAgY29jb29uLnNlbmRQYWdlKCJzaXRldHJlZV9saW5rX2xpYnJhcnlfdGVtcGxhdGUiLCB7InJlc291cmNlcyIgOiByZXNvdXJjZXN9KTsKLX0KLQotZnVuY3Rpb24gZ2V0VGl0bGUoZG9jKSB7Ci0gICAgdmFyIG1ldGEgPSBkb2MuZ2V0TWV0YURhdGEoImh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIik7Ci0gICAgdmFyIHRpdGxlID0gbWV0YS5nZXRGaXJzdFZhbHVlKCJ0aXRsZSIpOwotICAgIHJldHVybiB0aXRsZTsKLX0KLQotLyoqCi0gKiBDb2xsZWN0cyBpbmZvcyBhYm91dCBhbGwgaW1hZ2UgcmVzb3VyY2VzIGluIGEgcHVibGljYXRpb24uCi0gKi8KLWZ1bmN0aW9uIHB1YmxpY2F0aW9uX2ltYWdlX2xpYnJhcnkoKSB7ICAgICAgICAKLSAgICB2YXIgZmxvd0hlbHBlciA9IGNvY29vbi5nZXRDb21wb25lbnQoIm9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93LkZsb3dIZWxwZXIiKTsKLSAgICB2YXIgcGFnZUVudmVsb3BlID0gZmxvd0hlbHBlci5nZXRQYWdlRW52ZWxvcGUoY29jb29uKTsKLSAgICB2YXIgYXJlYU5hbWUgPSBwYWdlRW52ZWxvcGUuZ2V0QXJlYSgpOwotICAgIHZhciBzaXRlID0gcGFnZUVudmVsb3BlLmdldFB1YmxpY2F0aW9uKCkuZ2V0QXJlYShhcmVhTmFtZSkuZ2V0U2l0ZSgpOwotICAgIHZhciBpbWFnZUluZm9zID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHZhciByb290UGF0aCA9IGNvY29vbi5wYXJhbWV0ZXJzWyJyb290UGF0aCJdOwotICAgIHZhciBhbGxOb2RlcyA9IHNpdGUuZ2V0Tm9kZShyb290UGF0aCkucHJlT3JkZXIoKTsKLSAgICAKLSAgICB2YXIgYmFzZVVybCA9IGNvY29vbi5wYXJhbWV0ZXJzWyJiYXNlVXJsIl07Ci0gICAgCi0gICAgZm9yICh2YXIgaT0wOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAKLSAgICAgICAgaWYgKGFsbE5vZGVzW2ldLmdldFBhdGgoKS5lcXVhbHMocGFnZUVudmVsb3BlLmdldERvY3VtZW50KCkuZ2V0UGF0aCgpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgCi0gICAgICAgIHZhciBsYW5ndWFnZXMgPSBhbGxOb2Rlc1tpXS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgZm9yICh2YXIgbGFuZyA9IDA7IGxhbmcgPCBsYW5ndWFnZXMubGVuZ3RoOyBsYW5nKyspIHsKLSAgICAgICAgICAgIHZhciBkb2MgPSBhbGxOb2Rlc1tpXS5nZXRMaW5rKGxhbmd1YWdlc1tsYW5nXSkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChkb2MuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygicmVzb3VyY2UiKSkgewotICAgICAgICAgICAgCi0JICAgICAgICAgICAgdmFyIHRpdGxlID0gZ2V0VGl0bGUoZG9jKTsKLQkgICAgICAgICAgICB2YXIgdXJsID0gZG9jLmdldENhbm9uaWNhbERvY3VtZW50VVJMKCk7Ci0JICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCB1cmwubGVuZ3RoKCkgLSA0KTsKLQkgICAgICAgICAgICB1cmwgPSB1cmwgKyBkb2MuZ2V0U291cmNlRXh0ZW5zaW9uKCk7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgaW1hZ2VJbmZvcy5hZGQoewotCSAgICAgICAgICAgICAgICAgICAgInByZXZpZXd1cmwiIDogYmFzZVVybCArIHVybCwKLQkgICAgICAgICAgICAgICAgICAgICJ1cmwiIDogYmFzZVVybCArIHVybCwKLQkgICAgICAgICAgICAgICAgICAgICJuYW1lIiA6IGRvYy5nZXROYW1lKCksCi0JICAgICAgICAgICAgICAgICAgICAidGl0bGUiIDogdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAibGVuZ3RoIiA6IGRvYy5nZXRDb250ZW50TGVuZ3RoKCksCi0JICAgICAgICAgICAgICAgICAgICAiaWNvblVybCIgOiBjb2Nvb24ucGFyYW1ldGVyc1siaWNvblVybCJdCi0JICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgIH0KLSAgICBjb2Nvb24ucmVsZWFzZUNvbXBvbmVudChmbG93SGVscGVyKTsKLSAgICBjb2Nvb24uc2VuZFBhZ2UoY29jb29uLnBhcmFtZXRlcnNbInRlbXBsYXRlIl0sIHsiaW1hZ2VJbmZvcyIgOiBpbWFnZUluZm9zfSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9rdXB1L3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2t1cHUvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzcyZTE4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2t1cHUvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAxOTk5LTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHNpdGVtYXAueG1hcCA0MjMxOTggMjAwNi0wNy0xOCAxODo1Mjo0M1ogY2hlc3RudXQgJCAtLT4KLQotPCEtLQotICBLdXB1IHVzZWNhc2Ugc2l0ZW1hcHMuIEludGVncmF0ZXMgdGhlIEt1cHUgZWRpdG9yIChodHRwOi8va3VwdS5vc2NvbS5vcmcvKSBpbnRvIExlbnlhLgotICBNb3N0IG1hdGNoZXJzIHNlcnZlIGFzIGNhbGxiYWNrcyBmb3IgS3VwdSBydW5uaW5nIGluIGEgY2xpZW50J3MgYnJvd3Nlci4KLSAgTWFrZSBzdXJlIHRoYXQgS3VwdSBpcyBpbnN0YWxsZWQgdW5kZXIgbGVueWEvcmVzb3VyY2VzL2t1cHUuCi0gIAotICBNb3N0IG9mIChyZSlzb3VyY2VzIHVzZWQgaW4gZ2VuZXJhdG9ycyBhbmQgdHJhbnNmb21lcnMgb2YgdGhpcyBzaXRlbWFwCi0gIGFyZSBsb2NhdGVkIGluIHRoZSBLdXB1IGRpc3RyaWJ1dGlvbi4KLSAgCi0gIEVuam95IHVzaW5nIEt1cHUuCi0tLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPG1hcDpjb21wb25lbnRzLz4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVzb3VyY2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8bWFwOnJlc291cmNlcz4KLSAgICA8bWFwOnJlc291cmNlIG5hbWU9InN0eWxlLWNtcy1wYWdlIj4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPiAgICAgIAotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm0+ICAgIAotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9wYWdlMnhodG1sLnhzbCI+Ci0gICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRwcmVmaXgiIHZhbHVlPSIiLz4KLSAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2wiLz4KLSAgICA8L21hcDpyZXNvdXJjZT4KLSAgPC9tYXA6cmVzb3VyY2VzPgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmxvdyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8bWFwOmZsb3cgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIDxtYXA6c2NyaXB0IHNyYz0ia3VwdS5qcyIvPgotICAgIDxtYXA6c2NyaXB0IHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvZWRpdC1kb2N1bWVudC5qcyIvPgotICA8L21hcDpmbG93PgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBQaXBlbGluZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+ICAKLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgCi0gICAgPG1hcDpjb21wb25lbnQtY29uZmlndXJhdGlvbnM+Ci0gICAgICA8Z2xvYmFsLXZhcmlhYmxlcz4KLSAgICAgICAgPHJlc291cmNlSWNvblVybD4vbW9kdWxlcy9rdXB1L2t1cHUvYXBhY2hlLWxlbnlhL2xlbnlhL2ltYWdlcy9yaWdodF9hcnJvdy5wbmc8L3Jlc291cmNlSWNvblVybD4KLSAgICAgICAgPGltYWdlQmFzZT4vbW9kdWxlcy9rdXB1L2t1cHUvYXBhY2hlLWxlbnlhL2xlbnlhL2ltYWdlczwvaW1hZ2VCYXNlPgotICAgICAgPC9nbG9iYWwtdmFyaWFibGVzPgotICAgIDwvbWFwOmNvbXBvbmVudC1jb25maWd1cmF0aW9ucz4KLQotCi0gICAgPG1hcDpwaXBlbGluZSBpbnRlcm5hbC1vbmx5PSJ0cnVlIj4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ia3VwdS1zdHJlYW0iPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InN0cmVhbSIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIEZsb3cgY2FsbGJhY2tzIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJzaXRldHJlZV9saW5rX2xpYnJhcnlfdGVtcGxhdGUiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2t1cHUvcmVzb3VyY2VzL2t1cHUvYXBhY2hlLWxlbnlhL2xlbnlhL2RyYXdlcnMvc2l0ZXRyZWVfbGlua19saWJyYXJ5LnhtbC5qeCIgdHlwZT0iangiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJlc291cmNlLWljb24tdXJsIiB2YWx1ZT0ie3Byb3h5OntnbG9iYWw6cmVzb3VyY2VJY29uVXJsfX0iLz4KLSAgICAgICAgPC9tYXA6Z2VuZXJhdGU+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+ICAgICAgCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InB1YmxpY2F0aW9uX2ltYWdlX2xpYnJhcnlfdGVtcGxhdGUiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2t1cHUvcmVzb3VyY2VzL2t1cHUvYXBhY2hlLWxlbnlhL2xlbnlhL2RyYXdlcnMvcHVibGljYXRpb25faW1hZ2VfbGlicmFyeS54bWwuangiIHR5cGU9Imp4Ij4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZS1pY29uLXVybCIgdmFsdWU9Intwcm94eTp7Z2xvYmFsOnJlc291cmNlSWNvblVybH19Ii8+Ci0gICAgICAgIDwvbWFwOmdlbmVyYXRlPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPiAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJyZXF1ZXN0MmRvY3VtZW50Ij4KLSAgICAgICAgPG1hcDphZ2dyZWdhdGUgZWxlbWVudD0iZWRpdC1lbnZlbG9wZSI+Ci0gICAgICAgICAgPG1hcDpwYXJ0IGVsZW1lbnQ9ImVkaXRlZCIgc3JjPSJjb2Nvb246L2t1cHUtc3RyZWFtIi8+Ci0gICAgICAgICAgPG1hcDpwYXJ0IGVsZW1lbnQ9Im9yaWdpbmFsIiAKLSAgICAgICAgICAgICAgc3JjPSJsZW55YS1kb2N1bWVudDp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSxsYW5nPXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICA8L21hcDphZ2dyZWdhdGU+ICAgICAgICAgICAgICAKLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMva3VwdS9yZXNvdXJjZXMva3VwdS9hcGFjaGUtbGVueWEvbGVueWEva3VwdXNhdmUueHNsIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+ICAgCi0gICAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJrdXB1Lm9wZW4iPgotICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgCi0gICAgICAgICAgICBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9rdXB1L3Jlc291cmNlcy9rdXB1L2FwYWNoZS1sZW55YS9rdXB1L2t1cHVtYWNyb3MuaHRtbCIvPgotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2t1cHUvcmVzb3VyY2VzL2t1cHUvYXBhY2hlLWxlbnlhL2xlbnlhL2t1cHVtYWNyb3MueHNsIj4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNvbnRlbnRmaWxlIiAKLSAgICAgICAgICAgICAgdmFsdWU9Intwcm94eTove3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aH19P2xlbnlhLm1vZHVsZT1rdXB1JmFtcDtsZW55YS5zdGVwPWNvbnRlbnQiLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQtcHJlZml4IiB2YWx1ZT0iL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9tb2R1bGVzL2t1cHUiLz4KLSAgICAgICAgICAgIDwhLS0gT25seSB1c2VkIHRvIGRpc3BsYXkgdGhlIGRvY3VtZW50IHBhdGggb2YgdGhlIGVkaXRlZCBkb2MgIC0tPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZG9jdW1lbnQtcGF0aCIgdmFsdWU9IiZxdW90O3tkdWJsaW5jb3JlOnRpdGxlfSZxdW90OyIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ic2F2ZS1kZXN0aW5hdGlvbiIgdmFsdWU9Intwcm94eTove3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aH19P2xlbnlhLmV2ZW50PWVkaXQiLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImV4aXQtZGVzdGluYXRpb24iIHZhbHVlPSJ7cHJveHk6L3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LXBhdGh9fT9sZW55YS5tb2R1bGU9a3VwdSZhbXA7bGVueWEuc3RlcD1leGl0Ii8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJyZWxvYWQtYWZ0ZXItc2F2ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVzZS1jc3MiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJpbWFnZWRyYXdlci14c2wtdXJpIiAKLSAgICAgICAgICAgICAgdmFsdWU9Intwcm94eTove3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aH19P2xlbnlhLm1vZHVsZT1rdXB1JmFtcDtsZW55YS5zdGVwPWltYWdlZHJhd2VyeHNsIi8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsaW5rZHJhd2VyLXhzbC11cmkiIAotICAgICAgICAgICAgICB2YWx1ZT0ie3Byb3h5Oi97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofX0/bGVueWEubW9kdWxlPWt1cHUmYW1wO2xlbnlhLnN0ZXA9bGlua2RyYXdlcnhzbCIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaW1hZ2UtbGlicmFyaWVzLXVyaSIgCi0gICAgICAgICAgICAgIHZhbHVlPSJ7cHJveHk6L3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LXBhdGh9fT9sZW55YS5tb2R1bGU9a3VwdSZhbXA7bGVueWEuc3RlcD1pbWFnZV9saWJyYXJpZXMiLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImxpbmstbGlicmFyaWVzLXVyaSIgCi0gICAgICAgICAgICAgIHZhbHVlPSJ7cHJveHk6L3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LXBhdGh9fT9sZW55YS5tb2R1bGU9a3VwdSZhbXA7bGVueWEuc3RlcD1saW5rX2xpYnJhcmllcyIvPgotICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAKLSAgICAgICAgPCEtLSBSZXF1ZXN0ZWQgYnkgS3VwdSB0byBsb2FkIHRoZSBkb2N1bWVudCBpbnRvIHRoZSBlZGl0b3IgLS0+ICAgIAotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImNvbnRlbnQiIHR5cGU9InN0ZXAiPgotICAgICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi9hdXRob3JpbmcvKioiPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImxlbnlhLWRvY3VtZW50OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9LGxhbmc9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9Ii8+Ci0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSAKLSAgICAgICAgICAgICAgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMva3VwdS9yZXNvdXJjZXMva3VwdS9hcGFjaGUtbGVueWEvbGVueWEvY29udGVudDJlZGl0LnhzbCI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNzcyIgdmFsdWU9Ii97MX0vYXV0aG9yaW5nL2Nzcy9wYWdlLmNzcyIvPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJub2RlaWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1uYW1lfSIvPgotICAgICAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0idXVpZDJ1cmwiLz4KLSAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ij4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJscyIgdmFsdWU9ImFic29sdXRlIi8+Ci0gICAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsIi8+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4aHRtbCIvPgotICAgICAgICAgIDwvbWFwOm1hdGNoPiAgICAgICAgICAgIAotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gS3VwdSBJbWFnZSBEcmF3ZXIgLS0+Ci0gICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKmRyYXdlcnhzbCIgdHlwZT0ic3RlcCI+Ci0gICAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJqeCIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMva3VwdS9yZXNvdXJjZXMva3VwdS9hcGFjaGUtbGVueWEvbGVueWEvZHJhd2Vycy97MX1kcmF3ZXIueHNsIj4KLSAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0byB1c2UgdGhlIGhvbGUgdXJpIHNjaGVtZSBpLmUuIGh0dHA6Ly9zZXJ2ZXJuYW1lOnBvcnQvLCBzaW5jZSBJRSB4c2x0IHByb2Nlc3NvciAgCi0gICAgICAgICAgICAgICAgIHRocm93cyBhbiBhY2Nlc3MgdmlvbGF0aW9uIHVwb24gbG9hZGluZyBvZiB4c2x0cyBmcm9tIHRoZSBpbnRlcm5ldC4KLSAgICAgICAgICAgICAgICAgVGhpcyByZXF1aXJlcyB0byBjb25maWd1cmUgdGhlIHByb3h5IGFjY29yZGluZ2x5IGluIHB1YmxpY2F0aW9uLnhtbC4KLSAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImltcG9ydC1zdHlsZXNoZWV0LXVybCIKLSAgICAgICAgICAgICAgdmFsdWU9Intwcm94eTovbW9kdWxlcy9rdXB1L2t1cHUvY29tbW9uL2t1cHVkcmF3ZXJzL2RyYXdlci54c2x9Ii8+Ci0gICAgICAgICAgPC9tYXA6Z2VuZXJhdGU+ICAKLSAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIAotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImltYWdlX2xpYnJhcmllcyIgdHlwZT0ic3RlcCI+Ci0gICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9rdXB1L3Jlc291cmNlcy9rdXB1L2FwYWNoZS1sZW55YS9sZW55YS9kcmF3ZXJzL2ltYWdlbGlicmFyaWVzLnhtbC5qeCIgdHlwZT0iangiPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHViTGliVXJsIiB2YWx1ZT0ie3Byb3h5Oi97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofX0/bGVueWEubW9kdWxlPWt1cHUmYW1wO2xlbnlhLnN0ZXA9cHVibGljYXRpb25faW1hZ2VfbGlicmFyeSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icGFnZUxpYlVybCIgdmFsdWU9Intwcm94eTove3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aH19P2xlbnlhLm1vZHVsZT1rdXB1JmFtcDtsZW55YS5zdGVwPXBhZ2VfaW1hZ2VfbGlicmFyeSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaW1hZ2VCYXNlVXJsIiB2YWx1ZT0ie3Byb3h5OntnbG9iYWw6aW1hZ2VCYXNlfX0iLz4KLSAgICAgICAgICA8L21hcDpnZW5lcmF0ZT4KLSAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ibGlua19saWJyYXJpZXMiIHR5cGU9InN0ZXAiPgotICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMva3VwdS9yZXNvdXJjZXMva3VwdS9hcGFjaGUtbGVueWEvbGVueWEvZHJhd2Vycy9saW5rbGlicmFyaWVzLnhtbC5qeCIgdHlwZT0iangiPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHViTGliVXJsIiB2YWx1ZT0ie3Byb3h5Oi97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofX0/bGVueWEubW9kdWxlPWt1cHUmYW1wO2xlbnlhLnN0ZXA9c2l0ZXRyZWVfbGlua19saWJyYXJ5Ii8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYWdlTGliVXJsIiB2YWx1ZT0ie3Byb3h5Oi97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofX0/bGVueWEubW9kdWxlPWt1cHUmYW1wO2xlbnlhLnN0ZXA9b3RoZXJfbGlua19saWJyYXJ5Ii8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJpbWFnZUJhc2VVcmwiIHZhbHVlPSJ7cHJveHk6e2dsb2JhbDppbWFnZUJhc2V9fSIvPgotICAgICAgICAgIDwvbWFwOmdlbmVyYXRlPgotICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InBhZ2VfaW1hZ2VfbGlicmFyeSIgdHlwZT0ic3RlcCI+Ci0gICAgICAgICAgPG1hcDpjYWxsIGZ1bmN0aW9uPSJwdWJsaWNhdGlvbl9pbWFnZV9saWJyYXJ5Ij4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InRlbXBsYXRlIiB2YWx1ZT0icHVibGljYXRpb25faW1hZ2VfbGlicmFyeV90ZW1wbGF0ZSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaWNvblVybCIgdmFsdWU9Intwcm94eTp7Z2xvYmFsOnJlc291cmNlSWNvblVybH19Ii8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJyb290UGF0aCIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYmFzZVVybCIgdmFsdWU9Intwcm94eTove3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9fSIvPgotICAgICAgICAgIDwvbWFwOmNhbGw+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InNpdGV0cmVlX2xpbmtfbGlicmFyeSIgdHlwZT0ic3RlcCI+Ci0gICAgICAgICAgPG1hcDpjYWxsIGZ1bmN0aW9uPSJzaXRldHJlZV9saW5rX2xpYnJhcnkiLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+ICAgICAgICAKLSAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJwdWJsaWNhdGlvbl9pbWFnZV9saWJyYXJ5IiB0eXBlPSJzdGVwIj4KLSAgICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249InB1YmxpY2F0aW9uX2ltYWdlX2xpYnJhcnkiPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idGVtcGxhdGUiIHZhbHVlPSJwdWJsaWNhdGlvbl9pbWFnZV9saWJyYXJ5X3RlbXBsYXRlIi8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJpY29uVXJsIiB2YWx1ZT0ie3Byb3h5OntnbG9iYWw6cmVzb3VyY2VJY29uVXJsfX0iLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJvb3RQYXRoIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aH0iLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImJhc2VVcmwiIHZhbHVlPSJ7cHJveHk6L3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfX0iLz4KLSAgICAgICAgICA8L21hcDpjYWxsPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgCi0gICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKl9saWJyYXJ5IiB0eXBlPSJzdGVwIj4KLSAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2t1cHUvcmVzb3VyY2VzL2t1cHUvYXBhY2hlLWxlbnlhL2xlbnlhL2RyYXdlcnMvezF9X2xpYnJhcnkueG1sLmp4IiB0eXBlPSJqeCIvPgotICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgPCEtLSAvS3VwdSBJbWFnZSBEcmF3ZXIgLS0+ICAKLSAgICAgICAgCi0gICAgICAgIDwhLS0gQ2hlY2tpbiBkb2N1bWVudCBvbiBleGl0IGFuZCB0cmlnZ2VyIHdvcmtmbG93IC0tPgotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImV4aXQiIHR5cGU9InN0ZXAiPgotICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc2VydmVkLWNoZWNraW4iPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY29udGVudC9yYy97ZXhjZXB0aW9ufS54c3AiIHR5cGU9InNlcnZlcnBhZ2VzIj4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlciIgdmFsdWU9Int1c2VyfSIvPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IntmaWxlbmFtZX0iLz4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY2hlY2tUeXBlIiB2YWx1ZT0ie2NoZWNrVHlwZX0iLz4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZGF0ZSIgdmFsdWU9IntkYXRlfSIvPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0ie21lc3NhZ2V9Ii8+Ci0gICAgICAgICAgICA8L21hcDpnZW5lcmF0ZT4KLSAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3JjL3Jjby1leGNlcHRpb24ueHNsIi8+Ci0gICAgICAgICAgICA8bWFwOmNhbGwgcmVzb3VyY2U9InN0eWxlLWNtcy1wYWdlIi8+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSAvPgotICAgICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgICA8bWFwOnJlZGlyZWN0LXRvIHVyaT0ie3Byb3h5Oi97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofS5odG1sfSIvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICA8L21hcDpwaXBlbGluZXM+Ci0KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9rdXB1L3VzZWNhc2VzL2t1cHUuanggYi90cnVuay9zcmMvbW9kdWxlcy9rdXB1L3VzZWNhc2VzL2t1cHUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTcwMDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMva3VwdS91c2VjYXNlcy9rdXB1Lmp4CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08ang6Y2hvb3NlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6Y2k9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCI+Ci0gIAotICA8ang6d2hlbiB0ZXN0PSIke3VzZWNhc2UuaGFzRXJyb3JzKCl9Ij4KLSAgICA8cGFnZTpwYWdlCi0gICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gICAgICA+Ci0gICAgICAKLSAgICAgIDxwYWdlOnRpdGxlPjxpMThuOnRleHQ+S3VwdSBFZGl0b3I8L2kxOG46dGV4dD48L3BhZ2U6dGl0bGU+Ci0gICAgICAKLSAgICAgIDxqeDpzZXQgdmFyPSJzb3VyY2VVcmwiIHZhbHVlPSIke3VzZWNhc2UuZ2V0U291cmNlVVJMKCl9Ii8+Ci0gICAgICA8ang6c2V0IHZhcj0ic3RlcHMiIHZhbHVlPSIke3NvdXJjZVVybC5zcGxpdCgnLycpfSIvPgotICAgICAgPGp4OnNldCB2YXI9Imxhc3RTdGVwIiB2YWx1ZT0iJHtzdGVwc1tzdGVwcy5zaXplKCkgLSAxXX0iLz4KLSAgICAgIAotICAgICAgPHBhZ2U6Ym9keT4KLSAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgPC9wYWdlOmJvZHk+Ci0gICAgPC9wYWdlOnBhZ2U+Ci0gIDwvang6d2hlbj4KLSAgPGp4Om90aGVyd2lzZT4KLSAgICA8Y2k6aW5jbHVkZSBzcmM9ImNvY29vbjovL21vZHVsZXMva3VwdS9rdXB1Lm9wZW4iLz4KLSAgPC9qeDpvdGhlcndpc2U+Ci08L2p4OmNob29zZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzMDI4NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMubGFuZ3VhZ2VzZWxlY3RvcjwvaWQ+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8bmFtZT5MYW5ndWFnZSBzZWxlY3RvcjwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+QSBsYW5ndWFnZSBzZWxlY3RvciBmb3IgTGVueWEgcHVibGljYXRpb25zIHRoYXQgdXNlcyBCYXRpayB0byByZW5kZXIgU1ZHIGZsYWcgaW1hZ2VzLjwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1N2E4NGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+Ci0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0KLTwhLS0KLSAgaXQgbWF5IGxvb2sgc3RyYW5nZSB0byBoYXZlIHBocmFzZXMgaW4gZGlmZmVyZW50IGxhbmd1YWdlcyBoZXJlLCBidXQgc2luY2UKLSAgdGhlc2UgYXJlIHRoZSBjb250cm9scyB0byBzd2l0Y2ggbGFuZ3VhZ2VzLCBpdCBtYWtlcyBzZW5zZSB0byBwcmVzZW50Ci0gIHRoZW0gaW4gdGhlICJ0YXJnZXQiIGxhbmd1YWdlIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLiAKLSAgdGh1cywgd2UgbmVlZCBvbmx5IG9uZSBjYXRhbG9ndWUgLSBhbGwgb3RoZXIgbGFuZ3VhZ2VzIHdpbGwgZmFsbCBiYWNrCi0gIHRvIHRoaXMgb25lLgotLS0+Ci0gICAgIAotICA8bWVzc2FnZSBrZXk9ImVuLWlzQ3VycmVudCI+RW5nbGlzaCBpcyB5b3VyIGN1cnJlbnRseSBzZWxlY3RlZCBsYW5ndWFnZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZW4taXNVbmF2YWlsYWJsZSI+U29ycnksIG5vIEVuZ2xpc2ggdHJhbnNsYXRpb24gaXMgYXZhaWxhYmxlIGZvciB0aGlzIGRvY3VtZW50LjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlbi1pc0F2YWlsYWJsZSI+c3dpdGNoIHRvIEVuZ2xpc2ggdHJhbnNsYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGUtaXNDdXJyZW50Ij5EZXV0c2NoIGlzdCBkaWUgYWt0dWVsbCBnZXfDpGhsdGUgU3ByYWNoZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGUtaXNVbmF2YWlsYWJsZSI+TGVpZGVyIGlzdCBmw7xyIGRpZXNlIFNlaXRlIGtlaW5lIGRldXRzY2hlIMOcYmVyc2V0enVuZyB2ZXJmw7xnYmFyLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZS1pc0F2YWlsYWJsZSI+enVyIGRldXRzY2hlbiDDnGJlcnNldHp1bmc8L21lc3NhZ2U+Ci0gIDwhLS0gc29ycnksIG15IGZyZW5jaCBzdWNrcy4gYW55b25lPyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJmci1pc0N1cnJlbnQiPlZvdXMgbGlzZXogbGEgdmVyc2lvbiBmcmFuw6dhaXNlLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmci1pc1VuYXZhaWxhYmxlIj5Ob3VzIHJlZ3JldHRvbnMgcXUnaWwgbid5IGEgcGFzIGRlIHRyYWR1Y3Rpb24gZnJhbsOnYWlzZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZnItaXNBdmFpbGFibGUiPnZlcnMgbGEgdmVyc2lvbiBmcmFuw6dhaXNlPC9tZXNzYWdlPgotICA8IS0tIG15IHNwYW5pc2ggZWl0aGVyLiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJlcy1pc0N1cnJlbnQiPkVzbyBlcyBjYXN0ZWxsYW5vLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcy1pc1VuYXZhaWxhYmxlIj5EZXNhZm9ydHVuYWRhbWVudGUgbm8gaGF5IHVuYSB0cmFkdWNjacOzbiBjYXN0ZWxsYW5hLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcy1pc0F2YWlsYWJsZSI+cGFyYSBsYSB0cmFkdWNjacOzbiBjYXN0ZWxsYW5hPC9tZXNzYWdlPgotICA8IS0tIG15IGhlYnJldyBpcyBldmVuIHdvcnNlLiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJoZS1pc0N1cnJlbnQiPi7XlteUINeR16HXpNeUINei15HXqNeZ16o8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iaGUtaXNVbmF2YWlsYWJsZSI+LteQ16DXnNeg15Ug15TXotee15XXkyDXlNeW15Qg15HXoteR16jXmdeqPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImhlLWlzQXZhaWxhYmxlIj4u15zXotee15XXkyDXoteR16jXmdeqPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImVuIj5FbmdsaXNoPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlIj5EZXV0c2NoPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZyIj5GcmFuw6dhaXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXMiPkVzcGHDsW9sPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImhlIj7XoteR16jXmdeqPC9tZXNzYWdlPgotICAKLTwvY2F0YWxvZ3VlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaW1hZ2VzL1JFQURNRSBiL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTBiYzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaW1hZ2VzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIwotIyBJZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSwgcGxlYXNlIGtlZXAgdGhlIHdlYnNpdGUgZG9jdW1lbnRhdGlvbiBpbiBzeW5jLiBUaGFua3MhCi0jCi0KLU1vcmUgZmxhZ3MgY2FuIGJlIG9idGFpbmVkIGZyb20gCi1odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dhbGxlcnlfb2Zfc292ZXJlaWduX3N0YXRlX2ZsYWdzLgotCi1CZSBzdXJlIHRvIHJlbmFtZSB0aGVtIGFjY29yZGluZyB0byAiPHR3by1sZXR0ZXItbGFuZ3VhZ2UtY29kZT4uc3ZnIi4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9kZS5zdmcgYi90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3Jlc291cmNlcy9pbWFnZXMvZGUuc3ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTJkNDYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9kZS5zdmcKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgc3ZnPgotPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjYwMCIgdmlld0JveD0iMCAwIDUgMyI+Ci0gICA8cmVjdCBpZD0iYmxhY2tfc3RyaXBlIglmaWxsPSIjMDAwIgl3aWR0aD0iNSIgaGVpZ2h0PSIzIi8+Ci0gICA8cmVjdCBpZD0icmVkX3N0cmlwZSIJZmlsbD0iI0QwMCIJd2lkdGg9IjUiIGhlaWdodD0iMiIgeT0iMSIvPgotICAgPHJlY3QgaWQ9ImdvbGRfc3RyaXBlIglmaWxsPSIjRkZDRTAwIgl3aWR0aD0iNSIgaGVpZ2h0PSIxIiB5PSIyIi8+Ci08L3N2Zz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9kZWZhdWx0LnN2ZyBiL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9kZWZhdWx0LnN2ZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlZDBiNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3Jlc291cmNlcy9pbWFnZXMvZGVmYXVsdC5zdmcKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgotPHN2ZwotICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKLSAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKLSAgIHZlcnNpb249IjEuMCIKLSAgIHdpZHRoPSI0NTAiCi0gICBoZWlnaHQ9IjMwMCIKLSAgIGlkPSJzdmcyIj4KLSAgPGRlZnMKLSAgICAgaWQ9ImRlZnM0IiAvPgotICA8ZwotICAgICBpZD0ibGF5ZXIxIj4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSI0NTAiCi0gICAgICAgaGVpZ2h0PSIzMDAiCi0gICAgICAgeD0iMCIKLSAgICAgICB5PSIwIgotICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICBpZD0icmVjdDEzMjUiIC8+Ci0gIDwvZz4KLTwvc3ZnPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaW1hZ2VzL2VuLnN2ZyBiL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9lbi5zdmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTBiYWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaW1hZ2VzL2VuLnN2ZworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzdmc+Ci08c3ZnIHZlcnNpb249IjEuMSIgYmFzZVByb2ZpbGU9ImZ1bGwiIHhtbG5zOmV2PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC1ldmVudHMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiIHpvb21BbmRQYW49Im1hZ25pZnkiCi0gICBpZD0iVW5pb24gSmFjayIKLSAgIHZpZXdCb3g9Ii0xNSAtNy41IDMwIDE1IgotICAgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIj4KLQotICA8ZGVmcz4KLSAgICA8Y2xpcFBhdGggaWQ9ImJvcmRlciI+Ci0gICAgICA8cmVjdCB4PSItMTUiIHk9Ii03LjUiIHdpZHRoPSIzMCIgaGVpZ2h0PSIxNSIvPgotICAgIDwvY2xpcFBhdGg+Ci0gIDwvZGVmcz4KLQotICA8ZyBjbGlwLXBhdGg9InVybCgjYm9yZGVyKSI+Ci0gICAgPGNpcmNsZSByPSIyMCIgZmlsbD0iIzAwMjQ3RCIvPgotICAgIDxwYXRoIGQ9Ik0gLTIwLC0xMCBMIDIwLDEwIE0gLTIwLDEwIEwgMjAsLTEwIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZT0id2hpdGUiIGlkPSJkaWFnc193aGl0ZSIvPgotICAgIDxwYXRoIGQ9Ik0gLTIwLC0xMCBMIDIwLDEwIE0gLTIwLDEwIEwgMjAsLTEwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZT0iI0NGMTQyQiIgaWQ9ImRpYWdzX3JlZCIvPgotICAgIDxwYXRoIHN0cm9rZT0ibm9uZSIgZmlsbD0id2hpdGUiIGQ9Ik0gMCwwIGwgMjAsMTAgaCAtMyBsIC0yMCwtMTAgTSAwLDAgbCAyMCwtMTAgaCAzIGwgLTIwLDEwIE0gMCwwIGwgLTIwLDEwIGggLTMgbCAyMCwtMTAgTSAwLDAgbCAtMjAsLTEwIGggMyBsIDIwLDEwIiBpZD0iZXJhc2VyX3doaXRlIi8+Ci08Y29tbWVudD5JIHRoaW5rIHRoZSBhYm92ZSB0d28gbGluZXMgZ2l2ZSB0aGUgc2ltcGxlc3Qgd2F5IHRvIG1ha2UgdGhlIGRpYWdvbmFsczwvY29tbWVudD4KLSAgICA8cGF0aCBkPSJNIC0yMCwwIEggMjAgTSAwLC0xMCBWIDEwIiBzdHJva2Utd2lkdGg9IjUiIHN0cm9rZT0id2hpdGUiIGlkPSJjcm9zc193aGl0ZSIvPgotICAgIDxwYXRoIGQ9Ik0gLTIwLDAgSCAyMCBNIDAsLTEwIFYgMTAiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlPSIjQ0YxNDJCIiBpZD0iY3Jvc3NfcmVkIi8+Ci0gIDwvZz4KLTwvc3ZnPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaW1hZ2VzL2VzLnN2ZyBiL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9lcy5zdmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjYzMzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaW1hZ2VzL2VzLnN2ZworKysgL2Rldi9udWxsCkBAIC0xLDI3ODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT4KLTxzdmcKLSAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKLSAgIHhtbG5zOmNjPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy8iCi0gICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCi0gICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9pbmtzY2FwZS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgotICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCi0gICBpZD0ic3ZnNTQ4IgotICAgaGVpZ2h0PSI1MDAiCi0gICB3aWR0aD0iNzUwIgotICAgeT0iMC4wMDAwMDAwIgotICAgeD0iMC4wMDAwMDAwIgotICAgdmVyc2lvbj0iMS4wIgotICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKLSAgIGlua3NjYXBlOnZlcnNpb249IjAuNDMiCi0gICBzb2RpcG9kaTpkb2NuYW1lPSJGbGFnX29mX1NwYWluLnN2ZyIKLSAgIHNvZGlwb2RpOmRvY2Jhc2U9IkQ6XEt1dmF0XFdpa2lwZWRpYSI+Ci0gIDxtZXRhZGF0YQotICAgICBpZD0ibWV0YWRhdGEyNzUzIj4KLSAgICA8cmRmOlJERj4KLSAgICAgIDxjYzpXb3JrCi0gICAgICAgICByZGY6YWJvdXQ9IiI+Ci0gICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgotICAgICAgICA8ZGM6dHlwZQotICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgotICAgICAgPC9jYzpXb3JrPgotICAgIDwvcmRmOlJERj4KLSAgPC9tZXRhZGF0YT4KLSAgPHNvZGlwb2RpOm5hbWVkdmlldwotICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI1NDAiCi0gICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzU2IgotICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgotICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgotICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCi0gICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgotICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCi0gICAgIGlkPSJiYXNlIgotICAgICBpbmtzY2FwZTp6b29tPSIwLjc1MTY2MyIKLSAgICAgaW5rc2NhcGU6Y3g9IjM3Mi4xMjk4NyIKLSAgICAgaW5rc2NhcGU6Y3k9IjI0Ny4yNTIxNCIKLSAgICAgaW5rc2NhcGU6d2luZG93LXg9IjU4IgotICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMTQxIgotICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJnMzUyNCIgLz4KLSAgPGRlZnMKLSAgICAgaWQ9ImRlZnM1NDkiPgotICAgIDxtYXJrZXIKLSAgICAgICBpZD0iQXJyb3dFbmQiCi0gICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgotICAgICAgIG9yaWVudD0iYXV0byIKLSAgICAgICBtYXJrZXJIZWlnaHQ9IjMiCi0gICAgICAgbWFya2VyV2lkdGg9IjQiCi0gICAgICAgcmVmWT0iNSIKLSAgICAgICByZWZYPSIwIgotICAgICAgIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCI+Ci0gICAgICA8cGF0aAotICAgICAgICAgaWQ9InBhdGg1NTEiCi0gICAgICAgICBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEwgMCwwIHogIiAvPgotICAgIDwvbWFya2VyPgotICAgIDxtYXJrZXIKLSAgICAgICBpZD0iQXJyb3dTdGFydCIKLSAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCi0gICAgICAgb3JpZW50PSJhdXRvIgotICAgICAgIG1hcmtlckhlaWdodD0iMyIKLSAgICAgICBtYXJrZXJXaWR0aD0iNCIKLSAgICAgICByZWZZPSI1IgotICAgICAgIHJlZlg9IjEwIgotICAgICAgIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCI+Ci0gICAgICA8cGF0aAotICAgICAgICAgaWQ9InBhdGg1NTMiCi0gICAgICAgICBkPSJNIDEwLDAgTCAwLDUgTCAxMCwxMCBMIDEwLDAgeiAiIC8+Ci0gICAgPC9tYXJrZXI+Ci0gICAgPHN0eWxlCi0gICAgICAgaWQ9InN0eWxlMjQzNSIKLSAgICAgICB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAKLSAgICAuc3RyMCB7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjN9Ci0gICAgLmZpbDEge2ZpbGw6bm9uZX0KLSAgICAuZmlsMiB7ZmlsbDojMDAzOUYwfQotICAgIC5maWwwIHtmaWxsOiNGRkZGMDB9Ci0gICAKLSAgPC9zdHlsZT4KLSAgPC9kZWZzPgotICA8ZwotICAgICBpZD0iZzM1MjQiPgotICAgIDxnCi0gICAgICAgaWQ9Imc3MTY2Ij4KLSAgICAgIDxyZWN0Ci0gICAgICAgICB3aWR0aD0iNzUwIgotICAgICAgICAgaGVpZ2h0PSI1MDAiCi0gICAgICAgICB4PSIwIgotICAgICAgICAgeT0iLTIuMDU2MzYwMmUtMDA1IgotICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MXB0IgotICAgICAgICAgaWQ9InJlY3QxNzEiIC8+Ci0gICAgICA8cmVjdAotICAgICAgICAgd2lkdGg9Ijc1MCIKLSAgICAgICAgIGhlaWdodD0iMjUwIgotICAgICAgICAgeD0iMy40NTIxNDg2ZS0wMDciCi0gICAgICAgICB5PSIxMjUiCi0gICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojRkFCRDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxcHQiCi0gICAgICAgICBpZD0icmVjdDQwMyIgLz4KLSAgICAgIDxnCi0gICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwNjg5NiwwLDAsMS4wMDY4OTYsMC4zMDQzLC0wLjcwODM0MikiCi0gICAgICAgICBpZD0iZzUxNjEiPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ4ODciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMTY2LjUzNiwyMjEuNDIyNyBDIDE2Ni41MzYsMjIxLjQyMjcgMTY2LjAyOSwyMjEuNDIyNyAxNjUuNzUsMjIxLjI2MzcgQyAxNjUuNDcxLDIyMS4xMDE3IDE2NC42MjksMjIwLjMwNDcgMTY0LjYyOSwyMjAuMzA0NyBMIDE2My45NTUsMjE5LjgyNDcgTCAxNjMuMzQxLDIxOC45NzQ3IEMgMTYzLjM0MSwyMTguOTc0NyAxNjIuNjExLDIxNy44MTE3IDE2Mi45NDYsMjE2LjkwNDcgQyAxNjMuMjgxLDIxNi4wMDE3IDE2My44NDMsMjE1LjY4MDcgMTY0LjM1LDIxNS40MTY3IEMgMTY0Ljg1NiwyMTUuMTUxNyAxNjUuOTE4LDIxNC44MzE3IDE2NS45MTgsMjE0LjgzMTcgQyAxNjUuOTE4LDIxNC44MzE3IDE2Ni43NjMsMjE0LjQ2MDcgMTY3LjA0MiwyMTQuNDA0NyBDIDE2Ny4zMjEsMjE0LjM1MTcgMTY4LjMzNCwyMTQuMDg2NyAxNjguMzM0LDIxNC4wODY3IEMgMTY4LjMzNCwyMTQuMDg2NyAxNjguNjE0LDIxMy45Mjg3IDE2OC44OTMsMjEzLjgyMjcgQyAxNjkuMTc2LDIxMy43MTY3IDE2OS41NjcsMjEzLjcxNjcgMTY5Ljc5NCwyMTMuNjYwNyBDIDE3MC4wMTcsMjEzLjYwNzcgMTcwLjU4LDIxMy40Mjc3IDE3MC45MTUsMjEzLjQwOTcgQyAxNzEuNDM2LDIxMy4zODg3IDE3Mi4yNjMsMjEzLjUwMTcgMTcyLjU0NiwyMTMuNTAxNyBDIDE3Mi44MjUsMjEzLjUwMTcgMTczLjc3OSwyMTMuNTU3NyAxNzQuMTcsMjEzLjU1NzcgQyAxNzQuNTYxLDIxMy41NTc3IDE3NS45NjQsMjEzLjQ0ODcgMTc2LjM1OSwyMTMuNDQ4NyBDIDE3Ni43NSwyMTMuNDQ4NyAxNzcuMDMzLDIxMy4zOTk3IDE3Ny40ODQsMjEzLjQ0ODcgQyAxNzcuOTMxLDIxMy41MDE3IDE3OC43MTYsMjEzLjc2NTcgMTc4Ljk0MywyMTMuODc1NyBDIDE3OS4xNjcsMjEzLjk4MTcgMTgwLjUxNSwyMTQuNDYwNyAxODEuMDE4LDIxNC42MTk3IEMgMTgxLjUyNCwyMTQuNzc0NyAxODIuNzYsMjE0Ljk4OTcgMTgzLjMyMywyMTUuMjU0NyBDIDE4My44ODEsMjE1LjUyMjcgMTg0LjIyNCwyMTUuOTcwNyAxODQuNTAzLDIxNi4zNDM3IEMgMTg0Ljc4NiwyMTYuNzE0NyAxODQuODM4LDIxNy4xMTk3IDE4NC45NSwyMTcuMzg3NyBDIDE4NS4wNTgsMjE3LjY1MjcgMTg1LjA2MiwyMTguMjIzNyAxODQuOTU0LDIxOC40ODg3IEMgMTg0Ljg0MSwyMTguNzUyNyAxODQuNDQ0LDIxOS4yOTk3IDE4NC40NDQsMjE5LjI5OTcgTCAxODMuODI1LDIyMC4zMDc3IEwgMTgzLjA0LDIyMC45NDI3IEMgMTgzLjA0LDIyMC45NDI3IDE4Mi40NzcsMjIxLjQ3ODcgMTgyLjAzMSwyMjEuNDIyNyBDIDE4MS41OCwyMjEuMzc2NyAxNzcuMDMzLDIyMC41NzI3IDE3NC4xMTQsMjIwLjU3MjcgQyAxNzEuMTk0LDIyMC41NzI3IDE2Ni41MzIsMjIxLjQyMjcgMTY2LjUzMiwyMjEuNDIyNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0ODg5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NjtzdHJva2UtbGluZWpvaW46cm91bmQiCi0gICAgICAgICAgIGQ9Ik0gMTY2LjUzNiwyMjEuNDIyNyBDIDE2Ni41MzYsMjIxLjQyMjcgMTY2LjAyOSwyMjEuNDIyNyAxNjUuNzUsMjIxLjI2MzcgQyAxNjUuNDcxLDIyMS4xMDE3IDE2NC42MjksMjIwLjMwNDcgMTY0LjYyOSwyMjAuMzA0NyBMIDE2My45NTUsMjE5LjgyNDcgTCAxNjMuMzQxLDIxOC45NzQ3IEMgMTYzLjM0MSwyMTguOTc0NyAxNjIuNjExLDIxNy44MTE3IDE2Mi45NDYsMjE2LjkwNDcgQyAxNjMuMjgxLDIxNi4wMDE3IDE2My44NDMsMjE1LjY4MDcgMTY0LjM1LDIxNS40MTY3IEMgMTY0Ljg1NiwyMTUuMTUxNyAxNjUuOTE4LDIxNC44MzE3IDE2NS45MTgsMjE0LjgzMTcgQyAxNjUuOTE4LDIxNC44MzE3IDE2Ni43NjMsMjE0LjQ2MDcgMTY3LjA0MiwyMTQuNDA0NyBDIDE2Ny4zMjEsMjE0LjM1MTcgMTY4LjMzNCwyMTQuMDg2NyAxNjguMzM0LDIxNC4wODY3IEMgMTY4LjMzNCwyMTQuMDg2NyAxNjguNjE0LDIxMy45Mjg3IDE2OC44OTMsMjEzLjgyMjcgQyAxNjkuMTc2LDIxMy43MTY3IDE2OS41NjcsMjEzLjcxNjcgMTY5Ljc5NCwyMTMuNjYwNyBDIDE3MC4wMTcsMjEzLjYwNzcgMTcwLjU4LDIxMy40Mjc3IDE3MC45MTUsMjEzLjQwOTcgQyAxNzEuNDM2LDIxMy4zODg3IDE3Mi4yNjMsMjEzLjUwMTcgMTcyLjU0NiwyMTMuNTAxNyBDIDE3Mi44MjUsMjEzLjUwMTcgMTczLjc3OSwyMTMuNTU3NyAxNzQuMTcsMjEzLjU1NzcgQyAxNzQuNTYxLDIxMy41NTc3IDE3NS45NjQsMjEzLjQ0ODcgMTc2LjM1OSwyMTMuNDQ4NyBDIDE3Ni43NSwyMTMuNDQ4NyAxNzcuMDMzLDIxMy4zOTk3IDE3Ny40ODQsMjEzLjQ0ODcgQyAxNzcuOTMxLDIxMy41MDE3IDE3OC43MTYsMjEzLjc2NTcgMTc4Ljk0MywyMTMuODc1NyBDIDE3OS4xNjcsMjEzLjk4MTcgMTgwLjUxNSwyMTQuNDYwNyAxODEuMDE4LDIxNC42MTk3IEMgMTgxLjUyNCwyMTQuNzc0NyAxODIuNzYsMjE0Ljk4OTcgMTgzLjMyMywyMTUuMjU0NyBDIDE4My44ODEsMjE1LjUyMjcgMTg0LjIyNCwyMTUuOTcwNyAxODQuNTAzLDIxNi4zNDM3IEMgMTg0Ljc4NiwyMTYuNzE0NyAxODQuODM4LDIxNy4xMTk3IDE4NC45NSwyMTcuMzg3NyBDIDE4NS4wNTgsMjE3LjY1MjcgMTg1LjA2MiwyMTguMjIzNyAxODQuOTU0LDIxOC40ODg3IEMgMTg0Ljg0MSwyMTguNzUyNyAxODQuNDQ0LDIxOS4yOTk3IDE4NC40NDQsMjE5LjI5OTcgTCAxODMuODI1LDIyMC4zMDc3IEwgMTgzLjA0LDIyMC45NDI3IEMgMTgzLjA0LDIyMC45NDI3IDE4Mi40NzcsMjIxLjQ3ODcgMTgyLjAzMSwyMjEuNDIyNyBDIDE4MS41OCwyMjEuMzc2NyAxNzcuMDMzLDIyMC41NzI3IDE3NC4xMTQsMjIwLjU3MjcgQyAxNzEuMTk0LDIyMC41NzI3IDE2Ni41MzIsMjIxLjQyMjcgMTY2LjUzMiwyMjEuNDIyNyBMIDE2Ni41MzYsMjIxLjQyMjcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDg5MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzIuNzgxLDIxNC45MDg3IEMgMTcyLjc4MSwyMTMuNTM2NyAxNzMuMzk1LDIxMi40Mjk3IDE3NC4xNTEsMjEyLjQyOTcgQyAxNzQuOTA3LDIxMi40Mjk3IDE3NS41MjEsMjEzLjUzNjcgMTc1LjUyMSwyMTQuOTA4NyBDIDE3NS41MjEsMjE2LjI3MzcgMTc0LjkwNywyMTcuMzg0NyAxNzQuMTUxLDIxNy4zODQ3IEMgMTczLjM5NSwyMTcuMzg0NyAxNzIuNzgxLDIxNi4yNzM3IDE3Mi43ODEsMjE0LjkwODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDg5MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTcyLjc4MSwyMTQuOTA4NyBDIDE3Mi43ODEsMjEzLjUzNjcgMTczLjM5NSwyMTIuNDI5NyAxNzQuMTUxLDIxMi40Mjk3IEMgMTc0LjkwNywyMTIuNDI5NyAxNzUuNTIxLDIxMy41MzY3IDE3NS41MjEsMjE0LjkwODcgQyAxNzUuNTIxLDIxNi4yNzM3IDE3NC45MDcsMjE3LjM4NDcgMTc0LjE1MSwyMTcuMzg0NyBDIDE3My4zOTUsMjE3LjM4NDcgMTcyLjc4MSwyMTYuMjczNyAxNzIuNzgxLDIxNC45MDg3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ4OTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTczLjU0OCwyMTQuOTA4NyBDIDE3My41NDgsMjEzLjY0NjcgMTczLjgzMSwyMTIuNjIzNyAxNzQuMTc3LDIxMi42MjM3IEMgMTc0LjUyNywyMTIuNjIzNyAxNzQuODA2LDIxMy42NDY3IDE3NC44MDYsMjE0LjkwODcgQyAxNzQuODA2LDIxNi4xNjA3IDE3NC41MjcsMjE3LjE4MzcgMTc0LjE3NywyMTcuMTgzNyBDIDE3My44MzEsMjE3LjE4MzcgMTczLjU0OCwyMTYuMTYwNyAxNzMuNTQ4LDIxNC45MDg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ4OTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE3My41NDgsMjE0LjkwODcgQyAxNzMuNTQ4LDIxMy42NDY3IDE3My44MzEsMjEyLjYyMzcgMTc0LjE3NywyMTIuNjIzNyBDIDE3NC41MjcsMjEyLjYyMzcgMTc0LjgwNiwyMTMuNjQ2NyAxNzQuODA2LDIxNC45MDg3IEMgMTc0LjgwNiwyMTYuMTYwNyAxNzQuNTI3LDIxNy4xODM3IDE3NC4xNzcsMjE3LjE4MzcgQyAxNzMuODMxLDIxNy4xODM3IDE3My41NDgsMjE2LjE2MDcgMTczLjU0OCwyMTQuOTA4NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0ODk5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE3My4yNTMsMjEyLjI4ODcgQyAxNzMuMjUzLDIxMS44MTI3IDE3My42NjMsMjExLjQxNzcgMTc0LjE3LDIxMS40MTc3IEMgMTc0LjY3NiwyMTEuNDE3NyAxNzUuMDg2LDIxMS44MTI3IDE3NS4wODYsMjEyLjI4ODcgQyAxNzUuMDg2LDIxMi43Njc3IDE3NC42NzYsMjEzLjE1MjcgMTc0LjE3LDIxMy4xNTI3IEMgMTczLjY2MywyMTMuMTUyNyAxNzMuMjUzLDIxMi43Njc3IDE3My4yNTMsMjEyLjI4ODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkwMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzQuODE3LDIxMS45ODE3IEwgMTc0LjgxNywyMTIuNTU5NyBMIDE3My4zOTksMjEyLjU1OTcgTCAxNzMuMzk5LDIxMS45ODE3IEwgMTczLjg2NCwyMTEuOTgxNyBMIDE3My44NjQsMjEwLjY4MDcgTCAxNzMuMjUsMjEwLjY4MDcgTCAxNzMuMjUsMjEwLjEwNTcgTCAxNzMuODY0LDIxMC4xMDU3IEwgMTczLjg2NCwyMDkuNTQxNyBMIDE3NC40NjcsMjA5LjU0MTcgTCAxNzQuNDY3LDIxMC4xMDU3IEwgMTc1LjA3OCwyMTAuMTA1NyBMIDE3NS4wNzgsMjEwLjY4MDcgTCAxNzQuNDY3LDIxMC42ODA3IEwgMTc0LjQ2NywyMTEuOTgxNyBMIDE3NC44MTcsMjExLjk4MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkwMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yOTcxNiIKLSAgICAgICAgICAgZD0iTSAxNzQuODE3LDIxMS45ODE3IEwgMTc0LjgxNywyMTIuNTU5NyBMIDE3My4zOTksMjEyLjU1OTcgTCAxNzMuMzk5LDIxMS45ODE3IEwgMTczLjg2NCwyMTEuOTgxNyBMIDE3My44NjQsMjEwLjY4MDcgTCAxNzMuMjUsMjEwLjY4MDcgTCAxNzMuMjUsMjEwLjEwNTcgTCAxNzMuODY0LDIxMC4xMDU3IEwgMTczLjg2NCwyMDkuNTQxNyBMIDE3NC40NjcsMjA5LjU0MTcgTCAxNzQuNDY3LDIxMC4xMDU3IEwgMTc1LjA3OCwyMTAuMTA1NyBMIDE3NS4wNzgsMjEwLjY4MDcgTCAxNzQuNDY3LDIxMC42ODA3IEwgMTc0LjQ2NywyMTEuOTgxNyBMIDE3NC44MTcsMjExLjk4MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkwNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzUuNDUxLDIxMS45ODE3IEwgMTc1LjQ1MSwyMTIuNTU5NyBMIDE3Mi45MzMsMjEyLjU1OTcgTCAxNzIuOTMzLDIxMS45ODE3IEwgMTczLjg2NCwyMTEuOTgxNyBMIDE3My44NjQsMjEwLjY4MDcgTCAxNzMuMjUsMjEwLjY4MDcgTCAxNzMuMjUsMjEwLjEwNTcgTCAxNzMuODY0LDIxMC4xMDU3IEwgMTczLjg2NCwyMDkuNTQxNyBMIDE3NC40NjcsMjA5LjU0MTcgTCAxNzQuNDY3LDIxMC4xMDU3IEwgMTc1LjA3OCwyMTAuMTA1NyBMIDE3NS4wNzgsMjEwLjY4MDcgTCAxNzQuNDY3LDIxMC42ODA3IEwgMTc0LjQ2NywyMTEuOTgxNyBMIDE3NS40NTEsMjExLjk4MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkwNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yOTcxNiIKLSAgICAgICAgICAgZD0iTSAxNzUuNDUxLDIxMS45ODE3IEwgMTc1LjQ1MSwyMTIuNTU5NyBMIDE3Mi45MzMsMjEyLjU1OTcgTCAxNzIuOTMzLDIxMS45ODE3IEwgMTczLjg2NCwyMTEuOTgxNyBMIDE3My44NjQsMjEwLjY4MDcgTCAxNzMuMjUsMjEwLjY4MDcgTCAxNzMuMjUsMjEwLjEwNTcgTCAxNzMuODY0LDIxMC4xMDU3IEwgMTczLjg2NCwyMDkuNTQxNyBMIDE3NC40NjcsMjA5LjU0MTcgTCAxNzQuNDY3LDIxMC4xMDU3IEwgMTc1LjA3OCwyMTAuMTA1NyBMIDE3NS4wNzgsMjEwLjY4MDcgTCAxNzQuNDY3LDIxMC42ODA3IEwgMTc0LjQ2NywyMTEuOTgxNyBMIDE3NS40NTEsMjExLjk4MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkwOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTc0LjQzNCwyMTEuNDUyNyBDIDE3NC44MTQsMjExLjU1ODcgMTc1LjA4NiwyMTEuODkzNyAxNzUuMDg2LDIxMi4yODg3IEMgMTc1LjA4NiwyMTIuNzY3NyAxNzQuNjc2LDIxMy4xNTI3IDE3NC4xNywyMTMuMTUyNyBDIDE3My42NjMsMjEzLjE1MjcgMTczLjI1MywyMTIuNzY3NyAxNzMuMjUzLDIxMi4yODg3IEMgMTczLjI1MywyMTEuODg2NyAxNzMuNTQsMjExLjU0NDcgMTczLjkzMSwyMTEuNDQ4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTExIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE3NC4xNzMsMjIxLjI2MzcgTCAxNjkuMzk5LDIyMS4yNjM3IEwgMTY5LjI4OCwyMjAuMDkyNyBMIDE2OS4wNjQsMjE4Ljg3MjcgTCAxNjguODI2LDIxNy4zNDk3IEMgMTY3LjUxMSwyMTUuNjEzNyAxNjYuMzAxLDIxNC40NzQ3IDE2NS44OTUsMjE0LjcxODcgQyAxNjUuOTkyLDIxNC4zOTc3IDE2Ni4xMDcsMjE0LjE1NzcgMTY2LjM2MSwyMTQuMDA5NyBDIDE2Ny41MywyMTMuMzE0NyAxNjkuOTQzLDIxNC45ODI3IDE3MS43NTcsMjE3LjcyMjcgQyAxNzEuOTIsMjE3Ljk3MzcgMTcyLjA3NywyMTguMjIzNyAxNzIuMjE1LDIxOC40NzQ3IEwgMTc2LjE1OCwyMTguNDc0NyBDIDE3Ni4zLDIxOC4yMjc3IDE3Ni40NTYsMjE3Ljk3NjcgMTc2LjYyLDIxNy43MjI3IEMgMTc4LjQzLDIxNC45ODI3IDE4MC44NDYsMjEzLjMxNDcgMTgyLjAxMiwyMTQuMDA5NyBDIDE4Mi4yNjUsMjE0LjE1NzcgMTgyLjM4MSwyMTQuMzk3NyAxODIuNDgxLDIxNC43MTg3IEMgMTgyLjA3MiwyMTQuNDc4NyAxODAuODY1LDIxNS42MTM3IDE3OS41NDMsMjE3LjM0OTcgTCAxNzkuMzA4LDIxOC44NzI3IEwgMTc5LjA4NSwyMjAuMDkyNyBMIDE3OC45NzYsMjIxLjI2MzcgTCAxNzQuMTc3LDIyMS4yNjM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5MTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE3NC4xNzMsMjIxLjI2MzcgTCAxNjkuMzk5LDIyMS4yNjM3IEwgMTY5LjI4OCwyMjAuMDkyNyBMIDE2OS4wNjQsMjE4Ljg3MjcgTCAxNjguODI2LDIxNy4zNDk3IEMgMTY3LjUxMSwyMTUuNjEzNyAxNjYuMzAxLDIxNC40NzQ3IDE2NS44OTUsMjE0LjcxODcgQyAxNjUuOTkyLDIxNC4zOTc3IDE2Ni4xMDcsMjE0LjE1NzcgMTY2LjM2MSwyMTQuMDA5NyBDIDE2Ny41MywyMTMuMzE0NyAxNjkuOTQzLDIxNC45ODI3IDE3MS43NTcsMjE3LjcyMjcgQyAxNzEuOTIsMjE3Ljk3MzcgMTcyLjA3NywyMTguMjIzNyAxNzIuMjE1LDIxOC40NzQ3IEwgMTc2LjE1OCwyMTguNDc0NyBDIDE3Ni4zLDIxOC4yMjc3IDE3Ni40NTYsMjE3Ljk3NjcgMTc2LjYyLDIxNy43MjI3IEMgMTc4LjQzLDIxNC45ODI3IDE4MC44NDYsMjEzLjMxNDcgMTgyLjAxMiwyMTQuMDA5NyBDIDE4Mi4yNjUsMjE0LjE1NzcgMTgyLjM4MSwyMTQuMzk3NyAxODIuNDgxLDIxNC43MTg3IEMgMTgyLjA3MiwyMTQuNDc4NyAxODAuODY1LDIxNS42MTM3IDE3OS41NDMsMjE3LjM0OTcgTCAxNzkuMzA4LDIxOC44NzI3IEwgMTc5LjA4NSwyMjAuMDkyNyBMIDE3OC45NzYsMjIxLjI2MzcgTCAxNzQuMTc3LDIyMS4yNjM3IEwgMTc0LjE3MywyMjEuMjYzNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTE1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxNjYuMTA0LDIxNC42NzI3IEMgMTY3LjAwMSwyMTQuMTQzNyAxNjkuMDk4LDIxNS44MDQ3IDE3MC43OTksMjE4LjM4NTcgTSAxODIuMjY5LDIxNC42NzI3IEMgMTgxLjM2OCwyMTQuMTQzNyAxNzkuMjc1LDIxNS44MDQ3IDE3Ny41NzMsMjE4LjM4NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkxNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNjcuMTIsMjIzLjQxODcgQyAxNjYuOTIzLDIyMi44NTA3IDE2Ni41NDcsMjIyLjM0MjcgMTY2LjU0NywyMjIuMzQyNyBDIDE2OC40OCwyMjEuNzc0NyAxNzEuMTcyLDIyMS40MTg3IDE3NC4xNjYsMjIxLjQxMTcgQyAxNzcuMTU2LDIyMS40MTg3IDE3OS44NzEsMjIxLjc3NDcgMTgxLjgsMjIyLjM0MjcgQyAxODEuOCwyMjIuMzQyNyAxODEuNTg0LDIyMi43MjM3IDE4MS4yODYsMjIzLjI1MjcgQyAxODEuMTE4LDIyMy41NDU3IDE4MC44OTksMjI0LjA1NjcgMTgwLjkxMywyMjQuMDU2NyBDIDE3OS4xNjcsMjIzLjUyMDcgMTc2LjkxOCwyMjMuMjQ1NyAxNzQuMTUxLDIyMy4yNDI3IEMgMTcxLjM4OCwyMjMuMjQ1NyAxNjguNzI5LDIyMy41ODQ3IDE2Ny4zNDQsMjI0LjA5MTcgQyAxNjcuMzU5LDIyNC4wOTE3IDE2Ny4yNDcsMjIzLjc3MTcgMTY3LjEwOSwyMjMuNDE4NyBMIDE2Ny4xMiwyMjMuNDE4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTE5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxNjcuMTIsMjIzLjQxODcgQyAxNjYuOTIzLDIyMi44NTA3IDE2Ni41NDcsMjIyLjM0MjcgMTY2LjU0NywyMjIuMzQyNyBDIDE2OC40OCwyMjEuNzc0NyAxNzEuMTcyLDIyMS40MTg3IDE3NC4xNjYsMjIxLjQxMTcgQyAxNzcuMTU2LDIyMS40MTg3IDE3OS44NzEsMjIxLjc3NDcgMTgxLjgsMjIyLjM0MjcgQyAxODEuOCwyMjIuMzQyNyAxODEuNTg0LDIyMi43MjM3IDE4MS4yODYsMjIzLjI1MjcgQyAxODEuMTE4LDIyMy41NDU3IDE4MC44OTksMjI0LjA1NjcgMTgwLjkxMywyMjQuMDU2NyBDIDE3OS4xNjcsMjIzLjUyMDcgMTc2LjkxOCwyMjMuMjQ1NyAxNzQuMTUxLDIyMy4yNDI3IEMgMTcxLjM4OCwyMjMuMjQ1NyAxNjguNzI5LDIyMy41ODQ3IDE2Ny4zNDQsMjI0LjA5MTcgQyAxNjcuMzU5LDIyNC4wOTE3IDE2Ny4yNDcsMjIzLjc3MTcgMTY3LjEwOSwyMjMuNDE4NyBMIDE2Ny4xMiwyMjMuNDE4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTIxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE3NC4xNjYsMjI1Ljg3NjcgQyAxNzYuNTc5LDIyNS44NzI3IDE3OS4yNDEsMjI1LjUwNjcgMTgwLjIyMSwyMjUuMjUyNyBDIDE4MC44OCwyMjUuMDYxNyAxODEuMjYzLDIyNC43NjU3IDE4MS4xOTMsMjI0LjQyMzcgQyAxODEuMTU5LDIyNC4yNjE3IDE4MS4wMTgsMjI0LjEyMDcgMTgwLjgyOCwyMjQuMDM5NyBDIDE3OS4zODMsMjIzLjU3NzcgMTc2Ljc4NywyMjMuMjQ5NyAxNzQuMTY2LDIyMy4yNDU3IEMgMTcxLjU0OCwyMjMuMjQ5NyAxNjguOTM0LDIyMy41Nzc3IDE2Ny40OTMsMjI0LjAzOTcgQyAxNjcuMzAzLDIyNC4xMjA3IDE2Ny4xNjEsMjI0LjI2MTcgMTY3LjEyOCwyMjQuNDIzNyBDIDE2Ny4wNTcsMjI0Ljc2NTcgMTY3LjQ0MSwyMjUuMDYxNyAxNjguMDk2LDIyNS4yNTI3IEMgMTY5LjA3OSwyMjUuNTA2NyAxNzEuNzUzLDIyNS44NzI3IDE3NC4xNjYsMjI1Ljg3NjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkyMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTc0LjE2NiwyMjUuODc2NyBDIDE3Ni41NzksMjI1Ljg3MjcgMTc5LjI0MSwyMjUuNTA2NyAxODAuMjIxLDIyNS4yNTI3IEMgMTgwLjg4LDIyNS4wNjE3IDE4MS4yNjMsMjI0Ljc2NTcgMTgxLjE5MywyMjQuNDIzNyBDIDE4MS4xNTksMjI0LjI2MTcgMTgxLjAxOCwyMjQuMTIwNyAxODAuODI4LDIyNC4wMzk3IEMgMTc5LjM4MywyMjMuNTc3NyAxNzYuNzg3LDIyMy4yNDk3IDE3NC4xNjYsMjIzLjI0NTcgQyAxNzEuNTQ4LDIyMy4yNDk3IDE2OC45MzQsMjIzLjU3NzcgMTY3LjQ5MywyMjQuMDM5NyBDIDE2Ny4zMDMsMjI0LjEyMDcgMTY3LjE2MSwyMjQuMjYxNyAxNjcuMTI4LDIyNC40MjM3IEMgMTY3LjA1NywyMjQuNzY1NyAxNjcuNDQxLDIyNS4wNjE3IDE2OC4wOTYsMjI1LjI1MjcgQyAxNjkuMDc5LDIyNS41MDY3IDE3MS43NTMsMjI1Ljg3MjcgMTc0LjE2NiwyMjUuODc2NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTI1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE4MS45MjMsMjIxLjI2MzcgTCAxODEuMzMxLDIyMC43MzE3IEMgMTgxLjMzMSwyMjAuNzMxNyAxODAuNzcyLDIyMS4wNzY3IDE4MC4wNjgsMjIwLjk3MDcgQyAxNzkuMzY4LDIyMC44NjU3IDE3OS4xNDEsMjIwLjAxNTcgMTc5LjE0MSwyMjAuMDE1NyBDIDE3OS4xNDEsMjIwLjAxNTcgMTc4LjM1NSwyMjAuNjc0NyAxNzcuNzExLDIyMC42MjU3IEMgMTc3LjA2NywyMjAuNTY4NyAxNzYuNjQ2LDIyMC4wMTU3IDE3Ni42NDYsMjIwLjAxNTcgQyAxNzYuNjQ2LDIyMC4wMTU3IDE3NS45NDYsMjIwLjUxNTcgMTc1LjMyOCwyMjAuNDY2NyBDIDE3NC43MSwyMjAuNDEwNyAxNzQuMTIxLDIxOS42NDE3IDE3NC4xMjEsMjE5LjY0MTcgQyAxNzQuMTIxLDIxOS42NDE3IDE3My41MDMsMjIwLjQzODcgMTcyLjg4NSwyMjAuNDk0NyBDIDE3Mi4yNjcsMjIwLjU0NDcgMTcxLjc2LDIxOS45NTg3IDE3MS43NiwyMTkuOTU4NyBDIDE3MS43NiwyMTkuOTU4NyAxNzEuNDgxLDIyMC41NDQ3IDE3MC42OTUsMjIwLjY3NDcgQyAxNjkuOTEsMjIwLjgwODcgMTY5LjIzOSwyMjAuMDY0NyAxNjkuMjM5LDIyMC4wNjQ3IEMgMTY5LjIzOSwyMjAuMDY0NyAxNjguNzg5LDIyMC43ODM3IDE2OC4yNTYsMjIwLjk3MDcgQyAxNjcuNzI0LDIyMS4xNTc3IDE2Ny4wMiwyMjAuNzAyNyAxNjcuMDIsMjIwLjcwMjcgQyAxNjcuMDIsMjIwLjcwMjcgMTY2LjkwOCwyMjAuOTcwNyAxNjYuODI2LDIyMS4xMjk3IEMgMTY2Ljc0MSwyMjEuMjg4NyAxNjYuNTE3LDIyMS4zMTY3IDE2Ni41MTcsMjIxLjMxNjcgTCAxNjYuNjkyLDIyMS43OTI3IEMgMTY4LjYxNywyMjEuMjM1NyAxNzEuMjI0LDIyMC44ODk3IDE3NC4xNzMsMjIwLjg4NjcgQyAxNzcuMTI2LDIyMC44ODk3IDE3OS44MDQsMjIxLjIzNTcgMTgxLjczMywyMjEuNzk2NyBMIDE4MS45MywyMjEuMjYzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTI3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxODEuOTIzLDIyMS4yNjM3IEwgMTgxLjMzMSwyMjAuNzMxNyBDIDE4MS4zMzEsMjIwLjczMTcgMTgwLjc3MiwyMjEuMDc2NyAxODAuMDY4LDIyMC45NzA3IEMgMTc5LjM2OCwyMjAuODY1NyAxNzkuMTQxLDIyMC4wMTU3IDE3OS4xNDEsMjIwLjAxNTcgQyAxNzkuMTQxLDIyMC4wMTU3IDE3OC4zNTUsMjIwLjY3NDcgMTc3LjcxMSwyMjAuNjI1NyBDIDE3Ny4wNjcsMjIwLjU2ODcgMTc2LjY0NiwyMjAuMDE1NyAxNzYuNjQ2LDIyMC4wMTU3IEMgMTc2LjY0NiwyMjAuMDE1NyAxNzUuOTQ2LDIyMC41MTU3IDE3NS4zMjgsMjIwLjQ2NjcgQyAxNzQuNzEsMjIwLjQxMDcgMTc0LjEyMSwyMTkuNjQxNyAxNzQuMTIxLDIxOS42NDE3IEMgMTc0LjEyMSwyMTkuNjQxNyAxNzMuNTAzLDIyMC40Mzg3IDE3Mi44ODUsMjIwLjQ5NDcgQyAxNzIuMjY3LDIyMC41NDQ3IDE3MS43NiwyMTkuOTU4NyAxNzEuNzYsMjE5Ljk1ODcgQyAxNzEuNzYsMjE5Ljk1ODcgMTcxLjQ4MSwyMjAuNTQ0NyAxNzAuNjk1LDIyMC42NzQ3IEMgMTY5LjkxLDIyMC44MDg3IDE2OS4yMzksMjIwLjA2NDcgMTY5LjIzOSwyMjAuMDY0NyBDIDE2OS4yMzksMjIwLjA2NDcgMTY4Ljc4OSwyMjAuNzgzNyAxNjguMjU2LDIyMC45NzA3IEMgMTY3LjcyNCwyMjEuMTU3NyAxNjcuMDIsMjIwLjcwMjcgMTY3LjAyLDIyMC43MDI3IEMgMTY3LjAyLDIyMC43MDI3IDE2Ni45MDgsMjIwLjk3MDcgMTY2LjgyNiwyMjEuMTI5NyBDIDE2Ni43NDEsMjIxLjI4ODcgMTY2LjUxNywyMjEuMzE2NyAxNjYuNTE3LDIyMS4zMTY3IEwgMTY2LjY5MiwyMjEuNzkyNyBDIDE2OC42MTcsMjIxLjIzNTcgMTcxLjIyNCwyMjAuODg5NyAxNzQuMTczLDIyMC44ODY3IEMgMTc3LjEyNiwyMjAuODg5NyAxNzkuODA0LDIyMS4yMzU3IDE4MS43MzMsMjIxLjc5NjcgTCAxODEuOTMsMjIxLjI2MzcgTCAxODEuOTIzLDIyMS4yNjM3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5MjkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTc0LjE4MSwyMTguNjkyNyBMIDE3NC40NiwyMTguNzQyNyBDIDE3NC40MTUsMjE4Ljg1ODcgMTc0LjQwNCwyMTguOTgxNyAxNzQuNDA0LDIxOS4xMTI3IEMgMTc0LjQwNCwyMTkuNjkwNyAxNzQuODk5LDIyMC4xNTk3IDE3NS41MTQsMjIwLjE1OTcgQyAxNzYuMDA1LDIyMC4xNTk3IDE3Ni40MTksMjE5Ljg1NjcgMTc2LjU2NCwyMTkuNDM2NyBDIDE3Ni41ODMsMjE5LjQ0NzcgMTc2LjY3MiwyMTkuMDU1NyAxNzYuNzE3LDIxOS4wNjI3IEMgMTc2Ljc1LDIxOS4wNjI3IDE3Ni43NDYsMjE5LjQ2ODcgMTc2Ljc2NSwyMTkuNDYxNyBDIDE3Ni44MzIsMjE5Ljk4NjcgMTc3LjMxNiwyMjAuMzQ2NyAxNzcuODYsMjIwLjM0NjcgQyAxNzguNDcxLDIyMC4zNDY3IDE3OC45NjEsMjE5Ljg3NzcgMTc4Ljk2MSwyMTkuMjk5NyBDIDE3OC45NjEsMjE5LjI1NjcgMTc4Ljk2MSwyMTkuMjE0NyAxNzguOTU1LDIxOS4xNzI3IEwgMTc5LjMwMSwyMTguODI2NyBMIDE3OS40OTEsMjE5LjI2NzcgQyAxNzkuNDEzLDIxOS40MDE3IDE3OS4zODcsMjE5LjU1NjcgMTc5LjM4NywyMTkuNzIyNyBDIDE3OS4zODcsMjIwLjI3NjcgMTc5Ljg2LDIyMC43MjQ3IDE4MC40NCwyMjAuNzI0NyBDIDE4MC44MDksMjIwLjcyNDcgMTgxLjEyOSwyMjAuNTQ0NyAxODEuMzE5LDIyMC4yNzY3IEwgMTgxLjU0MywyMTkuOTk0NyBMIDE4MS41MzksMjIwLjM0MzcgQyAxODEuNTM5LDIyMC42ODg3IDE4MS42ODgsMjIwLjk5OTcgMTgyLjAyNywyMjEuMDU1NyBDIDE4Mi4wMjcsMjIxLjA1NTcgMTgyLjQxLDIyMS4wODM3IDE4Mi45MzIsMjIwLjY3NDcgQyAxODMuNDQ2LDIyMC4yNjk3IDE4My43MjksMjE5LjkzMDcgMTgzLjcyOSwyMTkuOTMwNyBMIDE4My43NjEsMjIwLjM0NjcgQyAxODMuNzYxLDIyMC4zNDY3IDE4My4yNTYsMjIxLjE3ODcgMTgyLjc5NCwyMjEuNDQzNyBDIDE4Mi41NDQsMjIxLjU5MTcgMTgyLjE1NiwyMjEuNzQ2NyAxODEuODUyLDIyMS42OTM3IEMgMTgxLjUzMiwyMjEuNjQ0NyAxODEuMzAxLDIyMS4zODM3IDE4MS4xODEsMjIxLjA4NzcgQyAxODAuOTU0LDIyMS4yMjQ3IDE4MC42ODMsMjIxLjMwMjcgMTgwLjM5MiwyMjEuMzAyNyBDIDE3OS43NjYsMjIxLjMwMjcgMTc5LjIwNCwyMjAuOTU2NyAxNzguOTgxLDIyMC40NDU3IEMgMTc4LjY5NCwyMjAuNzU1NyAxNzguMjk2LDIyMC45NDI3IDE3Ny44MjYsMjIwLjk0MjcgQyAxNzcuMzI3LDIyMC45NDI3IDE3Ni44NjksMjIwLjcyMDcgMTc2LjU4MywyMjAuMzcxNyBDIDE3Ni4zLDIyMC42MzI3IDE3NS45MTYsMjIwLjc5MTcgMTc1LjQ5NSwyMjAuNzkxNyBDIDE3NC45NDQsMjIwLjc5MTcgMTc0LjQ0OSwyMjAuNTE1NyAxNzQuMTcsMjIwLjExMDcgQyAxNzMuODksMjIwLjUxNTcgMTczLjM5OSwyMjAuNzkxNyAxNzIuODQ4LDIyMC43OTE3IEMgMTcyLjQyNywyMjAuNzkxNyAxNzIuMDQzLDIyMC42MzI3IDE3MS43NiwyMjAuMzcxNyBDIDE3MS40NzQsMjIwLjcyMDcgMTcxLjAxNSwyMjAuOTQyNyAxNzAuNTE2LDIyMC45NDI3IEMgMTcwLjA0NywyMjAuOTQyNyAxNjkuNjQ5LDIyMC43NTU3IDE2OS4zNjIsMjIwLjQ0NTcgQyAxNjkuMTM5LDIyMC45NTM3IDE2OC41NzYsMjIxLjMwMjcgMTY3Ljk1MSwyMjEuMzAyNyBDIDE2Ny42NiwyMjEuMzAyNyAxNjcuMzg4LDIyMS4yMjQ3IDE2Ny4xNjEsMjIxLjA4NzcgQyAxNjcuMDQyLDIyMS4zODM3IDE2Ni44MTEsMjIxLjY0NDcgMTY2LjQ5MSwyMjEuNjkzNyBDIDE2Ni4xODYsMjIxLjc0NjcgMTY1LjgwMiwyMjEuNTkxNyAxNjUuNTQ5LDIyMS40NDM3IEMgMTY1LjA4NywyMjEuMTc4NyAxNjQuNTQzLDIyMC4zNDY3IDE2NC41NDMsMjIwLjM0NjcgTCAxNjQuNjE0LDIxOS45MzA3IEMgMTY0LjYxNCwyMTkuOTMwNyAxNjQuOTAxLDIyMC4yNjk3IDE2NS40MTEsMjIwLjY3NDcgQyAxNjUuOTI5LDIyMS4wODM3IDE2Ni4zMTYsMjIxLjA1NTcgMTY2LjMxNiwyMjEuMDU1NyBDIDE2Ni42NTUsMjIwLjk5OTcgMTY2LjgwNCwyMjAuNjg4NyAxNjYuODA0LDIyMC4zNDM3IEwgMTY2LjgsMjE5Ljk5NDcgTCAxNjcuMDIzLDIyMC4yNzY3IEMgMTY3LjIxMywyMjAuNTQ0NyAxNjcuNTM0LDIyMC43MjQ3IDE2Ny45MDIsMjIwLjcyNDcgQyAxNjguNDgzLDIyMC43MjQ3IDE2OC45NTYsMjIwLjI3NjcgMTY4Ljk1NiwyMTkuNzIyNyBDIDE2OC45NTYsMjE5LjU1NjcgMTY4LjkzLDIxOS40MDE3IDE2OC44NTYsMjE5LjI2NzcgTCAxNjkuMDQyLDIxOC44MjY3IEwgMTY5LjM4OCwyMTkuMTcyNyBDIDE2OS4zODEsMjE5LjIxNDcgMTY5LjM3NywyMTkuMjU2NyAxNjkuMzc3LDIxOS4yOTk3IEMgMTY5LjM3NywyMTkuODc3NyAxNjkuODY5LDIyMC4zNDY3IDE3MC40ODMsMjIwLjM0NjcgQyAxNzEuMDI3LDIyMC4zNDY3IDE3MS41MDcsMjE5Ljk4NjcgMTcxLjU3OCwyMTkuNDYxNyBDIDE3MS41OTMsMjE5LjQ2ODcgMTcxLjU4OSwyMTkuMDYyNyAxNzEuNjI2LDIxOS4wNjI3IEMgMTcxLjY3MSwyMTkuMDU1NyAxNzEuNzY0LDIxOS40NDc3IDE3MS43NzksMjE5LjQzNjcgQyAxNzEuOTI0LDIxOS44NTY3IDE3Mi4zNDEsMjIwLjE1OTcgMTcyLjgzMywyMjAuMTU5NyBDIDE3My40NDMsMjIwLjE1OTcgMTczLjkzOSwyMTkuNjkwNyAxNzMuOTM5LDIxOS4xMTI3IEMgMTczLjkzOSwyMTguOTgxNyAxNzMuOTMxLDIxOC44NTg3IDE3My44ODMsMjE4Ljc0MjcgTCAxNzQuMTczLDIxOC42OTI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5MzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2O3N0cm9rZS1saW5lam9pbjptaXRlciIKLSAgICAgICAgICAgZD0iTSAxNzQuMTgxLDIxOC42OTI3IEwgMTc0LjQ2LDIxOC43NDI3IEMgMTc0LjQxNSwyMTguODU4NyAxNzQuNDA0LDIxOC45ODE3IDE3NC40MDQsMjE5LjExMjcgQyAxNzQuNDA0LDIxOS42OTA3IDE3NC44OTksMjIwLjE1OTcgMTc1LjUxNCwyMjAuMTU5NyBDIDE3Ni4wMDUsMjIwLjE1OTcgMTc2LjQxOSwyMTkuODU2NyAxNzYuNTY0LDIxOS40MzY3IEMgMTc2LjU4MywyMTkuNDQ3NyAxNzYuNjcyLDIxOS4wNTU3IDE3Ni43MTcsMjE5LjA2MjcgQyAxNzYuNzUsMjE5LjA2MjcgMTc2Ljc0NiwyMTkuNDY4NyAxNzYuNzY1LDIxOS40NjE3IEMgMTc2LjgzMiwyMTkuOTg2NyAxNzcuMzE2LDIyMC4zNDY3IDE3Ny44NiwyMjAuMzQ2NyBDIDE3OC40NzEsMjIwLjM0NjcgMTc4Ljk2MSwyMTkuODc3NyAxNzguOTYxLDIxOS4yOTk3IEMgMTc4Ljk2MSwyMTkuMjU2NyAxNzguOTYxLDIxOS4yMTQ3IDE3OC45NTUsMjE5LjE3MjcgTCAxNzkuMzAxLDIxOC44MjY3IEwgMTc5LjQ5MSwyMTkuMjY3NyBDIDE3OS40MTMsMjE5LjQwMTcgMTc5LjM4NywyMTkuNTU2NyAxNzkuMzg3LDIxOS43MjI3IEMgMTc5LjM4NywyMjAuMjc2NyAxNzkuODYsMjIwLjcyNDcgMTgwLjQ0LDIyMC43MjQ3IEMgMTgwLjgwOSwyMjAuNzI0NyAxODEuMTI5LDIyMC41NDQ3IDE4MS4zMTksMjIwLjI3NjcgTCAxODEuNTQzLDIxOS45OTQ3IEwgMTgxLjUzOSwyMjAuMzQzNyBDIDE4MS41MzksMjIwLjY4ODcgMTgxLjY4OCwyMjAuOTk5NyAxODIuMDI3LDIyMS4wNTU3IEMgMTgyLjAyNywyMjEuMDU1NyAxODIuNDEsMjIxLjA4MzcgMTgyLjkzMiwyMjAuNjc0NyBDIDE4My40NDYsMjIwLjI2OTcgMTgzLjcyOSwyMTkuOTMwNyAxODMuNzI5LDIxOS45MzA3IEwgMTgzLjc2MSwyMjAuMzQ2NyBDIDE4My43NjEsMjIwLjM0NjcgMTgzLjI1NiwyMjEuMTc4NyAxODIuNzk0LDIyMS40NDM3IEMgMTgyLjU0NCwyMjEuNTkxNyAxODIuMTU2LDIyMS43NDY3IDE4MS44NTIsMjIxLjY5MzcgQyAxODEuNTMyLDIyMS42NDQ3IDE4MS4zMDEsMjIxLjM4MzcgMTgxLjE4MSwyMjEuMDg3NyBDIDE4MC45NTQsMjIxLjIyNDcgMTgwLjY4MywyMjEuMzAyNyAxODAuMzkyLDIyMS4zMDI3IEMgMTc5Ljc2NiwyMjEuMzAyNyAxNzkuMjA0LDIyMC45NTY3IDE3OC45ODEsMjIwLjQ0NTcgQyAxNzguNjk0LDIyMC43NTU3IDE3OC4yOTYsMjIwLjk0MjcgMTc3LjgyNiwyMjAuOTQyNyBDIDE3Ny4zMjcsMjIwLjk0MjcgMTc2Ljg2OSwyMjAuNzIwNyAxNzYuNTgzLDIyMC4zNzE3IEMgMTc2LjMsMjIwLjYzMjcgMTc1LjkxNiwyMjAuNzkxNyAxNzUuNDk1LDIyMC43OTE3IEMgMTc0Ljk0NCwyMjAuNzkxNyAxNzQuNDQ5LDIyMC41MTU3IDE3NC4xNywyMjAuMTEwNyBDIDE3My44OSwyMjAuNTE1NyAxNzMuMzk5LDIyMC43OTE3IDE3Mi44NDgsMjIwLjc5MTcgQyAxNzIuNDI3LDIyMC43OTE3IDE3Mi4wNDMsMjIwLjYzMjcgMTcxLjc2LDIyMC4zNzE3IEMgMTcxLjQ3NCwyMjAuNzIwNyAxNzEuMDE1LDIyMC45NDI3IDE3MC41MTYsMjIwLjk0MjcgQyAxNzAuMDQ3LDIyMC45NDI3IDE2OS42NDksMjIwLjc1NTcgMTY5LjM2MiwyMjAuNDQ1NyBDIDE2OS4xMzksMjIwLjk1MzcgMTY4LjU3NiwyMjEuMzAyNyAxNjcuOTUxLDIyMS4zMDI3IEMgMTY3LjY2LDIyMS4zMDI3IDE2Ny4zODgsMjIxLjIyNDcgMTY3LjE2MSwyMjEuMDg3NyBDIDE2Ny4wNDIsMjIxLjM4MzcgMTY2LjgxMSwyMjEuNjQ0NyAxNjYuNDkxLDIyMS42OTM3IEMgMTY2LjE4NiwyMjEuNzQ2NyAxNjUuODAyLDIyMS41OTE3IDE2NS41NDksMjIxLjQ0MzcgQyAxNjUuMDg3LDIyMS4xNzg3IDE2NC41NDMsMjIwLjM0NjcgMTY0LjU0MywyMjAuMzQ2NyBMIDE2NC42MTQsMjE5LjkzMDcgQyAxNjQuNjE0LDIxOS45MzA3IDE2NC45MDEsMjIwLjI2OTcgMTY1LjQxMSwyMjAuNjc0NyBDIDE2NS45MjksMjIxLjA4MzcgMTY2LjMxNiwyMjEuMDU1NyAxNjYuMzE2LDIyMS4wNTU3IEMgMTY2LjY1NSwyMjAuOTk5NyAxNjYuODA0LDIyMC42ODg3IDE2Ni44MDQsMjIwLjM0MzcgTCAxNjYuOCwyMTkuOTk0NyBMIDE2Ny4wMjMsMjIwLjI3NjcgQyAxNjcuMjEzLDIyMC41NDQ3IDE2Ny41MzQsMjIwLjcyNDcgMTY3LjkwMiwyMjAuNzI0NyBDIDE2OC40ODMsMjIwLjcyNDcgMTY4Ljk1NiwyMjAuMjc2NyAxNjguOTU2LDIxOS43MjI3IEMgMTY4Ljk1NiwyMTkuNTU2NyAxNjguOTMsMjE5LjQwMTcgMTY4Ljg1NiwyMTkuMjY3NyBMIDE2OS4wNDIsMjE4LjgyNjcgTCAxNjkuMzg4LDIxOS4xNzI3IEMgMTY5LjM4MSwyMTkuMjE0NyAxNjkuMzc3LDIxOS4yNTY3IDE2OS4zNzcsMjE5LjI5OTcgQyAxNjkuMzc3LDIxOS44Nzc3IDE2OS44NjksMjIwLjM0NjcgMTcwLjQ4MywyMjAuMzQ2NyBDIDE3MS4wMjcsMjIwLjM0NjcgMTcxLjUwNywyMTkuOTg2NyAxNzEuNTc4LDIxOS40NjE3IEMgMTcxLjU5MywyMTkuNDY4NyAxNzEuNTg5LDIxOS4wNjI3IDE3MS42MjYsMjE5LjA2MjcgQyAxNzEuNjcxLDIxOS4wNTU3IDE3MS43NjQsMjE5LjQ0NzcgMTcxLjc3OSwyMTkuNDM2NyBDIDE3MS45MjQsMjE5Ljg1NjcgMTcyLjM0MSwyMjAuMTU5NyAxNzIuODMzLDIyMC4xNTk3IEMgMTczLjQ0MywyMjAuMTU5NyAxNzMuOTM5LDIxOS42OTA3IDE3My45MzksMjE5LjExMjcgQyAxNzMuOTM5LDIxOC45ODE3IDE3My45MzEsMjE4Ljg1ODcgMTczLjg4MywyMTguNzQyNyBMIDE3NC4xNzMsMjE4LjY5MjcgTCAxNzQuMTgxLDIxOC42OTI3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5MzMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTc0LjE2NiwyMjEuNDE1NyBDIDE3MS4xNzIsMjIxLjQxODcgMTY4LjQ4LDIyMS43NzQ3IDE2Ni41NTEsMjIyLjM0NjcgQyAxNjYuNDIsMjIyLjM4ODcgMTY2LjI2LDIyMi4yODk3IDE2Ni4yMTksMjIyLjE3MzcgQyAxNjYuMTc4LDIyMi4wNTA3IDE2Ni4yNzEsMjIxLjg5ODcgMTY2LjM5OCwyMjEuODU2NyBDIDE2OC4zMzgsMjIxLjI2MzcgMTcxLjA5NywyMjAuODg5NyAxNzQuMTY2LDIyMC44ODY3IEMgMTc3LjIzMSwyMjAuODg5NyAxODAuMDAxLDIyMS4yNjM3IDE4MS45NDEsMjIxLjg1NjcgQyAxODIuMDY4LDIyMS44OTg3IDE4Mi4xNjEsMjIyLjA1MDcgMTgyLjEyLDIyMi4xNzM3IEMgMTgyLjA4MywyMjIuMjg5NyAxODEuOTE5LDIyMi4zODg3IDE4MS43OTIsMjIyLjM0NjcgQyAxNzkuODYsMjIxLjc3NDcgMTc3LjE1NiwyMjEuNDE4NyAxNzQuMTY2LDIyMS40MTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5MzUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAxNzQuMTY2LDIyMS40MTU3IEMgMTcxLjE3MiwyMjEuNDE4NyAxNjguNDgsMjIxLjc3NDcgMTY2LjU1MSwyMjIuMzQ2NyBDIDE2Ni40MiwyMjIuMzg4NyAxNjYuMjYsMjIyLjI4OTcgMTY2LjIxOSwyMjIuMTczNyBDIDE2Ni4xNzgsMjIyLjA1MDcgMTY2LjI3MSwyMjEuODk4NyAxNjYuMzk4LDIyMS44NTY3IEMgMTY4LjMzOCwyMjEuMjYzNyAxNzEuMDk3LDIyMC44ODk3IDE3NC4xNjYsMjIwLjg4NjcgQyAxNzcuMjMxLDIyMC44ODk3IDE4MC4wMDEsMjIxLjI2MzcgMTgxLjk0MSwyMjEuODU2NyBDIDE4Mi4wNjgsMjIxLjg5ODcgMTgyLjE2MSwyMjIuMDUwNyAxODIuMTIsMjIyLjE3MzcgQyAxODIuMDgzLDIyMi4yODk3IDE4MS45MTksMjIyLjM4ODcgMTgxLjc5MiwyMjIuMzQ2NyBDIDE3OS44NiwyMjEuNzc0NyAxNzcuMTU2LDIyMS40MTg3IDE3NC4xNjYsMjIxLjQxNTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkzNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAxNzEuMjY5LDIyMi40NzY3IEMgMTcxLjI2OSwyMjIuMjUxNyAxNzEuNDYyLDIyMi4wNjc3IDE3MS43MDQsMjIyLjA2NzcgQyAxNzEuOTQzLDIyMi4wNjc3IDE3Mi4xMzYsMjIyLjI1MTcgMTcyLjEzNiwyMjIuNDc2NyBDIDE3Mi4xMzYsMjIyLjcwNTcgMTcxLjk0MywyMjIuODg1NyAxNzEuNzA0LDIyMi44ODU3IEMgMTcxLjQ2MiwyMjIuODg1NyAxNzEuMjY5LDIyMi43MDU3IDE3MS4yNjksMjIyLjQ3NjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDkzOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTcxLjI2OSwyMjIuNDc2NyBDIDE3MS4yNjksMjIyLjI1MTcgMTcxLjQ2MiwyMjIuMDY3NyAxNzEuNzA0LDIyMi4wNjc3IEMgMTcxLjk0MywyMjIuMDY3NyAxNzIuMTM2LDIyMi4yNTE3IDE3Mi4xMzYsMjIyLjQ3NjcgQyAxNzIuMTM2LDIyMi43MDU3IDE3MS45NDMsMjIyLjg4NTcgMTcxLjcwNCwyMjIuODg1NyBDIDE3MS40NjIsMjIyLjg4NTcgMTcxLjI2OSwyMjIuNzA1NyAxNzEuMjY5LDIyMi40NzY3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5NDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMTc0LjE5OSwyMjIuNjUzNyBMIDE3My4yMzksMjIyLjY1MzcgQyAxNzMuMDYsMjIyLjY1MzcgMTcyLjkxMSwyMjIuNTEyNyAxNzIuOTExLDIyMi4zNDI3IEMgMTcyLjkxMSwyMjIuMTc2NyAxNzMuMDU2LDIyMi4wMzk3IDE3My4yMzEsMjIyLjAzOTcgTCAxNzUuMTgyLDIyMi4wMzk3IEMgMTc1LjM2MSwyMjIuMDM5NyAxNzUuNTAzLDIyMi4xNzY3IDE3NS41MDMsMjIyLjM0MjcgQyAxNzUuNTAzLDIyMi41MTI3IDE3NS4zNTcsMjIyLjY1MzcgMTc1LjE3OSwyMjIuNjUzNyBMIDE3NC4xOTksMjIyLjY1MzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk0MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTc0LjE5OSwyMjIuNjUzNyBMIDE3My4yMzksMjIyLjY1MzcgQyAxNzMuMDYsMjIyLjY1MzcgMTcyLjkxMSwyMjIuNTEyNyAxNzIuOTExLDIyMi4zNDI3IEMgMTcyLjkxMSwyMjIuMTc2NyAxNzMuMDU2LDIyMi4wMzk3IDE3My4yMzEsMjIyLjAzOTcgTCAxNzUuMTgyLDIyMi4wMzk3IEMgMTc1LjM2MSwyMjIuMDM5NyAxNzUuNTAzLDIyMi4xNzY3IDE3NS41MDMsMjIyLjM0MjcgQyAxNzUuNTAzLDIyMi41MTI3IDE3NS4zNTcsMjIyLjY1MzcgMTc1LjE3OSwyMjIuNjUzNyBMIDE3NC4xOTksMjIyLjY1MzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk0NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6IzA1OGU2ZSIKLSAgICAgICAgICAgZD0iTSAxNjkuMzc3LDIyMi45ODQ3IEwgMTY4LjY4OCwyMjMuMDg2NyBDIDE2OC41MTMsMjIzLjExMTcgMTY4LjM0MiwyMjIuOTk4NyAxNjguMzE2LDIyMi44Mjk3IEMgMTY4LjI5LDIyMi42NjM3IDE2OC40MDksMjIyLjUwODcgMTY4LjU4NCwyMjIuNDgzNyBMIDE2OS4yNzYsMjIyLjM4MTcgTCAxNjkuOTg0LDIyMi4yNzI3IEMgMTcwLjE1OSwyMjIuMjUxNyAxNzAuMzIzLDIyMi4zNjA3IDE3MC4zNTMsMjIyLjUyNjcgQyAxNzAuMzc1LDIyMi42OTE3IDE3MC4yNTYsMjIyLjg1MDcgMTcwLjA4MSwyMjIuODc1NyBMIDE2OS4zNzcsMjIyLjk4NDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk0NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTY5LjM3NywyMjIuOTg0NyBMIDE2OC42ODgsMjIzLjA4NjcgQyAxNjguNTEzLDIyMy4xMTE3IDE2OC4zNDIsMjIyLjk5ODcgMTY4LjMxNiwyMjIuODI5NyBDIDE2OC4yOSwyMjIuNjYzNyAxNjguNDA5LDIyMi41MDg3IDE2OC41ODQsMjIyLjQ4MzcgTCAxNjkuMjc2LDIyMi4zODE3IEwgMTY5Ljk4NCwyMjIuMjcyNyBDIDE3MC4xNTksMjIyLjI1MTcgMTcwLjMyMywyMjIuMzYwNyAxNzAuMzUzLDIyMi41MjY3IEMgMTcwLjM3NSwyMjIuNjkxNyAxNzAuMjU2LDIyMi44NTA3IDE3MC4wODEsMjIyLjg3NTcgTCAxNjkuMzc3LDIyMi45ODQ3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5NDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMTY2LjU5NSwyMjMuNDY3NyBMIDE2Ni45MDEsMjIyLjk3NDcgTCAxNjcuNTUyLDIyMy4wOTc3IEwgMTY3LjE3MiwyMjMuNjUxNyBMIDE2Ni41OTUsMjIzLjQ2NzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk1MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTY2LjU5NSwyMjMuNDY3NyBMIDE2Ni45MDEsMjIyLjk3NDcgTCAxNjcuNTUyLDIyMy4wOTc3IEwgMTY3LjE3MiwyMjMuNjUxNyBMIDE2Ni41OTUsMjIzLjQ2NzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk1MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAxNzYuMTk5LDIyMi40NzY3IEMgMTc2LjE5OSwyMjIuMjUxNyAxNzYuMzkzLDIyMi4wNjc3IDE3Ni42MzUsMjIyLjA2NzcgQyAxNzYuODczLDIyMi4wNjc3IDE3Ny4wNjcsMjIyLjI1MTcgMTc3LjA2NywyMjIuNDc2NyBDIDE3Ny4wNjcsMjIyLjcwNTcgMTc2Ljg3MywyMjIuODg1NyAxNzYuNjM1LDIyMi44ODU3IEMgMTc2LjM5MywyMjIuODg1NyAxNzYuMTk5LDIyMi43MDU3IDE3Ni4xOTksMjIyLjQ3NjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk1NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTc2LjE5OSwyMjIuNDc2NyBDIDE3Ni4xOTksMjIyLjI1MTcgMTc2LjM5MywyMjIuMDY3NyAxNzYuNjM1LDIyMi4wNjc3IEMgMTc2Ljg3MywyMjIuMDY3NyAxNzcuMDY3LDIyMi4yNTE3IDE3Ny4wNjcsMjIyLjQ3NjcgQyAxNzcuMDY3LDIyMi43MDU3IDE3Ni44NzMsMjIyLjg4NTcgMTc2LjYzNSwyMjIuODg1NyBDIDE3Ni4zOTMsMjIyLjg4NTcgMTc2LjE5OSwyMjIuNzA1NyAxNzYuMTk5LDIyMi40NzY3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5NTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwNThlNmUiCi0gICAgICAgICAgIGQ9Ik0gMTc4Ljk1OCwyMjIuOTg0NyBMIDE3OS42NTEsMjIzLjA4NjcgQyAxNzkuODI2LDIyMy4xMTE3IDE3OS45OSwyMjIuOTk4NyAxODAuMDIsMjIyLjgyOTcgQyAxODAuMDQ2LDIyMi42NjM3IDE3OS45MywyMjIuNTA4NyAxNzkuNzU1LDIyMi40ODM3IEwgMTc5LjA1OSwyMjIuMzgxNyBMIDE3OC4zNTUsMjIyLjI3MjcgQyAxNzguMTc2LDIyMi4yNTE3IDE3OC4wMTMsMjIyLjM2MDcgMTc3Ljk4NiwyMjIuNTI2NyBDIDE3Ny45NTcsMjIyLjY5MTcgMTc4LjA4LDIyMi44NTA3IDE3OC4yNTgsMjIyLjg3NTcgTCAxNzguOTU4LDIyMi45ODQ3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5NTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE3OC45NTgsMjIyLjk4NDcgTCAxNzkuNjUxLDIyMy4wODY3IEMgMTc5LjgyNiwyMjMuMTExNyAxNzkuOTksMjIyLjk5ODcgMTgwLjAyLDIyMi44Mjk3IEMgMTgwLjA0NiwyMjIuNjYzNyAxNzkuOTMsMjIyLjUwODcgMTc5Ljc1NSwyMjIuNDgzNyBMIDE3OS4wNTksMjIyLjM4MTcgTCAxNzguMzU1LDIyMi4yNzI3IEMgMTc4LjE3NiwyMjIuMjUxNyAxNzguMDEzLDIyMi4zNjA3IDE3Ny45ODYsMjIyLjUyNjcgQyAxNzcuOTU3LDIyMi42OTE3IDE3OC4wOCwyMjIuODUwNyAxNzguMjU4LDIyMi44NzU3IEwgMTc4Ljk1OCwyMjIuOTg0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTYxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDE4MS42ODQsMjIzLjQ5NTcgTCAxODEuNDM4LDIyMi45NzA3IEwgMTgwLjc2OCwyMjMuMDI2NyBMIDE4MS4wODgsMjIzLjYxNTcgTCAxODEuNjg0LDIyMy40OTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5NjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE4MS42ODQsMjIzLjQ5NTcgTCAxODEuNDM4LDIyMi45NzA3IEwgMTgwLjc2OCwyMjMuMDI2NyBMIDE4MS4wODgsMjIzLjYxNTcgTCAxODEuNjg0LDIyMy40OTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5NjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMTc0LjE1OCwyMjUuMzE1NyBDIDE3MS43NDIsMjI1LjMxMjcgMTY5LjU1NiwyMjUuMTAwNyAxNjcuODk1LDIyNC42NzA3IEMgMTY5LjU1NiwyMjQuMjQzNyAxNzEuNzQyLDIyMy45Nzk3IDE3NC4xNTgsMjIzLjk3MjcgQyAxNzYuNTc1LDIyMy45NzU3IDE3OC43NzIsMjI0LjI0MDcgMTgwLjQzNywyMjQuNjcwNyBDIDE3OC43NzIsMjI1LjEwMDcgMTc2LjU3NSwyMjUuMzEyNyAxNzQuMTU4LDIyNS4zMTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5NjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAxNzQuMTU4LDIyNS4zMTU3IEMgMTcxLjc0MiwyMjUuMzEyNyAxNjkuNTU2LDIyNS4xMDA3IDE2Ny44OTUsMjI0LjY3MDcgQyAxNjkuNTU2LDIyNC4yNDM3IDE3MS43NDIsMjIzLjk3OTcgMTc0LjE1OCwyMjMuOTcyNyBDIDE3Ni41NzUsMjIzLjk3NTcgMTc4Ljc3MiwyMjQuMjQwNyAxODAuNDM3LDIyNC42NzA3IEMgMTc4Ljc3MiwyMjUuMTAwNyAxNzYuNTc1LDIyNS4zMTI3IDE3NC4xNTgsMjI1LjMxNTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk2OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxODEuNzgxLDIyMC4wNzU3IEMgMTgxLjg0NCwyMTkuODg4NyAxODEuNzg1LDIxOS43MDQ3IDE4MS42NTEsMjE5LjY1ODcgQyAxODEuNTE3LDIxOS42MjA3IDE4MS4zNTMsMjE5Ljc0MDcgMTgxLjI5LDIxOS45MTk3IEMgMTgxLjIyNiwyMjAuMTEwNyAxODEuMjgyLDIyMC4yOTc3IDE4MS40MiwyMjAuMzM5NyBDIDE4MS41NTQsMjIwLjM3ODcgMTgxLjcxNCwyMjAuMjYyNyAxODEuNzgxLDIyMC4wNzU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5NzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE4MS43ODEsMjIwLjA3NTcgQyAxODEuODQ0LDIxOS44ODg3IDE4MS43ODUsMjE5LjcwNDcgMTgxLjY1MSwyMTkuNjU4NyBDIDE4MS41MTcsMjE5LjYyMDcgMTgxLjM1MywyMTkuNzQwNyAxODEuMjksMjE5LjkxOTcgQyAxODEuMjI2LDIyMC4xMTA3IDE4MS4yODIsMjIwLjI5NzcgMTgxLjQyLDIyMC4zMzk3IEMgMTgxLjU1NCwyMjAuMzc4NyAxODEuNzE0LDIyMC4yNjI3IDE4MS43ODEsMjIwLjA3NTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk3MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzYuOTcsMjE5LjE0NDcgQyAxNzYuOTkyLDIxOC45NTA3IDE3Ni44OTksMjE4Ljc3NzcgMTc2Ljc1OCwyMTguNzU5NyBDIDE3Ni42MTYsMjE4Ljc0MjcgMTc2LjQ4MiwyMTguODkwNyAxNzYuNDYsMjE5LjA4NDcgQyAxNzYuNDM0LDIxOS4yNzg3IDE3Ni41MjcsMjE5LjQ1MDcgMTc2LjY2OCwyMTkuNDY4NyBDIDE3Ni44MSwyMTkuNDgyNyAxNzYuOTQ0LDIxOS4zMzQ3IDE3Ni45NywyMTkuMTQ0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTc1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxNzYuOTcsMjE5LjE0NDcgQyAxNzYuOTkyLDIxOC45NTA3IDE3Ni44OTksMjE4Ljc3NzcgMTc2Ljc1OCwyMTguNzU5NyBDIDE3Ni42MTYsMjE4Ljc0MjcgMTc2LjQ4MiwyMTguODkwNyAxNzYuNDYsMjE5LjA4NDcgQyAxNzYuNDM0LDIxOS4yNzg3IDE3Ni41MjcsMjE5LjQ1MDcgMTc2LjY2OCwyMTkuNDY4NyBDIDE3Ni44MSwyMTkuNDgyNyAxNzYuOTQ0LDIxOS4zMzQ3IDE3Ni45NywyMTkuMTQ0NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTc3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE3MS4zOCwyMTkuMTQ0NyBDIDE3MS4zNTgsMjE4Ljk1MDcgMTcxLjQ1MSwyMTguNzc3NyAxNzEuNTkzLDIxOC43NTk3IEMgMTcxLjczNCwyMTguNzQyNyAxNzEuODY4LDIxOC44OTA3IDE3MS44OTQsMjE5LjA4NDcgQyAxNzEuOTE3LDIxOS4yNzg3IDE3MS44MjQsMjE5LjQ1MDcgMTcxLjY4MiwyMTkuNDY4NyBDIDE3MS41NDQsMjE5LjQ4MjcgMTcxLjQwNiwyMTkuMzM0NyAxNzEuMzgsMjE5LjE0NDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk3OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTcxLjM4LDIxOS4xNDQ3IEMgMTcxLjM1OCwyMTguOTUwNyAxNzEuNDUxLDIxOC43Nzc3IDE3MS41OTMsMjE4Ljc1OTcgQyAxNzEuNzM0LDIxOC43NDI3IDE3MS44NjgsMjE4Ljg5MDcgMTcxLjg5NCwyMTkuMDg0NyBDIDE3MS45MTcsMjE5LjI3ODcgMTcxLjgyNCwyMTkuNDUwNyAxNzEuNjgyLDIxOS40Njg3IEMgMTcxLjU0NCwyMTkuNDgyNyAxNzEuNDA2LDIxOS4zMzQ3IDE3MS4zOCwyMTkuMTQ0NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTgxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE2Ni41NjksMjIwLjA3NTcgQyAxNjYuNTA2LDIxOS44ODg3IDE2Ni41NjUsMjE5LjcwNDcgMTY2LjcsMjE5LjY1ODcgQyAxNjYuODM0LDIxOS42MjA3IDE2Ni45OTcsMjE5Ljc0MDcgMTY3LjA2MSwyMTkuOTE5NyBDIDE2Ny4xMjQsMjIwLjExMDcgMTY3LjA2OCwyMjAuMjk3NyAxNjYuOTMsMjIwLjMzOTcgQyAxNjYuNzk2LDIyMC4zNzg3IDE2Ni42MzYsMjIwLjI2MjcgMTY2LjU2OSwyMjAuMDc1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTgzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxNjYuNTY5LDIyMC4wNzU3IEMgMTY2LjUwNiwyMTkuODg4NyAxNjYuNTY1LDIxOS43MDQ3IDE2Ni43LDIxOS42NTg3IEMgMTY2LjgzNCwyMTkuNjIwNyAxNjYuOTk3LDIxOS43NDA3IDE2Ny4wNjEsMjE5LjkxOTcgQyAxNjcuMTI0LDIyMC4xMTA3IDE2Ny4wNjgsMjIwLjI5NzcgMTY2LjkzLDIyMC4zMzk3IEMgMTY2Ljc5NiwyMjAuMzc4NyAxNjYuNjM2LDIyMC4yNjI3IDE2Ni41NjksMjIwLjA3NTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk4NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzQuMTU4LDIxNi4zNjU3IEwgMTczLjMwNiwyMTYuODc5NyBMIDE3My45MzksMjE4LjI1MTcgTCAxNzQuMTU4LDIxOC4zOTY3IEwgMTc0LjM3NCwyMTguMjUxNyBMIDE3NS4wMTEsMjE2Ljg3OTcgTCAxNzQuMTU4LDIxNi4zNjU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDQ5ODciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE3NC4xNTgsMjE2LjM2NTcgTCAxNzMuMzA2LDIxNi44Nzk3IEwgMTczLjkzOSwyMTguMjUxNyBMIDE3NC4xNTgsMjE4LjM5NjcgTCAxNzQuMzc0LDIxOC4yNTE3IEwgMTc1LjAxMSwyMTYuODc5NyBMIDE3NC4xNTgsMjE2LjM2NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk4OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzIuMjkzLDIxOC40Mzg3IEwgMTcyLjY4LDIxOS4wMDM3IEwgMTc0LjAxMywyMTguNTkzNyBMIDE3NC4xNTEsMjE4LjQwNzcgTCAxNzQuMDA5LDIxOC4yMTY3IEwgMTcyLjY4LDIxNy44Mjg3IEwgMTcyLjI5MywyMTguNDM4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTkxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxNzIuMjkzLDIxOC40Mzg3IEwgMTcyLjY4LDIxOS4wMDM3IEwgMTc0LjAxMywyMTguNTkzNyBMIDE3NC4xNTEsMjE4LjQwNzcgTCAxNzQuMDA5LDIxOC4yMTY3IEwgMTcyLjY4LDIxNy44Mjg3IEwgMTcyLjI5MywyMTguNDM4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTkzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE3Ni4wMzUsMjE4LjQzODcgTCAxNzUuNjQ4LDIxOS4wMDM3IEwgMTc0LjMxNSwyMTguNTkzNyBMIDE3NC4xNzMsMjE4LjQwNzcgTCAxNzQuMzE4LDIxOC4yMTY3IEwgMTc1LjY0OCwyMTcuODI4NyBMIDE3Ni4wMzUsMjE4LjQzODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk5NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTc2LjAzNSwyMTguNDM4NyBMIDE3NS42NDgsMjE5LjAwMzcgTCAxNzQuMzE1LDIxOC41OTM3IEwgMTc0LjE3MywyMTguNDA3NyBMIDE3NC4zMTgsMjE4LjIxNjcgTCAxNzUuNjQ4LDIxNy44Mjg3IEwgMTc2LjAzNSwyMTguNDM4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg0OTk3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE2OC42MTcsMjE2Ljk3NTcgTCAxNjcuOTQ3LDIxNy42MDY3IEwgMTY4LjgwMywyMTguNzM1NyBMIDE2OS4wMzEsMjE4LjgyNjcgTCAxNjkuMTk4LDIxOC42NTM3IEwgMTY5LjQ5NiwyMTcuMjg5NyBMIDE2OC42MTcsMjE2Ljk3NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNDk5OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTY4LjYxNywyMTYuOTc1NyBMIDE2Ny45NDcsMjE3LjYwNjcgTCAxNjguODAzLDIxOC43MzU3IEwgMTY5LjAzMSwyMTguODI2NyBMIDE2OS4xOTgsMjE4LjY1MzcgTCAxNjkuNDk2LDIxNy4yODk3IEwgMTY4LjYxNywyMTYuOTc1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDAxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE2Ny4yMTMsMjE5LjIzOTcgTCAxNjcuNzE2LDIxOS43MTE3IEwgMTY4LjkzLDIxOS4wNTU3IEwgMTY5LjAyMywyMTguODQ0NyBMIDE2OC44NDgsMjE4LjY4NTcgTCAxNjcuNDU5LDIxOC41NjU3IEwgMTY3LjIxMywyMTkuMjM5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDAzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxNjcuMjEzLDIxOS4yMzk3IEwgMTY3LjcxNiwyMTkuNzExNyBMIDE2OC45MywyMTkuMDU1NyBMIDE2OS4wMjMsMjE4Ljg0NDcgTCAxNjguODQ4LDIxOC42ODU3IEwgMTY3LjQ1OSwyMTguNTY1NyBMIDE2Ny4yMTMsMjE5LjIzOTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTAwNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzAuODc4LDIxOC41MDI3IEwgMTcwLjYyMSwyMTkuMTI2NyBMIDE2OS4yMjgsMjE4Ljk5OTcgTCAxNjkuMDQ5LDIxOC44NDA3IEwgMTY5LjE0NiwyMTguNjI1NyBMIDE3MC4zNjQsMjE3Ljk4MzcgTCAxNzAuODc4LDIxOC41MDI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE3MC44NzgsMjE4LjUwMjcgTCAxNzAuNjIxLDIxOS4xMjY3IEwgMTY5LjIyOCwyMTguOTk5NyBMIDE2OS4wNDksMjE4Ljg0MDcgTCAxNjkuMTQ2LDIxOC42MjU3IEwgMTcwLjM2NCwyMTcuOTgzNyBMIDE3MC44NzgsMjE4LjUwMjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTAwOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNjUuODczLDIxOS40MTU3IEwgMTY1Ljc2MSwyMjAuMDc1NyBMIDE2NC4zNzIsMjIwLjIxOTcgTCAxNjQuMTY0LDIyMC4wOTk3IEwgMTY0LjIwOCwyMTkuODc0NyBMIDE2NS4yNTUsMjE5LjAwNjcgTCAxNjUuODczLDIxOS40MTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE2NS44NzMsMjE5LjQxNTcgTCAxNjUuNzYxLDIyMC4wNzU3IEwgMTY0LjM3MiwyMjAuMjE5NyBMIDE2NC4xNjQsMjIwLjA5OTcgTCAxNjQuMjA4LDIxOS44NzQ3IEwgMTY1LjI1NSwyMTkuMDA2NyBMIDE2NS44NzMsMjE5LjQxNTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTAxMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNjguNTU0LDIxOC44NDc3IEMgMTY4LjU1NCwyMTguNTkwNyAxNjguNzc0LDIxOC4zODI3IDE2OS4wNDIsMjE4LjM4MjcgQyAxNjkuMzEsMjE4LjM4MjcgMTY5LjUzLDIxOC41OTA3IDE2OS41MywyMTguODQ3NyBDIDE2OS41MywyMTkuMTAxNyAxNjkuMzEsMjE5LjMwOTcgMTY5LjA0MiwyMTkuMzA5NyBDIDE2OC43NzQsMjE5LjMwOTcgMTY4LjU1NCwyMTkuMTAxNyAxNjguNTU0LDIxOC44NDc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE2OC41NTQsMjE4Ljg0NzcgQyAxNjguNTU0LDIxOC41OTA3IDE2OC43NzQsMjE4LjM4MjcgMTY5LjA0MiwyMTguMzgyNyBDIDE2OS4zMSwyMTguMzgyNyAxNjkuNTMsMjE4LjU5MDcgMTY5LjUzLDIxOC44NDc3IEMgMTY5LjUzLDIxOS4xMDE3IDE2OS4zMSwyMTkuMzA5NyAxNjkuMDQyLDIxOS4zMDk3IEMgMTY4Ljc3NCwyMTkuMzA5NyAxNjguNTU0LDIxOS4xMDE3IDE2OC41NTQsMjE4Ljg0NzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTAxNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzkuNzI2LDIxNi45NzU3IEwgMTgwLjM5NiwyMTcuNjA2NyBMIDE3OS41MzksMjE4LjczNTcgTCAxNzkuMzA4LDIxOC44MjY3IEwgMTc5LjE0NSwyMTguNjUzNyBMIDE3OC44NDMsMjE3LjI4OTcgTCAxNzkuNzI2LDIxNi45NzU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE3OS43MjYsMjE2Ljk3NTcgTCAxODAuMzk2LDIxNy42MDY3IEwgMTc5LjUzOSwyMTguNzM1NyBMIDE3OS4zMDgsMjE4LjgyNjcgTCAxNzkuMTQ1LDIxOC42NTM3IEwgMTc4Ljg0MywyMTcuMjg5NyBMIDE3OS43MjYsMjE2Ljk3NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTAyMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxODEuMTI2LDIxOS4yMzk3IEwgMTgwLjYyMywyMTkuNzExNyBMIDE3OS40MDksMjE5LjA1NTcgTCAxNzkuMzEyLDIxOC44NDQ3IEwgMTc5LjQ5NSwyMTguNjg1NyBMIDE4MC44ODQsMjE4LjU2NTcgTCAxODEuMTI2LDIxOS4yMzk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE4MS4xMjYsMjE5LjIzOTcgTCAxODAuNjIzLDIxOS43MTE3IEwgMTc5LjQwOSwyMTkuMDU1NyBMIDE3OS4zMTIsMjE4Ljg0NDcgTCAxNzkuNDk1LDIxOC42ODU3IEwgMTgwLjg4NCwyMTguNTY1NyBMIDE4MS4xMjYsMjE5LjIzOTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTAyNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNzcuNDY1LDIxOC41MDI3IEwgMTc3LjcyMiwyMTkuMTI2NyBMIDE3OS4xMDcsMjE4Ljk5OTcgTCAxNzkuMjksMjE4Ljg0MDcgTCAxNzkuMTg5LDIxOC42MjU3IEwgMTc3Ljk3NSwyMTcuOTgzNyBMIDE3Ny40NjUsMjE4LjUwMjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTAyNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMTc3LjQ2NSwyMTguNTAyNyBMIDE3Ny43MjIsMjE5LjEyNjcgTCAxNzkuMTA3LDIxOC45OTk3IEwgMTc5LjI5LDIxOC44NDA3IEwgMTc5LjE4OSwyMTguNjI1NyBMIDE3Ny45NzUsMjE3Ljk4MzcgTCAxNzcuNDY1LDIxOC41MDI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMjkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTgyLjI3NiwyMTkuNDE1NyBMIDE4Mi4zOTIsMjIwLjA3NTcgTCAxODMuNzgxLDIyMC4yMTk3IEwgMTgzLjk4OSwyMjAuMDk5NyBMIDE4My45NDEsMjE5Ljg3NDcgTCAxODIuODk1LDIxOS4wMDY3IEwgMTgyLjI3NiwyMTkuNDE1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDMxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxODIuMjc2LDIxOS40MTU3IEwgMTgyLjM5MiwyMjAuMDc1NyBMIDE4My43ODEsMjIwLjIxOTcgTCAxODMuOTg5LDIyMC4wOTk3IEwgMTgzLjk0MSwyMTkuODc0NyBMIDE4Mi44OTUsMjE5LjAwNjcgTCAxODIuMjc2LDIxOS40MTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMzMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTczLjY3OCwyMTguNDEwNyBDIDE3My42NzgsMjE4LjE0OTcgMTczLjg5OCwyMTcuOTQ1NyAxNzQuMTY2LDIxNy45NDU3IEMgMTc0LjQzOCwyMTcuOTQ1NyAxNzQuNjU0LDIxOC4xNDk3IDE3NC42NTQsMjE4LjQxMDcgQyAxNzQuNjU0LDIxOC42NjQ3IDE3NC40MzgsMjE4Ljg3MjcgMTc0LjE2NiwyMTguODcyNyBDIDE3My44OTgsMjE4Ljg3MjcgMTczLjY3OCwyMTguNjY0NyAxNzMuNjc4LDIxOC40MTA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMzUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE3My42NzgsMjE4LjQxMDcgQyAxNzMuNjc4LDIxOC4xNDk3IDE3My44OTgsMjE3Ljk0NTcgMTc0LjE2NiwyMTcuOTQ1NyBDIDE3NC40MzgsMjE3Ljk0NTcgMTc0LjY1NCwyMTguMTQ5NyAxNzQuNjU0LDIxOC40MTA3IEMgMTc0LjY1NCwyMTguNjY0NyAxNzQuNDM4LDIxOC44NzI3IDE3NC4xNjYsMjE4Ljg3MjcgQyAxNzMuODk4LDIxOC44NzI3IDE3My42NzgsMjE4LjY2NDcgMTczLjY3OCwyMTguNDEwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDM3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE3OC44MjEsMjE4Ljg0NzcgQyAxNzguODIxLDIxOC41OTA3IDE3OS4wNCwyMTguMzgyNyAxNzkuMzA4LDIxOC4zODI3IEMgMTc5LjU4LDIxOC4zODI3IDE3OS43OTYsMjE4LjU5MDcgMTc5Ljc5NiwyMTguODQ3NyBDIDE3OS43OTYsMjE5LjEwMTcgMTc5LjU4LDIxOS4zMDk3IDE3OS4zMDgsMjE5LjMwOTcgQyAxNzkuMDQsMjE5LjMwOTcgMTc4LjgyMSwyMTkuMTAxNyAxNzguODIxLDIxOC44NDc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwMzkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDE3OC44MjEsMjE4Ljg0NzcgQyAxNzguODIxLDIxOC41OTA3IDE3OS4wNCwyMTguMzgyNyAxNzkuMzA4LDIxOC4zODI3IEMgMTc5LjU4LDIxOC4zODI3IDE3OS43OTYsMjE4LjU5MDcgMTc5Ljc5NiwyMTguODQ3NyBDIDE3OS43OTYsMjE5LjEwMTcgMTc5LjU4LDIxOS4zMDk3IDE3OS4zMDgsMjE5LjMwOTcgQyAxNzkuMDQsMjE5LjMwOTcgMTc4LjgyMSwyMTkuMTAxNyAxNzguODIxLDIxOC44NDc3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwNDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTYzLjk5NiwyMjAuMTg3NyBDIDE2My45ODEsMjIwLjE5ODcgMTYzLjYyLDIxOS43MDg3IDE2My4zNDQsMjE5LjQ2MTcgQyAxNjMuMTQ3LDIxOS4yODg3IDE2Mi42NzQsMjE5LjE0MDcgMTYyLjY3NCwyMTkuMTQwNyBDIDE2Mi42NzQsMjE5LjA1MjcgMTYyLjk1LDIxOC44NTQ3IDE2My4yNTEsMjE4Ljg1NDcgQyAxNjMuNDMsMjE4Ljg1NDcgMTYzLjU5OCwyMTguOTI4NyAxNjMuNjk0LDIxOS4wNTI3IEwgMTYzLjczNSwyMTguODYxNyBDIDE2My43MzUsMjE4Ljg2MTcgMTYzLjk3NywyMTguOTA3NyAxNjQuMDg5LDIxOS4xNzk3IEMgMTY0LjIwMSwyMTkuNDYxNyAxNjQuMTMsMjE5Ljg4ODcgMTY0LjEzLDIxOS44ODg3IEMgMTY0LjEzLDIxOS44ODg3IDE2NC4wODUsMjIwLjA4NTcgMTYzLjk5NiwyMjAuMTg3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDQzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxNjMuOTk2LDIyMC4xODc3IEMgMTYzLjk4MSwyMjAuMTk4NyAxNjMuNjIsMjE5LjcwODcgMTYzLjM0NCwyMTkuNDYxNyBDIDE2My4xNDcsMjE5LjI4ODcgMTYyLjY3NCwyMTkuMTQwNyAxNjIuNjc0LDIxOS4xNDA3IEMgMTYyLjY3NCwyMTkuMDUyNyAxNjIuOTUsMjE4Ljg1NDcgMTYzLjI1MSwyMTguODU0NyBDIDE2My40MywyMTguODU0NyAxNjMuNTk4LDIxOC45Mjg3IDE2My42OTQsMjE5LjA1MjcgTCAxNjMuNzM1LDIxOC44NjE3IEMgMTYzLjczNSwyMTguODYxNyAxNjMuOTc3LDIxOC45MDc3IDE2NC4wODksMjE5LjE3OTcgQyAxNjQuMjAxLDIxOS40NjE3IDE2NC4xMywyMTkuODg4NyAxNjQuMTMsMjE5Ljg4ODcgQyAxNjQuMTMsMjE5Ljg4ODcgMTY0LjA4NSwyMjAuMDg1NyAxNjMuOTk2LDIyMC4xODc3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwNDUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTY0LjAxNSwyMTkuOTQ0NyBDIDE2NC4xMywyMTkuODI0NyAxNjQuMzY4LDIxOS44NDk3IDE2NC41NDMsMjIwLjAwMTcgQyAxNjQuNzIyLDIyMC4xNTI3IDE2NC43NzQsMjIwLjM3NDcgMTY0LjY1OSwyMjAuNDk4NyBDIDE2NC41NDMsMjIwLjYyMTcgMTY0LjMwNSwyMjAuNTkzNyAxNjQuMTMsMjIwLjQ0MTcgQyAxNjMuOTUxLDIyMC4yOTA3IDE2My44OTksMjIwLjA2NDcgMTY0LjAxNSwyMTkuOTQ0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDQ3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxNjQuMDE1LDIxOS45NDQ3IEMgMTY0LjEzLDIxOS44MjQ3IDE2NC4zNjgsMjE5Ljg0OTcgMTY0LjU0MywyMjAuMDAxNyBDIDE2NC43MjIsMjIwLjE1MjcgMTY0Ljc3NCwyMjAuMzc0NyAxNjQuNjU5LDIyMC40OTg3IEMgMTY0LjU0MywyMjAuNjIxNyAxNjQuMzA1LDIyMC41OTM3IDE2NC4xMywyMjAuNDQxNyBDIDE2My45NTEsMjIwLjI5MDcgMTYzLjg5OSwyMjAuMDY0NyAxNjQuMDE1LDIxOS45NDQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwNDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTg0LjE1NywyMjAuMTg3NyBDIDE4NC4xNjgsMjIwLjE5ODcgMTg0LjUzMywyMTkuNzA4NyAxODQuODA5LDIxOS40NjE3IEMgMTg0Ljk5OCwyMTkuMjg4NyAxODUuNDc5LDIxOS4xNDA3IDE4NS40NzksMjE5LjE0MDcgQyAxODUuNDc5LDIxOS4wNTI3IDE4NS4yLDIxOC44NTQ3IDE4NC44OTgsMjE4Ljg1NDcgQyAxODQuNzIzLDIxOC44NTQ3IDE4NC41NTUsMjE4LjkyODcgMTg0LjQ1NSwyMTkuMDUyNyBMIDE4NC40MTQsMjE4Ljg2MTcgQyAxODQuNDE0LDIxOC44NjE3IDE4NC4xNzIsMjE4LjkwNzcgMTg0LjA2LDIxOS4xNzk3IEMgMTgzLjk1MiwyMTkuNDYxNyAxODQuMDIzLDIxOS44ODg3IDE4NC4wMjMsMjE5Ljg4ODcgQyAxODQuMDIzLDIxOS44ODg3IDE4NC4wNjQsMjIwLjA4NTcgMTg0LjE1NywyMjAuMTg3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDUxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxODQuMTU3LDIyMC4xODc3IEMgMTg0LjE2OCwyMjAuMTk4NyAxODQuNTMzLDIxOS43MDg3IDE4NC44MDksMjE5LjQ2MTcgQyAxODQuOTk4LDIxOS4yODg3IDE4NS40NzksMjE5LjE0MDcgMTg1LjQ3OSwyMTkuMTQwNyBDIDE4NS40NzksMjE5LjA1MjcgMTg1LjIsMjE4Ljg1NDcgMTg0Ljg5OCwyMTguODU0NyBDIDE4NC43MjMsMjE4Ljg1NDcgMTg0LjU1NSwyMTguOTI4NyAxODQuNDU1LDIxOS4wNTI3IEwgMTg0LjQxNCwyMTguODYxNyBDIDE4NC40MTQsMjE4Ljg2MTcgMTg0LjE3MiwyMTguOTA3NyAxODQuMDYsMjE5LjE3OTcgQyAxODMuOTUyLDIxOS40NjE3IDE4NC4wMjMsMjE5Ljg4ODcgMTg0LjAyMywyMTkuODg4NyBDIDE4NC4wMjMsMjE5Ljg4ODcgMTg0LjA2NCwyMjAuMDg1NyAxODQuMTU3LDIyMC4xODc3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwNTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTg0LjE2OCwyMTkuOTQ0NyBDIDE4NC4wNTMsMjE5LjgyNDcgMTgzLjgxNCwyMTkuODQ5NyAxODMuNjM2LDIyMC4wMDE3IEMgMTgzLjQ1NywyMjAuMTUyNyAxODMuNDA1LDIyMC4zNzQ3IDE4My41MiwyMjAuNDk4NyBDIDE4My42MzYsMjIwLjYyMTcgMTgzLjg3NCwyMjAuNTkzNyAxODQuMDUzLDIyMC40NDE3IEMgMTg0LjIzMSwyMjAuMjkwNyAxODQuMjgsMjIwLjA2NDcgMTg0LjE2OCwyMTkuOTQ0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDU1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAxODQuMTY4LDIxOS45NDQ3IEMgMTg0LjA1MywyMTkuODI0NyAxODMuODE0LDIxOS44NDk3IDE4My42MzYsMjIwLjAwMTcgQyAxODMuNDU3LDIyMC4xNTI3IDE4My40MDUsMjIwLjM3NDcgMTgzLjUyLDIyMC40OTg3IEMgMTgzLjYzNiwyMjAuNjIxNyAxODMuODc0LDIyMC41OTM3IDE4NC4wNTMsMjIwLjQ0MTcgQyAxODQuMjMxLDIyMC4yOTA3IDE4NC4yOCwyMjAuMDY0NyAxODQuMTY4LDIxOS45NDQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwNTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTYzLjE1MSwyMzEuNDgwNyBMIDE4NS4yODUsMjMxLjQ4MDcgTCAxODUuMjg1LDIyNS42Nzg3IEwgMTYzLjE1MSwyMjUuNjc4NyBMIDE2My4xNTEsMjMxLjQ4MDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTA1OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMTYzLjE1MSwyMzEuNDgwNyBMIDE4NS4yODUsMjMxLjQ4MDcgTCAxODUuMjg1LDIyNS42Nzg3IEwgMTYzLjE1MSwyMjUuNjc4NyBMIDE2My4xNTEsMjMxLjQ4MDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTA2MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNjUuNDc0LDIzNS4zNDE3IEMgMTY1LjYxMiwyMzUuMjg1NyAxNjUuNzEzLDIzNS4yNzg3IDE2NS44ODQsMjM1LjI3ODcgTCAxODIuNDU5LDIzNS4yNzg3IEMgMTgyLjYyMywyMzUuMjc4NyAxODIuNzc5LDIzNS4zMDY3IDE4Mi45MDksMjM1LjM1OTcgQyAxODIuMzQzLDIzNS4xNjk3IDE4MS45MzQsMjM0LjY1NDcgMTgxLjkzNCwyMzQuMDQ3NyBDIDE4MS45MzQsMjMzLjQ0MTcgMTgyLjM3NywyMzIuOTE1NyAxODIuOTUsMjMyLjcxODcgQyAxODIuODIsMjMyLjc2MDcgMTgyLjYyNiwyMzIuNzk5NyAxODIuNDcsMjMyLjc5OTcgTCAxNjUuODg0LDIzMi43OTk3IEMgMTY1LjcxNiwyMzIuNzk5NyAxNjUuNTU2LDIzMi43OTI3IDE2NS40MTksMjMyLjc0NjcgTCAxNjUuNTA4LDIzMi43NjA3IEMgMTY2LjEsMjMyLjk0MzcgMTY2LjQzOSwyMzMuNDY5NyAxNjYuNDM5LDIzNC4wNDc3IEMgMTY2LjQzOSwyMzQuNjA0NyAxNjYuMDYzLDIzNS4xNjI3IDE2NS40NzQsMjM1LjM0MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTA2MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTc7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIgotICAgICAgICAgICBkPSJNIDE2NS40NzQsMjM1LjM0MTcgQyAxNjUuNjEyLDIzNS4yODU3IDE2NS43MTMsMjM1LjI3ODcgMTY1Ljg4NCwyMzUuMjc4NyBMIDE4Mi40NTksMjM1LjI3ODcgQyAxODIuNjIzLDIzNS4yNzg3IDE4Mi43NzksMjM1LjMwNjcgMTgyLjkwOSwyMzUuMzU5NyBDIDE4Mi4zNDMsMjM1LjE2OTcgMTgxLjkzNCwyMzQuNjU0NyAxODEuOTM0LDIzNC4wNDc3IEMgMTgxLjkzNCwyMzMuNDQxNyAxODIuMzc3LDIzMi45MTU3IDE4Mi45NSwyMzIuNzE4NyBDIDE4Mi44MiwyMzIuNzYwNyAxODIuNjI2LDIzMi43OTk3IDE4Mi40NywyMzIuNzk5NyBMIDE2NS44ODQsMjMyLjc5OTcgQyAxNjUuNzE2LDIzMi43OTk3IDE2NS41NTYsMjMyLjc5MjcgMTY1LjQxOSwyMzIuNzQ2NyBMIDE2NS41MDgsMjMyLjc2MDcgQyAxNjYuMSwyMzIuOTQzNyAxNjYuNDM5LDIzMy40Njk3IDE2Ni40MzksMjM0LjA0NzcgQyAxNjYuNDM5LDIzNC42MDQ3IDE2Ni4wNjMsMjM1LjE2MjcgMTY1LjQ3NCwyMzUuMzQxNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDY1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE2NS44ODQsMjM1LjI3ODcgTCAxODIuNDU5LDIzNS4yNzg3IEMgMTgzLjAyMSwyMzUuMjc4NyAxODMuNDc1LDIzNS42Mjc3IDE4My40NzUsMjM2LjA1NDcgQyAxODMuNDc1LDIzNi40ODQ3IDE4My4wMjEsMjM2LjgzMzcgMTgyLjQ1OSwyMzYuODMzNyBMIDE2NS44ODQsMjM2LjgzMzcgQyAxNjUuMzIyLDIzNi44MzM3IDE2NC44NjcsMjM2LjQ4NDcgMTY0Ljg2NywyMzYuMDU0NyBDIDE2NC44NjcsMjM1LjYyNzcgMTY1LjMyMiwyMzUuMjc4NyAxNjUuODg0LDIzNS4yNzg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwNjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDE2NS44ODQsMjM1LjI3ODcgTCAxODIuNDU5LDIzNS4yNzg3IEMgMTgzLjAyMSwyMzUuMjc4NyAxODMuNDc1LDIzNS42Mjc3IDE4My40NzUsMjM2LjA1NDcgQyAxODMuNDc1LDIzNi40ODQ3IDE4My4wMjEsMjM2LjgzMzcgMTgyLjQ1OSwyMzYuODMzNyBMIDE2NS44ODQsMjM2LjgzMzcgQyAxNjUuMzIyLDIzNi44MzM3IDE2NC44NjcsMjM2LjQ4NDcgMTY0Ljg2NywyMzYuMDU0NyBDIDE2NC44NjcsMjM1LjYyNzcgMTY1LjMyMiwyMzUuMjc4NyAxNjUuODg0LDIzNS4yNzg3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwNjkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTY1Ljg4NCwyMzEuNDgwNyBMIDE4Mi40NywyMzEuNDgwNyBDIDE4My4wMjksMjMxLjQ4MDcgMTgzLjQ4NywyMzEuNzc2NyAxODMuNDg3LDIzMi4xMzY3IEMgMTgzLjQ4NywyMzIuNTAyNyAxODMuMDI5LDIzMi43OTk3IDE4Mi40NywyMzIuNzk5NyBMIDE2NS44ODQsMjMyLjc5OTcgQyAxNjUuMzIyLDIzMi43OTk3IDE2NC44NjcsMjMyLjUwMjcgMTY0Ljg2NywyMzIuMTM2NyBDIDE2NC44NjcsMjMxLjc3NjcgMTY1LjMyMiwyMzEuNDgwNyAxNjUuODg0LDIzMS40ODA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwNzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDE2NS44ODQsMjMxLjQ4MDcgTCAxODIuNDcsMjMxLjQ4MDcgQyAxODMuMDI5LDIzMS40ODA3IDE4My40ODcsMjMxLjc3NjcgMTgzLjQ4NywyMzIuMTM2NyBDIDE4My40ODcsMjMyLjUwMjcgMTgzLjAyOSwyMzIuNzk5NyAxODIuNDcsMjMyLjc5OTcgTCAxNjUuODg0LDIzMi43OTk3IEMgMTY1LjMyMiwyMzIuNzk5NyAxNjQuODY3LDIzMi41MDI3IDE2NC44NjcsMjMyLjEzNjcgQyAxNjQuODY3LDIzMS43NzY3IDE2NS4zMjIsMjMxLjQ4MDcgMTY1Ljg4NCwyMzEuNDgwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDczIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojMDA1YmJmIgotICAgICAgICAgICBkPSJNIDE4OS42NjgsMzI5LjExNDcgQyAxODguMTM4LDMyOS4xMTQ3IDE4Ni43NzUsMzI4Ljc5MzcgMTg1Ljc2OSwzMjguMjU3NyBDIDE4NC43NzEsMzI3Ljc0OTcgMTgzLjQyLDMyNy40Mzk3IDE4MS45MywzMjcuNDM5NyBDIDE4MC40MzMsMzI3LjQzOTcgMTc5LjA0OCwzMjcuNzUzNyAxNzguMDUsMzI4LjI2NDcgQyAxNzcuMDQ4LDMyOC43OTA3IDE3NS42NjMsMzI5LjExNDcgMTc0LjE1MSwzMjkuMTE0NyBDIDE3Mi42MiwzMjkuMTE0NyAxNzEuMjU4LDMyOC43NTg3IDE3MC4yNTIsMzI4LjIyMjcgQyAxNjkuMjYyLDMyNy43MzU3IDE2Ny45MzYsMzI3LjQzOTcgMTY2LjQ4NCwzMjcuNDM5NyBDIDE2NC45ODMsMzI3LjQzOTcgMTYzLjY1LDMyNy43MjU3IDE2Mi42NTIsMzI4LjI0MzcgQyAxNjEuNjQ2LDMyOC43NzY3IDE2MC4yNTQsMzI5LjExNDcgMTU4LjcyNywzMjkuMTE0NyBMIDE1OC43MjcsMzMxLjUxMjcgQyAxNjAuMjU0LDMzMS41MTI3IDE2MS42NDYsMzMxLjE2MzcgMTYyLjY1MiwzMzAuNjM0NyBDIDE2My42NSwzMzAuMTE5NyAxNjQuOTgzLDMyOS44Mjc3IDE2Ni40ODQsMzI5LjgyNzcgQyAxNjcuOTMyLDMyOS44Mjc3IDE2OS4yNTgsMzMwLjEyNjcgMTcwLjI1MiwzMzAuNjE3NyBDIDE3MS4yNTQsMzMxLjE0OTcgMTcyLjYyLDMzMS41MTI3IDE3NC4xNTEsMzMxLjUxMjcgQyAxNzUuNjYzLDMzMS41MTI3IDE3Ny4wNDgsMzMxLjE4MTcgMTc4LjA1LDMzMC42NTk3IEMgMTc5LjA0OCwzMzAuMTQxNyAxODAuNDMzLDMyOS44Mjc3IDE4MS45MywzMjkuODI3NyBDIDE4My40MiwzMjkuODI3NyAxODQuNzcxLDMzMC4xNDE3IDE4NS43NjksMzMwLjY1MjcgQyAxODYuNzc1LDMzMS4xODg3IDE4OC4xMTUsMzMxLjUxMjcgMTg5LjY1LDMzMS41MTI3IEwgMTg5LjY2OCwzMjkuMTE0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDc1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAxODkuNjY4LDMyOS4xMTQ3IEMgMTg4LjEzOCwzMjkuMTE0NyAxODYuNzc1LDMyOC43OTM3IDE4NS43NjksMzI4LjI1NzcgQyAxODQuNzcxLDMyNy43NDk3IDE4My40MiwzMjcuNDM5NyAxODEuOTMsMzI3LjQzOTcgQyAxODAuNDMzLDMyNy40Mzk3IDE3OS4wNDgsMzI3Ljc1MzcgMTc4LjA1LDMyOC4yNjQ3IEMgMTc3LjA0OCwzMjguNzkwNyAxNzUuNjYzLDMyOS4xMTQ3IDE3NC4xNTEsMzI5LjExNDcgQyAxNzIuNjIsMzI5LjExNDcgMTcxLjI1OCwzMjguNzU4NyAxNzAuMjUyLDMyOC4yMjI3IEMgMTY5LjI2MiwzMjcuNzM1NyAxNjcuOTM2LDMyNy40Mzk3IDE2Ni40ODQsMzI3LjQzOTcgQyAxNjQuOTgzLDMyNy40Mzk3IDE2My42NSwzMjcuNzI1NyAxNjIuNjUyLDMyOC4yNDM3IEMgMTYxLjY0NiwzMjguNzc2NyAxNjAuMjU0LDMyOS4xMTQ3IDE1OC43MjcsMzI5LjExNDcgTCAxNTguNzI3LDMzMS41MTI3IEMgMTYwLjI1NCwzMzEuNTEyNyAxNjEuNjQ2LDMzMS4xNjM3IDE2Mi42NTIsMzMwLjYzNDcgQyAxNjMuNjUsMzMwLjExOTcgMTY0Ljk4MywzMjkuODI3NyAxNjYuNDg0LDMyOS44Mjc3IEMgMTY3LjkzMiwzMjkuODI3NyAxNjkuMjU4LDMzMC4xMjY3IDE3MC4yNTIsMzMwLjYxNzcgQyAxNzEuMjU0LDMzMS4xNDk3IDE3Mi42MiwzMzEuNTEyNyAxNzQuMTUxLDMzMS41MTI3IEMgMTc1LjY2MywzMzEuNTEyNyAxNzcuMDQ4LDMzMS4xODE3IDE3OC4wNSwzMzAuNjU5NyBDIDE3OS4wNDgsMzMwLjE0MTcgMTgwLjQzMywzMjkuODI3NyAxODEuOTMsMzI5LjgyNzcgQyAxODMuNDIsMzI5LjgyNzcgMTg0Ljc3MSwzMzAuMTQxNyAxODUuNzY5LDMzMC42NTI3IEMgMTg2Ljc3NSwzMzEuMTg4NyAxODguMTE1LDMzMS41MTI3IDE4OS42NSwzMzEuNTEyNyBMIDE4OS42NjgsMzI5LjExNDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTA3NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2NjY2NjYyIKLSAgICAgICAgICAgZD0iTSAxODkuNjY4LDMzMS41MTI3IEMgMTg4LjEzOCwzMzEuNTEyNyAxODYuNzc1LDMzMS4xODg3IDE4NS43NjksMzMwLjY1MjcgQyAxODQuNzcxLDMzMC4xNDE3IDE4My40MiwzMjkuODI3NyAxODEuOTMsMzI5LjgyNzcgQyAxODAuNDMzLDMyOS44Mjc3IDE3OS4wNDgsMzMwLjE0MTcgMTc4LjA1LDMzMC42NTk3IEMgMTc3LjA0OCwzMzEuMTgxNyAxNzUuNjYzLDMzMS41MTI3IDE3NC4xNTEsMzMxLjUxMjcgQyAxNzIuNjIsMzMxLjUxMjcgMTcxLjI1OCwzMzEuMTQ5NyAxNzAuMjUyLDMzMC42MTc3IEMgMTY5LjI2MiwzMzAuMTI2NyAxNjcuOTM2LDMyOS44Mjc3IDE2Ni40ODQsMzI5LjgyNzcgQyAxNjQuOTgzLDMyOS44Mjc3IDE2My42NSwzMzAuMTE5NyAxNjIuNjUyLDMzMC42MzQ3IEMgMTYxLjY0NiwzMzEuMTYzNyAxNjAuMjU0LDMzMS41MTI3IDE1OC43MjcsMzMxLjUxMjcgTCAxNTguNzI3LDMzMy45MDM3IEMgMTYwLjI1NCwzMzMuOTAzNyAxNjEuNjQ2LDMzMy41NjE3IDE2Mi42NTIsMzMzLjAzMjcgQyAxNjMuNjUsMzMyLjUxMDcgMTY0Ljk4MywzMzIuMjIxNyAxNjYuNDg0LDMzMi4yMjE3IEMgMTY3LjkzMiwzMzIuMjIxNyAxNjkuMjU4LDMzMi41MjE3IDE3MC4yNTIsMzMzLjAxMTcgQyAxNzEuMjU0LDMzMy41NDQ3IDE3Mi42MiwzMzMuOTAzNyAxNzQuMTUxLDMzMy45MDM3IEMgMTc1LjY2MywzMzMuOTAzNyAxNzcuMDQ4LDMzMy41NzI3IDE3OC4wNSwzMzMuMDUwNyBDIDE3OS4wNDgsMzMyLjUzNTcgMTgwLjQzMywzMzIuMjIxNyAxODEuOTMsMzMyLjIyMTcgQyAxODMuNDIsMzMyLjIyMTcgMTg0Ljc3MSwzMzIuNTM1NyAxODUuNzY5LDMzMy4wNDY3IEMgMTg2Ljc3NSwzMzMuNTc5NyAxODguMTE1LDMzMy45MDM3IDE4OS42NSwzMzMuOTAzNyBMIDE4OS42NjgsMzMxLjUxMjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTA3OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMTg5LjY2OCwzMzEuNTEyNyBDIDE4OC4xMzgsMzMxLjUxMjcgMTg2Ljc3NSwzMzEuMTg4NyAxODUuNzY5LDMzMC42NTI3IEMgMTg0Ljc3MSwzMzAuMTQxNyAxODMuNDIsMzI5LjgyNzcgMTgxLjkzLDMyOS44Mjc3IEMgMTgwLjQzMywzMjkuODI3NyAxNzkuMDQ4LDMzMC4xNDE3IDE3OC4wNSwzMzAuNjU5NyBDIDE3Ny4wNDgsMzMxLjE4MTcgMTc1LjY2MywzMzEuNTEyNyAxNzQuMTUxLDMzMS41MTI3IEMgMTcyLjYyLDMzMS41MTI3IDE3MS4yNTgsMzMxLjE0OTcgMTcwLjI1MiwzMzAuNjE3NyBDIDE2OS4yNjIsMzMwLjEyNjcgMTY3LjkzNiwzMjkuODI3NyAxNjYuNDg0LDMyOS44Mjc3IEMgMTY0Ljk4MywzMjkuODI3NyAxNjMuNjUsMzMwLjExOTcgMTYyLjY1MiwzMzAuNjM0NyBDIDE2MS42NDYsMzMxLjE2MzcgMTYwLjI1NCwzMzEuNTEyNyAxNTguNzI3LDMzMS41MTI3IEwgMTU4LjcyNywzMzMuOTAzNyBDIDE2MC4yNTQsMzMzLjkwMzcgMTYxLjY0NiwzMzMuNTYxNyAxNjIuNjUyLDMzMy4wMzI3IEMgMTYzLjY1LDMzMi41MTA3IDE2NC45ODMsMzMyLjIyMTcgMTY2LjQ4NCwzMzIuMjIxNyBDIDE2Ny45MzIsMzMyLjIyMTcgMTY5LjI1OCwzMzIuNTIxNyAxNzAuMjUyLDMzMy4wMTE3IEMgMTcxLjI1NCwzMzMuNTQ0NyAxNzIuNjIsMzMzLjkwMzcgMTc0LjE1MSwzMzMuOTAzNyBDIDE3NS42NjMsMzMzLjkwMzcgMTc3LjA0OCwzMzMuNTcyNyAxNzguMDUsMzMzLjA1MDcgQyAxNzkuMDQ4LDMzMi41MzU3IDE4MC40MzMsMzMyLjIyMTcgMTgxLjkzLDMzMi4yMjE3IEMgMTgzLjQyLDMzMi4yMjE3IDE4NC43NzEsMzMyLjUzNTcgMTg1Ljc2OSwzMzMuMDQ2NyBDIDE4Ni43NzUsMzMzLjU3OTcgMTg4LjExNSwzMzMuOTAzNyAxODkuNjUsMzMzLjkwMzcgTCAxODkuNjY4LDMzMS41MTI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwODEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwMDViYmYiCi0gICAgICAgICAgIGQ9Ik0gMTg5LjY2OCwzMzMuOTAzNyBDIDE4OC4xMzgsMzMzLjkwMzcgMTg2Ljc3NSwzMzMuNTc5NyAxODUuNzY5LDMzMy4wNDY3IEMgMTg0Ljc3MSwzMzIuNTM1NyAxODMuNDIsMzMyLjIyMTcgMTgxLjkzLDMzMi4yMjE3IEMgMTgwLjQzMywzMzIuMjIxNyAxNzkuMDQ4LDMzMi41MzU3IDE3OC4wNSwzMzMuMDUwNyBDIDE3Ny4wNDgsMzMzLjU3MjcgMTc1LjY2MywzMzMuOTAzNyAxNzQuMTUxLDMzMy45MDM3IEMgMTcyLjYyLDMzMy45MDM3IDE3MS4yNTgsMzMzLjU0NDcgMTcwLjI1MiwzMzMuMDExNyBDIDE2OS4yNjIsMzMyLjUyMTcgMTY3LjkzNiwzMzIuMjIxNyAxNjYuNDg0LDMzMi4yMjE3IEMgMTY0Ljk4MywzMzIuMjIxNyAxNjMuNjUsMzMyLjUxMDcgMTYyLjY1MiwzMzMuMDMyNyBDIDE2MS42NDYsMzMzLjU2MTcgMTYwLjI1NCwzMzMuOTAzNyAxNTguNzI3LDMzMy45MDM3IEwgMTU4LjcyNywzMzYuMjk0NyBDIDE2MC4yNTQsMzM2LjI5NDcgMTYxLjY0NiwzMzUuOTUyNyAxNjIuNjUyLDMzNS40MjA3IEMgMTYzLjY1LDMzNC45MDU3IDE2NC45ODMsMzM0LjYxNjcgMTY2LjQ4NCwzMzQuNjE2NyBDIDE2Ny45MzIsMzM0LjYxNjcgMTY5LjI1OCwzMzQuOTE2NyAxNzAuMjUyLDMzNS40MDI3IEMgMTcxLjI1NCwzMzUuOTM4NyAxNzIuNjIsMzM2LjI5NDcgMTc0LjE1MSwzMzYuMjk0NyBDIDE3NS42NjMsMzM2LjI5NDcgMTc3LjA0OCwzMzUuOTY3NyAxNzguMDUsMzM1LjQ0NTcgQyAxNzkuMDQ4LDMzNC45MzA3IDE4MC40MzMsMzM0LjYxNjcgMTgxLjkzLDMzNC42MTY3IEMgMTgzLjQyLDMzNC42MTY3IDE4NC43NzEsMzM0LjkyNjcgMTg1Ljc2OSwzMzUuNDM4NyBDIDE4Ni43NzUsMzM1Ljk3NzcgMTg4LjExNSwzMzYuMjk0NyAxODkuNjUsMzM2LjI5NDcgTCAxODkuNjY4LDMzMy45MDM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwODMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDE4OS42NjgsMzMzLjkwMzcgQyAxODguMTM4LDMzMy45MDM3IDE4Ni43NzUsMzMzLjU3OTcgMTg1Ljc2OSwzMzMuMDQ2NyBDIDE4NC43NzEsMzMyLjUzNTcgMTgzLjQyLDMzMi4yMjE3IDE4MS45MywzMzIuMjIxNyBDIDE4MC40MzMsMzMyLjIyMTcgMTc5LjA0OCwzMzIuNTM1NyAxNzguMDUsMzMzLjA1MDcgQyAxNzcuMDQ4LDMzMy41NzI3IDE3NS42NjMsMzMzLjkwMzcgMTc0LjE1MSwzMzMuOTAzNyBDIDE3Mi42MiwzMzMuOTAzNyAxNzEuMjU4LDMzMy41NDQ3IDE3MC4yNTIsMzMzLjAxMTcgQyAxNjkuMjYyLDMzMi41MjE3IDE2Ny45MzYsMzMyLjIyMTcgMTY2LjQ4NCwzMzIuMjIxNyBDIDE2NC45ODMsMzMyLjIyMTcgMTYzLjY1LDMzMi41MTA3IDE2Mi42NTIsMzMzLjAzMjcgQyAxNjEuNjQ2LDMzMy41NjE3IDE2MC4yNTQsMzMzLjkwMzcgMTU4LjcyNywzMzMuOTAzNyBMIDE1OC43MjcsMzM2LjI5NDcgQyAxNjAuMjU0LDMzNi4yOTQ3IDE2MS42NDYsMzM1Ljk1MjcgMTYyLjY1MiwzMzUuNDIwNyBDIDE2My42NSwzMzQuOTA1NyAxNjQuOTgzLDMzNC42MTY3IDE2Ni40ODQsMzM0LjYxNjcgQyAxNjcuOTMyLDMzNC42MTY3IDE2OS4yNTgsMzM0LjkxNjcgMTcwLjI1MiwzMzUuNDAyNyBDIDE3MS4yNTQsMzM1LjkzODcgMTcyLjYyLDMzNi4yOTQ3IDE3NC4xNTEsMzM2LjI5NDcgQyAxNzUuNjYzLDMzNi4yOTQ3IDE3Ny4wNDgsMzM1Ljk2NzcgMTc4LjA1LDMzNS40NDU3IEMgMTc5LjA0OCwzMzQuOTMwNyAxODAuNDMzLDMzNC42MTY3IDE4MS45MywzMzQuNjE2NyBDIDE4My40MiwzMzQuNjE2NyAxODQuNzcxLDMzNC45MjY3IDE4NS43NjksMzM1LjQzODcgQyAxODYuNzc1LDMzNS45Nzc3IDE4OC4xMTUsMzM2LjI5NDcgMTg5LjY1LDMzNi4yOTQ3IEwgMTg5LjY2OCwzMzMuOTAzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDg1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojY2NjY2NjIgotICAgICAgICAgICBkPSJNIDE4OS42NSwzMzguNjg5NyBDIDE4OC4xMTUsMzM4LjY4OTcgMTg2Ljc3NSwzMzguMzY1NyAxODUuNzY5LDMzNy44Mjk3IEMgMTg0Ljc3MSwzMzcuMzIxNyAxODMuNDIsMzM3LjAxMDcgMTgxLjkzLDMzNy4wMTA3IEMgMTgwLjQzMywzMzcuMDEwNyAxNzkuMDQ4LDMzNy4zMjE3IDE3OC4wNSwzMzcuODM2NyBDIDE3Ny4wNDgsMzM4LjM1ODcgMTc1LjY2MywzMzguNjg5NyAxNzQuMTUxLDMzOC42ODk3IEMgMTcyLjYyLDMzOC42ODk3IDE3MS4yNTgsMzM4LjMyOTcgMTcwLjI1MiwzMzcuNzkzNyBDIDE2OS4yNjIsMzM3LjMwNzcgMTY3LjkzNiwzMzcuMDEwNyAxNjYuNDg0LDMzNy4wMTA3IEMgMTY0Ljk4MywzMzcuMDEwNyAxNjMuNjUsMzM3LjMwMDcgMTYyLjY1MiwzMzcuODE0NyBDIDE2MS42NDYsMzM4LjM0NzcgMTYwLjI1NCwzMzguNjg5NyAxNTguNzI3LDMzOC42ODk3IEwgMTU4LjcyNywzMzYuMzA5NyBDIDE2MC4yNTQsMzM2LjMwOTcgMTYxLjY0NiwzMzUuOTUyNyAxNjIuNjUyLDMzNS40MjA3IEMgMTYzLjY1LDMzNC45MDU3IDE2NC45ODMsMzM0LjYxNjcgMTY2LjQ4NCwzMzQuNjE2NyBDIDE2Ny45MzIsMzM0LjYxNjcgMTY5LjI1OCwzMzQuOTE2NyAxNzAuMjUyLDMzNS40MDI3IEMgMTcxLjI1NCwzMzUuOTM4NyAxNzIuNjIsMzM2LjI5NDcgMTc0LjE1MSwzMzYuMjk0NyBDIDE3NS42NjMsMzM2LjI5NDcgMTc3LjA0OCwzMzUuOTY3NyAxNzguMDUsMzM1LjQ0NTcgQyAxNzkuMDQ4LDMzNC45MzA3IDE4MC40MzMsMzM0LjYxNjcgMTgxLjkzLDMzNC42MTY3IEMgMTgzLjQyLDMzNC42MTY3IDE4NC43NzEsMzM0LjkyNjcgMTg1Ljc2OSwzMzUuNDM4NyBDIDE4Ni43NzUsMzM1Ljk3NzcgMTg4LjEzOCwzMzYuMjk0NyAxODkuNjY4LDMzNi4yOTQ3IEwgMTg5LjY1LDMzOC42ODk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwODciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDE4OS42NSwzMzguNjg5NyBDIDE4OC4xMTUsMzM4LjY4OTcgMTg2Ljc3NSwzMzguMzY1NyAxODUuNzY5LDMzNy44Mjk3IEMgMTg0Ljc3MSwzMzcuMzIxNyAxODMuNDIsMzM3LjAxMDcgMTgxLjkzLDMzNy4wMTA3IEMgMTgwLjQzMywzMzcuMDEwNyAxNzkuMDQ4LDMzNy4zMjE3IDE3OC4wNSwzMzcuODM2NyBDIDE3Ny4wNDgsMzM4LjM1ODcgMTc1LjY2MywzMzguNjg5NyAxNzQuMTUxLDMzOC42ODk3IEMgMTcyLjYyLDMzOC42ODk3IDE3MS4yNTgsMzM4LjMyOTcgMTcwLjI1MiwzMzcuNzkzNyBDIDE2OS4yNjIsMzM3LjMwNzcgMTY3LjkzNiwzMzcuMDEwNyAxNjYuNDg0LDMzNy4wMTA3IEMgMTY0Ljk4MywzMzcuMDEwNyAxNjMuNjUsMzM3LjMwMDcgMTYyLjY1MiwzMzcuODE0NyBDIDE2MS42NDYsMzM4LjM0NzcgMTYwLjI1NCwzMzguNjg5NyAxNTguNzI3LDMzOC42ODk3IEwgMTU4LjcyNywzMzYuMzA5NyBDIDE2MC4yNTQsMzM2LjMwOTcgMTYxLjY0NiwzMzUuOTUyNyAxNjIuNjUyLDMzNS40MjA3IEMgMTYzLjY1LDMzNC45MDU3IDE2NC45ODMsMzM0LjYxNjcgMTY2LjQ4NCwzMzQuNjE2NyBDIDE2Ny45MzIsMzM0LjYxNjcgMTY5LjI1OCwzMzQuOTE2NyAxNzAuMjUyLDMzNS40MDI3IEMgMTcxLjI1NCwzMzUuOTM4NyAxNzIuNjIsMzM2LjI5NDcgMTc0LjE1MSwzMzYuMjk0NyBDIDE3NS42NjMsMzM2LjI5NDcgMTc3LjA0OCwzMzUuOTY3NyAxNzguMDUsMzM1LjQ0NTcgQyAxNzkuMDQ4LDMzNC45MzA3IDE4MC40MzMsMzM0LjYxNjcgMTgxLjkzLDMzNC42MTY3IEMgMTgzLjQyLDMzNC42MTY3IDE4NC43NzEsMzM0LjkyNjcgMTg1Ljc2OSwzMzUuNDM4NyBDIDE4Ni43NzUsMzM1Ljk3NzcgMTg4LjEzOCwzMzYuMjk0NyAxODkuNjY4LDMzNi4yOTQ3IEwgMTg5LjY1LDMzOC42ODk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwODkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwMDViYmYiCi0gICAgICAgICAgIGQ9Ik0gMTg5LjY1LDM0MS4wODQ3IEMgMTg4LjExNSwzNDEuMDg0NyAxODYuNzc1LDM0MC43NTk3IDE4NS43NjksMzQwLjIyNzcgQyAxODQuNzcxLDMzOS43MTI3IDE4My40MiwzMzkuMzk4NyAxODEuOTMsMzM5LjM5ODcgQyAxODAuNDMzLDMzOS4zOTg3IDE3OS4wNDgsMzM5LjcxNTcgMTc4LjA1LDM0MC4yMzA3IEMgMTc3LjA0OCwzNDAuNzUyNyAxNzUuNjYzLDM0MS4wODQ3IDE3NC4xNTEsMzQxLjA4NDcgQyAxNzIuNjIsMzQxLjA4NDcgMTcxLjI1OCwzNDAuNzIwNyAxNzAuMjUyLDM0MC4xODg3IEMgMTY5LjI2MiwzMzkuNjk4NyAxNjcuOTM2LDMzOS4zOTg3IDE2Ni40ODQsMzM5LjM5ODcgQyAxNjQuOTgzLDMzOS4zOTg3IDE2My42NSwzMzkuNjkxNyAxNjIuNjUyLDM0MC4yMDk3IEMgMTYxLjY0NiwzNDAuNzM4NyAxNjAuMjU0LDM0MS4wODQ3IDE1OC43MjcsMzQxLjA4NDcgTCAxNTguNzI3LDMzOC43MTA3IEMgMTYwLjI1NCwzMzguNzEwNyAxNjEuNjQ2LDMzOC4zNDc3IDE2Mi42NTIsMzM3LjgxNDcgQyAxNjMuNjUsMzM3LjMwMDcgMTY0Ljk4MywzMzcuMDE0NyAxNjYuNDg0LDMzNy4wMTQ3IEMgMTY3LjkzMiwzMzcuMDE0NyAxNjkuMjU4LDMzNy4zMTA3IDE3MC4yNTIsMzM3Ljc5NzcgQyAxNzEuMjU0LDMzOC4zMjk3IDE3Mi42MiwzMzguNjg5NyAxNzQuMTUxLDMzOC42ODk3IEMgMTc1LjY2MywzMzguNjg5NyAxNzcuMDQ4LDMzOC4zNTg3IDE3OC4wNSwzMzcuODM2NyBDIDE3OS4wNDgsMzM3LjMyMTcgMTgwLjQzMywzMzcuMDE0NyAxODEuOTMsMzM3LjAxNDcgQyAxODMuNDIsMzM3LjAxNDcgMTg0Ljc3MSwzMzcuMzIxNyAxODUuNzY5LDMzNy44MzI3IEMgMTg2Ljc3NSwzMzguMzY1NyAxODguMTMsMzM4LjY4OTcgMTg5LjY2NCwzMzguNjg5NyBMIDE4OS42NSwzNDEuMDg0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MDkxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAxODkuNjUsMzQxLjA4NDcgQyAxODguMTE1LDM0MS4wODQ3IDE4Ni43NzUsMzQwLjc1OTcgMTg1Ljc2OSwzNDAuMjI3NyBDIDE4NC43NzEsMzM5LjcxMjcgMTgzLjQyLDMzOS4zOTg3IDE4MS45MywzMzkuMzk4NyBDIDE4MC40MzMsMzM5LjM5ODcgMTc5LjA0OCwzMzkuNzE1NyAxNzguMDUsMzQwLjIzMDcgQyAxNzcuMDQ4LDM0MC43NTI3IDE3NS42NjMsMzQxLjA4NDcgMTc0LjE1MSwzNDEuMDg0NyBDIDE3Mi42MiwzNDEuMDg0NyAxNzEuMjU4LDM0MC43MjA3IDE3MC4yNTIsMzQwLjE4ODcgQyAxNjkuMjYyLDMzOS42OTg3IDE2Ny45MzYsMzM5LjM5ODcgMTY2LjQ4NCwzMzkuMzk4NyBDIDE2NC45ODMsMzM5LjM5ODcgMTYzLjY1LDMzOS42OTE3IDE2Mi42NTIsMzQwLjIwOTcgQyAxNjEuNjQ2LDM0MC43Mzg3IDE2MC4yNTQsMzQxLjA4NDcgMTU4LjcyNywzNDEuMDg0NyBMIDE1OC43MjcsMzM4LjcxMDcgQyAxNjAuMjU0LDMzOC43MTA3IDE2MS42NDYsMzM4LjM0NzcgMTYyLjY1MiwzMzcuODE0NyBDIDE2My42NSwzMzcuMzAwNyAxNjQuOTgzLDMzNy4wMTQ3IDE2Ni40ODQsMzM3LjAxNDcgQyAxNjcuOTMyLDMzNy4wMTQ3IDE2OS4yNTgsMzM3LjMxMDcgMTcwLjI1MiwzMzcuNzk3NyBDIDE3MS4yNTQsMzM4LjMyOTcgMTcyLjYyLDMzOC42ODk3IDE3NC4xNTEsMzM4LjY4OTcgQyAxNzUuNjYzLDMzOC42ODk3IDE3Ny4wNDgsMzM4LjM1ODcgMTc4LjA1LDMzNy44MzY3IEMgMTc5LjA0OCwzMzcuMzIxNyAxODAuNDMzLDMzNy4wMTQ3IDE4MS45MywzMzcuMDE0NyBDIDE4My40MiwzMzcuMDE0NyAxODQuNzcxLDMzNy4zMjE3IDE4NS43NjksMzM3LjgzMjcgQyAxODYuNzc1LDMzOC4zNjU3IDE4OC4xMywzMzguNjg5NyAxODkuNjY0LDMzOC42ODk3IEwgMTg5LjY1LDM0MS4wODQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwOTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTY1LjQ3NCwzMTkuMjg5NyBDIDE2NS41MjcsMzE5LjQ5MDcgMTY1LjYwMSwzMTkuNjg4NyAxNjUuNjAxLDMxOS45MDM3IEMgMTY1LjYwMSwzMjEuMzU2NyAxNjQuMzQ2LDMyMi41MTI3IDE2Mi44MTIsMzIyLjUxMjcgTCAxODUuNTkxLDMyMi41MTI3IEMgMTg0LjA1NiwzMjIuNTEyNyAxODIuODAxLDMyMS4zNTY3IDE4Mi44MDEsMzE5LjkwMzcgQyAxODIuODAxLDMxOS42OTE3IDE4Mi44NDIsMzE5LjQ5MDcgMTgyLjg5NSwzMTkuMjg5NyBDIDE4Mi43NjQsMzE5LjMzNTcgMTgyLjYwOCwzMTkuMzQyNyAxODIuNDU5LDMxOS4zNDI3IEwgMTY1Ljg4NCwzMTkuMzQyNyBDIDE2NS43NSwzMTkuMzQyNyAxNjUuNTk0LDMxOS4zMjg3IDE2NS40NzQsMzE5LjI4OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTA5NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTc7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIgotICAgICAgICAgICBkPSJNIDE2NS40NzQsMzE5LjI4OTcgQyAxNjUuNTI3LDMxOS40OTA3IDE2NS42MDEsMzE5LjY4ODcgMTY1LjYwMSwzMTkuOTAzNyBDIDE2NS42MDEsMzIxLjM1NjcgMTY0LjM0NiwzMjIuNTEyNyAxNjIuODEyLDMyMi41MTI3IEwgMTg1LjU5MSwzMjIuNTEyNyBDIDE4NC4wNTYsMzIyLjUxMjcgMTgyLjgwMSwzMjEuMzU2NyAxODIuODAxLDMxOS45MDM3IEMgMTgyLjgwMSwzMTkuNjkxNyAxODIuODQyLDMxOS40OTA3IDE4Mi44OTUsMzE5LjI4OTcgQyAxODIuNzY0LDMxOS4zMzU3IDE4Mi42MDgsMzE5LjM0MjcgMTgyLjQ1OSwzMTkuMzQyNyBMIDE2NS44ODQsMzE5LjM0MjcgQyAxNjUuNzUsMzE5LjM0MjcgMTY1LjU5NCwzMTkuMzI4NyAxNjUuNDc0LDMxOS4yODk3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUwOTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMTY1Ljg4NCwzMTcuNzgzNyBMIDE4Mi40NTksMzE3Ljc4MzcgQyAxODMuMDIxLDMxNy43ODM3IDE4My40NzUsMzE4LjEzNjcgMTgzLjQ3NSwzMTguNTYzNyBDIDE4My40NzUsMzE4Ljk5MzcgMTgzLjAyMSwzMTkuMzQyNyAxODIuNDU5LDMxOS4zNDI3IEwgMTY1Ljg4NCwzMTkuMzQyNyBDIDE2NS4zMjIsMzE5LjM0MjcgMTY0Ljg2NywzMTguOTkzNyAxNjQuODY3LDMxOC41NjM3IEMgMTY0Ljg2NywzMTguMTM2NyAxNjUuMzIyLDMxNy43ODM3IDE2NS44ODQsMzE3Ljc4MzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTA5OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMTY1Ljg4NCwzMTcuNzgzNyBMIDE4Mi40NTksMzE3Ljc4MzcgQyAxODMuMDIxLDMxNy43ODM3IDE4My40NzUsMzE4LjEzNjcgMTgzLjQ3NSwzMTguNTYzNyBDIDE4My40NzUsMzE4Ljk5MzcgMTgzLjAyMSwzMTkuMzQyNyAxODIuNDU5LDMxOS4zNDI3IEwgMTY1Ljg4NCwzMTkuMzQyNyBDIDE2NS4zMjIsMzE5LjM0MjcgMTY0Ljg2NywzMTguOTkzNyAxNjQuODY3LDMxOC41NjM3IEMgMTY0Ljg2NywzMTguMTM2NyAxNjUuMzIyLDMxNy43ODM3IDE2NS44ODQsMzE3Ljc4MzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTEwMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNjIuODQyLDMyOC4zMDc3IEwgMTg1LjU2MSwzMjguMzA3NyBMIDE4NS41NjEsMzIyLjUxMjcgTCAxNjIuODQyLDMyMi41MTI3IEwgMTYyLjg0MiwzMjguMzA3NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTAzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAxNjIuODQyLDMyOC4zMDc3IEwgMTg1LjU2MSwzMjguMzA3NyBMIDE4NS41NjEsMzIyLjUxMjcgTCAxNjIuODQyLDMyMi41MTI3IEwgMTYyLjg0MiwzMjguMzA3NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTA1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDE2MS4wNjUsMjk3LjI3NjcgQyAxNTguODE2LDI5OC41NzQ3IDE1Ny4yOTMsMjk5LjkwMzcgMTU3LjUzOSwzMDAuNTY2NyBDIDE1Ny42NjIsMzAxLjE3NjcgMTU4LjM3NywzMDEuNjMxNyAxNTkuMzk3LDMwMi4zMDg3IEMgMTYxLjAwMiwzMDMuNDI2NyAxNjEuOTc4LDMwNS40MjI3IDE2MS4yMTQsMzA2LjM0MzcgQyAxNjIuNTQ0LDMwNS4yNzE3IDE2My4zODUsMzAzLjY3MDcgMTYzLjM4NSwzMDEuODg5NyBDIDE2My4zODUsMzAwLjAyNzcgMTYyLjQ5OSwyOTguMzQ4NyAxNjEuMDY1LDI5Ny4yNzY3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxMDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDE2MS4wNjUsMjk3LjI3NjcgQyAxNTguODE2LDI5OC41NzQ3IDE1Ny4yOTMsMjk5LjkwMzcgMTU3LjUzOSwzMDAuNTY2NyBDIDE1Ny42NjIsMzAxLjE3NjcgMTU4LjM3NywzMDEuNjMxNyAxNTkuMzk3LDMwMi4zMDg3IEMgMTYxLjAwMiwzMDMuNDI2NyAxNjEuOTc4LDMwNS40MjI3IDE2MS4yMTQsMzA2LjM0MzcgQyAxNjIuNTQ0LDMwNS4yNzE3IDE2My4zODUsMzAzLjY3MDcgMTYzLjM4NSwzMDEuODg5NyBDIDE2My4zODUsMzAwLjAyNzcgMTYyLjQ5OSwyOTguMzQ4NyAxNjEuMDY1LDI5Ny4yNzY3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxMDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjY2NjY2MiCi0gICAgICAgICAgIGQ9Ik0gMTY2LjA5NiwzMTYuODQ1NyBMIDE4Mi4yMzksMzE2Ljg0NTcgTCAxODIuMjM5LDIzNy43NTQ3IEwgMTY2LjA5NiwyMzcuNzU0NyBMIDE2Ni4wOTYsMzE2Ljg0NTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTExMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTc7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXIiCi0gICAgICAgICAgIGQ9Ik0gMTc3LjYwMywyMzcuODYzNyBMIDE3Ny42MDMsMzE2Ljc4MjcgTSAxNzkuNDE2LDIzNy44NjM3IEwgMTc5LjQxNiwzMTYuNzgyNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTEzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAxNjYuMDk2LDMxNi44NDU3IEwgMTgyLjIzOSwzMTYuODQ1NyBMIDE4Mi4yMzksMjM3Ljc1NDcgTCAxNjYuMDk2LDIzNy43NTQ3IEwgMTY2LjA5NiwzMTYuODQ1NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTE1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDE5OC43MjgsMjY3LjMzODcgQyAxOTUuMjA2LDI2NS44ODI3IDE4OS4yMTgsMjY0LjgwMzcgMTgyLjM0NywyNjQuNTc3NyBDIDE3OS45NzksMjY0LjU5NTcgMTc3LjMzOSwyNjQuODE3NyAxNzQuNjEzLDI2NS4yNzI3IEMgMTY0Ljk1NywyNjYuODgzNyAxNTcuNjAyLDI3MC43Mzg3IDE1OC4xODcsMjczLjg3NzcgQyAxNTguMTk4LDI3My45NDQ3IDE1OC4yMiwyNzQuMDgxNyAxNTguMjM1LDI3NC4xNDE3IEMgMTU4LjIzNSwyNzQuMTQxNyAxNTQuNjE2LDI2NS45ODQ3IDE1NC41NTYsMjY1LjY3NDcgQyAxNTMuOTEyLDI2Mi4xOTA3IDE2Mi4wNzEsMjU3LjkwODcgMTcyLjc4OCwyNTYuMTIwNyBDIDE3Ni4xNTEsMjU1LjU1OTcgMTc5LjQzMSwyNTUuMzQxNyAxODIuMjgsMjU1LjM2OTcgQyAxODkuMTM2LDI1NS4zNjk3IDE5NS4wOTQsMjU2LjI0NzcgMTk4LjY4MywyNTcuNTgwNyBMIDE5OC43MjgsMjY3LjMzODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTExNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTc7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIgotICAgICAgICAgICBkPSJNIDE5OC43MjgsMjY3LjMzODcgQyAxOTUuMjA2LDI2NS44ODI3IDE4OS4yMTgsMjY0LjgwMzcgMTgyLjM0NywyNjQuNTc3NyBDIDE3OS45NzksMjY0LjU5NTcgMTc3LjMzOSwyNjQuODE3NyAxNzQuNjEzLDI2NS4yNzI3IEMgMTY0Ljk1NywyNjYuODgzNyAxNTcuNjAyLDI3MC43Mzg3IDE1OC4xODcsMjczLjg3NzcgQyAxNTguMTk4LDI3My45NDQ3IDE1OC4yMiwyNzQuMDgxNyAxNTguMjM1LDI3NC4xNDE3IEMgMTU4LjIzNSwyNzQuMTQxNyAxNTQuNjE2LDI2NS45ODQ3IDE1NC41NTYsMjY1LjY3NDcgQyAxNTMuOTEyLDI2Mi4xOTA3IDE2Mi4wNzEsMjU3LjkwODcgMTcyLjc4OCwyNTYuMTIwNyBDIDE3Ni4xNTEsMjU1LjU1OTcgMTc5LjQzMSwyNTUuMzQxNyAxODIuMjgsMjU1LjM2OTcgQyAxODkuMTM2LDI1NS4zNjk3IDE5NS4wOTQsMjU2LjI0NzcgMTk4LjY4MywyNTcuNTgwNyBMIDE5OC43MjgsMjY3LjMzODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTExOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAxNjYuMDcsMjc3LjI2NjcgQyAxNjEuNTk0LDI3Ni45NDU3IDE1OC41MzcsMjc1Ljc0OTcgMTU4LjE4NywyNzMuODc3NyBDIDE1Ny45MTEsMjcyLjM4NTcgMTU5LjQyMywyNzAuNzM1NyAxNjIuMTI3LDI2OS4yMzY3IEMgMTYzLjMzMywyNjkuMzY2NyAxNjQuNjkyLDI2OS41MzI3IDE2Ni4wOTYsMjY5LjUzMjcgTCAxNjYuMDcsMjc3LjI2NjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTEyMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMTY2LjA3LDI3Ny4yNjY3IEMgMTYxLjU5NCwyNzYuOTQ1NyAxNTguNTM3LDI3NS43NDk3IDE1OC4xODcsMjczLjg3NzcgQyAxNTcuOTExLDI3Mi4zODU3IDE1OS40MjMsMjcwLjczNTcgMTYyLjEyNywyNjkuMjM2NyBDIDE2My4zMzMsMjY5LjM2NjcgMTY0LjY5MiwyNjkuNTMyNyAxNjYuMDk2LDI2OS41MzI3IEwgMTY2LjA3LDI3Ny4yNjY3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxMjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMTgyLjI2OSwyNzEuMjIxNyBDIDE4NS4wNjUsMjcxLjY0NDcgMTg3LjE2NiwyNzIuMzM5NyAxODguMjEyLDI3My4xOTM3IEwgMTg4LjMwNSwyNzMuMzY1NyBDIDE4OC44MDQsMjc0LjM4ODcgMTg2LjM0NywyNzYuNTY0NyAxODIuMjQzLDI3OC45OTQ3IEwgMTgyLjI2OSwyNzEuMjIxNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTI1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAxODIuMjY5LDI3MS4yMjE3IEMgMTg1LjA2NSwyNzEuNjQ0NyAxODcuMTY2LDI3Mi4zMzk3IDE4OC4yMTIsMjczLjE5MzcgTCAxODguMzA1LDI3My4zNjU3IEMgMTg4LjgwNCwyNzQuMzg4NyAxODYuMzQ3LDI3Ni41NjQ3IDE4Mi4yNDMsMjc4Ljk5NDcgTCAxODIuMjY5LDI3MS4yMjE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxMjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMTU2LjA0MiwyOTIuNTIyNyBDIDE1NS42MTcsMjkxLjI0NTcgMTU5Ljk4MiwyODguNjg5NyAxNjYuMTUyLDI4Ni40MjU3IEMgMTY4Ljk3MSwyODUuNDE2NyAxNzEuMjk4LDI4NC4zNjU3IDE3NC4xODQsMjgzLjA5MjcgQyAxODIuNzUzLDI3OS4zMDQ3IDE4OS4wODQsMjc0Ljk1NjcgMTg4LjMwNSwyNzMuMzY5NyBMIDE4OC4yMiwyNzMuMjA3NyBDIDE4OC42NzgsMjczLjU3NzcgMTg5LjM4NSwyODEuMzg4NyAxODkuMzg1LDI4MS4zODg3IEMgMTkwLjE2NywyODIuODQxNyAxODQuMzczLDI4Ny4xMjY3IDE3Ni40ODIsMjkwLjkwNzcgQyAxNzMuOTU3LDI5Mi4xMTM3IDE2OC42MjUsMjk0LjA4NDcgMTY2LjEwNywyOTQuOTY2NyBDIDE2MS42MDUsMjk2LjUyODcgMTU3LjEyOSwyOTkuNDczNyAxNTcuNTM5LDMwMC41NjY3IEwgMTU2LjA0MiwyOTIuNTI2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTI5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NztzdHJva2UtbGluZWpvaW46cm91bmQiCi0gICAgICAgICAgIGQ9Ik0gMTU2LjA0MiwyOTIuNTIyNyBDIDE1NS42MTcsMjkxLjI0NTcgMTU5Ljk4MiwyODguNjg5NyAxNjYuMTUyLDI4Ni40MjU3IEMgMTY4Ljk3MSwyODUuNDE2NyAxNzEuMjk4LDI4NC4zNjU3IDE3NC4xODQsMjgzLjA5MjcgQyAxODIuNzUzLDI3OS4zMDQ3IDE4OS4wODQsMjc0Ljk1NjcgMTg4LjMwNSwyNzMuMzY5NyBMIDE4OC4yMiwyNzMuMjA3NyBDIDE4OC42NzgsMjczLjU3NzcgMTg5LjM4NSwyODEuMzg4NyAxODkuMzg1LDI4MS4zODg3IEMgMTkwLjE2NywyODIuODQxNyAxODQuMzczLDI4Ny4xMjY3IDE3Ni40ODIsMjkwLjkwNzcgQyAxNzMuOTU3LDI5Mi4xMTM3IDE2OC42MjUsMjk0LjA4NDcgMTY2LjEwNywyOTQuOTY2NyBDIDE2MS42MDUsMjk2LjUyODcgMTU3LjEyOSwyOTkuNDczNyAxNTcuNTM5LDMwMC41NjY3IEwgMTU2LjA0MiwyOTIuNTI2NyBMIDE1Ni4wNDIsMjkyLjUyMjcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTEzMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxNjQuOTgzLDI2My41NDQ3IEMgMTY2Ljk1NywyNjIuODI0NyAxNjguMjQ5LDI2MS45NzQ3IDE2Ny42MTYsMjYwLjQxOTcgQyAxNjcuMjE3LDI1OS40MzI3IDE2Ni4xOTcsMjU5LjI0MTcgMTY0LjY3NCwyNTkuNzk5NyBMIDE2MS45NzQsMjYwLjc3OTcgTCAxNjQuNDA2LDI2Ni43NzE3IEMgMTY0LjY3LDI2Ni42NTE3IDE2NC45MzQsMjY2LjUyNzcgMTY1LjIxLDI2Ni40MjU3IEMgMTY1LjQ4MiwyNjYuMzI2NyAxNjUuNzY5LDI2Ni4yNTI3IDE2Ni4wNDgsMjY2LjE3MTcgTCAxNjQuOTgzLDI2My41NDc3IEwgMTY0Ljk4MywyNjMuNTQ0NyB6IE0gMTYzLjgxLDI2MC42NTI3IEwgMTY0LjQ5MSwyNjAuNDA1NyBDIDE2NS4wNTcsMjYwLjE5NzcgMTY1LjY5OCwyNjAuNDk3NyAxNjUuOTgxLDI2MS4xOTU3IEMgMTY2LjE5MywyNjEuNzI4NyAxNjYuMTM3LDI2Mi4zMjA3IDE2NS40ODYsMjYyLjczNjcgQyAxNjUuMjczLDI2Mi44Njc3IDE2NS4wMjgsMjYyLjk2NTcgMTY0Ljc4OSwyNjMuMDYxNyBMIDE2My44MSwyNjAuNjUyNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTMzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDE3MS4yOTEsMjU4LjE0NTcgQyAxNzEuMDA4LDI1OC4yMjI3IDE3MC43MjUsMjU4LjMwNzcgMTcwLjQzOCwyNTguMzYzNyBDIDE3MC4xNTIsMjU4LjQyMDcgMTY5Ljg1NywyNTguNDUxNyAxNjkuNTY3LDI1OC40OTA3IEwgMTcwLjk2NywyNjQuNzIyNyBMIDE3NS4zMiwyNjMuODQ3NyBDIDE3NS4yNjgsMjYzLjcyNDcgMTc1LjIwMSwyNjMuNTkzNyAxNzUuMTc1LDI2My40NjY3IEMgMTc1LjE0NSwyNjMuMzM2NyAxNzUuMTQ5LDI2My4xOTE3IDE3NS4xNDEsMjYzLjA2MTcgQyAxNzQuMzc4LDI2My4yNzk3IDE3My41NDQsMjYzLjUxNjcgMTcyLjU0MiwyNjMuNzE3NyBMIDE3MS4yOTUsMjU4LjE0NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTEzNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxODAuMDA5LDI2My41MTk3IEMgMTgwLjgzMiwyNjEuMjU5NyAxODEuODI2LDI1OS4wOTM3IDE4Mi44MDUsMjU2LjkwMDcgQyAxODIuNjMsMjU2LjkyODcgMTgyLjQ0NCwyNTYuOTUzNyAxODIuMjY5LDI1Ni45NjM3IEMgMTgyLjA5NCwyNTYuOTc0NyAxODEuOTA0LDI1Ni45Nzc3IDE4MS43MjksMjU2Ljk3MDcgQyAxODEuMjA4LDI1OC41NjE3IDE4MC41NiwyNjAuMTUxNyAxNzkuODc4LDI2MS43MzU3IEMgMTc5LjA1OSwyNjAuMjMyNyAxNzguMTU0LDI1OC43NjU3IDE3Ny40NjUsMjU3LjI1MjcgQyAxNzcuMTI2LDI1Ny4yOTU3IDE3Ni43OCwyNTcuMzQ0NyAxNzYuNDM3LDI1Ny4zNjk3IEMgMTc2LjA5OSwyNTcuMzkwNyAxNzUuNzQ1LDI1Ny4zODY3IDE3NS40MDYsMjU3LjM5MDcgQyAxNzYuNjYxLDI1OS40MzU3IDE3Ny44NzEsMjYxLjQ3NDcgMTc5LjAxOCwyNjMuNTgzNyBDIDE3OS4xNzgsMjYzLjU1NDcgMTc5LjM0MiwyNjMuNTE2NyAxNzkuNTE2LDI2My41MDU3IEMgMTc5LjY3NywyNjMuNDk0NyAxNzkuODQ1LDI2My41MDk3IDE4MC4wMDksMjYzLjUxNjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTEzNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAxODkuMTEsMjU4LjcyMzcgQyAxODkuMjYyLDI1OC40MjA3IDE4OS40MTUsMjU4LjEyMzcgMTg5LjU4NiwyNTcuODQxNyBDIDE4OS4zNTIsMjU3LjYxOTcgMTg4LjYzMywyNTcuMjk1NyAxODcuNzkxLDI1Ny4yMTA3IEMgMTg2LjAxNSwyNTcuMDM0NyAxODQuOTk1LDI1Ny44MjQ3IDE4NC44NzYsMjU4Ljg5NjcgQyAxODQuNjI2LDI2MS4xMzk3IDE4OC4xNjcsMjYwLjk0NTcgMTg4LjAwNCwyNjIuNDMzNyBDIDE4Ny45MzMsMjYzLjA3NTcgMTg3LjI1MSwyNjMuMzM2NyAxODYuNTI5LDI2My4yNjU3IEMgMTg1LjcyMSwyNjMuMTg0NyAxODUuMTMzLDI2Mi43NDA3IDE4NS4wMjgsMjYyLjA4MDcgTCAxODQuODA5LDI2Mi4wNTk3IEMgMTg0LjY5MywyNjIuNDUxNyAxODQuNTIyLDI2Mi44Mjg3IDE4NC4zMzksMjYzLjIwNTcgQyAxODQuODU2LDI2My41NDA3IDE4NS41MzEsMjYzLjczMTcgMTg2LjE3NSwyNjMuNzk0NyBDIDE4Ny45ODUsMjYzLjk3NDcgMTg5LjM2NywyNjMuMjQ4NyAxODkuNDk3LDI2Mi4wNTY3IEMgMTg5LjczMiwyNTkuOTI1NyAxODYuMTU3LDI1OS44MDI3IDE4Ni4yOTQsMjU4LjU0NzcgQyAxODYuMzU0LDI1OC4wMTg3IDE4Ni43NiwyNTcuNjcyNyAxODcuNjgzLDI1Ny43NjQ3IEMgMTg4LjM0NiwyNTcuODMxNyAxODguNzU2LDI1OC4xOTA3IDE4OC45MzUsMjU4LjcwNTcgTCAxODkuMTEsMjU4LjcyMzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTEzOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAzMjIuMzE5LDIxOS42MTY3IEMgMzIyLjMxOSwyMTkuNjE2NyAzMjEuNTg5LDIyMC4zODU3IDMyMS4wNTYsMjIwLjQ5NDcgQyAzMjAuNTI0LDIyMC42MDA3IDMxOS44NSwyMjAuMDE1NyAzMTkuODUsMjIwLjAxNTcgQyAzMTkuODUsMjIwLjAxNTcgMzE5LjM3LDIyMC41MTU3IDMxOC43ODEsMjIwLjY0OTcgQyAzMTguMTkzLDIyMC43ODM3IDMxNy4zNzYsMjE5Ljk4NjcgMzE3LjM3NiwyMTkuOTg2NyBDIDMxNy4zNzYsMjE5Ljk4NjcgMzE2LjgxNSwyMjAuNzgzNyAzMTYuMzExLDIyMC45NzA3IEMgMzE1LjgwNiwyMjEuMTU3NyAzMTUuMTkxLDIyMC43MzE3IDMxNS4xOTEsMjIwLjczMTcgQyAzMTUuMTkxLDIyMC43MzE3IDMxNC45NjgsMjIxLjEyNjcgMzE0LjU0NywyMjEuMzQ0NyBDIDMxNC4zNjgsMjIxLjQyOTcgMzE0LjA3MSwyMjEuMjg4NyAzMTQuMDcxLDIyMS4yODg3IEwgMzEzLjQ3NywyMjAuOTE3NyBMIDMxMi44MDMsMjIwLjE5ODcgTCAzMTIuMTg2LDIxOS45NTg3IEMgMzEyLjE4NiwyMTkuOTU4NyAzMTEuOTA3LDIxOS4wNTU3IDMxMS44NzcsMjE4Ljg5NzcgQyAzMTEuODU1LDIxOC43Mzg3IDMxMS43OTUsMjE4LjMzNjcgMzExLjc5NSwyMTguMzM2NyBDIDMxMS42NjksMjE3LjY5MTcgMzEyLjY2MywyMTYuOTQzNyAzMTQuMDgxLDIxNi42MjI3IEMgMzE0Ljg5NywyMTYuNDMyNyAzMTUuNjA3LDIxNi40NDY3IDMxNi4xMywyMTYuNjA4NyBDIDMxNi42OTYsMjE2LjEyNTcgMzE3Ljg5NSwyMTUuNzkwNyAzMTkuMzA2LDIxNS43OTA3IEMgMzIwLjU4MywyMTUuNzkwNyAzMjEuNzA0LDIxNi4wNjE3IDMyMi4zMjMsMjE2LjQ4MTcgQyAzMjIuOTMzLDIxNi4wNjE3IDMyNC4wNTQsMjE1Ljc5MDcgMzI1LjMzNSwyMTUuNzkwNyBDIDMyNi43MzksMjE1Ljc5MDcgMzI3LjkzNywyMTYuMTI1NyAzMjguNTA0LDIxNi42MDg3IEMgMzI5LjAyOSwyMTYuNDQ2NyAzMjkuNzM2LDIxNi40MzU3IDMzMC41NTYsMjE2LjYyMjcgQyAzMzEuOTcsMjE2Ljk0MzcgMzMyLjk2OSwyMTcuNjkxNyAzMzIuODQxLDIxOC4zMzY3IEMgMzMyLjg0MSwyMTguMzM2NyAzMzIuNzgyLDIxOC43Mzg3IDMzMi43NTcsMjE4Ljg5NzcgQyAzMzIuNzI3LDIxOS4wNTU3IDMzMi40NDgsMjE5Ljk1ODcgMzMyLjQ0OCwyMTkuOTU4NyBMIDMzMS44MjksMjIwLjE5ODcgTCAzMzEuMTU1LDIyMC45MTc3IEwgMzMwLjU3MSwyMjEuMjg4NyBDIDMzMC41NzEsMjIxLjI4ODcgMzMwLjI3MywyMjEuNDI5NyAzMzAuMDk0LDIyMS4zNDQ3IEMgMzI5LjY3MywyMjEuMTI5NyAzMjkuNDQ2LDIyMC43MzE3IDMyOS40NDYsMjIwLjczMTcgQyAzMjkuNDQ2LDIyMC43MzE3IDMyOC44MjgsMjIxLjE1NzcgMzI4LjMyNSwyMjAuOTcwNyBDIDMyNy44MTksMjIwLjc4MzcgMzI3LjI1NywyMTkuOTg2NyAzMjcuMjU3LDIxOS45ODY3IEMgMzI3LjI1NywyMTkuOTg2NyAzMjYuNDQ1LDIyMC43ODM3IDMyNS44NTIsMjIwLjY0OTcgQyAzMjUuMjY0LDIyMC41MTU3IDMyNC43ODYsMjIwLjAxNTcgMzI0Ljc4NiwyMjAuMDE1NyBDIDMyNC43ODYsMjIwLjAxNTcgMzI0LjExMiwyMjAuNjAwNyAzMjMuNTgxLDIyMC40OTQ3IEMgMzIzLjA0NSwyMjAuMzg1NyAzMjIuMzIzLDIxOS42MTY3IDMyMi4zMjMsMjE5LjYxNjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTE0MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjgxNjg5OSIKLSAgICAgICAgICAgZD0iTSAzMjIuMzE5LDIxOS42MTY3IEMgMzIyLjMxOSwyMTkuNjE2NyAzMjEuNTg5LDIyMC4zODU3IDMyMS4wNTYsMjIwLjQ5NDcgQyAzMjAuNTI0LDIyMC42MDA3IDMxOS44NSwyMjAuMDE1NyAzMTkuODUsMjIwLjAxNTcgQyAzMTkuODUsMjIwLjAxNTcgMzE5LjM3LDIyMC41MTU3IDMxOC43ODEsMjIwLjY0OTcgQyAzMTguMTkzLDIyMC43ODM3IDMxNy4zNzYsMjE5Ljk4NjcgMzE3LjM3NiwyMTkuOTg2NyBDIDMxNy4zNzYsMjE5Ljk4NjcgMzE2LjgxNSwyMjAuNzgzNyAzMTYuMzExLDIyMC45NzA3IEMgMzE1LjgwNiwyMjEuMTU3NyAzMTUuMTkxLDIyMC43MzE3IDMxNS4xOTEsMjIwLjczMTcgQyAzMTUuMTkxLDIyMC43MzE3IDMxNC45NjgsMjIxLjEyNjcgMzE0LjU0NywyMjEuMzQ0NyBDIDMxNC4zNjgsMjIxLjQyOTcgMzE0LjA3MSwyMjEuMjg4NyAzMTQuMDcxLDIyMS4yODg3IEwgMzEzLjQ3NywyMjAuOTE3NyBMIDMxMi44MDMsMjIwLjE5ODcgTCAzMTIuMTg2LDIxOS45NTg3IEMgMzEyLjE4NiwyMTkuOTU4NyAzMTEuOTA3LDIxOS4wNTU3IDMxMS44NzcsMjE4Ljg5NzcgQyAzMTEuODU1LDIxOC43Mzg3IDMxMS43OTUsMjE4LjMzNjcgMzExLjc5NSwyMTguMzM2NyBDIDMxMS42NjksMjE3LjY5MTcgMzEyLjY2MywyMTYuOTQzNyAzMTQuMDgxLDIxNi42MjI3IEMgMzE0Ljg5NywyMTYuNDMyNyAzMTUuNjA3LDIxNi40NDY3IDMxNi4xMywyMTYuNjA4NyBDIDMxNi42OTYsMjE2LjEyNTcgMzE3Ljg5NSwyMTUuNzkwNyAzMTkuMzA2LDIxNS43OTA3IEMgMzIwLjU4MywyMTUuNzkwNyAzMjEuNzA0LDIxNi4wNjE3IDMyMi4zMjMsMjE2LjQ4MTcgQyAzMjIuOTMzLDIxNi4wNjE3IDMyNC4wNTQsMjE1Ljc5MDcgMzI1LjMzNSwyMTUuNzkwNyBDIDMyNi43MzksMjE1Ljc5MDcgMzI3LjkzNywyMTYuMTI1NyAzMjguNTA0LDIxNi42MDg3IEMgMzI5LjAyOSwyMTYuNDQ2NyAzMjkuNzM2LDIxNi40MzU3IDMzMC41NTYsMjE2LjYyMjcgQyAzMzEuOTcsMjE2Ljk0MzcgMzMyLjk2OSwyMTcuNjkxNyAzMzIuODQxLDIxOC4zMzY3IEMgMzMyLjg0MSwyMTguMzM2NyAzMzIuNzgyLDIxOC43Mzg3IDMzMi43NTcsMjE4Ljg5NzcgQyAzMzIuNzI3LDIxOS4wNTU3IDMzMi40NDgsMjE5Ljk1ODcgMzMyLjQ0OCwyMTkuOTU4NyBMIDMzMS44MjksMjIwLjE5ODcgTCAzMzEuMTU1LDIyMC45MTc3IEwgMzMwLjU3MSwyMjEuMjg4NyBDIDMzMC41NzEsMjIxLjI4ODcgMzMwLjI3MywyMjEuNDI5NyAzMzAuMDk0LDIyMS4zNDQ3IEMgMzI5LjY3MywyMjEuMTI5NyAzMjkuNDQ2LDIyMC43MzE3IDMyOS40NDYsMjIwLjczMTcgQyAzMjkuNDQ2LDIyMC43MzE3IDMyOC44MjgsMjIxLjE1NzcgMzI4LjMyNSwyMjAuOTcwNyBDIDMyNy44MTksMjIwLjc4MzcgMzI3LjI1NywyMTkuOTg2NyAzMjcuMjU3LDIxOS45ODY3IEMgMzI3LjI1NywyMTkuOTg2NyAzMjYuNDQ1LDIyMC43ODM3IDMyNS44NTIsMjIwLjY0OTcgQyAzMjUuMjY0LDIyMC41MTU3IDMyNC43ODYsMjIwLjAxNTcgMzI0Ljc4NiwyMjAuMDE1NyBDIDMyNC43ODYsMjIwLjAxNTcgMzI0LjExMiwyMjAuNjAwNyAzMjMuNTgxLDIyMC40OTQ3IEMgMzIzLjA0NSwyMjAuMzg1NyAzMjIuMzIzLDIxOS42MTY3IDMyMi4zMjMsMjE5LjYxNjcgTCAzMjIuMzE5LDIxOS42MTY3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxNDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzIwLjkzLDIxNS40MTk3IEMgMzIwLjkzLDIxNC4zNDQ3IDMyMS41NDEsMjEzLjQ3MzcgMzIyLjI5NiwyMTMuNDczNyBDIDMyMy4wNTIsMjEzLjQ3MzcgMzIzLjY2NywyMTQuMzQ0NyAzMjMuNjY3LDIxNS40MTk3IEMgMzIzLjY2NywyMTYuNDk5NyAzMjMuMDUyLDIxNy4zNzM3IDMyMi4yOTYsMjE3LjM3MzcgQyAzMjEuNTQxLDIxNy4zNzM3IDMyMC45MywyMTYuNDk5NyAzMjAuOTMsMjE1LjQxOTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTE0NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzIwLjkzLDIxNS40MTk3IEMgMzIwLjkzLDIxNC4zNDQ3IDMyMS41NDEsMjEzLjQ3MzcgMzIyLjI5NiwyMTMuNDczNyBDIDMyMy4wNTIsMjEzLjQ3MzcgMzIzLjY2NywyMTQuMzQ0NyAzMjMuNjY3LDIxNS40MTk3IEMgMzIzLjY2NywyMTYuNDk5NyAzMjMuMDUyLDIxNy4zNzM3IDMyMi4yOTYsMjE3LjM3MzcgQyAzMjEuNTQxLDIxNy4zNzM3IDMyMC45MywyMTYuNDk5NyAzMjAuOTMsMjE1LjQxOTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTE0NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMjEuNjkzLDIxNS40MTk3IEMgMzIxLjY5MywyMTQuNDMyNyAzMjEuOTc2LDIxMy42Mjg3IDMyMi4zMjMsMjEzLjYyODcgQyAzMjIuNjcyLDIxMy42Mjg3IDMyMi45NTIsMjE0LjQzMjcgMzIyLjk1MiwyMTUuNDE5NyBDIDMyMi45NTIsMjE2LjQxMDcgMzIyLjY3MiwyMTcuMjE1NyAzMjIuMzIzLDIxNy4yMTU3IEMgMzIxLjk3NiwyMTcuMjE1NyAzMjEuNjkzLDIxNi40MTA3IDMyMS42OTMsMjE1LjQxOTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTE0OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzIxLjY5MywyMTUuNDE5NyBDIDMyMS42OTMsMjE0LjQzMjcgMzIxLjk3NiwyMTMuNjI4NyAzMjIuMzIzLDIxMy42Mjg3IEMgMzIyLjY3MiwyMTMuNjI4NyAzMjIuOTUyLDIxNC40MzI3IDMyMi45NTIsMjE1LjQxOTcgQyAzMjIuOTUyLDIxNi40MTA3IDMyMi42NzIsMjE3LjIxNTcgMzIyLjMyMywyMTcuMjE1NyBDIDMyMS45NzYsMjE3LjIxNTcgMzIxLjY5MywyMTYuNDEwNyAzMjEuNjkzLDIxNS40MTk3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxNTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzE1LjI2OSwyMjMuNDE4NyBDIDMxNS4wNjgsMjIyLjg1MDcgMzE0LjY5MSwyMjIuMzQyNyAzMTQuNjkxLDIyMi4zNDI3IEMgMzE2LjYyNSwyMjEuNzc0NyAzMTkuMzE3LDIyMS40MTg3IDMyMi4zMTEsMjIxLjQxMTcgQyAzMjUuMzA1LDIyMS40MTg3IDMyOC4wMTYsMjIxLjc3NDcgMzI5Ljk0OSwyMjIuMzQyNyBDIDMyOS45NDksMjIyLjM0MjcgMzI5LjczMywyMjIuNzIzNyAzMjkuNDMxLDIyMy4yNTI3IEMgMzI5LjI2NCwyMjMuNTQ1NyAzMjkuMDQ0LDIyNC4wNTY3IDMyOS4wNTksMjI0LjA1NjcgQyAzMjcuMzEyLDIyMy41MjA3IDMyNS4wNjMsMjIzLjI0NTcgMzIyLjMsMjIzLjI0MjcgQyAzMTkuNTMzLDIyMy4yNDU3IDMxNi44NzQsMjIzLjU4NDcgMzE1LjQ4OCwyMjQuMDkxNyBDIDMxNS41MDgsMjI0LjA5MTcgMzE1LjM5MiwyMjMuNzcxNyAzMTUuMjU0LDIyMy40MTg3IEwgMzE1LjI2OSwyMjMuNDE4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTUzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMTUuMjY5LDIyMy40MTg3IEMgMzE1LjA2OCwyMjIuODUwNyAzMTQuNjkxLDIyMi4zNDI3IDMxNC42OTEsMjIyLjM0MjcgQyAzMTYuNjI1LDIyMS43NzQ3IDMxOS4zMTcsMjIxLjQxODcgMzIyLjMxMSwyMjEuNDExNyBDIDMyNS4zMDUsMjIxLjQxODcgMzI4LjAxNiwyMjEuNzc0NyAzMjkuOTQ5LDIyMi4zNDI3IEMgMzI5Ljk0OSwyMjIuMzQyNyAzMjkuNzMzLDIyMi43MjM3IDMyOS40MzEsMjIzLjI1MjcgQyAzMjkuMjY0LDIyMy41NDU3IDMyOS4wNDQsMjI0LjA1NjcgMzI5LjA1OSwyMjQuMDU2NyBDIDMyNy4zMTIsMjIzLjUyMDcgMzI1LjA2MywyMjMuMjQ1NyAzMjIuMywyMjMuMjQyNyBDIDMxOS41MzMsMjIzLjI0NTcgMzE2Ljg3NCwyMjMuNTg0NyAzMTUuNDg4LDIyNC4wOTE3IEMgMzE1LjUwOCwyMjQuMDkxNyAzMTUuMzkyLDIyMy43NzE3IDMxNS4yNTQsMjIzLjQxODcgTCAzMTUuMjY5LDIyMy40MTg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxNTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzIyLjMxMSwyMjUuODc2NyBDIDMyNC43MjcsMjI1Ljg3MjcgMzI3LjM4NywyMjUuNTA2NyAzMjguMzcsMjI1LjI1MjcgQyAzMjkuMDI1LDIyNS4wNjE3IDMyOS40MDksMjI0Ljc2NTcgMzI5LjMzOCwyMjQuNDIzNyBDIDMyOS4zMDUsMjI0LjI2MTcgMzI5LjE2MywyMjQuMTIwNyAzMjguOTcyLDIyNC4wMzk3IEMgMzI3LjUzMSwyMjMuNTc3NyAzMjQuOTMzLDIyMy4yNDk3IDMyMi4zMTEsMjIzLjI0NTcgQyAzMTkuNjk0LDIyMy4yNDk3IDMxNy4wODMsMjIzLjU3NzcgMzE1LjYzNywyMjQuMDM5NyBDIDMxNS40NTIsMjI0LjEyMDcgMzE1LjMwNiwyMjQuMjYxNyAzMTUuMjc2LDIyNC40MjM3IEMgMzE1LjIwMiwyMjQuNzY1NyAzMTUuNTg2LDIyNS4wNjE3IDMxNi4yNDUsMjI1LjI1MjcgQyAzMTcuMjI1LDIyNS41MDY3IDMxOS44OTcsMjI1Ljg3MjcgMzIyLjMxMSwyMjUuODc2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTU3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMjIuMzExLDIyNS44NzY3IEMgMzI0LjcyNywyMjUuODcyNyAzMjcuMzg3LDIyNS41MDY3IDMyOC4zNywyMjUuMjUyNyBDIDMyOS4wMjUsMjI1LjA2MTcgMzI5LjQwOSwyMjQuNzY1NyAzMjkuMzM4LDIyNC40MjM3IEMgMzI5LjMwNSwyMjQuMjYxNyAzMjkuMTYzLDIyNC4xMjA3IDMyOC45NzIsMjI0LjAzOTcgQyAzMjcuNTMxLDIyMy41Nzc3IDMyNC45MzMsMjIzLjI0OTcgMzIyLjMxMSwyMjMuMjQ1NyBDIDMxOS42OTQsMjIzLjI0OTcgMzE3LjA4MywyMjMuNTc3NyAzMTUuNjM3LDIyNC4wMzk3IEMgMzE1LjQ1MiwyMjQuMTIwNyAzMTUuMzA2LDIyNC4yNjE3IDMxNS4yNzYsMjI0LjQyMzcgQyAzMTUuMjAyLDIyNC43NjU3IDMxNS41ODYsMjI1LjA2MTcgMzE2LjI0NSwyMjUuMjUyNyBDIDMxNy4yMjUsMjI1LjUwNjcgMzE5Ljg5NywyMjUuODcyNyAzMjIuMzExLDIyNS44NzY3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxNTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMzI4LjE2OSwyMTYuMjkxNyBDIDMyOC4xNjksMjE2LjA1NDcgMzI4LjM3LDIxNS44NjQ3IDMyOC42MTUsMjE1Ljg2NDcgQyAzMjguODY1LDIxNS44NjQ3IDMyOS4wNjYsMjE2LjA1NDcgMzI5LjA2NiwyMTYuMjkxNyBDIDMyOS4wNjYsMjE2LjUyNzcgMzI4Ljg2NSwyMTYuNzE0NyAzMjguNjE1LDIxNi43MTQ3IEMgMzI4LjM3LDIxNi43MTQ3IDMyOC4xNjksMjE2LjUyNzcgMzI4LjE2OSwyMTYuMjkxNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTYxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjIwNjU2MSIKLSAgICAgICAgICAgZD0iTSAzMjguMTY5LDIxNi4yOTE3IEMgMzI4LjE2OSwyMTYuMDU0NyAzMjguMzcsMjE1Ljg2NDcgMzI4LjYxNSwyMTUuODY0NyBDIDMyOC44NjUsMjE1Ljg2NDcgMzI5LjA2NiwyMTYuMDU0NyAzMjkuMDY2LDIxNi4yOTE3IEMgMzI5LjA2NiwyMTYuNTI3NyAzMjguODY1LDIxNi43MTQ3IDMyOC42MTUsMjE2LjcxNDcgQyAzMjguMzcsMjE2LjcxNDcgMzI4LjE2OSwyMTYuNTI3NyAzMjguMTY5LDIxNi4yOTE3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxNjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjA2NTYxIgotICAgICAgICAgICBkPSJNIDMyNy45MTYsMjE0LjgwMjcgQyAzMjcuOTE2LDIxNC41NjY3IDMyOC4xMTYsMjE0LjM3NjcgMzI4LjM2MywyMTQuMzc2NyBDIDMyOC42MTEsMjE0LjM3NjcgMzI4LjgxMywyMTQuNTY2NyAzMjguODEzLDIxNC44MDI3IEMgMzI4LjgxMywyMTUuMDM1NyAzMjguNjExLDIxNS4yMjY3IDMyOC4zNjMsMjE1LjIyNjcgQyAzMjguMTE2LDIxNS4yMjY3IDMyNy45MTYsMjE1LjAzNTcgMzI3LjkxNiwyMTQuODAyNyB6IE0gMzI2Ljc5MSwyMTMuODcxNyBDIDMyNi43OTEsMjEzLjYzNTcgMzI2Ljk5MSwyMTMuNDQ1NyAzMjcuMjQyLDIxMy40NDU3IEMgMzI3LjQ4NiwyMTMuNDQ1NyAzMjcuNjg5LDIxMy42MzU3IDMyNy42ODksMjEzLjg3MTcgQyAzMjcuNjg5LDIxNC4xMDg3IDMyNy40ODYsMjE0LjI5ODcgMzI3LjI0MiwyMTQuMjk4NyBDIDMyNi45OTEsMjE0LjI5ODcgMzI2Ljc5MSwyMTQuMTA4NyAzMjYuNzkxLDIxMy44NzE3IHogTSAzMjUuMzg2LDIxMy40MjM3IEMgMzI1LjM4NiwyMTMuMTg0NyAzMjUuNTg4LDIxMi45OTM3IDMyNS44MzcsMjEyLjk5MzcgQyAzMjYuMDg3LDIxMi45OTM3IDMyNi4yODUsMjEzLjE4NDcgMzI2LjI4NSwyMTMuNDIzNyBDIDMyNi4yODUsMjEzLjY1MzcgMzI2LjA4NywyMTMuODQ3NyAzMjUuODM3LDIxMy44NDc3IEMgMzI1LjU4OCwyMTMuODQ3NyAzMjUuMzg2LDIxMy42NTM3IDMyNS4zODYsMjEzLjQyMzcgeiBNIDMyMy45NTcsMjEzLjQ3MzcgQyAzMjMuOTU3LDIxMy4yMzY3IDMyNC4xNTcsMjEzLjA0NjcgMzI0LjQwNCwyMTMuMDQ2NyBDIDMyNC42NTQsMjEzLjA0NjcgMzI0Ljg1NSwyMTMuMjM2NyAzMjQuODU1LDIxMy40NzM3IEMgMzI0Ljg1NSwyMTMuNzA5NyAzMjQuNjU0LDIxMy44OTY3IDMyNC40MDQsMjEzLjg5NjcgQyAzMjQuMTU3LDIxMy44OTY3IDMyMy45NTcsMjEzLjcwOTcgMzIzLjk1NywyMTMuNDczNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTY1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NjtzdHJva2UtbGluZWNhcDpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAzMzIuNjA4LDIxOS4xODI3IEMgMzMyLjc0MiwyMTguODU0NyAzMzIuODI2LDIxOC40OTE3IDMzMi44MjYsMjE4LjExNDcgQyAzMzIuODI2LDIxNi41MzQ3IDMzMS41NzMsMjE1LjI1MDcgMzMwLjAyLDIxNS4yNTA3IEMgMzI5LjUyNCwyMTUuMjUwNyAzMjkuMDU5LDIxNS4zODQ3IDMyOC42NTMsMjE1LjYxNzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTE2NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzI3LjYxLDIxNy4xNzI3IEMgMzI3Ljc1NSwyMTYuOTE1NyAzMjcuODYsMjE2LjYwMTcgMzI3Ljg2LDIxNi4zMDU3IEMgMzI3Ljg2LDIxNS4xNjY3IDMyNi42ODMsMjE0LjI0MjcgMzI1LjIzNSwyMTQuMjQyNyBDIDMyNC42MTYsMjE0LjI0MjcgMzI0LjA1LDIxNC40MTE3IDMyMy42MDQsMjE0LjY4OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTE2OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yMDY1NjEiCi0gICAgICAgICAgIGQ9Ik0gMzMyLjk5NSwyMTcuODg1NyBDIDMzMi45OTUsMjE3LjY1MjcgMzMzLjIsMjE3LjQ1ODcgMzMzLjQ0NiwyMTcuNDU4NyBDIDMzMy42OTUsMjE3LjQ1ODcgMzMzLjg5NiwyMTcuNjUyNyAzMzMuODk2LDIxNy44ODU3IEMgMzMzLjg5NiwyMTguMTIxNyAzMzMuNjk1LDIxOC4zMDg3IDMzMy40NDYsMjE4LjMwODcgQyAzMzMuMiwyMTguMzA4NyAzMzIuOTk1LDIxOC4xMjE3IDMzMi45OTUsMjE3Ljg4NTcgeiBNIDMzMi44MjYsMjE2LjMxOTcgQyAzMzIuODI2LDIxNi4wODI3IDMzMy4wMjksMjE1Ljg5NjcgMzMzLjI3NywyMTUuODk2NyBDIDMzMy41MjQsMjE1Ljg5NjcgMzMzLjcyNSwyMTYuMDgyNyAzMzMuNzI1LDIxNi4zMTk3IEMgMzMzLjcyNSwyMTYuNTUyNyAzMzMuNTI0LDIxNi43NDI3IDMzMy4yNzcsMjE2Ljc0MjcgQyAzMzMuMDI5LDIxNi43NDI3IDMzMi44MjYsMjE2LjU1MjcgMzMyLjgyNiwyMTYuMzE5NyB6IE0gMzMxLjgxOCwyMTUuMTIwNyBDIDMzMS44MTgsMjE0Ljg4NzcgMzMyLjAxOSwyMTQuNjk3NyAzMzIuMjY1LDIxNC42OTc3IEMgMzMyLjUxNSwyMTQuNjk3NyAzMzIuNzE1LDIxNC44ODc3IDMzMi43MTUsMjE1LjEyMDcgQyAzMzIuNzE1LDIxNS4zNTY3IDMzMi41MTUsMjE1LjU0NjcgMzMyLjI2NSwyMTUuNTQ2NyBDIDMzMi4wMTksMjE1LjU0NjcgMzMxLjgxOCwyMTUuMzU2NyAzMzEuODE4LDIxNS4xMjA3IHogTSAzMzAuNDcsMjE0LjQ4MTcgQyAzMzAuNDcsMjE0LjI0OTcgMzMwLjY3MSwyMTQuMDU4NyAzMzAuOTIsMjE0LjA1ODcgQyAzMzEuMTY3LDIxNC4wNTg3IDMzMS4zNjgsMjE0LjI0OTcgMzMxLjM2OCwyMTQuNDgxNyBDIDMzMS4zNjgsMjE0LjcxODcgMzMxLjE2NywyMTQuOTEyNyAzMzAuOTIsMjE0LjkxMjcgQyAzMzAuNjcxLDIxNC45MTI3IDMzMC40NywyMTQuNzE4NyAzMzAuNDcsMjE0LjQ4MTcgeiBNIDMyOS4wMzcsMjE0LjUzODcgQyAzMjkuMDM3LDIxNC4zMDI3IDMyOS4yMzgsMjE0LjExMTcgMzI5LjQ4NywyMTQuMTExNyBDIDMyOS43MzYsMjE0LjExMTcgMzI5LjkzOCwyMTQuMzAyNyAzMjkuOTM4LDIxNC41Mzg3IEMgMzI5LjkzOCwyMTQuNzcxNyAzMjkuNzM2LDIxNC45NjE3IDMyOS40ODcsMjE0Ljk2MTcgQyAzMjkuMjM4LDIxNC45NjE3IDMyOS4wMzcsMjE0Ljc3MTcgMzI5LjAzNywyMTQuNTM4NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTcxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMzMC4wNjcsMjIxLjI2MzcgTCAzMjkuNDgsMjIwLjczMTcgQyAzMjkuNDgsMjIwLjczMTcgMzI4LjkxNywyMjEuMDc2NyAzMjguMjE0LDIyMC45NzA3IEMgMzI3LjUxNCwyMjAuODY1NyAzMjcuMjksMjIwLjAxNTcgMzI3LjI5LDIyMC4wMTU3IEMgMzI3LjI5LDIyMC4wMTU3IDMyNi41MDEsMjIwLjY3NDcgMzI1Ljg2LDIyMC42MjU3IEMgMzI1LjIxNiwyMjAuNTY4NyAzMjQuNzk1LDIyMC4wMTU3IDMyNC43OTUsMjIwLjAxNTcgQyAzMjQuNzk1LDIyMC4wMTU3IDMyNC4wOTEsMjIwLjUxNTcgMzIzLjQ3MywyMjAuNDY2NyBDIDMyMi44NTUsMjIwLjQxMDcgMzIyLjI2NiwyMTkuNjQxNyAzMjIuMjY2LDIxOS42NDE3IEMgMzIyLjI2NiwyMTkuNjQxNyAzMjEuNjQ5LDIyMC40Mzg3IDMyMS4wMywyMjAuNDk0NyBDIDMyMC40MTIsMjIwLjU0NDcgMzE5LjkwOSwyMTkuOTU4NyAzMTkuOTA5LDIxOS45NTg3IEMgMzE5LjkwOSwyMTkuOTU4NyAzMTkuNjI2LDIyMC41NDQ3IDMxOC44NCwyMjAuNjc0NyBDIDMxOC4wNTUsMjIwLjgwODcgMzE3LjM4MSwyMjAuMDY0NyAzMTcuMzgxLDIyMC4wNjQ3IEMgMzE3LjM4MSwyMjAuMDY0NyAzMTYuOTM4LDIyMC43ODM3IDMxNi40MDEsMjIwLjk3MDcgQyAzMTUuODY5LDIyMS4xNTc3IDMxNS4xNjksMjIwLjcwMjcgMzE1LjE2OSwyMjAuNzAyNyBDIDMxNS4xNjksMjIwLjcwMjcgMzE1LjA1NywyMjAuOTcwNyAzMTQuOTcyLDIyMS4xMjk3IEMgMzE0Ljg4NiwyMjEuMjg4NyAzMTQuNjYyLDIyMS4zMTY3IDMxNC42NjIsMjIxLjMxNjcgTCAzMTQuODM4LDIyMS43OTI3IEMgMzE2Ljc2MSwyMjEuMjM1NyAzMTkuMzcsMjIwLjg4OTcgMzIyLjMxOSwyMjAuODg2NyBDIDMyNS4yNzIsMjIwLjg4OTcgMzI3Ljk1MiwyMjEuMjM1NyAzMjkuODc0LDIyMS43OTY3IEwgMzMwLjA3MiwyMjEuMjYzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTczIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMzAuMDY3LDIyMS4yNjM3IEwgMzI5LjQ4LDIyMC43MzE3IEMgMzI5LjQ4LDIyMC43MzE3IDMyOC45MTcsMjIxLjA3NjcgMzI4LjIxNCwyMjAuOTcwNyBDIDMyNy41MTQsMjIwLjg2NTcgMzI3LjI5LDIyMC4wMTU3IDMyNy4yOSwyMjAuMDE1NyBDIDMyNy4yOSwyMjAuMDE1NyAzMjYuNTAxLDIyMC42NzQ3IDMyNS44NiwyMjAuNjI1NyBDIDMyNS4yMTYsMjIwLjU2ODcgMzI0Ljc5NSwyMjAuMDE1NyAzMjQuNzk1LDIyMC4wMTU3IEMgMzI0Ljc5NSwyMjAuMDE1NyAzMjQuMDkxLDIyMC41MTU3IDMyMy40NzMsMjIwLjQ2NjcgQyAzMjIuODU1LDIyMC40MTA3IDMyMi4yNjYsMjE5LjY0MTcgMzIyLjI2NiwyMTkuNjQxNyBDIDMyMi4yNjYsMjE5LjY0MTcgMzIxLjY0OSwyMjAuNDM4NyAzMjEuMDMsMjIwLjQ5NDcgQyAzMjAuNDEyLDIyMC41NDQ3IDMxOS45MDksMjE5Ljk1ODcgMzE5LjkwOSwyMTkuOTU4NyBDIDMxOS45MDksMjE5Ljk1ODcgMzE5LjYyNiwyMjAuNTQ0NyAzMTguODQsMjIwLjY3NDcgQyAzMTguMDU1LDIyMC44MDg3IDMxNy4zODEsMjIwLjA2NDcgMzE3LjM4MSwyMjAuMDY0NyBDIDMxNy4zODEsMjIwLjA2NDcgMzE2LjkzOCwyMjAuNzgzNyAzMTYuNDAxLDIyMC45NzA3IEMgMzE1Ljg2OSwyMjEuMTU3NyAzMTUuMTY5LDIyMC43MDI3IDMxNS4xNjksMjIwLjcwMjcgQyAzMTUuMTY5LDIyMC43MDI3IDMxNS4wNTcsMjIwLjk3MDcgMzE0Ljk3MiwyMjEuMTI5NyBDIDMxNC44ODYsMjIxLjI4ODcgMzE0LjY2MiwyMjEuMzE2NyAzMTQuNjYyLDIyMS4zMTY3IEwgMzE0LjgzOCwyMjEuNzkyNyBDIDMxNi43NjEsMjIxLjIzNTcgMzE5LjM3LDIyMC44ODk3IDMyMi4zMTksMjIwLjg4NjcgQyAzMjUuMjcyLDIyMC44ODk3IDMyNy45NTIsMjIxLjIzNTcgMzI5Ljg3NCwyMjEuNzk2NyBMIDMzMC4wNzIsMjIxLjI2MzcgTCAzMzAuMDY3LDIyMS4yNjM3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxNzUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMzE1LjQ5NywyMTYuMjkxNyBDIDMxNS40OTcsMjE2LjA1NDcgMzE1LjY5NywyMTUuODY0NyAzMTUuOTQ3LDIxNS44NjQ3IEMgMzE2LjE5MiwyMTUuODY0NyAzMTYuMzk0LDIxNi4wNTQ3IDMxNi4zOTQsMjE2LjI5MTcgQyAzMTYuMzk0LDIxNi41Mjc3IDMxNi4xOTIsMjE2LjcxNDcgMzE1Ljk0NywyMTYuNzE0NyBDIDMxNS42OTcsMjE2LjcxNDcgMzE1LjQ5NywyMTYuNTI3NyAzMTUuNDk3LDIxNi4yOTE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxNzciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjA2NTYxIgotICAgICAgICAgICBkPSJNIDMxNS40OTcsMjE2LjI5MTcgQyAzMTUuNDk3LDIxNi4wNTQ3IDMxNS42OTcsMjE1Ljg2NDcgMzE1Ljk0NywyMTUuODY0NyBDIDMxNi4xOTIsMjE1Ljg2NDcgMzE2LjM5NCwyMTYuMDU0NyAzMTYuMzk0LDIxNi4yOTE3IEMgMzE2LjM5NCwyMTYuNTI3NyAzMTYuMTkyLDIxNi43MTQ3IDMxNS45NDcsMjE2LjcxNDcgQyAzMTUuNjk3LDIxNi43MTQ3IDMxNS40OTcsMjE2LjUyNzcgMzE1LjQ5NywyMTYuMjkxNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTc5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjIwNjU2MSIKLSAgICAgICAgICAgZD0iTSAzMTUuNzUsMjE0LjgwMjcgQyAzMTUuNzUsMjE0LjU2NjcgMzE1Ljk1MSwyMTQuMzc2NyAzMTYuMiwyMTQuMzc2NyBDIDMxNi40NDYsMjE0LjM3NjcgMzE2LjY0NywyMTQuNTY2NyAzMTYuNjQ3LDIxNC44MDI3IEMgMzE2LjY0NywyMTUuMDM1NyAzMTYuNDQ2LDIxNS4yMjY3IDMxNi4yLDIxNS4yMjY3IEMgMzE1Ljk1MSwyMTUuMjI2NyAzMTUuNzUsMjE1LjAzNTcgMzE1Ljc1LDIxNC44MDI3IHogTSAzMTYuODcxLDIxMy44NzE3IEMgMzE2Ljg3MSwyMTMuNjM1NyAzMTcuMDcyLDIxMy40NDU3IDMxNy4zMjEsMjEzLjQ0NTcgQyAzMTcuNTcxLDIxMy40NDU3IDMxNy43NzIsMjEzLjYzNTcgMzE3Ljc3MiwyMTMuODcxNyBDIDMxNy43NzIsMjE0LjEwODcgMzE3LjU3MSwyMTQuMjk4NyAzMTcuMzIxLDIxNC4yOTg3IEMgMzE3LjA3MiwyMTQuMjk4NyAzMTYuODcxLDIxNC4xMDg3IDMxNi44NzEsMjEzLjg3MTcgeiBNIDMxOC4yNzUsMjEzLjQyMzcgQyAzMTguMjc1LDIxMy4xODQ3IDMxOC40NzYsMjEyLjk5MzcgMzE4LjcyNSwyMTIuOTkzNyBDIDMxOC45NzUsMjEyLjk5MzcgMzE5LjE3NiwyMTMuMTg0NyAzMTkuMTc2LDIxMy40MjM3IEMgMzE5LjE3NiwyMTMuNjUzNyAzMTguOTc1LDIxMy44NDc3IDMxOC43MjUsMjEzLjg0NzcgQyAzMTguNDc2LDIxMy44NDc3IDMxOC4yNzUsMjEzLjY1MzcgMzE4LjI3NSwyMTMuNDIzNyB6IE0gMzE5LjcwOCwyMTMuNDczNyBDIDMxOS43MDgsMjEzLjIzNjcgMzE5LjkwOSwyMTMuMDQ2NyAzMjAuMTU1LDIxMy4wNDY3IEMgMzIwLjQwNSwyMTMuMDQ2NyAzMjAuNjA2LDIxMy4yMzY3IDMyMC42MDYsMjEzLjQ3MzcgQyAzMjAuNjA2LDIxMy43MDk3IDMyMC40MDUsMjEzLjg5NjcgMzIwLjE1NSwyMTMuODk2NyBDIDMxOS45MDksMjEzLjg5NjcgMzE5LjcwOCwyMTMuNzA5NyAzMTkuNzA4LDIxMy40NzM3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxODEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2O3N0cm9rZS1saW5lY2FwOnJvdW5kIgotICAgICAgICAgICBkPSJNIDMxMS45NTIsMjE5LjE4MjcgQyAzMTEuODIxLDIxOC44NTQ3IDMxMS43MzYsMjE4LjQ5MTcgMzExLjczNiwyMTguMTE0NyBDIDMxMS43MzYsMjE2LjUzNDcgMzEyLjk5LDIxNS4yNTA3IDMxNC41NDIsMjE1LjI1MDcgQyAzMTUuMDM4LDIxNS4yNTA3IDMxNS41MDMsMjE1LjM4NDcgMzE1LjkxLDIxNS42MTc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxODMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDMxNi45ODYsMjE3LjEzNzcgQyAzMTYuODQxLDIxNi44ODM3IDMxNi43MDIsMjE2LjYwMTcgMzE2LjcwMiwyMTYuMzA1NyBDIDMxNi43MDIsMjE1LjE2NjcgMzE3Ljg4LDIxNC4yNDI3IDMxOS4zMjgsMjE0LjI0MjcgQyAzMTkuOTQyLDIxNC4yNDI3IDMyMC41MTIsMjE0LjQxMTcgMzIwLjk1OSwyMTQuNjg5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTg1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjIwNjU2MSIKLSAgICAgICAgICAgZD0iTSAzMTAuNjY3LDIxNy44ODU3IEMgMzEwLjY2NywyMTcuNjUyNyAzMTAuODY3LDIxNy40NTg3IDMxMS4xMTgsMjE3LjQ1ODcgQyAzMTEuMzYyLDIxNy40NTg3IDMxMS41NjQsMjE3LjY1MjcgMzExLjU2NCwyMTcuODg1NyBDIDMxMS41NjQsMjE4LjEyMTcgMzExLjM2MiwyMTguMzA4NyAzMTEuMTE4LDIxOC4zMDg3IEMgMzEwLjg2NywyMTguMzA4NyAzMTAuNjY3LDIxOC4xMjE3IDMxMC42NjcsMjE3Ljg4NTcgeiBNIDMxMC44MzQsMjE2LjMxOTcgQyAzMTAuODM0LDIxNi4wODI3IDMxMS4wMzksMjE1Ljg5NjcgMzExLjI4NSwyMTUuODk2NyBDIDMxMS41MzUsMjE1Ljg5NjcgMzExLjczNiwyMTYuMDgyNyAzMTEuNzM2LDIxNi4zMTk3IEMgMzExLjczNiwyMTYuNTUyNyAzMTEuNTM1LDIxNi43NDI3IDMxMS4yODUsMjE2Ljc0MjcgQyAzMTEuMDM5LDIxNi43NDI3IDMxMC44MzQsMjE2LjU1MjcgMzEwLjgzNCwyMTYuMzE5NyB6IE0gMzExLjg0NywyMTUuMTIwNyBDIDMxMS44NDcsMjE0Ljg4NzcgMzEyLjA0OCwyMTQuNjk3NyAzMTIuMjk4LDIxNC42OTc3IEMgMzEyLjU0NCwyMTQuNjk3NyAzMTIuNzQ1LDIxNC44ODc3IDMxMi43NDUsMjE1LjEyMDcgQyAzMTIuNzQ1LDIxNS4zNTY3IDMxMi41NDQsMjE1LjU0NjcgMzEyLjI5OCwyMTUuNTQ2NyBDIDMxMi4wNDgsMjE1LjU0NjcgMzExLjg0NywyMTUuMzU2NyAzMTEuODQ3LDIxNS4xMjA3IHogTSAzMTMuMTk1LDIxNC40ODE3IEMgMzEzLjE5NSwyMTQuMjQ5NyAzMTMuMzk2LDIxNC4wNTg3IDMxMy42NDEsMjE0LjA1ODcgQyAzMTMuODkyLDIxNC4wNTg3IDMxNC4wOTIsMjE0LjI0OTcgMzE0LjA5MiwyMTQuNDgxNyBDIDMxNC4wOTIsMjE0LjcxODcgMzEzLjg5MiwyMTQuOTEyNyAzMTMuNjQxLDIxNC45MTI3IEMgMzEzLjM5NiwyMTQuOTEyNyAzMTMuMTk1LDIxNC43MTg3IDMxMy4xOTUsMjE0LjQ4MTcgeiBNIDMxNC42MjUsMjE0LjUzODcgQyAzMTQuNjI1LDIxNC4zMDI3IDMxNC44MjYsMjE0LjExMTcgMzE1LjA3NiwyMTQuMTExNyBDIDMxNS4zMjUsMjE0LjExMTcgMzE1LjUyMywyMTQuMzAyNyAzMTUuNTIzLDIxNC41Mzg3IEMgMzE1LjUyMywyMTQuNzcxNyAzMTUuMzI1LDIxNC45NjE3IDMxNS4wNzYsMjE0Ljk2MTcgQyAzMTQuODI2LDIxNC45NjE3IDMxNC42MjUsMjE0Ljc3MTcgMzE0LjYyNSwyMTQuNTM4NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTg3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMyMi4zMjYsMjE4LjY5MjcgTCAzMjIuNjA1LDIxOC43NDI3IEMgMzIyLjU2MSwyMTguODU4NyAzMjIuNTUyLDIxOC45ODE3IDMyMi41NTIsMjE5LjExMjcgQyAzMjIuNTUyLDIxOS42OTA3IDMyMy4wNDksMjIwLjE1OTcgMzIzLjY1OSwyMjAuMTU5NyBDIDMyNC4xNTEsMjIwLjE1OTcgMzI0LjU2OCwyMTkuODU2NyAzMjQuNzEsMjE5LjQzNjcgQyAzMjQuNzI3LDIxOS40NDc3IDMyNC44MTcsMjE5LjA1NTcgMzI0Ljg2MSwyMTkuMDYyNyBDIDMyNC45MDMsMjE5LjA2MjcgMzI0Ljg5NiwyMTkuNDY4NyAzMjQuOTA2LDIxOS40NjE3IEMgMzI0Ljk4LDIxOS45ODY3IDMyNS40NiwyMjAuMzQ2NyAzMjYuMDA1LDIyMC4zNDY3IEMgMzI2LjYxNSwyMjAuMzQ2NyAzMjcuMTEsMjE5Ljg3NzcgMzI3LjExLDIxOS4yOTk3IEMgMzI3LjExLDIxOS4yNTY3IDMyNy4xMDcsMjE5LjIxNDcgMzI3LjEsMjE5LjE3MjcgTCAzMjcuNDUsMjE4LjgyNjcgTCAzMjcuNjM1LDIxOS4yNjc3IEMgMzI3LjU2MSwyMTkuNDAxNyAzMjcuNTMxLDIxOS41NTY3IDMyNy41MzEsMjE5LjcyMjcgQyAzMjcuNTMxLDIyMC4yNzY3IDMyOC4wMDUsMjIwLjcyNDcgMzI4LjU4NiwyMjAuNzI0NyBDIDMyOC45NTUsMjIwLjcyNDcgMzI5LjI3OSwyMjAuNTQ0NyAzMjkuNDY1LDIyMC4yNzY3IEwgMzI5LjY4OCwyMTkuOTk0NyBMIDMyOS42ODQsMjIwLjM0MzcgQyAzMjkuNjg0LDIyMC42ODg3IDMyOS44MzQsMjIwLjk5OTcgMzMwLjE3MSwyMjEuMDU1NyBDIDMzMC4xNzEsMjIxLjA1NTcgMzMwLjU2MiwyMjEuMDgzNyAzMzEuMDc3LDIyMC42NzQ3IEMgMzMxLjU5NSwyMjAuMjY5NyAzMzEuODc4LDIxOS45MzA3IDMzMS44NzgsMjE5LjkzMDcgTCAzMzEuOTA4LDIyMC4zNDY3IEMgMzMxLjkwOCwyMjAuMzQ2NyAzMzEuNCwyMjEuMTc4NyAzMzAuOTQzLDIyMS40NDM3IEMgMzMwLjY5LDIyMS41OTE3IDMzMC4zMDUsMjIxLjc0NjcgMzMwLjAwMSwyMjEuNjkzNyBDIDMyOS42NzYsMjIxLjY0NDcgMzI5LjQ1LDIyMS4zODM3IDMyOS4zMywyMjEuMDg3NyBDIDMyOS4xLDIyMS4yMjQ3IDMyOC44MjgsMjIxLjMwMjcgMzI4LjUzNywyMjEuMzAyNyBDIDMyNy45MTIsMjIxLjMwMjcgMzI3LjM1LDIyMC45NTY3IDMyNy4xMywyMjAuNDQ1NyBDIDMyNi44NDIsMjIwLjc1NTcgMzI2LjQ0MSwyMjAuOTQyNyAzMjUuOTcxLDIyMC45NDI3IEMgMzI1LjQ3MywyMjAuOTQyNyAzMjUuMDE1LDIyMC43MjA3IDMyNC43MjcsMjIwLjM3MTcgQyAzMjQuNDQ1LDIyMC42MzI3IDMyNC4wNjIsMjIwLjc5MTcgMzIzLjY0LDIyMC43OTE3IEMgMzIzLjA5LDIyMC43OTE3IDMyMi41OTQsMjIwLjUxNTcgMzIyLjMxNSwyMjAuMTEwNyBDIDMyMi4wMzUsMjIwLjUxNTcgMzIxLjU0NywyMjAuNzkxNyAzMjAuOTkyLDIyMC43OTE3IEMgMzIwLjU3MSwyMjAuNzkxNyAzMjAuMTg5LDIyMC42MzI3IDMxOS45MDYsMjIwLjM3MTcgQyAzMTkuNjE5LDIyMC43MjA3IDMxOS4xNjUsMjIwLjk0MjcgMzE4LjY2MiwyMjAuOTQyNyBDIDMxOC4xOTMsMjIwLjk0MjcgMzE3Ljc5NCwyMjAuNzU1NyAzMTcuNTA4LDIyMC40NDU3IEMgMzE3LjI4NywyMjAuOTUzNyAzMTYuNzIyLDIyMS4zMDI3IDMxNi4xLDIyMS4zMDI3IEMgMzE1LjgxLDIyMS4zMDI3IDMxNS41NDEsMjIxLjIyNDcgMzE1LjMxLDIyMS4wODc3IEMgMzE1LjE5MSwyMjEuMzgzNyAzMTQuOTYxLDIyMS42NDQ3IDMxNC42NCwyMjEuNjkzNyBDIDMxNC4zMzUsMjIxLjc0NjcgMzEzLjk1MSwyMjEuNTkxNyAzMTMuNjk4LDIyMS40NDM3IEMgMzEzLjIzNiwyMjEuMTc4NyAzMTIuNjg5LDIyMC4zNDY3IDMxMi42ODksMjIwLjM0NjcgTCAzMTIuNzYsMjE5LjkzMDcgQyAzMTIuNzYsMjE5LjkzMDcgMzEzLjA0MiwyMjAuMjY5NyAzMTMuNTU3LDIyMC42NzQ3IEMgMzE0LjA3NCwyMjEuMDgzNyAzMTQuNDY1LDIyMS4wNTU3IDMxNC40NjUsMjIxLjA1NTcgQyAzMTQuODA0LDIyMC45OTk3IDMxNC45NDgsMjIwLjY4ODcgMzE0Ljk0OCwyMjAuMzQzNyBMIDMxNC45NDgsMjE5Ljk5NDcgTCAzMTUuMTY5LDIyMC4yNzY3IEMgMzE1LjM1OSwyMjAuNTQ0NyAzMTUuNjgyLDIyMC43MjQ3IDMxNi4wNDcsMjIwLjcyNDcgQyAzMTYuNjMzLDIyMC43MjQ3IDMxNy4xMDUsMjIwLjI3NjcgMzE3LjEwNSwyMTkuNzIyNyBDIDMxNy4xMDUsMjE5LjU1NjcgMzE3LjA3NSwyMTkuNDAxNyAzMTcuMDAxLDIxOS4yNjc3IEwgMzE3LjE4NywyMTguODI2NyBMIDMxNy41MzMsMjE5LjE3MjcgQyAzMTcuNTI2LDIxOS4yMTQ3IDMxNy41MjYsMjE5LjI1NjcgMzE3LjUyNiwyMTkuMjk5NyBDIDMxNy41MjYsMjE5Ljg3NzcgMzE4LjAxOCwyMjAuMzQ2NyAzMTguNjIzLDIyMC4zNDY3IEMgMzE5LjE3MiwyMjAuMzQ2NyAzMTkuNjUyLDIxOS45ODY3IDMxOS43MjMsMjE5LjQ2MTcgQyAzMTkuNzM4LDIxOS40Njg3IDMxOS43MzMsMjE5LjA2MjcgMzE5Ljc3MSwyMTkuMDYyNyBDIDMxOS44MiwyMTkuMDU1NyAzMTkuOTA5LDIxOS40NDc3IDMxOS45MjQsMjE5LjQzNjcgQyAzMjAuMDY5LDIxOS44NTY3IDMyMC40ODYsMjIwLjE1OTcgMzIwLjk3NywyMjAuMTU5NyBDIDMyMS41ODksMjIwLjE1OTcgMzIyLjA4NCwyMTkuNjkwNyAzMjIuMDg0LDIxOS4xMTI3IEMgMzIyLjA4NCwyMTguOTgxNyAzMjIuMDc3LDIxOC44NTg3IDMyMi4wMzIsMjE4Ljc0MjcgTCAzMjIuMzE5LDIxOC42OTI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUxODkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDMyMi4zMjYsMjE4LjY5MjcgTCAzMjIuNjA1LDIxOC43NDI3IEMgMzIyLjU2MSwyMTguODU4NyAzMjIuNTUyLDIxOC45ODE3IDMyMi41NTIsMjE5LjExMjcgQyAzMjIuNTUyLDIxOS42OTA3IDMyMy4wNDksMjIwLjE1OTcgMzIzLjY1OSwyMjAuMTU5NyBDIDMyNC4xNTEsMjIwLjE1OTcgMzI0LjU2OCwyMTkuODU2NyAzMjQuNzEsMjE5LjQzNjcgQyAzMjQuNzI3LDIxOS40NDc3IDMyNC44MTcsMjE5LjA1NTcgMzI0Ljg2MSwyMTkuMDYyNyBDIDMyNC45MDMsMjE5LjA2MjcgMzI0Ljg5NiwyMTkuNDY4NyAzMjQuOTA2LDIxOS40NjE3IEMgMzI0Ljk4LDIxOS45ODY3IDMyNS40NiwyMjAuMzQ2NyAzMjYuMDA1LDIyMC4zNDY3IEMgMzI2LjYxNSwyMjAuMzQ2NyAzMjcuMTEsMjE5Ljg3NzcgMzI3LjExLDIxOS4yOTk3IEMgMzI3LjExLDIxOS4yNTY3IDMyNy4xMDcsMjE5LjIxNDcgMzI3LjEsMjE5LjE3MjcgTCAzMjcuNDUsMjE4LjgyNjcgTCAzMjcuNjM1LDIxOS4yNjc3IEMgMzI3LjU2MSwyMTkuNDAxNyAzMjcuNTMxLDIxOS41NTY3IDMyNy41MzEsMjE5LjcyMjcgQyAzMjcuNTMxLDIyMC4yNzY3IDMyOC4wMDUsMjIwLjcyNDcgMzI4LjU4NiwyMjAuNzI0NyBDIDMyOC45NTUsMjIwLjcyNDcgMzI5LjI3OSwyMjAuNTQ0NyAzMjkuNDY1LDIyMC4yNzY3IEwgMzI5LjY4OCwyMTkuOTk0NyBMIDMyOS42ODQsMjIwLjM0MzcgQyAzMjkuNjg0LDIyMC42ODg3IDMyOS44MzQsMjIwLjk5OTcgMzMwLjE3MSwyMjEuMDU1NyBDIDMzMC4xNzEsMjIxLjA1NTcgMzMwLjU2MiwyMjEuMDgzNyAzMzEuMDc3LDIyMC42NzQ3IEMgMzMxLjU5NSwyMjAuMjY5NyAzMzEuODc4LDIxOS45MzA3IDMzMS44NzgsMjE5LjkzMDcgTCAzMzEuOTA4LDIyMC4zNDY3IEMgMzMxLjkwOCwyMjAuMzQ2NyAzMzEuNCwyMjEuMTc4NyAzMzAuOTQzLDIyMS40NDM3IEMgMzMwLjY5LDIyMS41OTE3IDMzMC4zMDUsMjIxLjc0NjcgMzMwLjAwMSwyMjEuNjkzNyBDIDMyOS42NzYsMjIxLjY0NDcgMzI5LjQ1LDIyMS4zODM3IDMyOS4zMywyMjEuMDg3NyBDIDMyOS4xLDIyMS4yMjQ3IDMyOC44MjgsMjIxLjMwMjcgMzI4LjUzNywyMjEuMzAyNyBDIDMyNy45MTIsMjIxLjMwMjcgMzI3LjM1LDIyMC45NTY3IDMyNy4xMywyMjAuNDQ1NyBDIDMyNi44NDIsMjIwLjc1NTcgMzI2LjQ0MSwyMjAuOTQyNyAzMjUuOTcxLDIyMC45NDI3IEMgMzI1LjQ3MywyMjAuOTQyNyAzMjUuMDE1LDIyMC43MjA3IDMyNC43MjcsMjIwLjM3MTcgQyAzMjQuNDQ1LDIyMC42MzI3IDMyNC4wNjIsMjIwLjc5MTcgMzIzLjY0LDIyMC43OTE3IEMgMzIzLjA5LDIyMC43OTE3IDMyMi41OTQsMjIwLjUxNTcgMzIyLjMxNSwyMjAuMTEwNyBDIDMyMi4wMzUsMjIwLjUxNTcgMzIxLjU0NywyMjAuNzkxNyAzMjAuOTkyLDIyMC43OTE3IEMgMzIwLjU3MSwyMjAuNzkxNyAzMjAuMTg5LDIyMC42MzI3IDMxOS45MDYsMjIwLjM3MTcgQyAzMTkuNjE5LDIyMC43MjA3IDMxOS4xNjUsMjIwLjk0MjcgMzE4LjY2MiwyMjAuOTQyNyBDIDMxOC4xOTMsMjIwLjk0MjcgMzE3Ljc5NCwyMjAuNzU1NyAzMTcuNTA4LDIyMC40NDU3IEMgMzE3LjI4NywyMjAuOTUzNyAzMTYuNzIyLDIyMS4zMDI3IDMxNi4xLDIyMS4zMDI3IEMgMzE1LjgxLDIyMS4zMDI3IDMxNS41NDEsMjIxLjIyNDcgMzE1LjMxLDIyMS4wODc3IEMgMzE1LjE5MSwyMjEuMzgzNyAzMTQuOTYxLDIyMS42NDQ3IDMxNC42NCwyMjEuNjkzNyBDIDMxNC4zMzUsMjIxLjc0NjcgMzEzLjk1MSwyMjEuNTkxNyAzMTMuNjk4LDIyMS40NDM3IEMgMzEzLjIzNiwyMjEuMTc4NyAzMTIuNjg5LDIyMC4zNDY3IDMxMi42ODksMjIwLjM0NjcgTCAzMTIuNzYsMjE5LjkzMDcgQyAzMTIuNzYsMjE5LjkzMDcgMzEzLjA0MiwyMjAuMjY5NyAzMTMuNTU3LDIyMC42NzQ3IEMgMzE0LjA3NCwyMjEuMDgzNyAzMTQuNDY1LDIyMS4wNTU3IDMxNC40NjUsMjIxLjA1NTcgQyAzMTQuODA0LDIyMC45OTk3IDMxNC45NDgsMjIwLjY4ODcgMzE0Ljk0OCwyMjAuMzQzNyBMIDMxNC45NDgsMjE5Ljk5NDcgTCAzMTUuMTY5LDIyMC4yNzY3IEMgMzE1LjM1OSwyMjAuNTQ0NyAzMTUuNjgyLDIyMC43MjQ3IDMxNi4wNDcsMjIwLjcyNDcgQyAzMTYuNjMzLDIyMC43MjQ3IDMxNy4xMDUsMjIwLjI3NjcgMzE3LjEwNSwyMTkuNzIyNyBDIDMxNy4xMDUsMjE5LjU1NjcgMzE3LjA3NSwyMTkuNDAxNyAzMTcuMDAxLDIxOS4yNjc3IEwgMzE3LjE4NywyMTguODI2NyBMIDMxNy41MzMsMjE5LjE3MjcgQyAzMTcuNTI2LDIxOS4yMTQ3IDMxNy41MjYsMjE5LjI1NjcgMzE3LjUyNiwyMTkuMjk5NyBDIDMxNy41MjYsMjE5Ljg3NzcgMzE4LjAxOCwyMjAuMzQ2NyAzMTguNjIzLDIyMC4zNDY3IEMgMzE5LjE3MiwyMjAuMzQ2NyAzMTkuNjUyLDIxOS45ODY3IDMxOS43MjMsMjE5LjQ2MTcgQyAzMTkuNzM4LDIxOS40Njg3IDMxOS43MzMsMjE5LjA2MjcgMzE5Ljc3MSwyMTkuMDYyNyBDIDMxOS44MiwyMTkuMDU1NyAzMTkuOTA5LDIxOS40NDc3IDMxOS45MjQsMjE5LjQzNjcgQyAzMjAuMDY5LDIxOS44NTY3IDMyMC40ODYsMjIwLjE1OTcgMzIwLjk3NywyMjAuMTU5NyBDIDMyMS41ODksMjIwLjE1OTcgMzIyLjA4NCwyMTkuNjkwNyAzMjIuMDg0LDIxOS4xMTI3IEMgMzIyLjA4NCwyMTguOTgxNyAzMjIuMDc3LDIxOC44NTg3IDMyMi4wMzIsMjE4Ljc0MjcgTCAzMjIuMzE5LDIxOC42OTI3IEwgMzIyLjMyNiwyMTguNjkyNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTkxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMyMi4zMTEsMjIxLjQxNTcgQyAzMTkuMzE3LDIyMS40MTg3IDMxNi42MjgsMjIxLjc3NDcgMzE0LjY5NiwyMjIuMzQ2NyBDIDMxNC41NjYsMjIyLjM4ODcgMzE0LjQwOCwyMjIuMjg5NyAzMTQuMzY1LDIyMi4xNzM3IEMgMzE0LjMyMywyMjIuMDUwNyAzMTQuNDE3LDIyMS44OTg3IDMxNC41NDIsMjIxLjg1NjcgQyAzMTYuNDg3LDIyMS4yNjM3IDMxOS4yNDMsMjIwLjg4OTcgMzIyLjMxMSwyMjAuODg2NyBDIDMyNS4zNzYsMjIwLjg4OTcgMzI4LjE0NiwyMjEuMjYzNyAzMzAuMDg3LDIyMS44NTY3IEMgMzMwLjIxNiwyMjEuODk4NyAzMzAuMzEsMjIyLjA1MDcgMzMwLjI2OSwyMjIuMTczNyBDIDMzMC4yMjgsMjIyLjI4OTcgMzMwLjA2NCwyMjIuMzg4NyAzMjkuOTM4LDIyMi4zNDY3IEMgMzI4LjAwNSwyMjEuNzc0NyAzMjUuMzA1LDIyMS40MTg3IDMyMi4zMTEsMjIxLjQxNTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTE5MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzIyLjMxMSwyMjEuNDE1NyBDIDMxOS4zMTcsMjIxLjQxODcgMzE2LjYyOCwyMjEuNzc0NyAzMTQuNjk2LDIyMi4zNDY3IEMgMzE0LjU2NiwyMjIuMzg4NyAzMTQuNDA4LDIyMi4yODk3IDMxNC4zNjUsMjIyLjE3MzcgQyAzMTQuMzIzLDIyMi4wNTA3IDMxNC40MTcsMjIxLjg5ODcgMzE0LjU0MiwyMjEuODU2NyBDIDMxNi40ODcsMjIxLjI2MzcgMzE5LjI0MywyMjAuODg5NyAzMjIuMzExLDIyMC44ODY3IEMgMzI1LjM3NiwyMjAuODg5NyAzMjguMTQ2LDIyMS4yNjM3IDMzMC4wODcsMjIxLjg1NjcgQyAzMzAuMjE2LDIyMS44OTg3IDMzMC4zMSwyMjIuMDUwNyAzMzAuMjY5LDIyMi4xNzM3IEMgMzMwLjIyOCwyMjIuMjg5NyAzMzAuMDY0LDIyMi4zODg3IDMyOS45MzgsMjIyLjM0NjcgQyAzMjguMDA1LDIyMS43NzQ3IDMyNS4zMDUsMjIxLjQxODcgMzIyLjMxMSwyMjEuNDE1NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTk1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDMxOS40MTQsMjIyLjQ3NjcgQyAzMTkuNDE0LDIyMi4yNTE3IDMxOS42MDgsMjIyLjA2NzcgMzE5Ljg1LDIyMi4wNjc3IEMgMzIwLjA4OCwyMjIuMDY3NyAzMjAuMjgyLDIyMi4yNTE3IDMyMC4yODIsMjIyLjQ3NjcgQyAzMjAuMjgyLDIyMi43MDU3IDMyMC4wODgsMjIyLjg4NTcgMzE5Ljg1LDIyMi44ODU3IEMgMzE5LjYwOCwyMjIuODg1NyAzMTkuNDE0LDIyMi43MDU3IDMxOS40MTQsMjIyLjQ3NjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTE5NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzE5LjQxNCwyMjIuNDc2NyBDIDMxOS40MTQsMjIyLjI1MTcgMzE5LjYwOCwyMjIuMDY3NyAzMTkuODUsMjIyLjA2NzcgQyAzMjAuMDg4LDIyMi4wNjc3IDMyMC4yODIsMjIyLjI1MTcgMzIwLjI4MiwyMjIuNDc2NyBDIDMyMC4yODIsMjIyLjcwNTcgMzIwLjA4OCwyMjIuODg1NyAzMTkuODUsMjIyLjg4NTcgQyAzMTkuNjA4LDIyMi44ODU3IDMxOS40MTQsMjIyLjcwNTcgMzE5LjQxNCwyMjIuNDc2NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MTk5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDMyMi4zNDgsMjIyLjY1MzcgTCAzMjEuMzg0LDIyMi42NTM3IEMgMzIxLjIwNSwyMjIuNjUzNyAzMjEuMDU2LDIyMi41MTI3IDMyMS4wNTYsMjIyLjM0MjcgQyAzMjEuMDU2LDIyMi4xNzY3IDMyMS4yMDEsMjIyLjAzOTcgMzIxLjM4LDIyMi4wMzk3IEwgMzIzLjMyOCwyMjIuMDM5NyBDIDMyMy41MDcsMjIyLjAzOTcgMzIzLjY0NywyMjIuMTc2NyAzMjMuNjQ3LDIyMi4zNDI3IEMgMzIzLjY0NywyMjIuNTEyNyAzMjMuNTAzLDIyMi42NTM3IDMyMy4zMjQsMjIyLjY1MzcgTCAzMjIuMzQ4LDIyMi42NTM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyMDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDMyMi4zNDgsMjIyLjY1MzcgTCAzMjEuMzg0LDIyMi42NTM3IEMgMzIxLjIwNSwyMjIuNjUzNyAzMjEuMDU2LDIyMi41MTI3IDMyMS4wNTYsMjIyLjM0MjcgQyAzMjEuMDU2LDIyMi4xNzY3IDMyMS4yMDEsMjIyLjAzOTcgMzIxLjM4LDIyMi4wMzk3IEwgMzIzLjMyOCwyMjIuMDM5NyBDIDMyMy41MDcsMjIyLjAzOTcgMzIzLjY0NywyMjIuMTc2NyAzMjMuNjQ3LDIyMi4zNDI3IEMgMzIzLjY0NywyMjIuNTEyNyAzMjMuNTAzLDIyMi42NTM3IDMyMy4zMjQsMjIyLjY1MzcgTCAzMjIuMzQ4LDIyMi42NTM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyMDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwNThlNmUiCi0gICAgICAgICAgIGQ9Ik0gMzE3LjUyMywyMjIuOTg0NyBMIDMxNi44MzQsMjIzLjA4NjcgQyAzMTYuNjU3LDIyMy4xMTE3IDMxNi40OTEsMjIyLjk5ODcgMzE2LjQ2MSwyMjIuODI5NyBDIDMxNi40MzUsMjIyLjY2MzcgMzE2LjU1MywyMjIuNTA4NyAzMTYuNzI5LDIyMi40ODM3IEwgMzE3LjQyMSwyMjIuMzgxNyBMIDMxOC4xMjgsMjIyLjI3MjcgQyAzMTguMzA1LDIyMi4yNTE3IDMxOC40NjgsMjIyLjM2MDcgMzE4LjQ5OCwyMjIuNTI2NyBDIDMxOC41MjQsMjIyLjY5MTcgMzE4LjQwMSwyMjIuODUwNyAzMTguMjI2LDIyMi44NzU3IEwgMzE3LjUyMywyMjIuOTg0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjA1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMTcuNTIzLDIyMi45ODQ3IEwgMzE2LjgzNCwyMjMuMDg2NyBDIDMxNi42NTcsMjIzLjExMTcgMzE2LjQ5MSwyMjIuOTk4NyAzMTYuNDYxLDIyMi44Mjk3IEMgMzE2LjQzNSwyMjIuNjYzNyAzMTYuNTUzLDIyMi41MDg3IDMxNi43MjksMjIyLjQ4MzcgTCAzMTcuNDIxLDIyMi4zODE3IEwgMzE4LjEyOCwyMjIuMjcyNyBDIDMxOC4zMDUsMjIyLjI1MTcgMzE4LjQ2OCwyMjIuMzYwNyAzMTguNDk4LDIyMi41MjY3IEMgMzE4LjUyNCwyMjIuNjkxNyAzMTguNDAxLDIyMi44NTA3IDMxOC4yMjYsMjIyLjg3NTcgTCAzMTcuNTIzLDIyMi45ODQ3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyMDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMzE0Ljc0LDIyMy40Njc3IEwgMzE1LjA0NiwyMjIuOTc0NyBMIDMxNS43MDIsMjIzLjA5NzcgTCAzMTUuMzIxLDIyMy42NTE3IEwgMzE0Ljc0LDIyMy40Njc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyMDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDMxNC43NCwyMjMuNDY3NyBMIDMxNS4wNDYsMjIyLjk3NDcgTCAzMTUuNzAyLDIyMy4wOTc3IEwgMzE1LjMyMSwyMjMuNjUxNyBMIDMxNC43NCwyMjMuNDY3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjExIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDMyNC4zNDUsMjIyLjQ3NjcgQyAzMjQuMzQ1LDIyMi4yNTE3IDMyNC41NDIsMjIyLjA2NzcgMzI0Ljc4LDIyMi4wNjc3IEMgMzI1LjAxOSwyMjIuMDY3NyAzMjUuMjE2LDIyMi4yNTE3IDMyNS4yMTYsMjIyLjQ3NjcgQyAzMjUuMjE2LDIyMi43MDU3IDMyNS4wMTksMjIyLjg4NTcgMzI0Ljc4LDIyMi44ODU3IEMgMzI0LjU0MiwyMjIuODg1NyAzMjQuMzQ1LDIyMi43MDU3IDMyNC4zNDUsMjIyLjQ3NjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTIxMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzI0LjM0NSwyMjIuNDc2NyBDIDMyNC4zNDUsMjIyLjI1MTcgMzI0LjU0MiwyMjIuMDY3NyAzMjQuNzgsMjIyLjA2NzcgQyAzMjUuMDE5LDIyMi4wNjc3IDMyNS4yMTYsMjIyLjI1MTcgMzI1LjIxNiwyMjIuNDc2NyBDIDMyNS4yMTYsMjIyLjcwNTcgMzI1LjAxOSwyMjIuODg1NyAzMjQuNzgsMjIyLjg4NTcgQyAzMjQuNTQyLDIyMi44ODU3IDMyNC4zNDUsMjIyLjcwNTcgMzI0LjM0NSwyMjIuNDc2NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjE1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojMDU4ZTZlIgotICAgICAgICAgICBkPSJNIDMyNy4xMDQsMjIyLjk4NDcgTCAzMjcuNzk3LDIyMy4wODY3IEMgMzI3Ljk3MiwyMjMuMTExNyAzMjguMTM1LDIyMi45OTg3IDMyOC4xNjUsMjIyLjgyOTcgQyAzMjguMTksMjIyLjY2MzcgMzI4LjA3NiwyMjIuNTA4NyAzMjcuOTAxLDIyMi40ODM3IEwgMzI3LjIwOCwyMjIuMzgxNyBMIDMyNi41MDEsMjIyLjI3MjcgQyAzMjYuMzIyLDIyMi4yNTE3IDMyNi4xNTgsMjIyLjM2MDcgMzI2LjEzMiwyMjIuNTI2NyBDIDMyNi4xMDIsMjIyLjY5MTcgMzI2LjIyOSwyMjIuODUwNyAzMjYuNDA0LDIyMi44NzU3IEwgMzI3LjEwNCwyMjIuOTg0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjE3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMjcuMTA0LDIyMi45ODQ3IEwgMzI3Ljc5NywyMjMuMDg2NyBDIDMyNy45NzIsMjIzLjExMTcgMzI4LjEzNSwyMjIuOTk4NyAzMjguMTY1LDIyMi44Mjk3IEMgMzI4LjE5LDIyMi42NjM3IDMyOC4wNzYsMjIyLjUwODcgMzI3LjkwMSwyMjIuNDgzNyBMIDMyNy4yMDgsMjIyLjM4MTcgTCAzMjYuNTAxLDIyMi4yNzI3IEMgMzI2LjMyMiwyMjIuMjUxNyAzMjYuMTU4LDIyMi4zNjA3IDMyNi4xMzIsMjIyLjUyNjcgQyAzMjYuMTAyLDIyMi42OTE3IDMyNi4yMjksMjIyLjg1MDcgMzI2LjQwNCwyMjIuODc1NyBMIDMyNy4xMDQsMjIyLjk4NDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTIxOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAzMjkuODMsMjIzLjQ5NTcgTCAzMjkuNTg0LDIyMi45NzA3IEwgMzI4LjkxMiwyMjMuMDI2NyBMIDMyOS4yMzQsMjIzLjYxNTcgTCAzMjkuODMsMjIzLjQ5NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTIyMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzI5LjgzLDIyMy40OTU3IEwgMzI5LjU4NCwyMjIuOTcwNyBMIDMyOC45MTIsMjIzLjAyNjcgTCAzMjkuMjM0LDIyMy42MTU3IEwgMzI5LjgzLDIyMy40OTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyMjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMzIyLjMwNywyMjUuMzE1NyBDIDMxOS44OTEsMjI1LjMxMjcgMzE3LjcwNSwyMjUuMTAwNyAzMTYuMDQsMjI0LjY3MDcgQyAzMTcuNzA1LDIyNC4yNDM3IDMxOS44OTEsMjIzLjk3OTcgMzIyLjMwNywyMjMuOTcyNyBDIDMyNC43MjQsMjIzLjk3NTcgMzI2LjkyMSwyMjQuMjQwNyAzMjguNTgxLDIyNC42NzA3IEMgMzI2LjkyMSwyMjUuMTAwNyAzMjQuNzI0LDIyNS4zMTI3IDMyMi4zMDcsMjI1LjMxNTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTIyNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTY7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIgotICAgICAgICAgICBkPSJNIDMyMi4zMDcsMjI1LjMxNTcgQyAzMTkuODkxLDIyNS4zMTI3IDMxNy43MDUsMjI1LjEwMDcgMzE2LjA0LDIyNC42NzA3IEMgMzE3LjcwNSwyMjQuMjQzNyAzMTkuODkxLDIyMy45Nzk3IDMyMi4zMDcsMjIzLjk3MjcgQyAzMjQuNzI0LDIyMy45NzU3IDMyNi45MjEsMjI0LjI0MDcgMzI4LjU4MSwyMjQuNjcwNyBDIDMyNi45MjEsMjI1LjEwMDcgMzI0LjcyNCwyMjUuMzEyNyAzMjIuMzA3LDIyNS4zMTU3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyMjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzI5LjkyNywyMjAuMDc1NyBDIDMyOS45OSwyMTkuODg4NyAzMjkuOTM0LDIxOS43MDQ3IDMyOS43OTUsMjE5LjY1ODcgQyAzMjkuNjYxLDIxOS42MjA3IDMyOS41MDIsMjE5Ljc0MDcgMzI5LjQzOSwyMTkuOTE5NyBDIDMyOS4zNzIsMjIwLjExMDcgMzI5LjQzMSwyMjAuMjk3NyAzMjkuNTY1LDIyMC4zMzk3IEMgMzI5LjY5OSwyMjAuMzc4NyAzMjkuODYzLDIyMC4yNjI3IDMyOS45MjcsMjIwLjA3NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTIyOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzI5LjkyNywyMjAuMDc1NyBDIDMyOS45OSwyMTkuODg4NyAzMjkuOTM0LDIxOS43MDQ3IDMyOS43OTUsMjE5LjY1ODcgQyAzMjkuNjYxLDIxOS42MjA3IDMyOS41MDIsMjE5Ljc0MDcgMzI5LjQzOSwyMTkuOTE5NyBDIDMyOS4zNzIsMjIwLjExMDcgMzI5LjQzMSwyMjAuMjk3NyAzMjkuNTY1LDIyMC4zMzk3IEMgMzI5LjY5OSwyMjAuMzc4NyAzMjkuODYzLDIyMC4yNjI3IDMyOS45MjcsMjIwLjA3NTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTIzMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMjUuMTE1LDIxOS4xNDQ3IEMgMzI1LjE0MSwyMTguOTUwNyAzMjUuMDQ0LDIxOC43Nzc3IDMyNC45MDMsMjE4Ljc1OTcgQyAzMjQuNzY1LDIxOC43NDI3IDMyNC42MjcsMjE4Ljg5MDcgMzI0LjYwNSwyMTkuMDg0NyBDIDMyNC41NzksMjE5LjI3ODcgMzI0LjY3MiwyMTkuNDUwNyAzMjQuODE0LDIxOS40Njg3IEMgMzI0Ljk1NSwyMTkuNDgyNyAzMjUuMDg5LDIxOS4zMzQ3IDMyNS4xMTUsMjE5LjE0NDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTIzMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzI1LjExNSwyMTkuMTQ0NyBDIDMyNS4xNDEsMjE4Ljk1MDcgMzI1LjA0NCwyMTguNzc3NyAzMjQuOTAzLDIxOC43NTk3IEMgMzI0Ljc2NSwyMTguNzQyNyAzMjQuNjI3LDIxOC44OTA3IDMyNC42MDUsMjE5LjA4NDcgQyAzMjQuNTc5LDIxOS4yNzg3IDMyNC42NzIsMjE5LjQ1MDcgMzI0LjgxNCwyMTkuNDY4NyBDIDMyNC45NTUsMjE5LjQ4MjcgMzI1LjA4OSwyMTkuMzM0NyAzMjUuMTE1LDIxOS4xNDQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyMzUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzE5LjUzLDIxOS4xNDQ3IEMgMzE5LjUwNCwyMTguOTUwNyAzMTkuNTk2LDIxOC43Nzc3IDMxOS43MzgsMjE4Ljc1OTcgQyAzMTkuODgsMjE4Ljc0MjcgMzIwLjAxMywyMTguODkwNyAzMjAuMDQsMjE5LjA4NDcgQyAzMjAuMDYxLDIxOS4yNzg3IDMxOS45NjksMjE5LjQ1MDcgMzE5LjgzMSwyMTkuNDY4NyBDIDMxOS42OSwyMTkuNDgyNyAzMTkuNTU1LDIxOS4zMzQ3IDMxOS41MywyMTkuMTQ0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjM3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMTkuNTMsMjE5LjE0NDcgQyAzMTkuNTA0LDIxOC45NTA3IDMxOS41OTYsMjE4Ljc3NzcgMzE5LjczOCwyMTguNzU5NyBDIDMxOS44OCwyMTguNzQyNyAzMjAuMDEzLDIxOC44OTA3IDMyMC4wNCwyMTkuMDg0NyBDIDMyMC4wNjEsMjE5LjI3ODcgMzE5Ljk2OSwyMTkuNDUwNyAzMTkuODMxLDIxOS40Njg3IEMgMzE5LjY5LDIxOS40ODI3IDMxOS41NTUsMjE5LjMzNDcgMzE5LjUzLDIxOS4xNDQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyMzkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzE0LjcxOCwyMjAuMDc1NyBDIDMxNC42NTEsMjE5Ljg4ODcgMzE0LjcxMSwyMTkuNzA0NyAzMTQuODQ1LDIxOS42NTg3IEMgMzE0Ljk3OCwyMTkuNjIwNyAzMTUuMTQyLDIxOS43NDA3IDMxNS4yMDYsMjE5LjkxOTcgQyAzMTUuMjY5LDIyMC4xMTA3IDMxNS4yMTMsMjIwLjI5NzcgMzE1LjA4LDIyMC4zMzk3IEMgMzE0Ljk0MiwyMjAuMzc4NyAzMTQuNzgxLDIyMC4yNjI3IDMxNC43MTgsMjIwLjA3NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTI0MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzE0LjcxOCwyMjAuMDc1NyBDIDMxNC42NTEsMjE5Ljg4ODcgMzE0LjcxMSwyMTkuNzA0NyAzMTQuODQ1LDIxOS42NTg3IEMgMzE0Ljk3OCwyMTkuNjIwNyAzMTUuMTQyLDIxOS43NDA3IDMxNS4yMDYsMjE5LjkxOTcgQyAzMTUuMjY5LDIyMC4xMTA3IDMxNS4yMTMsMjIwLjI5NzcgMzE1LjA4LDIyMC4zMzk3IEMgMzE0Ljk0MiwyMjAuMzc4NyAzMTQuNzgxLDIyMC4yNjI3IDMxNC43MTgsMjIwLjA3NTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTI0MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMjIuMzA3LDIxNi4zNjU3IEwgMzIxLjQ1NSwyMTYuODc5NyBMIDMyMi4wODcsMjE4LjI1MTcgTCAzMjIuMzA3LDIxOC4zOTY3IEwgMzIyLjUyNCwyMTguMjUxNyBMIDMyMy4xNiwyMTYuODc5NyBMIDMyMi4zMDcsMjE2LjM2NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTI0NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzIyLjMwNywyMTYuMzY1NyBMIDMyMS40NTUsMjE2Ljg3OTcgTCAzMjIuMDg3LDIxOC4yNTE3IEwgMzIyLjMwNywyMTguMzk2NyBMIDMyMi41MjQsMjE4LjI1MTcgTCAzMjMuMTYsMjE2Ljg3OTcgTCAzMjIuMzA3LDIxNi4zNjU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzIwLjQzNywyMTguNDM4NyBMIDMyMC44MjYsMjE5LjAwMzcgTCAzMjIuMTU1LDIxOC41OTM3IEwgMzIyLjI5NiwyMTguNDA3NyBMIDMyMi4xNTUsMjE4LjIxNjcgTCAzMjAuODI2LDIxNy44Mjg3IEwgMzIwLjQzNywyMTguNDM4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjQ5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMjAuNDM3LDIxOC40Mzg3IEwgMzIwLjgyNiwyMTkuMDAzNyBMIDMyMi4xNTUsMjE4LjU5MzcgTCAzMjIuMjk2LDIxOC40MDc3IEwgMzIyLjE1NSwyMTguMjE2NyBMIDMyMC44MjYsMjE3LjgyODcgTCAzMjAuNDM3LDIxOC40Mzg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzI0LjE4NCwyMTguNDM4NyBMIDMyMy43OTMsMjE5LjAwMzcgTCAzMjIuNDY0LDIxOC41OTM3IEwgMzIyLjMyMywyMTguNDA3NyBMIDMyMi40NjQsMjE4LjIxNjcgTCAzMjMuNzkzLDIxNy44Mjg3IEwgMzI0LjE4NCwyMTguNDM4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjUzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMjQuMTg0LDIxOC40Mzg3IEwgMzIzLjc5MywyMTkuMDAzNyBMIDMyMi40NjQsMjE4LjU5MzcgTCAzMjIuMzIzLDIxOC40MDc3IEwgMzIyLjQ2NCwyMTguMjE2NyBMIDMyMy43OTMsMjE3LjgyODcgTCAzMjQuMTg0LDIxOC40Mzg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzE2Ljc2MSwyMTYuOTc1NyBMIDMxNi4wOTMsMjE3LjYwNjcgTCAzMTYuOTQ5LDIxOC43MzU3IEwgMzE3LjE3NiwyMTguODI2NyBMIDMxNy4zNDQsMjE4LjY1MzcgTCAzMTcuNjQ1LDIxNy4yODk3IEwgMzE2Ljc2MSwyMTYuOTc1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjU3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMTYuNzYxLDIxNi45NzU3IEwgMzE2LjA5MywyMTcuNjA2NyBMIDMxNi45NDksMjE4LjczNTcgTCAzMTcuMTc2LDIxOC44MjY3IEwgMzE3LjM0NCwyMTguNjUzNyBMIDMxNy42NDUsMjE3LjI4OTcgTCAzMTYuNzYxLDIxNi45NzU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzE1LjM1OSwyMTkuMjM5NyBMIDMxNS44NjEsMjE5LjcxMTcgTCAzMTcuMDc1LDIxOS4wNTU3IEwgMzE3LjE2OCwyMTguODQ0NyBMIDMxNi45OTQsMjE4LjY4NTcgTCAzMTUuNjA1LDIxOC41NjU3IEwgMzE1LjM1OSwyMTkuMjM5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjYxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMTUuMzU5LDIxOS4yMzk3IEwgMzE1Ljg2MSwyMTkuNzExNyBMIDMxNy4wNzUsMjE5LjA1NTcgTCAzMTcuMTY4LDIxOC44NDQ3IEwgMzE2Ljk5NCwyMTguNjg1NyBMIDMxNS42MDUsMjE4LjU2NTcgTCAzMTUuMzU5LDIxOS4yMzk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzE5LjAyMywyMTguNTAyNyBMIDMxOC43NjYsMjE5LjEyNjcgTCAzMTcuMzc2LDIxOC45OTk3IEwgMzE3LjE5NSwyMTguODQwNyBMIDMxNy4yOTEsMjE4LjYyNTcgTCAzMTguNTA5LDIxNy45ODM3IEwgMzE5LjAyMywyMTguNTAyNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjY1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMTkuMDIzLDIxOC41MDI3IEwgMzE4Ljc2NiwyMTkuMTI2NyBMIDMxNy4zNzYsMjE4Ljk5OTcgTCAzMTcuMTk1LDIxOC44NDA3IEwgMzE3LjI5MSwyMTguNjI1NyBMIDMxOC41MDksMjE3Ljk4MzcgTCAzMTkuMDIzLDIxOC41MDI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzE0LjAyMiwyMTkuNDE1NyBMIDMxMy45MDcsMjIwLjA3NTcgTCAzMTIuNTE2LDIyMC4yMTk3IEwgMzEyLjMwNSwyMjAuMDk5NyBMIDMxMi4zNTgsMjE5Ljg3NDcgTCAzMTMuNDAzLDIxOS4wMDY3IEwgMzE0LjAyMiwyMTkuNDE1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjY5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMTQuMDIyLDIxOS40MTU3IEwgMzEzLjkwNywyMjAuMDc1NyBMIDMxMi41MTYsMjIwLjIxOTcgTCAzMTIuMzA1LDIyMC4wOTk3IEwgMzEyLjM1OCwyMTkuODc0NyBMIDMxMy40MDMsMjE5LjAwNjcgTCAzMTQuMDIyLDIxOS40MTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzE2LjcsMjE4Ljg0NzcgQyAzMTYuNywyMTguNTkwNyAzMTYuOTE5LDIxOC4zODI3IDMxNy4xODcsMjE4LjM4MjcgQyAzMTcuNDU5LDIxOC4zODI3IDMxNy42NzUsMjE4LjU5MDcgMzE3LjY3NSwyMTguODQ3NyBDIDMxNy42NzUsMjE5LjEwMTcgMzE3LjQ1OSwyMTkuMzA5NyAzMTcuMTg3LDIxOS4zMDk3IEMgMzE2LjkxOSwyMTkuMzA5NyAzMTYuNywyMTkuMTAxNyAzMTYuNywyMTguODQ3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjczIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMTYuNywyMTguODQ3NyBDIDMxNi43LDIxOC41OTA3IDMxNi45MTksMjE4LjM4MjcgMzE3LjE4NywyMTguMzgyNyBDIDMxNy40NTksMjE4LjM4MjcgMzE3LjY3NSwyMTguNTkwNyAzMTcuNjc1LDIxOC44NDc3IEMgMzE3LjY3NSwyMTkuMTAxNyAzMTcuNDU5LDIxOS4zMDk3IDMxNy4xODcsMjE5LjMwOTcgQyAzMTYuOTE5LDIxOS4zMDk3IDMxNi43LDIxOS4xMDE3IDMxNi43LDIxOC44NDc3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNzUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzI3Ljg3MSwyMTYuOTc1NyBMIDMyOC41NDEsMjE3LjYwNjcgTCAzMjcuNjg0LDIxOC43MzU3IEwgMzI3LjQ1NywyMTguODI2NyBMIDMyNy4yOSwyMTguNjUzNyBMIDMyNi45ODgsMjE3LjI4OTcgTCAzMjcuODcxLDIxNi45NzU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyNzciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDMyNy44NzEsMjE2Ljk3NTcgTCAzMjguNTQxLDIxNy42MDY3IEwgMzI3LjY4NCwyMTguNzM1NyBMIDMyNy40NTcsMjE4LjgyNjcgTCAzMjcuMjksMjE4LjY1MzcgTCAzMjYuOTg4LDIxNy4yODk3IEwgMzI3Ljg3MSwyMTYuOTc1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Mjc5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMyOS4yNzUsMjE5LjIzOTcgTCAzMjguNzcyLDIxOS43MTE3IEwgMzI3LjU1OCwyMTkuMDU1NyBMIDMyNy40NjEsMjE4Ljg0NDcgTCAzMjcuNjQsMjE4LjY4NTcgTCAzMjkuMDI5LDIxOC41NjU3IEwgMzI5LjI3NSwyMTkuMjM5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MjgxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMjkuMjc1LDIxOS4yMzk3IEwgMzI4Ljc3MiwyMTkuNzExNyBMIDMyNy41NTgsMjE5LjA1NTcgTCAzMjcuNDYxLDIxOC44NDQ3IEwgMzI3LjY0LDIxOC42ODU3IEwgMzI5LjAyOSwyMTguNTY1NyBMIDMyOS4yNzUsMjE5LjIzOTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTI4MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMjUuNjEsMjE4LjUwMjcgTCAzMjUuODY3LDIxOS4xMjY3IEwgMzI3LjI1NywyMTguOTk5NyBMIDMyNy40MzUsMjE4Ljg0MDcgTCAzMjcuMzQyLDIxOC42MjU3IEwgMzI2LjEyNSwyMTcuOTgzNyBMIDMyNS42MSwyMTguNTAyNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Mjg1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMjUuNjEsMjE4LjUwMjcgTCAzMjUuODY3LDIxOS4xMjY3IEwgMzI3LjI1NywyMTguOTk5NyBMIDMyNy40MzUsMjE4Ljg0MDcgTCAzMjcuMzQyLDIxOC42MjU3IEwgMzI2LjEyNSwyMTcuOTgzNyBMIDMyNS42MSwyMTguNTAyNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Mjg3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMzMC40MjUsMjE5LjQxNTcgTCAzMzAuNTM3LDIyMC4wNzU3IEwgMzMxLjkyNSwyMjAuMjE5NyBMIDMzMi4xMzQsMjIwLjA5OTcgTCAzMzIuMDgyLDIxOS44NzQ3IEwgMzMxLjA0LDIxOS4wMDY3IEwgMzMwLjQyNSwyMTkuNDE1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Mjg5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAzMzAuNDI1LDIxOS40MTU3IEwgMzMwLjUzNywyMjAuMDc1NyBMIDMzMS45MjUsMjIwLjIxOTcgTCAzMzIuMTM0LDIyMC4wOTk3IEwgMzMyLjA4MiwyMTkuODc0NyBMIDMzMS4wNCwyMTkuMDA2NyBMIDMzMC40MjUsMjE5LjQxNTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTI5MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMjEuODI3LDIxOC40MTA3IEMgMzIxLjgyNywyMTguMTQ5NyAzMjIuMDQyLDIxNy45NDU3IDMyMi4zMTUsMjE3Ljk0NTcgQyAzMjIuNTc5LDIxNy45NDU3IDMyMi44MDMsMjE4LjE0OTcgMzIyLjgwMywyMTguNDEwNyBDIDMyMi44MDMsMjE4LjY2NDcgMzIyLjU4MiwyMTguODcyNyAzMjIuMzE1LDIxOC44NzI3IEMgMzIyLjA0MiwyMTguODcyNyAzMjEuODI3LDIxOC42NjQ3IDMyMS44MjcsMjE4LjQxMDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTI5MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzIxLjgyNywyMTguNDEwNyBDIDMyMS44MjcsMjE4LjE0OTcgMzIyLjA0MiwyMTcuOTQ1NyAzMjIuMzE1LDIxNy45NDU3IEMgMzIyLjU3OSwyMTcuOTQ1NyAzMjIuODAzLDIxOC4xNDk3IDMyMi44MDMsMjE4LjQxMDcgQyAzMjIuODAzLDIxOC42NjQ3IDMyMi41ODIsMjE4Ljg3MjcgMzIyLjMxNSwyMTguODcyNyBDIDMyMi4wNDIsMjE4Ljg3MjcgMzIxLjgyNywyMTguNjY0NyAzMjEuODI3LDIxOC40MTA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyOTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzI2Ljk2NiwyMTguODQ3NyBDIDMyNi45NjYsMjE4LjU5MDcgMzI3LjE4NSwyMTguMzgyNyAzMjcuNDU0LDIxOC4zODI3IEMgMzI3LjcyNSwyMTguMzgyNyAzMjcuOTQ2LDIxOC41OTA3IDMyNy45NDYsMjE4Ljg0NzcgQyAzMjcuOTQ2LDIxOS4xMDE3IDMyNy43MjUsMjE5LjMwOTcgMzI3LjQ1NCwyMTkuMzA5NyBDIDMyNy4xODUsMjE5LjMwOTcgMzI2Ljk2NiwyMTkuMTAxNyAzMjYuOTY2LDIxOC44NDc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUyOTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDMyNi45NjYsMjE4Ljg0NzcgQyAzMjYuOTY2LDIxOC41OTA3IDMyNy4xODUsMjE4LjM4MjcgMzI3LjQ1NCwyMTguMzgyNyBDIDMyNy43MjUsMjE4LjM4MjcgMzI3Ljk0NiwyMTguNTkwNyAzMjcuOTQ2LDIxOC44NDc3IEMgMzI3Ljk0NiwyMTkuMTAxNyAzMjcuNzI1LDIxOS4zMDk3IDMyNy40NTQsMjE5LjMwOTcgQyAzMjcuMTg1LDIxOS4zMDk3IDMyNi45NjYsMjE5LjEwMTcgMzI2Ljk2NiwyMTguODQ3NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Mjk5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMyMS4zOTksMjEzLjE5MTcgQyAzMjEuMzk5LDIxMi43MTE3IDMyMS44MDksMjEyLjMyMzcgMzIyLjMxNSwyMTIuMzIzNyBDIDMyMi44MiwyMTIuMzIzNyAzMjMuMjM1LDIxMi43MTE3IDMyMy4yMzUsMjEzLjE5MTcgQyAzMjMuMjM1LDIxMy42NzA3IDMyMi44MiwyMTQuMDU4NyAzMjIuMzE1LDIxNC4wNTg3IEMgMzIxLjgwOSwyMTQuMDU4NyAzMjEuMzk5LDIxMy42NzA3IDMyMS4zOTksMjEzLjE5MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTMwMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMjIuOTYzLDIxMi44ODQ3IEwgMzIyLjk2MywyMTMuNDU5NyBMIDMyMS41NDcsMjEzLjQ1OTcgTCAzMjEuNTQ3LDIxMi44ODQ3IEwgMzIyLjAxLDIxMi44ODQ3IEwgMzIyLjAxLDIxMS41ODY3IEwgMzIxLjM5NSwyMTEuNTg2NyBMIDMyMS4zOTUsMjExLjAwODcgTCAzMjIuMDEsMjExLjAwODcgTCAzMjIuMDEsMjEwLjQ0MDcgTCAzMjIuNjE3LDIxMC40NDA3IEwgMzIyLjYxNywyMTEuMDA4NyBMIDMyMy4yMiwyMTEuMDA4NyBMIDMyMy4yMiwyMTEuNTg2NyBMIDMyMi42MTcsMjExLjU4NjcgTCAzMjIuNjE3LDIxMi44ODQ3IEwgMzIyLjk1OSwyMTIuODg0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzAzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI5NzE2IgotICAgICAgICAgICBkPSJNIDMyMi45NjMsMjEyLjg4NDcgTCAzMjIuOTYzLDIxMy40NTk3IEwgMzIxLjU0NywyMTMuNDU5NyBMIDMyMS41NDcsMjEyLjg4NDcgTCAzMjIuMDEsMjEyLjg4NDcgTCAzMjIuMDEsMjExLjU4NjcgTCAzMjEuMzk1LDIxMS41ODY3IEwgMzIxLjM5NSwyMTEuMDA4NyBMIDMyMi4wMSwyMTEuMDA4NyBMIDMyMi4wMSwyMTAuNDQwNyBMIDMyMi42MTcsMjEwLjQ0MDcgTCAzMjIuNjE3LDIxMS4wMDg3IEwgMzIzLjIyLDIxMS4wMDg3IEwgMzIzLjIyLDIxMS41ODY3IEwgMzIyLjYxNywyMTEuNTg2NyBMIDMyMi42MTcsMjEyLjg4NDcgTCAzMjIuOTU5LDIxMi44ODQ3IEwgMzIyLjk2MywyMTIuODg0NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzA1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMyMy41OTYsMjEyLjg4NDcgTCAzMjMuNTk2LDIxMy40NTk3IEwgMzIxLjA3OSwyMTMuNDU5NyBMIDMyMS4wNzksMjEyLjg4NDcgTCAzMjIuMDEsMjEyLjg4NDcgTCAzMjIuMDEsMjExLjU4NjcgTCAzMjEuMzk1LDIxMS41ODY3IEwgMzIxLjM5NSwyMTEuMDA4NyBMIDMyMi4wMSwyMTEuMDA4NyBMIDMyMi4wMSwyMTAuNDQwNyBMIDMyMi42MTcsMjEwLjQ0MDcgTCAzMjIuNjE3LDIxMS4wMDg3IEwgMzIzLjIyMywyMTEuMDA4NyBMIDMyMy4yMjMsMjExLjU4NjcgTCAzMjIuNjE3LDIxMS41ODY3IEwgMzIyLjYxNywyMTIuODg0NyBMIDMyMy41OTYsMjEyLjg4NDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTMwNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzIyLjU3OSwyMTIuMzU4NyBDIDMyMi45NTksMjEyLjQ2MTcgMzIzLjIzNSwyMTIuNzk2NyAzMjMuMjM1LDIxMy4xOTE3IEMgMzIzLjIzNSwyMTMuNjcwNyAzMjIuODI1LDIxNC4wNTg3IDMyMi4zMTUsMjE0LjA1ODcgQyAzMjEuODA5LDIxNC4wNTg3IDMyMS4zOTksMjEzLjY3MDcgMzIxLjM5OSwyMTMuMTkxNyBDIDMyMS4zOTksMjEyLjc4OTcgMzIxLjY4NiwyMTIuNDU0NyAzMjIuMDc3LDIxMi4zNTE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzMDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzEyLjE0MSwyMjAuMTg3NyBDIDMxMi4xMywyMjAuMTk4NyAzMTEuNzY1LDIxOS43MDg3IDMxMS40OSwyMTkuNDYxNyBDIDMxMS4yOTYsMjE5LjI4ODcgMzEwLjgyLDIxOS4xNDA3IDMxMC44MiwyMTkuMTQwNyBDIDMxMC44MiwyMTkuMDUyNyAzMTEuMDk5LDIxOC44NTQ3IDMxMS40MDEsMjE4Ljg1NDcgQyAzMTEuNTc2LDIxOC44NTQ3IDMxMS43NDMsMjE4LjkyODcgMzExLjg0MiwyMTkuMDUyNyBMIDMxMS44NzcsMjE4Ljg2MTcgQyAzMTEuODc3LDIxOC44NjE3IDMxMi4xMjMsMjE4LjkwNzcgMzEyLjIzMSwyMTkuMTc5NyBDIDMxMi4zNDMsMjE5LjQ2MTcgMzEyLjI3MiwyMTkuODg4NyAzMTIuMjcyLDIxOS44ODg3IEMgMzEyLjI3MiwyMTkuODg4NyAzMTIuMjI3LDIyMC4wODU3IDMxMi4xNDEsMjIwLjE4NzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTMxMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzEyLjE0MSwyMjAuMTg3NyBDIDMxMi4xMywyMjAuMTk4NyAzMTEuNzY1LDIxOS43MDg3IDMxMS40OSwyMTkuNDYxNyBDIDMxMS4yOTYsMjE5LjI4ODcgMzEwLjgyLDIxOS4xNDA3IDMxMC44MiwyMTkuMTQwNyBDIDMxMC44MiwyMTkuMDUyNyAzMTEuMDk5LDIxOC44NTQ3IDMxMS40MDEsMjE4Ljg1NDcgQyAzMTEuNTc2LDIxOC44NTQ3IDMxMS43NDMsMjE4LjkyODcgMzExLjg0MiwyMTkuMDUyNyBMIDMxMS44NzcsMjE4Ljg2MTcgQyAzMTEuODc3LDIxOC44NjE3IDMxMi4xMjMsMjE4LjkwNzcgMzEyLjIzMSwyMTkuMTc5NyBDIDMxMi4zNDMsMjE5LjQ2MTcgMzEyLjI3MiwyMTkuODg4NyAzMTIuMjcyLDIxOS44ODg3IEMgMzEyLjI3MiwyMTkuODg4NyAzMTIuMjI3LDIyMC4wODU3IDMxMi4xNDEsMjIwLjE4NzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTMxMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMTIuMTYsMjE5Ljk0NDcgQyAzMTIuMjc2LDIxOS44MjQ3IDMxMi41MTQsMjE5Ljg0OTcgMzEyLjY4OSwyMjAuMDAxNyBDIDMxMi44NjgsMjIwLjE1MjcgMzEyLjkyLDIyMC4zNzQ3IDMxMi44MDMsMjIwLjQ5ODcgQyAzMTIuNjg5LDIyMC42MjE3IDMxMi40NTQsMjIwLjU5MzcgMzEyLjI3NiwyMjAuNDQxNyBDIDMxMi4wOTYsMjIwLjI5MDcgMzEyLjA0NSwyMjAuMDY0NyAzMTIuMTYsMjE5Ljk0NDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTMxNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMzEyLjE2LDIxOS45NDQ3IEMgMzEyLjI3NiwyMTkuODI0NyAzMTIuNTE0LDIxOS44NDk3IDMxMi42ODksMjIwLjAwMTcgQyAzMTIuODY4LDIyMC4xNTI3IDMxMi45MiwyMjAuMzc0NyAzMTIuODAzLDIyMC40OTg3IEMgMzEyLjY4OSwyMjAuNjIxNyAzMTIuNDU0LDIyMC41OTM3IDMxMi4yNzYsMjIwLjQ0MTcgQyAzMTIuMDk2LDIyMC4yOTA3IDMxMi4wNDUsMjIwLjA2NDcgMzEyLjE2LDIxOS45NDQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzMTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzMyLjMwMSwyMjAuMTg3NyBDIDMzMi4zMTYsMjIwLjE5ODcgMzMyLjY3NywyMTkuNzA4NyAzMzIuOTU0LDIxOS40NjE3IEMgMzMzLjE0NCwyMTkuMjg4NyAzMzMuNjI0LDIxOS4xNDA3IDMzMy42MjQsMjE5LjE0MDcgQyAzMzMuNjI0LDIxOS4wNTI3IDMzMy4zNDUsMjE4Ljg1NDcgMzMzLjA0MywyMTguODU0NyBDIDMzMi44NjgsMjE4Ljg1NDcgMzMyLjcsMjE4LjkyODcgMzMyLjYsMjE5LjA1MjcgTCAzMzIuNTYzLDIxOC44NjE3IEMgMzMyLjU2MywyMTguODYxNyAzMzIuMzE2LDIxOC45MDc3IDMzMi4yMDksMjE5LjE3OTcgQyAzMzIuMDk4LDIxOS40NjE3IDMzMi4xNjcsMjE5Ljg4ODcgMzMyLjE2NywyMTkuODg4NyBDIDMzMi4xNjcsMjE5Ljg4ODcgMzMyLjIxMiwyMjAuMDg1NyAzMzIuMzAxLDIyMC4xODc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzMTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDMzMi4zMDEsMjIwLjE4NzcgQyAzMzIuMzE2LDIyMC4xOTg3IDMzMi42NzcsMjE5LjcwODcgMzMyLjk1NCwyMTkuNDYxNyBDIDMzMy4xNDQsMjE5LjI4ODcgMzMzLjYyNCwyMTkuMTQwNyAzMzMuNjI0LDIxOS4xNDA3IEMgMzMzLjYyNCwyMTkuMDUyNyAzMzMuMzQ1LDIxOC44NTQ3IDMzMy4wNDMsMjE4Ljg1NDcgQyAzMzIuODY4LDIxOC44NTQ3IDMzMi43LDIxOC45Mjg3IDMzMi42LDIxOS4wNTI3IEwgMzMyLjU2MywyMTguODYxNyBDIDMzMi41NjMsMjE4Ljg2MTcgMzMyLjMxNiwyMTguOTA3NyAzMzIuMjA5LDIxOS4xNzk3IEMgMzMyLjA5OCwyMTkuNDYxNyAzMzIuMTY3LDIxOS44ODg3IDMzMi4xNjcsMjE5Ljg4ODcgQyAzMzIuMTY3LDIxOS44ODg3IDMzMi4yMTIsMjIwLjA4NTcgMzMyLjMwMSwyMjAuMTg3NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzIxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMzMi4zMTQsMjE5Ljk0NDcgQyAzMzIuMTk3LDIxOS44MjQ3IDMzMS45NiwyMTkuODQ5NyAzMzEuNzgxLDIyMC4wMDE3IEMgMzMxLjYwMiwyMjAuMTUyNyAzMzEuNTU0LDIyMC4zNzQ3IDMzMS42NjUsMjIwLjQ5ODcgQyAzMzEuNzgxLDIyMC42MjE3IDMzMi4wMTksMjIwLjU5MzcgMzMyLjE5NywyMjAuNDQxNyBDIDMzMi4zNzYsMjIwLjI5MDcgMzMyLjQyOSwyMjAuMDY0NyAzMzIuMzE0LDIxOS45NDQ3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzMjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDMzMi4zMTQsMjE5Ljk0NDcgQyAzMzIuMTk3LDIxOS44MjQ3IDMzMS45NiwyMTkuODQ5NyAzMzEuNzgxLDIyMC4wMDE3IEMgMzMxLjYwMiwyMjAuMTUyNyAzMzEuNTU0LDIyMC4zNzQ3IDMzMS42NjUsMjIwLjQ5ODcgQyAzMzEuNzgxLDIyMC42MjE3IDMzMi4wMTksMjIwLjU5MzcgMzMyLjE5NywyMjAuNDQxNyBDIDMzMi4zNzYsMjIwLjI5MDcgMzMyLjQyOSwyMjAuMDY0NyAzMzIuMzE0LDIxOS45NDQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzMjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzExLjI2MywyMzEuNDgwNyBMIDMzMy4zOTYsMjMxLjQ4MDcgTCAzMzMuMzk2LDIyNS42Nzg3IEwgMzExLjI2MywyMjUuNjc4NyBMIDMxMS4yNjMsMjMxLjQ4MDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTMyNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMzExLjI2MywyMzEuNDgwNyBMIDMzMy4zOTYsMjMxLjQ4MDcgTCAzMzMuMzk2LDIyNS42Nzg3IEwgMzExLjI2MywyMjUuNjc4NyBMIDMxMS4yNjMsMjMxLjQ4MDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTMyOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMzEuMDc0LDIzNS4zNDE3IEMgMzMwLjkzNSwyMzUuMjg1NyAzMzAuODMsMjM1LjI3ODcgMzMwLjY2NCwyMzUuMjc4NyBMIDMxNC4wODksMjM1LjI3ODcgQyAzMTMuOTI1LDIzNS4yNzg3IDMxMy43NjksMjM1LjMwNjcgMzEzLjYzMSwyMzUuMzU5NyBDIDMxNC4yMDEsMjM1LjE2OTcgMzE0LjYxLDIzNC42NTQ3IDMxNC42MSwyMzQuMDQ3NyBDIDMxNC42MSwyMzMuNDQxNyAzMTQuMTY0LDIzMi45MTU3IDMxMy41OSwyMzIuNzE4NyBDIDMxMy43MjgsMjMyLjc2MDcgMzEzLjkxMywyMzIuNzk5NyAzMTQuMDc3LDIzMi43OTk3IEwgMzMwLjY2NCwyMzIuNzk5NyBDIDMzMC44MywyMzIuNzk5NyAzMzAuOTg4LDIzMi43OTI3IDMzMS4xMjksMjMyLjc0NjcgTCAzMzEuMDM2LDIzMi43NjA3IEMgMzMwLjQ0NCwyMzIuOTQzNyAzMzAuMTA1LDIzMy40Njk3IDMzMC4xMDUsMjM0LjA0NzcgQyAzMzAuMTA1LDIzNC42MDQ3IDMzMC40ODEsMjM1LjE2MjcgMzMxLjA3NCwyMzUuMzQxNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzMxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NztzdHJva2UtbGluZWpvaW46cm91bmQiCi0gICAgICAgICAgIGQ9Ik0gMzMxLjA3NCwyMzUuMzQxNyBDIDMzMC45MzUsMjM1LjI4NTcgMzMwLjgzLDIzNS4yNzg3IDMzMC42NjQsMjM1LjI3ODcgTCAzMTQuMDg5LDIzNS4yNzg3IEMgMzEzLjkyNSwyMzUuMjc4NyAzMTMuNzY5LDIzNS4zMDY3IDMxMy42MzEsMjM1LjM1OTcgQyAzMTQuMjAxLDIzNS4xNjk3IDMxNC42MSwyMzQuNjU0NyAzMTQuNjEsMjM0LjA0NzcgQyAzMTQuNjEsMjMzLjQ0MTcgMzE0LjE2NCwyMzIuOTE1NyAzMTMuNTksMjMyLjcxODcgQyAzMTMuNzI4LDIzMi43NjA3IDMxMy45MTMsMjMyLjc5OTcgMzE0LjA3NywyMzIuNzk5NyBMIDMzMC42NjQsMjMyLjc5OTcgQyAzMzAuODMsMjMyLjc5OTcgMzMwLjk4OCwyMzIuNzkyNyAzMzEuMTI5LDIzMi43NDY3IEwgMzMxLjAzNiwyMzIuNzYwNyBDIDMzMC40NDQsMjMyLjk0MzcgMzMwLjEwNSwyMzMuNDY5NyAzMzAuMTA1LDIzNC4wNDc3IEMgMzMwLjEwNSwyMzQuNjA0NyAzMzAuNDgxLDIzNS4xNjI3IDMzMS4wNzQsMjM1LjM0MTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTMzMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMTQuMDg5LDIzNS4yNzg3IEwgMzMwLjY2NCwyMzUuMjc4NyBDIDMzMS4yMjIsMjM1LjI3ODcgMzMxLjY3NywyMzUuNjI3NyAzMzEuNjc3LDIzNi4wNTQ3IEMgMzMxLjY3NywyMzYuNDg0NyAzMzEuMjIyLDIzNi44MzM3IDMzMC42NjQsMjM2LjgzMzcgTCAzMTQuMDg5LDIzNi44MzM3IEMgMzEzLjUyNywyMzYuODMzNyAzMTMuMDcyLDIzNi40ODQ3IDMxMy4wNzIsMjM2LjA1NDcgQyAzMTMuMDcyLDIzNS42Mjc3IDMxMy41MjcsMjM1LjI3ODcgMzE0LjA4OSwyMzUuMjc4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzM1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAzMTQuMDg5LDIzNS4yNzg3IEwgMzMwLjY2NCwyMzUuMjc4NyBDIDMzMS4yMjIsMjM1LjI3ODcgMzMxLjY3NywyMzUuNjI3NyAzMzEuNjc3LDIzNi4wNTQ3IEMgMzMxLjY3NywyMzYuNDg0NyAzMzEuMjIyLDIzNi44MzM3IDMzMC42NjQsMjM2LjgzMzcgTCAzMTQuMDg5LDIzNi44MzM3IEMgMzEzLjUyNywyMzYuODMzNyAzMTMuMDcyLDIzNi40ODQ3IDMxMy4wNzIsMjM2LjA1NDcgQyAzMTMuMDcyLDIzNS42Mjc3IDMxMy41MjcsMjM1LjI3ODcgMzE0LjA4OSwyMzUuMjc4NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzM3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMxNC4wNzcsMjMxLjQ4MDcgTCAzMzAuNjY0LDIzMS40ODA3IEMgMzMxLjIyMiwyMzEuNDgwNyAzMzEuNjc3LDIzMS43NzY3IDMzMS42NzcsMjMyLjEzNjcgQyAzMzEuNjc3LDIzMi41MDI3IDMzMS4yMjIsMjMyLjc5OTcgMzMwLjY2NCwyMzIuNzk5NyBMIDMxNC4wNzcsMjMyLjc5OTcgQyAzMTMuNTE2LDIzMi43OTk3IDMxMy4wNjEsMjMyLjUwMjcgMzEzLjA2MSwyMzIuMTM2NyBDIDMxMy4wNjEsMjMxLjc3NjcgMzEzLjUxNiwyMzEuNDgwNyAzMTQuMDc3LDIzMS40ODA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzMzkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDMxNC4wNzcsMjMxLjQ4MDcgTCAzMzAuNjY0LDIzMS40ODA3IEMgMzMxLjIyMiwyMzEuNDgwNyAzMzEuNjc3LDIzMS43NzY3IDMzMS42NzcsMjMyLjEzNjcgQyAzMzEuNjc3LDIzMi41MDI3IDMzMS4yMjIsMjMyLjc5OTcgMzMwLjY2NCwyMzIuNzk5NyBMIDMxNC4wNzcsMjMyLjc5OTcgQyAzMTMuNTE2LDIzMi43OTk3IDMxMy4wNjEsMjMyLjUwMjcgMzEzLjA2MSwyMzIuMTM2NyBDIDMxMy4wNjEsMjMxLjc3NjcgMzEzLjUxNiwyMzEuNDgwNyAzMTQuMDc3LDIzMS40ODA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzNDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwMDViYmYiCi0gICAgICAgICAgIGQ9Ik0gMzA2Ljg3NiwzMjkuMTE0NyBDIDMwOC40MSwzMjkuMTE0NyAzMDkuNzcyLDMyOC43OTM3IDMxMC43NzgsMzI4LjI1NzcgQyAzMTEuNzc3LDMyNy43NDk3IDMxMy4xMjgsMzI3LjQzOTcgMzE0LjYxNywzMjcuNDM5NyBDIDMxNi4xMTEsMzI3LjQzOTcgMzE3LjUsMzI3Ljc1MzcgMzE4LjQ5OCwzMjguMjY0NyBDIDMxOS40OTYsMzI4Ljc5MDcgMzIwLjg4MSwzMjkuMTE0NyAzMjIuMzkzLDMyOS4xMTQ3IEMgMzIzLjkyLDMyOS4xMTQ3IDMyNS4yOSwzMjguNzU4NyAzMjYuMjk2LDMyOC4yMjI3IEMgMzI3LjI4NiwzMjcuNzM1NyAzMjguNjA4LDMyNy40Mzk3IDMzMC4wNjQsMzI3LjQzOTcgQyAzMzEuNTY1LDMyNy40Mzk3IDMzMi44OTQsMzI3LjcyNTcgMzMzLjg5NiwzMjguMjQzNyBDIDMzNC44OTcsMzI4Ljc3NjcgMzM2LjI5NCwzMjkuMTE0NyAzMzcuODIsMzI5LjExNDcgTCAzMzcuODIsMzMxLjUxMjcgQyAzMzYuMjk0LDMzMS41MTI3IDMzNC44OTcsMzMxLjE2MzcgMzMzLjg5NiwzMzAuNjM0NyBDIDMzMi44OTQsMzMwLjExOTcgMzMxLjU2NSwzMjkuODI3NyAzMzAuMDY0LDMyOS44Mjc3IEMgMzI4LjYwOCwzMjkuODI3NyAzMjcuMjg2LDMzMC4xMjY3IDMyNi4yOTYsMzMwLjYxNzcgQyAzMjUuMjk0LDMzMS4xNDk3IDMyMy45MiwzMzEuNTEyNyAzMjIuMzkzLDMzMS41MTI3IEMgMzIwLjg4NSwzMzEuNTEyNyAzMTkuNDk5LDMzMS4xODE3IDMxOC40OTgsMzMwLjY1OTcgQyAzMTcuNSwzMzAuMTQxNyAzMTYuMTE1LDMyOS44Mjc3IDMxNC42MTcsMzI5LjgyNzcgQyAzMTMuMTI4LDMyOS44Mjc3IDMxMS43NzcsMzMwLjE0MTcgMzEwLjc3OCwzMzAuNjUyNyBDIDMwOS43NzIsMzMxLjE4ODcgMzA4LjQyOSwzMzEuNTEyNyAzMDYuODk4LDMzMS41MTI3IEwgMzA2Ljg3NiwzMjkuMTE0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzQzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NztzdHJva2UtbGluZWpvaW46bWl0ZXIiCi0gICAgICAgICAgIGQ9Ik0gMzA2Ljg3NiwzMjkuMTE0NyBDIDMwOC40MSwzMjkuMTE0NyAzMDkuNzcyLDMyOC43OTM3IDMxMC43NzgsMzI4LjI1NzcgQyAzMTEuNzc3LDMyNy43NDk3IDMxMy4xMjgsMzI3LjQzOTcgMzE0LjYxNywzMjcuNDM5NyBDIDMxNi4xMTEsMzI3LjQzOTcgMzE3LjUsMzI3Ljc1MzcgMzE4LjQ5OCwzMjguMjY0NyBDIDMxOS40OTYsMzI4Ljc5MDcgMzIwLjg4MSwzMjkuMTE0NyAzMjIuMzkzLDMyOS4xMTQ3IEMgMzIzLjkyLDMyOS4xMTQ3IDMyNS4yOSwzMjguNzU4NyAzMjYuMjk2LDMyOC4yMjI3IEMgMzI3LjI4NiwzMjcuNzM1NyAzMjguNjA4LDMyNy40Mzk3IDMzMC4wNjQsMzI3LjQzOTcgQyAzMzEuNTY1LDMyNy40Mzk3IDMzMi44OTQsMzI3LjcyNTcgMzMzLjg5NiwzMjguMjQzNyBDIDMzNC44OTcsMzI4Ljc3NjcgMzM2LjI5NCwzMjkuMTE0NyAzMzcuODIsMzI5LjExNDcgTCAzMzcuODIsMzMxLjUxMjcgQyAzMzYuMjk0LDMzMS41MTI3IDMzNC44OTcsMzMxLjE2MzcgMzMzLjg5NiwzMzAuNjM0NyBDIDMzMi44OTQsMzMwLjExOTcgMzMxLjU2NSwzMjkuODI3NyAzMzAuMDY0LDMyOS44Mjc3IEMgMzI4LjYwOCwzMjkuODI3NyAzMjcuMjg2LDMzMC4xMjY3IDMyNi4yOTYsMzMwLjYxNzcgQyAzMjUuMjk0LDMzMS4xNDk3IDMyMy45MiwzMzEuNTEyNyAzMjIuMzkzLDMzMS41MTI3IEMgMzIwLjg4NSwzMzEuNTEyNyAzMTkuNDk5LDMzMS4xODE3IDMxOC40OTgsMzMwLjY1OTcgQyAzMTcuNSwzMzAuMTQxNyAzMTYuMTE1LDMyOS44Mjc3IDMxNC42MTcsMzI5LjgyNzcgQyAzMTMuMTI4LDMyOS44Mjc3IDMxMS43NzcsMzMwLjE0MTcgMzEwLjc3OCwzMzAuNjUyNyBDIDMwOS43NzIsMzMxLjE4ODcgMzA4LjQyOSwzMzEuNTEyNyAzMDYuODk4LDMzMS41MTI3IEwgMzA2Ljg3NiwzMjkuMTE0NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzQ1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojY2NjY2NjIgotICAgICAgICAgICBkPSJNIDMwNi44NzYsMzMxLjUxMjcgQyAzMDguNDEsMzMxLjUxMjcgMzA5Ljc3MiwzMzEuMTg4NyAzMTAuNzc4LDMzMC42NTI3IEMgMzExLjc3NywzMzAuMTQxNyAzMTMuMTI4LDMyOS44Mjc3IDMxNC42MTcsMzI5LjgyNzcgQyAzMTYuMTExLDMyOS44Mjc3IDMxNy41LDMzMC4xNDE3IDMxOC40OTgsMzMwLjY1OTcgQyAzMTkuNDk2LDMzMS4xODE3IDMyMC44ODEsMzMxLjUxMjcgMzIyLjM5MywzMzEuNTEyNyBDIDMyMy45MiwzMzEuNTEyNyAzMjUuMjksMzMxLjE0OTcgMzI2LjI5NiwzMzAuNjE3NyBDIDMyNy4yODYsMzMwLjEyNjcgMzI4LjYwOCwzMjkuODI3NyAzMzAuMDY0LDMyOS44Mjc3IEMgMzMxLjU2NSwzMjkuODI3NyAzMzIuODk0LDMzMC4xMTk3IDMzMy44OTYsMzMwLjYzNDcgQyAzMzQuODk3LDMzMS4xNjM3IDMzNi4yOTQsMzMxLjUxMjcgMzM3LjgyLDMzMS41MTI3IEwgMzM3LjgyLDMzMy45MDM3IEMgMzM2LjI5NCwzMzMuOTAzNyAzMzQuODk3LDMzMy41NjE3IDMzMy44OTYsMzMzLjAzMjcgQyAzMzIuODk0LDMzMi41MTA3IDMzMS41NjUsMzMyLjIyMTcgMzMwLjA2NCwzMzIuMjIxNyBDIDMyOC42MDgsMzMyLjIyMTcgMzI3LjI4NiwzMzIuNTIxNyAzMjYuMjk2LDMzMy4wMTE3IEMgMzI1LjI5NCwzMzMuNTQ0NyAzMjMuOTIsMzMzLjkwMzcgMzIyLjM5MywzMzMuOTAzNyBDIDMyMC44ODUsMzMzLjkwMzcgMzE5LjQ5OSwzMzMuNTcyNyAzMTguNDk4LDMzMy4wNTA3IEMgMzE3LjUsMzMyLjUzNTcgMzE2LjExNSwzMzIuMjIxNyAzMTQuNjE3LDMzMi4yMjE3IEMgMzEzLjEyOCwzMzIuMjIxNyAzMTEuNzc3LDMzMi41MzU3IDMxMC43NzgsMzMzLjA0NjcgQyAzMDkuNzcyLDMzMy41Nzk3IDMwOC40MjksMzMzLjkwMzcgMzA2Ljg5OCwzMzMuOTAzNyBMIDMwNi44NzYsMzMxLjUxMjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTM0NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMzA2Ljg3NiwzMzEuNTEyNyBDIDMwOC40MSwzMzEuNTEyNyAzMDkuNzcyLDMzMS4xODg3IDMxMC43NzgsMzMwLjY1MjcgQyAzMTEuNzc3LDMzMC4xNDE3IDMxMy4xMjgsMzI5LjgyNzcgMzE0LjYxNywzMjkuODI3NyBDIDMxNi4xMTEsMzI5LjgyNzcgMzE3LjUsMzMwLjE0MTcgMzE4LjQ5OCwzMzAuNjU5NyBDIDMxOS40OTYsMzMxLjE4MTcgMzIwLjg4MSwzMzEuNTEyNyAzMjIuMzkzLDMzMS41MTI3IEMgMzIzLjkyLDMzMS41MTI3IDMyNS4yOSwzMzEuMTQ5NyAzMjYuMjk2LDMzMC42MTc3IEMgMzI3LjI4NiwzMzAuMTI2NyAzMjguNjA4LDMyOS44Mjc3IDMzMC4wNjQsMzI5LjgyNzcgQyAzMzEuNTY1LDMyOS44Mjc3IDMzMi44OTQsMzMwLjExOTcgMzMzLjg5NiwzMzAuNjM0NyBDIDMzNC44OTcsMzMxLjE2MzcgMzM2LjI5NCwzMzEuNTEyNyAzMzcuODIsMzMxLjUxMjcgTCAzMzcuODIsMzMzLjkwMzcgQyAzMzYuMjk0LDMzMy45MDM3IDMzNC44OTcsMzMzLjU2MTcgMzMzLjg5NiwzMzMuMDMyNyBDIDMzMi44OTQsMzMyLjUxMDcgMzMxLjU2NSwzMzIuMjIxNyAzMzAuMDY0LDMzMi4yMjE3IEMgMzI4LjYwOCwzMzIuMjIxNyAzMjcuMjg2LDMzMi41MjE3IDMyNi4yOTYsMzMzLjAxMTcgQyAzMjUuMjk0LDMzMy41NDQ3IDMyMy45MiwzMzMuOTAzNyAzMjIuMzkzLDMzMy45MDM3IEMgMzIwLjg4NSwzMzMuOTAzNyAzMTkuNDk5LDMzMy41NzI3IDMxOC40OTgsMzMzLjA1MDcgQyAzMTcuNSwzMzIuNTM1NyAzMTYuMTE1LDMzMi4yMjE3IDMxNC42MTcsMzMyLjIyMTcgQyAzMTMuMTI4LDMzMi4yMjE3IDMxMS43NzcsMzMyLjUzNTcgMzEwLjc3OCwzMzMuMDQ2NyBDIDMwOS43NzIsMzMzLjU3OTcgMzA4LjQyOSwzMzMuOTAzNyAzMDYuODk4LDMzMy45MDM3IEwgMzA2Ljg3NiwzMzEuNTEyNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzQ5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojMDA1YmJmIgotICAgICAgICAgICBkPSJNIDMwNi44NzYsMzMzLjkwMzcgQyAzMDguNDEsMzMzLjkwMzcgMzA5Ljc3MiwzMzMuNTc5NyAzMTAuNzc4LDMzMy4wNDY3IEMgMzExLjc3NywzMzIuNTM1NyAzMTMuMTI4LDMzMi4yMjE3IDMxNC42MTcsMzMyLjIyMTcgQyAzMTYuMTExLDMzMi4yMjE3IDMxNy41LDMzMi41MzU3IDMxOC40OTgsMzMzLjA1MDcgQyAzMTkuNDk2LDMzMy41NzI3IDMyMC44ODEsMzMzLjkwMzcgMzIyLjM5MywzMzMuOTAzNyBDIDMyMy45MiwzMzMuOTAzNyAzMjUuMjksMzMzLjU0NDcgMzI2LjI5NiwzMzMuMDExNyBDIDMyNy4yODYsMzMyLjUyMTcgMzI4LjYwOCwzMzIuMjIxNyAzMzAuMDY0LDMzMi4yMjE3IEMgMzMxLjU2NSwzMzIuMjIxNyAzMzIuODk0LDMzMi41MTA3IDMzMy44OTYsMzMzLjAzMjcgQyAzMzQuODk3LDMzMy41NjE3IDMzNi4yOTQsMzMzLjkwMzcgMzM3LjgyLDMzMy45MDM3IEwgMzM3LjgyLDMzNi4yOTQ3IEMgMzM2LjI5NCwzMzYuMjk0NyAzMzQuODk3LDMzNS45NTI3IDMzMy44OTYsMzM1LjQyMDcgQyAzMzIuODk0LDMzNC45MDU3IDMzMS41NjUsMzM0LjYxNjcgMzMwLjA2NCwzMzQuNjE2NyBDIDMyOC42MDgsMzM0LjYxNjcgMzI3LjI4NiwzMzQuOTE2NyAzMjYuMjk2LDMzNS40MDI3IEMgMzI1LjI5NCwzMzUuOTM4NyAzMjMuOTIsMzM2LjI5NDcgMzIyLjM5MywzMzYuMjk0NyBDIDMyMC44ODUsMzM2LjI5NDcgMzE5LjQ5OSwzMzUuOTY3NyAzMTguNDk4LDMzNS40NDU3IEMgMzE3LjUsMzM0LjkzMDcgMzE2LjExNSwzMzQuNjE2NyAzMTQuNjE3LDMzNC42MTY3IEMgMzEzLjEyOCwzMzQuNjE2NyAzMTEuNzc3LDMzNC45MjY3IDMxMC43NzgsMzM1LjQzODcgQyAzMDkuNzcyLDMzNS45Nzc3IDMwOC40MjksMzM2LjI5NDcgMzA2Ljg5OCwzMzYuMjk0NyBMIDMwNi44NzYsMzMzLjkwMzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTM1MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMzA2Ljg3NiwzMzMuOTAzNyBDIDMwOC40MSwzMzMuOTAzNyAzMDkuNzcyLDMzMy41Nzk3IDMxMC43NzgsMzMzLjA0NjcgQyAzMTEuNzc3LDMzMi41MzU3IDMxMy4xMjgsMzMyLjIyMTcgMzE0LjYxNywzMzIuMjIxNyBDIDMxNi4xMTEsMzMyLjIyMTcgMzE3LjUsMzMyLjUzNTcgMzE4LjQ5OCwzMzMuMDUwNyBDIDMxOS40OTYsMzMzLjU3MjcgMzIwLjg4MSwzMzMuOTAzNyAzMjIuMzkzLDMzMy45MDM3IEMgMzIzLjkyLDMzMy45MDM3IDMyNS4yOSwzMzMuNTQ0NyAzMjYuMjk2LDMzMy4wMTE3IEMgMzI3LjI4NiwzMzIuNTIxNyAzMjguNjA4LDMzMi4yMjE3IDMzMC4wNjQsMzMyLjIyMTcgQyAzMzEuNTY1LDMzMi4yMjE3IDMzMi44OTQsMzMyLjUxMDcgMzMzLjg5NiwzMzMuMDMyNyBDIDMzNC44OTcsMzMzLjU2MTcgMzM2LjI5NCwzMzMuOTAzNyAzMzcuODIsMzMzLjkwMzcgTCAzMzcuODIsMzM2LjI5NDcgQyAzMzYuMjk0LDMzNi4yOTQ3IDMzNC44OTcsMzM1Ljk1MjcgMzMzLjg5NiwzMzUuNDIwNyBDIDMzMi44OTQsMzM0LjkwNTcgMzMxLjU2NSwzMzQuNjE2NyAzMzAuMDY0LDMzNC42MTY3IEMgMzI4LjYwOCwzMzQuNjE2NyAzMjcuMjg2LDMzNC45MTY3IDMyNi4yOTYsMzM1LjQwMjcgQyAzMjUuMjk0LDMzNS45Mzg3IDMyMy45MiwzMzYuMjk0NyAzMjIuMzkzLDMzNi4yOTQ3IEMgMzIwLjg4NSwzMzYuMjk0NyAzMTkuNDk5LDMzNS45Njc3IDMxOC40OTgsMzM1LjQ0NTcgQyAzMTcuNSwzMzQuOTMwNyAzMTYuMTE1LDMzNC42MTY3IDMxNC42MTcsMzM0LjYxNjcgQyAzMTMuMTI4LDMzNC42MTY3IDMxMS43NzcsMzM0LjkyNjcgMzEwLjc3OCwzMzUuNDM4NyBDIDMwOS43NzIsMzM1Ljk3NzcgMzA4LjQyOSwzMzYuMjk0NyAzMDYuODk4LDMzNi4yOTQ3IEwgMzA2Ljg3NiwzMzMuOTAzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzUzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojY2NjY2NjIgotICAgICAgICAgICBkPSJNIDMwNi44OTgsMzM4LjY4OTcgQyAzMDguNDI5LDMzOC42ODk3IDMwOS43NzIsMzM4LjM2NTcgMzEwLjc3OCwzMzcuODI5NyBDIDMxMS43NzcsMzM3LjMyMTcgMzEzLjEyOCwzMzcuMDEwNyAzMTQuNjE3LDMzNy4wMTA3IEMgMzE2LjExMSwzMzcuMDEwNyAzMTcuNSwzMzcuMzIxNyAzMTguNDk4LDMzNy44MzY3IEMgMzE5LjQ5NiwzMzguMzU4NyAzMjAuODgxLDMzOC42ODk3IDMyMi4zOTMsMzM4LjY4OTcgQyAzMjMuOTIsMzM4LjY4OTcgMzI1LjI5LDMzOC4zMjk3IDMyNi4yOTYsMzM3Ljc5MzcgQyAzMjcuMjg2LDMzNy4zMDc3IDMyOC42MDgsMzM3LjAxMDcgMzMwLjA2NCwzMzcuMDEwNyBDIDMzMS41NjUsMzM3LjAxMDcgMzMyLjg5NCwzMzcuMzAwNyAzMzMuODk2LDMzNy44MTQ3IEMgMzM0Ljg5NywzMzguMzQ3NyAzMzYuMjk0LDMzOC42ODk3IDMzNy44MiwzMzguNjg5NyBMIDMzNy44MiwzMzYuMzA5NyBDIDMzNi4yOTQsMzM2LjMwOTcgMzM0Ljg5NywzMzUuOTUyNyAzMzMuODk2LDMzNS40MjA3IEMgMzMyLjg5NCwzMzQuOTA1NyAzMzEuNTY1LDMzNC42MTY3IDMzMC4wNjQsMzM0LjYxNjcgQyAzMjguNjA4LDMzNC42MTY3IDMyNy4yODYsMzM0LjkxNjcgMzI2LjI5NiwzMzUuNDAyNyBDIDMyNS4yOTQsMzM1LjkzODcgMzIzLjkyLDMzNi4yOTQ3IDMyMi4zOTMsMzM2LjI5NDcgQyAzMjAuODg1LDMzNi4yOTQ3IDMxOS40OTksMzM1Ljk2NzcgMzE4LjQ5OCwzMzUuNDQ1NyBDIDMxNy41LDMzNC45MzA3IDMxNi4xMTUsMzM0LjYxNjcgMzE0LjYxNywzMzQuNjE2NyBDIDMxMy4xMjgsMzM0LjYxNjcgMzExLjc3NywzMzQuOTI2NyAzMTAuNzc4LDMzNS40Mzg3IEMgMzA5Ljc3MiwzMzUuOTc3NyAzMDguNDEsMzM2LjI5NDcgMzA2Ljg3NiwzMzYuMjk0NyBMIDMwNi44OTgsMzM4LjY4OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTM1NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMzA2Ljg5OCwzMzguNjg5NyBDIDMwOC40MjksMzM4LjY4OTcgMzA5Ljc3MiwzMzguMzY1NyAzMTAuNzc4LDMzNy44Mjk3IEMgMzExLjc3NywzMzcuMzIxNyAzMTMuMTI4LDMzNy4wMTA3IDMxNC42MTcsMzM3LjAxMDcgQyAzMTYuMTExLDMzNy4wMTA3IDMxNy41LDMzNy4zMjE3IDMxOC40OTgsMzM3LjgzNjcgQyAzMTkuNDk2LDMzOC4zNTg3IDMyMC44ODEsMzM4LjY4OTcgMzIyLjM5MywzMzguNjg5NyBDIDMyMy45MiwzMzguNjg5NyAzMjUuMjksMzM4LjMyOTcgMzI2LjI5NiwzMzcuNzkzNyBDIDMyNy4yODYsMzM3LjMwNzcgMzI4LjYwOCwzMzcuMDEwNyAzMzAuMDY0LDMzNy4wMTA3IEMgMzMxLjU2NSwzMzcuMDEwNyAzMzIuODk0LDMzNy4zMDA3IDMzMy44OTYsMzM3LjgxNDcgQyAzMzQuODk3LDMzOC4zNDc3IDMzNi4yOTQsMzM4LjY4OTcgMzM3LjgyLDMzOC42ODk3IEwgMzM3LjgyLDMzNi4zMDk3IEMgMzM2LjI5NCwzMzYuMzA5NyAzMzQuODk3LDMzNS45NTI3IDMzMy44OTYsMzM1LjQyMDcgQyAzMzIuODk0LDMzNC45MDU3IDMzMS41NjUsMzM0LjYxNjcgMzMwLjA2NCwzMzQuNjE2NyBDIDMyOC42MDgsMzM0LjYxNjcgMzI3LjI4NiwzMzQuOTE2NyAzMjYuMjk2LDMzNS40MDI3IEMgMzI1LjI5NCwzMzUuOTM4NyAzMjMuOTIsMzM2LjI5NDcgMzIyLjM5MywzMzYuMjk0NyBDIDMyMC44ODUsMzM2LjI5NDcgMzE5LjQ5OSwzMzUuOTY3NyAzMTguNDk4LDMzNS40NDU3IEMgMzE3LjUsMzM0LjkzMDcgMzE2LjExNSwzMzQuNjE2NyAzMTQuNjE3LDMzNC42MTY3IEMgMzEzLjEyOCwzMzQuNjE2NyAzMTEuNzc3LDMzNC45MjY3IDMxMC43NzgsMzM1LjQzODcgQyAzMDkuNzcyLDMzNS45Nzc3IDMwOC40MSwzMzYuMjk0NyAzMDYuODc2LDMzNi4yOTQ3IEwgMzA2Ljg5OCwzMzguNjg5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzU3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojMDA1YmJmIgotICAgICAgICAgICBkPSJNIDMwNi44OTgsMzQxLjA4NDcgQyAzMDguNDI5LDM0MS4wODQ3IDMwOS43NzIsMzQwLjc1OTcgMzEwLjc3OCwzNDAuMjI3NyBDIDMxMS43NzcsMzM5LjcxMjcgMzEzLjEyOCwzMzkuMzk4NyAzMTQuNjE3LDMzOS4zOTg3IEMgMzE2LjExMSwzMzkuMzk4NyAzMTcuNSwzMzkuNzE1NyAzMTguNDk4LDM0MC4yMzA3IEMgMzE5LjQ5NiwzNDAuNzUyNyAzMjAuODgxLDM0MS4wODQ3IDMyMi4zOTMsMzQxLjA4NDcgQyAzMjMuOTIsMzQxLjA4NDcgMzI1LjI5LDM0MC43MjA3IDMyNi4yOTYsMzQwLjE4ODcgQyAzMjcuMjg2LDMzOS42OTg3IDMyOC42MDgsMzM5LjM5ODcgMzMwLjA2NCwzMzkuMzk4NyBDIDMzMS41NjUsMzM5LjM5ODcgMzMyLjg5NCwzMzkuNjkxNyAzMzMuODk2LDM0MC4yMDk3IEMgMzM0Ljg5NywzNDAuNzM4NyAzMzYuMjk0LDM0MS4wODQ3IDMzNy44MiwzNDEuMDg0NyBMIDMzNy44MiwzMzguNzEwNyBDIDMzNi4yOTQsMzM4LjcxMDcgMzM0Ljg5NywzMzguMzQ3NyAzMzMuODk2LDMzNy44MTQ3IEMgMzMyLjg5NCwzMzcuMzAwNyAzMzEuNTY1LDMzNy4wMTQ3IDMzMC4wNjQsMzM3LjAxNDcgQyAzMjguNjA4LDMzNy4wMTQ3IDMyNy4yODYsMzM3LjMxMDcgMzI2LjI5NiwzMzcuNzk3NyBDIDMyNS4yOTQsMzM4LjMyOTcgMzIzLjkyLDMzOC42ODk3IDMyMi4zOTMsMzM4LjY4OTcgQyAzMjAuODg1LDMzOC42ODk3IDMxOS40OTksMzM4LjM1ODcgMzE4LjQ5OCwzMzcuODM2NyBDIDMxNy41LDMzNy4zMjE3IDMxNi4xMTUsMzM3LjAxNDcgMzE0LjYxNywzMzcuMDE0NyBDIDMxMy4xMjgsMzM3LjAxNDcgMzExLjc3NywzMzcuMzIxNyAzMTAuNzc4LDMzNy44MzI3IEMgMzA5Ljc3MiwzMzguMzY1NyAzMDguNDE0LDMzOC42ODk3IDMwNi44ODMsMzM4LjY4OTcgTCAzMDYuODk4LDM0MS4wODQ3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzNTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDMwNi44OTgsMzQxLjA4NDcgQyAzMDguNDI5LDM0MS4wODQ3IDMwOS43NzIsMzQwLjc1OTcgMzEwLjc3OCwzNDAuMjI3NyBDIDMxMS43NzcsMzM5LjcxMjcgMzEzLjEyOCwzMzkuMzk4NyAzMTQuNjE3LDMzOS4zOTg3IEMgMzE2LjExMSwzMzkuMzk4NyAzMTcuNSwzMzkuNzE1NyAzMTguNDk4LDM0MC4yMzA3IEMgMzE5LjQ5NiwzNDAuNzUyNyAzMjAuODgxLDM0MS4wODQ3IDMyMi4zOTMsMzQxLjA4NDcgQyAzMjMuOTIsMzQxLjA4NDcgMzI1LjI5LDM0MC43MjA3IDMyNi4yOTYsMzQwLjE4ODcgQyAzMjcuMjg2LDMzOS42OTg3IDMyOC42MDgsMzM5LjM5ODcgMzMwLjA2NCwzMzkuMzk4NyBDIDMzMS41NjUsMzM5LjM5ODcgMzMyLjg5NCwzMzkuNjkxNyAzMzMuODk2LDM0MC4yMDk3IEMgMzM0Ljg5NywzNDAuNzM4NyAzMzYuMjk0LDM0MS4wODQ3IDMzNy44MiwzNDEuMDg0NyBMIDMzNy44MiwzMzguNzEwNyBDIDMzNi4yOTQsMzM4LjcxMDcgMzM0Ljg5NywzMzguMzQ3NyAzMzMuODk2LDMzNy44MTQ3IEMgMzMyLjg5NCwzMzcuMzAwNyAzMzEuNTY1LDMzNy4wMTQ3IDMzMC4wNjQsMzM3LjAxNDcgQyAzMjguNjA4LDMzNy4wMTQ3IDMyNy4yODYsMzM3LjMxMDcgMzI2LjI5NiwzMzcuNzk3NyBDIDMyNS4yOTQsMzM4LjMyOTcgMzIzLjkyLDMzOC42ODk3IDMyMi4zOTMsMzM4LjY4OTcgQyAzMjAuODg1LDMzOC42ODk3IDMxOS40OTksMzM4LjM1ODcgMzE4LjQ5OCwzMzcuODM2NyBDIDMxNy41LDMzNy4zMjE3IDMxNi4xMTUsMzM3LjAxNDcgMzE0LjYxNywzMzcuMDE0NyBDIDMxMy4xMjgsMzM3LjAxNDcgMzExLjc3NywzMzcuMzIxNyAzMTAuNzc4LDMzNy44MzI3IEMgMzA5Ljc3MiwzMzguMzY1NyAzMDguNDE0LDMzOC42ODk3IDMwNi44ODMsMzM4LjY4OTcgTCAzMDYuODk4LDM0MS4wODQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzNjEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzMxLjA3LDMxOS4yODk3IEMgMzMxLjAxOCwzMTkuNDkwNyAzMzAuOTQ3LDMxOS42ODg3IDMzMC45NDcsMzE5LjkwMzcgQyAzMzAuOTQ3LDMyMS4zNTY3IDMzMi4yMDEsMzIyLjUxMjcgMzMzLjczMiwzMjIuNTEyNyBMIDMxMC45NTYsMzIyLjUxMjcgQyAzMTIuNDg3LDMyMi41MTI3IDMxMy43MzksMzIxLjM1NjcgMzEzLjczOSwzMTkuOTAzNyBDIDMxMy43MzksMzE5LjY5MTcgMzEzLjY5OCwzMTkuNDkwNyAzMTMuNjUzLDMxOS4yODk3IEMgMzEzLjc3NiwzMTkuMzM1NyAzMTMuOTMzLDMxOS4zNDI3IDMxNC4wODUsMzE5LjM0MjcgTCAzMzAuNjYsMzE5LjM0MjcgQyAzMzAuNzk0LDMxOS4zNDI3IDMzMC45NSwzMTkuMzI4NyAzMzEuMDY2LDMxOS4yODk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzNjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAzMzEuMDcsMzE5LjI4OTcgQyAzMzEuMDE4LDMxOS40OTA3IDMzMC45NDcsMzE5LjY4ODcgMzMwLjk0NywzMTkuOTAzNyBDIDMzMC45NDcsMzIxLjM1NjcgMzMyLjIwMSwzMjIuNTEyNyAzMzMuNzMyLDMyMi41MTI3IEwgMzEwLjk1NiwzMjIuNTEyNyBDIDMxMi40ODcsMzIyLjUxMjcgMzEzLjczOSwzMjEuMzU2NyAzMTMuNzM5LDMxOS45MDM3IEMgMzEzLjczOSwzMTkuNjkxNyAzMTMuNjk4LDMxOS40OTA3IDMxMy42NTMsMzE5LjI4OTcgQyAzMTMuNzc2LDMxOS4zMzU3IDMxMy45MzMsMzE5LjM0MjcgMzE0LjA4NSwzMTkuMzQyNyBMIDMzMC42NiwzMTkuMzQyNyBDIDMzMC43OTQsMzE5LjM0MjcgMzMwLjk1LDMxOS4zMjg3IDMzMS4wNjYsMzE5LjI4OTcgTCAzMzEuMDcsMzE5LjI4OTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTM2NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMTQuMDg5LDMxNy43ODM3IEwgMzMwLjY2NCwzMTcuNzgzNyBDIDMzMS4yMjIsMzE3Ljc4MzcgMzMxLjY3NywzMTguMTM2NyAzMzEuNjc3LDMxOC41NjM3IEMgMzMxLjY3NywzMTguOTkzNyAzMzEuMjIyLDMxOS4zNDI3IDMzMC42NjQsMzE5LjM0MjcgTCAzMTQuMDg5LDMxOS4zNDI3IEMgMzEzLjUyNywzMTkuMzQyNyAzMTMuMDcyLDMxOC45OTM3IDMxMy4wNzIsMzE4LjU2MzcgQyAzMTMuMDcyLDMxOC4xMzY3IDMxMy41MjcsMzE3Ljc4MzcgMzE0LjA4OSwzMTcuNzgzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzY3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAzMTQuMDg5LDMxNy43ODM3IEwgMzMwLjY2NCwzMTcuNzgzNyBDIDMzMS4yMjIsMzE3Ljc4MzcgMzMxLjY3NywzMTguMTM2NyAzMzEuNjc3LDMxOC41NjM3IEMgMzMxLjY3NywzMTguOTkzNyAzMzEuMjIyLDMxOS4zNDI3IDMzMC42NjQsMzE5LjM0MjcgTCAzMTQuMDg5LDMxOS4zNDI3IEMgMzEzLjUyNywzMTkuMzQyNyAzMTMuMDcyLDMxOC45OTM3IDMxMy4wNzIsMzE4LjU2MzcgQyAzMTMuMDcyLDMxOC4xMzY3IDMxMy41MjcsMzE3Ljc4MzcgMzE0LjA4OSwzMTcuNzgzNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzY5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMxMC45ODMsMzI4LjMwNzcgTCAzMzMuNzAzLDMyOC4zMDc3IEwgMzMzLjcwMywzMjIuNTEyNyBMIDMxMC45ODMsMzIyLjUxMjcgTCAzMTAuOTgzLDMyOC4zMDc3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzNzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3O3N0cm9rZS1saW5lam9pbjptaXRlciIKLSAgICAgICAgICAgZD0iTSAzMTAuOTgzLDMyOC4zMDc3IEwgMzMzLjcwMywzMjguMzA3NyBMIDMzMy43MDMsMzIyLjUxMjcgTCAzMTAuOTgzLDMyMi41MTI3IEwgMzEwLjk4MywzMjguMzA3NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzczIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDMzNS40NzgsMjk3LjI3NjcgQyAzMzcuNzI4LDI5OC41NzQ3IDMzOS4yNTUsMjk5LjkwMzcgMzM5LjAwOSwzMDAuNTY2NyBDIDMzOC44ODUsMzAxLjE3NjcgMzM4LjE3MSwzMDEuNjMxNyAzMzcuMTUxLDMwMi4zMDg3IEMgMzM1LjU0NiwzMDMuNDI2NyAzMzQuNTY2LDMwNS40MjI3IDMzNS4zMywzMDYuMzQzNyBDIDMzNC4wMDQsMzA1LjI3MTcgMzMzLjE2NiwzMDMuNjcwNyAzMzMuMTY2LDMwMS44ODk3IEMgMzMzLjE2NiwzMDAuMDI3NyAzMzQuMDQ5LDI5OC4zNDg3IDMzNS40NzgsMjk3LjI3NjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTM3NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMzM1LjQ3OCwyOTcuMjc2NyBDIDMzNy43MjgsMjk4LjU3NDcgMzM5LjI1NSwyOTkuOTAzNyAzMzkuMDA5LDMwMC41NjY3IEMgMzM4Ljg4NSwzMDEuMTc2NyAzMzguMTcxLDMwMS42MzE3IDMzNy4xNTEsMzAyLjMwODcgQyAzMzUuNTQ2LDMwMy40MjY3IDMzNC41NjYsMzA1LjQyMjcgMzM1LjMzLDMwNi4zNDM3IEMgMzM0LjAwNCwzMDUuMjcxNyAzMzMuMTY2LDMwMy42NzA3IDMzMy4xNjYsMzAxLjg4OTcgQyAzMzMuMTY2LDMwMC4wMjc3IDMzNC4wNDksMjk4LjM0ODcgMzM1LjQ3OCwyOTcuMjc2NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Mzc3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojY2NjY2NjIgotICAgICAgICAgICBkPSJNIDMxNC4zMDUsMzE2Ljg0NTcgTCAzMzAuNDQ4LDMxNi44NDU3IEwgMzMwLjQ0OCwyMzcuNzU0NyBMIDMxNC4zMDUsMjM3Ljc1NDcgTCAzMTQuMzA1LDMxNi44NDU3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzNzkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDMyNi4wMTUsMjM3LjcyNTcgTCAzMjYuMDE1LDMxNi42NDc3IE0gMzI3LjgzLDIzNy43MjU3IEwgMzI3LjgzLDMxNi42NDc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzODEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDMxNC4zMDUsMzE2Ljg0NTcgTCAzMzAuNDQ4LDMxNi44NDU3IEwgMzMwLjQ0OCwyMzcuNzU0NyBMIDMxNC4zMDUsMjM3Ljc1NDcgTCAzMTQuMzA1LDMxNi44NDU3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzODMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjk3LjgxNiwyNjcuMzM4NyBDIDMwMS4zNDEsMjY1Ljg4MjcgMzA3LjMzLDI2NC44MDM3IDMxNC4yMDEsMjY0LjU3NzcgQyAzMTYuNTY4LDI2NC41OTU3IDMxOS4yMDgsMjY0LjgxNzcgMzIxLjkzNSwyNjUuMjcyNyBDIDMzMS41ODcsMjY2Ljg4MzcgMzM4Ljk0MiwyNzAuNzM4NyAzMzguMzU3LDI3My44Nzc3IEMgMzM4LjM0NSwyNzMuOTQ0NyAzMzguMzI4LDI3NC4wODE3IDMzOC4zMDksMjc0LjE0MTcgQyAzMzguMzA5LDI3NC4xNDE3IDM0MS45MzEsMjY1Ljk4NDcgMzQxLjk4NCwyNjUuNjc0NyBDIDM0Mi42MzIsMjYyLjE5MDcgMzM0LjQ3NiwyNTcuOTA4NyAzMjMuNzYsMjU2LjEyMDcgQyAzMjAuMzk3LDI1NS41NTk3IDMxNy4xMTMsMjU1LjM0MTcgMzE0LjI2OCwyNTUuMzY5NyBDIDMwNy40MDksMjU1LjM2OTcgMzAxLjQ1LDI1Ni4yNDc3IDI5Ny44NjEsMjU3LjU4MDcgTCAyOTcuODE2LDI2Ny4zMzg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzODUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAyOTcuODE2LDI2Ny4zMzg3IEMgMzAxLjM0MSwyNjUuODgyNyAzMDcuMzMsMjY0LjgwMzcgMzE0LjIwMSwyNjQuNTc3NyBDIDMxNi41NjgsMjY0LjU5NTcgMzE5LjIwOCwyNjQuODE3NyAzMjEuOTM1LDI2NS4yNzI3IEMgMzMxLjU4NywyNjYuODgzNyAzMzguOTQyLDI3MC43Mzg3IDMzOC4zNTcsMjczLjg3NzcgQyAzMzguMzQ1LDI3My45NDQ3IDMzOC4zMjgsMjc0LjA4MTcgMzM4LjMwOSwyNzQuMTQxNyBDIDMzOC4zMDksMjc0LjE0MTcgMzQxLjkzMSwyNjUuOTg0NyAzNDEuOTg0LDI2NS42NzQ3IEMgMzQyLjYzMiwyNjIuMTkwNyAzMzQuNDc2LDI1Ny45MDg3IDMyMy43NiwyNTYuMTIwNyBDIDMyMC4zOTcsMjU1LjU1OTcgMzE3LjExMywyNTUuMzQxNyAzMTQuMjY4LDI1NS4zNjk3IEMgMzA3LjQwOSwyNTUuMzY5NyAzMDEuNDUsMjU2LjI0NzcgMjk3Ljg2MSwyNTcuNTgwNyBMIDI5Ny44MTYsMjY3LjMzODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTM4NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAzMzAuNDc3LDI3Ny4yNjY3IEMgMzM0Ljk1NCwyNzYuOTQ1NyAzMzguMDExLDI3NS43NDk3IDMzOC4zNTcsMjczLjg3NzcgQyAzMzguNjM3LDI3Mi4zODU3IDMzNy4xMjEsMjcwLjczNTcgMzM0LjQyMSwyNjkuMjM2NyBDIDMzMy4yMTEsMjY5LjM2NjcgMzMxLjg1MSwyNjkuNTMyNyAzMzAuNDQ4LDI2OS41MzI3IEwgMzMwLjQ3NywyNzcuMjY2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Mzg5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAzMzAuNDc3LDI3Ny4yNjY3IEMgMzM0Ljk1NCwyNzYuOTQ1NyAzMzguMDExLDI3NS43NDk3IDMzOC4zNTcsMjczLjg3NzcgQyAzMzguNjM3LDI3Mi4zODU3IDMzNy4xMjEsMjcwLjczNTcgMzM0LjQyMSwyNjkuMjM2NyBDIDMzMy4yMTEsMjY5LjM2NjcgMzMxLjg1MSwyNjkuNTMyNyAzMzAuNDQ4LDI2OS41MzI3IEwgMzMwLjQ3NywyNzcuMjY2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1MzkxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDMxNC4yNzksMjcxLjIyMTcgQyAzMTEuNDc5LDI3MS42NDQ3IDMwOS4zODEsMjcyLjMzOTcgMzA4LjMzMSwyNzMuMTkzNyBMIDMwOC4yMzksMjczLjM2NTcgQyAzMDcuNzM2LDI3NC4zODg3IDMxMC4xOTcsMjc2LjU2NDcgMzE0LjMwMSwyNzguOTk0NyBMIDMxNC4yNzksMjcxLjIyMTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTM5MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMzE0LjI3OSwyNzEuMjIxNyBDIDMxMS40NzksMjcxLjY0NDcgMzA5LjM4MSwyNzIuMzM5NyAzMDguMzMxLDI3My4xOTM3IEwgMzA4LjIzOSwyNzMuMzY1NyBDIDMwNy43MzYsMjc0LjM4ODcgMzEwLjE5NywyNzYuNTY0NyAzMTQuMzAxLDI3OC45OTQ3IEwgMzE0LjI3OSwyNzEuMjIxNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Mzk1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDM0MC41MDIsMjkyLjUyMjcgQyAzNDAuOTI2LDI5MS4yNDU3IDMzNi41NjEsMjg4LjY4OTcgMzMwLjM5MiwyODYuNDI1NyBDIDMyNy41NzMsMjg1LjQxNjcgMzI1LjI0NSwyODQuMzY1NyAzMjIuMzYsMjgzLjA5MjcgQyAzMTMuNzkxLDI3OS4zMDQ3IDMwNy40NiwyNzQuOTU2NyAzMDguMjQyLDI3My4zNjk3IEwgMzA4LjMyNSwyNzMuMjA3NyBDIDMwNy44NzQsMjczLjU3NzcgMzA3LjE2NywyODEuMzg4NyAzMDcuMTY3LDI4MS4zODg3IEMgMzA2LjM4NSwyODIuODQxNyAzMTIuMTc5LDI4Ny4xMjY3IDMyMC4wNjEsMjkwLjkwNzcgQyAzMjIuNTg3LDI5Mi4xMTM3IDMyNy45MjIsMjk0LjA4NDcgMzMwLjQ0LDI5NC45NjY3IEMgMzM0Ljk0MiwyOTYuNTI4NyAzMzkuNDE1LDI5OS40NzM3IDMzOS4wMDksMzAwLjU2NjcgTCAzNDAuNTAyLDI5Mi41MjY3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDUzOTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAzNDAuNTAyLDI5Mi41MjI3IEMgMzQwLjkyNiwyOTEuMjQ1NyAzMzYuNTYxLDI4OC42ODk3IDMzMC4zOTIsMjg2LjQyNTcgQyAzMjcuNTczLDI4NS40MTY3IDMyNS4yNDUsMjg0LjM2NTcgMzIyLjM2LDI4My4wOTI3IEMgMzEzLjc5MSwyNzkuMzA0NyAzMDcuNDYsMjc0Ljk1NjcgMzA4LjI0MiwyNzMuMzY5NyBMIDMwOC4zMjUsMjczLjIwNzcgQyAzMDcuODc0LDI3My41Nzc3IDMwNy4xNjcsMjgxLjM4ODcgMzA3LjE2NywyODEuMzg4NyBDIDMwNi4zODUsMjgyLjg0MTcgMzEyLjE3OSwyODcuMTI2NyAzMjAuMDYxLDI5MC45MDc3IEMgMzIyLjU4NywyOTIuMTEzNyAzMjcuOTIyLDI5NC4wODQ3IDMzMC40NCwyOTQuOTY2NyBDIDMzNC45NDIsMjk2LjUyODcgMzM5LjQxNSwyOTkuNDczNyAzMzkuMDA5LDMwMC41NjY3IEwgMzQwLjUwMiwyOTIuNTI2NyBMIDM0MC41MDIsMjkyLjUyMjcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTM5OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMDcuODc3LDI2My44NzI3IEMgMzA4LjQ4OCwyNjEuNTU1NyAzMDkuMjc3LDI1OS4zMTU3IDMxMC4wNTIsMjU3LjA0ODcgQyAzMDkuODgxLDI1Ny4wOTQ3IDMwOS42OTUsMjU3LjEyOTcgMzA5LjUyMywyNTcuMTU3NyBDIDMwOS4zNDksMjU3LjE4MjcgMzA5LjE2MiwyNTcuMTk5NyAzMDguOTg0LDI1Ny4yMDY3IEMgMzA4LjYxNSwyNTguODM2NyAzMDguMTE2LDI2MC40NzI3IDMwNy41OCwyNjIuMTA4NyBDIDMwNi42MjYsMjYwLjY3NzcgMzA1LjU4NywyNTkuMjg3NyAzMDQuNzYxLDI1Ny44NDE3IEMgMzA0LjQzLDI1Ny45MDg3IDMwNC4wODYsMjU3Ljk4OTcgMzAzLjc0OCwyNTguMDM5NyBDIDMwMy40MTYsMjU4LjA4ODcgMzAzLjA2MiwyNTguMTEzNyAzMDIuNzIsMjU4LjE0NTcgQyAzMDQuMTYxLDI2MC4wNzc3IDMwNS41NTQsMjYyLjAxMDcgMzA2Ljg5MSwyNjQuMDE2NyBDIDMwNy4wNTEsMjYzLjk3NDcgMzA3LjIwNiwyNjMuOTIxNyAzMDcuMzgzLDI2My44OTY3IEMgMzA3LjU0MywyNjMuODc1NyAzMDcuNzEsMjYzLjg3OTcgMzA3Ljg3NywyNjMuODcyNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDAxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMxNC4wMTUsMjU3LjA5NDcgQyAzMTMuNzIsMjU3LjEwODcgMzEzLjQyNiwyNTcuMTI5NyAzMTMuMTMxLDI1Ny4xMjU3IEMgMzEyLjgzOCwyNTcuMTIyNyAzMTIuNTQ0LDI1Ny4wODc3IDMxMi4yNTMsMjU3LjA2NTcgTCAzMTIuMTM0LDI2My40MzQ3IEwgMzE2LjU4OCwyNjMuNTA5NyBDIDMxNi41NjUsMjYzLjM3ODcgMzE2LjUzMiwyNjMuMjM3NyAzMTYuNTM2LDI2My4xMDM3IEMgMzE2LjUzNiwyNjIuOTcyNyAzMTYuNTc3LDI2Mi44MzU3IDMxNi41OTgsMjYyLjcwNDcgQyAzMTUuODAxLDI2Mi43NTc3IDMxNC45MzEsMjYyLjgwNzcgMzEzLjkxLDI2Mi43ODk3IEwgMzE0LjAxNSwyNTcuMDk0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDAzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDMyMS4wMDcsMjU4LjE0MTcgQyAzMjEuNzE5LDI1OC4yMDE3IDMyMi40MDQsMjU4LjMyNDcgMzIzLjA5LDI1OC40NDg3IEMgMzIzLjA3NywyNTguMzE0NyAzMjMuMDU2LDI1OC4xODA3IDMyMy4wNjcsMjU4LjA0MjcgQyAzMjMuMDc3LDI1Ny45MTI3IDMyMy4xMjcsMjU3Ljc4MTcgMzIzLjE2NCwyNTcuNjU0NyBMIDMxNy4xMzUsMjU3LjE1NDcgQyAzMTcuMTUsMjU3LjI4ODcgMzE3LjE3MiwyNTcuNDE4NyAzMTcuMTU4LDI1Ny41NDk3IEMgMzE3LjE0NiwyNTcuNjkwNyAzMTcuMDk4LDI1Ny44MTc3IDMxNy4wNjMsMjU3Ljk0NzcgQyAzMTcuNjc4LDI1Ny45MzM3IDMxOC40MiwyNTcuOTI2NyAzMTkuMjUsMjU3Ljk5NjcgTCAzMTguNzI1LDI2My43Mjc3IEMgMzE5LjAxOSwyNjMuNzM0NyAzMTkuMzEzLDI2My43MzE3IDMxOS42MDQsMjYzLjc1NTcgQyAzMTkuODk3LDI2My43Nzc3IDMyMC4xODksMjYzLjgyOTcgMzIwLjQ3OSwyNjMuODcyNyBMIDMyMS4wMDQsMjU4LjE0MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQwNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAzMjMuNDczLDI2NC40MTg3IEMgMzIzLjc2NCwyNjQuNDY0NyAzMjQuMDU3LDI2NC40OTk3IDMyNC4zNDUsMjY0LjU2MzcgQyAzMjQuNjMxLDI2NC42MjM3IDMyNC45MTEsMjY0LjcxNTcgMzI1LjE5LDI2NC43OTY3IEwgMzI1LjkwNSwyNjEuODY5NyBMIDMyNS45ODMsMjYxLjg4NjcgQyAzMjYuMTUsMjYyLjI4ODcgMzI2LjM2NywyNjIuNzc4NyAzMjYuNDc4LDI2My4wNjE3IEwgMzI3LjM3MiwyNjUuMjcyNyBDIDMyNy43MjIsMjY1LjMyODcgMzI4LjA3MSwyNjUuMzc0NyAzMjguNDE1LDI2NS40NDg3IEMgMzI4Ljc2OCwyNjUuNTI2NyAzMjkuMTA2LDI2NS42Mjg3IDMyOS40NDYsMjY1LjcyMzcgTCAzMjkuMTM2LDI2NS4wNjA3IEMgMzI4LjY1NSwyNjQuMDYyNyAzMjguMTUsMjYzLjA2ODcgMzI3LjczMywyNjIuMDU2NyBDIDMyOC44NDMsMjYyLjEwNTcgMzI5LjcwMywyNjEuNzAzNyAzMjkuOTE5LDI2MC44MTE3IEMgMzMwLjA3MiwyNjAuMTkwNyAzMjkuODI1LDI1OS43MDM3IDMyOS4yNCwyNTkuMjg3NyBDIDMyOC44MDksMjU4Ljk4MDcgMzI3Ljk3MiwyNTguODE4NyAzMjcuNDMyLDI1OC42OTg3IEwgMzI1LDI1OC4xNjY3IEwgMzIzLjQ3MywyNjQuNDE4NyBNIDMyNi41OTMsMjU5LjAzMzcgQyAzMjcuMjk0LDI1OS4xODg3IDMyOC4xNjksMjU5LjMwMTcgMzI4LjE2OSwyNjAuMDk4NyBDIDMyOC4xNjUsMjYwLjI5OTcgMzI4LjE0NiwyNjAuNDQwNyAzMjguMTEzLDI2MC41Njc3IEMgMzI3Ljg4NiwyNjEuNTAyNyAzMjcuMTc4LDI2MS44MjY3IDMyNS45OTgsMjYxLjQ3NDcgTCAzMjYuNTkzLDI1OS4wMzM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0MDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMzM0Ljk1NiwyNjYuMzI2NyBDIDMzNC45MDIsMjY3LjAxNzcgMzM0Ljc3OSwyNjcuNjg4NyAzMzQuNjQ1LDI2OC40MTQ3IEMgMzM0Ljk1LDI2OC41NTk3IDMzNS4yNTIsMjY4LjY4OTcgMzM1LjU0NiwyNjguODUxNyBDIDMzNS44NCwyNjkuMDE0NyAzMzYuMTExLDI2OS4xOTM3IDMzNi4zOTUsMjY5LjM3MDcgTCAzMzYuOTkxLDI2Mi4xOTA3IEMgMzM2Ljg0OSwyNjIuMTMzNyAzMzYuNzIyLDI2Mi4wNzM3IDMzNi41ODksMjYyLjAwMzcgQyAzMzYuNDU0LDI2MS45Mjk3IDMzNi4zMzksMjYxLjg1NTcgMzM2LjIxNSwyNjEuNzY2NyBMIDMyOS44ODUsMjY1Ljc4NzcgQyAzMzAuMDUyLDI2NS44Njg3IDMzMC4yMjUsMjY1Ljk0MjcgMzMwLjM4OCwyNjYuMDMwNyBDIDMzMC41NTIsMjY2LjEyMjcgMzMwLjY5LDI2Ni4yMjA3IDMzMC44NTQsMjY2LjMxMjcgQyAzMzEuMzg1LDI2NS44NjQ3IDMzMS45NDUsMjY1LjUwMTcgMzMyLjU4NSwyNjUuMDI1NyBMIDMzNC45NTQsMjY2LjMyMzcgTCAzMzQuOTU2LDI2Ni4zMjY3IHogTSAzMzMuMTYyLDI2NC42ODY3IEwgMzM1LjI3LDI2My4zMjI3IEwgMzM1LjAyNCwyNjUuNzAyNyBMIDMzMy4xNjIsMjY0LjY4NjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQwOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4wNTA3MzQ1IgotICAgICAgICAgICBkPSJNIDIyMy4zNTQsMTk5Ljc3OTcgQyAyMjMuMzU0LDE5OC42NTA3IDIyNC4zMTksMTk3LjczNzcgMjI1LjUwNywxOTcuNzM3NyBDIDIyNi42OSwxOTcuNzM3NyAyMjcuNjU5LDE5OC42NTA3IDIyNy42NTksMTk5Ljc3OTcgQyAyMjcuNjU5LDIwMC45MDQ3IDIyNi42OTQsMjAxLjgxNzcgMjI1LjUwNywyMDEuODE3NyBDIDIyNC4zMTksMjAxLjgxNzcgMjIzLjM1NCwyMDAuOTA0NyAyMjMuMzU0LDE5OS43Nzk3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0MTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI0Ny42MzcsMTgyLjE3NDcgQyAyNTQuMjM2LDE4Mi4xNzQ3IDI2MC4xMDgsMTgzLjE1MTcgMjYzLjkzMywxODQuNjY3NyBDIDI2Ni4xMjIsMTg1LjY1NTcgMjY5LjA2MSwxODYuMzg1NyAyNzIuMjc4LDE4Ni44MTU3IEMgMjc0LjcyOCwxODcuMTQzNyAyNzcuMDU2LDE4Ny4yMTA3IDI3OS4wODEsMTg3LjA1NTcgQyAyODEuNzg5LDE4Ny4wMDI3IDI4NS43MDYsMTg3Ljc5NTcgMjg5LjYyNCwxODkuNTIwNyBDIDI5Mi44NjcsMTkwLjk1OTcgMjk1LjU3NCwxOTIuNzA4NyAyOTcuMzcyLDE5NC40MDE3IEwgMjk1LjgxNiwxOTUuNzg3NyBMIDI5NS4zNjYsMTk5LjcyMjcgTCAyOTEuMDk3LDIwNC42MTA3IEwgMjg4Ljk2NCwyMDYuNDIwNyBMIDI4My45MTEsMjEwLjQ2NTcgTCAyODEuMzMsMjEwLjY3NjcgTCAyODAuNTQ1LDIxMi45MDk3IEwgMjQ3Ljg1MywyMDkuMDc5NyBMIDIxNS4wNjEsMjEyLjkwOTcgTCAyMTQuMjc1LDIxMC42NzY3IEwgMjExLjY5LDIxMC40NjU3IEwgMjA2LjYzOCwyMDYuNDIwNyBMIDIwNC41MDQsMjA0LjYxMDcgTCAyMDAuMjM3LDE5OS43MjI3IEwgMTk5Ljc5MywxOTUuNzg3NyBMIDE5OC4yMjksMTk0LjQwMTcgQyAyMDAuMDM1LDE5Mi43MDg3IDIwMi43NDMsMTkwLjk1OTcgMjA1Ljk3OCwxODkuNTIwNyBDIDIwOS44OTYsMTg3Ljc5NTcgMjEzLjgxNCwxODcuMDAyNyAyMTYuNTIsMTg3LjA1NTcgQyAyMTguNTQ1LDE4Ny4yMTA3IDIyMC44NzQsMTg3LjE0MzcgMjIzLjMyNCwxODYuODE1NyBDIDIyNi41NDIsMTg2LjM4NTcgMjI5LjQ4NCwxODUuNjU1NyAyMzEuNjY5LDE4NC42Njc3IEMgMjM1LjQ5OCwxODMuMTUxNyAyNDEuMDQyLDE4Mi4xNzQ3IDI0Ny42MzcsMTgyLjE3NDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQxMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0OC4xMzksMjI1LjMzMzcgQyAyMzUuOTU5LDIyNS4zMTU3IDIyNS4wNDgsMjIzLjg3MzcgMjE3LjI2MiwyMjEuNTI4NyBDIDIxNi42OTIsMjIxLjM1NTcgMjE2LjM5NCwyMjAuODMzNyAyMTYuNDI3LDIyMC4yOTM3IEMgMjE2LjQxNywyMTkuNzY4NyAyMTYuNzExLDIxOS4yOTI3IDIxNy4yNjIsMjE5LjEyNjcgQyAyMjUuMDQ4LDIxNi43ODQ3IDIzNS45NTksMjE1LjM0MjcgMjQ4LjEzOSwyMTUuMzI0NyBDIDI2MC4zMTcsMjE1LjM0MjcgMjcxLjIyLDIxNi43ODQ3IDI3OS4wMDcsMjE5LjEyNjcgQyAyNzkuNTU4LDIxOS4yOTI3IDI3OS44NDcsMjE5Ljc2ODcgMjc5LjgzNywyMjAuMjkzNyBDIDI3OS44NjcsMjIwLjgzMzcgMjc5LjU3MywyMjEuMzU1NyAyNzkuMDA3LDIyMS41Mjg3IEMgMjcxLjIyLDIyMy44NzM3IDI2MC4zMTcsMjI1LjMxNTcgMjQ4LjEzOSwyMjUuMzMzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDE1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0OC4xMDksMjIzLjczNTcgQyAyMzcuMTE3LDIyMy43MjE3IDIyNy4xODIsMjIyLjQ1MjcgMjE5LjYxOSwyMjAuNDk4NyBDIDIyNy4xODIsMjE4LjU0MTcgMjM3LjExNywyMTcuMzQ1NyAyNDguMTA5LDIxNy4zMjQ3IEMgMjU5LjA5OSwyMTcuMzQ1NyAyNjkuMDg3LDIxOC41NDE3IDI3Ni42NSwyMjAuNDk4NyBDIDI2OS4wODcsMjIyLjQ1MjcgMjU5LjA5OSwyMjMuNzIxNyAyNDguMTA5LDIyMy43MzU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0MTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDkzMDEyNTEiCi0gICAgICAgICAgIGQ9Ik0gMjQ4LjkyNDg1LDIyMy44MDIxNyBMIDI0OC45MjQ4NSwyMTcuMjc5NjYiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQxOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4xMzY5MzU0MyIKLSAgICAgICAgICAgZD0iTSAyNDcuMTUzMjMsMjIzLjgwMjE3IEwgMjQ3LjE1MzIzLDIxNy4yNzk2NiIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDIxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjE4MzQ0MjA3IgotICAgICAgICAgICBkPSJNIDI0NS40ODA4NSwyMjMuODAyMTcgTCAyNDUuNDgwODUsMjE3LjI3OTY2IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0MjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjI5OTQ4NyIKLSAgICAgICAgICAgZD0iTSAyNDMuODIyOTUsMjIzLjgwMjE3IEwgMjQzLjgyMjk1LDIxNy4yNzk2NiIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDI1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI3NjQ1NDU3IgotICAgICAgICAgICBkPSJNIDI0Mi4zNDU2OCwyMjMuODAyMTcgTCAyNDIuMzQ1NjgsMjE3LjI3OTY2IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0MjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzIyOTYxMjEiCi0gICAgICAgICAgIGQ9Ik0gMjM5LjUyODI3LDIyMy40NTA1IEwgMjM5LjQ4OTI0LDIxNy41MTM5NCBNIDI0MC44NjM5NSwyMjMuNTI4NiBMIDI0MC44NjM5NSwyMTcuMzE4OTYiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQyOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zNjY4ODQxNCIKLSAgICAgICAgICAgZD0iTSAyMzYuOTI3MTUsMjIzLjE4MzU2IEwgMjM2LjkyNzE1LDIxNy43MTQwMiBNIDIzOC4yNDQ5OSwyMjMuMzM5NzQgTCAyMzguMjA1OTcsMjE3LjUxOTA0IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0MzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNDEzMzkwNzYiCi0gICAgICAgICAgIGQ9Ik0gMjMzLjQzNzQ0LDIyMi44NzExOSBMIDIzMy40Mzc0NCwyMTguMDY1NjkgTSAyMzQuNTgyNDYsMjIyLjk0OTI4IEwgMjM0LjU4MjQ2LDIxNy45MDk1IE0gMjM1Ljc2MjA1LDIyMy4xMDU0NyBMIDIzNS43NjIwNSwyMTcuODcwMiIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDMzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjQ1OTg5NzQiCi0gICAgICAgICAgIGQ9Ik0gMjMyLjIxNDM2LDIyMi44MzE4OSBMIDIzMi4yMTQzNiwyMTguMTgzMDgiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQzNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MDY0MDMyNyIKLSAgICAgICAgICAgZD0iTSAyMzEuMDczOCwyMjIuNTk3NjEgTCAyMzEuMDczOCwyMTguMjYxMTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQzNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41NTI5MDk5MSIKLSAgICAgICAgICAgZD0iTSAyMjkuODUwNzMsMjIyLjQ4MDIxIEwgMjI5Ljg1MDczLDIxOC40NTYxNSIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDM5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjU5NjgzMjg3IgotICAgICAgICAgICBkPSJNIDIyNy4zNDY2MSwyMjIuMTI5MDUgTCAyMjcuMzA3NTgsMjE4LjkyNTIyIE0gMjI4LjYyOTg4LDIyMi4yODUyNCBMIDIyOC42Mjk4OCwyMTguNjkwOTQiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQ0MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC42MzA0MjA5MiIKLSAgICAgICAgICAgZD0iTSAyMjYuMDYzMzMsMjIxLjg1NTQ3IEwgMjI2LjA2MzMzLDIxOS4wNDIxIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNjc2OTI2ODUiCi0gICAgICAgICAgIGQ9Ik0gMjI0Ljg4ODIsMjIxLjYyNzMyIEwgMjI0Ljg4ODIsMjE5LjI4NDU0IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NDUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNzIwODQ5NzUiCi0gICAgICAgICAgIGQ9Ik0gMjIzLjYwNDkyLDIyMS4zMTQ5NSBMIDIyMy42MDQ5MiwyMTkuNDgwMDMiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQ0NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC43NjQ3NzU2OSIKLSAgICAgICAgICAgZD0iTSAyMjIuMjg1OTcsMjIxLjE1ODc3IEwgMjIyLjI4NTk3LDIxOS43OTI0IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTAxNzA4MDEiCi0gICAgICAgICAgIGQ9Ik0gMjIwLjg5LDIyMC44NDY3IEwgMjIwLjg5LDIyMC4xODI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDQ2NTA2NCIKLSAgICAgICAgICAgZD0iTSAyNTUuOTczNCwyMjMuNDUwNSBMIDI1NS45NzM0LDIxNy40NzUxNSBNIDI1Mi45NzIwMiwyMjMuNjQ1OTkgTCAyNTMuMDExMDQsMjE3LjMxODk2IE0gMjUwLjc4NDU0LDIyMy43MjQwOCBMIDI1MC43ODQ1NCwyMTcuMjc5NjYiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQ1MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0OC4wNTQsMjE1LjMxNDcgQyAyMzUuNzI4LDIxNS4zMzg3IDIyNC42NjUsMjE2Ljg4MzcgMjE2Ljg3OCwyMTkuMjgxNyBDIDIxNy41MjUsMjE4Ljk3NDcgMjE3LjQ2NywyMTguMTc3NyAyMTYuNjYyLDIxNi4xMDQ3IEMgMjE1LjY5LDIxMy41OTY3IDIxNC4xNzUsMjEzLjcwNjcgMjE0LjE3NSwyMTMuNzA2NyBDIDIyMi43ODQsMjExLjE2MzcgMjM0Ljc2OCwyMDkuNTcyNyAyNDguMTA2LDIwOS41NTU3IEMgMjYxLjQ0OSwyMDkuNTcyNyAyNzMuNTI5LDIxMS4xNjM3IDI4Mi4xMzksMjEzLjcwNjcgQyAyODIuMTM5LDIxMy43MDY3IDI4MC42MjMsMjEzLjU5NjcgMjc5LjY1MSwyMTYuMTA0NyBDIDI3OC44NDcsMjE4LjE3NzcgMjc4Ljc4NywyMTguOTc0NyAyNzkuNDM1LDIxOS4yODE3IEMgMjcxLjY0OSwyMTYuODgzNyAyNjAuMzc5LDIxNS4zMzg3IDI0OC4wNTQsMjE1LjMxNDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQ1NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0OC4xMDYsMjA5LjU1ODcgQyAyMzQuNzY4LDIwOS41Nzk3IDIyMi43ODQsMjExLjE2NjcgMjE0LjE3NSwyMTMuNzEzNyBDIDIxMy42MDEsMjEzLjg4NTcgMjEyLjk5NCwyMTMuNjYwNyAyMTIuODA4LDIxMy4xMTc3IEMgMjEyLjYyMiwyMTIuNTczNyAyMTIuOTMxLDIxMS45NDk3IDIxMy41MDUsMjExLjc3MzcgQyAyMjIuMTUxLDIwOS4xMjE3IDIzNC40NDQsMjA3LjQ1NjcgMjQ4LjEwOSwyMDcuNDI4NyBDIDI2MS43NzcsMjA3LjQ1MzcgMjc0LjExNywyMDkuMTIxNyAyODIuNzY0LDIxMS43NzM3IEMgMjgzLjMzOCwyMTEuOTQ5NyAyODMuNjQ3LDIxMi41NzM3IDI4My40NjEsMjEzLjExNzcgQyAyODMuMjc0LDIxMy42NjA3IDI4Mi42NjcsMjEzLjg4NTcgMjgyLjA5NCwyMTMuNzEzNyBDIDI3My40ODQsMjExLjE2NjcgMjYxLjQ0OSwyMDkuNTc5NyAyNDguMTA2LDIwOS41NTg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAyNDguMTA5LDIyMy43MzU3IEMgMjM3LjExNywyMjMuNzIxNyAyMjcuMTgyLDIyMi40NTI3IDIxOS42MTksMjIwLjQ5ODcgQyAyMjcuMTgyLDIxOC41NDE3IDIzNy4xMTcsMjE3LjM0NTcgMjQ4LjEwOSwyMTcuMzI0NyBDIDI1OS4wOTksMjE3LjM0NTcgMjY5LjA4NywyMTguNTQxNyAyNzYuNjUsMjIwLjQ5ODcgQyAyNjkuMDg3LDIyMi40NTI3IDI1OS4wOTksMjIzLjcyMTcgMjQ4LjEwOSwyMjMuNzM1NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDU5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjM4LjU5MiwyMTIuNTg4NyBDIDIzOC41OTIsMjEyLjAyMDcgMjM5LjA3OSwyMTEuNTU4NyAyMzkuNjc5LDIxMS41NTg3IEMgMjQwLjI4MywyMTEuNTU4NyAyNDAuNzcxLDIxMi4wMjA3IDI0MC43NzEsMjEyLjU4ODcgQyAyNDAuNzcxLDIxMy4xNTU3IDI0MC4yODMsMjEzLjYyMTcgMjM5LjY3OSwyMTMuNjIxNyBDIDIzOS4wNzksMjEzLjYyMTcgMjM4LjU5MiwyMTMuMTU1NyAyMzguNTkyLDIxMi41ODg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NjEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNDguMTMzLDIxMy4zOTk3IEwgMjQ0Ljg2OSwyMTMuMzk5NyBDIDI0NC4yNjcsMjEzLjM5OTcgMjQzLjc2OCwyMTIuOTQwNyAyNDMuNzY4LDIxMi4zNjk3IEMgMjQzLjc2OCwyMTEuODAxNyAyNDQuMjU2LDIxMS4zMzY3IDI0NC44NTYsMjExLjMzNjcgTCAyNTEuNDUzLDIxMS4zMzY3IEMgMjUyLjA1MywyMTEuMzM2NyAyNTIuNTQyLDIxMS44MDE3IDI1Mi41NDIsMjEyLjM2OTcgQyAyNTIuNTQyLDIxMi45NDA3IDI1Mi4wNDMsMjEzLjM5OTcgMjUxLjQzOCwyMTMuMzk5NyBMIDI0OC4xMzMsMjEzLjM5OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQ2MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6IzA1OGU2ZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDIzMS43MzcsMjE0LjI5ODcgTCAyMjkuMzg5LDIxNC41NzA3IEMgMjI4Ljc5LDIxNC42NDA3IDIyOC4yMzUsMjE0LjIzODcgMjI4LjE2LDIxMy42Nzc3IEMgMjI4LjA4NywyMTMuMTEwNyAyMjguNTEyLDIxMi41OTU3IDIyOS4xMTEsMjEyLjUyODcgTCAyMzEuNDcyLDIxMi4yNTM3IEwgMjMzLjg3NCwyMTEuOTc3NyBDIDIzNC40NjksMjExLjkwNzcgMjM1LjAxMywyMTIuMzAyNyAyMzUuMDg4LDIxMi44NzA3IEMgMjM1LjE1OCwyMTMuNDM0NyAyMzQuNzIzLDIxMy45NTI3IDIzNC4xMjcsMjE0LjAxOTcgTCAyMzEuNzM3LDIxNC4yOTg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmY7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyMjIuMTk2LDIxNC41MDM3IEMgMjIyLjE5NiwyMTMuOTM1NyAyMjIuNjg0LDIxMy40NzM3IDIyMy4yODMsMjEzLjQ3MzcgQyAyMjMuODg3LDIxMy40NzM3IDIyNC4zNzQsMjEzLjkzNTcgMjI0LjM3NCwyMTQuNTAzNyBDIDIyNC4zNzQsMjE1LjA3NDcgMjIzLjg4NywyMTUuNTM2NyAyMjMuMjgzLDIxNS41MzY3IEMgMjIyLjY4NCwyMTUuNTM2NyAyMjIuMTk2LDIxNS4wNzQ3IDIyMi4xOTYsMjE0LjUwMzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQ2NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDIxNC45MzgsMjE2LjM3OTcgTCAyMTYuMTQ5LDIxNC43OTU3IEwgMjE5LjQ5MywyMTUuMjE4NyBMIDIxNi44MTksMjE3LjE2OTcgTCAyMTQuOTM4LDIxNi4zNzk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NjkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwNThlNmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNjQuNTMyLDIxNC4yOTg3IEwgMjY2Ljg3OCwyMTQuNTcwNyBDIDI2Ny40NzMsMjE0LjY0MDcgMjY4LjAzMywyMTQuMjM4NyAyNjguMTA3LDIxMy42Nzc3IEMgMjY4LjE3NCwyMTMuMTEwNyAyNjcuNzUzLDIxMi41OTU3IDI2Ny4xNTcsMjEyLjUyODcgTCAyNjQuNzk3LDIxMi4yNTM3IEwgMjYyLjM5NSwyMTEuOTc3NyBDIDI2MS43OTUsMjExLjkwNzcgMjYxLjI1MiwyMTIuMzAyNyAyNjEuMTgxLDIxMi44NzA3IEMgMjYxLjEwNiwyMTMuNDM0NyAyNjEuNTQ2LDIxMy45NTI3IDI2Mi4xNDEsMjE0LjAxOTcgTCAyNjQuNTMyLDIxNC4yOTg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmY7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNTUuNDk4LDIxMi41ODg3IEMgMjU1LjQ5OCwyMTIuMDIwNyAyNTUuOTg2LDIxMS41NTg3IDI1Ni41ODYsMjExLjU1ODcgQyAyNTcuMTg5LDIxMS41NTg3IDI1Ny42NzcsMjEyLjAyMDcgMjU3LjY3NywyMTIuNTg4NyBDIDI1Ny42NzcsMjEzLjE1NTcgMjU3LjE4OSwyMTMuNjIxNyAyNTYuNTg2LDIxMy42MjE3IEMgMjU1Ljk4NiwyMTMuNjIxNyAyNTUuNDk4LDIxMy4xNTU3IDI1NS40OTgsMjEyLjU4ODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQ3MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZjtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI3MS44OTQsMjE0LjUwMzcgQyAyNzEuODk0LDIxMy45MzU3IDI3Mi4zODIsMjEzLjQ3MzcgMjcyLjk4MiwyMTMuNDczNyBDIDI3My41ODUsMjEzLjQ3MzcgMjc0LjA3MywyMTMuOTM1NyAyNzQuMDczLDIxNC41MDM3IEMgMjc0LjA3MywyMTUuMDc0NyAyNzMuNTg1LDIxNS41MzY3IDI3Mi45ODIsMjE1LjUzNjcgQyAyNzIuMzgyLDIxNS41MzY3IDI3MS44OTQsMjE1LjA3NDcgMjcxLjg5NCwyMTQuNTAzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDc1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjgxLjMzLDIxNi4zNzk3IEwgMjgwLjEyLDIxNC43OTU3IEwgMjc2Ljc3NiwyMTUuMjE4NyBMIDI3OS40NSwyMTcuMTY5NyBMIDI4MS4zMywyMTYuMzc5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDc3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyMTguMzA1LDIyMC44NDc3IEMgMjI2LjAwNiwyMTguNjg1NyAyMzYuNDc3LDIxNy4zNDU3IDI0OC4xMDksMjE3LjMyNDcgQyAyNTkuNzQsMjE3LjM0NTcgMjcwLjI2MywyMTguNjg1NyAyNzcuOTY0LDIyMC44NDc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0NzkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjIzLjQ5MiwxOTAuODExNyBMIDIyNC44NywxOTEuOTE1NyBMIDIyNi45MzYsMTg4LjU0MDcgQyAyMjQuNjk0LDE4Ny4xNjg3IDIyMy4xNTcsMTg0Ljc4NDcgMjIzLjE1NywxODIuMDY4NyBDIDIyMy4xNTcsMTgxLjc2MTcgMjIzLjE3NSwxODEuNDYyNyAyMjMuMjEzLDE4MS4xNjU3IEMgMjIzLjQyOSwxNzYuODU5NyAyMjguNjc1LDE3My4zMDE3IDIzNS4zMzcsMTczLjMwMTcgQyAyMzguNzkzLDE3My4zMDE3IDI0MS45MTQsMTc0LjI0NjcgMjQ0LjExMSwxNzUuNzYzNyBDIDI0NC4xNywxNzUuMDk2NyAyNDQuMjMsMTc0LjUyNTcgMjQ0LjMyMywxNzMuOTE4NyBDIDI0MS45MDMsMTcyLjUwNzcgMjM4Ljc2MywxNzEuNjU4NyAyMzUuMzM3LDE3MS42NTg3IEMgMjI3LjY3OCwxNzEuNjU4NyAyMjEuNjg2LDE3Ni4wMDk3IDIyMS4zOTUsMTgxLjE2MjcgQyAyMjEuMzY1LDE4MS40NjI3IDIyMS4zNSwxODEuNzY1NyAyMjEuMzUsMTgyLjA2ODcgQyAyMjEuMzUsMTg0LjgxNjcgMjIyLjYwNiwxODcuMjkxNyAyMjQuNTksMTg5LjAxMjcgTCAyMjMuNDkyLDE5MC44MTE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0ODEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDIyMy40OTIsMTkwLjgxMTcgTCAyMjQuODcsMTkxLjkxNTcgTCAyMjYuOTM2LDE4OC41NDA3IEMgMjI0LjY5NCwxODcuMTY4NyAyMjMuMTU3LDE4NC43ODQ3IDIyMy4xNTcsMTgyLjA2ODcgQyAyMjMuMTU3LDE4MS43NjE3IDIyMy4xNzUsMTgxLjQ2MjcgMjIzLjIxMywxODEuMTY1NyBDIDIyMy40MjksMTc2Ljg1OTcgMjI4LjY3NSwxNzMuMzAxNyAyMzUuMzM3LDE3My4zMDE3IEMgMjM4Ljc5MywxNzMuMzAxNyAyNDEuOTE0LDE3NC4yNDY3IDI0NC4xMTEsMTc1Ljc2MzcgQyAyNDQuMTcsMTc1LjA5NjcgMjQ0LjIzLDE3NC41MjU3IDI0NC4zMjMsMTczLjkxODcgQyAyNDEuOTAzLDE3Mi41MDc3IDIzOC43NjMsMTcxLjY1ODcgMjM1LjMzNywxNzEuNjU4NyBDIDIyNy42NzgsMTcxLjY1ODcgMjIxLjY4NiwxNzYuMDA5NyAyMjEuMzk1LDE4MS4xNjI3IEMgMjIxLjM2NSwxODEuNDYyNyAyMjEuMzUsMTgxLjc2NTcgMjIxLjM1LDE4Mi4wNjg3IEMgMjIxLjM1LDE4NC44MTY3IDIyMi42MDYsMTg3LjI5MTcgMjI0LjU5LDE4OS4wMTI3IEwgMjIzLjQ5MiwxOTAuODExNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDgzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDIyMy41ODEsMTkwLjg0OTcgQyAyMjAuOTY3LDE4OC44OTk3IDIxOS4zNDQsMTg2LjI0NzcgMjE5LjM0NCwxODMuMzI3NyBDIDIxOS4zNDQsMTc5Ljk2MzcgMjIxLjU0NCwxNzYuOTYyNyAyMjQuODg4LDE3NC45NzM3IEMgMjIyLjgyNSwxNzYuNjMwNyAyMjEuNTc0LDE3OC43NzE3IDIyMS4zOTUsMTgxLjE2MjcgQyAyMjEuMzY1LDE4MS40NjI3IDIyMS4zNSwxODEuNzY1NyAyMjEuMzUsMTgyLjA2ODcgQyAyMjEuMzUsMTg0LjgxNjcgMjIyLjYwNiwxODcuMjkxNyAyMjQuNTksMTg5LjAxMjcgTCAyMjMuNTgxLDE5MC44NDk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0ODUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDIyMy41ODEsMTkwLjg0OTcgQyAyMjAuOTY3LDE4OC44OTk3IDIxOS4zNDQsMTg2LjI0NzcgMjE5LjM0NCwxODMuMzI3NyBDIDIxOS4zNDQsMTc5Ljk2MzcgMjIxLjU0NCwxNzYuOTYyNyAyMjQuODg4LDE3NC45NzM3IEMgMjIyLjgyNSwxNzYuNjMwNyAyMjEuNTc0LDE3OC43NzE3IDIyMS4zOTUsMTgxLjE2MjcgQyAyMjEuMzY1LDE4MS40NjI3IDIyMS4zNSwxODEuNzY1NyAyMjEuMzUsMTgyLjA2ODcgQyAyMjEuMzUsMTg0LjgxNjcgMjIyLjYwNiwxODcuMjkxNyAyMjQuNTksMTg5LjAxMjcgTCAyMjMuNTgxLDE5MC44NDk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0ODciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjAwLjUyLDE5NC4yNTY3IEMgMTk5LjA1NiwxOTIuNjE2NyAxOTguMTU5LDE5MC40OTc3IDE5OC4xNTksMTg4LjE4MDcgQyAxOTguMTU5LDE4Ni43ODM3IDE5OC40ODIsMTg1LjQ0NzcgMTk5LjA2NywxODQuMjU1NyBDIDIwMS4xODIsMTc5LjkwMzcgMjA3LjgxOCwxNzYuNzM2NyAyMTUuNzA1LDE3Ni43MzY3IEMgMjE3Ljg1NCwxNzYuNzM2NyAyMTkuOTEsMTc2Ljk2OTcgMjIxLjgwOSwxNzcuNDAyNyBDIDIyMS4zODgsMTc3Ljg2MTcgMjIxLjA1NywxNzguMzY1NyAyMjAuNzM1LDE3OC44NzM3IEMgMjE5LjE1NywxNzguNTY2NyAyMTcuNDY3LDE3OC40MDA3IDIxNS43MDUsMTc4LjQwMDcgQyAyMDguNDg1LDE3OC40MDA3IDIwMi40NDUsMTgxLjIwODcgMjAwLjY5NSwxODUuMDAyNyBDIDIwMC4yMjksMTg1Ljk2OTcgMTk5Ljk2OCwxODcuMDQ4NyAxOTkuOTY4LDE4OC4xODA3IEMgMTk5Ljk2OCwxOTAuNDg2NyAyMDEuMDQ4LDE5Mi41NTM3IDIwMi43MzksMTkzLjk2NDcgTCAyMDAuMTI1LDE5OC4yMzQ3IEwgMTk4LjcyNSwxOTcuMTIwNyBMIDIwMC41MiwxOTQuMjYwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDg5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyMDAuNTIsMTk0LjI1NjcgQyAxOTkuMDU2LDE5Mi42MTY3IDE5OC4xNTksMTkwLjQ5NzcgMTk4LjE1OSwxODguMTgwNyBDIDE5OC4xNTksMTg2Ljc4MzcgMTk4LjQ4MiwxODUuNDQ3NyAxOTkuMDY3LDE4NC4yNTU3IEMgMjAxLjE4MiwxNzkuOTAzNyAyMDcuODE4LDE3Ni43MzY3IDIxNS43MDUsMTc2LjczNjcgQyAyMTcuODU0LDE3Ni43MzY3IDIxOS45MSwxNzYuOTY5NyAyMjEuODA5LDE3Ny40MDI3IEMgMjIxLjM4OCwxNzcuODYxNyAyMjEuMDU3LDE3OC4zNjU3IDIyMC43MzUsMTc4Ljg3MzcgQyAyMTkuMTU3LDE3OC41NjY3IDIxNy40NjcsMTc4LjQwMDcgMjE1LjcwNSwxNzguNDAwNyBDIDIwOC40ODUsMTc4LjQwMDcgMjAyLjQ0NSwxODEuMjA4NyAyMDAuNjk1LDE4NS4wMDI3IEMgMjAwLjIyOSwxODUuOTY5NyAxOTkuOTY4LDE4Ny4wNDg3IDE5OS45NjgsMTg4LjE4MDcgQyAxOTkuOTY4LDE5MC40ODY3IDIwMS4wNDgsMTkyLjU1MzcgMjAyLjczOSwxOTMuOTY0NyBMIDIwMC4xMjUsMTk4LjIzNDcgTCAxOTguNzI1LDE5Ny4xMjA3IEwgMjAwLjUyLDE5NC4yNjA3IEwgMjAwLjUyLDE5NC4yNTY3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0OTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjAzLjE5NywxNzkuOTQ5NyBDIDIwMS4yOTgsMTgxLjE0NDcgMTk5Ljg2LDE4Mi42MTU3IDE5OS4wNjcsMTg0LjI1NTcgQyAxOTguNDgyLDE4NS40NDc3IDE5OC4xNTksMTg2Ljc4MzcgMTk4LjE1OSwxODguMTgwNyBDIDE5OC4xNTksMTkwLjQ5NzcgMTk5LjA1NiwxOTIuNjE2NyAyMDAuNTIsMTk0LjI1NjcgTCAxOTguOTMzLDE5Ni44MzE3IEMgMTk3LjQxNCwxOTQuODgwNyAxOTYuNTMxLDE5Mi42MDI3IDE5Ni41MzEsMTkwLjE3OTcgQyAxOTYuNTMxLDE4Ni4wMDc3IDE5OS4xODYsMTgyLjM2MTcgMjAzLjE5NywxNzkuOTQ5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NDkzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyMDMuMTk3LDE3OS45NDk3IEMgMjAxLjI5OCwxODEuMTQ0NyAxOTkuODYsMTgyLjYxNTcgMTk5LjA2NywxODQuMjU1NyBDIDE5OC40ODIsMTg1LjQ0NzcgMTk4LjE1OSwxODYuNzgzNyAxOTguMTU5LDE4OC4xODA3IEMgMTk4LjE1OSwxOTAuNDk3NyAxOTkuMDU2LDE5Mi42MTY3IDIwMC41MiwxOTQuMjU2NyBMIDE5OC45MzMsMTk2LjgzMTcgQyAxOTcuNDE0LDE5NC44ODA3IDE5Ni41MzEsMTkyLjYwMjcgMTk2LjUzMSwxOTAuMTc5NyBDIDE5Ni41MzEsMTg2LjAwNzcgMTk5LjE4NiwxODIuMzYxNyAyMDMuMTk3LDE3OS45NDk3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0OTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjQ4LjAyNCwxNzAuNzk3NyBDIDI0OS43NzQsMTcwLjc5NzcgMjUxLjI3OSwxNzEuOTU0NyAyNTEuNjM3LDE3My41MDY3IEMgMjUxLjg3MSwxNzQuODc4NyAyNTIuMDE3LDE3Ni40NDA3IDI1Mi4wNSwxNzguMTA0NyBDIDI1Mi4wNTMsMTc4LjI3NzcgMjUyLjAzOCwxNzguNDQ2NyAyNTIuMDM4LDE3OC42MTY3IEMgMjUyLjA0MywxNzguODEzNyAyNTIuMDgsMTc5LjAyNTcgMjUyLjA4MywxNzkuMjI2NyBDIDI1Mi4xNDMsMTgyLjcxNzcgMjUyLjY0MiwxODUuNzk5NyAyNTMuMzUzLDE4Ny42ODY3IEwgMjQ4LjAyMSwxOTIuNzg2NyBMIDI0Mi42MzIsMTg3LjY4NjcgQyAyNDMuMzQ3LDE4NS43OTk3IDI0My44NDIsMTgyLjcxNzcgMjQzLjkwOSwxNzkuMjI2NyBDIDI0My45MTMsMTc5LjAyNTcgMjQzLjk1MSwxNzguODEzNyAyNDMuOTUxLDE3OC42MTY3IEMgMjQzLjk1MSwxNzguNDQ2NyAyNDMuOTM5LDE3OC4yNzc3IDI0My45NDMsMTc4LjEwNDcgQyAyNDMuOTY5LDE3Ni40NDA3IDI0NC4xMTgsMTc0Ljg3ODcgMjQ0LjM1MywxNzMuNTA2NyBDIDI0NC43MDcsMTcxLjk1NDcgMjQ2LjI3NCwxNzAuNzk3NyAyNDguMDIxLDE3MC43OTc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU0OTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI0OC4wMjQsMTcwLjc5NzcgQyAyNDkuNzc0LDE3MC43OTc3IDI1MS4yNzksMTcxLjk1NDcgMjUxLjYzNywxNzMuNTA2NyBDIDI1MS44NzEsMTc0Ljg3ODcgMjUyLjAxNywxNzYuNDQwNyAyNTIuMDUsMTc4LjEwNDcgQyAyNTIuMDUzLDE3OC4yNzc3IDI1Mi4wMzgsMTc4LjQ0NjcgMjUyLjAzOCwxNzguNjE2NyBDIDI1Mi4wNDMsMTc4LjgxMzcgMjUyLjA4LDE3OS4wMjU3IDI1Mi4wODMsMTc5LjIyNjcgQyAyNTIuMTQzLDE4Mi43MTc3IDI1Mi42NDIsMTg1Ljc5OTcgMjUzLjM1MywxODcuNjg2NyBMIDI0OC4wMjEsMTkyLjc4NjcgTCAyNDIuNjMyLDE4Ny42ODY3IEMgMjQzLjM0NywxODUuNzk5NyAyNDMuODQyLDE4Mi43MTc3IDI0My45MDksMTc5LjIyNjcgQyAyNDMuOTEzLDE3OS4wMjU3IDI0My45NTEsMTc4LjgxMzcgMjQzLjk1MSwxNzguNjE2NyBDIDI0My45NTEsMTc4LjQ0NjcgMjQzLjkzOSwxNzguMjc3NyAyNDMuOTQzLDE3OC4xMDQ3IEMgMjQzLjk2OSwxNzYuNDQwNyAyNDQuMTE4LDE3NC44Nzg3IDI0NC4zNTMsMTczLjUwNjcgQyAyNDQuNzA3LDE3MS45NTQ3IDI0Ni4yNzQsMTcwLjc5NzcgMjQ4LjAyMSwxNzAuNzk3NyBMIDI0OC4wMjQsMTcwLjc5NzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTQ5OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNDguMDI0LDE3Mi40NTg3IEMgMjQ4LjkzMywxNzIuNDU4NyAyNDkuNjk5LDE3My4wMzc3IDI0OS44ODYsMTczLjg0MDcgQyAyNTAuMTA2LDE3NS4xMzg3IDI1MC4yNDcsMTc2LjYyMDcgMjUwLjI3NywxNzguMTg1NyBDIDI1MC4yNzcsMTc4LjM0ODcgMjUwLjI2OSwxNzguNTEwNyAyNTAuMjY5LDE3OC42Njg3IEMgMjUwLjI2OSwxNzguODYyNyAyNTAuMzAzLDE3OS4wNTY3IDI1MC4zMDcsMTc5LjI1NDcgQyAyNTAuMzYzLDE4Mi41NTE3IDI1MC44MzYsMTg1LjQ1NzcgMjUxLjUxMywxODcuMjQ1NyBMIDI0Ny45OTgsMTkwLjU3NDcgTCAyNDQuNDc5LDE4Ny4yNDU3IEMgMjQ1LjE1LDE4NS40NjE3IDI0NS42MjMsMTgyLjU1MTcgMjQ1LjY4MiwxNzkuMjU0NyBDIDI0NS42ODYsMTc5LjA1NjcgMjQ1LjcyLDE3OC44NjI3IDI0NS43MjMsMTc4LjY2ODcgQyAyNDUuNzIzLDE3OC41MTA3IDI0NS43MTIsMTc4LjM0ODcgMjQ1LjcxMiwxNzguMTg1NyBDIDI0NS43NDIsMTc2LjYyMDcgMjQ1Ljg4MywxNzUuMTM4NyAyNDYuMTA2LDE3My44NDA3IEMgMjQ2LjI4OSwxNzMuMDM3NyAyNDcuMTE5LDE3Mi40NTg3IDI0OC4wMjQsMTcyLjQ1ODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTUwMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjQ4LjAyNCwxNzIuNDU4NyBDIDI0OC45MzMsMTcyLjQ1ODcgMjQ5LjY5OSwxNzMuMDM3NyAyNDkuODg2LDE3My44NDA3IEMgMjUwLjEwNiwxNzUuMTM4NyAyNTAuMjQ3LDE3Ni42MjA3IDI1MC4yNzcsMTc4LjE4NTcgQyAyNTAuMjc3LDE3OC4zNDg3IDI1MC4yNjksMTc4LjUxMDcgMjUwLjI2OSwxNzguNjY4NyBDIDI1MC4yNjksMTc4Ljg2MjcgMjUwLjMwMywxNzkuMDU2NyAyNTAuMzA3LDE3OS4yNTQ3IEMgMjUwLjM2MywxODIuNTUxNyAyNTAuODM2LDE4NS40NTc3IDI1MS41MTMsMTg3LjI0NTcgTCAyNDcuOTk4LDE5MC41NzQ3IEwgMjQ0LjQ3OSwxODcuMjQ1NyBDIDI0NS4xNSwxODUuNDYxNyAyNDUuNjIzLDE4Mi41NTE3IDI0NS42ODIsMTc5LjI1NDcgQyAyNDUuNjg2LDE3OS4wNTY3IDI0NS43MiwxNzguODYyNyAyNDUuNzIzLDE3OC42Njg3IEMgMjQ1LjcyMywxNzguNTEwNyAyNDUuNzEyLDE3OC4zNDg3IDI0NS43MTIsMTc4LjE4NTcgQyAyNDUuNzQyLDE3Ni42MjA3IDI0NS44ODMsMTc1LjEzODcgMjQ2LjEwNiwxNzMuODQwNyBDIDI0Ni4yODksMTczLjAzNzcgMjQ3LjExOSwxNzIuNDU4NyAyNDguMDI0LDE3Mi40NTg3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjcyLjUxNiwxOTAuODExNyBMIDI3MS4xMzgsMTkxLjkxNTcgTCAyNjkuMDcyLDE4OC41NDA3IEMgMjcxLjMxMywxODcuMTY4NyAyNzIuODUxLDE4NC43ODQ3IDI3Mi44NTEsMTgyLjA2ODcgQyAyNzIuODUxLDE4MS43NjE3IDI3Mi44MzMsMTgxLjQ2MjcgMjcyLjc5NiwxODEuMTY1NyBDIDI3Mi41ODMsMTc2Ljg1OTcgMjY3LjMyOSwxNzMuMzAxNyAyNjAuNjc0LDE3My4zMDE3IEMgMjU3LjIxMSwxNzMuMzAxNyAyNTQuMDkzLDE3NC4yNDY3IDI1MS44OTQsMTc1Ljc2MzcgQyAyNTEuODM0LDE3NS4wOTY3IDI1MS43ODIsMTc0LjUyNTcgMjUxLjY4MSwxNzMuOTE4NyBDIDI1NC4xMDIsMTcyLjUwNzcgMjU3LjI0MSwxNzEuNjU4NyAyNjAuNjc0LDE3MS42NTg3IEMgMjY4LjMzMSwxNzEuNjU4NyAyNzQuMzIyLDE3Ni4wMDk3IDI3NC42MTYsMTgxLjE2MjcgQyAyNzQuNjQyLDE4MS40NjI3IDI3NC42NTcsMTgxLjc2NTcgMjc0LjY1NywxODIuMDY4NyBDIDI3NC42NTcsMTg0LjgxNjcgMjczLjQwMywxODcuMjkxNyAyNzEuNDE4LDE4OS4wMTI3IEwgMjcyLjUxNiwxOTAuODExNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTA1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNzIuNTE2LDE5MC44MTE3IEwgMjcxLjEzOCwxOTEuOTE1NyBMIDI2OS4wNzIsMTg4LjU0MDcgQyAyNzEuMzEzLDE4Ny4xNjg3IDI3Mi44NTEsMTg0Ljc4NDcgMjcyLjg1MSwxODIuMDY4NyBDIDI3Mi44NTEsMTgxLjc2MTcgMjcyLjgzMywxODEuNDYyNyAyNzIuNzk2LDE4MS4xNjU3IEMgMjcyLjU4MywxNzYuODU5NyAyNjcuMzI5LDE3My4zMDE3IDI2MC42NzQsMTczLjMwMTcgQyAyNTcuMjExLDE3My4zMDE3IDI1NC4wOTMsMTc0LjI0NjcgMjUxLjg5NCwxNzUuNzYzNyBDIDI1MS44MzQsMTc1LjA5NjcgMjUxLjc4MiwxNzQuNTI1NyAyNTEuNjgxLDE3My45MTg3IEMgMjU0LjEwMiwxNzIuNTA3NyAyNTcuMjQxLDE3MS42NTg3IDI2MC42NzQsMTcxLjY1ODcgQyAyNjguMzMxLDE3MS42NTg3IDI3NC4zMjIsMTc2LjAwOTcgMjc0LjYxNiwxODEuMTYyNyBDIDI3NC42NDIsMTgxLjQ2MjcgMjc0LjY1NywxODEuNzY1NyAyNzQuNjU3LDE4Mi4wNjg3IEMgMjc0LjY1NywxODQuODE2NyAyNzMuNDAzLDE4Ny4yOTE3IDI3MS40MTgsMTg5LjAxMjcgTCAyNzIuNTE2LDE5MC44MTE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjcyLjQyNywxOTAuODQ5NyBDIDI3NS4wNDEsMTg4Ljg5OTcgMjc2LjY2NSwxODYuMjQ3NyAyNzYuNjY1LDE4My4zMjc3IEMgMjc2LjY2NSwxNzkuOTYzNyAyNzQuNDYzLDE3Ni45NjI3IDI3MS4xMjQsMTc0Ljk3MzcgQyAyNzMuMTgzLDE3Ni42MzA3IDI3NC40MzMsMTc4Ljc3MTcgMjc0LjYxNiwxODEuMTYyNyBDIDI3NC42NDIsMTgxLjQ2MjcgMjc0LjY1NywxODEuNzY1NyAyNzQuNjU3LDE4Mi4wNjg3IEMgMjc0LjY1NywxODQuODE2NyAyNzMuNDAzLDE4Ny4yOTE3IDI3MS40MTgsMTg5LjAxMjcgTCAyNzIuNDI3LDE5MC44NDk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI3Mi40MjcsMTkwLjg0OTcgQyAyNzUuMDQxLDE4OC44OTk3IDI3Ni42NjUsMTg2LjI0NzcgMjc2LjY2NSwxODMuMzI3NyBDIDI3Ni42NjUsMTc5Ljk2MzcgMjc0LjQ2MywxNzYuOTYyNyAyNzEuMTI0LDE3NC45NzM3IEMgMjczLjE4MywxNzYuNjMwNyAyNzQuNDMzLDE3OC43NzE3IDI3NC42MTYsMTgxLjE2MjcgQyAyNzQuNjQyLDE4MS40NjI3IDI3NC42NTcsMTgxLjc2NTcgMjc0LjY1NywxODIuMDY4NyBDIDI3NC42NTcsMTg0LjgxNjcgMjczLjQwMywxODcuMjkxNyAyNzEuNDE4LDE4OS4wMTI3IEwgMjcyLjQyNywxOTAuODQ5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTExIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI5NS40OTIsMTk0LjI1NjcgQyAyOTYuOTUyLDE5Mi42MTY3IDI5Ny44NDgsMTkwLjQ5NzcgMjk3Ljg0OCwxODguMTgwNyBDIDI5Ny44NDgsMTg2Ljc4MzcgMjk3LjUyNSwxODUuNDQ3NyAyOTYuOTQ1LDE4NC4yNTU3IEMgMjk0LjgyNiwxNzkuOTAzNyAyODguMTksMTc2LjczNjcgMjgwLjMwMiwxNzYuNzM2NyBDIDI3OC4xNTMsMTc2LjczNjcgMjc2LjA5OCwxNzYuOTY5NyAyNzQuMTk5LDE3Ny40MDI3IEMgMjc0LjYyNCwxNzcuODYxNyAyNzQuOTUyLDE3OC4zNjU3IDI3NS4yNzYsMTc4Ljg3MzcgQyAyNzYuODQ3LDE3OC41NjY3IDI3OC41NDUsMTc4LjQwMDcgMjgwLjI5OCwxNzguNDAwNyBDIDI4Ny41MiwxNzguNDAwNyAyOTMuNTYzLDE4MS4yMDg3IDI5NS4zMDksMTg1LjAwMjcgQyAyOTUuNzc4LDE4NS45Njk3IDI5Ni4wMzYsMTg3LjA0ODcgMjk2LjAzNiwxODguMTgwNyBDIDI5Ni4wMzYsMTkwLjQ4NjcgMjk0Ljk1NiwxOTIuNTUzNyAyOTMuMjY1LDE5My45NjQ3IEwgMjk1Ljg3OSwxOTguMjM0NyBMIDI5Ny4yODMsMTk3LjEyMDcgTCAyOTUuNDg5LDE5NC4yNjA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI5NS40OTIsMTk0LjI1NjcgQyAyOTYuOTUyLDE5Mi42MTY3IDI5Ny44NDgsMTkwLjQ5NzcgMjk3Ljg0OCwxODguMTgwNyBDIDI5Ny44NDgsMTg2Ljc4MzcgMjk3LjUyNSwxODUuNDQ3NyAyOTYuOTQ1LDE4NC4yNTU3IEMgMjk0LjgyNiwxNzkuOTAzNyAyODguMTksMTc2LjczNjcgMjgwLjMwMiwxNzYuNzM2NyBDIDI3OC4xNTMsMTc2LjczNjcgMjc2LjA5OCwxNzYuOTY5NyAyNzQuMTk5LDE3Ny40MDI3IEMgMjc0LjYyNCwxNzcuODYxNyAyNzQuOTUyLDE3OC4zNjU3IDI3NS4yNzYsMTc4Ljg3MzcgQyAyNzYuODQ3LDE3OC41NjY3IDI3OC41NDUsMTc4LjQwMDcgMjgwLjI5OCwxNzguNDAwNyBDIDI4Ny41MiwxNzguNDAwNyAyOTMuNTYzLDE4MS4yMDg3IDI5NS4zMDksMTg1LjAwMjcgQyAyOTUuNzc4LDE4NS45Njk3IDI5Ni4wMzYsMTg3LjA0ODcgMjk2LjAzNiwxODguMTgwNyBDIDI5Ni4wMzYsMTkwLjQ4NjcgMjk0Ljk1NiwxOTIuNTUzNyAyOTMuMjY1LDE5My45NjQ3IEwgMjk1Ljg3OSwxOTguMjM0NyBMIDI5Ny4yODMsMTk3LjEyMDcgTCAyOTUuNDg5LDE5NC4yNjA3IEwgMjk1LjQ5MiwxOTQuMjU2NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTE1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI5Mi44MTEsMTc5Ljk0OTcgQyAyOTQuNzEsMTgxLjE0NDcgMjk2LjE0OCwxODIuNjE1NyAyOTYuOTQ1LDE4NC4yNTU3IEMgMjk3LjUyMiwxODUuNDQ3NyAyOTcuODQ4LDE4Ni43ODM3IDI5Ny44NDgsMTg4LjE4MDcgQyAyOTcuODQ4LDE5MC40OTc3IDI5Ni45NTIsMTkyLjYxNjcgMjk1LjQ5MiwxOTQuMjU2NyBMIDI5Ny4wNzUsMTk2LjgzMTcgQyAyOTguNTk0LDE5NC44ODA3IDI5OS40NzMsMTkyLjYwMjcgMjk5LjQ3MywxOTAuMTc5NyBDIDI5OS40NzMsMTg2LjAwNzcgMjk2LjgyMiwxODIuMzYxNyAyOTIuODExLDE3OS45NDk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI5Mi44MTEsMTc5Ljk0OTcgQyAyOTQuNzEsMTgxLjE0NDcgMjk2LjE0OCwxODIuNjE1NyAyOTYuOTQ1LDE4NC4yNTU3IEMgMjk3LjUyMiwxODUuNDQ3NyAyOTcuODQ4LDE4Ni43ODM3IDI5Ny44NDgsMTg4LjE4MDcgQyAyOTcuODQ4LDE5MC40OTc3IDI5Ni45NTIsMTkyLjYxNjcgMjk1LjQ5MiwxOTQuMjU2NyBMIDI5Ny4wNzUsMTk2LjgzMTcgQyAyOTguNTk0LDE5NC44ODA3IDI5OS40NzMsMTkyLjYwMjcgMjk5LjQ3MywxOTAuMTc5NyBDIDI5OS40NzMsMTg2LjAwNzcgMjk2LjgyMiwxODIuMzYxNyAyOTIuODExLDE3OS45NDk3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjQ2LjEyOSwxODguMzQyNyBDIDI0Ni4xMjksMTg3LjM1NTcgMjQ2Ljk3OCwxODYuNTU4NyAyNDguMDIxLDE4Ni41NTg3IEMgMjQ5LjA2NCwxODYuNTU4NyAyNDkuOTEzLDE4Ny4zNTU3IDI0OS45MTMsMTg4LjM0MjcgQyAyNDkuOTEzLDE4OS4zMzM3IDI0OS4wNjQsMTkwLjEzNDcgMjQ4LjAyMSwxOTAuMTM0NyBDIDI0Ni45NzgsMTkwLjEzNDcgMjQ2LjEyOSwxODkuMzMzNyAyNDYuMTI5LDE4OC4zNDI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MjEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI0Ni4xMjksMTg4LjM0MjcgQyAyNDYuMTI5LDE4Ny4zNTU3IDI0Ni45NzgsMTg2LjU1ODcgMjQ4LjAyMSwxODYuNTU4NyBDIDI0OS4wNjQsMTg2LjU1ODcgMjQ5LjkxMywxODcuMzU1NyAyNDkuOTEzLDE4OC4zNDI3IEMgMjQ5LjkxMywxODkuMzMzNyAyNDkuMDY0LDE5MC4xMzQ3IDI0OC4wMjEsMTkwLjEzNDcgQyAyNDYuOTc4LDE5MC4xMzQ3IDI0Ni4xMjksMTg5LjMzMzcgMjQ2LjEyOSwxODguMzQyNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTIzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjQ2LjEyOSwxODQuODMzNyBDIDI0Ni4xMjksMTgzLjg0NjcgMjQ2Ljk3OCwxODMuMDQxNyAyNDguMDIxLDE4My4wNDE3IEMgMjQ5LjA2NCwxODMuMDQxNyAyNDkuOTEzLDE4My44NDY3IDI0OS45MTMsMTg0LjgzMzcgQyAyNDkuOTEzLDE4NS44MjE3IDI0OS4wNjQsMTg2LjYyMTcgMjQ4LjAyMSwxODYuNjIxNyBDIDI0Ni45NzgsMTg2LjYyMTcgMjQ2LjEyOSwxODUuODIxNyAyNDYuMTI5LDE4NC44MzM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmY7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNDYuNTA5LDE4MS4wNTk3IEMgMjQ2LjUwOSwxODAuMjY5NyAyNDcuMTg3LDE3OS42MzE3IDI0OC4wMjEsMTc5LjYzMTcgQyAyNDguODUxLDE3OS42MzE3IDI0OS41MjksMTgwLjI2OTcgMjQ5LjUyOSwxODEuMDU5NyBDIDI0OS41MjksMTgxLjg0OTcgMjQ4Ljg1MSwxODIuNDg4NyAyNDguMDIxLDE4Mi40ODg3IEMgMjQ3LjE4NywxODIuNDg4NyAyNDYuNTA5LDE4MS44NDk3IDI0Ni41MDksMTgxLjA1OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTUyNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZjtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0Ni45MzMsMTc3LjY1NjcgQyAyNDYuOTMzLDE3Ny4wODk3IDI0Ny40MjEsMTc2LjYyNzcgMjQ4LjAyMSwxNzYuNjI3NyBDIDI0OC42MjQsMTc2LjYyNzcgMjQ5LjEwOCwxNzcuMDg5NyAyNDkuMTA4LDE3Ny42NTY3IEMgMjQ5LjEwOCwxNzguMjI4NyAyNDguNjI0LDE3OC42OTA3IDI0OC4wMjEsMTc4LjY5MDcgQyAyNDcuNDIxLDE3OC42OTA3IDI0Ni45MzMsMTc4LjIyODcgMjQ2LjkzMywxNzcuNjU2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTI5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjQ3LjE0OSwxNzQuNjgwNyBDIDI0Ny4xNDksMTc0LjIyMTcgMjQ3LjUzOSwxNzMuODU1NyAyNDguMDIxLDE3My44NTU3IEMgMjQ4LjUwMSwxNzMuODU1NyAyNDguODkyLDE3NC4yMjE3IDI0OC44OTIsMTc0LjY4MDcgQyAyNDguODkyLDE3NS4xMzU3IDI0OC41MDEsMTc1LjUwNTcgMjQ4LjAyMSwxNzUuNTA1NyBDIDI0Ny41MzksMTc1LjUwNTcgMjQ3LjE0OSwxNzUuMTM1NyAyNDcuMTQ5LDE3NC42ODA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNDguMTgxLDE5OS4xMTI3IEwgMjQ5LjQxLDE5OS4zMzg3IEMgMjQ5LjIxMiwxOTkuODM1NyAyNDkuMTcxLDIwMC4zNzg3IDI0OS4xNzEsMjAwLjk1MDcgQyAyNDkuMTcxLDIwMy40OTk3IDI1MS4zNjEsMjA1LjU3MzcgMjU0LjA1NywyMDUuNTczNyBDIDI1Ni4yMjEsMjA1LjU3MzcgMjU4LjA2NCwyMDQuMjMzNyAyNTguNjk3LDIwMi4zODI3IEMgMjU4Ljc2OCwyMDIuNDMxNyAyNTkuMTYzLDIwMC43MTA3IDI1OS4zNjcsMjAwLjczMTcgQyAyNTkuNTM4LDIwMC43NDk3IDI1OS41MiwyMDIuNTE5NyAyNTkuNTgzLDIwMi40ODc3IEMgMjU5Ljg5NiwyMDQuODE4NyAyNjIuMDI2LDIwNi4zOTU3IDI2NC40MjQsMjA2LjM5NTcgQyAyNjcuMTE2LDIwNi4zOTU3IDI2OS4yOTksMjA0LjMzMjcgMjY5LjI5OSwyMDEuNzc4NyBDIDI2OS4yOTksMjAxLjU4ODcgMjY5LjI4OCwyMDEuMzk4NyAyNjkuMjYyLDIwMS4yMTQ3IEwgMjcwLjc5MiwxOTkuNjk4NyBMIDI3MS42MTQsMjAxLjYzMDcgQyAyNzEuMjg3LDIwMi4yMzc3IDI3MS4xNTcsMjAyLjkxODcgMjcxLjE1NywyMDMuNjQ4NyBDIDI3MS4xNTcsMjA2LjA4NTcgMjczLjI0MiwyMDguMDU2NyAyNzUuODE2LDIwOC4wNTY3IEMgMjc3LjQzNSwyMDguMDU2NyAyNzguODU3LDIwNy4yNzc3IDI3OS42OTIsMjA2LjA5NTcgTCAyODAuNjcxLDIwNC44NTA3IEwgMjgwLjY2NCwyMDYuMzc3NyBDIDI4MC42NjQsMjA3LjkxMTcgMjgxLjMxMiwyMDkuMjg3NyAyODIuODA5LDIwOS41MzA3IEMgMjgyLjgwOSwyMDkuNTMwNyAyODQuNTI4LDIwOS42MzY3IDI4Ni44MDUsMjA3Ljg0ODcgQyAyODkuMDg0LDIwNi4wNjA3IDI5MC4zMzksMjA0LjU3OTcgMjkwLjMzOSwyMDQuNTc5NyBMIDI5MC41MzUsMjA2LjM3MDcgQyAyOTAuNTM1LDIwNi4zNzA3IDI4OC42NDQsMjA5LjI5NDcgMjg2LjU4NSwyMTAuNDg2NyBDIDI4NS40NiwyMTEuMTQyNyAyODMuNzUxLDIxMS44Mjk3IDI4Mi4zOTIsMjExLjYwNzcgQyAyODAuOTU0LDIxMS4zNzQ3IDI3OS45MywyMTAuMjIxNyAyNzkuNDAyLDIwOC44OTI3IEMgMjc4LjM3NywyMDkuNDk1NyAyNzcuMTY3LDIwOS44NDc3IDI3NS44NzEsMjA5Ljg0NzcgQyAyNzMuMDg2LDIwOS44NDc3IDI3MC41ODMsMjA4LjMyMDcgMjY5LjU5MywyMDYuMDIxNyBDIDI2OC4zMTIsMjA3LjQwMzcgMjY2LjUyOCwyMDguMjUzNyAyNjQuNDM2LDIwOC4yNTM3IEMgMjYyLjIxMiwyMDguMjUzNyAyNjAuMTc1LDIwNy4yNTI3IDI1OC44OTgsMjA1LjcxNDcgQyAyNTcuNjQzLDIwNi44NTc3IDI1NS45MzcsMjA3LjU2MjcgMjU0LjA1NywyMDcuNTYyNyBDIDI1MS41OTUsMjA3LjU2MjcgMjQ5LjM5OSwyMDYuMzU2NyAyNDguMTU0LDIwNC41MzY3IEMgMjQ2LjkxMSwyMDYuMzU2NyAyNDQuNzE3LDIwNy41NjI3IDI0Mi4yNTksMjA3LjU2MjcgQyAyNDAuMzgsMjA3LjU2MjcgMjM4LjY3LDIwNi44NTc3IDIzNy40MTQsMjA1LjcxNDcgQyAyMzYuMTQyLDIwNy4yNTI3IDIzNC4xMDEsMjA4LjI1MzcgMjMxLjg3OCwyMDguMjUzNyBDIDIyOS43ODUsMjA4LjI1MzcgMjI4LjAwMSwyMDcuNDAzNyAyMjYuNzE5LDIwNi4wMjE3IEMgMjI1LjczLDIwOC4zMjA3IDIyMy4yMjgsMjA5Ljg0NzcgMjIwLjQ0MiwyMDkuODQ3NyBDIDIxOS4xNDUsMjA5Ljg0NzcgMjE3Ljk0LDIwOS40OTU3IDIxNi45MTYsMjA4Ljg5MjcgQyAyMTYuMzgzLDIxMC4yMjE3IDIxNS4zNTksMjExLjM3NDcgMjEzLjkyNSwyMTEuNjA3NyBDIDIxMi41NjYsMjExLjgyOTcgMjEwLjg1NywyMTEuMTQyNyAyMDkuNzI5LDIxMC40ODY3IEMgMjA3LjY2OSwyMDkuMjk0NyAyMDUuNzgsMjA2LjM3MDcgMjA1Ljc4LDIwNi4zNzA3IEwgMjA1Ljk3OCwyMDQuNTc5NyBDIDIwNS45NzgsMjA0LjU3OTcgMjA3LjIzNCwyMDYuMDYwNyAyMDkuNTA5LDIwNy44NDg3IEMgMjExLjc4OCwyMDkuNjM5NyAyMTMuNTA1LDIwOS41MzA3IDIxMy41MDUsMjA5LjUzMDcgQyAyMTUuMDAyLDIwOS4yODc3IDIxNS42NDksMjA3LjkxMTcgMjE1LjY0OSwyMDYuMzc3NyBMIDIxNS42NDIsMjA0Ljg1MDcgTCAyMTYuNjIxLDIwNi4wOTU3IEMgMjE3LjQ1NSwyMDcuMjc3NyAyMTguODgyLDIwOC4wNTY3IDIyMC40OTgsMjA4LjA1NjcgQyAyMjMuMDcxLDIwOC4wNTY3IDIyNS4xNTYsMjA2LjA4NTcgMjI1LjE1NiwyMDMuNjQ4NyBDIDIyNS4xNTYsMjAyLjkxODcgMjI1LjAyNSwyMDIuMjM3NyAyMjQuNjk4LDIwMS42MzA3IEwgMjI1LjUyLDE5OS42OTg3IEwgMjI3LjA1MiwyMDEuMjE0NyBDIDIyNy4wMjksMjAxLjM5ODcgMjI3LjAxNSwyMDEuNTg4NyAyMjcuMDE1LDIwMS43Nzg3IEMgMjI3LjAxNSwyMDQuMzMyNyAyMjkuMTk1LDIwNi4zOTU3IDIzMS44ODksMjA2LjM5NTcgQyAyMzQuMjkxLDIwNi4zOTU3IDIzNi40MTcsMjA0LjgxODcgMjM2LjczLDIwMi40ODc3IEMgMjM2Ljc5NywyMDIuNTE5NyAyMzYuNzc5LDIwMC43NDk3IDIzNi45NDksMjAwLjczMTcgQyAyMzcuMTUxLDIwMC43MTA3IDIzNy41NDksMjAyLjQzMTcgMjM3LjYxNiwyMDIuMzgyNyBDIDIzOC4yNTMsMjA0LjIzMzcgMjQwLjA5MywyMDUuNTczNyAyNDIuMjY0LDIwNS41NzM3IEMgMjQ0Ljk1OSwyMDUuNTczNyAyNDcuMTQyLDIwMy40OTk3IDI0Ny4xNDIsMjAwLjk1MDcgQyAyNDcuMTQyLDIwMC4zNzg3IDI0Ny4xMDgsMTk5LjgzNTcgMjQ2LjkwNywxOTkuMzM4NyBMIDI0OC4xODEsMTk5LjExMjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTUzMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZjtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI4MS43MSwyMDUuMjA2NyBDIDI4MS45OTIsMjA0LjM3ODcgMjgxLjc0LDIwMy41NTk3IDI4MS4xNDQsMjAzLjM4MDcgQyAyODAuNTQ5LDIwMy4xOTM3IDI3OS44MzMsMjAzLjcxNTcgMjc5LjU1MSwyMDQuNTQwNyBDIDI3OS4yNjcsMjA1LjM2NTcgMjc5LjUyMSwyMDYuMTgwNyAyODAuMTE3LDIwNi4zNjc3IEMgMjgwLjcxMiwyMDYuNTQ2NyAyODEuNDI3LDIwNi4wMjg3IDI4MS43MSwyMDUuMjA2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTM1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjYwLjQ4MSwyMDEuMDk0NyBDIDI2MC41OTIsMjAwLjIzMDcgMjYwLjE3OSwxOTkuNDc2NyAyNTkuNTU3LDE5OS40MDU3IEMgMjU4LjkzNSwxOTkuMzMxNyAyNTguMzM5LDE5OS45Njk3IDI1OC4yMjgsMjAwLjgzMDcgQyAyNTguMTE2LDIwMS42OTA3IDI1OC41MjksMjAyLjQ0OTcgMjU5LjE1MSwyMDIuNTIzNyBDIDI1OS43NzMsMjAyLjU5MzcgMjYwLjM2OSwyMDEuOTU1NyAyNjAuNDgxLDIwMS4wOTQ3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1MzciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmY7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyMzUuODMyLDIwMS4wOTQ3IEMgMjM1LjcyMSwyMDAuMjMwNyAyMzYuMTM4LDE5OS40NzY3IDIzNi43NTYsMTk5LjQwNTcgQyAyMzcuMzc4LDE5OS4zMzE3IDIzNy45NzQsMTk5Ljk2OTcgMjM4LjA4NiwyMDAuODMwNyBDIDIzOC4xOTMsMjAxLjY5MDcgMjM3Ljc4NCwyMDIuNDQ5NyAyMzcuMTYyLDIwMi41MjM3IEMgMjM2LjU0LDIwMi41OTM3IDIzNS45NDQsMjAxLjk1NTcgMjM1LjgzMiwyMDEuMDk0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTM5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjE0LjYwNywyMDUuMjA2NyBDIDIxNC4zMjQsMjA0LjM3ODcgMjE0LjU3NywyMDMuNTU5NyAyMTUuMTczLDIwMy4zODA3IEMgMjE1Ljc2OSwyMDMuMTkzNyAyMTYuNDgsMjAzLjcxNTcgMjE2Ljc2MywyMDQuNTQwNyBDIDIxNy4wNDIsMjA1LjM2NTcgMjE2Ljc4OSwyMDYuMTgwNyAyMTYuMTk3LDIwNi4zNjc3IEMgMjE1LjYwMSwyMDYuNTQ2NyAyMTQuODksMjA2LjAyODcgMjE0LjYwNywyMDUuMjA2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTQxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjIzLjgyNywxOTEuMDQwNyBDIDIyNC44ODEsMTkxLjcwNjcgMjI1LjgwMSwxOTIuODE0NyAyMjYuMTIsMTk0LjA1MjcgQyAyMjYuMTIsMTk0LjA1MjcgMjI2LjI0NCwxOTMuNzk4NyAyMjYuODI0LDE5My40NjM3IEMgMjI3LjQwOSwxOTMuMTM1NyAyMjcuOTA0LDE5My4xNDU3IDIyNy45MDQsMTkzLjE0NTcgQyAyMjcuOTA0LDE5My4xNDU3IDIyNy43MzcsMTk0LjEwODcgMjI3LjY1NSwxOTQuNDU0NyBDIDIyNy41NywxOTQuNzkyNyAyMjcuNTYyLDE5NS44MjY3IDIyNy4zMzksMTk2Ljc1NzcgQyAyMjcuMTE1LDE5Ny42ODg3IDIyNi43MDksMTk4LjQzMjcgMjI2LjcwOSwxOTguNDMyNyBDIDIyNi4yOTYsMTk4LjA5MzcgMjI1LjczLDE5Ny45MjQ3IDIyNS4xNDUsMTk4LjAxOTcgQyAyMjQuNTY0LDE5OC4xMTg3IDIyNC4wOTUsMTk4LjQ2MDcgMjIzLjgyNywxOTguOTExNyBDIDIyMy44MjcsMTk4LjkxMTcgMjIzLjE3NSwxOTguMzQ0NyAyMjIuNjMxLDE5Ny41NDM3IEMgMjIyLjA4NCwxOTYuNzQyNyAyMjEuNzEyLDE5NS43NzY3IDIyMS41MDMsMTk1LjQ4MzcgQyAyMjEuMjk4LDE5NS4xODc3IDIyMC43OTUsMTk0LjMzNDcgMjIwLjc5NSwxOTQuMzM0NyBDIDIyMC43OTUsMTk0LjMzNDcgMjIxLjI1OCwxOTQuMTYxNyAyMjEuOTI0LDE5NC4yODQ3IEMgMjIyLjU5LDE5NC40MDg3IDIyMi43OTksMTk0LjYwOTcgMjIyLjc5OSwxOTQuNjA5NyBDIDIyMi42NTgsMTkzLjMzNjcgMjIzLjA3OSwxOTIuMDA2NyAyMjMuODI3LDE5MS4wNDA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1NDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyMjQuMjc0LDIwMS4xNzk3IEMgMjIzLjkzOSwyMDAuOTE0NyAyMjMuNjg2LDIwMC41NDQ3IDIyMy42MDQsMjAwLjEwNzcgQyAyMjMuNTIxLDE5OS42NzM3IDIyMy42MTUsMTk5LjI0MzcgMjIzLjgzNSwxOTguODkwNyBDIDIyMy44MzUsMTk4Ljg5MDcgMjIyLjk1NSwxOTguNDQ2NyAyMjIuMDEzLDE5OC4xOTk3IEMgMjIxLjI5OCwxOTguMDEyNyAyMjAuMDQsMTk4LjAwNTcgMjE5LjY2LDE5Ny45OTg3IEMgMjE5LjI4LDE5Ny45ODc3IDIxOC41MjEsMTk3Ljk3MDcgMjE4LjUyMSwxOTcuOTcwNyBDIDIxOC41MjEsMTk3Ljk3MDcgMjE4LjU4NCwxOTguMTQzNyAyMTguOCwxOTguNTIwNyBDIDIxOS4wNiwxOTguOTc1NyAyMTkuMjkxLDE5OS4yNjA3IDIxOS4yOTEsMTk5LjI2MDcgQyAyMTguMDMyLDE5OS41NTA3IDIxNi45NiwyMDAuMzc4NyAyMTYuMjgyLDIwMS4zMzg3IEMgMjE3LjI2NiwyMDIuMDE4NyAyMTguNTczLDIwMi40MzE3IDIxOS44NTcsMjAyLjMwMDcgQyAyMTkuODU3LDIwMi4zMDA3IDIxOS43NDUsMjAyLjY0MzcgMjE5LjY2NCwyMDMuMTYxNyBDIDIxOS41OTcsMjAzLjU4ODcgMjE5LjYwMSwyMDMuNzY0NyAyMTkuNjAxLDIwMy43NjQ3IEMgMjE5LjYwMSwyMDMuNzY0NyAyMjAuMzA4LDIwMy41MDM3IDIyMC42NjIsMjAzLjM3MzcgQyAyMjEuMDE2LDIwMy4yNDI3IDIyMi4xOTYsMjAyLjgzMzcgMjIyLjgwMywyMDIuNDI0NyBDIDIyMy41OTYsMjAxLjg4MTcgMjI0LjI3NCwyMDEuMTgyNyAyMjQuMjc0LDIwMS4xODI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1NDUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyMjcuMDk3LDIwMC43MDY3IEMgMjI3LjMxNiwyMDAuMzU0NyAyMjcuNDIxLDE5OS45MjM3IDIyNy4zMzksMTk5LjQ4NjcgQyAyMjcuMjU3LDE5OS4wNDk3IDIyNy4wMTgsMTk4LjY3OTcgMjI2LjY4MywxOTguNDE0NyBDIDIyNi42ODMsMTk4LjQxNDcgMjI3LjM0NiwxOTcuNzEyNyAyMjguMTM5LDE5Ny4xNzM3IEMgMjI4Ljc0MywxOTYuNzY0NyAyMjkuOTI2LDE5Ni4zNTE3IDIzMC4yOCwxOTYuMjI0NyBDIDIzMC42MzQsMTk2LjA5NDcgMjMxLjM0MiwxOTUuODI5NyAyMzEuMzQyLDE5NS44Mjk3IEMgMjMxLjM0MiwxOTUuODI5NyAyMzEuMzQ1LDE5Ni4wMDk3IDIzMS4yNzgsMTk2LjQzNjcgQyAyMzEuMTk3LDE5Ni45NTE3IDIzMS4wODQsMTk3LjI5MzcgMjMxLjA4NCwxOTcuMjkzNyBDIDIzMi4zNywxOTcuMTU5NyAyMzMuNjc5LDE5Ny41ODk3IDIzNC42NjMsMTk4LjI3MzcgQyAyMzMuOTg2LDE5OS4yMjk3IDIzMi45MDYsMjAwLjA0MzcgMjMxLjY1MSwyMDAuMzMzNyBDIDIzMS42NTEsMjAwLjMzMzcgMjMxLjg3OCwyMDAuNjE4NyAyMzIuMTQyLDIwMS4wNzM3IEMgMjMyLjM1OCwyMDEuNDU0NyAyMzIuNDIyLDIwMS42MjM3IDIzMi40MjIsMjAxLjYyMzcgQyAyMzIuNDIyLDIwMS42MjM3IDIzMS42NjIsMjAxLjYwNjcgMjMxLjI4MiwyMDEuNTk5NyBDIDIzMC45MDIsMjAxLjU5MjcgMjI5LjY0NCwyMDEuNTg4NyAyMjguOTI5LDIwMS4zOTg3IEMgMjI3Ljk4NywyMDEuMTQ3NyAyMjcuMDk3LDIwMC43MTA3IDIyNy4wOTcsMjAwLjcxMDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU0NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDIyMy4zNTQsMTk5Ljc3OTcgQyAyMjMuMzU0LDE5OC42NTA3IDIyNC4zMTksMTk3LjczNzcgMjI1LjUwNywxOTcuNzM3NyBDIDIyNi42OSwxOTcuNzM3NyAyMjcuNjU5LDE5OC42NTA3IDIyNy42NTksMTk5Ljc3OTcgQyAyMjcuNjU5LDIwMC45MDQ3IDIyNi42OTQsMjAxLjgxNzcgMjI1LjUwNywyMDEuODE3NyBDIDIyNC4zMTksMjAxLjgxNzcgMjIzLjM1NCwyMDAuOTA0NyAyMjMuMzU0LDE5OS43Nzk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1NDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNDguMDk5LDE4Ny43Nzg3IEMgMjQ5LjEzNCwxODguNzE2NyAyNDkuOTMxLDE5MC4xMTk3IDI1MC4wMzIsMTkxLjU2MjcgQyAyNTAuMDMyLDE5MS41NjI3IDI1MC4yMTgsMTkxLjMwMTcgMjUwLjkzNywxOTEuMDQwNyBDIDI1MS42NTUsMTkwLjc3OTcgMjUyLjIwNiwxOTAuODgxNyAyNTIuMjA2LDE5MC44ODE3IEMgMjUyLjIwNiwxOTAuODgxNyAyNTEuODIzLDE5MS45Mjk3IDI1MS42NTUsMTkyLjI5NTcgQyAyNTEuNDg4LDE5Mi42NjI3IDI1MS4yNzIsMTkzLjgxMjcgMjUwLjgyNCwxOTQuODAzNyBDIDI1MC4zODksMTk1LjgwMTcgMjQ5Ljc4MiwxOTYuNTUyNyAyNDkuNzgyLDE5Ni41NTI3IEMgMjQ5LjM4NywxOTYuMTAxNyAyNDguNzkyLDE5NS44MDg3IDI0OC4xMjEsMTk1LjgwODcgQyAyNDcuNDU0LDE5NS44MDg3IDI0Ni44NTksMTk2LjEwMTcgMjQ2LjQ2NCwxOTYuNTUyNyBDIDI0Ni40NjQsMTk2LjU1MjcgMjQ1Ljg1NywxOTUuODAxNyAyNDUuNDE4LDE5NC44MDM3IEMgMjQ0Ljk3NCwxOTMuODEyNyAyNDQuNzU1LDE5Mi42NjI3IDI0NC41OTEsMTkyLjI5NTcgQyAyNDQuNDI0LDE5MS45Mjk3IDI0NC4wMzYsMTkwLjg4MTcgMjQ0LjAzNiwxOTAuODgxNyBDIDI0NC4wMzYsMTkwLjg4MTcgMjQ0LjU5MSwxOTAuNzc5NyAyNDUuMzA2LDE5MS4wNDA3IEMgMjQ2LjAyNCwxOTEuMzAxNyAyNDYuMjE1LDE5MS41NjI3IDI0Ni4yMTUsMTkxLjU2MjcgQyAyNDYuMzE1LDE5MC4xMTk3IDI0Ny4wNjgsMTg4LjcxNjcgMjQ4LjA5OSwxODcuNzc4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTUxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjQ2LjQ5NCwxOTkuMTY1NyBDIDI0Ni4xNzQsMTk4LjgwOTcgMjQ1Ljk2OSwxOTguMzQ3NyAyNDUuOTY5LDE5Ny44NDY3IEMgMjQ1Ljk2OSwxOTcuMzQ5NyAyNDYuMTU5LDE5Ni44ODQ3IDI0Ni40NzksMTk2LjUzNDcgQyAyNDYuNDc5LDE5Ni41MzQ3IDI0NS41OTMsMTk1Ljg3MTcgMjQ0LjU5NSwxOTUuNDIwNyBDIDI0My44MzksMTk1LjA3NDcgMjQyLjQzNSwxOTQuODM1NyAyNDIuMDE0LDE5NC43NTc3IEMgMjQxLjU5LDE5NC42NzY3IDI0MC43NDgsMTk0LjUxNzcgMjQwLjc0OCwxOTQuNTE3NyBDIDI0MC43NDgsMTk0LjUxNzcgMjQwLjc4MiwxOTQuNzE4NyAyNDAuOTQ1LDE5NS4xODA3IEMgMjQxLjE0MywxOTUuNzQxNyAyNDEuMzQsMTk2LjEwMTcgMjQxLjM0LDE5Ni4xMDE3IEMgMjM5Ljg4MSwxOTYuMTg5NyAyMzguNTA2LDE5Ni45MTU3IDIzNy41NTMsMTk3Ljg1NzcgQyAyMzguNTA2LDE5OC43OTE3IDIzOS44NzcsMTk5LjUwMDcgMjQxLjM0LDE5OS41OTY3IEMgMjQxLjM0LDE5OS41OTY3IDI0MS4xNDMsMTk5Ljk1MjcgMjQwLjk0NSwyMDAuNTE2NyBDIDI0MC43ODIsMjAwLjk3MTcgMjQwLjc0OCwyMDEuMTc1NyAyNDAuNzQ4LDIwMS4xNzU3IEMgMjQwLjc0OCwyMDEuMTc1NyAyNDEuNTksMjAxLjAyMDcgMjQyLjAxNCwyMDAuOTQzNyBDIDI0Mi40MzUsMjAwLjg1ODcgMjQzLjgzOSwyMDAuNjIyNyAyNDQuNTk1LDIwMC4yNzM3IEMgMjQ1LjU5MywxOTkuODIxNyAyNDYuNDk0LDE5OS4xNjk3IDI0Ni40OTQsMTk5LjE2OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU1MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0OS43MzgsMTk5LjE2NTcgQyAyNTAuMDU4LDE5OC44MDk3IDI1MC4yNjIsMTk4LjM0NzcgMjUwLjI2MiwxOTcuODQ2NyBDIDI1MC4yNjIsMTk3LjM0OTcgMjUwLjA3MywxOTYuODg0NyAyNDkuNzUyLDE5Ni41MzQ3IEMgMjQ5Ljc1MiwxOTYuNTM0NyAyNTAuNjM5LDE5NS44NzE3IDI1MS42MzcsMTk1LjQyMDcgQyAyNTIuMzk2LDE5NS4wNzQ3IDI1My44LDE5NC44MzU3IDI1NC4yMjEsMTk0Ljc1NzcgQyAyNTQuNjM4LDE5NC42NzY3IDI1NS40NzksMTk0LjUxNzcgMjU1LjQ3OSwxOTQuNTE3NyBDIDI1NS40NzksMTk0LjUxNzcgMjU1LjQ1LDE5NC43MTg3IDI1NS4yODIsMTk1LjE4MDcgQyAyNTUuMDg0LDE5NS43NDE3IDI1NC44OTEsMTk2LjEwMTcgMjU0Ljg5MSwxOTYuMTAxNyBDIDI1Ni4zNTEsMTk2LjE4OTcgMjU3LjcyNCwxOTYuOTE1NyAyNTguNjc0LDE5Ny44NTc3IEMgMjU3LjcyNCwxOTguNzkxNyAyNTYuMzU0LDE5OS41MDA3IDI1NC44OTEsMTk5LjU5NjcgQyAyNTQuODkxLDE5OS41OTY3IDI1NS4wODQsMTk5Ljk1MjcgMjU1LjI4MiwyMDAuNTE2NyBDIDI1NS40NDYsMjAwLjk3MTcgMjU1LjQ3OSwyMDEuMTc1NyAyNTUuNDc5LDIwMS4xNzU3IEMgMjU1LjQ3OSwyMDEuMTc1NyAyNTQuNjQyLDIwMS4wMjA3IDI1NC4yMjEsMjAwLjk0MzcgQyAyNTMuOCwyMDAuODU4NyAyNTIuMzk2LDIwMC42MjI3IDI1MS42MzcsMjAwLjI3MzcgQyAyNTAuNjM5LDE5OS44MjE3IDI0OS43MzgsMTk5LjE2OTcgMjQ5LjczOCwxOTkuMTY5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTU1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjcyLjQ4NiwxOTEuMDQwNyBDIDI3MS40MzYsMTkxLjcwNjcgMjcwLjUxNywxOTIuODE0NyAyNzAuMTk2LDE5NC4wNTI3IEMgMjcwLjE5NiwxOTQuMDUyNyAyNzAuMDY4LDE5My43OTg3IDI2OS40ODksMTkzLjQ2MzcgQyAyNjguOTA4LDE5My4xMzU3IDI2OC40MDgsMTkzLjE0NTcgMjY4LjQwOCwxOTMuMTQ1NyBDIDI2OC40MDgsMTkzLjE0NTcgMjY4LjU3NiwxOTQuMTA4NyAyNjguNjYyLDE5NC40NTQ3IEMgMjY4Ljc0OCwxOTQuNzkyNyAyNjguNzUxLDE5NS44MjY3IDI2OC45NzQsMTk2Ljc1NzcgQyAyNjkuMTk4LDE5Ny42ODg3IDI2OS42MDMsMTk4LjQzMjcgMjY5LjYwMywxOTguNDMyNyBDIDI3MC4wMjEsMTk4LjA5MzcgMjcwLjU4NywxOTcuOTI0NyAyNzEuMTY4LDE5OC4wMTk3IEMgMjcxLjc0OCwxOTguMTE4NyAyNzIuMjE4LDE5OC40NjA3IDI3Mi40OSwxOTguOTExNyBDIDI3Mi40OSwxOTguOTExNyAyNzMuMTM4LDE5OC4zNDQ3IDI3My42ODYsMTk3LjU0MzcgQyAyNzQuMjI5LDE5Ni43NDI3IDI3NC42MDUsMTk1Ljc3NjcgMjc0LjgwNiwxOTUuNDgzNyBDIDI3NS4wMTEsMTk1LjE4NzcgMjc1LjUxOCwxOTQuMzM0NyAyNzUuNTE4LDE5NC4zMzQ3IEMgMjc1LjUxOCwxOTQuMzM0NyAyNzUuMDUyLDE5NC4xNjE3IDI3NC4zODYsMTk0LjI4NDcgQyAyNzMuNzE5LDE5NC40MDg3IDI3My41MSwxOTQuNjA5NyAyNzMuNTEsMTk0LjYwOTcgQyAyNzMuNjU5LDE5My4zMzY3IDI3My4yMzQsMTkyLjAwNjcgMjcyLjQ4NiwxOTEuMDQwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTU3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjcyLjA0MywyMDEuMTc5NyBDIDI3Mi4zNzUsMjAwLjkxNDcgMjcyLjYzMiwyMDAuNTQ0NyAyNzIuNzA5LDIwMC4xMDc3IEMgMjcyLjc5MiwxOTkuNjczNyAyNzIuNzAyLDE5OS4yNDM3IDI3Mi40ODMsMTk4Ljg5MDcgQyAyNzIuNDgzLDE5OC44OTA3IDI3My4zNTgsMTk4LjQ0NjcgMjc0LjI5OSwxOTguMTk5NyBDIDI3NS4wMTUsMTk4LjAxMjcgMjc2LjI3NywxOTguMDA1NyAyNzYuNjUyLDE5Ny45OTg3IEMgMjc3LjAzMywxOTcuOTg3NyAyNzcuNzkyLDE5Ny45NzA3IDI3Ny43OTIsMTk3Ljk3MDcgQyAyNzcuNzkyLDE5Ny45NzA3IDI3Ny43MzIsMTk4LjE0MzcgMjc3LjUxNCwxOTguNTIwNyBDIDI3Ny4yNTIsMTk4Ljk3NTcgMjc3LjAyMiwxOTkuMjYwNyAyNzcuMDIyLDE5OS4yNjA3IEMgMjc4LjI4LDE5OS41NTA3IDI3OS4zNTIsMjAwLjM3ODcgMjgwLjAzMSwyMDEuMzM4NyBDIDI3OS4wNTEsMjAyLjAxODcgMjc3Ljc0NCwyMDIuNDMxNyAyNzYuNDU2LDIwMi4zMDA3IEMgMjc2LjQ1NiwyMDIuMzAwNyAyNzYuNTcxLDIwMi42NDM3IDI3Ni42NSwyMDMuMTYxNyBDIDI3Ni43MTIsMjAzLjU4ODcgMjc2LjcwOSwyMDMuNzY0NyAyNzYuNzA5LDIwMy43NjQ3IEMgMjc2LjcwOSwyMDMuNzY0NyAyNzYuMDAxLDIwMy41MDM3IDI3NS42NTIsMjAzLjM3MzcgQyAyNzUuMjk4LDIwMy4yNDI3IDI3NC4xMTcsMjAyLjgzMzcgMjczLjUxLDIwMi40MjQ3IEMgMjcyLjcyMSwyMDEuODgxNyAyNzIuMDQzLDIwMS4xODI3IDI3Mi4wNDMsMjAxLjE4MjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU1OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI2OS4yMTcsMjAwLjcwNjcgQyAyNjguOTk3LDIwMC4zNTQ3IDI2OC44OTcsMTk5LjkyMzcgMjY4Ljk3NCwxOTkuNDg2NyBDIDI2OS4wNTcsMTk5LjA0OTcgMjY5LjI5OSwxOTguNjc5NyAyNjkuNjMzLDE5OC40MTQ3IEMgMjY5LjYzMywxOTguNDE0NyAyNjguOTY3LDE5Ny43MTI3IDI2OC4xNzQsMTk3LjE3MzcgQyAyNjcuNTcxLDE5Ni43NjQ3IDI2Ni4zODYsMTk2LjM1MTcgMjY2LjAzMywxOTYuMjI0NyBDIDI2NS42NzksMTk2LjA5NDcgMjY0Ljk3NSwxOTUuODI5NyAyNjQuOTc1LDE5NS44Mjk3IEMgMjY0Ljk3NSwxOTUuODI5NyAyNjQuOTcyLDE5Ni4wMDk3IDI2NS4wMzgsMTk2LjQzNjcgQyAyNjUuMTE3LDE5Ni45NTE3IDI2NS4yMjksMTk3LjI5MzcgMjY1LjIyOSwxOTcuMjkzNyBDIDI2My45NDQsMTk3LjE1OTcgMjYyLjYzMywxOTcuNTg5NyAyNjEuNjUzLDE5OC4yNzM3IEMgMjYyLjMzMiwxOTkuMjI5NyAyNjMuNDA4LDIwMC4wNDM3IDI2NC42NjMsMjAwLjMzMzcgQyAyNjQuNjYzLDIwMC4zMzM3IDI2NC40MzYsMjAwLjYxODcgMjY0LjE3NCwyMDEuMDczNyBDIDI2My45NTUsMjAxLjQ1NDcgMjYzLjg5NiwyMDEuNjIzNyAyNjMuODk2LDIwMS42MjM3IEMgMjYzLjg5NiwyMDEuNjIzNyAyNjQuNjUxLDIwMS42MDY3IDI2NS4wMzEsMjAxLjU5OTcgQyAyNjUuNDA3LDIwMS41OTI3IDI2Ni42NzQsMjAxLjU4ODcgMjY3LjM4NCwyMDEuMzk4NyBDIDI2OC4zMjMsMjAxLjE0NzcgMjY5LjIxMywyMDAuNzEwNyAyNjkuMjEzLDIwMC43MTA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1NjEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNjguNjU1LDE5OS43Nzk3IEMgMjY4LjY1NSwxOTguNjUwNyAyNjkuNjE4LDE5Ny43Mzc3IDI3MC44MDcsMTk3LjczNzcgQyAyNzEuOTk5LDE5Ny43Mzc3IDI3Mi45NjMsMTk4LjY1MDcgMjcyLjk2MywxOTkuNzc5NyBDIDI3Mi45NjMsMjAwLjkwNDcgMjcxLjk5OSwyMDEuODE3NyAyNzAuODA3LDIwMS44MTc3IEMgMjY5LjYxOCwyMDEuODE3NyAyNjguNjU1LDIwMC45MDQ3IDI2OC42NTUsMTk5Ljc3OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU2MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI5Mi43MjksMjA0LjMwNzcgQyAyOTIuMjIyLDIwMy43NzE3IDI5MS4xNzIsMjAzLjg4NDcgMjkwLjM4NywyMDQuNTU0NyBDIDI4OS42MDEsMjA1LjIyMDcgMjg5LjM3MywyMDYuMjAxNyAyODkuODgsMjA2LjczMzcgQyAyOTAuMzg3LDIwNy4yNjk3IDI5MS40MzcsMjA3LjE1MzcgMjkyLjIyMiwyMDYuNDg3NyBDIDI5My4wMDgsMjA1LjgxMzcgMjkzLjIzNiwyMDQuODM2NyAyOTIuNzI5LDIwNC4zMDc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1NjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyODkuNjcyLDIwNS42MDU3IEMgMjg5Ljc4LDIwNS4yMzg3IDI5MC4wMjYsMjA0Ljg2NDcgMjkwLjM4NywyMDQuNTU0NyBDIDI5MS4xNzIsMjAzLjg4NDcgMjkyLjIyMiwyMDMuNzcxNyAyOTIuNzI5LDIwNC4zMDc3IEMgMjkyLjc5MiwyMDQuMzc4NyAyOTIuODYzLDIwNC40NzM3IDI5Mi45MDQsMjA0LjU1NzcgQyAyOTIuOTA0LDIwNC41NTc3IDI5My45OTUsMjAyLjQ4NzcgMjk1LjI4NywyMDEuODAwNyBDIDI5Ni41OCwyMDEuMTA1NyAyOTguNzY2LDIwMS4yODE3IDI5OC43NjYsMjAxLjI4MTcgQyAyOTguNzY2LDE5OS42OTQ3IDI5Ny40NjYsMTk4LjQxMTcgMjk1Ljc5LDE5OC40MTE3IEMgMjk0LjgwNywxOTguNDExNyAyOTMuODc2LDE5OC44MjA3IDI5My4zMjgsMTk5LjUxMTcgTCAyOTMuMTAyLDE5OC40NDY3IEMgMjkzLjEwMiwxOTguNDQ2NyAyOTEuNzU0LDE5OC43MTQ3IDI5MS4xMzUsMjAwLjI1NTcgQyAyOTAuNTIxLDIwMS44MDA3IDI5MS4xOTEsMjA0LjAzMjcgMjkxLjE5MSwyMDQuMDMyNyBDIDI5MS4xOTEsMjA0LjAzMjcgMjkwLjg1NiwyMDMuMDczNyAyOTAuMzUsMjAyLjQzNDcgQyAyODkuODQ3LDIwMS44MDA3IDI4OC41NTUsMjAxLjEwNTcgMjg3Ljg4MSwyMDAuNzg4NyBDIDI4Ny4yMDcsMjAwLjQ3NDcgMjg2LjUxOCwyMDAuMDAxNyAyODYuNTE4LDIwMC4wMDE3IEMgMjg2LjUxOCwyMDAuMDAxNyAyODYuNDg4LDIwMC4xNzQ3IDI4Ni40NjIsMjAwLjYwMTcgQyAyODYuNDM2LDIwMS4xMTI3IDI4Ni40NzcsMjAxLjQyNjcgMjg2LjQ3NywyMDEuNDI2NyBDIDI4NS4yNDEsMjAxLjI2NDcgMjgzLjc5OSwyMDEuNDY1NyAyODIuNjc1LDIwMS45MDI3IEMgMjgzLjE1NSwyMDIuODQ3NyAyODQuMDcxLDIwMy43MzY3IDI4NS4yNywyMDQuMTkxNyBDIDI4NS4yNywyMDQuMTkxNyAyODQuODM4LDIwNC41NDc3IDI4NC40NDMsMjA0LjkzODcgQyAyODQuMTE2LDIwNS4yNzA3IDI4NC4wMTIsMjA1LjQyNTcgMjg0LjAxMiwyMDUuNDI1NyBDIDI4NC4wMTIsMjA1LjQyNTcgMjg0Ljg1NywyMDUuNTQ1NyAyODUuMjgyLDIwNS42MDU3IEMgMjg1LjcwMiwyMDUuNjYxNyAyODcuMTA2LDIwNS44ODM3IDI4Ny45NDQsMjA1LjgyNzcgQyAyODguNTYyLDIwNS43ODg3IDI4OS4yNTUsMjA1LjY4NjcgMjg5LjY3MiwyMDUuNjA1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTY3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjA2LjY0MiwyMDUuNjA1NyBDIDIwNi41MzQsMjA1LjIzODcgMjA2LjI5LDIwNC44NjQ3IDIwNS45MjcsMjA0LjU1NDcgQyAyMDUuMTQxLDIwMy44ODQ3IDIwNC4wOTQsMjAzLjc3MTcgMjAzLjU4NCwyMDQuMzA3NyBDIDIwMy41MTcsMjA0LjM3ODcgMjAzLjQ1LDIwNC40NzM3IDIwMy40MDksMjA0LjU1NzcgQyAyMDMuNDA5LDIwNC41NTc3IDIwMi4zMTQsMjAyLjQ4NzcgMjAxLjAyMiwyMDEuODAwNyBDIDE5OS43MzQsMjAxLjEwNTcgMTk3LjU0OCwyMDEuMjgxNyAxOTcuNTQ4LDIwMS4yODE3IEMgMTk3LjU0OCwxOTkuNjk0NyAxOTguODQ4LDE5OC40MTE3IDIwMC41MjMsMTk4LjQxMTcgQyAyMDEuNTEsMTk4LjQxMTcgMjAyLjQzNCwxOTguODIwNyAyMDIuOTg4LDE5OS41MTE3IEwgMjAzLjIxMiwxOTguNDQ2NyBDIDIwMy4yMTIsMTk4LjQ0NjcgMjA0LjU2LDE5OC43MTQ3IDIwNS4xNzgsMjAwLjI1NTcgQyAyMDUuNzk1LDIwMS44MDA3IDIwNS4xMjIsMjA0LjAzMjcgMjA1LjEyMiwyMDQuMDMyNyBDIDIwNS4xMjIsMjA0LjAzMjcgMjA1LjQ1NywyMDMuMDczNyAyMDUuOTY0LDIwMi40MzQ3IEMgMjA2LjQ3LDIwMS44MDA3IDIwNy43NjIsMjAxLjEwNTcgMjA4LjQzNSwyMDAuNzg4NyBDIDIwOS4xMDcsMjAwLjQ3NDcgMjA5Ljc5OSwyMDAuMDAxNyAyMDkuNzk5LDIwMC4wMDE3IEMgMjA5Ljc5OSwyMDAuMDAxNyAyMDkuODI1LDIwMC4xNzQ3IDIwOS44NTIsMjAwLjYwMTcgQyAyMDkuODc4LDIwMS4xMTI3IDIwOS44MzcsMjAxLjQyNjcgMjA5LjgzNywyMDEuNDI2NyBDIDIxMS4wNjksMjAxLjI2NDcgMjEyLjUxNCwyMDEuNDY1NyAyMTMuNjM5LDIwMS45MDI3IEMgMjEzLjE1OCwyMDIuODQ3NyAyMTIuMjQ1LDIwMy43MzY3IDIxMS4wNDMsMjA0LjE5MTcgQyAyMTEuMDQzLDIwNC4xOTE3IDIxMS40NzUsMjA0LjU0NzcgMjExLjg2OSwyMDQuOTM4NyBDIDIxMi4xOTgsMjA1LjI3MDcgMjEyLjMwNSwyMDUuNDI1NyAyMTIuMzA1LDIwNS40MjU3IEMgMjEyLjMwNSwyMDUuNDI1NyAyMTEuNDU2LDIwNS41NDU3IDIxMS4wMzYsMjA1LjYwNTcgQyAyMTAuNjEsMjA1LjY2MTcgMjA5LjIxMSwyMDUuODgzNyAyMDguMzczLDIwNS44Mjc3IEMgMjA3Ljc1NSwyMDUuNzg4NyAyMDcuMDYyLDIwNS42ODY3IDIwNi42NDIsMjA1LjYwNTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU2OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDIwMy41ODQsMjA0LjMwNzcgQyAyMDQuMDk0LDIwMy43NzE3IDIwNS4xNDEsMjAzLjg4NDcgMjA1LjkyNywyMDQuNTU0NyBDIDIwNi43MTYsMjA1LjIyMDcgMjA2LjkzOSwyMDYuMjAxNyAyMDYuNDMzLDIwNi43MzM3IEMgMjA1LjkyNywyMDcuMjY5NyAyMDQuODc2LDIwNy4xNTM3IDIwNC4wOTEsMjA2LjQ4NzcgQyAyMDMuMzA1LDIwNS44MTM3IDIwMy4wNzgsMjA0LjgzNjcgMjAzLjU4NCwyMDQuMzA3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTcxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjQ1Ljk2OSwxOTcuODQ2NyBDIDI0NS45NjksMTk2LjcxODcgMjQ2LjkzMywxOTUuODA4NyAyNDguMTIxLDE5NS44MDg3IEMgMjQ5LjMwOSwxOTUuODA4NyAyNTAuMjc3LDE5Ni43MTg3IDI1MC4yNzcsMTk3Ljg0NjcgQyAyNTAuMjc3LDE5OC45NzU3IDI0OS4zMTMsMTk5Ljg4ODcgMjQ4LjEyMSwxOTkuODg4NyBDIDI0Ni45MzMsMTk5Ljg4ODcgMjQ1Ljk2OSwxOTguOTc1NyAyNDUuOTY5LDE5Ny44NDY3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1NzMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwMDViYmY7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjQzLjY0MSwxNjYuODU4NyBDIDI0My42NDEsMTY0LjU1MTcgMjQ1LjYxMiwxNjIuNjg5NyAyNDguMDM5LDE2Mi42ODk3IEMgMjUwLjQ2NywxNjIuNjg5NyAyNTIuNDM3LDE2NC41NTE3IDI1Mi40MzcsMTY2Ljg1ODcgQyAyNTIuNDM3LDE2OS4xNTc3IDI1MC40NjcsMTcxLjAxOTcgMjQ4LjAzOSwxNzEuMDE5NyBDIDI0NS42MTIsMTcxLjAxOTcgMjQzLjY0MSwxNjkuMTU3NyAyNDMuNjQxLDE2Ni44NTg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0Ni44ODcxNSwxNTUuMTc1MSBMIDI0Ni44ODcxNSwxNTcuNDI1MSBMIDI0NC40ODA5LDE1Ny40MjUxIEwgMjQ0LjQ4MDksMTU5LjcwNjM1IEwgMjQ2Ljg4NzE1LDE1OS43MDYzNSBMIDI0Ni44ODcxNSwxNjIuODMxMzUgTCAyNDYuODg3MTUsMTY2LjI2ODg1IEwgMjQzLjg1NTksMTY2LjI2ODg1IEMgMjQzLjgyMDIyLDE2Ni40ODI4OSAyNDMuNjM3MTUsMTY2LjYzODkzIDI0My42MzcxNSwxNjYuODYyNiBDIDI0My42MzcxNSwxNjcuNDM3MzUgMjQzLjc1ODIsMTY3Ljk4OTc0IDI0My45ODA5LDE2OC40ODc2IEMgMjQzLjk4NjkyLDE2OC41MDEwNiAyNDQuMDA1OTksMTY4LjUwNTQ3IDI0NC4wMTIxNSwxNjguNTE4ODUgTCAyNTIuMDc0NjUsMTY4LjUxODg1IEMgMjUyLjA4MDc2LDE2OC41MDU1OCAyNTIuMDk5OTQsMTY4LjUwMDk0IDI1Mi4xMDU5LDE2OC40ODc2IEMgMjUyLjMyODUzLDE2Ny45ODk3NCAyNTIuNDQ5NjUsMTY3LjQzNzM1IDI1Mi40NDk2NSwxNjYuODYyNiBDIDI1Mi40NDk2NSwxNjYuNjM5NzMgMjUyLjI2NjA4LDE2Ni40ODIyOSAyNTIuMjMwOSwxNjYuMjY4ODUgTCAyNDkuMjkzNCwxNjYuMjY4ODUgTCAyNDkuMjkzNCwxNjIuODYyNiBMIDI0OS4yOTM0LDE1OS43MDYzNSBMIDI1MS42OTk2NSwxNTkuNzA2MzUgTCAyNTEuNjk5NjUsMTU3LjQyNTEgTCAyNDkuMjkzNCwxNTcuNDI1MSBMIDI0OS4yOTM0LDE1NS4xNzUxIEwgMjQ2Ljg4NzE1LDE1NS4xNzUxIHogIgotICAgICAgICAgICBpZD0icGF0aDU1NzUiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU3NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2NjY2NjYyIKLSAgICAgICAgICAgZD0iTSAyNDguNDc1LDM0Mi42Nzg3IEMgMjM1LjQ4MywzNDIuNjc4NyAyMjIuNjA2LDMzOS40OTM3IDIxMS43OCwzMzQuMTk2NyBDIDIwMy44LDMzMC4yNDM3IDE5OC41MDksMzIyLjI3MzcgMTk4LjUwOSwzMTMuMTUzNyBMIDE5OC41MDksMjgwLjA4MDcgTCAyOTguMjQ0LDI4MC4wODA3IEwgMjk4LjI0NCwzMTMuMTUzNyBDIDI5OC4yNDQsMzIyLjI3MzcgMjkyLjk1MywzMzAuMjQzNyAyODQuOTcyLDMzNC4xOTY3IEMgMjc0LjE0NywzMzkuNDkzNyAyNjEuNDcxLDM0Mi42Nzg3IDI0OC40NzUsMzQyLjY3ODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU3OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MTQ1OTMwMSIKLSAgICAgICAgICAgZD0iTSAyNDguNDc1LDM0Mi42Nzg3IEMgMjM1LjQ4MywzNDIuNjc4NyAyMjIuNjA2LDMzOS40OTM3IDIxMS43OCwzMzQuMTk2NyBDIDIwMy44LDMzMC4yNDM3IDE5OC41MDksMzIyLjI3MzcgMTk4LjUwOSwzMTMuMTUzNyBMIDE5OC41MDksMjgwLjA4MDcgTCAyOTguMjQ0LDI4MC4wODA3IEwgMjk4LjI0NCwzMTMuMTUzNyBDIDI5OC4yNDQsMzIyLjI3MzcgMjkyLjk1MywzMzAuMjQzNyAyODQuOTcyLDMzNC4xOTY3IEMgMjc0LjE0NywzMzkuNDkzNyAyNjEuNDcxLDM0Mi42Nzg3IDI0OC40NzUsMzQyLjY3ODcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU4MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2NjY2NjYyIKLSAgICAgICAgICAgZD0iTSAyNDguMjYzLDI4MC4wMjQ3IEwgMjk4LjI0LDI4MC4wMjQ3IEwgMjk4LjI0LDIyNC42OTE3IEwgMjQ4LjI2MywyMjQuNjkxNyBMIDI0OC4yNjMsMjgwLjAyNDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU4MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MTQ1OTMwMSIKLSAgICAgICAgICAgZD0iTSAyNDguMjYzLDI4MC4wMjQ3IEwgMjk4LjI0LDI4MC4wMjQ3IEwgMjk4LjI0LDIyNC42OTE3IEwgMjQ4LjI2MywyMjQuNjkxNyBMIDI0OC4yNjMsMjgwLjAyNDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU4NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNDguMywzMTMuMTE0NyBDIDI0OC4zLDMyNi4xODQ3IDIzNy4yMjUsMzM2Ljc3ODcgMjIzLjQyOSwzMzYuNzc4NyBDIDIwOS42MjgsMzM2Ljc3ODcgMTk4LjQ0MiwzMjYuMTg0NyAxOTguNDQyLDMxMy4xMTQ3IEwgMTk4LjQ0MiwyNzkuOTkyNyBMIDI0OC4zLDI3OS45OTI3IEwgMjQ4LjMsMzEzLjExNDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU4NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MTQ1OTMwMSIKLSAgICAgICAgICAgZD0iTSAyMDkuMzM0LDMzMi42NDM3IEMgMjEwLjg5MiwzMzMuNDcwNyAyMTMuMDMyLDMzNC44NDc3IDIxNS4zMTgsMzM1LjM5ODcgTCAyMTUuMTczLDI3OC44MjU3IEwgMjA5LjMzNCwyNzguODI1NyBMIDIwOS4zMzQsMzMyLjY0MzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU4OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC40OTgyODYwMTtzdHJva2UtbGluZWpvaW46cm91bmQiCi0gICAgICAgICAgIGQ9Ik0gMTk4LjM2LDMxMi42Njg3IEMgMTk4LjUxMiwzMTkuNjQ4NyAyMDEuMjgzLDMyNC44Mzc3IDIwNC4wNTQsMzI4LjIzNTcgTCAyMDQuMDU0LDI3OS4xMDA3IEwgMTk4LjQzLDI3OS4xMDA3IEwgMTk4LjM2LDMxMi42Njg3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1OTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjN2I1MDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNTE0NTkzMDEiCi0gICAgICAgICAgIGQ9Ik0gMjIwLjQ1LDMzNi42Mzg3IEMgMjIyLjczNSwzMzYuODY4NyAyMjQuNDM5LDMzNi44MjI3IDIyNi4yODksMzM2LjYzODcgTCAyMjYuMjg5LDI3OC44MjU3IEwgMjIwLjQ1LDI3OC44MjU3IEwgMjIwLjQ1LDMzNi42Mzg3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1OTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNTE0NTkzMDEiCi0gICAgICAgICAgIGQ9Ik0gMjMxLjQyMywzMzUuMzk4NyBDIDIzMy43MDksMzM0LjkzOTcgMjM2LjI4NiwzMzMuNTE2NyAyMzcuNDA4LDMzMi43ODE3IEwgMjM3LjQwOCwyNzguODI1NyBMIDIzMS41NjksMjc4LjgyNTcgTCAyMzEuNDIzLDMzNS4zOTg3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU1OTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMTk4LjQ0NSwyODAuMDI0NyBMIDI0OC4yODEsMjgwLjAyNDcgTCAyNDguMjgxLDIyNC42OTE3IEwgMTk4LjQ0NSwyMjQuNjkxNyBMIDE5OC40NDUsMjgwLjAyNDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTU5NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MTQ1OTMwMSIKLSAgICAgICAgICAgZD0iTSAxOTguNDQ1LDI4MC4wMjQ3IEwgMjQ4LjI4MSwyODAuMDI0NyBMIDI0OC4yODEsMjI0LjY5MTcgTCAxOTguNDQ1LDIyNC42OTE3IEwgMTk4LjQ0NSwyODAuMDI0NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NTk5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjUxNDU5MzAxIgotICAgICAgICAgICBkPSJNIDI0Mi44MzQsMzI3LjY4NDcgQyAyNDUuMjY1LDMyNS41MjY3IDI0Ny41NTEsMzIwLjYxMjcgMjQ4LjM4MiwzMTUuMDEwNyBMIDI0OC41MjcsMjc4LjgyNTcgTCAyNDIuNjg4LDI3OC44MjU3IEwgMjQyLjgzNCwzMjcuNjg0NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjAxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjUxNDU5MzAxIgotICAgICAgICAgICBkPSJNIDI0OC4zLDMxMy4xMTQ3IEMgMjQ4LjMsMzI2LjE4NDcgMjM3LjIyNSwzMzYuNzc4NyAyMjMuNDI5LDMzNi43Nzg3IEMgMjA5LjYyOCwzMzYuNzc4NyAxOTguNDQyLDMyNi4xODQ3IDE5OC40NDIsMzEzLjExNDcgTCAxOTguNDQyLDI3OS45OTI3IEwgMjQ4LjMsMjc5Ljk5MjcgTCAyNDguMywzMTMuMTE0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjAzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojQUQxNTE5O2ZpbGwtb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI5OC4yODksMjc5Ljk5MjcgTCAyOTguMjg5LDMxMy4xMTQ3IEMgMjk4LjI4OSwzMjYuMTg0NyAyODcuMDg4LDMzNi43Nzg3IDI3My4yODcsMzM2Ljc3ODcgQyAyNTkuNDksMzM2Ljc3ODcgMjQ4LjMsMzI2LjE4NDcgMjQ4LjMsMzEzLjExNDcgTCAyNDguMywyNzkuOTkyNyBMIDI5OC4yODksMjc5Ljk5MjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTYwNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MTQ1OTMwMSIKLSAgICAgICAgICAgZD0iTSAyOTguMjg5LDI3OS45OTI3IEwgMjk4LjI4OSwzMTMuMTE0NyBDIDI5OC4yODksMzI2LjE4NDcgMjg3LjA4OCwzMzYuNzc4NyAyNzMuMjg3LDMzNi43Nzg3IEMgMjU5LjQ5LDMzNi43Nzg3IDI0OC4zLDMyNi4xODQ3IDI0OC4zLDMxMy4xMTQ3IEwgMjQ4LjMsMjc5Ljk5MjcgTCAyOTguMjg5LDI3OS45OTI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjU3LjM5MywzMDQuOTkyNyBDIDI1Ny40NzIsMzA1LjE2MTcgMjU3LjUxNywzMDUuMzMxNyAyNTcuNTE3LDMwNS41MTE3IEMgMjU3LjUxNywzMDYuMTIxNyAyNTYuOTk5LDMwNi42MDc3IDI1Ni4zNTQsMzA2LjYwNzcgQyAyNTUuNzEzLDMwNi42MDc3IDI1NS4xOTMsMzA2LjEyMTcgMjU1LjE5MywzMDUuNTExNyBDIDI1NS4xOTMsMzA1LjMzMTcgMjU1LjIzOCwzMDUuMTYxNyAyNTUuMzE5LDMwNS4wMTM3IEwgMjUzLjY5NiwzMDQuOTkyNyBDIDI1My42NjIsMzA1LjE1ODcgMjUzLjY0MywzMDUuMzMxNyAyNTMuNjQzLDMwNS41MTE3IEMgMjUzLjY0MywzMDYuNjYwNyAyNTQuNDM3LDMwNy42MzQ3IDI1NS41MzQsMzA3Ljk2MjcgTCAyNTUuNTMyLDMxMS45NDc3IEwgMjU3LjIzNCwzMTEuOTU3NyBMIDI1Ny4yMzcsMzA3Ljk0NDcgQyAyNTguMDI3LDMwNy42ODc3IDI1OC42NDksMzA3LjA5NDcgMjU4LjkyMSwzMDYuMzM5NyBMIDI2My40OTMsMzA2LjMzOTcgTCAyNjMuNDkzLDMwNC45OTI3IEwgMjU3LjM5MywzMDQuOTkyNyBNIDI3OS44MTgsMzA0Ljk5MjcgTCAyNzkuODE4LDMwNi4zMzk3IEwgMjc1LjcwNywzMDYuMzUwNyBDIDI3NS42NDQsMzA2LjUzMDcgMjc1LjU0MiwzMDYuNjk2NyAyNzUuNDQzLDMwNi44NTQ3IEwgMjgwLjIxNywzMTIuMjc4NyBMIDI3OC45MzYsMzEzLjMxNTcgTCAyNzQuMTg1LDMwNy44ODQ3IEMgMjc0LjA5OCwzMDcuOTEyNyAyNzQuMDU0LDMwNy45NDc3IDI3My45NjEsMzA3Ljk3MjcgTCAyNzMuOTUsMzE2Ljk0NzcgTCAyNzIuMjY3LDMxNi45NDc3IEwgMjcyLjI2MywzMDcuOTMzNyBDIDI3Mi4xOTIsMzA3LjkxNjcgMjcyLjEzMiwzMDcuODgwNyAyNzIuMDY2LDMwNy44NDk3IEwgMjY3LjEyLDMxMy4zMTU3IEwgMjY1LjgzOCwzMTIuMjc4NyBMIDI3MC43ODEsMzA2Ljc5MTcgQyAyNzAuNjk1LDMwNi42NTM3IDI3MC42MzIsMzA2LjUwMjcgMjcwLjU3NiwzMDYuMzM5NyBMIDI2Ni4zMjcsMzA2LjMzOTcgTCAyNjYuMzI3LDMwNC45OTI3IEwgMjc5LjgyMiwzMDQuOTkyNyBMIDI3OS44MTgsMzA0Ljk5MjcgeiBNIDI4Mi41NTYsMzA0Ljk5MjcgTCAyODIuNTU2LDMwNi4zMzk3IEwgMjg3LjEzMiwzMDYuMzM5NyBDIDI4Ny40MDQsMzA3LjA5NDcgMjg4LjAxOSwzMDcuNjg3NyAyODguODE1LDMwNy45NDQ3IEwgMjg4LjgxOCwzMTEuOTU3NyBMIDI5MC41MTcsMzExLjk0NzcgTCAyOTAuNTEzLDMwNy45NjI3IEMgMjkxLjYxMiwzMDcuNjM0NyAyOTIuNDA5LDMwNi42NjA3IDI5Mi40MDksMzA1LjUxMTcgQyAyOTIuNDA5LDMwNS4zMzE3IDI5Mi4zOSwzMDUuMTU4NyAyOTIuMzQ5LDMwNC45OTI3IEwgMjkwLjczMywzMDQuOTkyNyBDIDI5MC44MTEsMzA1LjE2MTcgMjkwLjg1MiwzMDUuMzMxNyAyOTAuODUyLDMwNS41MTE3IEMgMjkwLjg1MiwzMDYuMTIxNyAyOTAuMzM5LDMwNi42MDc3IDI4OS42OTQsMzA2LjYwNzcgQyAyODkuMDU0LDMwNi42MDc3IDI4OC41MzIsMzA2LjEyMTcgMjg4LjUzMiwzMDUuNTExNyBDIDI4OC41MzIsMzA1LjMzMTcgMjg4LjU3NywzMDUuMTYxNyAyODguNjU5LDMwNS4wMTM3IEwgMjgyLjU1NiwzMDQuOTkyNyBNIDI3NS42NDcsMzI3Ljg3NjcgQyAyNzYuOTgxLDMyNy42NjU3IDI3OC4yMSwzMjcuMjk4NyAyNzkuNDI0LDMyNi43ODc3IEwgMjgwLjI1OCwzMjguMjA4NyBDIDI3OC44NjIsMzI4LjgwNzcgMjc3LjM1NywzMjkuMjM4NyAyNzUuNzg5LDMyOS40NzQ3IEMgMjc1LjUyOCwzMzAuNjM0NyAyNzQuNDQ1LDMzMS41MDU3IDI3My4xNDIsMzMxLjUwNTcgQyAyNzEuODQyLDMzMS41MDU3IDI3MC43NTgsMzMwLjY0NTcgMjcwLjQ4OSwzMjkuNDkyNyBDIDI2OC44MzMsMzI5LjI2NjcgMjY3LjI2MiwzMjguODM5NyAyNjUuNzkxLDMyOC4yMDg3IEwgMjY2LjYyOSwzMjYuNzg3NyBDIDI2Ny45MDYsMzI3LjMyNjcgMjY5LjI2OSwzMjcuNjg2NyAyNzAuNjgzLDMyNy44ODM3IEMgMjcwLjk4MiwzMjcuMjM1NyAyNzEuNTI5LDMyNi43MzQ3IDI3Mi4yNDgsMzI2LjUwMTcgTCAyNzIuMjYzLDMxOS41NDM3IEwgMjczLjk0MiwzMTkuNTQzNyBMIDI3My45NTcsMzI2LjQ3NjcgQyAyNzQuNzAyLDMyNi42OTk3IDI3NS4zMzEsMzI3LjIwNjcgMjc1LjY0NCwzMjcuODc2NyBMIDI3NS42NDcsMzI3Ljg3NjcgeiBNIDI2NC4yMzMsMzI1LjU0MjcgTCAyNjMuNDA0LDMyNi45NzA3IEMgMjYxLjk4NCwzMjYuMDg4NyAyNjAuNzE5LDMyNC45OTk3IDI1OS42MzIsMzIzLjc3ODcgQyAyNTguNzY4LDMyNC4wMzI3IDI1Ny43OTIsMzIzLjg4MTcgMjU3LjA1NSwzMjMuMjgxNyBDIDI1NS45MTUsMzIyLjM1NzcgMjU1Ljc3NywzMjAuNzM1NyAyNTYuNzUzLDMxOS42NTk3IEwgMjU2Ljg5NSwzMTkuNTA4NyBDIDI1Ni4yMDgsMzE3Ljk1NjcgMjU1Ljc0MywzMTYuMjg4NyAyNTUuNTg0LDMxNC41Mzk3IEwgMjU3LjI4MiwzMTQuNTQ2NyBDIDI1Ny40MTYsMzE2LjAzODcgMjU3Ljc4OCwzMTcuNDU5NyAyNTguMzY4LDMxOC43OTI3IEMgMjU4Ljg0NiwzMTguNzI1NyAyNTkuMzU2LDMxOC43ODE3IDI1OS44MTQsMzE4Ljk1MTcgTCAyNjQuMDYzLDMxNC4yNTA3IEwgMjY1LjM0MywzMTUuMjgzNyBMIDI2MS4xMjEsMzE5Ljk3NzcgQyAyNjEuNjkxLDMyMC44NDQ3IDI2MS42NjgsMzIxLjk2MjcgMjYxLjAxNywzMjIuODE2NyBDIDI2MS45NTQsMzIzLjg1MzcgMjYzLjAzMSwzMjQuNzc3NyAyNjQuMjMzLDMyNS41NDI3IHogTSAyNTcuOTMzLDMyMC42MTI3IEMgMjU4LjM1MSwzMjAuMTQ2NyAyNTkuMDg0LDMyMC4wOTM3IDI1OS41NzIsMzIwLjQ4ODcgQyAyNjAuMDYsMzIwLjg4MzcgMjYwLjEyLDMyMS41ODE3IDI1OS43MDMsMzIyLjA0MDcgQyAyNTkuMjg0LDMyMi41MDI3IDI1OC41NTIsMzIyLjU1ODcgMjU4LjA2NCwzMjIuMTYzNyBDIDI1Ny41NzYsMzIxLjc2NTcgMjU3LjUxNywzMjEuMDc0NyAyNTcuOTMzLDMyMC42MTI3IHogTSAyNTUuNzkyLDMxNS45NjM3IEwgMjU0LjA0NiwzMTUuNTcyNyBMIDI1My44LDMxMS4xNTA3IEwgMjU1LjUzMiwzMTAuNTc4NyBMIDI1NS41MzQsMzEzLjExNDcgQyAyNTUuNTM0LDMxNC4wOTg3IDI1NS42MjEsMzE1LjAyOTcgMjU1Ljc5MiwzMTUuOTYzNyB6IE0gMjU3LjI0MSwzMTAuNDgwNyBMIDI1OC45OCwzMTAuODg5NyBDIDI1OC45OCwzMTAuODg5NyAyNTkuMDY5LDMxMy43MzE3IDI1OS4wMzIsMzEzLjA5MzcgQyAyNTguOTg3LDMxMi4zNDk3IDI1OS4yMjIsMzE1LjMxNTcgMjU5LjIyMiwzMTUuMzE1NyBMIDI1Ny40NjgsMzE1Ljg5MzcgQyAyNTcuMjkzLDMxNC45OTA3IDI1Ny4yMzQsMzE0LjA2NjcgMjU3LjIzNCwzMTMuMTE0NyBMIDI1Ny4yMzcsMzEwLjQ4MDcgTCAyNTcuMjQxLDMxMC40ODA3IHogTSAyNjIuOTc0LDMyNC42Mjg3IEMgMjY0LjQzOSwzMjUuNzcxNyAyNjYuMTQxLDMyNi42OTk3IDI2Ny45ODEsMzI3LjI4NzcgTCAyNjguMzY4LDMyNS42MDU3IEMgMjY2Ljg1NiwzMjUuMTI5NyAyNjUuNDU1LDMyNC40MzE3IDI2NC4yMjMsMzIzLjUyNTcgTCAyNjIuOTc0LDMyNC42Mjg3IE0gMjYyLjEzMywzMjYuMDgxNyBDIDI2My42MTksMzI3LjE5OTcgMjY1LjMxOCwzMjguMDk1NyAyNjcuMTM5LDMyOC43MTY3IEwgMjY1LjgzOCwzMjkuOTMyNyBDIDI2NC4zNzksMzI5LjM5MzcgMjYzLjAwNiwzMjguNjgxNyAyNjEuNzQ3LDMyNy44MzQ3IEwgMjYyLjEzMywzMjYuMDgxNyBNIDI2NC40MDIsMzE2LjMzNDcgTCAyNjYuMDYzLDMxNy4wMzk3IEwgMjY5LjEwMSwzMTMuNjY4NyBMIDI2OC4xMDMsMzEyLjIzMjcgTCAyNjQuNDAyLDMxNi4zMzQ3IE0gMjYzLjExNCwzMTUuMjkzNyBMIDI2Mi4xMTgsMzEzLjg1MTcgTCAyNjUuMTU4LDMxMC40ODA3IEwgMjY2LjgxNCwzMTEuMTg4NyBMIDI2My4xMTQsMzE1LjI5MzcgTSAyODEuODE4LDMyNS41NDI3IEwgMjgyLjY0OSwzMjYuOTcwNyBDIDI4NC4wNjcsMzI2LjA4ODcgMjg1LjMzNCwzMjQuOTk5NyAyODYuNDIxLDMyMy43Nzg3IEMgMjg3LjI4MSwzMjQuMDMyNyAyODguMjYxLDMyMy44ODE3IDI4OC45OTcsMzIzLjI4MTcgQyAyOTAuMTM3LDMyMi4zNTc3IDI5MC4yNjgsMzIwLjczNTcgMjg5LjI5OCwzMTkuNjU5NyBMIDI4OS4xNTQsMzE5LjUwODcgQyAyODkuODQzLDMxNy45NTY3IDI5MC4zMDksMzE2LjI4ODcgMjkwLjQ2MSwzMTQuNTM5NyBMIDI4OC43NzEsMzE0LjU0NjcgQyAyODguNjM3LDMxNi4wMzg3IDI4OC4yNjEsMzE3LjQ1OTcgMjg3LjY4MywzMTguNzkyNyBDIDI4Ny4yMDMsMzE4LjcyNTcgMjg2LjY5NywzMTguNzgxNyAyODYuMjM1LDMxOC45NTE3IEwgMjgxLjk5LDMxNC4yNTA3IEwgMjgwLjcwOSwzMTUuMjgzNyBMIDI4NC45MjgsMzE5Ljk3NzcgQyAyODQuMzYyLDMyMC44NDQ3IDI4NC4zODQsMzIxLjk2MjcgMjg1LjAzMiwzMjIuODE2NyBDIDI4NC4wOTcsMzIzLjg1MzcgMjgzLjAyMSwzMjQuNzc3NyAyODEuODE4LDMyNS41NDI3IHogTSAyODguMTE1LDMyMC42MTI3IEMgMjg3LjY5OCwzMjAuMTQ2NyAyODYuOTY4LDMyMC4wOTM3IDI4Ni40ODEsMzIwLjQ4ODcgQyAyODUuOTkyLDMyMC44ODM3IDI4NS45MzMsMzIxLjU4MTcgMjg2LjM1LDMyMi4wNDA3IEMgMjg2Ljc2NywzMjIuNTAyNyAyODcuNTAxLDMyMi41NTg3IDI4Ny45ODksMzIyLjE2MzcgQyAyODguNDc3LDMyMS43NjU3IDI4OC41MzIsMzIxLjA3NDcgMjg4LjExNSwzMjAuNjEyNyB6IE0gMjkwLjI1NywzMTUuOTYzNyBMIDI5Mi4wMDMsMzE1LjU3MjcgTCAyOTIuMjQ5LDMxMS4xNTA3IEwgMjkwLjUyMSwzMTAuNTc4NyBMIDI5MC41MTcsMzEzLjExNDcgQyAyOTAuNTE3LDMxNC4wOTg3IDI5MC40MzEsMzE1LjAyOTcgMjkwLjI1NywzMTUuOTYzNyB6IE0gMjg4LjgxMiwzMTAuNDgwNyBMIDI4Ny4wNzMsMzEwLjg4OTcgQyAyODcuMDczLDMxMC44ODk3IDI4Ni45NzksMzEzLjczMTcgMjg3LjAxNywzMTMuMDkzNyBDIDI4Ny4wNjUsMzEyLjM0OTcgMjg2LjgyNywzMTUuMzE1NyAyODYuODI3LDMxNS4zMTU3IEwgMjg4LjU4MSwzMTUuODkzNyBDIDI4OC43NTYsMzE0Ljk5MDcgMjg4LjgxNSwzMTQuMDY2NyAyODguODE1LDMxMy4xMTQ3IEwgMjg4LjgxMiwzMTAuNDgwNyBNIDI4My4wNzcsMzI0LjYyODcgQyAyODEuNjEsMzI1Ljc3MTcgMjc5LjkwNywzMjYuNjk5NyAyNzguMDcyLDMyNy4yODc3IEwgMjc3LjY4NSwzMjUuNjA1NyBDIDI3OS4xOTMsMzI1LjEyOTcgMjgwLjU5NywzMjQuNDMxNyAyODEuODI2LDMyMy41MjU3IEwgMjgzLjA3NywzMjQuNjI4NyBNIDI4My45MTksMzI2LjA4MTcgQyAyODIuNDI4LDMyNy4xOTk3IDI4MC43MzUsMzI4LjA5NTcgMjc4LjkxMywzMjguNzE2NyBMIDI4MC4yMTMsMzI5LjkzMjcgQyAyODEuNjczLDMyOS4zOTM3IDI4My4wNDcsMzI4LjY4MTcgMjg0LjMwNiwzMjcuODM0NyBMIDI4My45MTksMzI2LjA4MTcgTSAyODEuNjUsMzE2LjMzNDcgTCAyNzkuOTksMzE3LjAzOTcgTCAyNzYuOTUxLDMxMy42Njg3IEwgMjc3Ljk0OSwzMTIuMjMyNyBMIDI4MS42NSwzMTYuMzM0NyBNIDI4Mi45MzgsMzE1LjI5MzcgTCAyODMuOTM0LDMxMy44NTE3IEwgMjgwLjg5NSwzMTAuNDgwNyBMIDI3OS4yMzgsMzExLjE4ODcgTCAyODIuOTM4LDMxNS4yOTM3IE0gMjYyLjEzOCwzMDYuMzQzNyBMIDI2Mi42NDgsMzA4LjAwMDcgTCAyNjcuMzI5LDMwOC4wMDA3IEwgMjY3LjgzNCwzMDYuMzQzNyBMIDI2Mi4xMzgsMzA2LjM0MzcgTSAyODQuMDAzLDMwNi4zNDM3IEwgMjgzLjQ5LDMwOC4wMDA3IEwgMjc4LjgxMiwzMDguMDAwNyBMIDI3OC4zMDcsMzA2LjM0MzcgTCAyODQuMDAzLDMwNi4zNDM3IE0gMjcxLjk4LDMyOC45MzQ3IEMgMjcxLjk4LDMyOC4zMjQ3IDI3Mi41MDEsMzI3LjgzMTcgMjczLjE0MiwzMjcuODMxNyBDIDI3My43ODIsMzI3LjgzMTcgMjc0LjI5OSwzMjguMzI0NyAyNzQuMjk5LDMyOC45MzQ3IEMgMjc0LjI5OSwzMjkuNTQxNyAyNzMuNzgyLDMzMC4wMzE3IDI3My4xNDIsMzMwLjAzMTcgQyAyNzIuNTAxLDMzMC4wMzE3IDI3MS45OCwzMjkuNTQxNyAyNzEuOTgsMzI4LjkzNDcgeiBNIDI3My45NSwzMjAuOTE1NyBMIDI3NS42OTYsMzIwLjQyNTcgTCAyNzUuNjk2LDMxNS45OTk3IEwgMjczLjk1LDMxNS41MTk3IEwgMjczLjk1LDMyMC45MTU3IE0gMjcyLjI1NiwzMjAuOTE1NyBMIDI3MC41MTMsMzIwLjQyNTcgTCAyNzAuNTEzLDMxNS45OTk3IEwgMjcyLjI1NiwzMTUuNTE5NyBMIDI3Mi4yNTYsMzIwLjkxNTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTYwOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNTMuNjk2LDMwNS4wMzE3IEMgMjUzLjg5NywzMDQuMTA5NyAyNTQuNjE4LDMwMy4zNjA3IDI1NS41NDcsMzAzLjA4MDcgTCAyNTUuNTM0LDI5Ny42MTU3IEwgMjU3LjIxOSwyOTcuNjE1NyBMIDI1Ny4yMjIsMzAzLjEwOTcgQyAyNTguMDUzLDMwMy4zNzE3IDI1OC42OTMsMzAzLjk4NTcgMjU4Ljk1LDMwNC43Nzc3IEwgMjYzLjQ5MywzMDQuNzg0NyBMIDI2My40OTMsMzA1LjAzMTcgTCAyNTcuMzkzLDMwNS4wMzE3IEMgMjU3LjIwNCwzMDQuNjk1NyAyNTYuODA4LDMwNC40NDU3IDI1Ni4zNTQsMzA0LjQ0NTcgQyAyNTUuOTA0LDMwNC40NDU3IDI1NS41MDksMzA0LjY5NTcgMjU1LjMxOSwzMDUuMDUyNyBMIDI1My42OTYsMzA1LjAzMTcgTSAyNjYuMzIzLDMwNS4wMzE3IEwgMjY2LjMyMywzMDQuNzg0NyBMIDI3MC41NDMsMzA0Ljc4NDcgQyAyNzAuNTkxLDMwNC42NDY3IDI3MC42NTMsMzA0LjUxMjcgMjcwLjcyNSwzMDQuMzg1NyBMIDI2NS41MTksMjk4LjU4MzcgTCAyNjYuNzk5LDI5Ny41NDQ3IEwgMjcxLjkzOSwzMDMuMjUxNyBDIDI3Mi4wMjgsMzAzLjIwODcgMjcyLjEyMiwzMDMuMTY5NyAyNzIuMjE0LDMwMy4xMzc3IEwgMjcyLjIxOCwyOTUuNTM0NyBMIDI3My45MDEsMjk1LjUzNDcgTCAyNzMuOTAxLDMwMy4wOTE3IEMgMjczLjk3NiwzMDMuMTEyNyAyNzQuMDkxLDMwMy4xMzM3IDI3NC4xNjYsMzAzLjE1NTcgTCAyNzkuMTg2LDI5Ny40Mzg3IEwgMjgwLjQ3NywyOTguNDYyNyBMIDI3NS40MzYsMzA0LjE1NTcgQyAyNzUuNTY2LDMwNC4zNDY3IDI3NS42NTUsMzA0LjU1ODcgMjc1LjcyNiwzMDQuNzg0NyBMIDI3OS44MTUsMzA0Ljc4NDcgTCAyNzkuODE1LDMwNS4wMzE3IEwgMjY2LjMxOSwzMDUuMDMxNyBMIDI2Ni4zMjMsMzA1LjAzMTcgeiBNIDI4OC42NTksMzA1LjAzMTcgQyAyODguODQ4LDMwNC42OTU3IDI4OS4yNCwzMDQuNDQ1NyAyODkuNjk0LDMwNC40NDU3IEMgMjkwLjE0OSwzMDQuNDQ1NyAyOTAuNTQsMzA0LjY5NTcgMjkwLjczMywzMDUuMDUyNyBMIDI5Mi4zNDksMzA1LjAzMTcgQyAyOTIuMTQ3LDMwNC4xMDk3IDI5MS40MzMsMzAzLjM2MDcgMjkwLjUwMiwzMDMuMDgwNyBMIDI5MC41MTMsMjk3LjYxODcgTCAyODguODMzLDI5Ny42MTg3IEwgMjg4LjgyNiwzMDMuMTEyNyBDIDI4OCwzMDMuMzc0NyAyODcuMzU5LDMwMy45ODU3IDI4Ny4xMDIsMzA0Ljc3NzcgTCAyODIuNTU2LDMwNC43ODQ3IEwgMjgyLjU1NiwzMDUuMDMxNyBMIDI4OC42NTksMzA1LjAzMTcgTSAyNTcuNDkxLDI4OS41OTg3IEwgMjYzLjc1MywyOTYuNjE4NyBMIDI2NS4wMzUsMjk1LjU3OTcgTCAyNTguNzM4LDI4OC41ODc3IEMgMjU4Ljg2NCwyODguMzk5NyAyNTguOTUzLDI4OC4xOTU3IDI1OS4wMjgsMjg3Ljk3NTcgTCAyNjMuNjA5LDI4Ny45NzU3IEwgMjYzLjYwOSwyODYuMzc4NyBMIDI1OS4wMjUsMjg2LjM3ODcgQyAyNTguNjc0LDI4NS4zNDM3IDI1Ny42NDcsMjg0LjYwMTcgMjU2LjQzNywyODQuNjAxNyBDIDI1NC45NCwyODQuNjAxNyAyNTMuNzIyLDI4NS43NTM3IDI1My43MjIsMjg3LjE3NDcgQyAyNTMuNzIyLDI4OC4zMDE3IDI1NC40ODQsMjg5LjI2MjcgMjU1LjU0OSwyODkuNjA4NyBMIDI1NS41MzksMjk1LjAyNTcgTCAyNTcuMjIyLDI5NS4wMjU3IEwgMjU3LjIyMiwyODkuNjQ0NyBDIDI1Ny4yOTMsMjg5LjYyMzcgMjU3LjQyMywyODkuNjIzNyAyNTcuNDkxLDI4OS41OTg3IHogTSAyOTAuNTMyLDI4OS42MzM3IEwgMjkwLjUxNywyOTUuMDI1NyBMIDI4OC44MzMsMjk1LjAyNTcgTCAyODguODMzLDI4OS42MTI3IEMgMjg4LjcwNCwyODkuNTcyNyAyODguNTc3LDI4OS41MTk3IDI4OC40NTcsMjg5LjQ1OTcgTCAyODIuMjI4LDI5Ni40ODg3IEwgMjgwLjk0LDI5NS40NjM3IEwgMjg3LjI4OCwyODguMjk3NyBDIDI4Ny4yMzYsMjg4LjE5NTcgMjg3LjE4LDI4OC4wODk3IDI4Ny4xNDMsMjg3Ljk3NTcgTCAyODIuNTM3LDI4Ny45NzU3IEwgMjgyLjUzNywyODYuMzc4NyBMIDI4Ny4xMjksMjg2LjM3ODcgQyAyODcuNDgyLDI4NS4zNDM3IDI4OC40OTksMjg0LjYwMTcgMjg5LjcwNSwyODQuNjAxNyBDIDI5MS4yMDIsMjg0LjYwMTcgMjkyLjQyLDI4NS43NTM3IDI5Mi40MiwyODcuMTc0NyBDIDI5Mi40MiwyODguMzI5NyAyOTEuNjM0LDI4OS4zMDQ3IDI5MC41MzIsMjg5LjYzMzcgeiBNIDI3My45MiwyODkuNjEyNyBMIDI3My45MDUsMjkyLjkzMzcgTCAyNzIuMjIyLDI5Mi45MzM3IEwgMjcyLjIyNiwyODkuNjQwNyBDIDI3MS4zODgsMjg5LjM5MjcgMjcwLjcyOCwyODguNzcxNyAyNzAuNDUzLDI4Ny45NzU3IEwgMjY2LjM0NSwyODcuOTc1NyBMIDI2Ni4zNDUsMjg2LjM3ODcgTCAyNzAuNDUzLDI4Ni4zNzg3IEMgMjcwLjgwNywyODUuMzQzNyAyNzEuODE5LDI4NC42MDE3IDI3My4wMjYsMjg0LjYwMTcgQyAyNzQuMjMzLDI4NC42MDE3IDI3NS4yNTMsMjg1LjM0MzcgMjc1LjYwNywyODYuMzc4NyBMIDI3OS43OTYsMjg2LjM3ODcgTCAyNzkuNzk2LDI4Ny45NzU3IEwgMjc1LjU5NiwyODcuOTc1NyBDIDI3NS4zMzEsMjg4Ljc0MjcgMjc0LjcyMSwyODkuMzU0NyAyNzMuOTIsMjg5LjYxMjcgeiBNIDI1NS41NTQsMjkzLjY0MzcgTCAyNTMuODA4LDI5NC4xMzQ3IEwgMjUzLjgwOCwyOTguNTczNyBMIDI1NS41NTQsMjk5LjA1MzcgTCAyNTUuNTU0LDI5My42NDM3IE0gMjU3LjI0OSwyOTMuNjQzNyBMIDI1OC45OTEsMjk0LjEzNDcgTCAyNTguOTkxLDI5OC41NzM3IEwgMjU3LjI0OSwyOTkuMDUzNyBMIDI1Ny4yNDksMjkzLjY0MzcgTSAyODguODE4LDI5My42NDM3IEwgMjg3LjA3NiwyOTQuMTM0NyBMIDI4Ny4wNzYsMjk4LjU3MzcgTCAyODguODE4LDI5OS4wNTM3IEwgMjg4LjgxOCwyOTMuNjQzNyBNIDI5MC41MTMsMjkzLjY0MzcgTCAyOTIuMjYsMjk0LjEzNDcgTCAyOTIuMjYsMjk4LjU3MzcgTCAyOTAuNTEzLDI5OS4wNTM3IEwgMjkwLjUxMywyOTMuNjQzNyBNIDI2NC4wODQsMjk0LjUxOTcgTCAyNjUuNzQ2LDI5My44MTM3IEwgMjY4Ljc4NSwyOTcuMTkxNyBMIDI2Ny43ODcsMjk4LjYzMjcgTCAyNjQuMDg0LDI5NC41MTk3IE0gMjYyLjc5NywyOTUuNTY1NyBMIDI2MS44MDMsMjk3LjAxMTcgTCAyNjQuODQxLDMwMC4zODU3IEwgMjY2LjQ5OCwyOTkuNjc1NyBMIDI2Mi43OTcsMjk1LjU2NTcgTSAyODEuODc4LDI5NC4zODk3IEwgMjgwLjIxMywyOTMuNjk2NyBMIDI3Ny4yMDQsMjk3LjA5OTcgTCAyNzguMjEzLDI5OC41MzA3IEwgMjgxLjg3OCwyOTQuMzg5NyBNIDI4My4xNzQsMjk1LjQyNDcgTCAyODQuMTgyLDI5Ni44NTg3IEwgMjgxLjE3NCwzMDAuMjYxNyBMIDI3OS41MTMsMjk5LjU2NTcgTCAyODMuMTc0LDI5NS40MjQ3IE0gMjYyLjEzOCwzMDQuNzgxNyBMIDI2Mi42NDgsMzAzLjEyMzcgTCAyNjcuMzI5LDMwMy4xMjM3IEwgMjY3LjgzNCwzMDQuNzgxNyBMIDI2Mi4xMzgsMzA0Ljc4MTcgTSAyNTUuMjc1LDI4Ny4xNzc3IEMgMjU1LjI3NSwyODYuNTcwNyAyNTUuNzk2LDI4Ni4wNzU3IDI1Ni40MzcsMjg2LjA3NTcgQyAyNTcuMDc3LDI4Ni4wNzU3IDI1Ny41OTUsMjg2LjU3MDcgMjU3LjU5NSwyODcuMTc3NyBDIDI1Ny41OTUsMjg3Ljc4NTcgMjU3LjA3NywyODguMjc2NyAyNTYuNDM3LDI4OC4yNzY3IEMgMjU1Ljc5NiwyODguMjc2NyAyNTUuMjc1LDI4Ny43ODU3IDI1NS4yNzUsMjg3LjE3NzcgeiBNIDI2Ny43OTQsMjg3Ljk3OTcgTCAyNjcuMjgxLDI4OS42NDA3IEwgMjYyLjYwMywyODkuNjQwNyBMIDI2Mi4wOTcsMjg3Ljk3OTcgTCAyNjcuNzk0LDI4Ny45Nzk3IE0gMjY3Ljc5NCwyODYuMzcxNyBMIDI2Ny4yODEsMjg0LjcxNDcgTCAyNjIuNjAzLDI4NC43MTQ3IEwgMjYyLjA5NywyODYuMzcxNyBMIDI2Ny43OTQsMjg2LjM3MTcgTSAyODQuMDAzLDMwNC43ODE3IEwgMjgzLjQ5LDMwMy4xMjM3IEwgMjc4LjgxMiwzMDMuMTIzNyBMIDI3OC4zMDcsMzA0Ljc4MTcgTCAyODQuMDAzLDMwNC43ODE3IE0gMjg4LjU0NCwyODcuMTc3NyBDIDI4OC41NDQsMjg2LjU3MDcgMjg5LjA2MSwyODYuMDc1NyAyODkuNzA1LDI4Ni4wNzU3IEMgMjkwLjM0NiwyODYuMDc1NyAyOTAuODY0LDI4Ni41NzA3IDI5MC44NjQsMjg3LjE3NzcgQyAyOTAuODY0LDI4Ny43ODU3IDI5MC4zNDYsMjg4LjI3NjcgMjg5LjcwNSwyODguMjc2NyBDIDI4OS4wNjEsMjg4LjI3NjcgMjg4LjU0NCwyODcuNzg1NyAyODguNTQ0LDI4Ny4xNzc3IHogTSAyNzEuODY1LDI4Ny4xNzc3IEMgMjcxLjg2NSwyODYuNTcwNyAyNzIuMzg2LDI4Ni4wNzU3IDI3My4wMjYsMjg2LjA3NTcgQyAyNzMuNjY3LDI4Ni4wNzU3IDI3NC4xODUsMjg2LjU3MDcgMjc0LjE4NSwyODcuMTc3NyBDIDI3NC4xODUsMjg3Ljc4NTcgMjczLjY2NywyODguMjc2NyAyNzMuMDI2LDI4OC4yNzY3IEMgMjcyLjM4NiwyODguMjc2NyAyNzEuODY1LDI4Ny43ODU3IDI3MS44NjUsMjg3LjE3NzcgeiBNIDI3OC4zNDcsMjg3Ljk3OTcgTCAyNzguODYyLDI4OS42NDA3IEwgMjgzLjUzOCwyODkuNjQwNyBMIDI4NC4wNDUsMjg3Ljk3OTcgTCAyNzguMzQ3LDI4Ny45Nzk3IE0gMjc4LjM0NywyODYuMzcxNyBMIDI3OC44NjIsMjg0LjcxNDcgTCAyODMuNTM4LDI4NC43MTQ3IEwgMjg0LjA0NSwyODYuMzcxNyBMIDI3OC4zNDcsMjg2LjM3MTcgTSAyNzIuMjM3LDI5MS41NTU3IEwgMjcwLjQ5NCwyOTIuMDQ2NyBMIDI3MC40OTQsMjk2LjQ4NDcgTCAyNzIuMjM3LDI5Ni45NjU3IEwgMjcyLjIzNywyOTEuNTU1NyBNIDI3My45MTMsMjkxLjU1NTcgTCAyNzUuNjU1LDI5Mi4wNDY3IEwgMjc1LjY1NSwyOTYuNDg0NyBMIDI3My45MTMsMjk2Ljk2NTcgTCAyNzMuOTEzLDI5MS41NTU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiNjOGIxMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI3NS42NDcsMzI3Ljg3NjcgQyAyNzYuOTgxLDMyNy42NjU3IDI3OC4yMSwzMjcuMjk4NyAyNzkuNDI0LDMyNi43ODc3IEwgMjgwLjI1OCwzMjguMjA4NyBDIDI3OC44NjIsMzI4LjgwNzcgMjc3LjM1NywzMjkuMjM4NyAyNzUuNzg5LDMyOS40NzQ3IEMgMjc1LjUyOCwzMzAuNjM0NyAyNzQuNDQ1LDMzMS41MDU3IDI3My4xNDIsMzMxLjUwNTcgQyAyNzEuODQyLDMzMS41MDU3IDI3MC43NTgsMzMwLjY0NTcgMjcwLjQ4OSwzMjkuNDkyNyBDIDI2OC44MzMsMzI5LjI2NjcgMjY3LjI2MiwzMjguODM5NyAyNjUuNzkxLDMyOC4yMDg3IEwgMjY2LjYyOSwzMjYuNzg3NyBDIDI2Ny45MDYsMzI3LjMyNjcgMjY5LjI2OSwzMjcuNjg2NyAyNzAuNjgzLDMyNy44ODM3IEMgMjcwLjk4MiwzMjcuMjM1NyAyNzEuNTI5LDMyNi43MzQ3IDI3Mi4yNDgsMzI2LjUwMTcgTCAyNzIuMjYzLDMxOS41NDM3IEwgMjczLjk0MiwzMTkuNTQzNyBMIDI3My45NTcsMzI2LjQ3NjcgQyAyNzQuNzAyLDMyNi42OTk3IDI3NS4zMzEsMzI3LjIwNjcgMjc1LjY0NCwzMjcuODc2NyBMIDI3NS42NDcsMzI3Ljg3NjcgeiBNIDI3MC43NzcsMzA2Ljc5NDcgQyAyNzAuNjkyLDMwNi42NTM3IDI3MC42MjgsMzA2LjUwMjcgMjcwLjU3MiwzMDYuMzM5NyBMIDI2Ni4zMjMsMzA2LjMzOTcgTCAyNjYuMzIzLDMwNC43NDU3IEwgMjcwLjU0MywzMDQuNzQ1NyBDIDI3MC41OTEsMzA0LjYxMTcgMjcwLjY1OCwzMDQuNDc3NyAyNzAuNzI4LDMwNC4zNTA3IEwgMjY1LjUxOSwyOTguNTU2NyBMIDI2Ni43OTksMjk3LjUxOTcgTCAyNzEuOTQzLDMwMy4yMTU3IEMgMjcyLjAzMiwzMDMuMTcyNyAyNzIuMTIyLDMwMy4xMzQ3IDI3Mi4yMTgsMzAzLjEwMjcgTCAyNzIuMjIyLDI5NS41MTM3IEwgMjczLjkwMSwyOTUuNTEzNyBMIDI3My45MDEsMzAzLjA1NjcgQyAyNzMuOTc2LDMwMy4wNzc3IDI3NC4wOTEsMzAzLjA5ODcgMjc0LjE2NiwzMDMuMTIzNyBMIDI3OS4xODYsMjk3LjQxMzcgTCAyODAuNDc3LDI5OC40NDA3IEwgMjc1LjQzNiwzMDQuMTE4NyBDIDI3NS41NjYsMzA0LjMwODcgMjc1LjY1NSwzMDQuNTIwNyAyNzUuNzI2LDMwNC43NDU3IEwgMjc5LjgxNSwzMDQuNzQ1NyBMIDI3OS44MTUsMzA2LjMzOTcgTCAyNzUuNzAzLDMwNi4zNTA3IEMgMjc1LjY0NCwzMDYuNTMwNyAyNzUuNTQsMzA2LjY5NjcgMjc1LjQ0MywzMDYuODU0NyBMIDI4MC4yMTcsMzEyLjI4MjcgTCAyNzguOTM2LDMxMy4zMTk3IEwgMjc0LjE4NSwzMDcuODg0NyBDIDI3NC4wOTgsMzA3LjkxNjcgMjc0LjA1NCwzMDcuOTUxNyAyNzMuOTU3LDMwNy45NzY3IEwgMjczLjk0NiwzMTYuOTUxNyBMIDI3Mi4yNjMsMzE2Ljk1MTcgTCAyNzIuMjU4LDMwNy45Mzc3IEMgMjcyLjE4OCwzMDcuOTE2NyAyNzIuMTI5LDMwNy44ODA3IDI3Mi4wNjIsMzA3Ljg0OTcgTCAyNjcuMTE2LDMxMy4zMTk3IEwgMjY1LjgzNiwzMTIuMjgyNyBMIDI3MC43NzcsMzA2Ljc5NDcgTSAyNTcuNDkxLDI4OS41ODg3IEwgMjYzLjc1MywyOTYuNTk1NyBMIDI2NS4wMzUsMjk1LjU1ODcgTCAyNTguNzM4LDI4OC41Nzk3IEMgMjU4Ljg2NCwyODguMzkyNyAyNTguOTUzLDI4OC4xODg3IDI1OS4wMjgsMjg3Ljk2OTcgTCAyNjMuNjA5LDI4Ny45Njk3IEwgMjYzLjYwOSwyODYuMzc1NyBMIDI1OS4wMjUsMjg2LjM3NTcgQyAyNTguNjc0LDI4NS4zNDI3IDI1Ny42NDcsMjg0LjYwMTcgMjU2LjQzNywyODQuNjAxNyBDIDI1NC45NCwyODQuNjAxNyAyNTMuNzIyLDI4NS43NTE3IDI1My43MjIsMjg3LjE2OTcgQyAyNTMuNzIyLDI4OC4yOTQ3IDI1NC40ODQsMjg5LjI1MzcgMjU1LjU0OSwyODkuNTk4NyBMIDI1NS41MzksMjk1LjAwNTcgTCAyNTcuMjIyLDI5NS4wMDU3IEwgMjU3LjIyMiwyODkuNjM0NyBDIDI1Ny4yOTMsMjg5LjYxMzcgMjU3LjQyMywyODkuNjEzNyAyNTcuNDkxLDI4OS41ODg3IHogTSAyNjQuMjMzLDMyNS41NDI3IEwgMjYzLjQwNCwzMjYuOTcwNyBDIDI2MS45ODQsMzI2LjA4ODcgMjYwLjcxOSwzMjQuOTk5NyAyNTkuNjMyLDMyMy43Nzg3IEMgMjU4Ljc2OCwzMjQuMDMyNyAyNTcuNzkyLDMyMy44ODE3IDI1Ny4wNTUsMzIzLjI4MTcgQyAyNTUuOTE1LDMyMi4zNTc3IDI1NS43NzcsMzIwLjczNTcgMjU2Ljc1MywzMTkuNjU5NyBMIDI1Ni44OTUsMzE5LjUwODcgQyAyNTYuMjA4LDMxNy45NTY3IDI1NS43NDMsMzE2LjI4ODcgMjU1LjU4NCwzMTQuNTM5NyBMIDI1Ny4yODIsMzE0LjU0NjcgQyAyNTcuNDE2LDMxNi4wMzg3IDI1Ny43ODgsMzE3LjQ1OTcgMjU4LjM2OCwzMTguNzkyNyBDIDI1OC44NDYsMzE4LjcyNTcgMjU5LjM1NiwzMTguNzgxNyAyNTkuODE0LDMxOC45NTE3IEwgMjY0LjA2MywzMTQuMjUwNyBMIDI2NS4zNDMsMzE1LjI4MzcgTCAyNjEuMTIxLDMxOS45Nzc3IEMgMjYxLjY5MSwzMjAuODQ0NyAyNjEuNjY4LDMyMS45NjI3IDI2MS4wMTcsMzIyLjgxNjcgQyAyNjEuOTU0LDMyMy44NTM3IDI2My4wMzEsMzI0Ljc3NzcgMjY0LjIzMywzMjUuNTQyNyB6IE0gMjU1LjUzMiwzMTEuOTQ3NyBMIDI1NS41MzQsMzA3Ljk2MjcgQyAyNTQuNDM3LDMwNy42Mzc3IDI1My42NCwzMDYuNjYwNyAyNTMuNjQsMzA1LjUxMTcgQyAyNTMuNjQsMzA0LjM2NDcgMjU0LjQ0OCwzMDMuMzc3NyAyNTUuNTQ3LDMwMy4wNDU3IEwgMjU1LjUzNCwyOTcuNTkzNyBMIDI1Ny4yMTksMjk3LjU5MzcgTCAyNTcuMjIyLDMwMy4wNzc3IEMgMjU4LjA1MywzMDMuMzM4NyAyNTguNjkzLDMwMy45NDg3IDI1OC45NSwzMDQuNzM4NyBMIDI2My40OTMsMzA0Ljc0NTcgTCAyNjMuNDkzLDMwNi4zMzk3IEwgMjU4LjkyMSwzMDYuMzM5NyBDIDI1OC42NDksMzA3LjA5NDcgMjU4LjAyNywzMDcuNjg3NyAyNTcuMjM3LDMwNy45NDQ3IEwgMjU3LjIzNCwzMTEuOTU3NyBMIDI1NS41MzIsMzExLjk0NzcgTSAyNTcuOTMzLDMyMC42MTI3IEMgMjU4LjM1MSwzMjAuMTQ2NyAyNTkuMDg0LDMyMC4wOTM3IDI1OS41NzIsMzIwLjQ4ODcgQyAyNjAuMDYsMzIwLjg4MzcgMjYwLjEyLDMyMS41ODE3IDI1OS43MDMsMzIyLjA0MDcgQyAyNTkuMjg0LDMyMi41MDI3IDI1OC41NTIsMzIyLjU1ODcgMjU4LjA2NCwzMjIuMTYzNyBDIDI1Ny41NzYsMzIxLjc2NTcgMjU3LjUxNywzMjEuMDc0NyAyNTcuOTMzLDMyMC42MTI3IHogTSAyNTUuNzkyLDMxNS45NjM3IEwgMjU0LjA0NiwzMTUuNTcyNyBMIDI1My44LDMxMS4xNTA3IEwgMjU1LjUzMiwzMTAuNTc4NyBMIDI1NS41MzQsMzEzLjExNDcgQyAyNTUuNTM0LDMxNC4wOTg3IDI1NS42MjEsMzE1LjAyOTcgMjU1Ljc5MiwzMTUuOTYzNyB6IE0gMjU3LjI0MSwzMTAuNDgwNyBMIDI1OC45OCwzMTAuODg5NyBDIDI1OC45OCwzMTAuODg5NyAyNTkuMDY5LDMxMy43MzE3IDI1OS4wMzIsMzEzLjA5MzcgQyAyNTguOTg3LDMxMi4zNDk3IDI1OS4yMjIsMzE1LjMxNTcgMjU5LjIyMiwzMTUuMzE1NyBMIDI1Ny40NjgsMzE1Ljg5MzcgQyAyNTcuMjkzLDMxNC45OTA3IDI1Ny4yMzQsMzE0LjA2NjcgMjU3LjIzNCwzMTMuMTE0NyBMIDI1Ny4yMzcsMzEwLjQ4MDcgTCAyNTcuMjQxLDMxMC40ODA3IHogTSAyNjIuOTc0LDMyNC42Mjg3IEMgMjY0LjQzOSwzMjUuNzcxNyAyNjYuMTQxLDMyNi42OTk3IDI2Ny45ODEsMzI3LjI4NzcgTCAyNjguMzY4LDMyNS42MDU3IEMgMjY2Ljg1NiwzMjUuMTI5NyAyNjUuNDU1LDMyNC40MzE3IDI2NC4yMjMsMzIzLjUyNTcgTCAyNjIuOTc0LDMyNC42Mjg3IE0gMjYyLjEzMywzMjYuMDgxNyBDIDI2My42MTksMzI3LjE5OTcgMjY1LjMxOCwzMjguMDk1NyAyNjcuMTM5LDMyOC43MTY3IEwgMjY1LjgzOCwzMjkuOTMyNyBDIDI2NC4zNzksMzI5LjM5MzcgMjYzLjAwNiwzMjguNjgxNyAyNjEuNzQ3LDMyNy44MzQ3IEwgMjYyLjEzMywzMjYuMDgxNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjEzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojYzhiMTAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyNjQuNDAyLDMxNi4zMzQ3IEwgMjY2LjA2MywzMTcuMDM5NyBMIDI2OS4xMDEsMzEzLjY2ODcgTCAyNjguMTAzLDMxMi4yMzI3IEwgMjY0LjQwMiwzMTYuMzM0NyBNIDI2My4xMTQsMzE1LjI5MzcgTCAyNjIuMTE4LDMxMy44NTE3IEwgMjY1LjE1OCwzMTAuNDgwNyBMIDI2Ni44MTQsMzExLjE4ODcgTCAyNjMuMTE0LDMxNS4yOTM3IE0gMjU1LjE5MywzMDUuNTExNyBDIDI1NS4xOTMsMzA0LjkwMDcgMjU1LjcxMywzMDQuNDA3NyAyNTYuMzU0LDMwNC40MDc3IEMgMjU2Ljk5NSwzMDQuNDA3NyAyNTcuNTEzLDMwNC45MDA3IDI1Ny41MTMsMzA1LjUxMTcgQyAyNTcuNTEzLDMwNi4xMjE3IDI1Ni45OTUsMzA2LjYwNzcgMjU2LjM1NCwzMDYuNjA3NyBDIDI1NS43MTMsMzA2LjYwNzcgMjU1LjE5MywzMDYuMTIxNyAyNTUuMTkzLDMwNS41MTE3IHogTSAyODEuODE4LDMyNS41NDI3IEwgMjgyLjY0OSwzMjYuOTcwNyBDIDI4NC4wNjcsMzI2LjA4ODcgMjg1LjMzNCwzMjQuOTk5NyAyODYuNDIxLDMyMy43Nzg3IEMgMjg3LjI4MSwzMjQuMDMyNyAyODguMjYxLDMyMy44ODE3IDI4OC45OTcsMzIzLjI4MTcgQyAyOTAuMTM3LDMyMi4zNTc3IDI5MC4yNjgsMzIwLjczNTcgMjg5LjI5OCwzMTkuNjU5NyBMIDI4OS4xNTQsMzE5LjUwODcgQyAyODkuODQzLDMxNy45NTY3IDI5MC4zMDksMzE2LjI4ODcgMjkwLjQ2MSwzMTQuNTM5NyBMIDI4OC43NzEsMzE0LjU0NjcgQyAyODguNjM3LDMxNi4wMzg3IDI4OC4yNjEsMzE3LjQ1OTcgMjg3LjY4MywzMTguNzkyNyBDIDI4Ny4yMDMsMzE4LjcyNTcgMjg2LjY5NywzMTguNzgxNyAyODYuMjM1LDMxOC45NTE3IEwgMjgxLjk5LDMxNC4yNTA3IEwgMjgwLjcwOSwzMTUuMjgzNyBMIDI4NC45MjgsMzE5Ljk3NzcgQyAyODQuMzYyLDMyMC44NDQ3IDI4NC4zODQsMzIxLjk2MjcgMjg1LjAzMiwzMjIuODE2NyBDIDI4NC4wOTcsMzIzLjg1MzcgMjgzLjAyMSwzMjQuNzc3NyAyODEuODE4LDMyNS41NDI3IHogTSAyOTAuNTIxLDMxMS45NDc3IEwgMjkwLjUxNywzMDcuOTYyNyBDIDI5MS42MTYsMzA3LjYzNzcgMjkyLjQxMiwzMDYuNjYwNyAyOTIuNDEyLDMwNS41MTE3IEMgMjkyLjQxMiwzMDQuMzY0NyAyOTEuNjA1LDMwMy4zNzc3IDI5MC41MDYsMzAzLjA0NTcgTCAyOTAuNTE3LDI5Ny41OTM3IEwgMjg4LjgzMywyOTcuNTkzNyBMIDI4OC44MjYsMzAzLjA3NzcgQyAyODgsMzAzLjMzODcgMjg3LjM1OSwzMDMuOTQ4NyAyODcuMTAyLDMwNC43Mzg3IEwgMjgyLjU1NiwzMDQuNzQ1NyBMIDI4Mi41NTYsMzA2LjMzOTcgTCAyODcuMTMyLDMwNi4zMzk3IEMgMjg3LjQwNCwzMDcuMDk0NyAyODguMDE5LDMwNy42ODc3IDI4OC44MTUsMzA3Ljk0NDcgTCAyODguODE4LDMxMS45NTc3IEwgMjkwLjUxNywzMTEuOTQ3NyBMIDI5MC41MjEsMzExLjk0NzcgeiBNIDI4OC4xMTUsMzIwLjYxMjcgQyAyODcuNjk4LDMyMC4xNDY3IDI4Ni45NjgsMzIwLjA5MzcgMjg2LjQ4MSwzMjAuNDg4NyBDIDI4NS45OTIsMzIwLjg4MzcgMjg1LjkzMywzMjEuNTgxNyAyODYuMzUsMzIyLjA0MDcgQyAyODYuNzY3LDMyMi41MDI3IDI4Ny41MDEsMzIyLjU1ODcgMjg3Ljk4OSwzMjIuMTYzNyBDIDI4OC40NzcsMzIxLjc2NTcgMjg4LjUzMiwzMjEuMDc0NyAyODguMTE1LDMyMC42MTI3IHogTSAyOTAuMjU3LDMxNS45NjM3IEwgMjkyLjAwMywzMTUuNTcyNyBMIDI5Mi4yNDksMzExLjE1MDcgTCAyOTAuNTIxLDMxMC41Nzg3IEwgMjkwLjUxNywzMTMuMTE0NyBDIDI5MC41MTcsMzE0LjA5ODcgMjkwLjQzMSwzMTUuMDI5NyAyOTAuMjU3LDMxNS45NjM3IHogTSAyODguODEyLDMxMC40ODA3IEwgMjg3LjA3MywzMTAuODg5NyBDIDI4Ny4wNzMsMzEwLjg4OTcgMjg2Ljk3OSwzMTMuNzMxNyAyODcuMDE3LDMxMy4wOTM3IEMgMjg3LjA2NSwzMTIuMzQ5NyAyODYuODI3LDMxNS4zMTU3IDI4Ni44MjcsMzE1LjMxNTcgTCAyODguNTgxLDMxNS44OTM3IEMgMjg4Ljc1NiwzMTQuOTkwNyAyODguODE1LDMxNC4wNjY3IDI4OC44MTUsMzEzLjExNDcgTCAyODguODEyLDMxMC40ODA3IE0gMjkwLjUzMiwyODkuNjIzNyBMIDI5MC41MTcsMjk1LjAwNTcgTCAyODguODMzLDI5NS4wMDU3IEwgMjg4LjgzMywyODkuNjAyNyBDIDI4OC43MDQsMjg5LjU2MzcgMjg4LjU3NywyODkuNTEwNyAyODguNDU3LDI4OS40NTA3IEwgMjgyLjIyOCwyOTYuNDY1NyBMIDI4MC45NCwyOTUuNDQyNyBMIDI4Ny4yODgsMjg4LjI5MDcgQyAyODcuMjM2LDI4OC4xODg3IDI4Ny4xOCwyODguMDgyNyAyODcuMTQzLDI4Ny45Njk3IEwgMjgyLjUzNywyODcuOTY5NyBMIDI4Mi41MzcsMjg2LjM3NTcgTCAyODcuMTI5LDI4Ni4zNzU3IEMgMjg3LjQ4MiwyODUuMzQyNyAyODguNDk5LDI4NC42MDE3IDI4OS43MDUsMjg0LjYwMTcgQyAyOTEuMjAyLDI4NC42MDE3IDI5Mi40MiwyODUuNzUxNyAyOTIuNDIsMjg3LjE2OTcgQyAyOTIuNDIsMjg4LjMyMjcgMjkxLjYzNCwyODkuMjk1NyAyOTAuNTMyLDI4OS42MjM3IHogTSAyNzMuOTIsMjg5LjYwMjcgTCAyNzMuOTA1LDI5Mi45MTc3IEwgMjcyLjIyMiwyOTIuOTE3NyBMIDI3Mi4yMjYsMjg5LjYzMDcgQyAyNzEuMzg4LDI4OS4zODM3IDI3MC43MjgsMjg4Ljc2MzcgMjcwLjQ1MywyODcuOTY5NyBMIDI2Ni4zNDUsMjg3Ljk2OTcgTCAyNjYuMzQ1LDI4Ni4zNzU3IEwgMjcwLjQ1MywyODYuMzc1NyBDIDI3MC44MDcsMjg1LjM0MjcgMjcxLjgxOSwyODQuNjAxNyAyNzMuMDI2LDI4NC42MDE3IEMgMjc0LjIzMywyODQuNjAxNyAyNzUuMjUzLDI4NS4zNDI3IDI3NS42MDcsMjg2LjM3NTcgTCAyNzkuNzk2LDI4Ni4zNzU3IEwgMjc5Ljc5NiwyODcuOTY5NyBMIDI3NS41OTYsMjg3Ljk2OTcgQyAyNzUuMzMxLDI4OC43MzQ3IDI3NC43MjEsMjg5LjM0NTcgMjczLjkyLDI4OS42MDI3IHogTSAyODMuMDc3LDMyNC42Mjg3IEMgMjgxLjYxLDMyNS43NzE3IDI3OS45MDcsMzI2LjY5OTcgMjc4LjA3MiwzMjcuMjg3NyBMIDI3Ny42ODUsMzI1LjYwNTcgQyAyNzkuMTkzLDMyNS4xMjk3IDI4MC41OTcsMzI0LjQzMTcgMjgxLjgyNiwzMjMuNTI1NyBMIDI4My4wNzcsMzI0LjYyODcgTSAyODMuOTE5LDMyNi4wODE3IEMgMjgyLjQyOCwzMjcuMTk5NyAyODAuNzM1LDMyOC4wOTU3IDI3OC45MTMsMzI4LjcxNjcgTCAyODAuMjEzLDMyOS45MzI3IEMgMjgxLjY3MywzMjkuMzkzNyAyODMuMDQ3LDMyOC42ODE3IDI4NC4zMDYsMzI3LjgzNDcgTCAyODMuOTE5LDMyNi4wODE3IE0gMjU1LjU1NCwyOTMuNjI2NyBMIDI1My44MDgsMjk0LjExNjcgTCAyNTMuODA4LDI5OC41NDY3IEwgMjU1LjU1NCwyOTkuMDI1NyBMIDI1NS41NTQsMjkzLjYyNjcgTSAyNTcuMjQ5LDI5My42MjY3IEwgMjU4Ljk5MSwyOTQuMTE2NyBMIDI1OC45OTEsMjk4LjU0NjcgTCAyNTcuMjQ5LDI5OS4wMjU3IEwgMjU3LjI0OSwyOTMuNjI2NyBNIDI4OC44MTgsMjkzLjYyNjcgTCAyODcuMDc2LDI5NC4xMTY3IEwgMjg3LjA3NiwyOTguNTQ2NyBMIDI4OC44MTgsMjk5LjAyNTcgTCAyODguODE4LDI5My42MjY3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiNjOGIxMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI5MC41MTMsMjkzLjYyNjcgTCAyOTIuMjYsMjk0LjExNjcgTCAyOTIuMjYsMjk4LjU0NjcgTCAyOTAuNTEzLDI5OS4wMjU3IEwgMjkwLjUxMywyOTMuNjI2NyBNIDI4MS42NSwzMTYuMzM0NyBMIDI3OS45OSwzMTcuMDM5NyBMIDI3Ni45NTEsMzEzLjY2ODcgTCAyNzcuOTQ5LDMxMi4yMzI3IEwgMjgxLjY1LDMxNi4zMzQ3IE0gMjgyLjkzOCwzMTUuMjkzNyBMIDI4My45MzQsMzEzLjg1MTcgTCAyODAuODk1LDMxMC40ODA3IEwgMjc5LjIzOCwzMTEuMTg4NyBMIDI4Mi45MzgsMzE1LjI5MzcgTSAyNjQuMDg0LDI5NC41MDA3IEwgMjY1Ljc0NiwyOTMuNzk1NyBMIDI2OC43ODUsMjk3LjE2NzcgTCAyNjcuNzg3LDI5OC42MDU3IEwgMjY0LjA4NCwyOTQuNTAwNyBNIDI2Mi43OTcsMjk1LjU0NDcgTCAyNjEuODAzLDI5Ni45ODc3IEwgMjY0Ljg0MSwzMDAuMzU1NyBMIDI2Ni40OTgsMjk5LjY0NjcgTCAyNjIuNzk3LDI5NS41NDQ3IE0gMjgxLjg3OCwyOTQuMzcwNyBMIDI4MC4yMTMsMjkzLjY3OTcgTCAyNzcuMjA0LDI5Ny4wNzU3IEwgMjc4LjIxMywyOTguNTAzNyBMIDI4MS44NzgsMjk0LjM3MDcgTSAyODMuMTc0LDI5NS40MDM3IEwgMjg0LjE4MiwyOTYuODM1NyBMIDI4MS4xNzQsMzAwLjIzMTcgTCAyNzkuNTEzLDI5OS41MzY3IEwgMjgzLjE3NCwyOTUuNDAzNyBNIDI2Mi4xMzgsMzA0Ljc0MjcgTCAyNjIuNjQ4LDMwMy4wODg3IEwgMjY3LjMyOSwzMDMuMDg4NyBMIDI2Ny44MzQsMzA0Ljc0MjcgTCAyNjIuMTM4LDMwNC43NDI3IE0gMjYyLjEzOCwzMDYuMzQzNyBMIDI2Mi42NDgsMzA4LjAwMDcgTCAyNjcuMzI5LDMwOC4wMDA3IEwgMjY3LjgzNCwzMDYuMzQzNyBMIDI2Mi4xMzgsMzA2LjM0MzcgTSAyNTUuMjc1LDI4Ny4xNzI3IEMgMjU1LjI3NSwyODYuNTY2NyAyNTUuNzk2LDI4Ni4wNzI3IDI1Ni40MzcsMjg2LjA3MjcgQyAyNTcuMDc3LDI4Ni4wNzI3IDI1Ny41OTUsMjg2LjU2NjcgMjU3LjU5NSwyODcuMTcyNyBDIDI1Ny41OTUsMjg3Ljc3OTcgMjU3LjA3NywyODguMjY5NyAyNTYuNDM3LDI4OC4yNjk3IEMgMjU1Ljc5NiwyODguMjY5NyAyNTUuMjc1LDI4Ny43Nzk3IDI1NS4yNzUsMjg3LjE3MjcgeiBNIDI2Ny43OTQsMjg3Ljk3MzcgTCAyNjcuMjgxLDI4OS42MzA3IEwgMjYyLjYwMywyODkuNjMwNyBMIDI2Mi4wOTcsMjg3Ljk3MzcgTCAyNjcuNzk0LDI4Ny45NzM3IE0gMjY3Ljc5NCwyODYuMzY4NyBMIDI2Ny4yODEsMjg0LjcxNDcgTCAyNjIuNjAzLDI4NC43MTQ3IEwgMjYyLjA5NywyODYuMzY4NyBMIDI2Ny43OTQsMjg2LjM2ODcgTSAyODguNTMyLDMwNS41MTE3IEMgMjg4LjUzMiwzMDQuOTAwNyAyODkuMDU0LDMwNC40MDc3IDI4OS42OTQsMzA0LjQwNzcgQyAyOTAuMzM5LDMwNC40MDc3IDI5MC44NTIsMzA0LjkwMDcgMjkwLjg1MiwzMDUuNTExNyBDIDI5MC44NTIsMzA2LjEyMTcgMjkwLjMzOSwzMDYuNjA3NyAyODkuNjk0LDMwNi42MDc3IEMgMjg5LjA1NCwzMDYuNjA3NyAyODguNTMyLDMwNi4xMjE3IDI4OC41MzIsMzA1LjUxMTcgeiBNIDI4NC4wMDMsMzA0Ljc0MjcgTCAyODMuNDksMzAzLjA4ODcgTCAyNzguODEyLDMwMy4wODg3IEwgMjc4LjMwNywzMDQuNzQyNyBMIDI4NC4wMDMsMzA0Ljc0MjcgTSAyODQuMDAzLDMwNi4zNDM3IEwgMjgzLjQ5LDMwOC4wMDA3IEwgMjc4LjgxMiwzMDguMDAwNyBMIDI3OC4zMDcsMzA2LjM0MzcgTCAyODQuMDAzLDMwNi4zNDM3IE0gMjcxLjk4LDMyOC45MzQ3IEMgMjcxLjk4LDMyOC4zMjQ3IDI3Mi41MDEsMzI3LjgzMTcgMjczLjE0MiwzMjcuODMxNyBDIDI3My43ODIsMzI3LjgzMTcgMjc0LjI5OSwzMjguMzI0NyAyNzQuMjk5LDMyOC45MzQ3IEMgMjc0LjI5OSwzMjkuNTQxNyAyNzMuNzgyLDMzMC4wMzE3IDI3My4xNDIsMzMwLjAzMTcgQyAyNzIuNTAxLDMzMC4wMzE3IDI3MS45OCwzMjkuNTQxNyAyNzEuOTgsMzI4LjkzNDcgeiBNIDI3My45NSwzMjAuOTE1NyBMIDI3NS42OTYsMzIwLjQyNTcgTCAyNzUuNjk2LDMxNS45OTk3IEwgMjczLjk1LDMxNS41MTk3IEwgMjczLjk1LDMyMC45MTU3IE0gMjcyLjI1NiwzMjAuOTE1NyBMIDI3MC41MTMsMzIwLjQyNTcgTCAyNzAuNTEzLDMxNS45OTk3IEwgMjcyLjI1NiwzMTUuNTE5NyBMIDI3Mi4yNTYsMzIwLjkxNTcgTSAyODguNTQ0LDI4Ny4xNzI3IEMgMjg4LjU0NCwyODYuNTY2NyAyODkuMDYxLDI4Ni4wNzI3IDI4OS43MDUsMjg2LjA3MjcgQyAyOTAuMzQ2LDI4Ni4wNzI3IDI5MC44NjQsMjg2LjU2NjcgMjkwLjg2NCwyODcuMTcyNyBDIDI5MC44NjQsMjg3Ljc3OTcgMjkwLjM0NiwyODguMjY5NyAyODkuNzA1LDI4OC4yNjk3IEMgMjg5LjA2MSwyODguMjY5NyAyODguNTQ0LDI4Ny43Nzk3IDI4OC41NDQsMjg3LjE3MjcgeiBNIDI3MS44NjUsMjg3LjE3MjcgQyAyNzEuODY1LDI4Ni41NjY3IDI3Mi4zODYsMjg2LjA3MjcgMjczLjAyNiwyODYuMDcyNyBDIDI3My42NjcsMjg2LjA3MjcgMjc0LjE4NSwyODYuNTY2NyAyNzQuMTg1LDI4Ny4xNzI3IEMgMjc0LjE4NSwyODcuNzc5NyAyNzMuNjY3LDI4OC4yNjk3IDI3My4wMjYsMjg4LjI2OTcgQyAyNzIuMzg2LDI4OC4yNjk3IDI3MS44NjUsMjg3Ljc3OTcgMjcxLjg2NSwyODcuMTcyNyB6IE0gMjc4LjM0NywyODcuOTczNyBMIDI3OC44NjIsMjg5LjYzMDcgTCAyODMuNTM4LDI4OS42MzA3IEwgMjg0LjA0NSwyODcuOTczNyBMIDI3OC4zNDcsMjg3Ljk3MzcgTSAyNzguMzQ3LDI4Ni4zNjg3IEwgMjc4Ljg2MiwyODQuNzE0NyBMIDI4My41MzgsMjg0LjcxNDcgTCAyODQuMDQ1LDI4Ni4zNjg3IEwgMjc4LjM0NywyODYuMzY4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjE3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojYzhiMTAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyNzIuMjM3LDI5MS41NDI3IEwgMjcwLjQ5NCwyOTIuMDMyNyBMIDI3MC40OTQsMjk2LjQ2MTcgTCAyNzIuMjM3LDI5Ni45NDE3IEwgMjcyLjIzNywyOTEuNTQyNyBNIDI3My45MTMsMjkxLjU0MjcgTCAyNzUuNjU1LDI5Mi4wMzI3IEwgMjc1LjY1NSwyOTYuNDYxNyBMIDI3My45MTMsMjk2Ljk0MTcgTCAyNzMuOTEzLDI5MS41NDI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwNThlNmUiCi0gICAgICAgICAgIGQ9Ik0gMjcwLjQyMywzMDUuNTM5NyBDIDI3MC40MjMsMzA0LjExNDcgMjcxLjY0MSwzMDIuOTYxNyAyNzMuMTQyLDMwMi45NjE3IEMgMjc0LjYzOSwzMDIuOTYxNyAyNzUuODU2LDMwNC4xMTQ3IDI3NS44NTYsMzA1LjUzOTcgQyAyNzUuODU2LDMwNi45NTc3IDI3NC42MzksMzA4LjEwNjcgMjczLjE0MiwzMDguMTA2NyBDIDI3MS42NDEsMzA4LjEwNjcgMjcwLjQyMywzMDYuOTU3NyAyNzAuNDIzLDMwNS41Mzk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MjEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNkYjQ0NDYiCi0gICAgICAgICAgIGQ9Ik0gMjczLjczNywyMzguMzI1NyBMIDI3My43OTMsMjM3LjcxMTcgTCAyNzMuODc4LDIzNy4zNjk3IEMgMjczLjg3OCwyMzcuMzY5NyAyNzIuMjc4LDIzNy41MDA3IDI3MS40MzYsMjM3LjI2MzcgQyAyNzAuNTk0LDIzNy4wMjQ3IDI2OS44MzUsMjM2LjY3ODcgMjY5LjA0OCwyMzYuMDE1NyBDIDI2OC4yNjQsMjM1LjM0ODcgMjY3Ljk1NCwyMzQuOTMyNyAyNjcuMzkyLDIzNC44NDg3IEMgMjY2LjA0NCwyMzQuNjMzNyAyNjUuMDA1LDIzNS4yNDM3IDI2NS4wMDUsMjM1LjI0MzcgQyAyNjUuMDA1LDIzNS4yNDM3IDI2Ni4wMTgsMjM1LjYxNjcgMjY2Ljc3OCwyMzYuNTQ0NyBDIDI2Ny41MzMsMjM3LjQ3OTcgMjY4LjM1NywyMzcuOTUxNyAyNjguNzE0LDIzOC4wNjQ3IEMgMjY5LjMwMywyMzguMjQ0NyAyNzEuMzUxLDIzOC4xMTc3IDI3MS45MTMsMjM4LjEzODcgQyAyNzIuNDc1LDIzOC4xNjY3IDI3My43MzcsMjM4LjMyODcgMjczLjczNywyMzguMzI4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjIzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNzMuNzM3LDIzOC4zMjU3IEwgMjczLjc5MywyMzcuNzExNyBMIDI3My44NzgsMjM3LjM2OTcgQyAyNzMuODc4LDIzNy4zNjk3IDI3Mi4yNzgsMjM3LjUwMDcgMjcxLjQzNiwyMzcuMjYzNyBDIDI3MC41OTQsMjM3LjAyNDcgMjY5LjgzNSwyMzYuNjc4NyAyNjkuMDQ4LDIzNi4wMTU3IEMgMjY4LjI2NCwyMzUuMzQ4NyAyNjcuOTU0LDIzNC45MzI3IDI2Ny4zOTIsMjM0Ljg0ODcgQyAyNjYuMDQ0LDIzNC42MzM3IDI2NS4wMDUsMjM1LjI0MzcgMjY1LjAwNSwyMzUuMjQzNyBDIDI2NS4wMDUsMjM1LjI0MzcgMjY2LjAxOCwyMzUuNjE2NyAyNjYuNzc4LDIzNi41NDQ3IEMgMjY3LjUzMywyMzcuNDc5NyAyNjguMzU3LDIzNy45NTE3IDI2OC43MTQsMjM4LjA2NDcgQyAyNjkuMzAzLDIzOC4yNDQ3IDI3MS4zNTEsMjM4LjExNzcgMjcxLjkxMywyMzguMTM4NyBDIDI3Mi40NzUsMjM4LjE2NjcgMjczLjczNywyMzguMzI4NyAyNzMuNzM3LDIzOC4zMjg3IEwgMjczLjczNywyMzguMzI1NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjI1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZWQ3MmFhO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjgxLjIxOSwyMzYuMDc1NyBDIDI4MS4yMTksMjM2LjA3NTcgMjgxLjIyMywyMzYuNzkxNyAyODEuMjkzLDIzNy40NzU3IEMgMjgxLjM2LDIzOC4xMzE3IDI4MS4wODEsMjM4LjcwNjcgMjgxLjE4OSwyMzkuMDY5NyBDIDI4MS4yOTMsMjM5LjQzNjcgMjgxLjM0NSwyMzkuNzI1NyAyODEuNDg3LDIzOS45ODk3IEMgMjgxLjYyMSwyNDAuMjU0NyAyODEuNjk1LDI0MC45MjQ3IDI4MS42OTUsMjQwLjkyNDcgQyAyODEuNjk1LDI0MC45MjQ3IDI4MS4zMTIsMjQwLjY1MjcgMjgwLjk1NywyNDAuMzg4NyBDIDI4MC42MDgsMjQwLjEyMDcgMjgwLjM1NywyMzkuOTU0NyAyODAuMzU3LDIzOS45NTQ3IEMgMjgwLjM1NywyMzkuOTU0NyAyODAuNDI5LDI0MC42NzA3IDI4MC40NjIsMjQwLjk3NzcgQyAyODAuNSwyNDEuMjg0NyAyODAuNjc5LDI0MS44NjI3IDI4MC45NjksMjQyLjIwNDcgQyAyODEuMjU2LDI0Mi41Mzk3IDI4MS44MywyNDMuMDg5NyAyODIuMDA3LDI0My41MzA3IEMgMjgyLjE5MSwyNDMuOTc1NyAyODIuMTU0LDI0NC45NTU3IDI4Mi4xNTQsMjQ0Ljk1NTcgQyAyODIuMTU0LDI0NC45NTU3IDI4MS42ODgsMjQ0LjIxMTcgMjgxLjI4OCwyNDQuMDc3NyBDIDI4MC44OTUsMjQzLjkzOTcgMjgwLjAzMSwyNDMuNDYwNyAyODAuMDMxLDI0My40NjA3IEMgMjgwLjAzMSwyNDMuNDYwNyAyODAuODIzLDI0NC4yNDY3IDI4MC44MjMsMjQ0Ljk5NDcgQyAyODAuODIzLDI0NS43NDE3IDI4MC41LDI0Ni41OTE3IDI4MC41LDI0Ni41OTE3IEMgMjgwLjUsMjQ2LjU5MTcgMjgwLjE0MiwyNDUuOTE0NyAyNzkuNjc3LDI0NS40NzA3IEMgMjc5LjIwOCwyNDUuMDI5NyAyNzguNTYsMjQ0LjU4NTcgMjc4LjU2LDI0NC41ODU3IEMgMjc4LjU2LDI0NC41ODU3IDI3OS4wNjYsMjQ1Ljc0MTcgMjc5LjA2NiwyNDYuNTIxNyBDIDI3OS4wNjYsMjQ3LjMwNzcgMjc4LjkyNSwyNDguOTc1NyAyNzguOTI1LDI0OC45NzU3IEMgMjc4LjkyNSwyNDguOTc1NyAyNzguNTMsMjQ4LjMzMDcgMjc4LjEzNSwyNDguMDE2NyBDIDI3Ny43MzcsMjQ3LjcxMzcgMjc3LjI3MiwyNDcuNDQxNyAyNzcuMTI2LDI0Ny4yNDA3IEMgMjc2Ljk4NSwyNDcuMDM2NyAyNzcuNTk2LDI0Ny44ODI3IDI3Ny42NjIsMjQ4LjM5MzcgQyAyNzcuNzMyLDI0OC45MDU3IDI3Ny45NzUsMjUwLjcyODcgMjc5LjU2OSwyNTMuMDU2NyBDIDI4MC41LDI1NC40MTc3IDI4MS45NDEsMjU2Ljc5NzcgMjg1LjAyOCwyNTYuMDE0NyBDIDI4OC4xMTksMjU1LjIzNTcgMjg2Ljk3MiwyNTEuMDgxNyAyODYuMzI0LDI0OS4xNDE3IEMgMjg1LjY3NiwyNDcuMjA1NyAyODUuMzUyLDI0NS4wNTc3IDI4NS4zOSwyNDQuMzA2NyBDIDI4NS40MjMsMjQzLjU2MjcgMjg1Ljk2MywyNDEuMzUxNyAyODUuODkyLDI0MC45Mzg3IEMgMjg1LjgyMSwyNDAuNTMzNyAyODUuNjUzLDIzOC45NTM3IDI4Ni4wMzcsMjM3LjY4MDcgQyAyODYuNDMyLDIzNi4zNTQ3IDI4Ni43NiwyMzUuODM5NyAyODYuOTcyLDIzNS4yOTI3IEMgMjg3LjE4MywyMzQuNzQ5NyAyODcuMzYyLDIzNC40NDI3IDI4Ny40MzQsMjMzLjk2NjcgQyAyODcuNTA1LDIzMy40OTA3IDI4Ny41MDUsMjMyLjYwMTcgMjg3LjUwNSwyMzIuNjAxNyBDIDI4Ny41MDUsMjMyLjYwMTcgMjg4LjA3OCwyMzMuNjU5NyAyODguMjIzLDIzNC4wMzM3IEMgMjg4LjM2NSwyMzQuNDEwNyAyODguMzY1LDIzNS41Mjg3IDI4OC4zNjUsMjM1LjUyODcgQyAyODguMzY1LDIzNS41Mjg3IDI4OC40NzIsMjM0LjQxMDcgMjg5LjMzNywyMzMuODY3NyBDIDI5MC4yMDEsMjMzLjMxNzcgMjkxLjIwNiwyMzIuNzQyNyAyOTEuNDU4LDIzMi40MzU3IEMgMjkxLjcwOSwyMzIuMTI1NyAyOTEuNzgzLDIzMS45MjQ3IDI5MS43ODMsMjMxLjkyNDcgQyAyOTEuNzgzLDIzMS45MjQ3IDI5MS43MDksMjMzLjgzMjcgMjkxLjE3MiwyMzQuNTgzNyBDIDI5MC44MTUsMjM1LjA3MDcgMjg5LjQwOCwyMzYuNjU3NyAyODkuNDA4LDIzNi42NTc3IEMgMjg5LjQwOCwyMzYuNjU3NyAyOTAuMTMsMjM2LjM4MjcgMjkwLjYzMiwyMzYuMzU0NyBDIDI5MS4xMzUsMjM2LjMxNTcgMjkxLjQ5MywyMzYuMzU0NyAyOTEuNDkzLDIzNi4zNTQ3IEMgMjkxLjQ5MywyMzYuMzU0NyAyOTAuODgyLDIzNi44MzA3IDI5MC4wOTIsMjM3Ljk4NjcgQyAyODkuMzAzLDIzOS4xNDA3IDI4OS42MjQsMjM5LjI0MjcgMjg5LjA1LDI0MC4xOTQ3IEMgMjg4LjQ3MiwyNDEuMTQ2NyAyODguMDA3LDI0MS4xODE3IDI4Ny4yODgsMjQxLjc2MDcgQyAyODYuMjA4LDI0Mi42Mjc3IDI4Ni43OSwyNDYuMDc2NyAyODYuOTMxLDI0Ni41ODg3IEMgMjg3LjA3NiwyNDcuMDk2NyAyODguOTQyLDI1MS4zMjA3IDI4OC45NzksMjUyLjM0MDcgQyAyODkuMDEyLDI1My4zNjI3IDI4OS4xOTUsMjU1LjY0MTcgMjg3LjM5NiwyNTcuMTA0NyBDIDI4Ni4yMzgsMjU4LjA1MzcgMjg0LjM0MywyNTguMDYwNyAyODMuOTExLDI1OC4zMzE3IEMgMjgzLjQ3OCwyNTguNTk5NyAyODIuNjIyLDI1OS40NDk3IDI4Mi42MjIsMjYxLjIyMDcgQyAyODIuNjIyLDI2Mi45OTQ3IDI4My4yNjMsMjYzLjI2MjcgMjgzLjc2NiwyNjMuNzA2NyBDIDI4NC4yNzIsMjY0LjE1MDcgMjg0LjkxNywyNjMuOTExNyAyODUuMDYxLDI2NC4yNTM3IEMgMjg1LjIwNywyNjQuNTkxNyAyODUuMjc3LDI2NC43OTY3IDI4NS40OTQsMjY1LjAwMDcgQyAyODUuNzEsMjY1LjIwMTcgMjg1Ljg1NSwyNjUuNDQxNyAyODUuNzgxLDI2NS44MTE3IEMgMjg1LjcxLDI2Ni4xODk3IDI4NC44ODMsMjY3LjAzOTcgMjg0LjU5NiwyNjcuNjU2NyBDIDI4NC4zMDYsMjY4LjI2MjcgMjgzLjczMiwyNjkuODY3NyAyODMuNzMyLDI3MC4xMDM3IEMgMjgzLjczMiwyNzAuMzQzNyAyODMuNjY1LDI3MS4wOTE3IDI4My45MTEsMjcxLjQ2ODcgQyAyODMuOTExLDI3MS40Njg3IDI4NC44MDksMjcyLjUxNjcgMjg0LjE5NywyNzIuNzIwNyBDIDI4My44MDMsMjcyLjg1NDcgMjgzLjQxNiwyNzIuNDczNyAyODMuMjMsMjcyLjUxNjcgQyAyODIuNjkzLDI3Mi42NTc3IDI4Mi40MTMsMjcyLjk4ODcgMjgyLjI1OCwyNzIuOTYwNyBDIDI4MS45LDI3Mi44OTM3IDI4MS45LDI3Mi43MTc3IDI4MS44NjMsMjcyLjIxMjcgQyAyODEuODMsMjcxLjcwNDcgMjgxLjg0OCwyNzEuNDk2NyAyODEuNjg4LDI3MS40OTY3IEMgMjgxLjQ3MiwyNzEuNDk2NyAyODEuMzYzLDI3MS42NzM3IDI4MS4zMjcsMjcxLjk0MTcgQyAyODEuMjg4LDI3Mi4yMTI3IDI4MS4yODgsMjcyLjgyMjcgMjgxLjA0LDI3Mi44MjI3IEMgMjgwLjc4NywyNzIuODIyNyAyODAuNDI5LDI3Mi4zODE3IDI4MC4yMTMsMjcyLjI4MzcgQyAyNzkuOTk3LDI3Mi4xODA3IDI3OS4zODcsMjcyLjA3ODcgMjc5LjM1MiwyNzEuODA3NyBDIDI3OS4zMTYsMjcxLjUzNTcgMjc5LjcxMSwyNzAuOTU3NyAyODAuMTA1LDI3MC44NTQ3IEMgMjgwLjUsMjcwLjc1MjcgMjgwLjg2MSwyNzAuNTUxNyAyODAuNjA4LDI3MC4zNDc3IEMgMjgwLjM1NSwyNzAuMTQyNyAyODAuMTA1LDI3MC4xNDI3IDI3OS44NTYsMjcwLjM0NzcgQyAyNzkuNjAzLDI3MC41NTE3IDI3OS4wNjYsMjcwLjM3ODcgMjc5LjEsMjcwLjA3MjcgQyAyNzkuMTM3LDI2OS43NjU3IDI3OS4yMDgsMjY5LjM5NDcgMjc5LjE3LDI2OS4yMjI3IEMgMjc5LjEzNywyNjkuMDU2NyAyNzguNzA1LDI2OC43MTQ3IDI3OS4yNzUsMjY4LjQwMzcgQyAyNzkuODUyLDI2OC4xMDA3IDI4MC4xMDEsMjY4LjY3OTcgMjgwLjY3NSwyNjguNTc2NyBDIDI4MS4yNTIsMjY4LjQ3ODcgMjgxLjUzOSwyNjguMjY2NyAyODEuNzU1LDI2Ny45MzE3IEMgMjgxLjk3MSwyNjcuNTkyNyAyODEuOTMzLDI2Ni44NzY3IDI4MS41MzksMjY2LjQzNjcgQyAyODEuMTQ0LDI2NS45OTE3IDI4MC43NSwyNjUuOTIxNyAyODAuNjA0LDI2NS42NDk3IEMgMjgwLjQ1OSwyNjUuMzc4NyAyODAuMjQ3LDI2NC43MzI3IDI4MC4yNDcsMjY0LjczMjcgQyAyODAuMjQ3LDI2NC43MzI3IDI4MC4zNTEsMjY1LjkyMTcgMjgwLjI4LDI2Ni4wOTQ3IEMgMjgwLjIxLDI2Ni4yNjM3IDI4MC4yNDcsMjY2Ljk3NTcgMjgwLjI0NywyNjYuOTc1NyBDIDI4MC4yNDcsMjY2Ljk3NTcgMjc5Ljg1MiwyNjYuNTM0NyAyNzkuNTI4LDI2Ni4xOTY3IEMgMjc5LjIwOCwyNjUuODU0NyAyNzguODg0LDI2NC44MzU3IDI3OC44ODQsMjY0LjgzNTcgQyAyNzguODg0LDI2NC44MzU3IDI3OC44NSwyNjUuNzg3NyAyNzguODUsMjY2LjE2NDcgQyAyNzguODUsMjY2LjUzNDcgMjc5LjI3OCwyNjYuODc2NyAyNzkuMTM3LDI2Ny4wMTQ3IEMgMjc4Ljk5MiwyNjcuMTQ4NyAyNzguMzExLDI2Ni4yOTg3IDI3OC4xMzIsMjY2LjE2NDcgQyAyNzcuOTQ5LDI2Ni4wMjc3IDI3Ny4zNzYsMjY1LjU4NjcgMjc3LjEyMywyNjUuMTA2NyBDIDI3Ni44NzMsMjY0LjYzMDcgMjc2LjY5LDI2My45NTM3IDI3Ni42MiwyNjMuNzEwNyBDIDI3Ni41NDgsMjYzLjQ3MzcgMjc2LjQzLDI2Mi40MTI3IDI3Ni41NDgsMjYyLjE0NDcgQyAyNzYuNzI3LDI2MS43Mzg3IDI3Ny4wMTUsMjYxLjAyMjcgMjc3LjAxNSwyNjEuMDIyNyBDIDI3Ny4wMTUsMjYxLjAyMjcgMjc2LjM3LDI2MS4wMjI3IDI3NS42MTQsMjYxLjAyMjcgQyAyNzQuODYyLDI2MS4wMjI3IDI3NC4zMjIsMjYwLjc4NjcgMjc0LjAzNSwyNjEuMjk0NyBDIDI3My43NDksMjYxLjgwNTcgMjczLjg5LDI2Mi44Mjg3IDI3NC4yNDgsMjY0LjE1NDcgQyAyNzQuNjA5LDI2NS40NzY3IDI3NC44MjEsMjY2LjEyNTcgMjc0LjcxNywyNjYuMzY1NyBDIDI3NC42MTIsMjY2LjYwMTcgMjc0LjE0NCwyNjcuMTQ4NyAyNzMuOTY1LDI2Ny4yNDc3IEMgMjczLjc4MiwyNjcuMzUzNyAyNzMuMjc5LDI2Ny4zMTc3IDI3My4wNjMsMjY3LjIxOTcgQyAyNzIuODUxLDI2Ny4xMTY3IDI3Mi40OTQsMjY2Ljk0MzcgMjcxLjgwOCwyNjYuOTQzNyBDIDI3MS4xMjcsMjY2Ljk0MzcgMjcwLjY5NSwyNjYuOTc1NyAyNzAuNDQ2LDI2Ni45MTU3IEMgMjcwLjE5MywyNjYuODQ1NyAyNjkuNTgyLDI2Ni41Mzg3IDI2OS4yOTEsMjY2LjYwNTcgQyAyNjkuMDA0LDI2Ni42NzU3IDI2OC41MDgsMjY2LjkyOTcgMjY4LjY0MywyNjcuMzIxNyBDIDI2OC44NjMsMjY3LjkzNDcgMjY4LjQzMSwyNjguMDcyNyAyNjguMTQxLDI2OC4wMzc3IEMgMjY3Ljg1NCwyNjguMDAxNyAyNjcuNjA4LDI2Ny44OTk3IDI2Ny4yNDMsMjY3LjgwMDcgQyAyNjYuODg2LDI2Ny42OTU3IDI2Ni4zNDUsMjY3LjgwMDcgMjY2LjQxNywyNjcuMzg4NyBDIDI2Ni40ODcsMjY2Ljk3OTcgMjY2LjYzMywyNjYuOTQ3NyAyNjYuODExLDI2Ni42NDQ3IEMgMjY2Ljk5MywyNjYuMzMzNyAyNjcuMDYsMjY2LjEzNjcgMjY2Ljg1OCwyNjYuMTE1NyBDIDI2Ni42MDYsMjY2LjA5MDcgMjY2LjM1MywyNjYuMDYyNyAyNjYuMTU2LDI2Ni4yMjQ3IEMgMjY1Ljk2NiwyNjYuMzgzNyAyNjUuNjU3LDI2Ni43MjU3IDI2NS40MDMsMjY2LjU5ODcgQyAyNjUuMTQ5LDI2Ni40NjQ3IDI2NC45NTMsMjY2LjE3MTcgMjY0Ljk1MywyNjUuNTI5NyBDIDI2NC45NTMsMjY0Ljg5MTcgMjY0LjI3OCwyNjQuMzM0NyAyNjQuODk3LDI2NC4zNjI3IEMgMjY1LjUxNSwyNjQuMzkwNyAyNjYuMzAxLDI2NC44NDI3IDI2Ni40NDIsMjY0LjQ5NjcgQyAyNjYuNTgsMjY0LjE0NzcgMjY2LjQ5NSwyNjMuOTkyNyAyNjYuMTYsMjYzLjcyMDcgQyAyNjUuODIzLDI2My40NTY3IDI2NS40MDMsMjYzLjI5NzcgMjY1Ljg1MywyNjIuOTUxNyBDIDI2Ni4zMDEsMjYyLjYwOTcgMjY2LjQxMywyNjIuNjA5NyAyNjYuNTg0LDI2Mi40MTk3IEMgMjY2Ljc1MiwyNjIuMjM1NyAyNjYuOTkzLDI2MS42MzY3IDI2Ny4zMDcsMjYxLjc4NDcgQyAyNjcuOTI0LDI2Mi4wNzc3IDI2Ny4zMzYsMjYyLjUwMzcgMjY3Ljk1NCwyNjMuMTkxNyBDIDI2OC41NzMsMjYzLjg4MjcgMjY4Ljk2NCwyNjQuMTI2NyAyNzAuMDAzLDI2NC4wMTY3IEMgMjcxLjA0MSwyNjMuOTExNyAyNzEuMzI1LDI2My43Nzc3IDI3MS4zMjUsMjYzLjQ4NDcgQyAyNzEuMzI1LDI2My4xOTE3IDI3MS4yMzgsMjYyLjY2MjcgMjcxLjIwOCwyNjIuNDQ3NyBDIDI3MS4xODMsMjYyLjIzNTcgMjcxLjM1MSwyNjEuNDYzNyAyNzEuMzUxLDI2MS40NjM3IEMgMjcxLjM1MSwyNjEuNDYzNyAyNzAuODc0LDI2MS43NTk3IDI3MC43MzMsMjYyLjA0ODcgQyAyNzAuNTk4LDI2Mi4zNDE3IDI3MC4zMTUsMjYyLjg0MjcgMjcwLjMxNSwyNjIuODQyNyBDIDI3MC4zMTUsMjYyLjg0MjcgMjcwLjIsMjYyLjI0NjcgMjcwLjIzMywyNjEuNzU5NyBDIDI3MC4yNTIsMjYxLjQ3NDcgMjcwLjM1MywyNjAuOTc2NyAyNzAuMzQyLDI2MC44Nzg3IEMgMjcwLjMxNSwyNjAuNjEzNyAyNzAuMTE4LDI1OS45NDc3IDI3MC4xMTgsMjU5Ljk0NzcgQyAyNzAuMTE4LDI1OS45NDc3IDI2OS45NDksMjYwLjY2NjcgMjY5LjgzOSwyNjAuODc4NyBDIDI2OS43MjcsMjYxLjA4OTcgMjY5LjY3MSwyNjEuOTQzNyAyNjkuNjcxLDI2MS45NDM3IEMgMjY5LjY3MSwyNjEuOTQzNyAyNjkuMDEyLDI2MS4zNjg3IDI2OS4xOTUsMjYwLjQwMjcgQyAyNjkuMzMyLDI1OS42NTc3IDI2OS4wODIsMjU4LjY3NDcgMjY5LjMwNiwyNTguMzUzNyBDIDI2OS41MjYsMjU4LjAzMjcgMjcwLjA1OCwyNTYuNzMwNyAyNzEuMzUxLDI1Ni42NzQ3IEMgMjcyLjY0MywyNTYuNjI1NyAyNzMuNjUyLDI1Ni43MzA3IDI3NC4xMDMsMjU2LjcwNjcgQyAyNzQuNTUyLDI1Ni42NzQ3IDI3Ni4xNTEsMjU2LjM4NTcgMjc2LjE1MSwyNTYuMzg1NyBDIDI3Ni4xNTEsMjU2LjM4NTcgMjczLjIwNCwyNTQuODcyNyAyNzIuNTMxLDI1NC40MTc3IEMgMjcxLjg1NywyNTMuOTY5NyAyNzAuODE4LDI1Mi43OTg3IDI3MC40NzksMjUyLjI2NjcgQyAyNzAuMTQzLDI1MS43MzM3IDI2OS44MzUsMjUwLjcwMDcgMjY5LjgzNSwyNTAuNzAwNyBDIDI2OS44MzUsMjUwLjcwMDcgMjY5LjMwNiwyNTAuNzI0NyAyNjguODI2LDI1MC45ODk3IEMgMjY4LjM0OSwyNTEuMjUwNyAyNjcuODczLDI1MS42NTY3IDI2Ny41OTMsMjUxLjk2OTcgQyAyNjcuMzA5LDI1Mi4yOTA3IDI2Ni44NjMsMjUzLjAxMDcgMjY2Ljg2MywyNTMuMDEwNyBDIDI2Ni44NjMsMjUzLjAxMDcgMjY2Ljk0NSwyNTIuMDc5NyAyNjYuOTQ1LDI1MS43ODY3IEMgMjY2Ljk0NSwyNTEuNTAwNyAyNjYuODg5LDI1MC45MzM3IDI2Ni44ODksMjUwLjkzMzcgQyAyNjYuODg5LDI1MC45MzM3IDI2Ni41NTQsMjUyLjIwOTcgMjY1Ljg4LDI1Mi42ODU3IEMgMjY1LjIwNiwyNTMuMTY4NyAyNjQuNDIsMjUzLjgzMTcgMjY0LjQyLDI1My44MzE3IEMgMjY0LjQyLDI1My44MzE3IDI2NC41MDYsMjUzLjExOTcgMjY0LjUwNiwyNTIuOTU3NyBDIDI2NC41MDYsMjUyLjc5ODcgMjY0LjY3NCwyNTEuOTczNyAyNjQuNjc0LDI1MS45NzM3IEMgMjY0LjY3NCwyNTEuOTczNyAyNjQuMTk3LDI1Mi42ODU3IDI2My40NjcsMjUyLjgyNjcgQyAyNjIuNzM3LDI1Mi45NTc3IDI2MS42NjgsMjUyLjkyOTcgMjYxLjU4MywyNTMuMzg0NyBDIDI2MS41MDEsMjUzLjgzMTcgMjYxLjc4LDI1NC40NDU3IDI2MS42MTMsMjU0Ljc2MjcgQyAyNjEuNDQ0LDI1NS4wODM3IDI2MS4wOCwyNTUuMjk1NyAyNjEuMDgsMjU1LjI5NTcgQyAyNjEuMDgsMjU1LjI5NTcgMjYwLjY2LDI1NC45NDY3IDI2MC4yOTQsMjU0LjkyMTcgQyAyNTkuOTI5LDI1NC44OTM3IDI1OS41OTEsMjU1LjA4MzcgMjU5LjU5MSwyNTUuMDgzNyBDIDI1OS41OTEsMjU1LjA4MzcgMjU5LjI4MiwyNTQuNjgxNyAyNTkuMzkzLDI1NC40MTc3IEMgMjU5LjUwOCwyNTQuMTUyNyAyNjAuMDY3LDI1My43NTQ3IDI1OS45MjksMjUzLjU5MjcgQyAyNTkuNzg4LDI1My40MzM3IDI1OS4zMzgsMjUzLjY0ODcgMjU5LjA1OCwyNTMuNzc5NyBDIDI1OC43NzksMjUzLjkxMzcgMjU4LjE4NywyNTQuMDQzNyAyNTguMjQzLDI1My41OTI3IEMgMjU4LjI5OSwyNTMuMTQwNyAyNTguNDQsMjUyLjg3NjcgMjU4LjI5OSwyNTIuNTU1NyBDIDI1OC4xNTksMjUyLjI0MTcgMjU4LjI0MywyNTIuMDI2NyAyNTguNDcsMjUxLjk0NTcgQyAyNTguNjkzLDI1MS44NzE3IDI1OS41OTEsMjUxLjk2OTcgMjU5LjY3NiwyNTEuNzY1NyBDIDI1OS43NTgsMjUxLjU1MDcgMjU5LjQ1MywyNTEuMjg1NyAyNTguODYxLDI1MS4xNTE3IEMgMjU4LjI3MiwyNTEuMDIxNyAyNTcuOTksMjUwLjY3MjcgMjU4LjI5OSwyNTAuMzc5NyBDIDI1OC42MDgsMjUwLjA4NjcgMjU4LjY5MywyNTAuMDA5NyAyNTguODMzLDI0OS43NDE3IEMgMjU4Ljk3MywyNDkuNDczNyAyNTkuMDI4LDI0OC45OTY3IDI1OS41NjQsMjQ5LjIzNjcgQyAyNjAuMDkzLDI0OS40NzM3IDI1OS45ODEsMjUwLjA1ODcgMjYwLjU0OCwyNTAuMjQ1NyBDIDI2MS4xMDMsMjUwLjQzNTcgMjYyLjQyNSwyNTAuMTY3NyAyNjIuNzAzLDI1MC4wMDk3IEMgMjYyLjk4NywyNDkuODQ2NyAyNjMuODg0LDI0OS4xODM3IDI2NC4xOTMsMjQ5LjAyMTcgQyAyNjQuNTAzLDI0OC44NjY3IDI2NS43OTEsMjQ3LjkwNzcgMjY1Ljc5MSwyNDcuOTA3NyBDIDI2NS43OTEsMjQ3LjkwNzcgMjY1LjAzNSwyNDcuMzgxNyAyNjQuNzUyLDI0Ny4xMTA3IEMgMjY0LjQ3MywyNDYuODQ1NyAyNjMuOTcsMjQ2LjIxMDcgMjYzLjcyMSwyNDYuMDc2NyBDIDI2My40NjcsMjQ1LjkzOTcgMjYyLjIzMSwyNDUuNDY2NyAyNjEuODEsMjQ1LjQzODcgQyAyNjEuMzg5LDI0NS40MTA3IDI2MC4wOTcsMjQ0Ljk2MjcgMjYwLjA5NywyNDQuOTYyNyBDIDI2MC4wOTcsMjQ0Ljk2MjcgMjYwLjY4NiwyNDQuNzcyNyAyNjAuODgzLDI0NC42MTM3IEMgMjYxLjA4LDI0NC40NTQ3IDI2MS41MjMsMjQ0LjA1MjcgMjYxLjc1NCwyNDQuMDgwNyBDIDI2MS45NzQsMjQ0LjEwOTcgMjYyLjAyOSwyNDQuMTA5NyAyNjIuMDI5LDI0NC4xMDk3IEMgMjYyLjAyOSwyNDQuMTA5NyAyNjAuODI3LDI0NC4wNTI3IDI2MC41NzMsMjQzLjk3ODcgQyAyNjAuMzIxLDI0My44OTM3IDI1OS41OTEsMjQzLjQ0MjcgMjU5LjMxMiwyNDMuNDQyNyBDIDI1OS4wMjgsMjQzLjQ0MjcgMjU4LjQ3LDI0My41NTE3IDI1OC40NywyNDMuNTUxNyBDIDI1OC40NywyNDMuNTUxNyAyNTkuMjI2LDI0My4wNzI3IDI1OS44NDQsMjQyLjk2NjcgQyAyNjAuNDYyLDI0Mi44NjQ3IDI2MC45MzksMjQyLjg4NTcgMjYwLjkzOSwyNDIuODg1NyBDIDI2MC45MzksMjQyLjg4NTcgMjU5Ljk4NiwyNDIuNjIwNyAyNTkuNzU4LDI0Mi4zMDM3IEMgMjU5LjUzNSwyNDEuOTgyNyAyNTkuMzEyLDI0MS41MDk3IDI1OS4xNCwyNDEuMjk0NyBDIDI1OC45NzMsMjQxLjA4MzcgMjU4Ljg2MSwyNDAuNzM0NyAyNTguNTUyLDI0MC43MDk3IEMgMjU4LjI0MywyNDAuNjgxNyAyNTcuNzA5LDI0MS4wODM3IDI1Ny40MDEsMjQxLjA1NDcgQyAyNTcuMDk2LDI0MS4wMzA3IDI1Ni44NjgsMjQwLjgzOTcgMjU2LjgzOCwyNDAuMzkxNyBDIDI1Ni44MTcsMjM5LjkzNzcgMjU2LjgzOCwyNDAuMDk1NyAyNTYuNzMxLDIzOS44NTk3IEMgMjU2LjYxOSwyMzkuNjE2NyAyNTYuMTY5LDIzOS4wNTg3IDI1Ni41ODksMjM4LjkyODcgQyAyNTcuMDE0LDIzOC43OTQ3IDI1Ny45MTEsMjM5LjAwNjcgMjU3Ljk5MywyMzguODQ3NyBDIDI1OC4wNzksMjM4LjY4ODcgMjU3LjUxNywyMzguMjA5NyAyNTcuMTUyLDIzOC4wMjI3IEMgMjU2Ljc4NywyMzcuODM4NyAyNTYuMTk4LDIzNy41MTc3IDI1Ni41MDcsMjM3LjI1MzcgQyAyNTYuODE3LDIzNi45ODg3IDI1Ny4xMjQsMjM2Ljg4MzcgMjU3LjI5MywyMzYuNjQzNyBDIDI1Ny40NjEsMjM2LjQwMzcgMjU3LjY1OCwyMzUuNzQwNyAyNTguMDIzLDIzNS45NTE3IEMgMjU4LjM4OCwyMzYuMTYzNyAyNTguODkzLDIzNy4yMDM3IDI1OS4xNzQsMjM3LjEyMjcgQyAyNTkuNDU3LDIzNy4wNDE3IDI1OS40NzgsMjM2LjI5NzcgMjU5LjQyNywyMzUuOTgwNyBDIDI1OS4zNzEsMjM1LjY1OTcgMjU5LjQyNywyMzUuMTAyNyAyNTkuNzAzLDIzNS4xNTQ3IEMgMjU5Ljk4NiwyMzUuMjA3NyAyNjAuMjA5LDIzNS41Nzg3IDI2MC42NiwyMzUuNjA5NyBDIDI2MS4xMDYsMjM1LjYzNDcgMjYxLjc4LDIzNS41MDQ3IDI2MS43MjQsMjM1LjgxNzcgQyAyNjEuNjY4LDIzNi4xMzU3IDI2MS40MTQsMjM2LjUzMDcgMjYxLjEwNiwyMzYuODc5NyBDIDI2MC44MDUsMjM3LjIyODcgMjYwLjY2MywyMzcuOTE2NyAyNjAuODU3LDIzOC4zNjc3IEMgMjYxLjA1MywyMzguODIyNyAyNjEuNTYxLDIzOS41NDI3IDI2Mi4wMDgsMjM5LjgzMTcgQyAyNjIuNDU0LDI0MC4xMjM3IDI2My4yOTYsMjQwLjMzOTcgMjYzLjgzMiwyNDAuNjgxNyBDIDI2NC4zNjQsMjQxLjAzMDcgMjY1LjYwMSwyNDIuMDEwNyAyNjYuMDIyLDI0Mi4xMTY3IEMgMjY2LjQ0MiwyNDIuMjI1NyAyNjYuODYzLDI0Mi40Mzc3IDI2Ni44NjMsMjQyLjQzNzcgQyAyNjYuODYzLDI0Mi40Mzc3IDI2Ny4zMzksMjQyLjIyNTcgMjY3Ljk4OCwyNDIuMjI1NyBDIDI2OC42MzIsMjQyLjIyNTcgMjcwLjExOCwyNDIuMzMxNyAyNzAuNjgsMjQyLjA5MTcgQyAyNzEuMjQyLDI0MS44NDg3IDI3MS45NzIsMjQxLjQ1MzcgMjcxLjc0OCwyNDAuOTQ1NyBDIDI3MS41MjYsMjQwLjQ0NDcgMjcwLjI4OSwyMzkuOTg5NyAyNzAuNDAxLDIzOS41OTQ3IEMgMjcwLjUxMywyMzkuMTk2NyAyNzAuOTYzLDIzOS4xNjg3IDI3MS43MTgsMjM5LjE0MDcgQyAyNzIuNDc1LDIzOS4xMTU3IDI3My41MTQsMjM5LjI3NDcgMjczLjcwOCwyMzguMjA5NyBDIDI3My45MDUsMjM3LjE0NzcgMjczLjk2MSwyMzYuNTMzNyAyNzIuOSwyMzYuMjk3NyBDIDI3MS44MzEsMjM2LjA1NzcgMjcxLjA0NCwyMzYuMDMzNyAyNzAuODUyLDIzNS4yNjA3IEMgMjcwLjY1MywyMzQuNDkxNyAyNzAuNDU3LDIzNC4zMDU3IDI3MC42OCwyMzQuMDg5NyBDIDI3MC45MDgsMjMzLjg4MTcgMjcxLjI5OCwyMzMuNzcyNyAyNzIuMDg0LDIzMy43MjM3IEMgMjcyLjg3LDIzMy42NjY3IDI3My43NjcsMjMzLjY2NjcgMjc0LjAyMSwyMzMuNDc2NyBDIDI3NC4yNzQsMjMzLjI5NjcgMjc0LjMyNiwyMzIuNzg4NyAyNzQuNjM1LDIzMi41NzM3IEMgMjc0Ljk0MywyMzIuMzY1NyAyNzYuMTU0LDIzMi4xNzQ3IDI3Ni4xNTQsMjMyLjE3NDcgQyAyNzYuMTU0LDIzMi4xNzQ3IDI3Ny41OTYsMjMyLjg4MDcgMjc4LjkzNiwyMzMuODc0NyBDIDI4MC4xMzUsMjM0Ljc3MDcgMjgxLjIxOSwyMzYuMDkzNyAyODEuMjE5LDIzNi4wOTM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweCIKLSAgICAgICAgICAgZD0iTSAyNzAuODc0LDIzNS4zMjc3IEMgMjcwLjg3NCwyMzUuMzI3NyAyNzAuNzA2LDIzNC44NDg3IDI3MC42NzcsMjM0LjcxNDcgQyAyNzAuNjUxLDIzNC41ODM3IDI3MC41NjQsMjM0LjQyMTcgMjcwLjU2NCwyMzQuNDIxNyBDIDI3MC41NjQsMjM0LjQyMTcgMjcxLjQzNiwyMzQuNDIxNyAyNzEuNDA3LDIzNC42ODU3IEMgMjcxLjM4LDIzNC45NTM3IDI3MS4xMjcsMjM0Ljk1MzcgMjcxLjA3MSwyMzUuMDU2NyBDIDI3MS4wMTYsMjM1LjE2NTcgMjcwLjg3NCwyMzUuMzI3NyAyNzAuODc0LDIzNS4zMjc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MjkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI3MC44NzQsMjM1LjMyNzcgQyAyNzAuODc0LDIzNS4zMjc3IDI3MC43MDYsMjM0Ljg0ODcgMjcwLjY3NywyMzQuNzE0NyBDIDI3MC42NTEsMjM0LjU4MzcgMjcwLjU2NCwyMzQuNDIxNyAyNzAuNTY0LDIzNC40MjE3IEMgMjcwLjU2NCwyMzQuNDIxNyAyNzEuNDM2LDIzNC40MjE3IDI3MS40MDcsMjM0LjY4NTcgQyAyNzEuMzgsMjM0Ljk1MzcgMjcxLjEyNywyMzQuOTUzNyAyNzEuMDcxLDIzNS4wNTY3IEMgMjcxLjAxNiwyMzUuMTY1NyAyNzAuODc0LDIzNS4zMjc3IDI3MC44NzQsMjM1LjMyNzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTYzMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4IgotICAgICAgICAgICBkPSJNIDI3NC44NjIsMjMzLjk0MTcgTCAyNzQuODAzLDIzMy41MTU3IEMgMjc0LjgwMywyMzMuNTE1NyAyNzUuNTYyLDIzMy41MjI3IDI3NS45MjcsMjMzLjc3OTcgQyAyNzYuNDksMjM0LjE3ODcgMjc2Ljg1MSwyMzQuNzkxNyAyNzYuODI1LDIzNC44MTY3IEMgMjc2LjcyNywyMzQuOTExNyAyNzYuMjkyLDIzNC41NTE3IDI3NS45ODMsMjM0LjQ0NjcgQyAyNzUuOTgzLDIzNC40NDY3IDI3NS43NTksMjM0LjQ5OTcgMjc1LjUzMywyMzQuNDk5NyBDIDI3NS4zMDksMjM0LjQ5OTcgMjc1LjE5NywyMzQuMzkzNyAyNzUuMTY3LDIzNC4yODc3IEMgMjc1LjE0MiwyMzQuMTc4NyAyNzUuMTk3LDIzMy45OTQ3IDI3NS4xOTcsMjMzLjk5NDcgTCAyNzQuODYyLDIzMy45NDU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MzMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDUwNzM0NSIKLSAgICAgICAgICAgZD0iTSAyNzQuODYyLDIzMy45NDE3IEwgMjc0LjgwMywyMzMuNTE1NyBDIDI3NC44MDMsMjMzLjUxNTcgMjc1LjU2MiwyMzMuNTIyNyAyNzUuOTI3LDIzMy43Nzk3IEMgMjc2LjQ5LDIzNC4xNzg3IDI3Ni44NTEsMjM0Ljc5MTcgMjc2LjgyNSwyMzQuODE2NyBDIDI3Ni43MjcsMjM0LjkxMTcgMjc2LjI5MiwyMzQuNTUxNyAyNzUuOTgzLDIzNC40NDY3IEMgMjc1Ljk4MywyMzQuNDQ2NyAyNzUuNzU5LDIzNC40OTk3IDI3NS41MzMsMjM0LjQ5OTcgQyAyNzUuMzA5LDIzNC40OTk3IDI3NS4xOTcsMjM0LjM5MzcgMjc1LjE2NywyMzQuMjg3NyBDIDI3NS4xNDIsMjM0LjE3ODcgMjc1LjE5NywyMzMuOTk0NyAyNzUuMTk3LDIzMy45OTQ3IEwgMjc0Ljg2MiwyMzMuOTQ1NyBMIDI3NC44NjIsMjMzLjk0MTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTYzNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjgwLjMzNiwyMzkuOTUxNyBDIDI4MC4zMzYsMjM5Ljk1MTcgMjc5Ljk5NywyMzkuNDcxNyAyNzkuOTE1LDIzOS4zMDk3IEMgMjc5LjgyOSwyMzkuMTU0NyAyNzkuNjg4LDIzOC44MzM3IDI3OS42ODgsMjM4LjgzMzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTYzNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2RiNDQ0NiIKLSAgICAgICAgICAgZD0iTSAyNTkuNzg0LDIzNS4xNjU3IEMgMjU5Ljc4NCwyMzUuMTY1NyAyNjAuMjYxLDIzNS41MDc3IDI2MC42MjYsMjM1LjU2MDcgQyAyNjAuOTkxLDIzNS42MTY3IDI2MS4zODYsMjM1LjYxNjcgMjYxLjQ0MiwyMzUuNjE2NyBDIDI2MS40OTcsMjM1LjYxNjcgMjYxLjYxMywyMzUuMDgwNyAyNjEuNTUzLDIzNC43MTQ3IEMgMjYxLjM1NiwyMzMuNTE1NyAyNjAuMjYxLDIzMy4yNTA3IDI2MC4yNjEsMjMzLjI1MDcgQyAyNjAuMjYxLDIzMy4yNTA3IDI2MC41ODgsMjMzLjk3NzcgMjYwLjQyOSwyMzQuMzEyNyBDIDI2MC4yMDUsMjM0Ljc5MTcgMjU5Ljc4NCwyMzUuMTY1NyAyNTkuNzg0LDIzNS4xNjU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2MzkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI1OS43ODQsMjM1LjE2NTcgQyAyNTkuNzg0LDIzNS4xNjU3IDI2MC4yNjEsMjM1LjUwNzcgMjYwLjYyNiwyMzUuNTYwNyBDIDI2MC45OTEsMjM1LjYxNjcgMjYxLjM4NiwyMzUuNjE2NyAyNjEuNDQyLDIzNS42MTY3IEMgMjYxLjQ5NywyMzUuNjE2NyAyNjEuNjEzLDIzNS4wODA3IDI2MS41NTMsMjM0LjcxNDcgQyAyNjEuMzU2LDIzMy41MTU3IDI2MC4yNjEsMjMzLjI1MDcgMjYwLjI2MSwyMzMuMjUwNyBDIDI2MC4yNjEsMjMzLjI1MDcgMjYwLjU4OCwyMzMuOTc3NyAyNjAuNDI5LDIzNC4zMTI3IEMgMjYwLjIwNSwyMzQuNzkxNyAyNTkuNzg0LDIzNS4xNjU3IDI1OS43ODQsMjM1LjE2NTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTY0MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2RiNDQ0NiIKLSAgICAgICAgICAgZD0iTSAyNTcuNTA5LDIzNi4yMDI3IEMgMjU3LjUwOSwyMzYuMjAyNyAyNTcuMDg4LDIzNS40MzA3IDI1Ni4xOTEsMjM1LjUzNTcgQyAyNTUuMjkzLDIzNS42NDE3IDI1NC43MDEsMjM2LjMzNjcgMjU0LjcwMSwyMzYuMzM2NyBDIDI1NC43MDEsMjM2LjMzNjcgMjU1LjY5MiwyMzYuMzA0NyAyNTUuOTM3LDIzNi40NjY3IEMgMjU2LjMwMywyMzYuNzA2NyAyNTYuNDE0LDIzNy4zMjA3IDI1Ni40MTQsMjM3LjMyMDcgQyAyNTYuNDE0LDIzNy4zMjA3IDI1Ni45NTEsMjM2Ljk5OTcgMjU3LjExOCwyMzYuNzg3NyBDIDI1Ny4yODUsMjM2LjU3MjcgMjU3LjUwOSwyMzYuMjAyNyAyNTcuNTA5LDIzNi4yMDI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2NDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI1Ny41MDksMjM2LjIwMjcgQyAyNTcuNTA5LDIzNi4yMDI3IDI1Ny4wODgsMjM1LjQzMDcgMjU2LjE5MSwyMzUuNTM1NyBDIDI1NS4yOTMsMjM1LjY0MTcgMjU0LjcwMSwyMzYuMzM2NyAyNTQuNzAxLDIzNi4zMzY3IEMgMjU0LjcwMSwyMzYuMzM2NyAyNTUuNjkyLDIzNi4zMDQ3IDI1NS45MzcsMjM2LjQ2NjcgQyAyNTYuMzAzLDIzNi43MDY3IDI1Ni40MTQsMjM3LjMyMDcgMjU2LjQxNCwyMzcuMzIwNyBDIDI1Ni40MTQsMjM3LjMyMDcgMjU2Ljk1MSwyMzYuOTk5NyAyNTcuMTE4LDIzNi43ODc3IEMgMjU3LjI4NSwyMzYuNTcyNyAyNTcuNTA5LDIzNi4yMDI3IDI1Ny41MDksMjM2LjIwMjcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTY0NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2RiNDQ0NiIKLSAgICAgICAgICAgZD0iTSAyNTYuNDE0LDIzOS4zMDk3IEMgMjU2LjQxNCwyMzkuMzA5NyAyNTUuNjU4LDIzOS40MTg3IDI1NS4yMzgsMjM5Ljg5ODcgQyAyNTQuODEzLDI0MC4zNzc3IDI1NC44NzMsMjQxLjI4MDcgMjU0Ljg3MywyNDEuMjgwNyBDIDI1NC44NzMsMjQxLjI4MDcgMjU1LjM3NSwyNDAuNzUxNyAyNTUuODI2LDI0MC43NTE3IEMgMjU2LjI3NywyNDAuNzUxNyAyNTYuOTc3LDI0MC45MTA3IDI1Ni45NzcsMjQwLjkxMDcgQyAyNTYuOTc3LDI0MC45MTA3IDI1Ni43NTMsMjQwLjM0NjcgMjU2Ljc1MywyNDAuMTA5NyBDIDI1Ni43NTMsMjM5Ljg3MDcgMjU2LjQxNCwyMzkuMzA5NyAyNTYuNDE0LDIzOS4zMDk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2NDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI1Ni40MTQsMjM5LjMwOTcgQyAyNTYuNDE0LDIzOS4zMDk3IDI1NS42NTgsMjM5LjQxODcgMjU1LjIzOCwyMzkuODk4NyBDIDI1NC44MTMsMjQwLjM3NzcgMjU0Ljg3MywyNDEuMjgwNyAyNTQuODczLDI0MS4yODA3IEMgMjU0Ljg3MywyNDEuMjgwNyAyNTUuMzc1LDI0MC43NTE3IDI1NS44MjYsMjQwLjc1MTcgQyAyNTYuMjc3LDI0MC43NTE3IDI1Ni45NzcsMjQwLjkxMDcgMjU2Ljk3NywyNDAuOTEwNyBDIDI1Ni45NzcsMjQwLjkxMDcgMjU2Ljc1MywyNDAuMzQ2NyAyNTYuNzUzLDI0MC4xMDk3IEMgMjU2Ljc1MywyMzkuODcwNyAyNTYuNDE0LDIzOS4zMDk3IDI1Ni40MTQsMjM5LjMwOTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTY0OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4IgotICAgICAgICAgICBkPSJNIDI3MC45MDQsMjM5LjIwMzcgTCAyNzEuMjM4LDIzOC42NzQ3IEwgMjcxLjU2OSwyMzkuMTU0NyBMIDI3MC45MDQsMjM5LjIwMzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTY1MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjcwLjkwNCwyMzkuMjAzNyBMIDI3MS4yMzgsMjM4LjY3NDcgTCAyNzEuNTY5LDIzOS4xNTQ3IEwgMjcwLjkwNCwyMzkuMjAzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjUzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHgiCi0gICAgICAgICAgIGQ9Ik0gMjcxLjcxNSwyMzkuMTc4NyBMIDI3Mi4xMDksMjM4LjY0OTcgTCAyNzIuNTMxLDIzOS4xMjU3IEwgMjcxLjcxNSwyMzkuMTc4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjU1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyNzEuNzE1LDIzOS4xNzg3IEwgMjcyLjEwOSwyMzguNjQ5NyBMIDI3Mi41MzEsMjM5LjEyNTcgTCAyNzEuNzE1LDIzOS4xNzg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2NTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweCIKLSAgICAgICAgICAgZD0iTSAyNzEuMzUxLDIzNS45MDk3IEwgMjcyLjE2NiwyMzYuMjAyNyBMIDI3MS40MzYsMjM2LjU3MjcgTCAyNzEuMzUxLDIzNS45MDk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2NTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI3MS4zNTEsMjM1LjkwOTcgTCAyNzIuMTY2LDIzNi4yMDI3IEwgMjcxLjQzNiwyMzYuNTcyNyBMIDI3MS4zNTEsMjM1LjkwOTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTY2MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4IgotICAgICAgICAgICBkPSJNIDI3Mi4zMzMsMjM2LjE3NzcgTCAyNzMuMDYzLDIzNi4zNjE3IEwgMjcyLjQ3NSwyMzYuODEyNyBMIDI3Mi4zMzMsMjM2LjE3NzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTY2MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjcyLjMzMywyMzYuMTc3NyBMIDI3My4wNjMsMjM2LjM2MTcgTCAyNzIuNDc1LDIzNi44MTI3IEwgMjcyLjMzMywyMzYuMTc3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjY1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNjYuODU4LDI0Mi40MjM3IEMgMjY2Ljg1OCwyNDIuNDIzNyAyNjYuMDU5LDI0Mi42NTY3IDI2NS43NjQsMjQzLjA4NjcgQyAyNjUuNCwyNDMuNjE4NyAyNjUuNDI2LDI0NC4xNTE3IDI2NS40MjYsMjQ0LjE1MTcgQyAyNjUuNDI2LDI0NC4xNTE3IDI2Ni4xLDI0My41OTQ3IDI2Ni45NzEsMjQzLjgzMDcgQyAyNjcuODQzLDI0NC4wNzA3IDI2Ny45MjQsMjQ0LjE1MTcgMjY4LjI5MywyNDQuMTI2NyBDIDI2OC42NTgsMjQ0LjA5ODcgMjY5LjU1NiwyNDMuNzc3NyAyNjkuNTU2LDI0My43Nzc3IEMgMjY5LjU1NiwyNDMuNzc3NyAyNjguODI2LDI0NC42Mjc3IDI2OC45MDgsMjQ1LjIxNjcgQyAyNjguOTkzLDI0NS43OTg3IDI2OS4xMDEsMjQ2LjA2MjcgMjY5LjA3OCwyNDYuMzU5NyBDIDI2OS4wMTgsMjQ3LjA3ODcgMjY4LjQ4NywyNDcuOTU2NyAyNjguNDg3LDI0Ny45NTY3IEMgMjY4LjQ4NywyNDcuOTU2NyAyNjguNzk2LDI0Ny43NjY3IDI2OS41MjYsMjQ3LjYwNzcgQyAyNzAuMjUyLDI0Ny40NDg3IDI3MC44NzQsMjQ3LjA5OTcgMjcxLjI2NSwyNDYuODEwNyBDIDI3MS42NTYsMjQ2LjUxNDcgMjcyLjE2MiwyNDUuNzk4NyAyNzIuMTYyLDI0NS43OTg3IEMgMjcyLjE2MiwyNDUuNzk4NyAyNzEuOTk5LDI0Ni43ODI3IDI3Mi4xNjIsMjQ3LjIwODcgQyAyNzIuMzMsMjQ3LjYzNTcgMjcyLjM4NiwyNDguODU5NyAyNzIuMzg2LDI0OC44NTk3IEMgMjcyLjM4NiwyNDguODU5NyAyNzIuODU1LDI0OC40NDM3IDI3My4yMjcsMjQ4LjI0NTcgQyAyNzMuNDI0LDI0OC4xMzY3IDI3My45MzEsMjQ3Ljg3MTcgMjc0LjEyOSwyNDcuNTU0NyBDIDI3NC4yNjYsMjQ3LjMyODcgMjc0LjQzOCwyNDYuNDk2NyAyNzQuNDM4LDI0Ni40OTY3IEMgMjc0LjQzOCwyNDYuNDk2NyAyNzQuNTQ5LDI0Ny4zOTI3IDI3NC44MjgsMjQ3LjgyNjcgQyAyNzUuMTEyLDI0OC4yNDU3IDI3NS41MjgsMjQ5LjU1NDcgMjc1LjUyOCwyNDkuNTU0NyBDIDI3NS41MjgsMjQ5LjU1NDcgMjc1LjgxMiwyNDguNzA0NyAyNzYuMTIxLDI0OC4zNTU3IEMgMjc2LjQyNiwyNDguMDA5NyAyNzYuNzk1LDI0Ny41NTg3IDI3Ni44MjEsMjQ3LjI5MDcgQyAyNzYuODQ3LDI0Ny4wMjU3IDI3Ni43MzksMjQ2LjQ0MzcgMjc2LjczOSwyNDYuNDQzNyBMIDI3Ny4xMywyNDcuMjkwNyBNIDI2NS43OTEsMjQ3LjkwMDcgQyAyNjUuNzkxLDI0Ny45MDA3IDI2Ni4yNjgsMjQ3LjA3ODcgMjY2LjcxOCwyNDYuODEwNyBDIDI2Ny4xNjksMjQ2LjU0MjcgMjY3Ljc4NywyNDYuMDY2NyAyNjcuOTU0LDI0Ni4wMTM3IEMgMjY4LjExOCwyNDUuOTYwNyAyNjguODUyLDI0NS41NTg3IDI2OC44NTIsMjQ1LjU1ODcgTSAyNjkuODM1LDI1MC42OTM3IEMgMjY5LjgzNSwyNTAuNjkzNyAyNzAuOTE1LDI1MC4xMzk3IDI3MS4yMzgsMjQ5Ljk0NTcgQyAyNzEuOTEzLDI0OS41NTA3IDI3Mi4zODksMjQ4LjgzMTcgMjcyLjM4OSwyNDguODMxNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjY3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZGI0NDQ2IgotICAgICAgICAgICBkPSJNIDI1OC45NjgsMjQ5LjM2MDcgQyAyNTguOTY4LDI0OS4zNjA3IDI1OC41NDgsMjQ4LjkxMjcgMjU3LjgxOCwyNDkuMDQyNyBDIDI1Ny4wODgsMjQ5LjE3NjcgMjU2LjYxMSwyNTAuMDAyNyAyNTYuNjExLDI1MC4wMDI3IEMgMjU2LjYxMSwyNTAuMDAyNyAyNTcuMjI5LDI0OS44Mzk3IDI1Ny41OTUsMjQ5LjkyMDcgQyAyNTcuOTU5LDI1MC4wMDI3IDI1OC4yMTMsMjUwLjM3MjcgMjU4LjIxMywyNTAuMzcyNyBDIDI1OC4yMTMsMjUwLjM3MjcgMjU4LjU0OCwyNTAuMDc5NyAyNTguNjYsMjQ5LjkyMDcgQyAyNTguNzcyLDI0OS43NjI3IDI1OC45NjUsMjQ5LjM2MDcgMjU4Ljk2NSwyNDkuMzYwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjY5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNTguOTY4LDI0OS4zNjA3IEMgMjU4Ljk2OCwyNDkuMzYwNyAyNTguNTQ4LDI0OC45MTI3IDI1Ny44MTgsMjQ5LjA0MjcgQyAyNTcuMDg4LDI0OS4xNzY3IDI1Ni42MTEsMjUwLjAwMjcgMjU2LjYxMSwyNTAuMDAyNyBDIDI1Ni42MTEsMjUwLjAwMjcgMjU3LjIyOSwyNDkuODM5NyAyNTcuNTk1LDI0OS45MjA3IEMgMjU3Ljk1OSwyNTAuMDAyNyAyNTguMjEzLDI1MC4zNzI3IDI1OC4yMTMsMjUwLjM3MjcgQyAyNTguMjEzLDI1MC4zNzI3IDI1OC41NDgsMjUwLjA3OTcgMjU4LjY2LDI0OS45MjA3IEMgMjU4Ljc3MiwyNDkuNzYyNyAyNTguOTY1LDI0OS4zNjA3IDI1OC45NjUsMjQ5LjM2MDcgTCAyNTguOTY4LDI0OS4zNjA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2NzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNkYjQ0NDYiCi0gICAgICAgICAgIGQ9Ik0gMjU4LjEyNywyNTIuMzExNyBDIDI1OC4xMjcsMjUyLjMxMTcgMjU3LjUwOSwyNTIuMjA2NyAyNTYuOTc3LDI1Mi42MzI3IEMgMjU2LjQ0NCwyNTMuMDU5NyAyNTYuNDE0LDI1My44ODE3IDI1Ni40MTQsMjUzLjg4MTcgQyAyNTYuNDE0LDI1My44ODE3IDI1Ni45MjEsMjUzLjQ1NDcgMjU3LjMxNiwyNTMuNTExNyBDIDI1Ny43MDcsMjUzLjU2MDcgMjU4LjE4MywyNTMuNzc1NyAyNTguMTgzLDI1My43NzU3IEMgMjU4LjE4MywyNTMuNzc1NyAyNTguMjY5LDI1My4yNjc3IDI1OC4yOTQsMjUzLjEzNzcgQyAyNTguMzgxLDI1Mi43NjY3IDI1OC4xMjcsMjUyLjMxMTcgMjU4LjEyNywyNTIuMzExNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjczIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNTguMTI3LDI1Mi4zMTE3IEMgMjU4LjEyNywyNTIuMzExNyAyNTcuNTA5LDI1Mi4yMDY3IDI1Ni45NzcsMjUyLjYzMjcgQyAyNTYuNDQ0LDI1My4wNTk3IDI1Ni40MTQsMjUzLjg4MTcgMjU2LjQxNCwyNTMuODgxNyBDIDI1Ni40MTQsMjUzLjg4MTcgMjU2LjkyMSwyNTMuNDU0NyAyNTcuMzE2LDI1My41MTE3IEMgMjU3LjcwNywyNTMuNTYwNyAyNTguMTgzLDI1My43NzU3IDI1OC4xODMsMjUzLjc3NTcgQyAyNTguMTgzLDI1My43NzU3IDI1OC4yNjksMjUzLjI2NzcgMjU4LjI5NCwyNTMuMTM3NyBDIDI1OC4zODEsMjUyLjc2NjcgMjU4LjEyNywyNTIuMzExNyAyNTguMTI3LDI1Mi4zMTE3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2NzUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNkYjQ0NDYiCi0gICAgICAgICAgIGQ9Ik0gMjU5LjU2MSwyNTUuMDI3NyBDIDI1OS41NjEsMjU1LjAyNzcgMjU5LjUyLDI1NS44MTc3IDI1OS44OTYsMjU2LjMwMDcgQyAyNjAuMjkxLDI1Ni44MDg3IDI2MS4wMjEsMjU2Ljg4NjcgMjYxLjAyMSwyNTYuODg2NyBDIDI2MS4wMjEsMjU2Ljg4NjcgMjYwLjc3NSwyNTYuMzU3NyAyNjAuNzM4LDI1Ni4wODg3IEMgMjYwLjY4MiwyNTUuNjkwNyAyNjEuMDczLDI1NS4zNDQ3IDI2MS4wNzMsMjU1LjM0NDcgQyAyNjEuMDczLDI1NS4zNDQ3IDI2MC43MTIsMjU0Ljk3NDcgMjYwLjM0NywyNTQuOTc0NyBDIDI1OS45ODEsMjU0Ljk3NDcgMjU5LjU2MSwyNTUuMDI3NyAyNTkuNTYxLDI1NS4wMjc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2NzciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI1OS41NjEsMjU1LjAyNzcgQyAyNTkuNTYxLDI1NS4wMjc3IDI1OS41MiwyNTUuODE3NyAyNTkuODk2LDI1Ni4zMDA3IEMgMjYwLjI5MSwyNTYuODA4NyAyNjEuMDIxLDI1Ni44ODY3IDI2MS4wMjEsMjU2Ljg4NjcgQyAyNjEuMDIxLDI1Ni44ODY3IDI2MC43NzUsMjU2LjM1NzcgMjYwLjczOCwyNTYuMDg4NyBDIDI2MC42ODIsMjU1LjY5MDcgMjYxLjA3MywyNTUuMzQ0NyAyNjEuMDczLDI1NS4zNDQ3IEMgMjYxLjA3MywyNTUuMzQ0NyAyNjAuNzEyLDI1NC45NzQ3IDI2MC4zNDcsMjU0Ljk3NDcgQyAyNTkuOTgxLDI1NC45NzQ3IDI1OS41NjEsMjU1LjAyNzcgMjU5LjU2MSwyNTUuMDI3NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Njc5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNzYuMTI1LDI1Ni4zNTM3IEMgMjc2LjEyNSwyNTYuMzUzNyAyNzguMTQ3LDI1Ny42MDU3IDI3OC4wOTEsMjU4LjY0MjcgQyAyNzguMDMxLDI1OS42Nzk3IDI3Ni45NjYsMjYxLjAzNjcgMjc2Ljk2NiwyNjEuMDM2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjgxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZGI0NDQ2IgotICAgICAgICAgICBkPSJNIDI2Ni44NTgsMjYyLjAyMDcgQyAyNjYuODU4LDI2Mi4wMjA3IDI2Ni4zNTMsMjYxLjM4MjcgMjY1LjY1MywyNjEuNDA3NyBDIDI2NC45NDksMjYxLjQzNTcgMjY0LjIxOCwyNjIuMDk0NyAyNjQuMjE4LDI2Mi4wOTQ3IEMgMjY0LjIxOCwyNjIuMDk0NyAyNjUuMDkxLDI2Mi4wMjA3IDI2NS4zMTMsMjYyLjMwOTcgQyAyNjUuNTQxLDI2Mi42MDY3IDI2NS43NjQsMjYyLjk3MjcgMjY1Ljc2NCwyNjIuOTcyNyBDIDI2NS43NjQsMjYyLjk3MjcgMjY2LjE1NiwyNjIuNzY0NyAyNjYuMzI3LDI2Mi42MzA3IEMgMjY2LjQ5NSwyNjIuNTAwNyAyNjYuODU4LDI2Mi4wMjA3IDI2Ni44NTgsMjYyLjAyMDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTY4MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjY2Ljg1OCwyNjIuMDIwNyBDIDI2Ni44NTgsMjYyLjAyMDcgMjY2LjM1MywyNjEuMzgyNyAyNjUuNjUzLDI2MS40MDc3IEMgMjY0Ljk0OSwyNjEuNDM1NyAyNjQuMjE4LDI2Mi4wOTQ3IDI2NC4yMTgsMjYyLjA5NDcgQyAyNjQuMjE4LDI2Mi4wOTQ3IDI2NS4wOTEsMjYyLjAyMDcgMjY1LjMxMywyNjIuMzA5NyBDIDI2NS41NDEsMjYyLjYwNjcgMjY1Ljc2NCwyNjIuOTcyNyAyNjUuNzY0LDI2Mi45NzI3IEMgMjY1Ljc2NCwyNjIuOTcyNyAyNjYuMTU2LDI2Mi43NjQ3IDI2Ni4zMjcsMjYyLjYzMDcgQyAyNjYuNDk1LDI2Mi41MDA3IDI2Ni44NTgsMjYyLjAyMDcgMjY2Ljg1OCwyNjIuMDIwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Njg1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZGI0NDQ2IgotICAgICAgICAgICBkPSJNIDI2NC42OTYsMjY0LjgxMDcgQyAyNjQuNjk2LDI2NC44MTA3IDI2My43NzMsMjY0LjY3NjcgMjYzLjMyMiwyNjUuMTU1NyBDIDI2Mi44NzEsMjY1LjYzMjcgMjYyLjkwMSwyNjYuNTEwNyAyNjIuOTAxLDI2Ni41MTA3IEMgMjYyLjkwMSwyNjYuNTEwNyAyNjMuNDY0LDI2NS45MDA3IDI2My45NjYsMjY1Ljk1MjcgQyAyNjQuNDczLDI2Ni4wMDU3IDI2NS4wMzUsMjY2LjI3MzcgMjY1LjAzNSwyNjYuMjczNyBDIDI2NS4wMzUsMjY2LjI3MzcgMjY0Ljk0OSwyNjUuNzQxNyAyNjQuODkzLDI2NS41MDE3IEMgMjY0LjgzNywyNjUuMjYxNyAyNjQuNjk2LDI2NC44MTA3IDI2NC42OTYsMjY0LjgxMDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTY4NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjY0LjY5NiwyNjQuODEwNyBDIDI2NC42OTYsMjY0LjgxMDcgMjYzLjc3MywyNjQuNjc2NyAyNjMuMzIyLDI2NS4xNTU3IEMgMjYyLjg3MSwyNjUuNjMyNyAyNjIuOTAxLDI2Ni41MTA3IDI2Mi45MDEsMjY2LjUxMDcgQyAyNjIuOTAxLDI2Ni41MTA3IDI2My40NjQsMjY1LjkwMDcgMjYzLjk2NiwyNjUuOTUyNyBDIDI2NC40NzMsMjY2LjAwNTcgMjY1LjAzNSwyNjYuMjczNyAyNjUuMDM1LDI2Ni4yNzM3IEMgMjY1LjAzNSwyNjYuMjczNyAyNjQuOTQ5LDI2NS43NDE3IDI2NC44OTMsMjY1LjUwMTcgQyAyNjQuODM3LDI2NS4yNjE3IDI2NC42OTYsMjY0LjgxMDcgMjY0LjY5NiwyNjQuODEwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Njg5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZGI0NDQ2IgotICAgICAgICAgICBkPSJNIDI2Ni42OTIsMjY3Ljc2MjcgQyAyNjYuNjkyLDI2Ny43NjI3IDI2Ni4yNDEsMjY4LjQwMDcgMjY2LjU4LDI2OC45MDQ3IEMgMjY2LjkxNSwyNjkuNDEyNyAyNjcuNjE2LDI2OS42NTI3IDI2Ny42MTYsMjY5LjY1MjcgQyAyNjcuNjE2LDI2OS42NTI3IDI2Ny4zNjYsMjY5LjI4MjcgMjY3LjQ3OCwyNjguODUxNyBDIDI2Ny41NjcsMjY4LjUxMzcgMjY4LjE1MiwyNjguMDU0NyAyNjguMTUyLDI2OC4wNTQ3IEwgMjY2LjY5MiwyNjcuNzY1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NjkxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNjYuNjkyLDI2Ny43NjI3IEMgMjY2LjY5MiwyNjcuNzYyNyAyNjYuMjQxLDI2OC40MDA3IDI2Ni41OCwyNjguOTA0NyBDIDI2Ni45MTUsMjY5LjQxMjcgMjY3LjYxNiwyNjkuNjUyNyAyNjcuNjE2LDI2OS42NTI3IEMgMjY3LjYxNiwyNjkuNjUyNyAyNjcuMzY2LDI2OS4yODI3IDI2Ny40NzgsMjY4Ljg1MTcgQyAyNjcuNTY3LDI2OC41MTM3IDI2OC4xNTIsMjY4LjA1NDcgMjY4LjE1MiwyNjguMDU0NyBMIDI2Ni42OTIsMjY3Ljc2NTcgTCAyNjYuNjkyLDI2Ny43NjI3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2OTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNkYjQ0NDYiCi0gICAgICAgICAgIGQ9Ik0gMjc5LjAxNCwyNjguOTYxNyBDIDI3OS4wMTQsMjY4Ljk2MTcgMjc4LjIwMywyNjguNzcwNyAyNzcuNzUyLDI2OS4wMzg3IEMgMjc3LjMwNSwyNjkuMzAzNyAyNzYuOTQsMjcwLjQyMTcgMjc2Ljk0LDI3MC40MjE3IEMgMjc2Ljk0LDI3MC40MjE3IDI3Ny42NywyNjkuODExNyAyNzguMjAzLDI2OS44ODU3IEMgMjc4LjczNSwyNjkuOTY5NyAyNzkuMTMsMjcwLjE4MTcgMjc5LjEzLDI3MC4xODE3IEMgMjc5LjEzLDI3MC4xODE3IDI3OS4yMTEsMjY5LjcyNjcgMjc5LjE1NSwyNjkuNDEyNyBDIDI3OS4xMjIsMjY5LjIyMjcgMjc5LjAxNCwyNjguOTYxNyAyNzkuMDE0LDI2OC45NjE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2OTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI3OS4wMTQsMjY4Ljk2MTcgQyAyNzkuMDE0LDI2OC45NjE3IDI3OC4yMDMsMjY4Ljc3MDcgMjc3Ljc1MiwyNjkuMDM4NyBDIDI3Ny4zMDUsMjY5LjMwMzcgMjc2Ljk0LDI3MC40MjE3IDI3Ni45NCwyNzAuNDIxNyBDIDI3Ni45NCwyNzAuNDIxNyAyNzcuNjcsMjY5LjgxMTcgMjc4LjIwMywyNjkuODg1NyBDIDI3OC43MzUsMjY5Ljk2OTcgMjc5LjEzLDI3MC4xODE3IDI3OS4xMywyNzAuMTgxNyBDIDI3OS4xMywyNzAuMTgxNyAyNzkuMjExLDI2OS43MjY3IDI3OS4xNTUsMjY5LjQxMjcgQyAyNzkuMTIyLDI2OS4yMjI3IDI3OS4wMTQsMjY4Ljk2MTcgMjc5LjAxNCwyNjguOTYxNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Njk3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZGI0NDQ2IgotICAgICAgICAgICBkPSJNIDI3OS40MDksMjcxLjkzNDcgQyAyNzkuNDA5LDI3MS45MzQ3IDI3OC43OTEsMjcyLjU3MjcgMjc5LjAxNCwyNzMuMTA0NyBDIDI3OS4yNDEsMjczLjYzNzcgMjc5LjYzMiwyNzQuMTk0NyAyNzkuNjMyLDI3NC4xOTQ3IEMgMjc5LjYzMiwyNzQuMTk0NyAyNzkuNjEsMjczLjQwMTcgMjc5Ljg2LDI3My4xODY3IEMgMjgwLjIyMSwyNzIuODY4NyAyODAuODk1LDI3Mi44MTI3IDI4MC44OTUsMjcyLjgxMjcgQyAyODAuODk1LDI3Mi44MTI3IDI4MC4zNjIsMjcyLjMzNjcgMjgwLjE5MSwyNzIuMjgzNyBDIDI4MC4wMjcsMjcyLjIyNjcgMjc5LjQwOSwyNzEuOTM0NyAyNzkuNDA5LDI3MS45MzQ3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU2OTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI3OS40MDksMjcxLjkzNDcgQyAyNzkuNDA5LDI3MS45MzQ3IDI3OC43OTEsMjcyLjU3MjcgMjc5LjAxNCwyNzMuMTA0NyBDIDI3OS4yNDEsMjczLjYzNzcgMjc5LjYzMiwyNzQuMTk0NyAyNzkuNjMyLDI3NC4xOTQ3IEMgMjc5LjYzMiwyNzQuMTk0NyAyNzkuNjEsMjczLjQwMTcgMjc5Ljg2LDI3My4xODY3IEMgMjgwLjIyMSwyNzIuODY4NyAyODAuODk1LDI3Mi44MTI3IDI4MC44OTUsMjcyLjgxMjcgQyAyODAuODk1LDI3Mi44MTI3IDI4MC4zNjIsMjcyLjMzNjcgMjgwLjE5MSwyNzIuMjgzNyBDIDI4MC4wMjcsMjcyLjIyNjcgMjc5LjQwOSwyNzEuOTM0NyAyNzkuNDA5LDI3MS45MzQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3MDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNkYjQ0NDYiCi0gICAgICAgICAgIGQ9Ik0gMjgyLjQ5NiwyNzIuODY4NyBDIDI4Mi40OTYsMjcyLjg2ODcgMjgyLjE4NywyNzMuNjM3NyAyODIuNzc5LDI3NC4xNDE3IEMgMjgzLjM2NywyNzQuNjQ5NyAyODMuODc0LDI3NC43MDI3IDI4My44NzQsMjc0LjcwMjcgQyAyODMuODc0LDI3NC43MDI3IDI4My40MjMsMjczLjkwMTcgMjgzLjU2NSwyNzMuNDc4NyBDIDI4My43MSwyNzMuMDM3NyAyODQuMDk3LDI3Mi43NjI3IDI4NC4wOTcsMjcyLjc2MjcgQyAyODQuMDk3LDI3Mi43NjI3IDI4My4zNjcsMjcyLjUxOTcgMjgzLjI1NSwyNzIuNTQ3NyBDIDI4My4xNDQsMjcyLjU3MjcgMjgyLjQ5NiwyNzIuODY4NyAyODIuNDk2LDI3Mi44Njg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3MDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI4Mi40OTYsMjcyLjg2ODcgQyAyODIuNDk2LDI3Mi44Njg3IDI4Mi4xODcsMjczLjYzNzcgMjgyLjc3OSwyNzQuMTQxNyBDIDI4My4zNjcsMjc0LjY0OTcgMjgzLjg3NCwyNzQuNzAyNyAyODMuODc0LDI3NC43MDI3IEMgMjgzLjg3NCwyNzQuNzAyNyAyODMuNDIzLDI3My45MDE3IDI4My41NjUsMjczLjQ3ODcgQyAyODMuNzEsMjczLjAzNzcgMjg0LjA5NywyNzIuNzYyNyAyODQuMDk3LDI3Mi43NjI3IEMgMjg0LjA5NywyNzIuNzYyNyAyODMuMzY3LDI3Mi41MTk3IDI4My4yNTUsMjcyLjU0NzcgQyAyODMuMTQ0LDI3Mi41NzI3IDI4Mi40OTYsMjcyLjg2ODcgMjgyLjQ5NiwyNzIuODY4NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzA1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZkNjkxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjUxNDk5OTk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjUwLjg3MywzMjcuOTk2NyBDIDI1Mi45NTEsMzI4LjYyMTcgMjU0LjAwNCwzMzAuMTY5NyAyNTQuMDA0LDMzMS45ODE3IEMgMjU0LjAwNCwzMzQuMzQxNyAyNTEuNzE1LDMzNi4xMzI3IDI0OC43NDMsMzM2LjEzMjcgQyAyNDUuNzcyLDMzNi4xMzI3IDI0My4zNjIsMzM0LjM0MTcgMjQzLjM2MiwzMzEuOTgxNyBDIDI0My4zNjIsMzMwLjE5NzcgMjQ0LjM1MywzMjguMjA0NyAyNDYuNDE5LDMyOC4wNjA3IEMgMjQ2LjQxOSwzMjguMDYwNyAyNDYuMzU2LDMyNy44NzM3IDI0Ni4xNzgsMzI3LjU2NjcgQyAyNDUuOTY0LDMyNy4zMzc3IDI0NS41NDEsMzI2LjkxMDcgMjQ1LjU0MSwzMjYuOTEwNyBDIDI0NS41NDEsMzI2LjkxMDcgMjQ2LjMzLDMyNi43NjI3IDI0Ni43ODUsMzI2LjkzNTcgQyAyNDcuMjQzLDMyNy4xMDg3IDI0Ny41NDQsMzI3LjM5NzcgMjQ3LjU0NCwzMjcuMzk3NyBDIDI0Ny41NDQsMzI3LjM5NzcgMjQ3Ljc2LDMyNi45NzQ3IDI0OC4wNjIsMzI2LjY0NjcgQyAyNDguMzY3LDMyNi4zMjE3IDI0OC43NjIsMzI2LjExNzcgMjQ4Ljc2MiwzMjYuMTE3NyBDIDI0OC43NjIsMzI2LjExNzcgMjQ5LjIxOSwzMjYuNTAxNyAyNDkuMzY5LDMyNi43NTg3IEMgMjQ5LjUxOCwzMjcuMDIzNyAyNDkuNjE1LDMyNy4zMzc3IDI0OS42MTUsMzI3LjMzNzcgQyAyNDkuNjE1LDMyNy4zMzc3IDI1MC4wMzUsMzI2Ljk5MTcgMjUwLjQsMzI2Ljg1MDcgQyAyNTAuNzY0LDMyNi43MDY3IDI1MS4yMzQsMzI2LjU5MzcgMjUxLjIzNCwzMjYuNTkzNyBDIDI1MS4yMzQsMzI2LjU5MzcgMjUxLjEsMzI3LjA0ODcgMjUxLjAxMSwzMjcuMjgwNyBDIDI1MC45MjEsMzI3LjUxMDcgMjUwLjg3MywzMjcuOTk2NyAyNTAuODczLDMyNy45OTY3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3MDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiMwNThlNmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNTE0OTk5OTk7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNDguMzA0LDMzOC42OTM3IEMgMjQ4LjMwNCwzMzguNjkzNyAyNDQuMzUzLDMzNi4wMzA3IDI0Mi42NCwzMzUuNjcwNyBDIDI0MC40NSwzMzUuMjA4NyAyMzcuOTg5LDMzNS41ODI3IDIzNi45MjQsMzM1LjUyNjcgQyAyMzYuOTU0LDMzNS41NTc3IDIzOC4yMDEsMzM2LjQ0NjcgMjM4Ljc0OCwzMzYuOTk2NyBDIDIzOS4yOTYsMzM3LjU0MzcgMjQxLjEyMSwzMzguNjM2NyAyNDIuMTUyLDMzOC44OTQ3IEMgMjQ1LjM1OCwzMzkuNjk4NyAyNDguMzA0LDMzOC42OTM3IDI0OC4zMDQsMzM4LjY5MzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTcwOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6IzA1OGU2ZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MTQ5OTk5OTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0OS40MzIsMzM4LjkyNTcgQyAyNDkuNDMyLDMzOC45MjU3IDI1MS45NjMsMzM2LjI5NDcgMjU0LjYxMiwzMzUuOTMxNyBDIDI1Ny43NDMsMzM1LjQ5NzcgMjU5Ljc5MiwzMzYuMTg5NyAyNjEuMDA4LDMzNi41MDY3IEMgMjYxLjAzNiwzMzYuNTA2NyAyNjAuMDAzLDMzNi45OTY3IDI1OS40NTcsMzM3LjM3MDcgQyAyNTguOTA4LDMzNy43NDQ3IDI1Ny40OTgsMzM4LjkyNTcgMjU1LjM0MiwzMzguOTUwNyBDIDI1My4xODIsMzM4Ljk4MjcgMjUwLjc5OSwzMzguNzI0NyAyNTAuNDA0LDMzOC43ODQ3IEMgMjUwLjAwOSwzMzguODM3NyAyNDkuNDMyLDMzOC45MjU3IDI0OS40MzIsMzM4LjkyNTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTcxMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I0FEMTUxOTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MTQ5OTk5OTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI0OC42NzMsMzM1LjY3MDcgQyAyNDcuNjc4LDMzNC43NDY3IDI0Ny4wNTksMzMzLjQzNDcgMjQ3LjA1OSwzMzEuOTc4NyBDIDI0Ny4wNTksMzMwLjUyNTcgMjQ3LjY4MiwzMjkuMjEzNyAyNDguNjc2LDMyOC4yOTM3IEMgMjQ5LjY2NywzMjkuMjEzNyAyNTAuMjgxLDMzMC41MjU3IDI1MC4yODEsMzMxLjk3ODcgQyAyNTAuMjgxLDMzMy40MzQ3IDI0OS42NjMsMzM0Ljc0NjcgMjQ4LjY3MywzMzUuNjcwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzEzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojMDU4ZTZlO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjUxNDk5OTk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjQ3LjY2NywzNDEuMDY2NyBDIDI0Ny42NjcsMzQxLjA2NjcgMjQ4LjI3OCwzMzkuNTU3NyAyNDguMzM3LDMzOC4yNTk3IEMgMjQ4LjM4OSwzMzcuMTczNyAyNDguMTg0LDMzNi4xMDE3IDI0OC4xODQsMzM2LjEwMTcgQyAyNDguMTg0LDMzNi4xMDE3IDI0OC41MiwzMzYuMTAxNyAyNDguNzAyLDMzNi4xMDE3IEMgMjQ4Ljg4NSwzMzYuMTAxNyAyNDguOTc0LDMzNi4xMDE3IDI0OC45NzQsMzM2LjEwMTcgQyAyNDguOTc0LDMzNi4xMDE3IDI0OS4zNjksMzM3LjI1NDcgMjQ5LjM2OSwzMzguMjU5NyBDIDI0OS4zNjksMzM5LjI2NzcgMjQ5LjE4NiwzNDAuNjA4NyAyNDkuMTg2LDM0MC42MDg3IEMgMjQ5LjE4NiwzNDAuNjA4NyAyNDguNjM5LDM0MC42OTI3IDI0OC40NTcsMzQwLjc3NzcgQyAyNDguMjc4LDM0MC44NjU3IDI0Ny42NjcsMzQxLjA2NjcgMjQ3LjY2NywzNDEuMDY2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzE1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDI5Ny42NDgsMTk4LjAxNjcgQyAyOTcuNjQ4LDE5Ny40NDQ3IDI5OC4xMzYsMTk2Ljk4OTcgMjk4LjczNiwxOTYuOTg5NyBDIDI5OS4zMzksMTk2Ljk4OTcgMjk5LjgyMywxOTcuNDQ0NyAyOTkuODIzLDE5OC4wMTY3IEMgMjk5LjgyMywxOTguNTg3NyAyOTkuMzM5LDE5OS4wNDU3IDI5OC43MzYsMTk5LjA0NTcgQyAyOTguMTM2LDE5OS4wNDU3IDI5Ny42NDgsMTk4LjU4NzcgMjk3LjY0OCwxOTguMDE2NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzE3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyOTcuNjQ4LDE5OC4wMTY3IEMgMjk3LjY0OCwxOTcuNDQ0NyAyOTguMTM2LDE5Ni45ODk3IDI5OC43MzYsMTk2Ljk4OTcgQyAyOTkuMzM5LDE5Ni45ODk3IDI5OS44MjMsMTk3LjQ0NDcgMjk5LjgyMywxOTguMDE2NyBDIDI5OS44MjMsMTk4LjU4NzcgMjk5LjMzOSwxOTkuMDQ1NyAyOTguNzM2LDE5OS4wNDU3IEMgMjk4LjEzNiwxOTkuMDQ1NyAyOTcuNjQ4LDE5OC41ODc3IDI5Ny42NDgsMTk4LjAxNjcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTcxOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyOTkuMTM3LDE5NS4zNzg3IEMgMjk5LjEzNywxOTQuODEwNyAyOTkuNjIyLDE5NC4zNTE3IDMwMC4yMjUsMTk0LjM1MTcgQyAzMDAuODI0LDE5NC4zNTE3IDMwMS4zMTIsMTk0LjgxMDcgMzAxLjMxMiwxOTUuMzc4NyBDIDMwMS4zMTIsMTk1Ljk1MzcgMzAwLjgyNCwxOTYuNDExNyAzMDAuMjI1LDE5Ni40MTE3IEMgMjk5LjYyMiwxOTYuNDExNyAyOTkuMTM3LDE5NS45NTM3IDI5OS4xMzcsMTk1LjM3ODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTcyMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjk5LjEzNywxOTUuMzc4NyBDIDI5OS4xMzcsMTk0LjgxMDcgMjk5LjYyMiwxOTQuMzUxNyAzMDAuMjI1LDE5NC4zNTE3IEMgMzAwLjgyNCwxOTQuMzUxNyAzMDEuMzEyLDE5NC44MTA3IDMwMS4zMTIsMTk1LjM3ODcgQyAzMDEuMzEyLDE5NS45NTM3IDMwMC44MjQsMTk2LjQxMTcgMzAwLjIyNSwxOTYuNDExNyBDIDI5OS42MjIsMTk2LjQxMTcgMjk5LjEzNywxOTUuOTUzNyAyOTkuMTM3LDE5NS4zNzg3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3MjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMzAwLjEyNywxOTIuMzI0NyBDIDMwMC4xMjcsMTkxLjc1NjcgMzAwLjYxNiwxOTEuMjk0NyAzMDEuMjIsMTkxLjI5NDcgQyAzMDEuODE5LDE5MS4yOTQ3IDMwMi4zMDcsMTkxLjc1NjcgMzAyLjMwNywxOTIuMzI0NyBDIDMwMi4zMDcsMTkyLjg5NTcgMzAxLjgxOSwxOTMuMzU3NyAzMDEuMjIsMTkzLjM1NzcgQyAzMDAuNjE2LDE5My4zNTc3IDMwMC4xMjcsMTkyLjg5NTcgMzAwLjEyNywxOTIuMzI0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzI1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAzMDAuMTI3LDE5Mi4zMjQ3IEMgMzAwLjEyNywxOTEuNzU2NyAzMDAuNjE2LDE5MS4yOTQ3IDMwMS4yMiwxOTEuMjk0NyBDIDMwMS44MTksMTkxLjI5NDcgMzAyLjMwNywxOTEuNzU2NyAzMDIuMzA3LDE5Mi4zMjQ3IEMgMzAyLjMwNywxOTIuODk1NyAzMDEuODE5LDE5My4zNTc3IDMwMS4yMiwxOTMuMzU3NyBDIDMwMC42MTYsMTkzLjM1NzcgMzAwLjEyNywxOTIuODk1NyAzMDAuMTI3LDE5Mi4zMjQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3MjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMzAwLjI1NSwxODkuMDQ3NyBDIDMwMC4yNTUsMTg4LjQ3NjcgMzAwLjc0MiwxODguMDE4NyAzMDEuMzQxLDE4OC4wMTg3IEMgMzAxLjk0MSwxODguMDE4NyAzMDIuNDI5LDE4OC40NzY3IDMwMi40MjksMTg5LjA0NzcgQyAzMDIuNDI5LDE4OS42MTk3IDMwMS45NDEsMTkwLjA3NzcgMzAxLjM0MSwxOTAuMDc3NyBDIDMwMC43NDIsMTkwLjA3NzcgMzAwLjI1NSwxODkuNjE5NyAzMDAuMjU1LDE4OS4wNDc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3MjkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDMwMC4yNTUsMTg5LjA0NzcgQyAzMDAuMjU1LDE4OC40NzY3IDMwMC43NDIsMTg4LjAxODcgMzAxLjM0MSwxODguMDE4NyBDIDMwMS45NDEsMTg4LjAxODcgMzAyLjQyOSwxODguNDc2NyAzMDIuNDI5LDE4OS4wNDc3IEMgMzAyLjQyOSwxODkuNjE5NyAzMDEuOTQxLDE5MC4wNzc3IDMwMS4zNDEsMTkwLjA3NzcgQyAzMDAuNzQyLDE5MC4wNzc3IDMwMC4yNTUsMTg5LjYxOTcgMzAwLjI1NSwxODkuMDQ3NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzMxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDI5OS40NDcsMTg1LjgyMTcgQyAyOTkuNDQ3LDE4NS4yNTM3IDI5OS45MzUsMTg0Ljc5NDcgMzAwLjUzMywxODQuNzk0NyBDIDMwMS4xMzcsMTg0Ljc5NDcgMzAxLjYyNSwxODUuMjUzNyAzMDEuNjI1LDE4NS44MjE3IEMgMzAxLjYyNSwxODYuMzk1NyAzMDEuMTM3LDE4Ni44NTQ3IDMwMC41MzMsMTg2Ljg1NDcgQyAyOTkuOTM1LDE4Ni44NTQ3IDI5OS40NDcsMTg2LjM5NTcgMjk5LjQ0NywxODUuODIxNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzMzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyOTkuNDQ3LDE4NS44MjE3IEMgMjk5LjQ0NywxODUuMjUzNyAyOTkuOTM1LDE4NC43OTQ3IDMwMC41MzMsMTg0Ljc5NDcgQyAzMDEuMTM3LDE4NC43OTQ3IDMwMS42MjUsMTg1LjI1MzcgMzAxLjYyNSwxODUuODIxNyBDIDMwMS42MjUsMTg2LjM5NTcgMzAxLjEzNywxODYuODU0NyAzMDAuNTMzLDE4Ni44NTQ3IEMgMjk5LjkzNSwxODYuODU0NyAyOTkuNDQ3LDE4Ni4zOTU3IDI5OS40NDcsMTg1LjgyMTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTczNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyOTcuNzcxLDE4Mi44OTM3IEMgMjk3Ljc3MSwxODIuMzIyNyAyOTguMjU5LDE4MS44NjQ3IDI5OC44NTksMTgxLjg2NDcgQyAyOTkuNDYyLDE4MS44NjQ3IDI5OS45NDgsMTgyLjMyMjcgMjk5Ljk0OCwxODIuODkzNyBDIDI5OS45NDgsMTgzLjQ2NTcgMjk5LjQ2MiwxODMuOTI3NyAyOTguODU5LDE4My45Mjc3IEMgMjk4LjI1OSwxODMuOTI3NyAyOTcuNzcxLDE4My40NjU3IDI5Ny43NzEsMTgyLjg5MzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTczNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjk3Ljc3MSwxODIuODkzNyBDIDI5Ny43NzEsMTgyLjMyMjcgMjk4LjI1OSwxODEuODY0NyAyOTguODU5LDE4MS44NjQ3IEMgMjk5LjQ2MiwxODEuODY0NyAyOTkuOTQ4LDE4Mi4zMjI3IDI5OS45NDgsMTgyLjg5MzcgQyAyOTkuOTQ4LDE4My40NjU3IDI5OS40NjIsMTgzLjkyNzcgMjk4Ljg1OSwxODMuOTI3NyBDIDI5OC4yNTksMTgzLjkyNzcgMjk3Ljc3MSwxODMuNDY1NyAyOTcuNzcxLDE4Mi44OTM3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3MzkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjk1LjUzNywxODAuNDg4NyBDIDI5NS41MzcsMTc5LjkxNzcgMjk2LjAyNCwxNzkuNDU1NyAyOTYuNjI0LDE3OS40NTU3IEMgMjk3LjIyOCwxNzkuNDU1NyAyOTcuNzE1LDE3OS45MTc3IDI5Ny43MTUsMTgwLjQ4ODcgQyAyOTcuNzE1LDE4MS4wNTY3IDI5Ny4yMjgsMTgxLjUxODcgMjk2LjYyNCwxODEuNTE4NyBDIDI5Ni4wMjQsMTgxLjUxODcgMjk1LjUzNywxODEuMDU2NyAyOTUuNTM3LDE4MC40ODg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3NDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI5NS41MzcsMTgwLjQ4ODcgQyAyOTUuNTM3LDE3OS45MTc3IDI5Ni4wMjQsMTc5LjQ1NTcgMjk2LjYyNCwxNzkuNDU1NyBDIDI5Ny4yMjgsMTc5LjQ1NTcgMjk3LjcxNSwxNzkuOTE3NyAyOTcuNzE1LDE4MC40ODg3IEMgMjk3LjcxNSwxODEuMDU2NyAyOTcuMjI4LDE4MS41MTg3IDI5Ni42MjQsMTgxLjUxODcgQyAyOTYuMDI0LDE4MS41MTg3IDI5NS41MzcsMTgxLjA1NjcgMjk1LjUzNywxODAuNDg4NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzQzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDI5Mi45NDEsMTc4LjQ4OTcgQyAyOTIuOTQxLDE3Ny45MTc3IDI5My40MjksMTc3LjQ1NTcgMjk0LjAzMywxNzcuNDU1NyBDIDI5NC42MzIsMTc3LjQ1NTcgMjk1LjEyLDE3Ny45MTc3IDI5NS4xMiwxNzguNDg5NyBDIDI5NS4xMiwxNzkuMDU2NyAyOTQuNjMyLDE3OS41MTg3IDI5NC4wMzMsMTc5LjUxODcgQyAyOTMuNDI5LDE3OS41MTg3IDI5Mi45NDEsMTc5LjA1NjcgMjkyLjk0MSwxNzguNDg5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzQ1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyOTIuOTQxLDE3OC40ODk3IEMgMjkyLjk0MSwxNzcuOTE3NyAyOTMuNDI5LDE3Ny40NTU3IDI5NC4wMzMsMTc3LjQ1NTcgQyAyOTQuNjMyLDE3Ny40NTU3IDI5NS4xMiwxNzcuOTE3NyAyOTUuMTIsMTc4LjQ4OTcgQyAyOTUuMTIsMTc5LjA1NjcgMjk0LjYzMiwxNzkuNTE4NyAyOTQuMDMzLDE3OS41MTg3IEMgMjkzLjQyOSwxNzkuNTE4NyAyOTIuOTQxLDE3OS4wNTY3IDI5Mi45NDEsMTc4LjQ4OTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc0NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyODkuODQsMTc2Ljg1MjcgQyAyODkuODQsMTc2LjI4MTcgMjkwLjMyNywxNzUuODI2NyAyOTAuOTI3LDE3NS44MjY3IEMgMjkxLjUzLDE3NS44MjY3IDI5Mi4wMTgsMTc2LjI4MTcgMjkyLjAxOCwxNzYuODUyNyBDIDI5Mi4wMTgsMTc3LjQyNDcgMjkxLjUzLDE3Ny44ODY3IDI5MC45MjcsMTc3Ljg4NjcgQyAyOTAuMzI3LDE3Ny44ODY3IDI4OS44NCwxNzcuNDI0NyAyODkuODQsMTc2Ljg1MjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc0OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjg5Ljg0LDE3Ni44NTI3IEMgMjg5Ljg0LDE3Ni4yODE3IDI5MC4zMjcsMTc1LjgyNjcgMjkwLjkyNywxNzUuODI2NyBDIDI5MS41MywxNzUuODI2NyAyOTIuMDE4LDE3Ni4yODE3IDI5Mi4wMTgsMTc2Ljg1MjcgQyAyOTIuMDE4LDE3Ny40MjQ3IDI5MS41MywxNzcuODg2NyAyOTAuOTI3LDE3Ny44ODY3IEMgMjkwLjMyNywxNzcuODg2NyAyODkuODQsMTc3LjQyNDcgMjg5Ljg0LDE3Ni44NTI3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3NTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjg2LjYyMiwxNzUuNjg1NyBDIDI4Ni42MjIsMTc1LjExNzcgMjg3LjExLDE3NC42NTU3IDI4Ny43MTMsMTc0LjY1NTcgQyAyODguMzEyLDE3NC42NTU3IDI4OC44MDEsMTc1LjExNzcgMjg4LjgwMSwxNzUuNjg1NyBDIDI4OC44MDEsMTc2LjI1NjcgMjg4LjMxMiwxNzYuNzE4NyAyODcuNzEzLDE3Ni43MTg3IEMgMjg3LjExLDE3Ni43MTg3IDI4Ni42MjIsMTc2LjI1NjcgMjg2LjYyMiwxNzUuNjg1NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzUzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyODYuNjIyLDE3NS42ODU3IEMgMjg2LjYyMiwxNzUuMTE3NyAyODcuMTEsMTc0LjY1NTcgMjg3LjcxMywxNzQuNjU1NyBDIDI4OC4zMTIsMTc0LjY1NTcgMjg4LjgwMSwxNzUuMTE3NyAyODguODAxLDE3NS42ODU3IEMgMjg4LjgwMSwxNzYuMjU2NyAyODguMzEyLDE3Ni43MTg3IDI4Ny43MTMsMTc2LjcxODcgQyAyODcuMTEsMTc2LjcxODcgMjg2LjYyMiwxNzYuMjU2NyAyODYuNjIyLDE3NS42ODU3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3NTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjgzLjAyNSwxNzUuMDQzNyBDIDI4My4wMjUsMTc0LjQ3NTcgMjgzLjUxMiwxNzQuMDEwNyAyODQuMTEyLDE3NC4wMTA3IEMgMjg0LjcxNiwxNzQuMDEwNyAyODUuMjAyLDE3NC40NzU3IDI4NS4yMDIsMTc1LjA0MzcgQyAyODUuMjAyLDE3NS42MTE3IDI4NC43MTYsMTc2LjA3MzcgMjg0LjExMiwxNzYuMDczNyBDIDI4My41MTIsMTc2LjA3MzcgMjgzLjAyNSwxNzUuNjExNyAyODMuMDI1LDE3NS4wNDM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3NTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI4My4wMjUsMTc1LjA0MzcgQyAyODMuMDI1LDE3NC40NzU3IDI4My41MTIsMTc0LjAxMDcgMjg0LjExMiwxNzQuMDEwNyBDIDI4NC43MTYsMTc0LjAxMDcgMjg1LjIwMiwxNzQuNDc1NyAyODUuMjAyLDE3NS4wNDM3IEMgMjg1LjIwMiwxNzUuNjExNyAyODQuNzE2LDE3Ni4wNzM3IDI4NC4xMTIsMTc2LjA3MzcgQyAyODMuNTEyLDE3Ni4wNzM3IDI4My4wMjUsMTc1LjYxMTcgMjgzLjAyNSwxNzUuMDQzNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzU5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDI3OS42MSwxNzQuODYzNyBDIDI3OS42MSwxNzQuMjk1NyAyODAuMDk4LDE3My44Mzc3IDI4MC43MDEsMTczLjgzNzcgQyAyODEuMzAxLDE3My44Mzc3IDI4MS43ODksMTc0LjI5NTcgMjgxLjc4OSwxNzQuODYzNyBDIDI4MS43ODksMTc1LjQzNTcgMjgxLjMwMSwxNzUuODk3NyAyODAuNzAxLDE3NS44OTc3IEMgMjgwLjA5OCwxNzUuODk3NyAyNzkuNjEsMTc1LjQzNTcgMjc5LjYxLDE3NC44NjM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3NjEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI3OS42MSwxNzQuODYzNyBDIDI3OS42MSwxNzQuMjk1NyAyODAuMDk4LDE3My44Mzc3IDI4MC43MDEsMTczLjgzNzcgQyAyODEuMzAxLDE3My44Mzc3IDI4MS43ODksMTc0LjI5NTcgMjgxLjc4OSwxNzQuODYzNyBDIDI4MS43ODksMTc1LjQzNTcgMjgxLjMwMSwxNzUuODk3NyAyODAuNzAxLDE3NS44OTc3IEMgMjgwLjA5OCwxNzUuODk3NyAyNzkuNjEsMTc1LjQzNTcgMjc5LjYxLDE3NC44NjM3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3NjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjc2LjI1OCwxNzQuOTgwNyBDIDI3Ni4yNTgsMTc0LjQxMjcgMjc2Ljc0NywxNzMuOTUwNyAyNzcuMzQ5LDE3My45NTA3IEMgMjc3Ljk1MywxNzMuOTUwNyAyNzguNDM3LDE3NC40MTI3IDI3OC40MzcsMTc0Ljk4MDcgQyAyNzguNDM3LDE3NS41NTE3IDI3Ny45NTMsMTc2LjAxMzcgMjc3LjM0OSwxNzYuMDEzNyBDIDI3Ni43NDcsMTc2LjAxMzcgMjc2LjI1OCwxNzUuNTUxNyAyNzYuMjU4LDE3NC45ODA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3NjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI3Ni4yNTgsMTc0Ljk4MDcgQyAyNzYuMjU4LDE3NC40MTI3IDI3Ni43NDcsMTczLjk1MDcgMjc3LjM0OSwxNzMuOTUwNyBDIDI3Ny45NTMsMTczLjk1MDcgMjc4LjQzNywxNzQuNDEyNyAyNzguNDM3LDE3NC45ODA3IEMgMjc4LjQzNywxNzUuNTUxNyAyNzcuOTUzLDE3Ni4wMTM3IDI3Ny4zNDksMTc2LjAxMzcgQyAyNzYuNzQ3LDE3Ni4wMTM3IDI3Ni4yNTgsMTc1LjU1MTcgMjc2LjI1OCwxNzQuOTgwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzY3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDI3Mi45MTEsMTc0Ljk4MDcgQyAyNzIuOTExLDE3NC40MTI3IDI3My4zOTgsMTczLjk1MDcgMjczLjk5OCwxNzMuOTUwNyBDIDI3NC41OTcsMTczLjk1MDcgMjc1LjA4NSwxNzQuNDEyNyAyNzUuMDg1LDE3NC45ODA3IEMgMjc1LjA4NSwxNzUuNTUxNyAyNzQuNTk3LDE3Ni4wMTM3IDI3My45OTgsMTc2LjAxMzcgQyAyNzMuMzk4LDE3Ni4wMTM3IDI3Mi45MTEsMTc1LjU1MTcgMjcyLjkxMSwxNzQuOTgwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzY5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNzIuOTExLDE3NC45ODA3IEMgMjcyLjkxMSwxNzQuNDEyNyAyNzMuMzk4LDE3My45NTA3IDI3My45OTgsMTczLjk1MDcgQyAyNzQuNTk3LDE3My45NTA3IDI3NS4wODUsMTc0LjQxMjcgMjc1LjA4NSwxNzQuOTgwNyBDIDI3NS4wODUsMTc1LjU1MTcgMjc0LjU5NywxNzYuMDEzNyAyNzMuOTk4LDE3Ni4wMTM3IEMgMjczLjM5OCwxNzYuMDEzNyAyNzIuOTExLDE3NS41NTE3IDI3Mi45MTEsMTc0Ljk4MDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc3MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZjtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI3NC41ODcsMTc3Ljg1NDcgQyAyNzQuNTg3LDE3Ny4yODM3IDI3NS4wNzUsMTc2LjgyMTcgMjc1LjY3NCwxNzYuODIxNyBDIDI3Ni4yNzcsMTc2LjgyMTcgMjc2Ljc2MSwxNzcuMjgzNyAyNzYuNzYxLDE3Ny44NTQ3IEMgMjc2Ljc2MSwxNzguNDIyNyAyNzYuMjc3LDE3OC44ODc3IDI3NS42NzQsMTc4Ljg4NzcgQyAyNzUuMDc1LDE3OC44ODc3IDI3NC41ODcsMTc4LjQyMjcgMjc0LjU4NywxNzcuODU0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzczIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjc1LjI2OCwxODEuMDI4NyBDIDI3NS4yNjgsMTgwLjQ1NzcgMjc1Ljc1NiwxNzkuOTk0NyAyNzYuMzU2LDE3OS45OTQ3IEMgMjc2Ljk1OSwxNzkuOTk0NyAyNzcuNDQ3LDE4MC40NTc3IDI3Ny40NDcsMTgxLjAyODcgQyAyNzcuNDQ3LDE4MS41OTI3IDI3Ni45NTksMTgyLjA1NDcgMjc2LjM1NiwxODIuMDU0NyBDIDI3NS43NTYsMTgyLjA1NDcgMjc1LjI2OCwxODEuNTkyNyAyNzUuMjY4LDE4MS4wMjg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3NzUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmY7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyNzUuMzkxLDE4NC4xOTE3IEMgMjc1LjM5MSwxODMuNjE2NyAyNzUuODc5LDE4My4xNTg3IDI3Ni40ODIsMTgzLjE1ODcgQyAyNzcuMDgyLDE4My4xNTg3IDI3Ny41NjgsMTgzLjYxNjcgMjc3LjU2OCwxODQuMTkxNyBDIDI3Ny41NjgsMTg0Ljc1OTcgMjc3LjA4MiwxODUuMjIxNyAyNzYuNDgyLDE4NS4yMjE3IEMgMjc1Ljg3OSwxODUuMjIxNyAyNzUuMzkxLDE4NC43NTk3IDI3NS4zOTEsMTg0LjE5MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc3NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZjtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI3NC40LDE4Ny4wNjk3IEMgMjc0LjQsMTg2LjUwMTcgMjc0Ljg4OCwxODYuMDM2NyAyNzUuNDg3LDE4Ni4wMzY3IEMgMjc2LjA5MSwxODYuMDM2NyAyNzYuNTc1LDE4Ni41MDE3IDI3Ni41NzUsMTg3LjA2OTcgQyAyNzYuNTc1LDE4Ny42NDA3IDI3Ni4wOTEsMTg4LjA5OTcgMjc1LjQ4NywxODguMDk5NyBDIDI3NC44ODgsMTg4LjA5OTcgMjc0LjQsMTg3LjY0MDcgMjc0LjQsMTg3LjA2OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc3OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZjtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDI3Mi41NDksMTg5LjcxNDcgQyAyNzIuNTQ5LDE4OS4xNDY3IDI3My4wMzgsMTg4LjY4MTcgMjczLjYzNywxODguNjgxNyBDIDI3NC4yMzksMTg4LjY4MTcgMjc0LjcyNCwxODkuMTQ2NyAyNzQuNzI0LDE4OS43MTQ3IEMgMjc0LjcyNCwxOTAuMjgyNyAyNzQuMjM5LDE5MC43NDQ3IDI3My42MzcsMTkwLjc0NDcgQyAyNzMuMDM4LDE5MC43NDQ3IDI3Mi41NDksMTkwLjI4MjcgMjcyLjU0OSwxODkuNzE0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzgxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDI3MC4zNzUsMTcyLjk4NDcgQyAyNzAuMzc1LDE3Mi40MTY3IDI3MC44NjMsMTcxLjk1NzcgMjcxLjQ2NiwxNzEuOTU3NyBDIDI3Mi4wNjYsMTcxLjk1NzcgMjcyLjU1MywxNzIuNDE2NyAyNzIuNTUzLDE3Mi45ODQ3IEMgMjcyLjU1MywxNzMuNTU1NyAyNzIuMDY2LDE3NC4wMTc3IDI3MS40NjYsMTc0LjAxNzcgQyAyNzAuODYzLDE3NC4wMTc3IDI3MC4zNzUsMTczLjU1NTcgMjcwLjM3NSwxNzIuOTg0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzgzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNzAuMzc1LDE3Mi45ODQ3IEMgMjcwLjM3NSwxNzIuNDE2NyAyNzAuODYzLDE3MS45NTc3IDI3MS40NjYsMTcxLjk1NzcgQyAyNzIuMDY2LDE3MS45NTc3IDI3Mi41NTMsMTcyLjQxNjcgMjcyLjU1MywxNzIuOTg0NyBDIDI3Mi41NTMsMTczLjU1NTcgMjcyLjA2NiwxNzQuMDE3NyAyNzEuNDY2LDE3NC4wMTc3IEMgMjcwLjg2MywxNzQuMDE3NyAyNzAuMzc1LDE3My41NTU3IDI3MC4zNzUsMTcyLjk4NDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc4NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyNjcuMzk5LDE3MS4zNDA3IEMgMjY3LjM5OSwxNzAuNzcyNyAyNjcuODg0LDE3MC4zMDc3IDI2OC40ODcsMTcwLjMwNzcgQyAyNjkuMDg3LDE3MC4zMDc3IDI2OS41NzMsMTcwLjc3MjcgMjY5LjU3MywxNzEuMzQwNyBDIDI2OS41NzMsMTcxLjkwODcgMjY5LjA4NywxNzIuMzcwNyAyNjguNDg3LDE3Mi4zNzA3IEMgMjY3Ljg4NCwxNzIuMzcwNyAyNjcuMzk5LDE3MS45MDg3IDI2Ny4zOTksMTcxLjM0MDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc4NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjY3LjM5OSwxNzEuMzQwNyBDIDI2Ny4zOTksMTcwLjc3MjcgMjY3Ljg4NCwxNzAuMzA3NyAyNjguNDg3LDE3MC4zMDc3IEMgMjY5LjA4NywxNzAuMzA3NyAyNjkuNTczLDE3MC43NzI3IDI2OS41NzMsMTcxLjM0MDcgQyAyNjkuNTczLDE3MS45MDg3IDI2OS4wODcsMTcyLjM3MDcgMjY4LjQ4NywxNzIuMzcwNyBDIDI2Ny44ODQsMTcyLjM3MDcgMjY3LjM5OSwxNzEuOTA4NyAyNjcuMzk5LDE3MS4zNDA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3ODkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjY0LjExOSwxNzAuMzQ5NyBDIDI2NC4xMTksMTY5Ljc4MTcgMjY0LjYwNywxNjkuMzIzNyAyNjUuMjA5LDE2OS4zMjM3IEMgMjY1LjgwOSwxNjkuMzIzNyAyNjYuMjk3LDE2OS43ODE3IDI2Ni4yOTcsMTcwLjM0OTcgQyAyNjYuMjk3LDE3MC45MjA3IDI2NS44MDksMTcxLjM4MzcgMjY1LjIwOSwxNzEuMzgzNyBDIDI2NC42MDcsMTcxLjM4MzcgMjY0LjExOSwxNzAuOTIwNyAyNjQuMTE5LDE3MC4zNDk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU3OTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI2NC4xMTksMTcwLjM0OTcgQyAyNjQuMTE5LDE2OS43ODE3IDI2NC42MDcsMTY5LjMyMzcgMjY1LjIwOSwxNjkuMzIzNyBDIDI2NS44MDksMTY5LjMyMzcgMjY2LjI5NywxNjkuNzgxNyAyNjYuMjk3LDE3MC4zNDk3IEMgMjY2LjI5NywxNzAuOTIwNyAyNjUuODA5LDE3MS4zODM3IDI2NS4yMDksMTcxLjM4MzcgQyAyNjQuNjA3LDE3MS4zODM3IDI2NC4xMTksMTcwLjkyMDcgMjY0LjExOSwxNzAuMzQ5NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1NzkzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDI2MC43MDgsMTY5Ljc2NDcgQyAyNjAuNzA4LDE2OS4xOTY3IDI2MS4xOTYsMTY4LjczNDcgMjYxLjc5NSwxNjguNzM0NyBDIDI2Mi4zOTgsMTY4LjczNDcgMjYyLjg4MywxNjkuMTk2NyAyNjIuODgzLDE2OS43NjQ3IEMgMjYyLjg4MywxNzAuMzMxNyAyNjIuMzk4LDE3MC43OTQ3IDI2MS43OTUsMTcwLjc5NDcgQyAyNjEuMTk2LDE3MC43OTQ3IDI2MC43MDgsMTcwLjMzMTcgMjYwLjcwOCwxNjkuNzY0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1Nzk1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNjAuNzA4LDE2OS43NjQ3IEMgMjYwLjcwOCwxNjkuMTk2NyAyNjEuMTk2LDE2OC43MzQ3IDI2MS43OTUsMTY4LjczNDcgQyAyNjIuMzk4LDE2OC43MzQ3IDI2Mi44ODMsMTY5LjE5NjcgMjYyLjg4MywxNjkuNzY0NyBDIDI2Mi44ODMsMTcwLjMzMTcgMjYyLjM5OCwxNzAuNzk0NyAyNjEuNzk1LDE3MC43OTQ3IEMgMjYxLjE5NiwxNzAuNzk0NyAyNjAuNzA4LDE3MC4zMzE3IDI2MC43MDgsMTY5Ljc2NDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc5NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyNTcuMzY4LDE2OS44MjA3IEMgMjU3LjM2OCwxNjkuMjUyNyAyNTcuODU1LDE2OC43ODc3IDI1OC40NTUsMTY4Ljc4NzcgQyAyNTkuMDU4LDE2OC43ODc3IDI1OS41NDYsMTY5LjI1MjcgMjU5LjU0NiwxNjkuODIwNyBDIDI1OS41NDYsMTcwLjM5MjcgMjU5LjA1OCwxNzAuODUwNyAyNTguNDU1LDE3MC44NTA3IEMgMjU3Ljg1NSwxNzAuODUwNyAyNTcuMzY4LDE3MC4zOTI3IDI1Ny4zNjgsMTY5LjgyMDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTc5OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjU3LjM2OCwxNjkuODIwNyBDIDI1Ny4zNjgsMTY5LjI1MjcgMjU3Ljg1NSwxNjguNzg3NyAyNTguNDU1LDE2OC43ODc3IEMgMjU5LjA1OCwxNjguNzg3NyAyNTkuNTQ2LDE2OS4yNTI3IDI1OS41NDYsMTY5LjgyMDcgQyAyNTkuNTQ2LDE3MC4zOTI3IDI1OS4wNTgsMTcwLjg1MDcgMjU4LjQ1NSwxNzAuODUwNyBDIDI1Ny44NTUsMTcwLjg1MDcgMjU3LjM2OCwxNzAuMzkyNyAyNTcuMzY4LDE2OS44MjA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4MDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjUzLjg5MywxNzAuNDA2NyBDIDI1My44OTMsMTY5LjgzODcgMjU0LjM4MSwxNjkuMzc5NyAyNTQuOTgxLDE2OS4zNzk3IEMgMjU1LjU4NCwxNjkuMzc5NyAyNTYuMDcyLDE2OS44Mzg3IDI1Ni4wNzIsMTcwLjQwNjcgQyAyNTYuMDcyLDE3MC45ODA3IDI1NS41ODQsMTcxLjQzOTcgMjU0Ljk4MSwxNzEuNDM5NyBDIDI1NC4zODEsMTcxLjQzOTcgMjUzLjg5MywxNzAuOTgwNyAyNTMuODkzLDE3MC40MDY3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4MDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI1My44OTMsMTcwLjQwNjcgQyAyNTMuODkzLDE2OS44Mzg3IDI1NC4zODEsMTY5LjM3OTcgMjU0Ljk4MSwxNjkuMzc5NyBDIDI1NS41ODQsMTY5LjM3OTcgMjU2LjA3MiwxNjkuODM4NyAyNTYuMDcyLDE3MC40MDY3IEMgMjU2LjA3MiwxNzAuOTgwNyAyNTUuNTg0LDE3MS40Mzk3IDI1NC45ODEsMTcxLjQzOTcgQyAyNTQuMzgxLDE3MS40Mzk3IDI1My44OTMsMTcwLjk4MDcgMjUzLjg5MywxNzAuNDA2NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODA1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDI1MC42NzYsMTcxLjUxNzcgQyAyNTAuNjc2LDE3MC45NDU3IDI1MS4xNjQsMTcwLjQ4MzcgMjUxLjc2MywxNzAuNDgzNyBDIDI1Mi4zNjYsMTcwLjQ4MzcgMjUyLjg1NCwxNzAuOTQ1NyAyNTIuODU0LDE3MS41MTc3IEMgMjUyLjg1NCwxNzIuMDg0NyAyNTIuMzY2LDE3Mi41NTA3IDI1MS43NjMsMTcyLjU1MDcgQyAyNTEuMTY0LDE3Mi41NTA3IDI1MC42NzYsMTcyLjA4NDcgMjUwLjY3NiwxNzEuNTE3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODA3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyNTAuNjc2LDE3MS41MTc3IEMgMjUwLjY3NiwxNzAuOTQ1NyAyNTEuMTY0LDE3MC40ODM3IDI1MS43NjMsMTcwLjQ4MzcgQyAyNTIuMzY2LDE3MC40ODM3IDI1Mi44NTQsMTcwLjk0NTcgMjUyLjg1NCwxNzEuNTE3NyBDIDI1Mi44NTQsMTcyLjA4NDcgMjUyLjM2NiwxNzIuNTUwNyAyNTEuNzYzLDE3Mi41NTA3IEMgMjUxLjE2NCwxNzIuNTUwNyAyNTAuNjc2LDE3Mi4wODQ3IDI1MC42NzYsMTcxLjUxNzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTgwOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAxOTYuMTg1LDE5OC4wMTY3IEMgMTk2LjE4NSwxOTcuNDQ0NyAxOTYuNjczLDE5Ni45ODk3IDE5Ny4yNzIsMTk2Ljk4OTcgQyAxOTcuODc2LDE5Ni45ODk3IDE5OC4zNiwxOTcuNDQ0NyAxOTguMzYsMTk4LjAxNjcgQyAxOTguMzYsMTk4LjU4NzcgMTk3Ljg3NiwxOTkuMDQ1NyAxOTcuMjcyLDE5OS4wNDU3IEMgMTk2LjY3MywxOTkuMDQ1NyAxOTYuMTg1LDE5OC41ODc3IDE5Ni4xODUsMTk4LjAxNjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTgxMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMTk2LjE4NSwxOTguMDE2NyBDIDE5Ni4xODUsMTk3LjQ0NDcgMTk2LjY3MywxOTYuOTg5NyAxOTcuMjcyLDE5Ni45ODk3IEMgMTk3Ljg3NiwxOTYuOTg5NyAxOTguMzYsMTk3LjQ0NDcgMTk4LjM2LDE5OC4wMTY3IEMgMTk4LjM2LDE5OC41ODc3IDE5Ny44NzYsMTk5LjA0NTcgMTk3LjI3MiwxOTkuMDQ1NyBDIDE5Ni42NzMsMTk5LjA0NTcgMTk2LjE4NSwxOTguNTg3NyAxOTYuMTg1LDE5OC4wMTY3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4MTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMTk0LjY5NSwxOTUuMzc4NyBDIDE5NC42OTUsMTk0LjgxMDcgMTk1LjE4MywxOTQuMzUxNyAxOTUuNzgzLDE5NC4zNTE3IEMgMTk2LjM4NiwxOTQuMzUxNyAxOTYuODc0LDE5NC44MTA3IDE5Ni44NzQsMTk1LjM3ODcgQyAxOTYuODc0LDE5NS45NTM3IDE5Ni4zODYsMTk2LjQxMTcgMTk1Ljc4MywxOTYuNDExNyBDIDE5NS4xODMsMTk2LjQxMTcgMTk0LjY5NSwxOTUuOTUzNyAxOTQuNjk1LDE5NS4zNzg3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4MTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDE5NC42OTUsMTk1LjM3ODcgQyAxOTQuNjk1LDE5NC44MTA3IDE5NS4xODMsMTk0LjM1MTcgMTk1Ljc4MywxOTQuMzUxNyBDIDE5Ni4zODYsMTk0LjM1MTcgMTk2Ljg3NCwxOTQuODEwNyAxOTYuODc0LDE5NS4zNzg3IEMgMTk2Ljg3NCwxOTUuOTUzNyAxOTYuMzg2LDE5Ni40MTE3IDE5NS43ODMsMTk2LjQxMTcgQyAxOTUuMTgzLDE5Ni40MTE3IDE5NC42OTUsMTk1Ljk1MzcgMTk0LjY5NSwxOTUuMzc4NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODE3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDE5My43MDEsMTkyLjMyNDcgQyAxOTMuNzAxLDE5MS43NTY3IDE5NC4xODksMTkxLjI5NDcgMTk0Ljc5MiwxOTEuMjk0NyBDIDE5NS4zOTIsMTkxLjI5NDcgMTk1Ljg4LDE5MS43NTY3IDE5NS44OCwxOTIuMzI0NyBDIDE5NS44OCwxOTIuODk1NyAxOTUuMzkyLDE5My4zNTc3IDE5NC43OTIsMTkzLjM1NzcgQyAxOTQuMTg5LDE5My4zNTc3IDE5My43MDEsMTkyLjg5NTcgMTkzLjcwMSwxOTIuMzI0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODE5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAxOTMuNzAxLDE5Mi4zMjQ3IEMgMTkzLjcwMSwxOTEuNzU2NyAxOTQuMTg5LDE5MS4yOTQ3IDE5NC43OTIsMTkxLjI5NDcgQyAxOTUuMzkyLDE5MS4yOTQ3IDE5NS44OCwxOTEuNzU2NyAxOTUuODgsMTkyLjMyNDcgQyAxOTUuODgsMTkyLjg5NTcgMTk1LjM5MiwxOTMuMzU3NyAxOTQuNzkyLDE5My4zNTc3IEMgMTk0LjE4OSwxOTMuMzU3NyAxOTMuNzAxLDE5Mi44OTU3IDE5My43MDEsMTkyLjMyNDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTgyMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAxOTMuNTc4LDE4OS4wNDc3IEMgMTkzLjU3OCwxODguNDc2NyAxOTQuMDY2LDE4OC4wMTg3IDE5NC42NjYsMTg4LjAxODcgQyAxOTUuMjY5LDE4OC4wMTg3IDE5NS43NTcsMTg4LjQ3NjcgMTk1Ljc1NywxODkuMDQ3NyBDIDE5NS43NTcsMTg5LjYxOTcgMTk1LjI2OSwxOTAuMDc3NyAxOTQuNjY2LDE5MC4wNzc3IEMgMTk0LjA2NiwxOTAuMDc3NyAxOTMuNTc4LDE4OS42MTk3IDE5My41NzgsMTg5LjA0NzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTgyMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMTkzLjU3OCwxODkuMDQ3NyBDIDE5My41NzgsMTg4LjQ3NjcgMTk0LjA2NiwxODguMDE4NyAxOTQuNjY2LDE4OC4wMTg3IEMgMTk1LjI2OSwxODguMDE4NyAxOTUuNzU3LDE4OC40NzY3IDE5NS43NTcsMTg5LjA0NzcgQyAxOTUuNzU3LDE4OS42MTk3IDE5NS4yNjksMTkwLjA3NzcgMTk0LjY2NiwxOTAuMDc3NyBDIDE5NC4wNjYsMTkwLjA3NzcgMTkzLjU3OCwxODkuNjE5NyAxOTMuNTc4LDE4OS4wNDc3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4MjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMTk0LjM4NiwxODUuODIxNyBDIDE5NC4zODYsMTg1LjI1MzcgMTk0Ljg3NCwxODQuNzk0NyAxOTUuNDczLDE4NC43OTQ3IEMgMTk2LjA3MywxODQuNzk0NyAxOTYuNTYxLDE4NS4yNTM3IDE5Ni41NjEsMTg1LjgyMTcgQyAxOTYuNTYxLDE4Ni4zOTU3IDE5Ni4wNzMsMTg2Ljg1NDcgMTk1LjQ3MywxODYuODU0NyBDIDE5NC44NzQsMTg2Ljg1NDcgMTk0LjM4NiwxODYuMzk1NyAxOTQuMzg2LDE4NS44MjE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4MjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDE5NC4zODYsMTg1LjgyMTcgQyAxOTQuMzg2LDE4NS4yNTM3IDE5NC44NzQsMTg0Ljc5NDcgMTk1LjQ3MywxODQuNzk0NyBDIDE5Ni4wNzMsMTg0Ljc5NDcgMTk2LjU2MSwxODUuMjUzNyAxOTYuNTYxLDE4NS44MjE3IEMgMTk2LjU2MSwxODYuMzk1NyAxOTYuMDczLDE4Ni44NTQ3IDE5NS40NzMsMTg2Ljg1NDcgQyAxOTQuODc0LDE4Ni44NTQ3IDE5NC4zODYsMTg2LjM5NTcgMTk0LjM4NiwxODUuODIxNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODI5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDE5Ni4wNTgsMTgyLjg5MzcgQyAxOTYuMDU4LDE4Mi4zMjI3IDE5Ni41NDYsMTgxLjg2NDcgMTk3LjE1LDE4MS44NjQ3IEMgMTk3Ljc0OSwxODEuODY0NyAxOTguMjM3LDE4Mi4zMjI3IDE5OC4yMzcsMTgyLjg5MzcgQyAxOTguMjM3LDE4My40NjU3IDE5Ny43NDksMTgzLjkyNzcgMTk3LjE1LDE4My45Mjc3IEMgMTk2LjU0NiwxODMuOTI3NyAxOTYuMDU4LDE4My40NjU3IDE5Ni4wNTgsMTgyLjg5MzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTgzMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMTk2LjA1OCwxODIuODkzNyBDIDE5Ni4wNTgsMTgyLjMyMjcgMTk2LjU0NiwxODEuODY0NyAxOTcuMTUsMTgxLjg2NDcgQyAxOTcuNzQ5LDE4MS44NjQ3IDE5OC4yMzcsMTgyLjMyMjcgMTk4LjIzNywxODIuODkzNyBDIDE5OC4yMzcsMTgzLjQ2NTcgMTk3Ljc0OSwxODMuOTI3NyAxOTcuMTUsMTgzLjkyNzcgQyAxOTYuNTQ2LDE4My45Mjc3IDE5Ni4wNTgsMTgzLjQ2NTcgMTk2LjA1OCwxODIuODkzNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODMzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDE5OC4yOTMsMTgwLjQ4ODcgQyAxOTguMjkzLDE3OS45MTc3IDE5OC43ODEsMTc5LjQ1NTcgMTk5LjM4NCwxNzkuNDU1NyBDIDE5OS45ODMsMTc5LjQ1NTcgMjAwLjQ3MSwxNzkuOTE3NyAyMDAuNDcxLDE4MC40ODg3IEMgMjAwLjQ3MSwxODEuMDU2NyAxOTkuOTgzLDE4MS41MTg3IDE5OS4zODQsMTgxLjUxODcgQyAxOTguNzgxLDE4MS41MTg3IDE5OC4yOTMsMTgxLjA1NjcgMTk4LjI5MywxODAuNDg4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODM1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAxOTguMjkzLDE4MC40ODg3IEMgMTk4LjI5MywxNzkuOTE3NyAxOTguNzgxLDE3OS40NTU3IDE5OS4zODQsMTc5LjQ1NTcgQyAxOTkuOTgzLDE3OS40NTU3IDIwMC40NzEsMTc5LjkxNzcgMjAwLjQ3MSwxODAuNDg4NyBDIDIwMC40NzEsMTgxLjA1NjcgMTk5Ljk4MywxODEuNTE4NyAxOTkuMzg0LDE4MS41MTg3IEMgMTk4Ljc4MSwxODEuNTE4NyAxOTguMjkzLDE4MS4wNTY3IDE5OC4yOTMsMTgwLjQ4ODcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTgzNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyMDAuODg4LDE3OC40ODk3IEMgMjAwLjg4OCwxNzcuOTE3NyAyMDEuMzc2LDE3Ny40NTU3IDIwMS45NzksMTc3LjQ1NTcgQyAyMDIuNTc5LDE3Ny40NTU3IDIwMy4wNjcsMTc3LjkxNzcgMjAzLjA2NywxNzguNDg5NyBDIDIwMy4wNjcsMTc5LjA1NjcgMjAyLjU3OSwxNzkuNTE4NyAyMDEuOTc5LDE3OS41MTg3IEMgMjAxLjM3NiwxNzkuNTE4NyAyMDAuODg4LDE3OS4wNTY3IDIwMC44ODgsMTc4LjQ4OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTgzOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjAwLjg4OCwxNzguNDg5NyBDIDIwMC44ODgsMTc3LjkxNzcgMjAxLjM3NiwxNzcuNDU1NyAyMDEuOTc5LDE3Ny40NTU3IEMgMjAyLjU3OSwxNzcuNDU1NyAyMDMuMDY3LDE3Ny45MTc3IDIwMy4wNjcsMTc4LjQ4OTcgQyAyMDMuMDY3LDE3OS4wNTY3IDIwMi41NzksMTc5LjUxODcgMjAxLjk3OSwxNzkuNTE4NyBDIDIwMS4zNzYsMTc5LjUxODcgMjAwLjg4OCwxNzkuMDU2NyAyMDAuODg4LDE3OC40ODk3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4NDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjAzLjk5LDE3Ni44NTI3IEMgMjAzLjk5LDE3Ni4yODE3IDIwNC40NzgsMTc1LjgyNjcgMjA1LjA4MSwxNzUuODI2NyBDIDIwNS42ODEsMTc1LjgyNjcgMjA2LjE2OSwxNzYuMjgxNyAyMDYuMTY5LDE3Ni44NTI3IEMgMjA2LjE2OSwxNzcuNDI0NyAyMDUuNjgxLDE3Ny44ODY3IDIwNS4wODEsMTc3Ljg4NjcgQyAyMDQuNDc4LDE3Ny44ODY3IDIwMy45OSwxNzcuNDI0NyAyMDMuOTksMTc2Ljg1MjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg0MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjAzLjk5LDE3Ni44NTI3IEMgMjAzLjk5LDE3Ni4yODE3IDIwNC40NzgsMTc1LjgyNjcgMjA1LjA4MSwxNzUuODI2NyBDIDIwNS42ODEsMTc1LjgyNjcgMjA2LjE2OSwxNzYuMjgxNyAyMDYuMTY5LDE3Ni44NTI3IEMgMjA2LjE2OSwxNzcuNDI0NyAyMDUuNjgxLDE3Ny44ODY3IDIwNS4wODEsMTc3Ljg4NjcgQyAyMDQuNDc4LDE3Ny44ODY3IDIwMy45OSwxNzcuNDI0NyAyMDMuOTksMTc2Ljg1MjcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg0NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyMDcuMjA4LDE3NS42ODU3IEMgMjA3LjIwOCwxNzUuMTE3NyAyMDcuNjk1LDE3NC42NTU3IDIwOC4yOTUsMTc0LjY1NTcgQyAyMDguODk4LDE3NC42NTU3IDIwOS4zODYsMTc1LjExNzcgMjA5LjM4NiwxNzUuNjg1NyBDIDIwOS4zODYsMTc2LjI1NjcgMjA4Ljg5OCwxNzYuNzE4NyAyMDguMjk1LDE3Ni43MTg3IEMgMjA3LjY5NSwxNzYuNzE4NyAyMDcuMjA4LDE3Ni4yNTY3IDIwNy4yMDgsMTc1LjY4NTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg0NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjA3LjIwOCwxNzUuNjg1NyBDIDIwNy4yMDgsMTc1LjExNzcgMjA3LjY5NSwxNzQuNjU1NyAyMDguMjk1LDE3NC42NTU3IEMgMjA4Ljg5OCwxNzQuNjU1NyAyMDkuMzg2LDE3NS4xMTc3IDIwOS4zODYsMTc1LjY4NTcgQyAyMDkuMzg2LDE3Ni4yNTY3IDIwOC44OTgsMTc2LjcxODcgMjA4LjI5NSwxNzYuNzE4NyBDIDIwNy42OTUsMTc2LjcxODcgMjA3LjIwOCwxNzYuMjU2NyAyMDcuMjA4LDE3NS42ODU3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4NDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjEwLjgwOSwxNzUuMDQzNyBDIDIxMC44MDksMTc0LjQ3NTcgMjExLjI5NiwxNzQuMDEwNyAyMTEuODk2LDE3NC4wMTA3IEMgMjEyLjQ5NSwxNzQuMDEwNyAyMTIuOTgzLDE3NC40NzU3IDIxMi45ODMsMTc1LjA0MzcgQyAyMTIuOTgzLDE3NS42MTE3IDIxMi40OTUsMTc2LjA3MzcgMjExLjg5NiwxNzYuMDczNyBDIDIxMS4yOTYsMTc2LjA3MzcgMjEwLjgwOSwxNzUuNjExNyAyMTAuODA5LDE3NS4wNDM3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4NTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDIxMC44MDksMTc1LjA0MzcgQyAyMTAuODA5LDE3NC40NzU3IDIxMS4yOTYsMTc0LjAxMDcgMjExLjg5NiwxNzQuMDEwNyBDIDIxMi40OTUsMTc0LjAxMDcgMjEyLjk4MywxNzQuNDc1NyAyMTIuOTgzLDE3NS4wNDM3IEMgMjEyLjk4MywxNzUuNjExNyAyMTIuNDk1LDE3Ni4wNzM3IDIxMS44OTYsMTc2LjA3MzcgQyAyMTEuMjk2LDE3Ni4wNzM3IDIxMC44MDksMTc1LjYxMTcgMjEwLjgwOSwxNzUuMDQzNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODUzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDIxNC4yMiwxNzQuODYzNyBDIDIxNC4yMiwxNzQuMjk1NyAyMTQuNzA3LDE3My44Mzc3IDIxNS4zMTEsMTczLjgzNzcgQyAyMTUuOTEsMTczLjgzNzcgMjE2LjM5OCwxNzQuMjk1NyAyMTYuMzk4LDE3NC44NjM3IEMgMjE2LjM5OCwxNzUuNDM1NyAyMTUuOTEsMTc1Ljg5NzcgMjE1LjMxMSwxNzUuODk3NyBDIDIxNC43MDcsMTc1Ljg5NzcgMjE0LjIyLDE3NS40MzU3IDIxNC4yMiwxNzQuODYzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODU1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyMTQuMjIsMTc0Ljg2MzcgQyAyMTQuMjIsMTc0LjI5NTcgMjE0LjcwNywxNzMuODM3NyAyMTUuMzExLDE3My44Mzc3IEMgMjE1LjkxLDE3My44Mzc3IDIxNi4zOTgsMTc0LjI5NTcgMjE2LjM5OCwxNzQuODYzNyBDIDIxNi4zOTgsMTc1LjQzNTcgMjE1LjkxLDE3NS44OTc3IDIxNS4zMTEsMTc1Ljg5NzcgQyAyMTQuNzA3LDE3NS44OTc3IDIxNC4yMiwxNzUuNDM1NyAyMTQuMjIsMTc0Ljg2MzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg1NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyMTcuNTcsMTc0Ljk4MDcgQyAyMTcuNTcsMTc0LjQxMjcgMjE4LjA1OSwxNzMuOTUwNyAyMTguNjU4LDE3My45NTA3IEMgMjE5LjI2MiwxNzMuOTUwNyAyMTkuNzQ5LDE3NC40MTI3IDIxOS43NDksMTc0Ljk4MDcgQyAyMTkuNzQ5LDE3NS41NTE3IDIxOS4yNjIsMTc2LjAxMzcgMjE4LjY1OCwxNzYuMDEzNyBDIDIxOC4wNTksMTc2LjAxMzcgMjE3LjU3LDE3NS41NTE3IDIxNy41NywxNzQuOTgwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODU5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyMTcuNTcsMTc0Ljk4MDcgQyAyMTcuNTcsMTc0LjQxMjcgMjE4LjA1OSwxNzMuOTUwNyAyMTguNjU4LDE3My45NTA3IEMgMjE5LjI2MiwxNzMuOTUwNyAyMTkuNzQ5LDE3NC40MTI3IDIxOS43NDksMTc0Ljk4MDcgQyAyMTkuNzQ5LDE3NS41NTE3IDIxOS4yNjIsMTc2LjAxMzcgMjE4LjY1OCwxNzYuMDEzNyBDIDIxOC4wNTksMTc2LjAxMzcgMjE3LjU3LDE3NS41NTE3IDIxNy41NywxNzQuOTgwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODYxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDIyMC45MjIsMTc0Ljk4MDcgQyAyMjAuOTIyLDE3NC40MTI3IDIyMS40MSwxNzMuOTUwNyAyMjIuMDEsMTczLjk1MDcgQyAyMjIuNjEzLDE3My45NTA3IDIyMy4xMDEsMTc0LjQxMjcgMjIzLjEwMSwxNzQuOTgwNyBDIDIyMy4xMDEsMTc1LjU1MTcgMjIyLjYxMywxNzYuMDEzNyAyMjIuMDEsMTc2LjAxMzcgQyAyMjEuNDEsMTc2LjAxMzcgMjIwLjkyMiwxNzUuNTUxNyAyMjAuOTIyLDE3NC45ODA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4NjMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDIyMC45MjIsMTc0Ljk4MDcgQyAyMjAuOTIyLDE3NC40MTI3IDIyMS40MSwxNzMuOTUwNyAyMjIuMDEsMTczLjk1MDcgQyAyMjIuNjEzLDE3My45NTA3IDIyMy4xMDEsMTc0LjQxMjcgMjIzLjEwMSwxNzQuOTgwNyBDIDIyMy4xMDEsMTc1LjU1MTcgMjIyLjYxMywxNzYuMDEzNyAyMjIuMDEsMTc2LjAxMzcgQyAyMjEuNDEsMTc2LjAxMzcgMjIwLjkyMiwxNzUuNTUxNyAyMjAuOTIyLDE3NC45ODA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4NjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmY7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg4MDAwMDE7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKLSAgICAgICAgICAgZD0iTSAyMTkuMjQ3LDE3Ny44NTQ3IEMgMjE5LjI0NywxNzcuMjgzNyAyMTkuNzM0LDE3Ni44MjE3IDIyMC4zMzQsMTc2LjgyMTcgQyAyMjAuOTM3LDE3Ni44MjE3IDIyMS40MjUsMTc3LjI4MzcgMjIxLjQyNSwxNzcuODU0NyBDIDIyMS40MjUsMTc4LjQyMjcgMjIwLjkzNywxNzguODg3NyAyMjAuMzM0LDE3OC44ODc3IEMgMjE5LjczNCwxNzguODg3NyAyMTkuMjQ3LDE3OC40MjI3IDIxOS4yNDcsMTc3Ljg1NDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg2NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZjtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODgwMDAwMTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgotICAgICAgICAgICBkPSJNIDIxOC41NjUsMTgxLjAyODcgQyAyMTguNTY1LDE4MC40NTc3IDIxOS4wNDksMTc5Ljk5NDcgMjE5LjY1MywxNzkuOTk0NyBDIDIyMC4yNTIsMTc5Ljk5NDcgMjIwLjc0LDE4MC40NTc3IDIyMC43NCwxODEuMDI4NyBDIDIyMC43NCwxODEuNTkyNyAyMjAuMjUyLDE4Mi4wNTQ3IDIxOS42NTMsMTgyLjA1NDcgQyAyMTkuMDQ5LDE4Mi4wNTQ3IDIxOC41NjUsMTgxLjU5MjcgMjE4LjU2NSwxODEuMDI4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODY5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjE4LjQzOSwxODQuMTkxNyBDIDIxOC40MzksMTgzLjYxNjcgMjE4LjkyNywxODMuMTU4NyAyMTkuNTMsMTgzLjE1ODcgQyAyMjAuMTI5LDE4My4xNTg3IDIyMC42MTcsMTgzLjYxNjcgMjIwLjYxNywxODQuMTkxNyBDIDIyMC42MTcsMTg0Ljc1OTcgMjIwLjEyOSwxODUuMjIxNyAyMTkuNTMsMTg1LjIyMTcgQyAyMTguOTI3LDE4NS4yMjE3IDIxOC40MzksMTg0Ljc1OTcgMjE4LjQzOSwxODQuMTkxNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODcxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjE5LjQzMywxODcuMDY5NyBDIDIxOS40MzMsMTg2LjUwMTcgMjE5LjkyMSwxODYuMDM2NyAyMjAuNTIsMTg2LjAzNjcgQyAyMjEuMTI0LDE4Ni4wMzY3IDIyMS42MTEsMTg2LjUwMTcgMjIxLjYxMSwxODcuMDY5NyBDIDIyMS42MTEsMTg3LjY0MDcgMjIxLjEyNCwxODguMDk5NyAyMjAuNTIsMTg4LjA5OTcgQyAyMTkuOTIxLDE4OC4wOTk3IDIxOS40MzMsMTg3LjY0MDcgMjE5LjQzMywxODcuMDY5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODczIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4ODAwMDAxO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjIxLjI4MywxODkuNzE0NyBDIDIyMS4yODMsMTg5LjE0NjcgMjIxLjc3MiwxODguNjgxNyAyMjIuMzcsMTg4LjY4MTcgQyAyMjIuOTc0LDE4OC42ODE3IDIyMy40NjIsMTg5LjE0NjcgMjIzLjQ2MiwxODkuNzE0NyBDIDIyMy40NjIsMTkwLjI4MjcgMjIyLjk3NCwxOTAuNzQ0NyAyMjIuMzcsMTkwLjc0NDcgQyAyMjEuNzcyLDE5MC43NDQ3IDIyMS4yODMsMTkwLjI4MjcgMjIxLjI4MywxODkuNzE0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODc1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDIyMy40NTUsMTcyLjk4NDcgQyAyMjMuNDU1LDE3Mi40MTY3IDIyMy45NDMsMTcxLjk1NzcgMjI0LjU0MiwxNzEuOTU3NyBDIDIyNS4xNDUsMTcxLjk1NzcgMjI1LjYzMywxNzIuNDE2NyAyMjUuNjMzLDE3Mi45ODQ3IEMgMjI1LjYzMywxNzMuNTU1NyAyMjUuMTQ1LDE3NC4wMTc3IDIyNC41NDIsMTc0LjAxNzcgQyAyMjMuOTQzLDE3NC4wMTc3IDIyMy40NTUsMTczLjU1NTcgMjIzLjQ1NSwxNzIuOTg0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODc3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjM4Nzc1NyIKLSAgICAgICAgICAgZD0iTSAyMjMuNDU1LDE3Mi45ODQ3IEMgMjIzLjQ1NSwxNzIuNDE2NyAyMjMuOTQzLDE3MS45NTc3IDIyNC41NDIsMTcxLjk1NzcgQyAyMjUuMTQ1LDE3MS45NTc3IDIyNS42MzMsMTcyLjQxNjcgMjI1LjYzMywxNzIuOTg0NyBDIDIyNS42MzMsMTczLjU1NTcgMjI1LjE0NSwxNzQuMDE3NyAyMjQuNTQyLDE3NC4wMTc3IEMgMjIzLjk0MywxNzQuMDE3NyAyMjMuNDU1LDE3My41NTU3IDIyMy40NTUsMTcyLjk4NDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg3OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyMjYuNDM0LDE3MS4zNDA3IEMgMjI2LjQzNCwxNzAuNzcyNyAyMjYuOTIyLDE3MC4zMDc3IDIyNy41MjEsMTcwLjMwNzcgQyAyMjguMTI0LDE3MC4zMDc3IDIyOC42MTIsMTcwLjc3MjcgMjI4LjYxMiwxNzEuMzQwNyBDIDIyOC42MTIsMTcxLjkwODcgMjI4LjEyNCwxNzIuMzcwNyAyMjcuNTIxLDE3Mi4zNzA3IEMgMjI2LjkyMiwxNzIuMzcwNyAyMjYuNDM0LDE3MS45MDg3IDIyNi40MzQsMTcxLjM0MDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg4MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjI2LjQzNCwxNzEuMzQwNyBDIDIyNi40MzQsMTcwLjc3MjcgMjI2LjkyMiwxNzAuMzA3NyAyMjcuNTIxLDE3MC4zMDc3IEMgMjI4LjEyNCwxNzAuMzA3NyAyMjguNjEyLDE3MC43NzI3IDIyOC42MTIsMTcxLjM0MDcgQyAyMjguNjEyLDE3MS45MDg3IDIyOC4xMjQsMTcyLjM3MDcgMjI3LjUyMSwxNzIuMzcwNyBDIDIyNi45MjIsMTcyLjM3MDcgMjI2LjQzNCwxNzEuOTA4NyAyMjYuNDM0LDE3MS4zNDA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4ODMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjI5LjcxLDE3MC4zNDk3IEMgMjI5LjcxLDE2OS43ODE3IDIzMC4xOTksMTY5LjMyMzcgMjMwLjgwMSwxNjkuMzIzNyBDIDIzMS40MDEsMTY5LjMyMzcgMjMxLjg4OSwxNjkuNzgxNyAyMzEuODg5LDE3MC4zNDk3IEMgMjMxLjg4OSwxNzAuOTIwNyAyMzEuNDAxLDE3MS4zODM3IDIzMC44MDEsMTcxLjM4MzcgQyAyMzAuMTk5LDE3MS4zODM3IDIyOS43MSwxNzAuOTIwNyAyMjkuNzEsMTcwLjM0OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg4NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjI5LjcxLDE3MC4zNDk3IEMgMjI5LjcxLDE2OS43ODE3IDIzMC4xOTksMTY5LjMyMzcgMjMwLjgwMSwxNjkuMzIzNyBDIDIzMS40MDEsMTY5LjMyMzcgMjMxLjg4OSwxNjkuNzgxNyAyMzEuODg5LDE3MC4zNDk3IEMgMjMxLjg4OSwxNzAuOTIwNyAyMzEuNDAxLDE3MS4zODM3IDIzMC44MDEsMTcxLjM4MzcgQyAyMzAuMTk5LDE3MS4zODM3IDIyOS43MSwxNzAuOTIwNyAyMjkuNzEsMTcwLjM0OTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg4NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2ZmZmZmZiIKLSAgICAgICAgICAgZD0iTSAyMzMuMTI0LDE2OS43NjQ3IEMgMjMzLjEyNCwxNjkuMTk2NyAyMzMuNjEzLDE2OC43MzQ3IDIzNC4yMTIsMTY4LjczNDcgQyAyMzQuODE2LDE2OC43MzQ3IDIzNS4zMDQsMTY5LjE5NjcgMjM1LjMwNCwxNjkuNzY0NyBDIDIzNS4zMDQsMTcwLjMzMTcgMjM0LjgxNiwxNzAuNzk0NyAyMzQuMjEyLDE3MC43OTQ3IEMgMjMzLjYxMywxNzAuNzk0NyAyMzMuMTI0LDE3MC4zMzE3IDIzMy4xMjQsMTY5Ljc2NDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTg4OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zODc3NTciCi0gICAgICAgICAgIGQ9Ik0gMjMzLjEyNCwxNjkuNzY0NyBDIDIzMy4xMjQsMTY5LjE5NjcgMjMzLjYxMywxNjguNzM0NyAyMzQuMjEyLDE2OC43MzQ3IEMgMjM0LjgxNiwxNjguNzM0NyAyMzUuMzA0LDE2OS4xOTY3IDIzNS4zMDQsMTY5Ljc2NDcgQyAyMzUuMzA0LDE3MC4zMzE3IDIzNC44MTYsMTcwLjc5NDcgMjM0LjIxMiwxNzAuNzk0NyBDIDIzMy42MTMsMTcwLjc5NDcgMjMzLjEyNCwxNzAuMzMxNyAyMzMuMTI0LDE2OS43NjQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4OTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjM2LjQ2NiwxNjkuODIwNyBDIDIzNi40NjYsMTY5LjI1MjcgMjM2Ljk0OSwxNjguNzg3NyAyMzcuNTUzLDE2OC43ODc3IEMgMjM4LjE1MiwxNjguNzg3NyAyMzguNjQsMTY5LjI1MjcgMjM4LjY0LDE2OS44MjA3IEMgMjM4LjY0LDE3MC4zOTI3IDIzOC4xNTIsMTcwLjg1MDcgMjM3LjU1MywxNzAuODUwNyBDIDIzNi45NDksMTcwLjg1MDcgMjM2LjQ2NiwxNzAuMzkyNyAyMzYuNDY2LDE2OS44MjA3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4OTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDIzNi40NjYsMTY5LjgyMDcgQyAyMzYuNDY2LDE2OS4yNTI3IDIzNi45NDksMTY4Ljc4NzcgMjM3LjU1MywxNjguNzg3NyBDIDIzOC4xNTIsMTY4Ljc4NzcgMjM4LjY0LDE2OS4yNTI3IDIzOC42NCwxNjkuODIwNyBDIDIzOC42NCwxNzAuMzkyNyAyMzguMTUyLDE3MC44NTA3IDIzNy41NTMsMTcwLjg1MDcgQyAyMzYuOTQ5LDE3MC44NTA3IDIzNi40NjYsMTcwLjM5MjcgMjM2LjQ2NiwxNjkuODIwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1ODk1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojZmZmZmZmIgotICAgICAgICAgICBkPSJNIDIzOS45NCwxNzAuNDA2NyBDIDIzOS45NCwxNjkuODM4NyAyNDAuNDI4LDE2OS4zNzk3IDI0MS4wMjcsMTY5LjM3OTcgQyAyNDEuNjMxLDE2OS4zNzk3IDI0Mi4xMTUsMTY5LjgzODcgMjQyLjExNSwxNzAuNDA2NyBDIDI0Mi4xMTUsMTcwLjk4MDcgMjQxLjYzMSwxNzEuNDM5NyAyNDEuMDI3LDE3MS40Mzk3IEMgMjQwLjQyOCwxNzEuNDM5NyAyMzkuOTQsMTcwLjk4MDcgMjM5Ljk0LDE3MC40MDY3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4OTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDIzOS45NCwxNzAuNDA2NyBDIDIzOS45NCwxNjkuODM4NyAyNDAuNDI4LDE2OS4zNzk3IDI0MS4wMjcsMTY5LjM3OTcgQyAyNDEuNjMxLDE2OS4zNzk3IDI0Mi4xMTUsMTY5LjgzODcgMjQyLjExNSwxNzAuNDA2NyBDIDI0Mi4xMTUsMTcwLjk4MDcgMjQxLjYzMSwxNzEuNDM5NyAyNDEuMDI3LDE3MS40Mzk3IEMgMjQwLjQyOCwxNzEuNDM5NyAyMzkuOTQsMTcwLjk4MDcgMjM5Ljk0LDE3MC40MDY3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU4OTkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNmZmZmZmYiCi0gICAgICAgICAgIGQ9Ik0gMjQzLjE1NCwxNzEuNTE3NyBDIDI0My4xNTQsMTcwLjk0NTcgMjQzLjY0MSwxNzAuNDgzNyAyNDQuMjQ0LDE3MC40ODM3IEMgMjQ0Ljg0NCwxNzAuNDgzNyAyNDUuMzMyLDE3MC45NDU3IDI0NS4zMzIsMTcxLjUxNzcgQyAyNDUuMzMyLDE3Mi4wODQ3IDI0NC44NDQsMTcyLjU1MDcgMjQ0LjI0NCwxNzIuNTUwNyBDIDI0My42NDEsMTcyLjU1MDcgMjQzLjE1NCwxNzIuMDg0NyAyNDMuMTU0LDE3MS41MTc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5MDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzg3NzU3IgotICAgICAgICAgICBkPSJNIDI0My4xNTQsMTcxLjUxNzcgQyAyNDMuMTU0LDE3MC45NDU3IDI0My42NDEsMTcwLjQ4MzcgMjQ0LjI0NCwxNzAuNDgzNyBDIDI0NC44NDQsMTcwLjQ4MzcgMjQ1LjMzMiwxNzAuOTQ1NyAyNDUuMzMyLDE3MS41MTc3IEMgMjQ1LjMzMiwxNzIuMDg0NyAyNDQuODQ0LDE3Mi41NTA3IDI0NC4yNDQsMTcyLjU1MDcgQyAyNDMuNjQxLDE3Mi41NTA3IDI0My4xNTQsMTcyLjA4NDcgMjQzLjE1NCwxNzEuNTE3NyB6ICIgLz4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9Imc0NTA5IgotICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjIyOTQ4OCwwLDAsMC4yMjk0ODgsMTI2Ljc4NTYsMTk4LjU4NTIpIj4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGQ9Ik0gMzg2Ljc5Mzg4LDE2OS40OTYwOSBMIDM4Mi43OTM4OCwxNjkuNDk2MDkgTCAzODIuNzkzODgsMTY1LjQ5NjA5IEwgMzc1Ljc5Mzg4LDE2NS40OTYwOSBMIDM3NS43OTM4OCwxODEuNDk2MDkgTCAzODIuNzkzODgsMTgxLjQ5NjA5IEwgMzgyLjc5Mzg4LDE5Mi40OTYwOSBMIDM2Ny43OTM4OCwxOTIuNDk2MDkgTCAzNjcuNzkzODgsMjI0LjQ5NjA5IEwgMzc1Ljc5Mzg4LDIyNC40OTYwOSBMIDM3NS43OTM4OCwyODguNDk2MDkgTCAzNTkuNzkzODgsMjg4LjQ5NjA5IEwgMzU5Ljc5Mzg4LDMyMS40OTYwOSBMIDQ4Mi43OTM4OCwzMjEuNDk2MDkgTCA0ODIuNzkzODgsMjg4LjQ5NjA5IEwgNDY2Ljc5Mzg4LDI4OC40OTYwOSBMIDQ2Ni43OTM4OCwyMjQuNDk2MDkgTCA0NzQuNzkzODgsMjI0LjQ5NjA5IEwgNDc0Ljc5Mzg4LDE5Mi40OTYwOSBMIDQ1OS43OTM4OCwxOTIuNDk2MDkgTCA0NTkuNzkzODgsMTgxLjQ5NjA5IEwgNDY2Ljc5Mzg4LDE4MS40OTYwOSBMIDQ2Ni43OTM4OCwxNjUuNDk2MDkgTCA0NTkuNzkzODgsMTY1LjQ5NjA5IEwgNDU5Ljc5Mzg4LDE2OS40OTYwOSBMIDQ1NS43OTM4OCwxNjkuNDk2MDkgTCA0NTUuNzkzODgsMTY1LjQ5NjA5IEwgNDQ4Ljc5Mzg4LDE2NS40OTYwOSBMIDQ0OC43OTM4OCwxNjkuNDk2MDkgTCA0NDMuNzkzODgsMTY5LjQ5NjA5IEwgNDQzLjc5Mzg4LDE2NS40OTYwOSBMIDQzNi43OTM4OCwxNjUuNDk2MDkgTCA0MzYuNzkzODgsMTgxLjQ5NjA5IEwgNDQzLjc5Mzg4LDE4MS40OTYwOSBMIDQ0My43OTM4OCwxOTIuNDk2MDkgTCA0MjguNzkzODgsMTkyLjQ5NjA5IEwgNDI4Ljc5Mzg4LDE1Ny40OTYwOSBMIDQzNi43OTM4OCwxNTcuNDk2MDkgTCA0MzYuNzkzODgsMTQxLjQ5NjA5IEwgNDI4Ljc5Mzg4LDE0MS40OTYwOSBMIDQyOC43OTM4OCwxNDUuNDk2MDkgTCA0MjQuNzkzODgsMTQ1LjQ5NjA5IEwgNDI0Ljc5Mzg4LDE0MS40OTYwOSBMIDQxNy43OTM4OCwxNDEuNDk2MDkgTCA0MTcuNzkzODgsMTQ1LjQ5NjA5IEwgNDEzLjc5Mzg4LDE0NS40OTYwOSBMIDQxMy43OTM4OCwxNDEuNDk2MDkgTCA0MDUuNzkzODgsMTQxLjQ5NjA5IEwgNDA1Ljc5Mzg4LDE1Ny40OTYwOSBMIDQxMy43OTM4OCwxNTcuNDk2MDkgTCA0MTMuNzkzODgsMTkyLjQ5NjA5IEwgMzk4Ljc5Mzg4LDE5Mi40OTYwOSBMIDM5OC43OTM4OCwxODEuNDk2MDkgTCA0MDUuNzkzODgsMTgxLjQ5NjA5IEwgNDA1Ljc5Mzg4LDE2NS40OTYwOSBMIDM5OC43OTM4OCwxNjUuNDk2MDkgTCAzOTguNzkzODgsMTY5LjQ5NjA5IEwgMzk0Ljc5Mzg4LDE2OS40OTYwOSBMIDM5NC43OTM4OCwxNjUuNDk2MDkgTCAzODYuNzkzODgsMTY1LjQ5NjA5IEwgMzg2Ljc5Mzg4LDE2OS40OTYwOSB6IE0gMzU5Ljc5NCwzMjEuNDk2MSBMIDQ4Mi43OTQsMzIxLjQ5NjEgTSAzNTkuNzk0LDMxMy40OTYxIEwgNDgyLjc5NCwzMTMuNDk2MSBNIDM1OS43OTQsMzA1LjQ5NjEgTCA0ODIuNzk0LDMwNS40OTYxIE0gMzU5Ljc5NCwyOTcuNDk2MSBMIDQ4Mi43OTQsMjk3LjQ5NjEgTSAzNTkuNzk0LDI4OC40OTYxIEwgNDgyLjc5NCwyODguNDk2MSBNIDM3NS43OTQsMjgxLjQ5NjEgTCA0NjYuNzk0LDI4MS40OTYxIE0gMzc1Ljc5NCwyNzMuNDk2MSBMIDQ2Ni43OTQsMjczLjQ5NjEgTSAzNzUuNzk0LDI2NC40OTYxIEwgNDY2Ljc5NCwyNjQuNDk2MSBNIDM3NS43OTQsMjU2LjQ5NjEgTCA0NjYuNzk0LDI1Ni40OTYxIE0gMzc1Ljc5NCwyNDguNDk2MSBMIDQ2Ni43OTQsMjQ4LjQ5NjEgTSAzNzUuNzk0LDI0MC40OTYxIEwgNDY2Ljc5NCwyNDAuNDk2MSBNIDM3NS43OTQsMjMyLjQ5NjEgTCA0NjYuNzk0LDIzMi40OTYxIE0gMzY3Ljc5NCwyMjQuNDk2MSBMIDQ3NC43OTQsMjI0LjQ5NjEgTSAzNjcuNzk0LDIxNi40OTYxIEwgNDc0Ljc5NCwyMTYuNDk2MSBNIDM2Ny43OTQsMjA4LjQ5NjEgTCA0NzQuNzk0LDIwOC40OTYxIE0gMzY3Ljc5NCwyMDAuNDk2MSBMIDQ3NC43OTQsMjAwLjQ5NjEgTSAzODIuNzk0LDE5Mi40OTYxIEwgNDU5Ljc5NCwxOTIuNDk2MSBNIDQxMy43OTQsMTg0LjQ5NjEgTCA0MjguNzk0LDE4NC40OTYxIE0gNDEzLjc5NCwxNzYuNDk2MSBMIDQyOC43OTQsMTc2LjQ5NjEgTSA0MTMuNzk0LDE2OC40OTYxIEwgNDI4Ljc5NCwxNjguNDk2MSBNIDQxMy43OTQsMTYwLjQ5NjEgTCA0MjguNzk0LDE2MC40OTYxIE0gNDA1Ljc5NCwxNTAuNDk2MSBMIDQzNi43OTQsMTUwLjQ5NjEgTSAzODIuNzk0LDE4NC40OTYxIEwgMzk4Ljc5NCwxODQuNDk2MSBNIDM3NS43OTQsMTc0LjQ5NjEgTCA0MDUuNzk0LDE3NC40OTYxIE0gMzc1Ljc5NCwzMjEuNDk2MSBMIDM3NS43OTQsMzEzLjQ5NjEgTSAzNzUuNzk0LDMwNS40OTYxIEwgMzc1Ljc5NCwyOTcuNDk2MSBNIDM2Ny43OTQsMzA1LjQ5NjEgTCAzNjcuNzk0LDMxMy40OTYxIE0gMzgyLjc5NCwzMTMuNDk2MSBMIDM4Mi43OTQsMzA1LjQ5NjEgTSAzOTAuNzk0LDMyMS40OTYxIEwgMzkwLjc5NCwzMTMuNDk2MSBNIDM5MC43OTQsMzA1LjQ5NjEgTCAzOTAuNzk0LDI5Ny40OTYxIE0gMzkwLjc5NCwyODguNDk2MSBMIDM5MC43OTQsMjgxLjQ5NjEgTSAzOTAuNzk0LDI3My40OTYxIEwgMzkwLjc5NCwyNjQuNDk2MSBNIDM4Mi43OTQsMjk3LjQ5NjEgTCAzODIuNzk0LDI4OC40OTYxIE0gMzY3Ljc5NCwyOTcuNDk2MSBMIDM2Ny43OTQsMjg4LjQ5NjEgTSAzOTguNzk0LDI4OC40OTYxIEwgMzk4Ljc5NCwyOTcuNDk2MSBNIDQwNS43OTQsMjg4LjQ5NjEgTCA0MDUuNzk0LDI4MS40OTYxIE0gMzgyLjc5NCwyNzMuNDk2MSBMIDM4Mi43OTQsMjgxLjQ5NjEgTSAzOTguNzk0LDI3My40OTYxIEwgMzk4Ljc5NCwyODEuNDk2MSBNIDQxMy43OTQsMjczLjQ5NjEgTCA0MTMuNzk0LDI4MS40OTYxIE0gNDA1Ljc5NCwyNzMuNDk2MSBMIDQwNS43OTQsMjY0LjQ5NjEgTSA0MTMuNzk0LDI1Ni40OTYxIEwgNDEzLjc5NCwyNjQuNDk2MSBNIDQxMy43OTQsMjQwLjQ5NjEgTCA0MTMuNzk0LDI0OC40OTYxIE0gNDA1Ljc5NCwyMzIuNDk2MSBMIDQwNS43OTQsMjQwLjQ5NjEgTSA0MTMuNzk0LDIyNC40OTYxIEwgNDEzLjc5NCwyMzIuNDk2MSBNIDM5OC43OTQsMjI0LjQ5NjEgTCAzOTguNzk0LDIzMi40OTYxIE0gMzgyLjc5NCwyMjQuNDk2MSBMIDM4Mi43OTQsMjMyLjQ5NjEgTSAzNzUuNzk0LDIxNi40OTYxIEwgMzc1Ljc5NCwyMjQuNDk2MSBNIDM5MC43OTQsMjE2LjQ5NjEgTCAzOTAuNzk0LDIyNC40OTYxIE0gNDA1Ljc5NCwyMTYuNDk2MSBMIDQwNS43OTQsMjI0LjQ5NjEgTSA0MTMuNzk0LDIwOC40OTYxIEwgNDEzLjc5NCwyMTYuNDk2MSBNIDM5OC43OTQsMjA4LjQ5NjEgTCAzOTguNzk0LDIxNi40OTYxIE0gMzgyLjc5NCwyMDguNDk2MSBMIDM4Mi43OTQsMjE2LjQ5NjEgTSAzNzUuNzk0LDIwMC40OTYxIEwgMzc1Ljc5NCwyMDguNDk2MSBNIDQwNS43OTQsMjAwLjQ5NjEgTCA0MDUuNzk0LDIwOC40OTYxIE0gMzkwLjc5NCwxODQuNDk2MSBMIDM5MC43OTQsMTkyLjQ5NjEgTSA0NTkuNzk0LDE4NC40OTYxIEwgNDQzLjc5NCwxODQuNDk2MSBNIDQ2Ni43OTQsMTc0LjQ5NjEgTCA0MzYuNzk0LDE3NC40OTYxIE0gNDY2Ljc5NCwzMjEuNDk2MSBMIDQ2Ni43OTQsMzEzLjQ5NjEgTSA0NjYuNzk0LDMwNS40OTYxIEwgNDY2Ljc5NCwyOTcuNDk2MSBNIDQ3NC43OTQsMzA1LjQ5NjEgTCA0NzQuNzk0LDMxMy40OTYxIE0gNDU5Ljc5NCwzMTMuNDk2MSBMIDQ1OS43OTQsMzA1LjQ5NjEgTSA0NTEuNzk0LDMyMS40OTYxIEwgNDUxLjc5NCwzMTMuNDk2MSBNIDQ1MS43OTQsMzA1LjQ5NjEgTCA0NTEuNzk0LDI5Ny40OTYxIE0gNDUxLjc5NCwyODguNDk2MSBMIDQ1MS43OTQsMjgxLjQ5NjEgTSA0NTEuNzk0LDI3My40OTYxIEwgNDUxLjc5NCwyNjQuNDk2MSBNIDQ1OS43OTQsMjk3LjQ5NjEgTCA0NTkuNzk0LDI4OC40OTYxIE0gNDc0Ljc5NCwyOTcuNDk2MSBMIDQ3NC43OTQsMjg4LjQ5NjEgTSA0NDMuNzk0LDI4OC40OTYxIEwgNDQzLjc5NCwyOTcuNDk2MSBNIDQzNi43OTQsMjg4LjQ5NjEgTCA0MzYuNzk0LDI4MS40OTYxIE0gNDU5Ljc5NCwyNzMuNDk2MSBMIDQ1OS43OTQsMjgxLjQ5NjEgTSA0NDMuNzk0LDI3My40OTYxIEwgNDQzLjc5NCwyODEuNDk2MSBNIDQyOC43OTQsMjczLjQ5NjEgTCA0MjguNzk0LDI4MS40OTYxIE0gNDM2Ljc5NCwyNzMuNDk2MSBMIDQzNi43OTQsMjY0LjQ5NjEgTSA0MjguNzk0LDI1Ni40OTYxIEwgNDI4Ljc5NCwyNjQuNDk2MSBNIDQyOC43OTQsMjQwLjQ5NjEgTCA0MjguNzk0LDI0OC40OTYxIE0gNDM2Ljc5NCwyMzIuNDk2MSBMIDQzNi43OTQsMjQwLjQ5NjEgTSA0MjguNzk0LDIyNC40OTYxIEwgNDI4Ljc5NCwyMzIuNDk2MSBNIDQ0My43OTQsMjI0LjQ5NjEgTCA0NDMuNzk0LDIzMi40OTYxIE0gNDU5Ljc5NCwyMjQuNDk2MSBMIDQ1OS43OTQsMjMyLjQ5NjEgTSA0NjYuNzk0LDIxNi40OTYxIEwgNDY2Ljc5NCwyMjQuNDk2MSBNIDQ1MS43OTQsMjE2LjQ5NjEgTCA0NTEuNzk0LDIyNC40OTYxIE0gNDM2Ljc5NCwyMTYuNDk2MSBMIDQzNi43OTQsMjI0LjQ5NjEgTSA0MjguNzk0LDIwOC40OTYxIEwgNDI4Ljc5NCwyMTYuNDk2MSBNIDQ0My43OTQsMjA4LjQ5NjEgTCA0NDMuNzk0LDIxNi40OTYxIE0gNDU5Ljc5NCwyMDguNDk2MSBMIDQ1OS43OTQsMjE2LjQ5NjEgTSA0NjYuNzk0LDIwMC40OTYxIEwgNDY2Ljc5NCwyMDguNDk2MSBNIDQzNi43OTQsMjAwLjQ5NjEgTCA0MzYuNzk0LDIwOC40OTYxIE0gNDUxLjc5NCwxODQuNDk2MSBMIDQ1MS43OTQsMTkyLjQ5NjEgTSA0MjAuNzk0LDI3My40OTYxIEwgNDIwLjc5NCwyNjQuNDk2MSBNIDQyMC43OTQsMjQwLjQ5NjEgTCA0MjAuNzk0LDIzMi40OTYxIE0gNDIwLjc5NCwyNTYuNDk2MSBMIDQyMC43OTQsMjQ4LjQ5NjEgTSA0MjAuNzk0LDIyNC40OTYxIEwgNDIwLjc5NCwyMTYuNDk2MSBNIDQyMC43OTQsMjA4LjQ5NjEgTCA0MjAuNzk0LDIwMC40OTYxIE0gNDIwLjc5NCwxODQuNDk2MSBMIDQyMC43OTQsMTc2LjQ5NjEgTSA0MjAuNzk0LDE2OC40OTYxIEwgNDIwLjc5NCwxNjAuNDk2MSBNIDM4Mi43OTQsMTgxLjQ5NjEgTCAzOTguNzk0LDE4MS40OTYxIE0gNDEzLjc5NCwxNTcuNDk2MSBMIDQyOC43OTQsMTU3LjQ5NjEgTSA0NDMuNzk0LDE4MS40OTYxIEwgNDU5Ljc5NCwxODEuNDk2MSIKLSAgICAgICAgICAgICBzdHlsZT0iZmlsbDojYzhiMTAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQiCi0gICAgICAgICAgICAgaWQ9IjIxNDI2MzA0IiAvPgotICAgICAgICAgIDxnCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAyMC43OTQsMTM5LjQ5NjEpIgotICAgICAgICAgICAgIGlkPSJnMjYwMSIKLSAgICAgICAgICAgICBzdHlsZT0iZmlsbDojYzhiMTAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIj4KLSAgICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgICBkPSJNIC01NzksMTgyIEMgLTU3OSwxNzIgLTU3OSwxNjUgLTU3OSwxNjEgQyAtNTc5LDE1NyAtNTgxLDE0NSAtNjAwLDE0NSBDIC02MTgsMTQ1IC02MjAsMTU3IC02MjAsMTYxIEMgLTYyMCwxNjUgLTYyMCwxNzIgLTYyMCwxODIgTCAtNTc5LDE4MiB6ICIKLSAgICAgICAgICAgICAgIGNsYXNzPSJmaWwwIHN0cjAiCi0gICAgICAgICAgICAgICBpZD0iMjE0OTUyOTYiCi0gICAgICAgICAgICAgICBzdHlsZT0iZmlsbDojYzhiMTAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgotICAgICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICAgIGQ9Ik0gLTYxMywxNjIgTCAtNjIzLDE2MSBDIC02MjMsMTU3IC02MjIsMTUxIC02MTksMTQ5IEwgLTYxMCwxNTYgQyAtNjExLDE1NyAtNjEzLDE2MCAtNjEzLDE2MiB6ICIKLSAgICAgICAgICAgICAgIGNsYXNzPSJmaWwwIHN0cjAiCi0gICAgICAgICAgICAgICBpZD0iMjE0OTUyMDgiCi0gICAgICAgICAgICAgICBzdHlsZT0iZmlsbDojYzhiMTAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgotICAgICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICAgIGQ9Ik0gLTU4NiwxNjIgTCAtNTc2LDE2MSBDIC01NzYsMTU3IC01NzcsMTUxIC01ODAsMTQ5IEwgLTU4OSwxNTYgQyAtNTg4LDE1NyAtNTg2LDE2MCAtNTg2LDE2MiB6ICIKLSAgICAgICAgICAgICAgIGNsYXNzPSJmaWwwIHN0cjAiCi0gICAgICAgICAgICAgICBpZD0iMjE0OTUxMjAiCi0gICAgICAgICAgICAgICBzdHlsZT0iZmlsbDojYzhiMTAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgotICAgICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICAgIGQ9Ik0gLTU5NiwxNTIgTCAtNTkxLDE0MyBDIC01OTMsMTQyIC01OTcsMTQxIC02MDAsMTQxIEMgLTYwMiwxNDEgLTYwNiwxNDIgLTYwOCwxNDMgTCAtNjAzLDE1MiBDIC02MDEsMTUyIC01OTgsMTUyIC01OTYsMTUyIHogIgotICAgICAgICAgICAgICAgY2xhc3M9ImZpbDAgc3RyMCIKLSAgICAgICAgICAgICAgIGlkPSIyMTQ5NTAzMiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiNjOGIxMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+Ci0gICAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgICAgZD0iTSAtNjE1LDEyNyBDIC02MTUsMTI3IC02MTUsMTExIC02MTUsMTA1IEMgLTYxNSw5OSAtNjE5LDk0IC02MjYsOTQgQyAtNjMzLDk0IC02MzcsOTkgLTYzNywxMDUgQyAtNjM3LDExMSAtNjM3LDEyNyAtNjM3LDEyNyBMIC02MTUsMTI3IHogIgotICAgICAgICAgICAgICAgY2xhc3M9ImZpbDAgc3RyMCIKLSAgICAgICAgICAgICAgIGlkPSIyMTU3NTU1MiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiNjOGIxMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+Ci0gICAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgICAgZD0iTSAtNTg0LDEyNyBDIC01ODQsMTI3IC01ODQsMTExIC01ODQsMTA1IEMgLTU4NCw5OSAtNTgwLDk0IC01NzMsOTQgQyAtNTY2LDk0IC01NjIsOTkgLTU2MiwxMDUgQyAtNTYyLDExMSAtNTYyLDEyNyAtNTYyLDEyNyBMIC01ODQsMTI3IHogIgotICAgICAgICAgICAgICAgY2xhc3M9ImZpbDAgc3RyMCIKLSAgICAgICAgICAgICAgIGlkPSIyMTU3NTQ2NCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiNjOGIxMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+Ci0gICAgICAgICAgPC9nPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgZD0iTSA0MjguNzk0LDIxMi40OTYxIEwgNDMwLjc5NCwxOTIuNDk2MSBMIDQxMS43OTQsMTkyLjQ5NjEgTCA0MTIuNzk0LDIxMi40OTYxIEwgNDI4Ljc5NCwyMTIuNDk2MSB6ICIKLSAgICAgICAgICAgICBjbGFzcz0iZmlsMCBzdHIwIgotICAgICAgICAgICAgIGlkPSIyMTU3NTM3NiIKLSAgICAgICAgICAgICBzdHlsZT0iZmlsbDojYzhiMTAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgZD0iTSA0NDMuNzk0LDIxMi40OTYxIEwgNDQxLjc5NCwxOTIuNDk2MSBMIDQ2MS43OTQsMTkyLjQ5NjEgTCA0NTkuNzk0LDIxMi40OTYxIEwgNDQzLjc5NCwyMTIuNDk2MSB6ICIKLSAgICAgICAgICAgICBjbGFzcz0iZmlsMCBzdHIwIgotICAgICAgICAgICAgIGlkPSIyMTU3NTI4OCIKLSAgICAgICAgICAgICBzdHlsZT0iZmlsbDojYzhiMTAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgZD0iTSAzOTguNzk0LDIxMi40OTYxIEwgMzk5Ljc5NCwxOTIuNDk2MSBMIDM4MC43OTQsMTkyLjQ5NjEgTCAzODIuNzk0LDIxMi40OTYxIEwgMzk4Ljc5NCwyMTIuNDk2MSB6ICIKLSAgICAgICAgICAgICBjbGFzcz0iZmlsMCBzdHIwIgotICAgICAgICAgICAgIGlkPSIyMTU3NTIwMCIKLSAgICAgICAgICAgICBzdHlsZT0iZmlsbDojYzhiMTAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgotICAgICAgICAgIDxnCi0gICAgICAgICAgICAgc3R5bGU9InN0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwMjAuNzk0LDEzOS40OTYxKSIKLSAgICAgICAgICAgICBpZD0iZzI2MTIiPgotICAgICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDM5ZjA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiCi0gICAgICAgICAgICAgICBpZD0iMjE1NzUwMjQiCi0gICAgICAgICAgICAgICBjbGFzcz0iZmlsMiIKLSAgICAgICAgICAgICAgIGQ9Ik0gLTU4NiwxODIgQyAtNTg2LDE3NCAtNTg2LDE2NyAtNTg2LDE2NCBDIC01ODYsMTYxIC01ODgsMTUyIC02MDAsMTUyIEMgLTYxMSwxNTIgLTYxMywxNjEgLTYxMywxNjQgQyAtNjEzLDE2NyAtNjEzLDE3NCAtNjEzLDE4MiBMIC01ODYsMTgyIHogIiAvPgotICAgICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDM5ZjA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiCi0gICAgICAgICAgICAgICBpZD0iMjE1NzQ5MzYiCi0gICAgICAgICAgICAgICBjbGFzcz0iZmlsMiIKLSAgICAgICAgICAgICAgIGQ9Ik0gLTYxNywxMjUgQyAtNjE3LDEyNSAtNjE3LDExMSAtNjE3LDEwNiBDIC02MTcsMTAxIC02MjAsOTYgLTYyNiw5NiBDIC02MzIsOTYgLTYzNSwxMDEgLTYzNSwxMDYgQyAtNjM1LDExMSAtNjM1LDEyNSAtNjM1LDEyNSBMIC02MTcsMTI1IHogIiAvPgotICAgICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDM5ZjA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiCi0gICAgICAgICAgICAgICBpZD0iMjE1NzQ4NDgiCi0gICAgICAgICAgICAgICBjbGFzcz0iZmlsMiIKLSAgICAgICAgICAgICAgIGQ9Ik0gLTU4MiwxMjUgQyAtNTgyLDEyNSAtNTgyLDExMSAtNTgyLDEwNiBDIC01ODIsMTAxIC01NzksOTYgLTU3Myw5NiBDIC01NjcsOTYgLTU2NCwxMDEgLTU2NCwxMDYgQyAtNTY0LDExMSAtNTY0LDEyNSAtNTY0LDEyNSBMIC01ODIsMTI1IHogIiAvPgotICAgICAgICAgIDwvZz4KLSAgICAgICAgPC9nPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5MTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNBRDE1MTk7ZmlsbC1vcGFjaXR5OjEiCi0gICAgICAgICAgIGQ9Ik0gMjMyLjI2OSwyNzkuNzg0NyBDIDIzMi4yNjksMjY5Ljc1MTcgMjM5LjQ5NywyNjEuNjE4NyAyNDguNDEyLDI2MS42MTg3IEMgMjU3LjMzLDI2MS42MTg3IDI2NC41NTgsMjY5Ljc1MTcgMjY0LjU1OCwyNzkuNzg0NyBDIDI2NC41NTgsMjg5LjgxNzcgMjU3LjMzLDI5Ny45NTA3IDI0OC40MTIsMjk3Ljk1MDcgQyAyMzkuNDk3LDI5Ny45NTA3IDIzMi4yNjksMjg5LjgxNzcgMjMyLjI2OSwyNzkuNzg0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTEzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjYwMTU2NjAyIgotICAgICAgICAgICBkPSJNIDIzMi4yNjksMjc5Ljc4NDcgQyAyMzIuMjY5LDI2OS43NTE3IDIzOS40OTcsMjYxLjYxODcgMjQ4LjQxMiwyNjEuNjE4NyBDIDI1Ny4zMywyNjEuNjE4NyAyNjQuNTU4LDI2OS43NTE3IDI2NC41NTgsMjc5Ljc4NDcgQyAyNjQuNTU4LDI4OS44MTc3IDI1Ny4zMywyOTcuOTUwNyAyNDguNDEyLDI5Ny45NTA3IEMgMjM5LjQ5NywyOTcuOTUwNyAyMzIuMjY5LDI4OS44MTc3IDIzMi4yNjksMjc5Ljc4NDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTkxNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6IzAwNWJiZjtmaWxsLW9wYWNpdHk6MC45NDExNzY0NyIKLSAgICAgICAgICAgZD0iTSAyMzcuMDU4LDI3OS43NDk3IEMgMjM3LjA1OCwyNzIuMzkyNyAyNDIuMTQxLDI2Ni40Mjk3IDI0OC40MTksMjY2LjQyOTcgQyAyNTQuNjkzLDI2Ni40Mjk3IDI1OS43NzcsMjcyLjM5MjcgMjU5Ljc3NywyNzkuNzQ5NyBDIDI1OS43NzcsMjg3LjEwOTcgMjU0LjY5MywyOTMuMDc2NyAyNDguNDE5LDI5My4wNzY3IEMgMjQyLjE0MSwyOTMuMDc2NyAyMzcuMDU4LDI4Ny4xMDk3IDIzNy4wNTgsMjc5Ljc0OTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTkxNyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC42MDE1NjYwMiIKLSAgICAgICAgICAgZD0iTSAyMzcuMDU4LDI3OS43NDk3IEMgMjM3LjA1OCwyNzIuMzkyNyAyNDIuMTQxLDI2Ni40Mjk3IDI0OC40MTksMjY2LjQyOTcgQyAyNTQuNjkzLDI2Ni40Mjk3IDI1OS43NzcsMjcyLjM5MjcgMjU5Ljc3NywyNzkuNzQ5NyBDIDI1OS43NzcsMjg3LjEwOTcgMjU0LjY5MywyOTMuMDc2NyAyNDguNDE5LDI5My4wNzY3IEMgMjQyLjE0MSwyOTMuMDc2NyAyMzcuMDU4LDI4Ny4xMDk3IDIzNy4wNTgsMjc5Ljc0OTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTkxOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNDMuMDUzLDI3MC41Nzk3IEMgMjQzLjA1MywyNzAuNTc5NyAyNDEuNzA0LDI3Mi4wNTc3IDI0MS43MDQsMjczLjQyNTcgQyAyNDEuNzA0LDI3NC44MDE3IDI0Mi4yNzQsMjc1Ljk0MzcgMjQyLjI3NCwyNzUuOTQzNyBDIDI0Mi4wNywyNzUuNDAwNyAyNDEuNTE5LDI3NS4wMDk3IDI0MC44NzEsMjc1LjAwOTcgQyAyNDAuMDUyLDI3NS4wMDk3IDIzOS4zODUsMjc1LjYzNzcgMjM5LjM4NSwyNzYuNDE2NyBDIDIzOS4zODUsMjc2LjY0MjcgMjM5LjUyMywyNzYuOTk0NyAyMzkuNjI3LDI3Ny4xODg3IEwgMjQwLjExMSwyNzguMTY1NyBDIDI0MC4yNzEsMjc3LjgwNTcgMjQwLjY0OCwyNzcuNjA0NyAyNDEuMDg3LDI3Ny42MDQ3IEMgMjQxLjY3NCwyNzcuNjA0NyAyNDIuMTUyLDI3OC4wNTI3IDI0Mi4xNTIsMjc4LjYxMDcgQyAyNDIuMTUyLDI3OC42OTQ3IDI0Mi4xNDEsMjc4Ljc3OTcgMjQyLjExOSwyNzguODU2NyBMIDI0MC45MDgsMjc4Ljg2MDcgTCAyNDAuOTA4LDI3OS44OTA3IEwgMjQxLjk4OCwyNzkuODkwNyBMIDI0MS4xODQsMjgxLjQ4NDcgTCAyNDIuMjQ5LDI4MS4wNjg3IEwgMjQzLjA1MywyODEuOTc0NyBMIDI0My44ODcsMjgxLjA2ODcgTCAyNDQuOTQ5LDI4MS40ODQ3IEwgMjQ0LjE0OCwyNzkuODkwNyBMIDI0NS4yMjgsMjc5Ljg5MDcgTCAyNDUuMjI4LDI3OC44NjA3IEwgMjQ0LjAxNCwyNzguODU2NyBDIDI0My45OTIsMjc4Ljc3OTcgMjQzLjk4OCwyNzguNjk0NyAyNDMuOTg4LDI3OC42MTA3IEMgMjQzLjk4OCwyNzguMDUyNyAyNDQuNDU3LDI3Ny42MDQ3IDI0NS4wNDUsMjc3LjYwNDcgQyAyNDUuNDg0LDI3Ny42MDQ3IDI0NS44NjEsMjc3LjgwNTcgMjQ2LjAyNCwyNzguMTY1NyBMIDI0Ni41MDQsMjc3LjE4ODcgQyAyNDYuNjA5LDI3Ni45OTQ3IDI0Ni43NDcsMjc2LjY0MjcgMjQ2Ljc0NywyNzYuNDE2NyBDIDI0Ni43NDcsMjc1LjYzNzcgMjQ2LjA4NCwyNzUuMDA5NyAyNDUuMjYxLDI3NS4wMDk3IEMgMjQ0LjYxMywyNzUuMDA5NyAyNDQuMDY2LDI3NS40MDA3IDI0My44NjEsMjc1Ljk0MzcgQyAyNDMuODYxLDI3NS45NDM3IDI0NC40MjcsMjc0LjgwMTcgMjQ0LjQyNywyNzMuNDI1NyBDIDI0NC40MjcsMjcyLjA1NzcgMjQzLjA1LDI3MC41Nzk3IDI0My4wNSwyNzAuNTc5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTIxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjMzNzAyMjk5O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAyNDMuMDUzLDI3MC41Nzk3IEMgMjQzLjA1MywyNzAuNTc5NyAyNDEuNzA0LDI3Mi4wNTc3IDI0MS43MDQsMjczLjQyNTcgQyAyNDEuNzA0LDI3NC44MDE3IDI0Mi4yNzQsMjc1Ljk0MzcgMjQyLjI3NCwyNzUuOTQzNyBDIDI0Mi4wNywyNzUuNDAwNyAyNDEuNTE5LDI3NS4wMDk3IDI0MC44NzEsMjc1LjAwOTcgQyAyNDAuMDUyLDI3NS4wMDk3IDIzOS4zODUsMjc1LjYzNzcgMjM5LjM4NSwyNzYuNDE2NyBDIDIzOS4zODUsMjc2LjY0MjcgMjM5LjUyMywyNzYuOTk0NyAyMzkuNjI3LDI3Ny4xODg3IEwgMjQwLjExMSwyNzguMTY1NyBDIDI0MC4yNzEsMjc3LjgwNTcgMjQwLjY0OCwyNzcuNjA0NyAyNDEuMDg3LDI3Ny42MDQ3IEMgMjQxLjY3NCwyNzcuNjA0NyAyNDIuMTUyLDI3OC4wNTI3IDI0Mi4xNTIsMjc4LjYxMDcgQyAyNDIuMTUyLDI3OC42OTQ3IDI0Mi4xNDEsMjc4Ljc3OTcgMjQyLjExOSwyNzguODU2NyBMIDI0MC45MDgsMjc4Ljg2MDcgTCAyNDAuOTA4LDI3OS44OTA3IEwgMjQxLjk4OCwyNzkuODkwNyBMIDI0MS4xODQsMjgxLjQ4NDcgTCAyNDIuMjQ5LDI4MS4wNjg3IEwgMjQzLjA1MywyODEuOTc0NyBMIDI0My44ODcsMjgxLjA2ODcgTCAyNDQuOTQ5LDI4MS40ODQ3IEwgMjQ0LjE0OCwyNzkuODkwNyBMIDI0NS4yMjgsMjc5Ljg5MDcgTCAyNDUuMjI4LDI3OC44NjA3IEwgMjQ0LjAxNCwyNzguODU2NyBDIDI0My45OTIsMjc4Ljc3OTcgMjQzLjk4OCwyNzguNjk0NyAyNDMuOTg4LDI3OC42MTA3IEMgMjQzLjk4OCwyNzguMDUyNyAyNDQuNDU3LDI3Ny42MDQ3IDI0NS4wNDUsMjc3LjYwNDcgQyAyNDUuNDg0LDI3Ny42MDQ3IDI0NS44NjEsMjc3LjgwNTcgMjQ2LjAyNCwyNzguMTY1NyBMIDI0Ni41MDQsMjc3LjE4ODcgQyAyNDYuNjA5LDI3Ni45OTQ3IDI0Ni43NDcsMjc2LjY0MjcgMjQ2Ljc0NywyNzYuNDE2NyBDIDI0Ni43NDcsMjc1LjYzNzcgMjQ2LjA4NCwyNzUuMDA5NyAyNDUuMjYxLDI3NS4wMDk3IEMgMjQ0LjYxMywyNzUuMDA5NyAyNDQuMDY2LDI3NS40MDA3IDI0My44NjEsMjc1Ljk0MzcgQyAyNDMuODYxLDI3NS45NDM3IDI0NC40MjcsMjc0LjgwMTcgMjQ0LjQyNywyNzMuNDI1NyBDIDI0NC40MjcsMjcyLjA1NzcgMjQzLjA1LDI3MC41Nzk3IDI0My4wNSwyNzAuNTc5NyBMIDI0My4wNTMsMjcwLjU3OTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTkyMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNDAuOTA4LDI3OS44OTA3IEwgMjQ1LjIzMSwyNzkuODkwNyBMIDI0NS4yMzEsMjc4Ljg2MDcgTCAyNDAuOTA4LDI3OC44NjA3IEwgMjQwLjkwOCwyNzkuODkwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTI1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjMzNzAyMjk5IgotICAgICAgICAgICBkPSJNIDI0MC45MDgsMjc5Ljg5MDcgTCAyNDUuMjMxLDI3OS44OTA3IEwgMjQ1LjIzMSwyNzguODYwNyBMIDI0MC45MDgsMjc4Ljg2MDcgTCAyNDAuOTA4LDI3OS44OTA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5MjciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjUzLjYxLDI3MC41Nzk3IEMgMjUzLjYxLDI3MC41Nzk3IDI1Mi4yNjIsMjcyLjA1NzcgMjUyLjI2MiwyNzMuNDI1NyBDIDI1Mi4yNjIsMjc0LjgwMTcgMjUyLjgyOCwyNzUuOTQzNyAyNTIuODI4LDI3NS45NDM3IEMgMjUyLjYyNywyNzUuNDAwNyAyNTIuMDc2LDI3NS4wMDk3IDI1MS40MjgsMjc1LjAwOTcgQyAyNTAuNjA1LDI3NS4wMDk3IDI0OS45NDIsMjc1LjYzNzcgMjQ5Ljk0MiwyNzYuNDE2NyBDIDI0OS45NDIsMjc2LjY0MjcgMjUwLjA4LDI3Ni45OTQ3IDI1MC4xODQsMjc3LjE4ODcgTCAyNTAuNjY0LDI3OC4xNjU3IEMgMjUwLjgyOSwyNzcuODA1NyAyNTEuMjA1LDI3Ny42MDQ3IDI1MS42NDQsMjc3LjYwNDcgQyAyNTIuMjMyLDI3Ny42MDQ3IDI1Mi43MDUsMjc4LjA1MjcgMjUyLjcwNSwyNzguNjEwNyBDIDI1Mi43MDUsMjc4LjY5NDcgMjUyLjY5OCwyNzguNzc5NyAyNTIuNjc2LDI3OC44NTY3IEwgMjUxLjQ2NSwyNzguODYwNyBMIDI1MS40NjUsMjc5Ljg5MDcgTCAyNTIuNTQ1LDI3OS44OTA3IEwgMjUxLjc0MSwyODEuNDg0NyBMIDI1Mi44MDIsMjgxLjA2ODcgTCAyNTMuNjEsMjgxLjk3NDcgTCAyNTQuNDQxLDI4MS4wNjg3IEwgMjU1LjUwNiwyODEuNDg0NyBMIDI1NC43MDEsMjc5Ljg5MDcgTCAyNTUuNzgxLDI3OS44OTA3IEwgMjU1Ljc4MSwyNzguODYwNyBMIDI1NC41NzEsMjc4Ljg1NjcgQyAyNTQuNTQ4LDI3OC43Nzk3IDI1NC41NDEsMjc4LjY5NDcgMjU0LjU0MSwyNzguNjEwNyBDIDI1NC41NDEsMjc4LjA1MjcgMjU1LjAxNCwyNzcuNjA0NyAyNTUuNjAzLDI3Ny42MDQ3IEMgMjU2LjA0MiwyNzcuNjA0NyAyNTYuNDE4LDI3Ny44MDU3IDI1Ni41NzgsMjc4LjE2NTcgTCAyNTcuMDYyLDI3Ny4xODg3IEMgMjU3LjE2NywyNzYuOTk0NyAyNTcuMzAzLDI3Ni42NDI3IDI1Ny4zMDMsMjc2LjQxNjcgQyAyNTcuMzAzLDI3NS42Mzc3IDI1Ni42MzgsMjc1LjAwOTcgMjU1LjgxOCwyNzUuMDA5NyBDIDI1NS4xNzEsMjc1LjAwOTcgMjU0LjYxOCwyNzUuNDAwNyAyNTQuNDE1LDI3NS45NDM3IEMgMjU0LjQxNSwyNzUuOTQzNyAyNTQuOTg0LDI3NC44MDE3IDI1NC45ODQsMjczLjQyNTcgQyAyNTQuOTg0LDI3Mi4wNTc3IDI1My42MDcsMjcwLjU3OTcgMjUzLjYwNywyNzAuNTc5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTI5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjMzNzAyMjk5O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAyNTMuNjEsMjcwLjU3OTcgQyAyNTMuNjEsMjcwLjU3OTcgMjUyLjI2MiwyNzIuMDU3NyAyNTIuMjYyLDI3My40MjU3IEMgMjUyLjI2MiwyNzQuODAxNyAyNTIuODI4LDI3NS45NDM3IDI1Mi44MjgsMjc1Ljk0MzcgQyAyNTIuNjI3LDI3NS40MDA3IDI1Mi4wNzYsMjc1LjAwOTcgMjUxLjQyOCwyNzUuMDA5NyBDIDI1MC42MDUsMjc1LjAwOTcgMjQ5Ljk0MiwyNzUuNjM3NyAyNDkuOTQyLDI3Ni40MTY3IEMgMjQ5Ljk0MiwyNzYuNjQyNyAyNTAuMDgsMjc2Ljk5NDcgMjUwLjE4NCwyNzcuMTg4NyBMIDI1MC42NjQsMjc4LjE2NTcgQyAyNTAuODI5LDI3Ny44MDU3IDI1MS4yMDUsMjc3LjYwNDcgMjUxLjY0NCwyNzcuNjA0NyBDIDI1Mi4yMzIsMjc3LjYwNDcgMjUyLjcwNSwyNzguMDUyNyAyNTIuNzA1LDI3OC42MTA3IEMgMjUyLjcwNSwyNzguNjk0NyAyNTIuNjk4LDI3OC43Nzk3IDI1Mi42NzYsMjc4Ljg1NjcgTCAyNTEuNDY1LDI3OC44NjA3IEwgMjUxLjQ2NSwyNzkuODkwNyBMIDI1Mi41NDUsMjc5Ljg5MDcgTCAyNTEuNzQxLDI4MS40ODQ3IEwgMjUyLjgwMiwyODEuMDY4NyBMIDI1My42MSwyODEuOTc0NyBMIDI1NC40NDEsMjgxLjA2ODcgTCAyNTUuNTA2LDI4MS40ODQ3IEwgMjU0LjcwMSwyNzkuODkwNyBMIDI1NS43ODEsMjc5Ljg5MDcgTCAyNTUuNzgxLDI3OC44NjA3IEwgMjU0LjU3MSwyNzguODU2NyBDIDI1NC41NDgsMjc4Ljc3OTcgMjU0LjU0MSwyNzguNjk0NyAyNTQuNTQxLDI3OC42MTA3IEMgMjU0LjU0MSwyNzguMDUyNyAyNTUuMDE0LDI3Ny42MDQ3IDI1NS42MDMsMjc3LjYwNDcgQyAyNTYuMDQyLDI3Ny42MDQ3IDI1Ni40MTgsMjc3LjgwNTcgMjU2LjU3OCwyNzguMTY1NyBMIDI1Ny4wNjIsMjc3LjE4ODcgQyAyNTcuMTY3LDI3Ni45OTQ3IDI1Ny4zMDMsMjc2LjY0MjcgMjU3LjMwMywyNzYuNDE2NyBDIDI1Ny4zMDMsMjc1LjYzNzcgMjU2LjYzOCwyNzUuMDA5NyAyNTUuODE4LDI3NS4wMDk3IEMgMjU1LjE3MSwyNzUuMDA5NyAyNTQuNjE4LDI3NS40MDA3IDI1NC40MTUsMjc1Ljk0MzcgQyAyNTQuNDE1LDI3NS45NDM3IDI1NC45ODQsMjc0LjgwMTcgMjU0Ljk4NCwyNzMuNDI1NyBDIDI1NC45ODQsMjcyLjA1NzcgMjUzLjYwNywyNzAuNTc5NyAyNTMuNjA3LDI3MC41Nzk3IEwgMjUzLjYxLDI3MC41Nzk3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5MzEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjUxLjQ2NSwyNzkuODkwNyBMIDI1NS43ODUsMjc5Ljg5MDcgTCAyNTUuNzg1LDI3OC44NjA3IEwgMjUxLjQ2NSwyNzguODYwNyBMIDI1MS40NjUsMjc5Ljg5MDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTkzMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zMzcwMjI5OSIKLSAgICAgICAgICAgZD0iTSAyNTEuNDY1LDI3OS44OTA3IEwgMjU1Ljc4NSwyNzkuODkwNyBMIDI1NS43ODUsMjc4Ljg2MDcgTCAyNTEuNDY1LDI3OC44NjA3IEwgMjUxLjQ2NSwyNzkuODkwNyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTM1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI0OC4zMywyNzkuNjYwNyBDIDI0OC4zMywyNzkuNjYwNyAyNDYuOTgyLDI4MS4xMzg3IDI0Ni45ODIsMjgyLjUxMDcgQyAyNDYuOTgyLDI4My44ODI3IDI0Ny41NTIsMjg1LjAyNDcgMjQ3LjU1MiwyODUuMDI0NyBDIDI0Ny4zNDcsMjg0LjQ4MTcgMjQ2Ljc5OSwyODQuMDkwNyAyNDYuMTQ4LDI4NC4wOTA3IEMgMjQ1LjMyOSwyODQuMDkwNyAyNDQuNjYyLDI4NC43MTg3IDI0NC42NjIsMjg1LjQ5NzcgQyAyNDQuNjYyLDI4NS43MjY3IDI0NC44LDI4Ni4wNzU3IDI0NC45MDQsMjg2LjI2OTcgTCAyNDUuMzg4LDI4Ny4yNDY3IEMgMjQ1LjU1MiwyODYuODg2NyAyNDUuOTI0LDI4Ni42ODI3IDI0Ni4zNjMsMjg2LjY4MjcgQyAyNDYuOTUyLDI4Ni42ODI3IDI0Ny40MjksMjg3LjEzMzcgMjQ3LjQyOSwyODcuNjkxNyBDIDI0Ny40MjksMjg3Ljc3OTcgMjQ3LjQxOCwyODcuODYzNyAyNDcuMzk1LDI4Ny45NDE3IEwgMjQ2LjE4NSwyODcuOTQ0NyBMIDI0Ni4xODUsMjg4Ljk3NDcgTCAyNDcuMjY5LDI4OC45NzQ3IEwgMjQ2LjQ2NCwyOTAuNTY4NyBMIDI0Ny41MjYsMjkwLjE0OTcgTCAyNDguMzMsMjkxLjA1NTcgTCAyNDkuMTY0LDI5MC4xNDk3IEwgMjUwLjIyOSwyOTAuNTY4NyBMIDI0OS40MjEsMjg4Ljk3NDcgTCAyNTAuNTA0LDI4OC45NzQ3IEwgMjUwLjUwNCwyODcuOTQ0NyBMIDI0OS4yOTQsMjg3Ljk0MTcgQyAyNDkuMjcyLDI4Ny44NjM3IDI0OS4yNjQsMjg3Ljc3OTcgMjQ5LjI2NCwyODcuNjkxNyBDIDI0OS4yNjQsMjg3LjEzMzcgMjQ5LjczOCwyODYuNjgyNyAyNTAuMzI2LDI4Ni42ODI3IEMgMjUwLjc2NCwyODYuNjgyNyAyNTEuMTM3LDI4Ni44ODY3IDI1MS4zMDIsMjg3LjI0NjcgTCAyNTEuNzg2LDI4Ni4yNjk3IEMgMjUxLjg4OSwyODYuMDc1NyAyNTIuMDI4LDI4NS43MjY3IDI1Mi4wMjgsMjg1LjQ5NzcgQyAyNTIuMDI4LDI4NC43MTg3IDI1MS4zNjEsMjg0LjA5MDcgMjUwLjU0MiwyODQuMDkwNyBDIDI0OS44OTQsMjg0LjA5MDcgMjQ5LjM0NywyODQuNDgxNyAyNDkuMTM4LDI4NS4wMjQ3IEMgMjQ5LjEzOCwyODUuMDI0NyAyNDkuNzA4LDI4My44ODI3IDI0OS43MDgsMjgyLjUxMDcgQyAyNDkuNzA4LDI4MS4xMzg3IDI0OC4zMjYsMjc5LjY2MDcgMjQ4LjMyNiwyNzkuNjYwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTM3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjMzNzAyMjk5O3N0cm9rZS1saW5lam9pbjpyb3VuZCIKLSAgICAgICAgICAgZD0iTSAyNDguMzMsMjc5LjY2MDcgQyAyNDguMzMsMjc5LjY2MDcgMjQ2Ljk4MiwyODEuMTM4NyAyNDYuOTgyLDI4Mi41MTA3IEMgMjQ2Ljk4MiwyODMuODgyNyAyNDcuNTUyLDI4NS4wMjQ3IDI0Ny41NTIsMjg1LjAyNDcgQyAyNDcuMzQ3LDI4NC40ODE3IDI0Ni43OTksMjg0LjA5MDcgMjQ2LjE0OCwyODQuMDkwNyBDIDI0NS4zMjksMjg0LjA5MDcgMjQ0LjY2MiwyODQuNzE4NyAyNDQuNjYyLDI4NS40OTc3IEMgMjQ0LjY2MiwyODUuNzI2NyAyNDQuOCwyODYuMDc1NyAyNDQuOTA0LDI4Ni4yNjk3IEwgMjQ1LjM4OCwyODcuMjQ2NyBDIDI0NS41NTIsMjg2Ljg4NjcgMjQ1LjkyNCwyODYuNjgyNyAyNDYuMzYzLDI4Ni42ODI3IEMgMjQ2Ljk1MiwyODYuNjgyNyAyNDcuNDI5LDI4Ny4xMzM3IDI0Ny40MjksMjg3LjY5MTcgQyAyNDcuNDI5LDI4Ny43Nzk3IDI0Ny40MTgsMjg3Ljg2MzcgMjQ3LjM5NSwyODcuOTQxNyBMIDI0Ni4xODUsMjg3Ljk0NDcgTCAyNDYuMTg1LDI4OC45NzQ3IEwgMjQ3LjI2OSwyODguOTc0NyBMIDI0Ni40NjQsMjkwLjU2ODcgTCAyNDcuNTI2LDI5MC4xNDk3IEwgMjQ4LjMzLDI5MS4wNTU3IEwgMjQ5LjE2NCwyOTAuMTQ5NyBMIDI1MC4yMjksMjkwLjU2ODcgTCAyNDkuNDIxLDI4OC45NzQ3IEwgMjUwLjUwNCwyODguOTc0NyBMIDI1MC41MDQsMjg3Ljk0NDcgTCAyNDkuMjk0LDI4Ny45NDE3IEMgMjQ5LjI3MiwyODcuODYzNyAyNDkuMjY0LDI4Ny43Nzk3IDI0OS4yNjQsMjg3LjY5MTcgQyAyNDkuMjY0LDI4Ny4xMzM3IDI0OS43MzgsMjg2LjY4MjcgMjUwLjMyNiwyODYuNjgyNyBDIDI1MC43NjQsMjg2LjY4MjcgMjUxLjEzNywyODYuODg2NyAyNTEuMzAyLDI4Ny4yNDY3IEwgMjUxLjc4NiwyODYuMjY5NyBDIDI1MS44ODksMjg2LjA3NTcgMjUyLjAyOCwyODUuNzI2NyAyNTIuMDI4LDI4NS40OTc3IEMgMjUyLjAyOCwyODQuNzE4NyAyNTEuMzYxLDI4NC4wOTA3IDI1MC41NDIsMjg0LjA5MDcgQyAyNDkuODk0LDI4NC4wOTA3IDI0OS4zNDcsMjg0LjQ4MTcgMjQ5LjEzOCwyODUuMDI0NyBDIDI0OS4xMzgsMjg1LjAyNDcgMjQ5LjcwOCwyODMuODgyNyAyNDkuNzA4LDI4Mi41MTA3IEMgMjQ5LjcwOCwyODEuMTM4NyAyNDguMzI2LDI3OS42NjA3IDI0OC4zMjYsMjc5LjY2MDcgTCAyNDguMzMsMjc5LjY2MDcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTkzOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNDYuMTg1LDI4OC45NzQ3IEwgMjUwLjUwOCwyODguOTc0NyBMIDI1MC41MDgsMjg3Ljk0NDcgTCAyNDYuMTg1LDI4Ny45NDQ3IEwgMjQ2LjE4NSwyODguOTc0NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTQxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjMzNzAyMjk5IgotICAgICAgICAgICBkPSJNIDI0Ni4xODUsMjg4Ljk3NDcgTCAyNTAuNTA4LDI4OC45NzQ3IEwgMjUwLjUwOCwyODcuOTQ0NyBMIDI0Ni4xODUsMjg3Ljk0NDcgTCAyNDYuMTg1LDI4OC45NzQ3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjgwLjY0MiwyMzEuODE1NyBMIDI4MC4zNTUsMjMxLjgzNjcgQyAyODAuMzQyLDIzMS44NzE3IDI4MC4yMTMsMjMyLjA3NjcgMjgwLjA5MSwyMzIuMTg5NyBDIDI3OS44MzcsMjMyLjQzMjcgMjc5LjQ1NCwyMzIuNDYwNyAyNzkuMjM4LDIzMi4yNTY3IEMgMjc5LjEzMywyMzIuMTUwNyAyNzkuMDgxLDIzMi4wMDI3IDI3OS4xLDIzMS44NTA3IEMgMjc4LjkzMiwyMzEuOTM1NyAyNzguNzU3LDIzMS45MzU3IDI3OC41OTMsMjMxLjg0MzcgQyAyNzguMzM2LDIzMS42OTU3IDI3OC4yNzIsMjMxLjM0MjcgMjc4LjQ1OSwyMzEuMDQ5NyBDIDI3OC40ODksMjMwLjk5MzcgMjc4LjUxOSwyMzAuOTE5NyAyNzguNTY0LDIzMC44Nzc3IEwgMjc4LjU0NSwyMzAuNTU2NyBMIDI3OC4xOTgsMjMwLjYzNzcgTCAyNzguMDk4LDIzMC44Mjc3IEMgMjc3Ljg4MiwyMzEuMDcxNyAyNzcuNTYyLDIzMS4xMzQ3IDI3Ny40MDIsMjMwLjk5MDcgQyAyNzcuMzI0LDIzMC45MjM3IDI3Ny4yNjcsMjMwLjczNjcgMjc3LjI3MiwyMzAuNzI5NyBDIDI3Ny4yNzUsMjMwLjczNjcgMjc3LjE4OSwyMzAuODEzNyAyNzcuMSwyMzAuODM0NyBDIDI3Ni41NjgsMjMwLjk2NTcgMjc2LjM1NiwyMjkuNzk0NyAyNzYuMzQ0LDIyOS40OTE3IEwgMjc2LjE2OSwyMjkuNzM4NyBDIDI3Ni4xNjksMjI5LjczODcgMjc2LjMyNiwyMzAuNDM5NyAyNzYuMjQ3LDIzMS4wMzI3IEMgMjc2LjE2OSwyMzEuNjI0NyAyNzUuOTYsMjMyLjIxNzcgMjc1Ljk2LDIzMi4yMTc3IEMgMjc2LjcwMiwyMzIuNDA3NyAyNzcuODEyLDIzMy4wMTA3IDI3OC45MTMsMjMzLjg2MDcgQyAyODAuMDE2LDIzNC43MDM3IDI4MC44ODMsMjM1LjYyMDcgMjgxLjI0MSwyMzYuMjYyNyBDIDI4MS4yNDEsMjM2LjI2MjcgMjgxLjgxMSwyMzUuOTQ0NyAyODIuNDEsMjM1Ljc1NDcgQyAyODMuMDAzLDIzNS41NjA3IDI4My43NTgsMjM1LjU1NjcgMjgzLjc1OCwyMzUuNTU2NyBMIDI4My45NzMsMjM1LjM0NTcgQyAyODMuNjU3LDIzNS4zOTE3IDI4Mi40MDMsMjM1LjQ0NDcgMjgyLjQyOCwyMzQuOTE4NyBDIDI4Mi40MzMsMjM0LjgzNDcgMjgyLjQ5NiwyMzQuNzQyNyAyODIuNTA3LDIzNC43NDI3IEMgMjgyLjUsMjM0Ljc0OTcgMjgyLjI5OSwyMzQuNzMxNyAyODIuMjA5LDIzNC42NzU3IEMgMjgyLjAyNywyMzQuNTU1NyAyODIuMDMxLDIzNC4yNDg3IDI4Mi4yMzIsMjMzLjk5NDcgTCAyODIuNDA3LDIzMy44Njc3IEwgMjgyLjQxOCwyMzMuNTI5NyBMIDI4Mi4wODIsMjMzLjU3NTcgQyAyODIuMDUyLDIzMy42MTc3IDI4MS45NzUsMjMzLjY2NjcgMjgxLjkzLDIzMy43MDk3IEMgMjgxLjY2NiwyMzMuOTM4NyAyODEuMjg2LDIzMy45NTU3IDI4MS4wNzcsMjMzLjc0MDcgQyAyODAuOTUxLDIzMy42MTc3IDI4MC45MTIsMjMzLjQ1MTcgMjgwLjk2NiwyMzMuMjc4NyBDIDI4MC44MTMsMjMzLjMyNDcgMjgwLjY1MywyMzMuMzEwNyAyODAuNTE4LDIzMy4yMzI3IEMgMjgwLjI2MiwyMzMuMDc3NyAyODAuMjEzLDIzMi43MTQ3IDI4MC40MTEsMjMyLjQzMjcgQyAyODAuNTAzLDIzMi4yOTQ3IDI4MC42ODYsMjMyLjEzMjcgMjgwLjcxOCwyMzIuMTE1NyBMIDI4MC42NDksMjMxLjgxODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk0NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjgwLjY0MiwyMzEuODE1NyBMIDI4MC4zNTUsMjMxLjgzNjcgQyAyODAuMzQyLDIzMS44NzE3IDI4MC4yMTMsMjMyLjA3NjcgMjgwLjA5MSwyMzIuMTg5NyBDIDI3OS44MzcsMjMyLjQzMjcgMjc5LjQ1NCwyMzIuNDYwNyAyNzkuMjM4LDIzMi4yNTY3IEMgMjc5LjEzMywyMzIuMTUwNyAyNzkuMDgxLDIzMi4wMDI3IDI3OS4xLDIzMS44NTA3IEMgMjc4LjkzMiwyMzEuOTM1NyAyNzguNzU3LDIzMS45MzU3IDI3OC41OTMsMjMxLjg0MzcgQyAyNzguMzM2LDIzMS42OTU3IDI3OC4yNzIsMjMxLjM0MjcgMjc4LjQ1OSwyMzEuMDQ5NyBDIDI3OC40ODksMjMwLjk5MzcgMjc4LjUxOSwyMzAuOTE5NyAyNzguNTY0LDIzMC44Nzc3IEwgMjc4LjU0NSwyMzAuNTU2NyBMIDI3OC4xOTgsMjMwLjYzNzcgTCAyNzguMDk4LDIzMC44Mjc3IEMgMjc3Ljg4MiwyMzEuMDcxNyAyNzcuNTYyLDIzMS4xMzQ3IDI3Ny40MDIsMjMwLjk5MDcgQyAyNzcuMzI0LDIzMC45MjM3IDI3Ny4yNjcsMjMwLjczNjcgMjc3LjI3MiwyMzAuNzI5NyBDIDI3Ny4yNzUsMjMwLjczNjcgMjc3LjE4OSwyMzAuODEzNyAyNzcuMSwyMzAuODM0NyBDIDI3Ni41NjgsMjMwLjk2NTcgMjc2LjM1NiwyMjkuNzk0NyAyNzYuMzQ0LDIyOS40OTE3IEwgMjc2LjE2OSwyMjkuNzM4NyBDIDI3Ni4xNjksMjI5LjczODcgMjc2LjMyNiwyMzAuNDM5NyAyNzYuMjQ3LDIzMS4wMzI3IEMgMjc2LjE2OSwyMzEuNjI0NyAyNzUuOTYsMjMyLjIxNzcgMjc1Ljk2LDIzMi4yMTc3IEMgMjc2LjcwMiwyMzIuNDA3NyAyNzcuODEyLDIzMy4wMTA3IDI3OC45MTMsMjMzLjg2MDcgQyAyODAuMDE2LDIzNC43MDM3IDI4MC44ODMsMjM1LjYyMDcgMjgxLjI0MSwyMzYuMjYyNyBDIDI4MS4yNDEsMjM2LjI2MjcgMjgxLjgxMSwyMzUuOTQ0NyAyODIuNDEsMjM1Ljc1NDcgQyAyODMuMDAzLDIzNS41NjA3IDI4My43NTgsMjM1LjU1NjcgMjgzLjc1OCwyMzUuNTU2NyBMIDI4My45NzMsMjM1LjM0NTcgQyAyODMuNjU3LDIzNS4zOTE3IDI4Mi40MDMsMjM1LjQ0NDcgMjgyLjQyOCwyMzQuOTE4NyBDIDI4Mi40MzMsMjM0LjgzNDcgMjgyLjQ5NiwyMzQuNzQyNyAyODIuNTA3LDIzNC43NDI3IEMgMjgyLjUsMjM0Ljc0OTcgMjgyLjI5OSwyMzQuNzMxNyAyODIuMjA5LDIzNC42NzU3IEMgMjgyLjAyNywyMzQuNTU1NyAyODIuMDMxLDIzNC4yNDg3IDI4Mi4yMzIsMjMzLjk5NDcgTCAyODIuNDA3LDIzMy44Njc3IEwgMjgyLjQxOCwyMzMuNTI5NyBMIDI4Mi4wODIsMjMzLjU3NTcgQyAyODIuMDUyLDIzMy42MTc3IDI4MS45NzUsMjMzLjY2NjcgMjgxLjkzLDIzMy43MDk3IEMgMjgxLjY2NiwyMzMuOTM4NyAyODEuMjg2LDIzMy45NTU3IDI4MS4wNzcsMjMzLjc0MDcgQyAyODAuOTUxLDIzMy42MTc3IDI4MC45MTIsMjMzLjQ1MTcgMjgwLjk2NiwyMzMuMjc4NyBDIDI4MC44MTMsMjMzLjMyNDcgMjgwLjY1MywyMzMuMzEwNyAyODAuNTE4LDIzMy4yMzI3IEMgMjgwLjI2MiwyMzMuMDc3NyAyODAuMjEzLDIzMi43MTQ3IDI4MC40MTEsMjMyLjQzMjcgQyAyODAuNTAzLDIzMi4yOTQ3IDI4MC42ODYsMjMyLjEzMjcgMjgwLjcxOCwyMzIuMTE1NyBMIDI4MC42NDksMjMxLjgxODcgTCAyODAuNjQyLDIzMS44MTU3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NDciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweCIKLSAgICAgICAgICAgZD0iTSAyNzguNDA3LDIzMi40OTk3IEMgMjc4LjQ1NiwyMzIuNDM5NyAyNzguNTYsMjMyLjQ0MjcgMjc4LjYzOCwyMzIuNTAyNyBDIDI3OC43MTYsMjMyLjU2MjcgMjc4LjczOCwyMzIuNjU4NyAyNzguNjksMjMyLjcxNDcgQyAyNzguNjQyLDIzMi43NzA3IDI3OC41NDEsMjMyLjc3MDcgMjc4LjQ1OSwyMzIuNzA3NyBDIDI3OC4zODUsMjMyLjY1MTcgMjc4LjM1OSwyMzIuNTU1NyAyNzguNDA3LDIzMi40OTk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NDkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDUwNzM0NSIKLSAgICAgICAgICAgZD0iTSAyNzguNDA3LDIzMi40OTk3IEMgMjc4LjQ1NiwyMzIuNDM5NyAyNzguNTYsMjMyLjQ0MjcgMjc4LjYzOCwyMzIuNTAyNyBDIDI3OC43MTYsMjMyLjU2MjcgMjc4LjczOCwyMzIuNjU4NyAyNzguNjksMjMyLjcxNDcgQyAyNzguNjQyLDIzMi43NzA3IDI3OC41NDEsMjMyLjc3MDcgMjc4LjQ1OSwyMzIuNzA3NyBDIDI3OC4zODUsMjMyLjY1MTcgMjc4LjM1OSwyMzIuNTU1NyAyNzguNDA3LDIzMi40OTk3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NTEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweCIKLSAgICAgICAgICAgZD0iTSAyNzkuMzQ5LDIzMy4yOTI3IEwgMjc5LjAyNSwyMzMuMDQyNyBDIDI3OC45NjYsMjMyLjk5NjcgMjc4Ljk0NywyMzIuOTIyNyAyNzguOTg1LDIzMi44ODA3IEMgMjc5LjAyMiwyMzIuODQxNyAyNzkuMSwyMzIuODQxNyAyNzkuMTYsMjMyLjg4MzcgTCAyNzkuNDgzLDIzMy4xMzc3IEwgMjc5LjgxNSwyMzMuMzg4NyBDIDI3OS44NzEsMjMzLjQzMDcgMjc5Ljg5MiwyMzMuNTA0NyAyNzkuODU2LDIzMy41NTA3IEMgMjc5LjgxNSwyMzMuNTg5NyAyNzkuNzM3LDIzMy41ODU3IDI3OS42NzcsMjMzLjU0MzcgTCAyNzkuMzQ5LDIzMy4yOTI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NTMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDUwNzM0NSIKLSAgICAgICAgICAgZD0iTSAyNzkuMzQ5LDIzMy4yOTI3IEwgMjc5LjAyNSwyMzMuMDQyNyBDIDI3OC45NjYsMjMyLjk5NjcgMjc4Ljk0NywyMzIuOTIyNyAyNzguOTg1LDIzMi44ODA3IEMgMjc5LjAyMiwyMzIuODQxNyAyNzkuMSwyMzIuODQxNyAyNzkuMTYsMjMyLjg4MzcgTCAyNzkuNDgzLDIzMy4xMzc3IEwgMjc5LjgxNSwyMzMuMzg4NyBDIDI3OS44NzEsMjMzLjQzMDcgMjc5Ljg5MiwyMzMuNTA0NyAyNzkuODU2LDIzMy41NTA3IEMgMjc5LjgxNSwyMzMuNTg5NyAyNzkuNzM3LDIzMy41ODU3IDI3OS42NzcsMjMzLjU0MzcgTCAyNzkuMzQ5LDIzMy4yOTI3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NTUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweCIKLSAgICAgICAgICAgZD0iTSAyNzcuNjE4LDIzMi4xMDc3IEwgMjc3LjM2MSwyMzEuOTU2NyBDIDI3Ny4yOTcsMjMxLjkxNzcgMjc3LjI2NCwyMzEuODQzNyAyNzcuMjk0LDIzMS43OTQ3IEMgMjc3LjMyLDIzMS43NDE3IDI3Ny4zOTgsMjMxLjczNDcgMjc3LjQ2MSwyMzEuNzcyNyBMIDI3Ny43MTcsMjMxLjkyNDcgTCAyNzcuOTc5LDIzMi4wNzY3IEMgMjc4LjA0MiwyMzIuMTExNyAyNzguMDcyLDIzMi4xODU3IDI3OC4wNDYsMjMyLjIzODcgQyAyNzguMDE2LDIzMi4yODQ3IDI3Ny45NDIsMjMyLjI5NDcgMjc3Ljg3NSwyMzIuMjU2NyBMIDI3Ny42MTgsMjMyLjEwNzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk1NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4wNTA3MzQ1IgotICAgICAgICAgICBkPSJNIDI3Ny42MTgsMjMyLjEwNzcgTCAyNzcuMzYxLDIzMS45NTY3IEMgMjc3LjI5NywyMzEuOTE3NyAyNzcuMjY0LDIzMS44NDM3IDI3Ny4yOTQsMjMxLjc5NDcgQyAyNzcuMzIsMjMxLjc0MTcgMjc3LjM5OCwyMzEuNzM0NyAyNzcuNDYxLDIzMS43NzI3IEwgMjc3LjcxNywyMzEuOTI0NyBMIDI3Ny45NzksMjMyLjA3NjcgQyAyNzguMDQyLDIzMi4xMTE3IDI3OC4wNzIsMjMyLjE4NTcgMjc4LjA0NiwyMzIuMjM4NyBDIDI3OC4wMTYsMjMyLjI4NDcgMjc3Ljk0MiwyMzIuMjk0NyAyNzcuODc1LDIzMi4yNTY3IEwgMjc3LjYxOCwyMzIuMTA3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTU5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHgiCi0gICAgICAgICAgIGQ9Ik0gMjc2LjU5MywyMzEuMzk5NyBDIDI3Ni42NDIsMjMxLjM0NjcgMjc2Ljc0NywyMzEuMzQ2NyAyNzYuODI1LDIzMS40MDY3IEMgMjc2LjkwMywyMzEuNDY2NyAyNzYuOTI1LDIzMS41NjE3IDI3Ni44NzcsMjMxLjYxNzcgQyAyNzYuODI4LDIzMS42NzQ3IDI3Ni43MjQsMjMxLjY3MDcgMjc2LjY0NiwyMzEuNjE0NyBDIDI3Ni41NjgsMjMxLjU1MDcgMjc2LjU0NSwyMzEuNDU5NyAyNzYuNTkzLDIzMS4zOTk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NjEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDUwNzM0NSIKLSAgICAgICAgICAgZD0iTSAyNzYuNTkzLDIzMS4zOTk3IEMgMjc2LjY0MiwyMzEuMzQ2NyAyNzYuNzQ3LDIzMS4zNDY3IDI3Ni44MjUsMjMxLjQwNjcgQyAyNzYuOTAzLDIzMS40NjY3IDI3Ni45MjUsMjMxLjU2MTcgMjc2Ljg3NywyMzEuNjE3NyBDIDI3Ni44MjgsMjMxLjY3NDcgMjc2LjcyNCwyMzEuNjcwNyAyNzYuNjQ2LDIzMS42MTQ3IEMgMjc2LjU2OCwyMzEuNTUwNyAyNzYuNTQ1LDIzMS40NTk3IDI3Ni41OTMsMjMxLjM5OTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk2MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4IgotICAgICAgICAgICBkPSJNIDI4MC4zOTIsMjM0LjAxOTcgQyAyODAuNDQxLDIzMy45NjI3IDI4MC40MTcsMjMzLjg3MTcgMjgwLjM0LDIzMy44MDc3IEMgMjgwLjI2MiwyMzMuNzQ3NyAyODAuMTU4LDIzMy43NDQ3IDI4MC4xMDksMjMzLjgwNDcgQyAyODAuMDYxLDIzMy44NjA3IDI4MC4wODMsMjMzLjk1NTcgMjgwLjE2MSwyMzQuMDE1NyBDIDI4MC4yMzgsMjM0LjA3NTcgMjgwLjM0MiwyMzQuMDc1NyAyODAuMzkyLDIzNC4wMTk3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NjUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDUwNzM0NSIKLSAgICAgICAgICAgZD0iTSAyODAuMzkyLDIzNC4wMTk3IEMgMjgwLjQ0MSwyMzMuOTYyNyAyODAuNDE3LDIzMy44NzE3IDI4MC4zNCwyMzMuODA3NyBDIDI4MC4yNjIsMjMzLjc0NzcgMjgwLjE1OCwyMzMuNzQ0NyAyODAuMTA5LDIzMy44MDQ3IEMgMjgwLjA2MSwyMzMuODYwNyAyODAuMDgzLDIzMy45NTU3IDI4MC4xNjEsMjM0LjAxNTcgQyAyODAuMjM4LDIzNC4wNzU3IDI4MC4zNDIsMjM0LjA3NTcgMjgwLjM5MiwyMzQuMDE5NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTY3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHgiCi0gICAgICAgICAgIGQ9Ik0gMjgwLjk2MiwyMzQuNjcxNyBMIDI4MS4xNzQsMjM0Ljg3NjcgQyAyODEuMjI2LDIzNC45MjU3IDI4MS4zMDgsMjM0Ljk0MzcgMjgxLjM1MywyMzQuOTA0NyBDIDI4MS4zOTgsMjM0Ljg2OTcgMjgxLjM5MiwyMzQuNzk4NyAyODEuMzQyLDIzNC43NDk3IEwgMjgxLjEzMywyMzQuNTQxNyBMIDI4MC45MTcsMjM0LjMyOTcgQyAyODAuODY1LDIzNC4yODA3IDI4MC43ODMsMjM0LjI2NjcgMjgwLjczOCwyMzQuMzA1NyBDIDI4MC42OSwyMzQuMzM2NyAyODAuNjk3LDIzNC40MTQ3IDI4MC43NTMsMjM0LjQ2MzcgTCAyODAuOTYyLDIzNC42NzE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NjkiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDUwNzM0NSIKLSAgICAgICAgICAgZD0iTSAyODAuOTYyLDIzNC42NzE3IEwgMjgxLjE3NCwyMzQuODc2NyBDIDI4MS4yMjYsMjM0LjkyNTcgMjgxLjMwOCwyMzQuOTQzNyAyODEuMzUzLDIzNC45MDQ3IEMgMjgxLjM5OCwyMzQuODY5NyAyODEuMzkyLDIzNC43OTg3IDI4MS4zNDIsMjM0Ljc0OTcgTCAyODEuMTMzLDIzNC41NDE3IEwgMjgwLjkxNywyMzQuMzI5NyBDIDI4MC44NjUsMjM0LjI4MDcgMjgwLjc4MywyMzQuMjY2NyAyODAuNzM4LDIzNC4zMDU3IEMgMjgwLjY5LDIzNC4zMzY3IDI4MC42OTcsMjM0LjQxNDcgMjgwLjc1MywyMzQuNDYzNyBMIDI4MC45NjIsMjM0LjY3MTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk3MSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4IgotICAgICAgICAgICBkPSJNIDI4MS45MDMsMjM1LjQ3NTcgQyAyODEuOTUyLDIzNS40MTU3IDI4MS45MywyMzUuMzI0NyAyODEuODUyLDIzNS4yNjA3IEMgMjgxLjc3NCwyMzUuMjAwNyAyODEuNjY5LDIzNS4xOTc3IDI4MS42MjEsMjM1LjI1NzcgQyAyODEuNTcyLDIzNS4zMTc3IDI4MS41OTUsMjM1LjQwODcgMjgxLjY3MywyMzUuNDcyNyBDIDI4MS43NTEsMjM1LjUyODcgMjgxLjg1NiwyMzUuNTMyNyAyODEuOTAzLDIzNS40NzU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5NzMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDUwNzM0NSIKLSAgICAgICAgICAgZD0iTSAyODEuOTAzLDIzNS40NzU3IEMgMjgxLjk1MiwyMzUuNDE1NyAyODEuOTMsMjM1LjMyNDcgMjgxLjg1MiwyMzUuMjYwNyBDIDI4MS43NzQsMjM1LjIwMDcgMjgxLjY2OSwyMzUuMTk3NyAyODEuNjIxLDIzNS4yNTc3IEMgMjgxLjU3MiwyMzUuMzE3NyAyODEuNTk1LDIzNS40MDg3IDI4MS42NzMsMjM1LjQ3MjcgQyAyODEuNzUxLDIzNS41Mjg3IDI4MS44NTYsMjM1LjUzMjcgMjgxLjkwMywyMzUuNDc1NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTc1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI3OS4xNzMsMjI5LjQ4MDcgTCAyNzguNTg2LDIyOS40OTg3IEwgMjc4LjQ3MSwyMzAuMzYyNyBMIDI3OC41MzQsMjMwLjQ5OTcgTCAyNzguNjg3LDIzMC40ODk3IEwgMjc5LjQzOSwyMjkuOTg0NyBMIDI3OS4xNzMsMjI5LjQ4MDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk3NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjc5LjE3MywyMjkuNDgwNyBMIDI3OC41ODYsMjI5LjQ5ODcgTCAyNzguNDcxLDIzMC4zNjI3IEwgMjc4LjUzNCwyMzAuNDk5NyBMIDI3OC42ODcsMjMwLjQ4OTcgTCAyNzkuNDM5LDIyOS45ODQ3IEwgMjc5LjE3MywyMjkuNDgwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTc5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI3Ny41ODEsMjI5Ljk2MDcgTCAyNzcuNTY1LDIzMC40OTk3IEwgMjc4LjQ3OCwyMzAuNjEyNyBMIDI3OC42MiwyMzAuNTUyNyBMIDI3OC42MDgsMjMwLjQwNDcgTCAyNzguMDc2LDIyOS42OTU3IEwgMjc3LjU4MSwyMjkuOTYwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTgxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyNzcuNTgxLDIyOS45NjA3IEwgMjc3LjU2NSwyMzAuNDk5NyBMIDI3OC40NzgsMjMwLjYxMjcgTCAyNzguNjIsMjMwLjU1MjcgTCAyNzguNjA4LDIzMC40MDQ3IEwgMjc4LjA3NiwyMjkuNjk1NyBMIDI3Ny41ODEsMjI5Ljk2MDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk4MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNzkuNDY4LDIzMS4wMzU3IEwgMjc4Ljk4MSwyMzEuMzA3NyBMIDI3OC40NDgsMjMwLjU5NTcgTCAyNzguNDM3LDIzMC40NTA3IEwgMjc4LjU3OSwyMzAuMzkwNyBMIDI3OS40OTUsMjMwLjQ5OTcgTCAyNzkuNDY4LDIzMS4wMzU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5ODUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI3OS40NjgsMjMxLjAzNTcgTCAyNzguOTgxLDIzMS4zMDc3IEwgMjc4LjQ0OCwyMzAuNTk1NyBMIDI3OC40MzcsMjMwLjQ1MDcgTCAyNzguNTc5LDIzMC4zOTA3IEwgMjc5LjQ5NSwyMzAuNDk5NyBMIDI3OS40NjgsMjMxLjAzNTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk4NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNzguMjg3LDIzMC4zNjk3IEMgMjc4LjM3LDIzMC4yMzg3IDI3OC41NDUsMjMwLjE5NjcgMjc4LjY3OCwyMzAuMjc3NyBDIDI3OC44MTIsMjMwLjM1MTcgMjc4Ljg1NywyMzAuNTE3NyAyNzguNzc2LDIzMC42NDQ3IEMgMjc4LjY5MywyMzAuNzc0NyAyNzguNTE5LDIzMC44MTM3IDI3OC4zODUsMjMwLjczOTcgQyAyNzguMjUxLDIzMC42NjI3IDI3OC4yMDYsMjMwLjQ5NjcgMjc4LjI4NywyMzAuMzY5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTg5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyNzguMjg3LDIzMC4zNjk3IEMgMjc4LjM3LDIzMC4yMzg3IDI3OC41NDUsMjMwLjE5NjcgMjc4LjY3OCwyMzAuMjc3NyBDIDI3OC44MTIsMjMwLjM1MTcgMjc4Ljg1NywyMzAuNTE3NyAyNzguNzc2LDIzMC42NDQ3IEMgMjc4LjY5MywyMzAuNzc0NyAyNzguNTE5LDIzMC44MTM3IDI3OC4zODUsMjMwLjczOTcgQyAyNzguMjUxLDIzMC42NjI3IDI3OC4yMDYsMjMwLjQ5NjcgMjc4LjI4NywyMzAuMzY5NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg1OTkxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI3Ni4xNTEsMjI5LjQ3NzcgQyAyNzYuMTM2LDIyOS40ODA3IDI3Ni4wMjMsMjI5LjAyMjcgMjc1Ljg5NywyMjguNzY4NyBDIDI3NS44MTIsMjI4LjU4NDcgMjc1LjUxLDIyOC4zNDU3IDI3NS41MSwyMjguMzQ1NyBDIDI3NS41NCwyMjguMjg4NyAyNzUuOTIsMjI4LjE1MTcgMjc2LjM3NCwyMjguNDM2NyBDIDI3Ni43NDIsMjI4Ljc0MDcgMjc2LjM0NCwyMjkuMjk3NyAyNzYuMzQ0LDIyOS4yOTc3IEMgMjc2LjM0NCwyMjkuMjk3NyAyNzYuMjQ3LDIyOS40MzE3IDI3Ni4xNTQsMjI5LjQ3NzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk5MyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjc2LjE1MSwyMjkuNDc3NyBDIDI3Ni4xMzYsMjI5LjQ4MDcgMjc2LjAyMywyMjkuMDIyNyAyNzUuODk3LDIyOC43Njg3IEMgMjc1LjgxMiwyMjguNTg0NyAyNzUuNTEsMjI4LjM0NTcgMjc1LjUxLDIyOC4zNDU3IEMgMjc1LjU0LDIyOC4yODg3IDI3NS45MiwyMjguMTUxNyAyNzYuMzc0LDIyOC40MzY3IEMgMjc2Ljc0MiwyMjguNzQwNyAyNzYuMzQ0LDIyOS4yOTc3IDI3Ni4zNDQsMjI5LjI5NzcgQyAyNzYuMzQ0LDIyOS4yOTc3IDI3Ni4yNDcsMjI5LjQzMTcgMjc2LjE1NCwyMjkuNDc3NyBMIDI3Ni4xNTEsMjI5LjQ3NzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk5NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNzcuMTc3LDIyOS43ODc3IEwgMjc2Ljc2MSwyMzAuMTQ3NyBMIDI3Ni4wODMsMjI5LjU1ODcgTCAyNzYuMTQyLDIyOS40NzM3IEwgMjc2LjE2NiwyMjkuMzI4NyBMIDI3Ny4wODUsMjI5LjI2MTcgTCAyNzcuMTc3LDIyOS43ODc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDU5OTciCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI3Ny4xNzcsMjI5Ljc4NzcgTCAyNzYuNzYxLDIzMC4xNDc3IEwgMjc2LjA4MywyMjkuNTU4NyBMIDI3Ni4xNDIsMjI5LjQ3MzcgTCAyNzYuMTY2LDIyOS4zMjg3IEwgMjc3LjA4NSwyMjkuMjYxNyBMIDI3Ny4xNzcsMjI5Ljc4NzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNTk5OSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyNzYuMDI4LDIyOS40MjA3IEMgMjc2LjA4LDIyOS4yNzI3IDI3Ni4yMSwyMjkuMTg0NyAyNzYuMzE0LDIyOS4yMTY3IEMgMjc2LjQxOCwyMjkuMjU0NyAyNzYuNDYsMjI5LjM5OTcgMjc2LjQxMSwyMjkuNTQ0NyBDIDI3Ni4zNTksMjI5LjY5MjcgMjc2LjIyOSwyMjkuNzc2NyAyNzYuMTI1LDIyOS43NDg3IEMgMjc2LjAxNiwyMjkuNzA5NyAyNzUuOTc2LDIyOS41NjU3IDI3Ni4wMjgsMjI5LjQyMDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjAwMSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjc2LjAyOCwyMjkuNDIwNyBDIDI3Ni4wOCwyMjkuMjcyNyAyNzYuMjEsMjI5LjE4NDcgMjc2LjMxNCwyMjkuMjE2NyBDIDI3Ni40MTgsMjI5LjI1NDcgMjc2LjQ2LDIyOS4zOTk3IDI3Ni40MTEsMjI5LjU0NDcgQyAyNzYuMzU5LDIyOS42OTI3IDI3Ni4yMjksMjI5Ljc3NjcgMjc2LjEyNSwyMjkuNzQ4NyBDIDI3Ni4wMTYsMjI5LjcwOTcgMjc1Ljk3NiwyMjkuNTY1NyAyNzYuMDI4LDIyOS40MjA3IHogIiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDYwMDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjgxLjQyMywyMzAuODg3NyBMIDI4MC44MzgsMjMwLjgyNDcgTCAyODAuNTkzLDIzMS42Njc3IEwgMjgwLjYzOCwyMzEuODExNyBMIDI4MC43OTEsMjMxLjgxNTcgTCAyODEuNjEsMjMxLjQxNjcgTCAyODEuNDIzLDIzMC44ODc3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDYwMDUiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI4MS40MjMsMjMwLjg4NzcgTCAyODAuODM4LDIzMC44MjQ3IEwgMjgwLjU5MywyMzEuNjY3NyBMIDI4MC42MzgsMjMxLjgxMTcgTCAyODAuNzkxLDIzMS44MTU3IEwgMjgxLjYxLDIzMS40MTY3IEwgMjgxLjQyMywyMzAuODg3NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDA3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI3OS43NzMsMjMxLjE0ODcgTCAyNzkuNjgxLDIzMS42ODE3IEwgMjgwLjU2NywyMzEuOTEzNyBMIDI4MC43MTYsMjMxLjg3MTcgTCAyODAuNzI3LDIzMS43Mjc3IEwgMjgwLjMwNiwyMzAuOTQ3NyBMIDI3OS43NzMsMjMxLjE0ODciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjAwOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjc5Ljc3MywyMzEuMTQ4NyBMIDI3OS42ODEsMjMxLjY4MTcgTCAyODAuNTY3LDIzMS45MTM3IEwgMjgwLjcxNiwyMzEuODcxNyBMIDI4MC43MjcsMjMxLjcyNzcgTCAyODAuMzA2LDIzMC45NDc3IEwgMjc5Ljc3MywyMzEuMTQ4NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDExIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI4MS40ODcsMjMyLjQ2MDcgTCAyODAuOTYyLDIzMi42Njg3IEwgMjgwLjU0MSwyMzEuODkyNyBMIDI4MC41NTIsMjMxLjc0NDcgTCAyODAuNzAxLDIzMS43MDU3IEwgMjgxLjU4NywyMzEuOTM4NyBMIDI4MS40ODcsMjMyLjQ2MDciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjAxMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjgxLjQ4NywyMzIuNDYwNyBMIDI4MC45NjIsMjMyLjY2ODcgTCAyODAuNTQxLDIzMS44OTI3IEwgMjgwLjU1MiwyMzEuNzQ0NyBMIDI4MC43MDEsMjMxLjcwNTcgTCAyODEuNTg3LDIzMS45Mzg3IEwgMjgxLjQ4NywyMzIuNDYwNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDE1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI4MC40MTQsMjMxLjY0OTcgQyAyODAuNTExLDIzMS41Mjk3IDI4MC42OTQsMjMxLjUxOTcgMjgwLjgxMywyMzEuNjEwNyBDIDI4MC45MzYsMjMxLjcwMjcgMjgwLjk1NCwyMzEuODcxNyAyODAuODU4LDIzMS45ODg3IEMgMjgwLjc1NywyMzIuMTA0NyAyODAuNTc4LDIzMi4xMTg3IDI4MC40NTUsMjMyLjAyNjcgQyAyODAuMzM2LDIzMS45MzU3IDI4MC4zMTMsMjMxLjc2NTcgMjgwLjQxNCwyMzEuNjQ5NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDE3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyODAuNDE0LDIzMS42NDk3IEMgMjgwLjUxMSwyMzEuNTI5NyAyODAuNjk0LDIzMS41MTk3IDI4MC44MTMsMjMxLjYxMDcgQyAyODAuOTM2LDIzMS43MDI3IDI4MC45NTQsMjMxLjg3MTcgMjgwLjg1OCwyMzEuOTg4NyBDIDI4MC43NTcsMjMyLjEwNDcgMjgwLjU3OCwyMzIuMTE4NyAyODAuNDU1LDIzMi4wMjY3IEMgMjgwLjMzNiwyMzEuOTM1NyAyODAuMzEzLDIzMS43NjU3IDI4MC40MTQsMjMxLjY0OTcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjAxOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyODMuMzg2LDIzMi43MTE3IEwgMjgzLjQ5MywyMzMuMjY0NyBMIDI4Mi42MjYsMjMzLjU1MzcgTCAyODIuNDczLDIzMy41MjI3IEwgMjgyLjQ1NSwyMzMuMzc3NyBMIDI4Mi44MTYsMjMyLjU3NjcgTCAyODMuMzg2LDIzMi43MTE3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDYwMjEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI4My4zODYsMjMyLjcxMTcgTCAyODMuNDkzLDIzMy4yNjQ3IEwgMjgyLjYyNiwyMzMuNTUzNyBMIDI4Mi40NzMsMjMzLjUyMjcgTCAyODIuNDU1LDIzMy4zNzc3IEwgMjgyLjgxNiwyMzIuNTc2NyBMIDI4My4zODYsMjMyLjcxMTciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjAyMyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyODMuMjMsMjM0LjI5NDcgTCAyODIuNjc1LDIzNC40MTc3IEwgMjgyLjM2OCwyMzMuNTkyNyBMIDI4Mi40MDMsMjMzLjQ1MTcgTCAyODIuNTU2LDIzMy40MzA3IEwgMjgzLjQwMSwyMzMuNzc2NyBMIDI4My4yMywyMzQuMjk0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDI1IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyODMuMjMsMjM0LjI5NDcgTCAyODIuNjc1LDIzNC40MTc3IEwgMjgyLjM2OCwyMzMuNTkyNyBMIDI4Mi40MDMsMjMzLjQ1MTcgTCAyODIuNTU2LDIzMy40MzA3IEwgMjgzLjQwMSwyMzMuNzc2NyBMIDI4My4yMywyMzQuMjk0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDI3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI4MS43MjUsMjMyLjc2MzcgTCAyODEuNTQ2LDIzMy4yNzU3IEwgMjgyLjM5MiwyMzMuNjE3NyBMIDI4Mi41NDcsMjMzLjU5NjcgTCAyODIuNTc3LDIzMy40NTU3IEwgMjgyLjI3NiwyMzIuNjMzNyBMIDI4MS43MjUsMjMyLjc2MzciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjAyOSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjgxLjcyNSwyMzIuNzYzNyBMIDI4MS41NDYsMjMzLjI3NTcgTCAyODIuMzkyLDIzMy42MTc3IEwgMjgyLjU0NywyMzMuNTk2NyBMIDI4Mi41NzcsMjMzLjQ1NTcgTCAyODIuMjc2LDIzMi42MzM3IEwgMjgxLjcyNSwyMzIuNzYzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDMxIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI4Mi42NiwyMzMuNzIzNyBDIDI4Mi43NzUsMjMzLjYxNzcgMjgyLjc3OSwyMzMuNDQ4NyAyODIuNjc1LDIzMy4zMzg3IEMgMjgyLjU2NywyMzMuMjMyNyAyODIuMzgzLDIzMy4yMjU3IDI4Mi4yNjksMjMzLjMyNDcgQyAyODIuMTU3LDIzMy40MzA3IDI4Mi4xNSwyMzMuNTk2NyAyODIuMjU4LDIzMy43MDk3IEMgMjgyLjM2MiwyMzMuODE4NyAyODIuNTQ1LDIzMy44MjE3IDI4Mi42NiwyMzMuNzIzNyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDMzIgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyODIuNjYsMjMzLjcyMzcgQyAyODIuNzc1LDIzMy42MTc3IDI4Mi43NzksMjMzLjQ0ODcgMjgyLjY3NSwyMzMuMzM4NyBDIDI4Mi41NjcsMjMzLjIzMjcgMjgyLjM4MywyMzMuMjI1NyAyODIuMjY5LDIzMy4zMjQ3IEMgMjgyLjE1NywyMzMuNDMwNyAyODIuMTUsMjMzLjU5NjcgMjgyLjI1OCwyMzMuNzA5NyBDIDI4Mi4zNjIsMjMzLjgxODcgMjgyLjU0NSwyMzMuODIxNyAyODIuNjYsMjMzLjcyMzcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjAzNSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6I2M4YjEwMCIKLSAgICAgICAgICAgZD0iTSAyODQuMDI2LDIzNS41MTQ3IEMgMjg0LjAyMywyMzUuNTI4NyAyODQuNTIyLDIzNS41Mzk3IDI4NC44MDksMjM1LjYwMjcgQyAyODUuMDEzLDIzNS42NDU3IDI4NS4zMywyMzUuODc0NyAyODUuMzMsMjM1Ljg3NDcgQyAyODUuMzg2LDIzNS44MzI3IDI4NS40NDIsMjM1LjQ1NDcgMjg1LjA1MSwyMzUuMDkxNyBDIDI4NC42NiwyMzQuODEyNyAyODQuMTcxLDIzNS4zMDM3IDI4NC4xNzEsMjM1LjMwMzcgQyAyODQuMTcxLDIzNS4zMDM3IDI4NC4wNTMsMjM1LjQxOTcgMjg0LjAyNiwyMzUuNTE0NyIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDM3IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI1NzI5NiIKLSAgICAgICAgICAgZD0iTSAyODQuMDI2LDIzNS41MTQ3IEMgMjg0LjAyMywyMzUuNTI4NyAyODQuNTIyLDIzNS41Mzk3IDI4NC44MDksMjM1LjYwMjcgQyAyODUuMDEzLDIzNS42NDU3IDI4NS4zMywyMzUuODc0NyAyODUuMzMsMjM1Ljg3NDcgQyAyODUuMzg2LDIzNS44MzI3IDI4NS40NDIsMjM1LjQ1NDcgMjg1LjA1MSwyMzUuMDkxNyBDIDI4NC42NiwyMzQuODEyNyAyODQuMTcxLDIzNS4zMDM3IDI4NC4xNzEsMjM1LjMwMzcgQyAyODQuMTcxLDIzNS4zMDM3IDI4NC4wNTMsMjM1LjQxOTcgMjg0LjAyNiwyMzUuNTE0NyB6ICIgLz4KLSAgICAgICAgPHBhdGgKLSAgICAgICAgICAgaWQ9InBhdGg2MDM5IgotICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDojYzhiMTAwIgotICAgICAgICAgICBkPSJNIDI4My40OSwyMzQuNjI1NyBMIDI4My4yMDQsMjM1LjA4NzcgTCAyODMuOTU2LDIzNS41OTU3IEwgMjg0LjA0OCwyMzUuNTE0NyBMIDI4NC4xNzEsMjM1LjQ3MjcgTCAyODQuMDU2LDIzNC42MDQ3IEwgMjgzLjQ5LDIzNC42MjU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDYwNDEiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjU3Mjk2IgotICAgICAgICAgICBkPSJNIDI4My40OSwyMzQuNjI1NyBMIDI4My4yMDQsMjM1LjA4NzcgTCAyODMuOTU2LDIzNS41OTU3IEwgMjg0LjA0OCwyMzUuNTE0NyBMIDI4NC4xNzEsMjM1LjQ3MjcgTCAyODQuMDU2LDIzNC42MDQ3IEwgMjgzLjQ5LDIzNC42MjU3IiAvPgotICAgICAgICA8cGF0aAotICAgICAgICAgICBpZD0icGF0aDYwNDMiCi0gICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiNjOGIxMDAiCi0gICAgICAgICAgIGQ9Ik0gMjg0LjEwOCwyMzUuNjE2NyBDIDI4NC4yNDYsMjM1LjUzOTcgMjg0LjMxMywyMzUuMzk4NyAyODQuMjU3LDIzNS4zMTA3IEMgMjg0LjE5NywyMzUuMjE4NyAyODQuMDM4LDIzNS4yMDc3IDI4My45LDIzNS4yODU3IEMgMjgzLjc2MiwyMzUuMzY2NyAyODMuNjk1LDIzNS41MDA3IDI4My43NTUsMjM1LjU5NTcgQyAyODMuODEsMjM1LjY4MzcgMjgzLjk3LDIzNS42OTQ3IDI4NC4xMDgsMjM1LjYxNjciIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjA0NSIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNTcyOTYiCi0gICAgICAgICAgIGQ9Ik0gMjg0LjEwOCwyMzUuNjE2NyBDIDI4NC4yNDYsMjM1LjUzOTcgMjg0LjMxMywyMzUuMzk4NyAyODQuMjU3LDIzNS4zMTA3IEMgMjg0LjE5NywyMzUuMjE4NyAyODQuMDM4LDIzNS4yMDc3IDI4My45LDIzNS4yODU3IEMgMjgzLjc2MiwyMzUuMzY2NyAyODMuNjk1LDIzNS41MDA3IDI4My43NTUsMjM1LjU5NTcgQyAyODMuODEsMjM1LjY4MzcgMjgzLjk3LDIzNS42OTQ3IDI4NC4xMDgsMjM1LjYxNjcgeiAiIC8+Ci0gICAgICAgIDxwYXRoCi0gICAgICAgICAgIGlkPSJwYXRoNjA0NyIKLSAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yOTcxNiIKLSAgICAgICAgICAgZD0iTSAzMjMuNTk2LDIxMi44ODQ3IEwgMzIzLjU5NiwyMTMuNDU5NyBMIDMyMS4wNzksMjEzLjQ1OTcgTCAzMjEuMDc5LDIxMi44ODQ3IEwgMzIyLjAxLDIxMi44ODQ3IEwgMzIyLjAxLDIxMS41ODY3IEwgMzIxLjM5NSwyMTEuNTg2NyBMIDMyMS4zOTUsMjExLjAwODcgTCAzMjIuMDEsMjExLjAwODcgTCAzMjIuMDEsMjEwLjQ0MDcgTCAzMjIuNjE3LDIxMC40NDA3IEwgMzIyLjYxNywyMTEuMDA4NyBMIDMyMy4yMjMsMjExLjAwODcgTCAzMjMuMjIzLDIxMS41ODY3IEwgMzIyLjYxNywyMTEuNTg2NyBMIDMyMi42MTcsMjEyLjg4NDcgTCAzMjMuNTk2LDIxMi44ODQ3IiAvPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzYwNDkiCi0gICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMTkzMDA4LDAsMCwwLjE5MzAxLDEzNi42MDY2LDE4MC45OTUzKSI+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwNTEiCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4wOTMwMTI1IgotICAgICAgICAgICAgIGQ9Ik0gMTkzLjM4NCwyMjkuNTcxIEwgMTkzLjM4NCwyMjMuMDQ5IiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MDUzIgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMTM2OTM1IgotICAgICAgICAgICAgIGQ9Ik0gMTkxLjYxMiwyMjkuNTcxIEwgMTkxLjYxMiwyMjMuMDQ5IiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MDU1IgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMTgzNDQyIgotICAgICAgICAgICAgIGQ9Ik0gMTg5Ljk0LDIyOS41NzEgTCAxODkuOTQsMjIzLjA0OSIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA1NyIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjIyOTk0OSIKLSAgICAgICAgICAgICBkPSJNIDE4OC4yODIsMjI5LjU3MSBMIDE4OC4yODIsMjIzLjA0OSIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA1OSIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjI3NjQ1NDk5IgotICAgICAgICAgICAgIGQ9Ik0gMTg2LjgwNSwyMjkuNTcxIEwgMTg2LjgwNSwyMjMuMDQ5IiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MDYxIgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzIyOTYxIgotICAgICAgICAgICAgIGQ9Ik0gMTgzLjk4NywyMjkuMjIgTCAxODMuOTQ4LDIyMy4yODMgTSAxODUuMzIzLDIyOS4yOTggTCAxODUuMzIzLDIyMy4wODgiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwNjMiCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4zNjY4ODM5OSIKLSAgICAgICAgICAgICBkPSJNIDE4MS4zODYsMjI4Ljk1MyBMIDE4MS4zODYsMjIzLjQ4MyBNIDE4Mi43MDQsMjI5LjEwOSBMIDE4Mi42NjUsMjIzLjI4OCIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA2NSIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjQxMzM5MDk5IgotICAgICAgICAgICAgIGQ9Ik0gMTc3Ljg5NywyMjguNjQgTCAxNzcuODk3LDIyMy44MzUgTSAxNzkuMDQyLDIyOC43MTggTCAxNzkuMDQyLDIyMy42NzkgTSAxODAuMjIxLDIyOC44NzUgTCAxODAuMjIxLDIyMy42MzkiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwNjciCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC40NTk4OTcwMSIKLSAgICAgICAgICAgICBkPSJNIDE3Ni42NzMsMjI4LjYwMSBMIDE3Ni42NzMsMjIzLjk1MiIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA2OSIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjUwNjQwMzAzIgotICAgICAgICAgICAgIGQ9Ik0gMTc1LjUzMywyMjguMzY3IEwgMTc1LjUzMywyMjQuMDMiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwNzEiCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41NTI5MDk5NyIKLSAgICAgICAgICAgICBkPSJNIDE3NC4zMSwyMjguMjQ5IEwgMTc0LjMxLDIyNC4yMjUiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwNzMiCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41OTY4MzI5OSIKLSAgICAgICAgICAgICBkPSJNIDE3MS44MDYsMjI3Ljg5OCBMIDE3MS43NjcsMjI0LjY5NCBNIDE3My4wODksMjI4LjA1NCBMIDE3My4wODksMjI0LjQ2IiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MDc1IgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNjMwNDIwOTgiCi0gICAgICAgICAgICAgZD0iTSAxNzAuNTIyLDIyNy42MjUgTCAxNzAuNTIyLDIyNC44MTEiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwNzciCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC42NzY5MjY5NyIKLSAgICAgICAgICAgICBkPSJNIDE2OS4zNDcsMjI3LjM5NiBMIDE2OS4zNDcsMjI1LjA1NCIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA3OSIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjcyMDg0OTk5IgotICAgICAgICAgICAgIGQ9Ik0gMTY4LjA2NCwyMjcuMDg0IEwgMTY4LjA2NCwyMjUuMjQ5IiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MDgxIgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNzY0Nzc1OTkiCi0gICAgICAgICAgICAgZD0iTSAxNjYuNzQ1LDIyNi45MjggTCAxNjYuNzQ1LDIyNS41NjEiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwODMiCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC45MDE3MDgwMSIKLSAgICAgICAgICAgICBkPSJNIDE2NS4zNDksMjI2LjYxNiBMIDE2NS4zNDksMjI1Ljk1MiIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA4NSIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjA0NjUwNjQiCi0gICAgICAgICAgICAgZD0iTSAyMDAuNDMyLDIyOS4yMiBMIDIwMC40MzIsMjIzLjI0NCBNIDE5Ny40MzEsMjI5LjQxNSBMIDE5Ny40NywyMjMuMDg4IE0gMTk1LjI0NCwyMjkuNDkzIEwgMTk1LjI0NCwyMjMuMDQ5IiAvPgotICAgICAgICA8L2c+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnNjA4NyIKLSAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4xOTMwMDgsMCwwLDAuMTkzMDEsMjg0LjkxNywxODEuMDE2NSkiPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MDg5IgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMDkzMDEyNSIKLSAgICAgICAgICAgICBkPSJNIDE5My4zODQsMjI5LjU3MSBMIDE5My4zODQsMjIzLjA0OSIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA5MSIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjEzNjkzNSIKLSAgICAgICAgICAgICBkPSJNIDE5MS42MTIsMjI5LjU3MSBMIDE5MS42MTIsMjIzLjA0OSIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA5MyIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjE4MzQ0MiIKLSAgICAgICAgICAgICBkPSJNIDE4OS45NCwyMjkuNTcxIEwgMTg5Ljk0LDIyMy4wNDkiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwOTUiCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yMjk5NDkiCi0gICAgICAgICAgICAgZD0iTSAxODguMjgyLDIyOS41NzEgTCAxODguMjgyLDIyMy4wNDkiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYwOTciCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNzY0NTQ5OSIKLSAgICAgICAgICAgICBkPSJNIDE4Ni44MDUsMjI5LjU3MSBMIDE4Ni44MDUsMjIzLjA0OSIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjA5OSIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjMyMjk2MSIKLSAgICAgICAgICAgICBkPSJNIDE4My45ODcsMjI5LjIyIEwgMTgzLjk0OCwyMjMuMjgzIE0gMTg1LjMyMywyMjkuMjk4IEwgMTg1LjMyMywyMjMuMDg4IiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MTAxIgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMzY2ODgzOTkiCi0gICAgICAgICAgICAgZD0iTSAxODEuMzg2LDIyOC45NTMgTCAxODEuMzg2LDIyMy40ODMgTSAxODIuNzA0LDIyOS4xMDkgTCAxODIuNjY1LDIyMy4yODgiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYxMDMiCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC40MTMzOTA5OSIKLSAgICAgICAgICAgICBkPSJNIDE3Ny44OTcsMjI4LjY0IEwgMTc3Ljg5NywyMjMuODM1IE0gMTc5LjA0MiwyMjguNzE4IEwgMTc5LjA0MiwyMjMuNjc5IE0gMTgwLjIyMSwyMjguODc1IEwgMTgwLjIyMSwyMjMuNjM5IiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MTA1IgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNDU5ODk3MDEiCi0gICAgICAgICAgICAgZD0iTSAxNzYuNjczLDIyOC42MDEgTCAxNzYuNjczLDIyMy45NTIiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYxMDciCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41MDY0MDMwMyIKLSAgICAgICAgICAgICBkPSJNIDE3NS41MzMsMjI4LjM2NyBMIDE3NS41MzMsMjI0LjAzIiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MTA5IgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNTUyOTA5OTciCi0gICAgICAgICAgICAgZD0iTSAxNzQuMzEsMjI4LjI0OSBMIDE3NC4zMSwyMjQuMjI1IiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MTExIgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNTk2ODMyOTkiCi0gICAgICAgICAgICAgZD0iTSAxNzEuODA2LDIyNy44OTggTCAxNzEuNzY3LDIyNC42OTQgTSAxNzMuMDg5LDIyOC4wNTQgTCAxNzMuMDg5LDIyNC40NiIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjExMyIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjYzMDQyMDk4IgotICAgICAgICAgICAgIGQ9Ik0gMTcwLjUyMiwyMjcuNjI1IEwgMTcwLjUyMiwyMjQuODExIiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MTE1IgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNjc2OTI2OTciCi0gICAgICAgICAgICAgZD0iTSAxNjkuMzQ3LDIyNy4zOTYgTCAxNjkuMzQ3LDIyNS4wNTQiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYxMTciCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC43MjA4NDk5OSIKLSAgICAgICAgICAgICBkPSJNIDE2OC4wNjQsMjI3LjA4NCBMIDE2OC4wNjQsMjI1LjI0OSIgLz4KLSAgICAgICAgICA8cGF0aAotICAgICAgICAgICAgIGlkPSJwYXRoNjExOSIKLSAgICAgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjc2NDc3NTk5IgotICAgICAgICAgICAgIGQ9Ik0gMTY2Ljc0NSwyMjYuOTI4IEwgMTY2Ljc0NSwyMjUuNTYxIiAvPgotICAgICAgICAgIDxwYXRoCi0gICAgICAgICAgICAgaWQ9InBhdGg2MTIxIgotICAgICAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTAxNzA4MDEiCi0gICAgICAgICAgICAgZD0iTSAxNjUuMzQ5LDIyNi42MTYgTCAxNjUuMzQ5LDIyNS45NTIiIC8+Ci0gICAgICAgICAgPHBhdGgKLSAgICAgICAgICAgICBpZD0icGF0aDYxMjMiCi0gICAgICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4wNDY1MDY0IgotICAgICAgICAgICAgIGQ9Ik0gMjAwLjQzMiwyMjkuMjIgTCAyMDAuNDMyLDIyMy4yNDQgTSAxOTcuNDMxLDIyOS40MTUgTCAxOTcuNDcsMjIzLjA4OCBNIDE5NS4yNDQsMjI5LjQ5MyBMIDE5NS4yNDQsMjIzLjA0OSIgLz4KLSAgICAgICAgPC9nPgotICAgICAgPC9nPgotICAgICAgPGcKLSAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA2ODk2LDAsMCwxLjAwNjg5NiwxMDY5LjM5OSwxNTMuODU3OCkiCi0gICAgICAgICBpZD0iZzI0MzgiPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI0NDAiIC8+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjQ0MiIgLz4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNDQ0IiAvPgotICAgICAgPC9nPgotICAgICAgPGcKLSAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA2ODk2LDAsMCwxLjAwNjg5NiwxMDY5LjM5OSwxNTMuODU3OCkiCi0gICAgICAgICBpZD0iZzI0NDYiIC8+Ci0gICAgICA8ZwotICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY4OTYsMCwwLDEuMDA2ODk2LDEwNjkuMzk5LDE1My44NTc4KSIKLSAgICAgICAgIGlkPSJnMjQ0OCIgLz4KLSAgICAgIDxnCi0gICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwNjg5NiwwLDAsMS4wMDY4OTYsMTA2OS4zOTksMTUzLjg1NzgpIgotICAgICAgICAgaWQ9ImcyNDUwIj4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNDUyIiAvPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI0NTQiIC8+Ci0gICAgICA8L2c+Ci0gICAgICA8ZwotICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY4OTYsMCwwLDEuMDA2ODk2LDEwNjkuMzk5LDE1My44NTc4KSIKLSAgICAgICAgIGlkPSJnMjQ1NiI+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjQ1OCIgLz4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNDYwIiAvPgotICAgICAgPC9nPgotICAgICAgPGcKLSAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA2ODk2LDAsMCwxLjAwNjg5NiwxMDY5LjM5OSwxNTMuODU3OCkiCi0gICAgICAgICBpZD0iZzI0NjIiIC8+Ci0gICAgICA8ZwotICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY4OTYsMCwwLDEuMDA2ODk2LDEwNjkuMzk5LDE1My44NTc4KSIKLSAgICAgICAgIGlkPSJnMjQ2NCI+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjQ2NiIgLz4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNDY4IiAvPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI0NzAiIC8+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjQ3MiIgLz4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNDc0Ij4KLSAgICAgICAgICA8ZwotICAgICAgICAgICAgIGlkPSJnMjQ3NiIgLz4KLSAgICAgICAgPC9nPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI0NzgiIC8+Ci0gICAgICA8L2c+Ci0gICAgICA8ZwotICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY4OTYsMCwwLDEuMDA2ODk2LDEwNjkuMzk5LDE1My44NTc4KSIKLSAgICAgICAgIGlkPSJnMjQ4MCI+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjQ4MiIgLz4KLSAgICAgIDwvZz4KLSAgICAgIDxnCi0gICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwNjg5NiwwLDAsMS4wMDY4OTYsMTA2OS4zOTksMTUzLjg1NzgpIgotICAgICAgICAgaWQ9ImcyNDg0Ij4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNDg2IiAvPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI0ODgiIC8+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjQ5MCIgLz4KLSAgICAgIDwvZz4KLSAgICAgIDxnCi0gICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwNjg5NiwwLDAsMS4wMDY4OTYsMTA2OS4zOTksMTUzLjg1NzgpIgotICAgICAgICAgaWQ9ImcyNDkyIj4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNDk0IiAvPgotICAgICAgPC9nPgotICAgICAgPGcKLSAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA2ODk2LDAsMCwxLjAwNjg5NiwxMDY5LjM5OSwxNTMuODU3OCkiCi0gICAgICAgICBpZD0iZzI2MTciPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI2MTkiIC8+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjYyMSIgLz4KLSAgICAgIDwvZz4KLSAgICAgIDxnCi0gICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwNjg5NiwwLDAsMS4wMDY4OTYsMTA2OS4zOTksMTUzLjg1NzgpIgotICAgICAgICAgaWQ9ImcyNjIzIj4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNjI1Ij4KLSAgICAgICAgICA8ZwotICAgICAgICAgICAgIGlkPSJnMjYyNyIgLz4KLSAgICAgICAgICA8ZwotICAgICAgICAgICAgIGlkPSJnMjYyOSIgLz4KLSAgICAgICAgICA8ZwotICAgICAgICAgICAgIGlkPSJnMjYzMSIgLz4KLSAgICAgICAgPC9nPgotICAgICAgPC9nPgotICAgICAgPGcKLSAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA2ODk2LDAsMCwxLjAwNjg5NiwxMDY5LjM5OSwxNTMuODU3OCkiCi0gICAgICAgICBpZD0iZzI2MzMiPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI2MzUiIC8+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjYzNyIgLz4KLSAgICAgIDwvZz4KLSAgICAgIDxnCi0gICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwNjg5NiwwLDAsMS4wMDY4OTYsMTA2OS4zOTksMTUzLjg1NzgpIgotICAgICAgICAgaWQ9ImcyNjM5Ij4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNjQxIiAvPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI2NDMiIC8+Ci0gICAgICA8L2c+Ci0gICAgICA8ZwotICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY4OTYsMCwwLDEuMDA2ODk2LDEwNjkuMzk5LDE1My44NTc4KSIKLSAgICAgICAgIGlkPSJnMjY0NSI+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjY0NyIgLz4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNjQ5IiAvPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI2NTEiIC8+Ci0gICAgICAgIDxnCi0gICAgICAgICAgIGlkPSJnMjY1MyIgLz4KLSAgICAgICAgPGcKLSAgICAgICAgICAgaWQ9ImcyNjU1Ij4KLSAgICAgICAgICA8ZwotICAgICAgICAgICAgIGlkPSJnMjY1NyIgLz4KLSAgICAgICAgPC9nPgotICAgICAgICA8ZwotICAgICAgICAgICBpZD0iZzI2NTkiIC8+Ci0gICAgICA8L2c+Ci0gICAgPC9nPgotICA8L2c+Ci08L3N2Zz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9mci5zdmcgYi90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3Jlc291cmNlcy9pbWFnZXMvZnIuc3ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA1NWQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9mci5zdmcKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTxzdmcKLSAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gICB2ZXJzaW9uPSIxLjAiCi0gICB3aWR0aD0iOTAwIgotICAgaGVpZ2h0PSI2MDAiCi0gICBpZD0iRmxhZyBvZiBGcmFuY2UiPgotICA8cmVjdAotICAgICB3aWR0aD0iOTAwIgotICAgICBoZWlnaHQ9IjYwMCIKLSAgICAgeD0iMCIKLSAgICAgeT0iMCIKLSAgICAgc3R5bGU9ImZpbGw6IzBjMWM4YztmaWxsLW9wYWNpdHk6MSIKLSAgICAgaWQ9ImJsdWUgc3RyaXBlIiAvPgotICA8cmVjdAotICAgICB3aWR0aD0iNjAwIgotICAgICBoZWlnaHQ9IjYwMCIKLSAgICAgeD0iMzAwIgotICAgICB5PSIwIgotICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgotICAgICBpZD0id2hpdGUgc3RyaXBlIiAvPgotICA8cmVjdAotICAgICB3aWR0aD0iMzAwIgotICAgICBoZWlnaHQ9IjYwMCIKLSAgICAgeD0iNjAwIgotICAgICB5PSIwIgotICAgICBzdHlsZT0iZmlsbDojZWYyYjJkO2ZpbGwtb3BhY2l0eToxIgotICAgICBpZD0icmVkIHN0cmlwZSIgLz4KLTwvc3ZnPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaW1hZ2VzL2hlLnN2ZyBiL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IvcmVzb3VyY2VzL2ltYWdlcy9oZS5zdmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjlhYjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci9yZXNvdXJjZXMvaW1hZ2VzL2hlLnN2ZworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPCEtLSBmbGFnIG9mIGlzcmFlbCB1c2luZyBkaW1lbnNpb25zIGZyb20gaHR0cDovL3d3dy52ZXhpbGxhLW11bmRpLmNvbS9pc3JhZWwuaHRtIC0tPgotPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgotICAgICB2ZXJzaW9uPSIxLjAiIHdpZHRoPSI0NDAiIGhlaWdodD0iMzIwIj4KLSA8cmVjdCB3aWR0aD0iNDQwIiBoZWlnaHQ9IjMyMCIgc3R5bGU9ImZpbGw6I2ZmZmZmZiIgaWQ9ImJhY2tncm91bmQiLz4KLSA8cmVjdCB3aWR0aD0iNDQwIiBoZWlnaHQ9IjUwIiB5PSIzMCIgIHN0eWxlPSJmaWxsOiMwNDcxQ0IiLz4KLSA8cmVjdCB3aWR0aD0iNDQwIiBoZWlnaHQ9IjUwIiB5PSIyNDAiIHN0eWxlPSJmaWxsOiMwNDcxQ0IiLz4KLQotIDxnIGlkPSJzdGFyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMjAsIDE2MCkiPgotICAgPCEtLSBoaWVnaHQgb2YgdGhlIHRyaWFuZ2xlOiAoMTM4LSgxMSoyKSkvMiAqIDMvMiA9IDg3Ci0gICAgICAgIHdpZHRoICBvZiB0aGUgdHJpYW5nbGU6IHNxcnQoODcqODcqNC8zKSA9IDEwMC40NTg5NDY4Mzg5OTQ4OCAtLT4KLSAgIDxwb2x5Z29uIGlkPSJ0cmlhbmdsZSIgcG9pbnRzPSIwLC01OCAtNTAuMjI5NDczNDE5NDk3NDM4LDI5IDUwLjIyOTQ3MzQxOTQ5NzQzOCwyOSIKLSAgICAgICAgICAgIHN0eWxlPSJzdHJva2U6IzA0NzFDQjsgc3Ryb2tlLXdpZHRoOjExOyBmaWxsLW9wYWNpdHk6MCIvPgotICAgPHVzZSB0cmFuc2Zvcm09InJvdGF0ZSgxODApIiB4bGluazpocmVmPSIjdHJpYW5nbGUiLz4KLSA8L2c+Ci08L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3Ivc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjkyZTg3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3Ivc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOmNvbXBvbmVudHM+Ci0KLSAgICA8bWFwOnNlcmlhbGl6ZXJzPgotICAgICAgPG1hcDpzZXJpYWxpemVyIG5hbWU9InN2ZzJwbmciCi0gICAgICAgIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uc2VyaWFsaXphdGlvbi5TVkdTZXJpYWxpemVyIgotICAgICAgICBtaW1lLXR5cGU9ImltYWdlL3BuZyIKLSAgICAgICAgbG9nZ2VyPSJzaXRlbWFwLnNlcmlhbGl6ZXIuc3ZnMnBuZyIKLSAgICAgIC8+Ci0gICAgPC9tYXA6c2VyaWFsaXplcnM+Ci0KLSAgPC9tYXA6Y29tcG9uZW50cz4KLQotCi0gIDxtYXA6cGlwZWxpbmVzPgotICAKLSAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgCi0gICAgPCEtLSB7MX0gZGV0ZXJtaW5lcyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBsYW5ndWFnZSBsaXN0LiBpdCBjYW4gYmUgZWl0aGVyIG9mCi0gICAgICAgICAgICJhYmJyIjogc2hvdyAyLWxldHRlciBJU08gbGFuZ3VhZ2UgY29kZXMgW2RlZmF1bHRdCi0gICAgICAgICAgICJsb25nIjogc2hvdyBmdWxsIGxhbmd1YWdlIG5hbWVzIChtdXN0IGJlIHByb3ZpZGVkIGJ5IGkxOG4gY2F0YWxvZ3VlKQotICAgICAgICAgICAibm9uZSI6IGRvIG5vdCBzaG93IGFueXRoaW5nIChvbmx5IG1ha2VzIHNlbnNlIHdpdGggezJ9LCBzZWUgYmVsb3cpCi0gICAgICAgICB7Mn0gY29udHJvbHMgdGhlIHByZXNlbnRhdGlvbiBvZiBsYW5ndWFnZSBmbGFnIHN5bWJvbHMuIGl0IGNhbiBiZSBlaXRoZXIgb2YKLSAgICAgICAgICAgIm5vbmUiOiBkbyBub3Qgc2hvdyBmbGFnIHN5bWJvbHMgW2RlZmF1bHRdCi0gICAgICAgICAgIDxuPjogc2hvdyBmbGFncyB3aXRoIGhlaWdodCBvZiBuIHBpeGVscy4KLSAgICAtLT4KLSAgICA8bWFwOm1hdGNoIHBhdHRlcm49InRleHQtKi9mbGFnc2l6ZS0qIj4KLSAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci94c2x0L2xhbmd1YWdlc2VsZWN0b3IueHNsIj4KLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY3VycmVudExhbmd1YWdlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9Ii8+Ci0gICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InB1YmxpY2F0aW9uLWxhbmd1YWdlcy1jc3YiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1sYW5ndWFnZXMtY3N2fSIvPgotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudC1sYW5ndWFnZXMtY3N2IiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2VzLWNzdn0iLz4KLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdmFsdWU9InsxfSIvPgotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJmbGFnc2l6ZSIgdmFsdWU9InsyfSIvPgotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB2YWx1ZT0iIi8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4KLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0ie3JlcXVlc3Q6bG9jYWxlfSIvPgotICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgPC9tYXA6bWF0Y2g+Ci0gICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImV4cGlyZXMiIHZhbHVlPSJhY2Nlc3MgcGx1cyAyIGhvdXJzIi8+Ci0gICAgICAKLSAgICA8IS0tIGZsYWctPGxhbmd1YWdlLWNvZGU+LTxoZWlnaHQgaW4gcGl4ZWxzPi5wbmcgLS0+Ci0gICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJmbGFnLSotKi5wbmciPgotICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIj4KLSAgICAgICAgPG1hcDp3aGVuIHRlc3Q9InJlc291cmNlcy9pbWFnZXMvezF9LnN2ZyI+Ci0gICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3Jlc291cmNlcy9pbWFnZXMvezF9LnN2ZyIvPgotICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3Jlc291cmNlcy9pbWFnZXMvZGVmYXVsdC5zdmciLz4KLSAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPgotICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJ4c2x0L3Jlc2l6ZXN2Zy54c2wiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImhlaWdodCIgdmFsdWU9InsyfSIvPgotICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJ4c2x0L3N0eWxlc3ZnLnhzbCIvPgotICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ic3ZnMnBuZyIvPgotICAgIDwvbWFwOm1hdGNoPgotCi0gICAgPCEtLSBjdXJyZW50bHkgb25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIC0tPgotICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0icmVzb3VyY2VzL2ltYWdlcy8qLnN2ZyI+Ci0gICAgICA8bWFwOnJlYWQgc3JjPSJyZXNvdXJjZXMvaW1hZ2VzL3sxfS5zdmciLz4KLSAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gIDwvbWFwOnBpcGVsaW5lcz4KLQotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IveHNsdC9sYW5ndWFnZXNlbGVjdG9yLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2xhbmd1YWdlc2VsZWN0b3IveHNsdC9sYW5ndWFnZXNlbGVjdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0YTRkZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3hzbHQvbGFuZ3VhZ2VzZWxlY3Rvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGh0bWwiCi0gID4KLQotICA8eHNsOnBhcmFtIG5hbWU9ImN1cnJlbnRMYW5ndWFnZSIvPgotICA8eHNsOnBhcmFtIG5hbWU9InB1YmxpY2F0aW9uLWxhbmd1YWdlcy1jc3YiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJkb2N1bWVudC1sYW5ndWFnZXMtY3N2Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0idGV4dCIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImZsYWdzaXplIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29udGV4dCIvPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDxkaXYgaWQ9Imxhbmd1YWdlc2VsZWN0b3IiPgotICAgICAgPHVsPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZW51bUxhbmdzIj4KLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGlzdCIgc2VsZWN0PSIkcHVibGljYXRpb24tbGFuZ3VhZ2VzLWNzdiIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPC91bD4KLSAgICA8L2Rpdj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSBwYXJzZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxhbmd1YWdlcyBhbmQgY2FsbCBoYW5kbGVMYW5ndWFnZSBmb3IgZWFjaCBsYW5ndWFnZSBmb3VuZC4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iZW51bUxhbmdzIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imxpc3QiLz4KLQotICAgIDwhLS0gZ2V0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0OiAtLT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWQiPgotICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDwhLS0gYWxsIGJ1dCBsYXN0IGl0ZW06IC0tPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3Vic3RyaW5nLWJlZm9yZSgkbGlzdCwgJywnKSI+Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGxpc3QsICcsJykiLz4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPCEtLSBsYXN0IGl0ZW06IC0tPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGxpc3QiPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdCIvPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZS8+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICA8IS0tIGdldCB0aGUgcmVzdCBvZiB0aGUgbGlzdDogLS0+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWlsIj4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJGxpc3QsICcsJykiLz4KLSAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgIDwhLS0gaGFuZGxlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0OiAtLT4KLSAgICA8eHNsOmlmIHRlc3Q9IiRoZWFkIj4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJoYW5kbGVMYW5ndWFnZSI+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJsYW5nIiBzZWxlY3Q9IiRoZWFkIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmlmPgotCi0gICAgPCEtLSBpZiB0aGVyZSBhcmUgbW9yZSBpdGVtcyBpbiB0aGUgbGlzdCwgaGFuZGxlIHRoZW0gcmVjdXJzaXZlbHk6IC0tPgotICAgIDx4c2w6aWYgdGVzdD0iJHRhaWwiPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImVudW1MYW5ncyI+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJsaXN0IiBzZWxlY3Q9IiR0YWlsIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmlmPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImhhbmRsZUxhbmd1YWdlIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImxhbmciLz4KLSAgICA8bGk+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgCi0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbGFuZyA9ICRjdXJyZW50TGFuZ3VhZ2UiPgotICAgICAgICAgIDxhIGNsYXNzPSJsZW55YS1sYW5ndWFnZS1pc0N1cnJlbnQiIAotICAgICAgICAgICAgIGkxOG46YXR0cj0idGl0bGUiCi0gICAgICAgICAgICAgdGl0bGU9InskbGFuZ30taXNDdXJyZW50IgotICAgICAgICAgID4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXh0Ij4KLSAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImxhbmciIHNlbGVjdD0iJGxhbmciLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZmxhZyI+Ci0gICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJsYW5nIiBzZWxlY3Q9IiRsYW5nIi8+Ci0gICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmbGFnc2l6ZSIgc2VsZWN0PSIkZmxhZ3NpemUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgPC9hPgotICAgICAgICA8L3hzbDp3aGVuPgotICAKLSAgICAgICAgPCEtLSB0aGlzIHRlc3QgaXMgYSBsaXR0bGUgc2xvcHB5IGFuZCBjYW4gbGVhZCB0byBzcHVyaW91cyBzdWJzdHJpbmcgbWF0Y2hlcyBpZiAKLSAgICAgICAgICAgICBib3RoIHR3byBhbmQgdGhyZWUgbGV0dGVyIGxhbmd1YWdlIGNvZGVzIChJU08gNjM5LTIpIGFyZSBiZWluZyB1c2VkLiAtLT4KLSAgICAKLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCRkb2N1bWVudC1sYW5ndWFnZXMtY3N2LCAkbGFuZykiPgotICAgICAgICAgIDwhLS0gYXJlbid0IHRoZXNlIG5ldyBsZW55YS1kb2N1bWVudCBsaW5rcyBsb3ZlbHk/IHJlbGF0aXZlIGxpbmtzIHRvIGxhbmd1YWdlcyEgLS0+Ci0gICAgICAgICAgPGEgY2xhc3M9ImxlbnlhLWxhbmd1YWdlLWlzQXZhaWxhYmxlIiAKLSAgICAgICAgICAgICBpMThuOmF0dHI9InRpdGxlIgotICAgICAgICAgICAgIHRpdGxlPSJ7JGxhbmd9LWlzQXZhaWxhYmxlIgotICAgICAgICAgICAgIGhyZWY9ImxlbnlhLWRvY3VtZW50OixsYW5nPXskbGFuZ30iCi0gICAgICAgICAgPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRleHQiPgotICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGFuZyIgc2VsZWN0PSIkbGFuZyIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmbGFnIj4KLSAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImxhbmciIHNlbGVjdD0iJGxhbmciLz4KLSAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZsYWdzaXplIiBzZWxlY3Q9IiRmbGFnc2l6ZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICA8L2E+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gIAotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8YSBjbGFzcz0ibGVueWEtbGFuZ3VhZ2UtaXNVbmF2YWlsYWJsZSIKLSAgICAgICAgICAgICBpMThuOmF0dHI9InRpdGxlIgotICAgICAgICAgICAgIHRpdGxlPSJ7JGxhbmd9LWlzVW5hdmFpbGFibGUiCi0gICAgICAgICAgPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRleHQiPgotICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGFuZyIgc2VsZWN0PSIkbGFuZyIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmbGFnIj4KLSAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImxhbmciIHNlbGVjdD0iJGxhbmciLz4KLSAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZsYWdzaXplIiBzZWxlY3Q9IiRmbGFnc2l6ZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICA8L2E+Ci0gICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgCi0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC9saT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXh0Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImxhbmciLz4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdGV4dCA9ICdhYmJyJyI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGFuZyIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdGV4dCA9ICdsb25nJyI+Ci0gICAgICAgIDxpMThuOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsYW5nIi8+PC9pMThuOnRleHQ+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmbGFnIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImxhbmciLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImZsYWdzaXplIi8+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJGZsYWdzaXplID0gJ25vbmUnIi8+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0ibnVtYmVyKCRmbGFnc2l6ZSkgJmd0OyAwIj4KLSAgICAgICAgPGltZyBzcmM9InskY29udGV4dH0vbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL2ZsYWcteyRsYW5nfS17JGZsYWdzaXplfS5wbmciIGFsdD0ieyRsYW5nfSIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci94c2x0L3Jlc2l6ZXN2Zy54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3hzbHQvcmVzaXplc3ZnLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5ZjIyNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3hzbHQvcmVzaXplc3ZnLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJzdmciCi0+Ci0KLSAgPHhzbDpwYXJhbSBuYW1lPSJoZWlnaHQiLz4KLQotICA8IS0tIHByZXZlbnQgdXNlcnMgZnJvbSBjYXVzaW5nIG1lbW9yeSBvdmVyZmxvd3M6IC0tPgotICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1heEhlaWdodCIgc2VsZWN0PSIxMDI0Ii8+Ci0gIAotICA8IS0tIHRoZSB3aWR0aDpoZWlnaHQtcmF0aW8gLS0+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0icmF0aW8iIHNlbGVjdD0iMS41Ii8+Ci0gIAotICA8IS0tIAotICAgICBzY2FsZXMgYW4gc3ZnIHRvIGhlaWdodCAkaGVpZ2h0LgotICAgICB0aGlzIGlzIGRvbmUgYnkgc3Vycm91bmRpbmcgdGhlIGltYWdlIHdpdGggYSBuZXcgPHN2Zy8+IGVsZW1lbnQgd2l0aCB0aGUgZGVzaXJlZCBoZWlnaHQgYW5kIAotICAgICBwcm9wb3J0aW9uYWwgd2lkdGgsIGFuZCBhIHZpZXdCb3ggd2hvc2UgZGltZW5zaW9ucyBhcmUgdGFrZW4gZnJvbSB0aGUgb3JpZ2luYWwgaW1hZ2UuCi0gIC0tPiAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9zdmc6c3ZnIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJudW1iZXIoJGhlaWdodCkgJmd0OyAwIGFuZCBudW1iZXIoJGhlaWdodCkgJmx0Oz0gJG1heEhlaWdodCI+Ci0gICAgICAgIDxzdmc6c3ZnIHZpZXdCb3g9IjAgMCB7QHdpZHRofSB7QGhlaWdodH0iIHdpZHRoPSJ7JGhlaWdodCAqICRyYXRpb30iIGhlaWdodD0ieyRoZWlnaHR9IgotICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPgotICAgICAgICAgIDx4c2w6Y29weT4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgICAgICAgPC94c2w6Y29weT4gCi0gICAgICAgIDwvc3ZnOnN2Zz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDptZXNzYWdlIHRlcm1pbmF0ZT0ieWVzIj4KLSAgICAgICAgICBXb3cuIFlvdSByZXF1ZXN0ZWQgYW4gaW1hZ2UgaGVpZ2h0IG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVpZ2h0Ii8+LiBObyB3YXkgSm9zw6kuIEdvIERvUyBzb21lb25lIGVsc2UuCi0gICAgICAgIDwveHNsOm1lc3NhZ2U+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiIG5hbWU9ImlkZW50aXR5Ij4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDwhLS0gYmF0aWsgc2VlbXMgdG8gY2hva2Ugb24gY29tbWVudCBlbGVtZW50cy4gd29ya2Fyb3VuZDogLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InN2Zzpjb21tZW50Ii8+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3hzbHQvc3R5bGVzdmcueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvbGFuZ3VhZ2VzZWxlY3Rvci94c2x0L3N0eWxlc3ZnLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzZDliOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3hzbHQvc3R5bGVzdmcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKLSAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InN2ZyIKLT4KLQotICA8IS0tIAotICAgICBBZGRzIGEgYm9yZGVyIGFuZCBhIGdyYWRpZW50IHRvIHRoZSBpbWFnZS4KLSAgLS0+ICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL3N2ZzpzdmciPgotICAgIAotICAgIDwhLS0gdHJhbnNsYXRpbmcgdG8gcGl4ZWxzIC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id2lkdGgiIHNlbGVjdD0iY2VpbGluZyhAd2lkdGgpIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWlnaHQiIHNlbGVjdD0iY2VpbGluZyhAaGVpZ2h0KSIvPgotICAgIAotICAgIDxzdmc6c3ZnIHdpZHRoPSJ7JHdpZHRoICsgMn0iIGhlaWdodD0ieyRoZWlnaHQgKyAyfSI+Ci0gICAgICA8ZGVmcz4KLSAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaWdodCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgotICAgICAgICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiAjRkZGRkZGOyBzdG9wLW9wYWNpdHk6IDEiLz4KLSAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjQwJSIgc3R5bGU9InN0b3AtY29sb3I6ICNGRkZGRkY7IHN0b3Atb3BhY2l0eTogMCIvPgotICAgICAgICAgIDxzdG9wIG9mZnNldD0iNjAlIiBzdHlsZT0ic3RvcC1jb2xvcjogIzAwMDAwMDsgc3RvcC1vcGFjaXR5OiAwIi8+Ci0gICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdHlsZT0ic3RvcC1jb2xvcjogIzAwMDAwMDsgc3RvcC1vcGFjaXR5OiAxIi8+Ci0gICAgICAgIDwvbGluZWFyR3JhZGllbnQ+Ci0gICAgICA8L2RlZnM+Ci0gICAgICAKLSAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSJ7JHdpZHRoICsgMn0iIGhlaWdodD0ieyRoZWlnaHQgKyAyfSIgc3R5bGU9ImZpbGw6ICMwMDAwMDA7Ii8+Ci0gICAgICAKLSAgICAgIDxzdmc6c3ZnIHg9IjEiIHk9IjEiIHdpZHRoPSJ7JHdpZHRofSIgaGVpZ2h0PSJ7JGhlaWdodH0iCi0gICAgICAgIHZpZXdCb3g9IntAdmlld0JveH0iIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im5vZGUoKSIvPgotICAgICAgPC9zdmc6c3ZnPgotICAgICAgPHJlY3QgeD0iMSIgeT0iMSIgd2lkdGg9Inskd2lkdGh9IiBoZWlnaHQ9InskaGVpZ2h0fSIgc3R5bGU9ImZpbGw6IHVybCgjbGlnaHQpOyBvcGFjaXR5OiAwLjUiLz4KLSAgICA8L3N2Zzpzdmc+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSIgbmFtZT0iaWRlbnRpdHkiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSBiYXRpayBzZWVtcyB0byBjaG9rZSBvbiBjb21tZW50IGVsZW1lbnRzLiB3b3JrYXJvdW5kOiAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic3ZnOmNvbW1lbnQiLz4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xlbnlhZG9jL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlZmFjdG9yeS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2xlbnlhZG9jL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlZmFjdG9yeS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzNzdjZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sZW55YWRvYy9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZWZhY3RvcnkueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6JCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3NvdXJjZS1mYWN0b3JpZXMiIHVubGVzcz0iL2NvY29vbi9zb3VyY2UtZmFjdG9yaWVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdsZW55YWRvYyddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIGxvZ2dlcj0iIiBuYW1lPSJsZW55YWRvYyIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5MZW55YURvY1NvdXJjZUZhY3RvcnkiLz4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGVueWFkb2MvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9sZW55YWRvYy9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkYzAyNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sZW55YWRvYy9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxsZW55YTptb2R1bGUgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8bGVueWE6aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmxlbnlhZG9jPC9sZW55YTppZD4KLSAgPGxlbnlhOnBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9sZW55YTpwYWNrYWdlPgotICA8bGVueWE6dmVyc2lvbj4wLjEtZGV2PC9sZW55YTp2ZXJzaW9uPgotICA8bGVueWE6bmFtZT5sZW55YWRvYzwvbGVueWE6bmFtZT4KLSAgPGxlbnlhOmxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YTpsZW55YS12ZXJzaW9uPgotICA8bGVueWE6ZGVzY3JpcHRpb24+bGVueWFkb2M6Ly8gcHJvdG9jb2w8L2xlbnlhOmRlc2NyaXB0aW9uPgotPC9sZW55YTptb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sZW55YWRvYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL0xlbnlhRG9jU291cmNlRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbGVueWFkb2MvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL3NvdXJjZS9MZW55YURvY1NvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMjJlMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sZW55YWRvYy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vc291cmNlL0xlbnlhRG9jU291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3IgdGhlICJsZW55YWRvYyIgc2NoZW1lICh2aXJ0dWFsIHByb3RvY29sKSwgd2hpY2ggaXMgdXNlZCB0byByZXNvbHZlIGFueQotICogc3JjPSJsZW55YWRvYzo8Li4uPiIgYXR0cmlidXRlcyBpbiBzaXRlbWFwcy4KLSAqIAotICogPGNvZGU+bGVueWFkb2M6Ly88cHVibGljYXRpb24+LzxhcmVhPi88bGFuZ3VhZ2U+Lzx1dWlkPjwvY29kZT4KLSAqIDxjb2RlPmxlbnlhZG9jOi88bGFuZ3VhZ2U+Lzx1dWlkPjwvY29kZT4KLSAqIAotICogSWYgd2Ugd2FudCB0byByZXF1ZXN0IHRoZSBtZXRhIGRhdGEgZm9yIGEgZG9jdW1lbnQKLSAqIGluc3RlYWQgb2YgdGhlIGRvY3VtZW50IGl0c2VsZiwgd2UgbmVlZCB0byB1c2UKLSAqIAotICogPGNvZGU+bGVueWFkb2M6bWV0YTovPGxhbmd1YWdlPi88dXVpZD48L2NvZGU+Ci0gKiA8Y29kZT5sZW55YWRvYzptZXRhOi8vPHB1YmxpY2F0aW9uPi88YXJlYT4vPGxhbmd1YWdlPi88dXVpZD48L2NvZGU+Ci0gKiAKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLXB1YmxpYyBjbGFzcyBMZW55YURvY1NvdXJjZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBTb3VyY2VGYWN0b3J5LCBUaHJlYWRTYWZlLAotICAgICAgICBDb250ZXh0dWFsaXphYmxlLCBTZXJ2aWNlYWJsZSwgQ29uZmlndXJhYmxlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJsZW55YWRvYyI7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgY29udGV4dDsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGZvciByZXNvbHZpbmcgdGhlIG9iamVjdCBtb2RlbC4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGUjY29udGV4dHVhbGl6ZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29udGV4dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZSNzZXJ2aWNlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VGYWN0b3J5I2dldFNvdXJjZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgZ2V0U291cmNlKFN0cmluZyBsb2NhdGlvbiwgTWFwIHBhcmFtZXRlcnMpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiwgU291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhcmVhID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHV1aWQgPSBudWxsOwotICAgICAgICBQdWJsaWNhdGlvbiBwdWI7Ci0KLSAgICAgICAgLy8gUGFyc2UgdGhlIHVybAotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgZW5kOwotCi0gICAgICAgIC8vIFNjaGVtZQotICAgICAgICBlbmQgPSBsb2NhdGlvbi5pbmRleE9mKCc6Jywgc3RhcnQpOwotICAgICAgICBpZiAoZW5kID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCJNYWxmb3JtZWQgbGVueWFkb2M6IFVSSTogY2FuIG5vdCBmaW5kIHNjaGVtZSBwYXJ0IFsiCi0gICAgICAgICAgICAgICAgICAgICsgbG9jYXRpb24gKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHNjaGVtZSA9IGxvY2F0aW9uLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICAgICAgaWYgKCFTQ0hFTUUuZXF1YWxzKHNjaGVtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIk1hbGZvcm1lZCBsZW55YWRvYzogVVJJOiB1bmtub3duIHNjaGVtZSBbIiArIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCBvYmplY3RNb2RlbCA9IENvbnRleHRIZWxwZXIuZ2V0T2JqZWN0TW9kZWwodGhpcy5jb250ZXh0KTsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmdldERvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotCi0gICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFic29sdXRlIHZzLiByZWxhdGl2ZQotICAgICAgICBpZiAobG9jYXRpb24uc3RhcnRzV2l0aCgiLy8iLCBzdGFydCkpIHsKLSAgICAgICAgICAgIC8vIEFic29sdXRlOiBnZXQgcHVibGljYXRpb24gaWQKLSAgICAgICAgICAgIHN0YXJ0ICs9IDI7Ci0gICAgICAgICAgICBlbmQgPSBsb2NhdGlvbi5pbmRleE9mKCcvJywgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGVuZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIk1hbGZvcm1lZCBsZW55YWRvYzogVVJJOiBwdWJsaWNhdGlvbiBwYXJ0IG5vdCBmb3VuZCBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsb2NhdGlvbiArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcHVibGljYXRpb25JZCA9IGxvY2F0aW9uLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJsaWNhdGlvbklkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCJNYWxmb3JtZWQgbGVueWFkb2M6IFB1YmxpY2F0aW9uIFsiICsgcHVibGljYXRpb25JZAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBkb2VzIG5vdCBleGlzdCBvciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwdWIgPT0gbnVsbCB8fCAhcHViLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNvdXJjZUV4Y2VwdGlvbigiVGhlIHB1YmxpY2F0aW9uIFsiICsgcHVibGljYXRpb25JZCArICJdIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBcmVhCi0gICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7Ci0gICAgICAgICAgICBlbmQgPSBsb2NhdGlvbi5pbmRleE9mKCcvJywgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGVuZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIk1hbGZvcm1lZCBsZW55YWRvYzogVVJJOiBjYW5ub3QgZmluZCBhcmVhIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxvY2F0aW9uICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZWEgPSBsb2NhdGlvbi5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCIvIiwgc3RhcnQpKSB7Ci0gICAgICAgICAgICBlbmQgKz0gMTsKLSAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBnZXQgcHVibGljYXRpb24gaWQgYW5kIGFyZWEgZnJvbSBwYWdlIGVudmVsb3BlCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHB1YiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbih0aGlzLm1hbmFnZXIsIG9iamVjdE1vZGVsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU291cmNlRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIHB1YmxpY2F0aW9uIGlkIC8gYXJlYSBmcm9tIHBhZ2UgZW52ZWxvcGUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbG9jYXRpb24gKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHB1YiAhPSBudWxsICYmIHB1Yi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICBhcmVhID0gbmV3IFVSTEluZm9ybWF0aW9uKHVybCkuZ2V0QXJlYSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU291cmNlRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIHB1YmxpY2F0aW9uIGlkIC8gYXJlYSBmcm9tIHBhZ2UgZW52ZWxvcGUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbG9jYXRpb24gKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigiTWFsZm9ybWVkIGxlbnlhZG9jOiBVUkkgWyIgKyBsb2NhdGlvbiArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYW5ndWFnZQotICAgICAgICBzdGFydCA9IGVuZCArIDE7Ci0gICAgICAgIGVuZCA9IGxvY2F0aW9uLmluZGV4T2YoJy8nLCBzdGFydCk7Ci0gICAgICAgIGlmIChlbmQgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIk1hbGZvcm1lZCBsZW55YWRvYzogVVJJOiBjYW5ub3QgZmluZCBsYW5ndWFnZSBbIgotICAgICAgICAgICAgICAgICAgICArIGxvY2F0aW9uICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICBsYW5ndWFnZSA9IGxvY2F0aW9uLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQotICAgICAgICAvLyBVVUlECi0gICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICAgICAgdXVpZCA9IGxvY2F0aW9uLnN1YnN0cmluZyhzdGFydCk7Ci0KLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24odGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJDcmVhdGluZyByZXBvc2l0b3J5IHNvdXJjZSBmb3IgVVJJIFsiICsgbG9jYXRpb24gKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBmYWN0b3J5LmdldChwdWIsIGFyZWEsIHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCJNYWxmb3JtZWQgbGVueWFkb2M6IERvY3VtZW50IFsiICsgdXVpZCArICI6IgotICAgICAgICAgICAgICAgICAgICArIGxhbmd1YWdlICsgIl0gY291bGQgbm90IGJlIGNyZWF0ZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbGVueWFVUkwgPSBkb2N1bWVudC5nZXRTb3VyY2VVUkkoKTsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIk1hcHBpbmcgJ2xlbnlhZG9jOicgVVJMIFsiICsgbG9jYXRpb24gKyAiXSB0byAnbGVueWE6JyBVUkwgWyIKLSAgICAgICAgICAgICAgICAgICAgKyBsZW55YVVSTCArICJdIik7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ3JlYXRpbmcgcmVwb3NpdG9yeSBzb3VyY2UgZm9yIFVSSSBbIiArIGxlbnlhVVJMICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgUmVwb3NpdG9yeVNvdXJjZShtYW5hZ2VyLCBsZW55YVVSTCwgc2Vzc2lvbiwgZ2V0TG9nZ2VyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUZhY3RvcnkjcmVsZWFzZShvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoU291cmNlIHNvdXJjZSkgewotICAgICAgICAvLyBTb3VyY2Ugd2lsbCBiZSByZWxlYXNlZCBieSBkZWxlZ2F0ZWQgc291cmNlIGZhY3RvcnkuCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtjaGVjay9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtZ2V0TGlua3MueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9saW5rY2hlY2svY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWdldExpbmtzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2M5ODg4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtjaGVjay9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtZ2V0TGlua3MueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2xpbmtjaGVjay5nZXRMaW5rcyddIj4KLQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ibGlua2NoZWNrLmdldExpbmtzIiBsb2dnZXI9ImxlbnlhLmxpbmtjaGVjayIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRHVtbXlVc2VjYXNlIj4KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9saW5rY2hlY2svdXNlY2FzZXMvbGlua2NoZWNrL2dldExpbmtzLmp4Ii8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0KLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9saW5rY2hlY2svY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9saW5rY2hlY2svY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2JjYTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua2NoZWNrL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPGxlbnlhOm1vZHVsZSB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxsZW55YTppZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMubGlua2NoZWNrPC9sZW55YTppZD4KLSAgPGxlbnlhOnBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9sZW55YTpwYWNrYWdlPgotICA8bGVueWE6dmVyc2lvbj4wLjEtZGV2PC9sZW55YTp2ZXJzaW9uPgotICA8bGVueWE6bmFtZT5MaW5rIENoZWNrZXI8L2xlbnlhOm5hbWU+Ci0gIDxsZW55YTpsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWE6bGVueWEtdmVyc2lvbj4KLSAgPGxlbnlhOmRlc2NyaXB0aW9uPkxpbmsgQ2hlY2tlcjwvbGVueWE6ZGVzY3JpcHRpb24+Ci08L2xlbnlhOm1vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtjaGVjay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vZ2VuZXJhdGlvbi9MaW5rU3RhdHVzR2VuZXJhdG9yLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9saW5rY2hlY2svamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2dlbmVyYXRpb24vTGlua1N0YXR1c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzBkOTBiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtjaGVjay9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vZ2VuZXJhdGlvbi9MaW5rU3RhdHVzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmdlbmVyYXRpb24uU2VydmljZWFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLnBvb2wuUmVjeWNsYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUucmVnZXhwLlJFOwotaW1wb3J0IG9yZy5hcGFjaGUucmVnZXhwLlJFU3ludGF4RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICpHZW5lcmF0ZXMgYSBsaXN0IG9mIGxpbmtzIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSBzcmMgYW5kIHRoZWlyIHN0YXR1cy4KLSAqCi0gKiA8cHJlPgotICogICZsdDttYXA6Z2VuZXJhdG9yIG5hbWU9ImxpbmtTdGF0dXMiIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmdlbmVyYXRpb24uTGlua1N0YXR1c0dlbmVyYXRvciIvJmd0OwotICoKLSAqICAgJmx0O21hcDpnZW5lcmF0ZSB0eXBlPSJsaW5rU3RhdHVzIiBzcmM9Ii97cHViaWR9L3thcmVhfS97ZG9jLWlkfS5odG1sIiZndDsKLSAqICAgICAgJmx0O21hcDpwYXJhbWV0ZXIgbmFtZT0iZGVwdGgiIHZhbHVlPSIxIi8mZ3Q7Ci0gKiAgICZsdDsvbWFwOmdlbmVyYXRlJmd0OwotICogPC9wcmU+Ci0qKi8KLQotcHVibGljIGNsYXNzIExpbmtTdGF0dXNHZW5lcmF0b3IgZXh0ZW5kcyBTZXJ2aWNlYWJsZUdlbmVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBSZWN5Y2xhYmxlLCBDb25maWd1cmFibGUgewotCi0gICAgLyoqIFRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGdlbmVyYXRvci4gKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPQotICAgICAgICAgICAgImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9saW5rc3RhdHVzLzIuMCI7Ci0KLSAgICAvKiogVGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlLiAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJsaW5rc3RhdHVzIjsKLQotICAgIC8qIE5vZGUgYW5kIGF0dHJpYnV0ZSBuYW1lcyAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUF9OT0RFX05BTUUgPSAibGlua3N0YXR1cyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19OT0RFX05BTUUgPSAibGluayI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIUkVGX0FUVFJfTkFNRSA9ICJocmVmIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUlJFUl9BVFRSX05BTUUgPSAicmVmZXJyZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVRUUl9OQU1FID0gImNvbnRlbnQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19BVFRSX05BTUUgPSAic3RhdHVzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0FUVFJfTkFNRSA9ICJtZXNzYWdlIjsKLQotICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlnIGVsZW1lbnQgbmFtZSBzcGVjaWZ5aW5nIGV4cGVjdGVkIGxpbmsgY29udGVudC10eXAuCi0gICAgICogPHA+Ci0gICAgICogICBJdHMgdmFsdWUgaXMgPGNvZGU+bGluay1jb250ZW50LXR5cGU8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJTktfQ09OVEVOVF9UWVBFX0NPTkZJRyA9ICJsaW5rLWNvbnRlbnQtdHlwZSI7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IHZhbHVlIG9mIDxjb2RlPmxpbmstY29udGVudC10eXBlPC9jb2RlPiBjb25maWd1cmF0aW9uIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqICAgSXRzIHZhbHVlIGlzIDxjb2RlPmFwcGxpY2F0aW9uL3gtY29jb29uLWxpbmtzPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2luY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIExJTktfQ09OVEVOVF9UWVBFX0RFRkFVTFQgPSAiYXBwbGljYXRpb24veC1jb2Nvb24tbGlua3MiOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlnIGVsZW1lbnQgbmFtZSBzcGVjaWZ5aW5nIHF1ZXJ5LXN0cmluZyBhcHBlbmRlbmQgZm9yIHJlcXVlc3RpbmcgbGlua3MKLSAgICAgKiBvZiBhbiBVUkwuCi0gICAgICogPHA+Ci0gICAgICogIEl0cyB2YWx1ZSBpcyA8Y29kZT5saW5rLXZpZXctcXVlcnk8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJTktfVklFV19RVUVSWV9DT05GSUcgPSAibGluay12aWV3LXF1ZXJ5IjsKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IHZhbHVlIG9mIDxjb2RlPmxpbmstdmlldy1xdWVyeTwvY29kZT4gY29uZmlndXJhdGlvbiB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiAgIEl0cyB2YWx1ZSBpcyA8Y29kZT4/Y29jb29uLXZpZXc9bGlua3M8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJTktfVklFV19RVUVSWV9ERUZBVUxUID0gImNvY29vbi12aWV3PWxpbmtzIjsKLQotICAgIC8qKgotICAgICAqIENvbmZpZyBlbGVtZW50IG5hbWUgc3BlY2lmeWluZyBleGNsdWRpbmcgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0gICAgICogPHA+Ci0gICAgICogIEl0cyB2YWx1ZSBpcyA8Y29kZT5leGNsdWRlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2luY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFWENMVURFX0NPTkZJRyA9ICJleGNsdWRlIjsKLQotICAgIC8qKgotICAgICAqIENvbmZpZyBlbGVtZW50IG5hbWUgc3BlY2lmeWluZyBpbmNsdWRpbmcgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0gICAgICogPHA+Ci0gICAgICogIEl0cyB2YWx1ZSBpcyA8Y29kZT5pbmNsdWRlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2luY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkNMVURFX0NPTkZJRyA9ICJpbmNsdWRlIjsKLQotICAgIC8qKgotICAgICAqIENvbmZpZyBlbGVtZW50IG5hbWUgc3BlY2lmeWluZyBodHRwIGhlYWRlciB2YWx1ZSBmb3IgdXNlci1BZ2VudC4KLSAgICAgKiA8cD4KLSAgICAgKiAgSXRzIHZhbHVlIGlzIDxjb2RlPnVzZXItYWdlbnQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRVJfQUdFTlRfQ09ORklHID0gInVzZXItYWdlbnQiOwotICAgIC8qKgotICAgICAqIERlZmF1bHQgdmFsdWUgb2YgPGNvZGU+dXNlci1hZ2VudDwvY29kZT4gY29uZmlndXJhdGlvbiB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uQ29uc3RhbnRzI0NPTVBMRVRFX05BTUUKLSAgICAgKiBAc2luY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VSX0FHRU5UX0RFRkFVTFQgPSBDb25zdGFudHMuQ09NUExFVEVfTkFNRTsKLQotICAgIC8qKgotICAgICAqIENvbmZpZyBlbGVtZW50IG5hbWUgc3BlY2lmeWluZyBodHRwIGhlYWRlciB2YWx1ZSBmb3IgYWNjZXB0LgotICAgICAqIDxwPgotICAgICAqICBJdHMgdmFsdWUgaXMgPGNvZGU+YWNjZXB0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2luY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ0NFUFRfQ09ORklHID0gImFjY2VwdCI7Ci0gICAgLyoqCi0gICAgICogRGVmYXVsdCB2YWx1ZSBvZiA8Y29kZT5hY2NlcHQ8L2NvZGU+IGNvbmZpZ3VyYXRpb24gdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogICBJdHMgdmFsdWUgaXMgPGNvZGU+KiAvICo8L2NvZGU+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNpbmNlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNDRVBUX0RFRkFVTFQgPSAiKi8qIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxpbmtWaWV3UXVlcnkgPSBMSU5LX1ZJRVdfUVVFUllfREVGQVVMVDsKLSAgICBwcml2YXRlIFN0cmluZyBsaW5rQ29udGVudFR5cGUgPSBMSU5LX0NPTlRFTlRfVFlQRV9ERUZBVUxUOwotICAgIHByaXZhdGUgSGFzaFNldCBleGNsdWRlQ3Jhd2xpbmdVUkw7Ci0gICAgcHJpdmF0ZSBIYXNoU2V0IGluY2x1ZGVDcmF3bGluZ1VSTDsKLQotICAgIHByaXZhdGUgSGFzaFNldCBjcmF3bGVkOwotICAgIHByaXZhdGUgSGFzaFNldCBsaW5rc1RvUHJvY2VzczsKLSAgICAKLSAgICAvKiogVGhlIGRlcHRoIHBhcmFtZXRlciBkZXRlcm1pbmVzIGhvdyBkZWVwIHRoZSBFbmhhbmNlZExpbmtTdGF0dXNHZW5lcmF0b3Igc2hvdWxkIGRlbHZlLiAqLwotICAgIHByb3RlY3RlZCBpbnQgZGVwdGggPSAxOwotICAgIAotICAgIHByb3RlY3RlZCBTb3VyY2UgaW5wdXRTb3VyY2U7Ci0gICAgU3RyaW5nIHNyYzsKLSAgICBwcml2YXRlIERvY3VtZW50RmFjdG9yeSBpZGVudGl0eU1hcDsKLQotICAgIC8qKgotICAgICAqIFN0b3JlcyBsaW5rcyB0byBwcm9jZXNzIGFuZCB0aGUgcmVmZXJyZXIgbGlua3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW5rIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotICAgICAgICBwcml2YXRlIFN0cmluZyByZWZlcnJlcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbGlua0RlcHRoOwotCi0gICAgICAgIHB1YmxpYyBMaW5rKFN0cmluZyB1cmksIFN0cmluZyByZWZlcnJlciwgaW50IGxpbmtEZXB0aCkgewotICAgICAgICAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgICAgICAgICB0aGlzLnJlZmVycmVyID0gcmVmZXJyZXI7Ci0gICAgICAgICAgICB0aGlzLmxpbmtEZXB0aCA9IGxpbmtEZXB0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotICAgICAgICAgICAgcmV0dXJuIHVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJyZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVmZXJyZXI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVwdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlua0RlcHRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKExpbmsgbCkgewotICAgICAgICAgICAgcmV0dXJuIHVyaS5lcXVhbHMobC5nZXRVUkkoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgdGhlIGNyYXdsZXIgY29tcG9uZW50LgotICAgICAqIDxwPgotICAgICAqICBDb25maWd1cmUgY2FuIHNwZWNpZnkgd2hpY2ggVVJJIHRvIGluY2x1ZGUsIGFuZCB3aGljaCBVUkkgdG8gZXhjbHVkZQotICAgICAqICBmcm9tIGNyYXdsaW5nLiBZb3Ugc3BlY2lmeSB0aGUgcGF0dGVybnMgYXMgcmVndWxhciBleHByZXNzaW9ucy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogIE1vcm92ZXIgeW91IGNhbiBjb25maWd1cmUKLSAgICAgKiAgdGhlIHJlcXVpcmVkIGNvbnRlbnQtdHlwZSBvZiBjcmF3bGluZyByZXF1ZXN0LCBhbmQgdGhlCi0gICAgICogIHF1ZXJ5LXN0cmluZyBhcHBlbmRlZCB0byBlYWNoIGNyYXdsaW5nIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqIDxwcmU+PHR0PgotICAgICAqICZsdDtpbmNsdWRlJmd0Oy4qXC5odG1sPyZsdDsvaW5jbHVkZSZndDsgb3IgJmx0O2luY2x1ZGUmZ3Q7LipcLmh0bWw/LCAuKlwueHNwJmx0Oy9pbmNsdWRlJmd0OwotICAgICAqICZsdDtleGNsdWRlJmd0Oy4qXC5naWYmbHQ7L2V4Y2x1ZGUmZ3Q7IG9yICZsdDtleGNsdWRlJmd0Oy4qXC5naWYsIC4qXC5qcGU/ZyZsdDsvZXhjbHVkZSZndDsKLSAgICAgKiAmbHQ7bGluay1jb250ZW50LXR5cGUmZ3Q7IGFwcGxpY2F0aW9uL3gtY29jb29uLWxpbmtzICZsdDsvbGluay1jb250ZW50LXR5cGUmZ3Q7Ci0gICAgICogJmx0O2xpbmstdmlldy1xdWVyeSZndDsgP2NvY29vbi12aWV3PWxpbmtzICZsdDsvbGluay12aWV3LXF1ZXJ5Jmd0OwotICAgICAqICZsdDt1c2VyLWFnZW50Jmd0OyBDb2Nvb24gJmx0Oy91c2VyLWFnZW50Jmd0OwotICAgICAqICZsdDthY2NlcHQmZ3Q7IHRleHQveG1sICZsdDsvYWNjZXB0Jmd0OwotICAgICAqIDwvdHQ+PC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICBYTUwgY29uZmlndXJhdGlvbiBvZiB0aGlzIGF2YWxvbiBjb21wb25lbnQuCi0gICAgICogQGV4Y2VwdGlvbiAgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiAgaXMgdGhyb3dpbmcgaWYgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLgotICAgICAqIEBzaW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbltdIGNoaWxkcmVuOwotICAgICAgICBjaGlsZHJlbiA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGRyZW4oSU5DTFVERV9DT05GSUcpOwotICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgaW5jbHVkZUNyYXdsaW5nVVJMID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGNoaWxkcmVuW2ldLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtc1tdID0gU3RyaW5nVXRpbHMuc3BsaXQocGF0dGVybiwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwYXJhbXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW5pemVkX3BhdHRlcm4gPSBwYXJhbXNbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNsdWRlQ3Jhd2xpbmdVUkwuYWRkKG5ldyBSRSh0b2tlbml6ZWRfcGF0dGVybikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUkVTeW50YXhFeGNlcHRpb24gcmVzZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiQ2Fubm90IGNyZWF0ZSBpbmNsdWRpbmcgcmVndWxhci1leHByZXNzaW9uIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCByZXNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjaGlsZHJlbiA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGRyZW4oRVhDTFVERV9DT05GSUcpOwotICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZXhjbHVkZUNyYXdsaW5nVVJMID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGNoaWxkcmVuW2ldLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtc1tdID0gU3RyaW5nVXRpbHMuc3BsaXQocGF0dGVybiwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwYXJhbXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW5pemVkX3BhdHRlcm4gPSBwYXJhbXNbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlQ3Jhd2xpbmdVUkwuYWRkKG5ldyBSRSh0b2tlbml6ZWRfcGF0dGVybikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUkVTeW50YXhFeGNlcHRpb24gcmVzZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiQ2Fubm90IGNyZWF0ZSBleGNsdWRpbmcgcmVndWxhci1leHByZXNzaW9uIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCByZXNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleGNsdWRlQ3Jhd2xpbmdVUkwgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgc2V0RGVmYXVsdEV4Y2x1ZGVGcm9tQ3Jhd2xpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbmZpZ3VyYXRpb24gY2hpbGQ7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgY2hpbGQgPSBjb25maWd1cmF0aW9uLmdldENoaWxkKExJTktfQ09OVEVOVF9UWVBFX0NPTkZJRywgZmFsc2UpOwotICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWUgPSBjaGlsZC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5saW5rQ29udGVudFR5cGUgPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBjb25maWd1cmF0aW9uLmdldENoaWxkKExJTktfVklFV19RVUVSWV9DT05GSUcsIGZhbHNlKTsKLSAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlID0gY2hpbGQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHRoaXMubGlua1ZpZXdRdWVyeSA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldHVwKFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBNYXAgb2JqZWN0TW9kZWwsIFN0cmluZyBzcmMsIFBhcmFtZXRlcnMgcGFyKQotICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb247Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbih0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaWRlbnRpdHlNYXAgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KHRoaXMubWFuYWdlciwgc2Vzc2lvbik7Ci0KLSAgICAgICAgc3VwZXIuc2V0dXAocmVzb2x2ZXIsIG9iamVjdE1vZGVsLCBzcmMsIHBhcik7Ci0gICAgICAgIHRoaXMuc3JjID0gc3JjOwotICAgICAgICB0aGlzLmRlcHRoID0gcGFyLmdldFBhcmFtZXRlckFzSW50ZWdlcigiZGVwdGgiLCAxKTsKLSAgICAgICAgCi0gICAgICAgIC8qIENyZWF0ZSBhIHJldXNhYmxlIGF0dHJpYnV0ZXMgZm9yIGNyZWF0aW5nIG5vZGVzICovCi0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIFhNTCBkYXRhLgotICAgICAqCi0gICAgICogQHRocm93cyAgU0FYRXhjZXB0aW9uCi0gICAgICogICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgb3V0cHV0dGluZyB0aGUgZG9jdW1lbnQKLSAgICAgKiBAdGhyb3dzICBQcm9jZXNzaW5nRXhjZXB0aW9uCi0gICAgICogICAgICBpZiB0aGUgcmVxdXN0ZWQgVVJJIHdhc24ndCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgICAgCi0gICAgICAgIGNyYXdsZWQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBsaW5rc1RvUHJvY2VzcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgLy90aGlzIGZpcnN0IG5vZGUgc2hvdWxkIGJlIGhhbmRsZWQgYXMgYSBjb2Nvb24gc291cmNlCi0gICAgICAgIFN0cmluZyByb290ID0gdGhpcy5zcmM7Ci0gICAgICAgIFVSTCB0ZW1wdXJsID0gbnVsbDsKLSAgICAgICAgbGlua3NUb1Byb2Nlc3MuYWRkKG5ldyBMaW5rKHJvb3QsICIiLCAwKSk7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJjcmF3bCBVUkwgIiArIHJvb3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKFBSRUZJWCwgVVJJKTsKLQotICAgICAgICBhdHRyaWJ1dGVzLmNsZWFyKCk7Ci0gICAgICAgIHN1cGVyLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChVUkksIFRPUF9OT0RFX05BTUUsIFBSRUZJWCArICc6JyArIFRPUF9OT0RFX05BTUUsIGF0dHJpYnV0ZXMpOwotCi0gICAgICAgIHdoaWxlIChsaW5rc1RvUHJvY2Vzcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gbGlua3NUb1Byb2Nlc3MuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmV0Y2ggYSBVUkwKLSAgICAgICAgICAgICAgICBMaW5rIGxpbmsgPSAoTGluaykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGxpbmsuZ2V0VVJJKCk7Ci0gICAgICAgICAgICAgICAgaW50IHJlZmVycmVyRGVwdGggPSBsaW5rLmdldERlcHRoKCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0IGZyb20gdGhlIHRvLWRvIGxpc3QKLSAgICAgICAgICAgICAgICBsaW5rc1RvUHJvY2Vzcy5yZW1vdmUobGluayk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld191cmxfbGluayA9IHByb2Nlc3NVUkwodXJpLCBsaW5rLmdldFJlZmVycmVyKCksIHJlZmVycmVyRGVwdGgpOwotCi0gICAgICAgICAgICAgICAgLy8gY2FsYyBhbGwgbGlua3MgZnJvbSB0aGlzIHVybAotICAgICAgICAgICAgICAgIGlmIChuZXdfdXJsX2xpbmsgIT0gbnVsbCAmJiByZWZlcnJlckRlcHRoIDwgdGhpcy5kZXB0aCkgewotCi0gICAgICAgICAgICAgICAgICAgIExpc3QgdXJsX2xpbmtzID0gZ2V0TGlua3NGcm9tQ29ubmVjdGlvbihuZXdfdXJsX2xpbmssIHVyaSwgcmVmZXJyZXJEZXB0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmxfbGlua3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGxpbmtzIG9mIHRoaXMgdXJsIHRvIHRoZSB0by1kbyBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rc1RvUHJvY2Vzcy5hZGRBbGwodXJsX2xpbmtzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoVVJJLCBUT1BfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicgKyBUT1BfTk9ERV9OQU1FKTsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKFBSRUZJWCk7Ci0gICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBleGNsdWRlIHBhdHRlcm5zLgotICAgICAqIDxwPgotICAgICAqICAgQnkgZGVmYXVsdCBVUkxzIG1hdGNoaW5nIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgZXhjbHVkZWQ6Ci0gICAgICogPC9wPgotICAgICAqIDx1bD4KLSAgICAgKiAgIDxsaT4uKlxcLmdpZihcXD8uKik/JCAtIGV4Y2x1ZGUgZ2lmIGltYWdlczwvbGk+Ci0gICAgICogICA8bGk+LipcXC5wbmcoXFw/LiopPyQgLSBleGNsdWRlIHBuZyBpbWFnZXM8L2xpPgotICAgICAqICAgPGxpPi4qXFwuanBlP2coXFw/LiopPyQgLSBleGNsdWRlIGpwZWcgaW1hZ2VzPC9saT4KLSAgICAgKiAgIDxsaT4uKlxcLmpzKFxcPy4qKT8kIC0gZXhjbHVkZSBqYXZhc2NyaXB0IDwvbGk+Ci0gICAgICogICA8bGk+LipcXC5jc3MoXFw/LiopPyQgLSBleGNsdWRlIGNhc2NhZGVkIHN0eWxlc2hlZXRzPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNpbmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRFeGNsdWRlRnJvbUNyYXdsaW5nKCkgewotICAgICAgICBTdHJpbmdbXSBFWENMVURFX0ZST01fQ1JBV0xJTkdfREVGQVVMVCA9IHsKLSAgICAgICAgICAgICIuKlxcLmdpZihcXD8uKik/JCIsCi0gICAgICAgICAgICAiLipcXC5wbmcoXFw/LiopPyQiLAotICAgICAgICAgICAgIi4qXFwuanBlP2coXFw/LiopPyQiLAotICAgICAgICAgICAgIi4qXFwuanMoXFw/LiopPyQiLAotICAgICAgICAgICAgIi4qXFwuY3NzKFxcPy4qKT8kIiwKLSAgICAgICAgICAgICIuKlxcPy4qIiwiLipcXEAuKiIKLSAgICAgICAgfTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVYQ0xVREVfRlJPTV9DUkFXTElOR19ERUZBVUxULmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IEVYQ0xVREVfRlJPTV9DUkFXTElOR19ERUZBVUxUW2ldOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBleGNsdWRlQ3Jhd2xpbmdVUkwuYWRkKG5ldyBSRShwYXR0ZXJuKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSRVN5bnRheEV4Y2VwdGlvbiByZXNlKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIkNhbm5vdCBjcmVhdGUgZXhjbHVkaW5nIHJlZ3VsYXItZXhwcmVzc2lvbiBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCByZXNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYSBsaXN0IG9mIGxpbmtzIG9mIGEgdXJsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJsX2xpbmtfc3RyaW5nIHVybCBmb3IgcmVxdWVzdGluZyBsaW5rcywgaXQgaXMgYXNzdW1lZCB0aGF0Ci0gICAgICogICB1cmxfbGlua19zdHJpbmcgcXVlcmllcyB0aGUgY29jb29uIHZpZXcgbGlua3MsIGllIG9mIHRoZSBmb3JtCi0gICAgICogICA8Y29kZT5odHRwOi8vaG9zdC9mb28vYmFyP2NvY29vbi12aWV3PWxpbmtzPC9jb2RlPgotICAgICAqIEBwYXJhbSB1cmxfb2ZfcmVmZXJyZXIgYmFzZSB1cmwgb2Ygd2hpY2ggbGlua3MgYXJlIHJlcXVlc3RlZCwgaWUgb2YgdGhlIGZvcm0KLSAgICAgKiAgIDxjb2RlPmh0dHA6Ly9ob3N0L2Zvby9iYXI8L2NvZGU+Ci0gICAgICogQHJldHVybiBMaXN0IG9mIGxpbmtzIGZyb20gdXJsX29mX3JlZmVycmVyLCBhcyByZXN1bHQgb2YgcmVxdWVzdGluZyB1cmwKLSAgICAgKiAgIHVybF9saW5rX3N0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldExpbmtzRnJvbUNvbm5lY3Rpb24oU3RyaW5nIHVybF9saW5rX3N0cmluZywgU3RyaW5nIHVybF9vZl9yZWZlcnJlciwgaW50IHJlZmVycmVyRGVwdGgpIHsKLSAgICAgICAgTGlzdCB1cmxfbGlua3MgPSBudWxsOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICB1cmxfbGlua3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgdXJsX2xpbmtfc3RyaW5nID0gImNvY29vbjovIiArIHVybF9saW5rX3N0cmluZzsKLQotICAgICAgICAgICAgICAgIGlucHV0U291cmNlID0gc3VwZXIucmVzb2x2ZXIucmVzb2x2ZVVSSSh1cmxfbGlua19zdHJpbmcpOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gaW5wdXRTb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgaXMgc3VwcG9zZWQgdG8gYmUgYSBsaXN0IG9mIGxpbmtzLAotICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIGN1cnJlbnQgVVJMCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlZmVycmVyID0gdXJsX29mX3JlZmVycmVyOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3X3VybCA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkX3VybCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCBuZXdfdXJsIHR3aWNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChhZGRfdXJsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRfdXJsICY9ICF1cmxfbGlua3MuY29udGFpbnMobmV3X3VybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgbmV3X3VybCBpZiBpdCBoYXMgYmVlbiBjcmF3bGVkIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkZF91cmwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZF91cmwgJj0gIWNyYXdsZWQuY29udGFpbnMobmV3X3VybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBMaW5rIG5ld19saW5rID0gbmV3IExpbmsobGluZSwgcmVmZXJyZXIsIHJlZmVycmVyRGVwdGgrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGRfdXJsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRfdXJsICY9ICFsaW5rc1RvUHJvY2Vzcy5jb250YWlucyhuZXdfbGluayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgaWYgaXMgbm90IG1hdGNoZWQgYnkgZXhpc3RpbmcgaW5jbHVkZSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChhZGRfdXJsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRfdXJsICY9IGlzSW5jbHVkZWRVUkwobmV3X3VybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYWRkIGlkIG1hdGNoZWQgYnkgZXhpc3RpbmcgZXhjbHVkZSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChhZGRfdXJsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRfdXJsICY9ICEoaXNFeGNsdWRlZFVSTChuZXdfdXJsKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYWRkX3VybCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQWRkIFVSTDogIiArIG5ld191cmwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdXJsX2xpbmtzLmFkZChuZXdfbGluayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm93IHdlIGhhdmUgYSBsaXN0IG9mIFVSTCB3aGljaCBzaG91bGQgYmUgZXhhbWluZWQKLSAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCJQcm9ibGVtcyBnZXQgbGlua3Mgb2YgIiArIHVybF9saW5rX3N0cmluZywgaW9lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIGV4cGxpY3RseSBjbG9zZSB0aGUgc3RyZWFtCi0gICAgICAgICAgICBpZiAoYnIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmxfbGlua3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgeG1sIGF0dHJpYnV0ZXMgb2YgYSB1cmwsIGNhbGN1bGF0ZSB1cmwgZm9yIHJldHJpZXZpbmcgbGlua3MKLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwgdG8gcHJvY2VzcwotICAgICAqIEBwYXJhbSByZWZlcnJlciBvZiB0aGUgdXJsCi0gICAgICogQHJldHVybiBTdHJpbmcgdXJsIGZvciByZXRyaWV2aW5nIGxpbmtzLCBvciBudWxsIGlmIHVybCBpcyBhbiBleGNsdWRlZC11cmwsCi0gICAgICogICBhbmQgbm90IGFuIGluY2x1ZGVkLXVybC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3NVUkwoU3RyaW5nIHVyaSwgU3RyaW5nIHJlZmVycmVyLCBpbnQgcmVmZXJyZXJEZXB0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJnZXRMaW5rcyBVUkwgIiArIHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICAvLyBkb24ndCB0cnkgdG8gaW52ZXN0aWdhdGUgYSB1cmwgd2hpY2ggaGFzIGJlZW4gY3Jhd2xlZCBhbHJlYWR5Ci0gICAgICAgIGlmIChjcmF3bGVkLmNvbnRhaW5zKHVyaSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1RPRE86IG5lZWQgdG8gcmVzcGVjdCByb2JvdHMudHh0Ci0KLSAgICAgICAgLy8gbWFyayBpdCBhcyBjcmF3bGVkCi0gICAgICAgIGNyYXdsZWQuYWRkKHVyaSk7Ci0KLSAgICAgICAgYXR0cmlidXRlcy5jbGVhcigpOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgSFJFRl9BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgSFJFRl9BVFRSX05BTUUsICJDREFUQSIsIHVyaSk7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBSRUZFUlJFUl9BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgUkVGRVJSRVJfQVRUUl9OQU1FLCAiQ0RBVEEiLCByZWZlcnJlcik7Ci0KLSAgICAgICAgLy8gT3V0cHV0IHVybCwgcmVmZXJyZXIsIGNvbnRlbnQtdHlwZSwgc3RhdHVzLCBtZXNzYWdlIGZvciB0cmF2ZXJzYWJsZSB1cmwncwotICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBoID0gbnVsbDsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBuZXdVUkwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOwotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9ICJub3QgZm91bmQiOwotICAgICAgICAgICAgaW50IHJlc3BvbnNlQ29kZSA9IDQwNDsKLSAgICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgiaHR0cDovLyIpKSB7Ci0gICAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh1cmkpOwotICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gbGlua3NfdXJsX2Nvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBoID0gKEh0dHBVUkxDb25uZWN0aW9uKSBsaW5rc191cmxfY29ubmVjdGlvbjsKLSAgICAgICAgICAgICAgICBoLnNldFJlcXVlc3RNZXRob2QoIkhFQUQiKTsgIC8vbGV0cyBiZSBraW5kIHRvIGV4dGVybmFsIHNpdGVzCi0gICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gbGlua3NfdXJsX2Nvbm5lY3Rpb24uZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UgPSBoLmdldFJlc3BvbnNlTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29kZSA9IGguZ2V0UmVzcG9uc2VDb2RlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wVVJJID0gdXJpOwotICAgICAgICAgICAgICAgIGlmICghKHVyaS5zdGFydHNXaXRoKCIvIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0VVJJID0gcmVmZXJyZXIuc3Vic3RyaW5nKDAscmVmZXJyZXIubGFzdEluZGV4T2YoIi8iKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFVSSSA9IGNvbnRleHRVUkkgKyB1cmk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vc2VlIGlmIHRoZSBkb2N1bWVudCBleGlzdHMKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5pZGVudGl0eU1hcC5pc0RvY3VtZW50KHRlbXBVUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UgPSAib2siOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvZGUgPSAyMDA7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1VSTCA9IHRlbXBVUkk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9zZWUgaWYgdGhlIHJlc291cmNlIGV4aXN0cwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIENPTlRFTlRfQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICBDT05URU5UX0FUVFJfTkFNRSwgIkNEQVRBIiwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlKTsKLQotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIE1FU1NBR0VfQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX0FUVFJfTkFNRSwgIkNEQVRBIiwKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlKTsKLQotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIFNUQVRVU19BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIFNUQVRVU19BVFRSX05BTUUsICJDREFUQSIsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHJlc3BvbnNlQ29kZSkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBNRVNTQUdFX0FUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9BVFRSX05BTUUsICJDREFUQSIsCi0gICAgICAgICAgICAgICAgICAgIGlvZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBNRVNTQUdFX0FUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9BVFRSX05BTUUsICJDREFUQSIsCi0gICAgICAgICAgICAgICAgICAgIGUxLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkb24ndCB0cnkgdG8gZ2V0IGxpbmtzIG9mIGEgdXJsIHdoaWNoIGlzIGV4Y2x1ZGVkIGZyb20gY3Jhd2xpbmcKLSAgICAgICAgLy8gdHJ5IHRvIGdldCBsaW5rcyBvZiBhIHVybCB3aGljaCBpcyBpbmNsdWRlZCBmb3IgY3Jhd2xpbmcKLSAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkVVJMKHVyaSkgJiYgaXNJbmNsdWRlZFVSTCh1cmkpKSB7Ci0gICAgICAgICAgICAvLyBhZGQgcHJlZml4IGFuZCBxdWVyeSB0byBnZXQgZGF0YSBmcm9tIHRoZSBsaW5rc2VyaWFsaXplci4KLSAgICAgICAgICAgIGlmKG5ld1VSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1VSTC5pbmRleE9mKCI/IikgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICBuZXdVUkwgPSBuZXdVUkwuc3Vic3RyaW5nKDAsbmV3VVJMLmluZGV4T2YoIj8iKSkgKyBsaW5rVmlld1F1ZXJ5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1VSTCA9IG5ld1VSTCArICI/IiArIGxpbmtWaWV3UXVlcnk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9saW5rcmV3cml0ZXIgdHJhbnNmb3JtZXIgdGFrZXMgY2FyZSBvZiBpbnRlcm5hbCBsaW5rcwotICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgewotICAgICAgICAgIHN1cGVyLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChVUkksIExJTktfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicgKyBMSU5LX05PREVfTkFNRSwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgc3VwZXIuY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChVUkksIExJTktfTk9ERV9OQU1FLCBQUkVGSVggKyAnOicgKyBMSU5LX05PREVfTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ld1VSTDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogY2hlY2sgaWYgVVJMIGlzIGEgY2FuZGlkYXRlIGZvciBpbmRleGluZwotICAgICAqCi0gICAgICogQHBhcmFtICB1cmwgIERlc2NyaXB0aW9uIG9mIFBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gICAgICBUaGUgZXhjbHVkZWRVUkwgdmFsdWUKLSAgICAgKiBAc2luY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFeGNsdWRlZFVSTChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIC8vIGJ5IGRlZmF1bHQgaW5jbHVkZSBVUkwgZm9yIGNyYXdsaW5nCi0gICAgICAgIGlmIChleGNsdWRlQ3Jhd2xpbmdVUkwgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiZXhjbHVkZSBubyBVUkwgIiArIHVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHVybDsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGV4Y2x1ZGVDcmF3bGluZ1VSTC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFJFIHBhdHRlcm4gPSAoUkUpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHBhdHRlcm4ubWF0Y2gocykpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiZXhjbHVkZSBVUkwgIiArIHVybCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiZXhjbHVkZSBub3QgVVJMICIgKyB1cmwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGlmIFVSTCBpcyBhIGNhbmRpZGF0ZSBmb3IgaW5kZXhpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSAgdXJsICBEZXNjcmlwdGlvbiBvZiBQYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuICAgICAgVGhlIGluY2x1ZGVkVVJMIHZhbHVlCi0gICAgICogQHNpbmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5jbHVkZWRVUkwoU3RyaW5nIHVybCkgewotICAgICAgICAvLyBieSBkZWZhdWx0IGluY2x1ZGUgVVJMIGZvciBjcmF3bGluZwotICAgICAgICBpZiAoaW5jbHVkZUNyYXdsaW5nVVJMID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImluY2x1ZGUgYWxsIFVSTCAiICsgdXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB1cmw7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBpbmNsdWRlQ3Jhd2xpbmdVUkwuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBSRSBwYXR0ZXJuID0gKFJFKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChwYXR0ZXJuLm1hdGNoKHMpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImluY2x1ZGUgVVJMICIgKyB1cmwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoImluY2x1ZGUgbm90IFVSTCAiICsgdXJsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5pbnB1dFNvdXJjZSkgewotICAgICAgICAgICAgc3VwZXIucmVzb2x2ZXIucmVsZWFzZSh0aGlzLmlucHV0U291cmNlKTsKLSAgICAgICAgICAgIHRoaXMuaW5wdXRTb3VyY2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHN1cGVyLnJlc29sdmVyKTsKLSAgICAgICAgc3VwZXIucmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0aGlzLm1hbmFnZXIgPSBudWxsOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICBzdXBlci5yZWN5Y2xlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua2NoZWNrL3Jlc291cmNlcy9saW5rcmVwb3J0ZXIuanMgYi90cnVuay9zcmMvbW9kdWxlcy9saW5rY2hlY2svcmVzb3VyY2VzL2xpbmtyZXBvcnRlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkMzZlNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9saW5rY2hlY2svcmVzb3VyY2VzL2xpbmtyZXBvcnRlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi12YXIgcmVxOwotCi1mdW5jdGlvbiBwcm9jZXNzUmVxQ2hhbmdlKCkgewotICAgIC8vIG9ubHkgaWYgcmVxIHNob3dzICJsb2FkZWQiCi0gICAgaWYgKHJlcS5yZWFkeVN0YXRlID09IDQpIHsKLSAgICAgICAgLy8gb25seSBpZiAiT0siCi0gICAgICAgIGlmIChyZXEuc3RhdHVzID09IDIwMCkgewotICAgICAgICAgICAgLy8gLi4ucHJvY2Vzc2luZyBzdGF0ZW1lbnRzIGdvIGhlcmUuLi4KLSAgICAgICAgICAgIC8vcGFyc2UgbGluayByZXBvcnQgZm9yIGJyb2tlbiBsaW5rcwotICAgICAgICAgICAgdmFyIHJwdExpbmtzID0gcmVxLnJlc3BvbnNlWE1MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7Ci0gICAgICAgICAgICB2YXIgYnJva2VuTGlua3MgPSBuZXcgQXJyYXkocnB0TGlua3MubGVuZ3RoKTsKLSAgICAgICAgICAgIGJyb2tlbkNvdW50PTA7Ci0gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcnB0TGlua3MubGVuZ3RoOyBpKyspIHsgIC8vIExvb3AgdGhyb3VnaCB0aGUgcmV0dXJuZWQgbGlua3MKLSAgICAgICAgICAgICAgICBpZiAocnB0TGlua3NbaV0uaGFzQXR0cmlidXRlKCJzdGF0dXMiKSAmJiBycHRMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoInN0YXR1cyIpID09ICI0MDQiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2tlbkxpbmtzW2Jyb2tlbkNvdW50KytdID0gcnB0TGlua3NbaV0uZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGlmIChicm9rZW5Db3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAvL2dldCBsaW5rIGVsZW1lbnRzIGZyb20gZG9tCi0gICAgICAgICAgICAgICAgdmFyIGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhZ2UiKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwotICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsgIC8vIExvb3AgdGhyb3VnaCB0aGUgbGlua3MgaW4gdGhlIGRvYwotICAgICAgICAgICAgICAgICAgICAvL2ZvciBlYWNoIGxpbmssIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBpbiBicm9rZW4gbGlzdAotICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJyb2tlbkxpbmtzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJva2VuTGlua3Nbal0gPT0gbGlua3NbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGl0IGlzLCBnaXZlIGl0IGNsYXNzIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICJicm9rZW5saW5rIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzW2ldLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAiYnJva2VubGluayIpCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhbGVydCgiVGhlcmUgd2FzIGEgcHJvYmxlbSByZXRyaWV2aW5nIHRoZSBYTUwgZGF0YTpcbiIgKwotICAgICAgICAgICAgICAgIHJlcS5zdGF0dXNUZXh0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotZnVuY3Rpb24gbG9hZFhNTERvYyh1cmwpIHsKLQlyZXEgPSBmYWxzZTsKLSAgICAvLyBicmFuY2ggZm9yIG5hdGl2ZSBYTUxIdHRwUmVxdWVzdCBvYmplY3QKLSAgICBpZih3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHsKLSAgICAJdHJ5IHsKLQkJCXJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwotICAgICAgICB9IGNhdGNoKGUpIHsKLQkJCXJlcSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgLy8gYnJhbmNoIGZvciBJRS9XaW5kb3dzIEFjdGl2ZVggdmVyc2lvbgotICAgIH0gZWxzZSBpZih3aW5kb3cuQWN0aXZlWE9iamVjdCkgewotICAgICAgIAl0cnkgewotICAgICAgICAJcmVxID0gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7Ci0gICAgICAJfSBjYXRjaChlKSB7Ci0gICAgICAgIAl0cnkgewotICAgICAgICAgIAkJcmVxID0gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik7Ci0gICAgICAgIAl9IGNhdGNoKGUpIHsKLSAgICAgICAgICAJCXJlcSA9IGZhbHNlOwotICAgICAgICAJfQotCQl9Ci0gICAgfQotCWlmKHJlcSkgewotCQlyZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsKLQkJcmVxLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7Ci0JCXJlcS5zZW5kKCIiKTsKLQl9Ci19Ci0KLXJlcG9ydGxpbmtzID0gZnVuY3Rpb24oKSB7Ci0gIC8vZ2V0IGxpbmsgcmVwb3J0Ci0gIGxvYWRYTUxEb2MoIj9sZW55YS51c2VjYXNlPWxpbmtjaGVjay5nZXRMaW5rcyZhc1hNTD10cnVlIik7Ci19Ci0KLS8vICBhc3NpZ24gcmVwb3J0bGlua3MgZnVuY3Rpb24gdG8gb25sb2FkCi0KLWZ1bmN0aW9uIGFkZE9uTG9hZChuZXdGdW5jdGlvbikgeyAKLSAgICB2YXIgb2xkT25sb2FkID0gd2luZG93Lm9ubG9hZDsgCi0gICAgaWYgKHR5cGVvZiB3aW5kb3cub25sb2FkICE9ICdmdW5jdGlvbicpIHsgCi0gICAgICB3aW5kb3cub25sb2FkID0gbmV3RnVuY3Rpb247IAotICAgIH0gZWxzZSB7IAotICAgICAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgeyBvbGRPbmxvYWQoKTsgbmV3RnVuY3Rpb24oKTsgfSAKLSAgICB9IAotfSAKLQotYWRkT25Mb2FkKHJlcG9ydGxpbmtzKTsgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua2NoZWNrL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtjaGVjay9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMzM1MjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua2NoZWNrL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gCi0gIFRoaXMgc2l0ZW1hcCBoYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBsaW5rIHJlcG9ydHMKLS0tPgotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDxtYXA6Y29tcG9uZW50cz4KLSAgICA8bWFwOmdlbmVyYXRvcnMgZGVmYXVsdD0iZmlsZSI+Ci0gICAgICA8bWFwOmdlbmVyYXRvciBuYW1lPSJsaW5rU3RhdHVzIiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5nZW5lcmF0aW9uLkxpbmtTdGF0dXNHZW5lcmF0b3IiPgotICAgICAgPC9tYXA6Z2VuZXJhdG9yPgotICAgIDwvbWFwOmdlbmVyYXRvcnM+Ci0gICAgCi0gICAgPG1hcDpzZWxlY3RvcnMgZGVmYXVsdD0iYnJvd3NlciI+Ci0gICAgICA8bWFwOnNlbGVjdG9yIGxvZ2dlcj0ic2l0ZW1hcC5zZWxlY3Rvci5sYXN0bW9kIiBuYW1lPSJsYXN0LW1vZCIgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc2VsZWN0aW9uLkxhc3RNb2RTb3VyY2VTZWxlY3RvciIvPgotICAgIDwvbWFwOnNlbGVjdG9ycz4KLSAgPC9tYXA6Y29tcG9uZW50cz4KLSAgCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGlwZWxpbmVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCQotICA8bWFwOnBpcGVsaW5lcz4KLQkgIAotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0ibm9uY2FjaGluZyI+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImdldExpbmtzLnhtbCI+Ci0gICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJsYXN0LW1vZCI+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjb21wYXJlLXRvIiB2YWx1ZT0ibGVueWE6Ly9sZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L3twYWdlLWVudmVsb3BlOmFyZWF9L3twYWdlLWVudmVsb3BlOmRvY3VtZW50LXBhdGh9Ii8+Ci0gICAgICAgICAgICA8IS0tIFJlYWQgZnJvbSBjYWNoZSAtLT4KLSAgICAgICAgICAgIDwhLS0gSWYgY29uZmlndXJlZCB3aXRoaW4gQXBhY2hlIHRoZW4gbW9kX2xlbnlhIHdpbGwgbmV2ZXJ0aGVsZXNzIHJlYWQgZnJvbSBjYWNoZSAtLT4KLSAgICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJjb250ZXh0Oi8vbGVueWEvcHVicy97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0vd29yay9jYWNoZS97cGFnZS1lbnZlbG9wZTphcmVhfS97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfS5saW5rcmVwb3J0Ij4KLSAgICAgICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29udGV4dDovL2xlbnlhL3B1YnMve3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3dvcmsvY2FjaGUve3BhZ2UtZW52ZWxvcGU6YXJlYX0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0ubGlua3JlcG9ydCIgbWltZS10eXBlPSJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCIvPgotICAgICAgICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICAgIDwhLS0gV3JpdGUgdG8gY2FjaGUgYW5kIHNlcmlhbGl6ZSAtLT4KLSAgICAgICAgICAgIDxtYXA6b3RoZXJ3aXNlPiAgCi0gICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ibGlua1N0YXR1cyIgc3JjPSIve3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9L3twYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRlcHRoIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8L21hcDpnZW5lcmF0ZT4KLSAgICAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9zdHJpcF9uYW1lc3BhY2VzLnhzbCIvPgotICAgICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9hdXRob3JpbmcvZWRpdC9hZGRTb3VyY2VUYWdzLnhzbCI+Ci0gICAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ic291cmNlIiB2YWx1ZT0iY29udGV4dDovL2xlbnlhL3B1YnMve3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3dvcmsvY2FjaGUve3BhZ2UtZW52ZWxvcGU6YXJlYX0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0ubGlua3JlcG9ydCIvPgotICAgICAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9IndyaXRlLXNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ic2VyaWFsaXplciIgdmFsdWU9InhtbCIvPgotICAgICAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L2F1dGhvcmluZy9lZGl0L3JlbW92ZVNvdXJjZVRhZ3MueHNsIi8+Ci0gICAgICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPgotICAgICAgICAgIDwvbWFwOnNlbGVjdD4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0JPC9tYXA6cGlwZWxpbmVzPgotCQotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtjaGVjay91c2VjYXNlcy9saW5rY2hlY2svZ2V0TGlua3MuanggYi90cnVuay9zcmMvbW9kdWxlcy9saW5rY2hlY2svdXNlY2FzZXMvbGlua2NoZWNrL2dldExpbmtzLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U0MTE4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtjaGVjay91c2VjYXNlcy9saW5rY2hlY2svZ2V0TGlua3MuangKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08Y2luY2x1ZGU6aW5jbHVkZXhtbCB4bWxuczpjaW5jbHVkZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2luY2x1ZGUvMS4wIj4NCi0gIDxjaW5jbHVkZTpzcmM+Y29jb29uOi8vbW9kdWxlcy9saW5rY2hlY2svZ2V0TGlua3MueG1sPC9jaW5jbHVkZTpzcmM+DQotPC9jaW5jbHVkZTppbmNsdWRleG1sPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2UtdHlwZS1saW5rcy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2UtdHlwZS1saW5rcy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxODFjYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9saW5rcy9jb25maWcvY29jb29uLXhjb25mL3Jlc291cmNlLXR5cGUtbGlua3MueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi9yZXNvdXJjZS10eXBlcyIgdW5sZXNzPSIvY29jb29uL3Jlc291cmNlLXR5cGVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdsaW5rcyddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImxpbmtzIgotICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEucmVzb3VyY2V0eXBlcy5saW5rcyIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlSW1wbCI+Ci0gICAgPHNjaGVtYSAKLSAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8wLjkiCi0gICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9saW5rcy9yZXNvdXJjZXMvc2NoZW1hL2xpbmtzLnJuZyIKLSAgICAvPgotICAgIDxzYW1wbGUgCi0gICAgICBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3htbCIgCi0gICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9saW5rcy9zYW1wbGVzL2xpbmtzLnhtbCIKLSAgICAvPgotICAgIDxmb3JtYXQgbmFtZT0ieGh0bWwiIHVyaT0iY29jb29uOi8vbW9kdWxlcy9saW5rcy94aHRtbC54bWwiLz4KLSAgICA8Zm9ybWF0IG5hbWU9Imx1Y2VuZUluZGV4IiB1cmk9ImNvY29vbjovL21vZHVsZXMveGh0bWwvbHVjZW5lLWluZGV4Ii8+Ci0gICAgPGZvcm1hdCBuYW1lPSJ3ZWJkYXZHRVQiIHVyaT0iY29jb29uOi8vbW9kdWxlcy94aHRtbC9kYXZnZXQueG1sIi8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MvY29uZmlnL21lbnUueHNwIGIvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MvY29uZmlnL21lbnUueHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmM2YzY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL2NvbmZpZy9tZW51LnhzcAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZ2VuZXJpYy54c3AgMTU1ODA2IDIwMDUtMDMtMDEgMTc6NTU6NDJaIGFuZHJlYXMgJCAtLT4KLQotPHhzcDpwYWdlIAotICAgIGxhbmd1YWdlPSJqYXZhIiAKLSAgICB4bWxuczp4c3A9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcCIKLSAgICB4bWxuczp4c3AtcmVxdWVzdD0iaHR0cDovL2FwYWNoZS5vcmcveHNwL3JlcXVlc3QvMi4wIgotICAgIHhtbG5zOmlucHV0PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24veHNwL2lucHV0LzEuMCIKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICAgIHhtbG5zOndmPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvd29ya2Zsb3cvMS4wIgotICAgIHhtbG5zOnVjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLT4KLQotICA8eHNwOnN0cnVjdHVyZT4KLSAgICA8eHNwOmluY2x1ZGU+b3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ8L3hzcDppbmNsdWRlPgotICAgIDx4c3A6aW5jbHVkZT5vcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjwveHNwOmluY2x1ZGU+Ci0gIDwveHNwOnN0cnVjdHVyZT4KLSAgCi0gIDxtZW51PgotCi0gICAgPG1lbnVzPgotICAgICAgPG1lbnUgaTE4bjphdHRyPSJuYW1lIiBuYW1lPSJGaWxlIj4KLSAgICAgICAgPGJsb2NrIGFyZWFzPSJzaXRlIGF1dGhvcmluZyIgaWQ9ImNyZWF0ZSI+Ci0gICAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZW1hbmFnZW1lbnQuY3JlYXRlIiBocmVmPSI/ZG9jdHlwZT1saW5rcyI+Ci0gICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+TmV3IC4uLiBEb2N1bWVudDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48aTE4bjp0ZXh0PnJlc291cmNlVHlwZS1saW5rczwvaTE4bjp0ZXh0PjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgPC9pdGVtPgotICAgICAgICA8L2Jsb2NrPgotICAgICAgPC9tZW51PgotICAgICAgCi0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkVkaXQiPgotICAgICAgICAgIDx4c3A6bG9naWM+Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE9iamVjdCBkb2MgPSA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIGFzPSJvYmplY3QiIG5hbWU9ImRvY3VtZW50Ii8+OwotICAgICAgICAgICAgICAgIGlmIChkb2MgaW5zdGFuY2VvZiBEb2N1bWVudCAmYW1wOyZhbXA7ICgoRG9jdW1lbnQpIGRvYykuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGUgPSA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIGFzPSJzdHJpbmciIG5hbWU9ImRvY3VtZW50LXR5cGUiLz47Ci0gICAgICAgICAgICAgICAgICAgIGlmICgibGlua3MiLmVxdWFscyhkb2N0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgPGJsb2NrIGFyZWFzPSJhdXRob3JpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbSB3ZjpldmVudD0iZWRpdCIgdWM6dXNlY2FzZT0iZWRpdG9ycy5vbmVmb3JtIiBocmVmPSI/Ij48aTE4bjp0ZXh0PldpdGggb25lIEZvcm08L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2Jsb2NrPgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIkVycm9yIGR1cmluZyBtZW51IGdlbmVyYXRpb246ICIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIDwveHNwOmxvZ2ljPgotICAgICAgPC9tZW51PgotICAgICAgCi0gICAgPC9tZW51cz4KLSAgICAKLSAgPC9tZW51PgotPC94c3A6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDljNjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bGVueWE6bW9kdWxlIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGxlbnlhOmlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5saW5rczwvbGVueWE6aWQ+Ci0gIDxsZW55YTpwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvbGVueWE6cGFja2FnZT4KLSAgPGxlbnlhOnZlcnNpb24+MC4xLWRldjwvbGVueWE6dmVyc2lvbj4KLSAgPGxlbnlhOm5hbWU+TGlua3M8L2xlbnlhOm5hbWU+Ci0gIDxsZW55YTpsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWE6bGVueWEtdmVyc2lvbj4KLSAgPGxlbnlhOmRlc2NyaXB0aW9uPkxpbmsgbGlzdCByZXNvdXJjZSB0eXBlPC9sZW55YTpkZXNjcmlwdGlvbj4KLTwvbGVueWE6bW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MvbWVudXMueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL21lbnVzLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWRiMzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MvbWVudXMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbWVudXMueG1hcCAxNzg3MzggMjAwNS0wNS0yNyAwMzo0MjowOVogZ3JlZ29yICQgLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotICAgIAkKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKioiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImNvbmZpZy9tZW51LnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9saW5rcy9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9saW5rcy9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYWEzOTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDY1NDIgMjAwNi0wOS0xNSAwODoxNDozOVogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotDQotICA8bWVzc2FnZSBrZXk9InJlc291cmNlVHlwZS1saW5rcyI+TGlua3M8L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3N2Y0Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9saW5rcy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWlfZGUueG1sIDQ0NjU0MiAyMDA2LTA5LTE1IDA4OjE0OjM5WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0icmVzb3VyY2VUeXBlLWxpbmtzIj5MaW5rczwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQotDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MvcmVzb3VyY2VzL3NjaGVtYS9saW5rcy5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy9saW5rcy9yZXNvdXJjZXMvc2NoZW1hL2xpbmtzLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwM2ViOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9saW5rcy9yZXNvdXJjZXMvc2NoZW1hL2xpbmtzLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxlbGVtZW50IG5hbWU9ImxpbmtzIiBucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvcHVicy9kZWZhdWx0LzEuMCIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotICA8b3B0aW9uYWw+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGl0bGUiPgotICAgICAgPHRleHQvPgotICAgIDwvZWxlbWVudD4KLSAgPC9vcHRpb25hbD4KLQotICA8emVyb09yTW9yZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJsaW5rIj4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHJlZiIvPgotICAgICAgPHRleHQvPgotICAgIDwvZWxlbWVudD4KLSAgPC96ZXJvT3JNb3JlPgotCi08L2VsZW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9saW5rcy9zYW1wbGVzL2xpbmtzLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL3NhbXBsZXMvbGlua3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDkwOGU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL3NhbXBsZXMvbGlua3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPGxpbmtzIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9wdWJzL2RlZmF1bHQvMS4wIj4KLSAgPHRpdGxlPkxpbmtzPC90aXRsZT4KLSAgPGxpbmsgaHJlZj0iaHR0cDovL2xlbnlhLmFwYWNoZS5vcmciPkFwYWNoZSBMZW55YSBXZWJzaXRlPC9saW5rPgotICA8bGluayBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2xlbnlhLyI+QXBhY2hlIExlbnlhIFdpa2k8L2xpbms+Ci08L2xpbmtzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3Mvc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3Mvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDg1NWFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2xpbmtzL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54bWFwIDE3OTQ4OCAyMDA1LTA2LTAyIDAyOjI5OjM5WiBncmVnb3IgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0KLSAgICAgIDwhLS0gcGFyYW1ldHJpemVkIGRvY3R5cGUgbWF0Y2hlciAtLT4KLSAgICAgIDwhLS0gcGF0dGVybj0ie3JlbmRlcnR5cGV9IiAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi54bWwiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0ibGVueWEtZG9jdW1lbnQ6e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0sbGFuZz17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX17bGluazpyZXZ9Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2xpbmtzL3hzbHQvbGlua3MyeGh0bWwueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJyZW5kZXJ0eXBlIiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06cmVuZGVydHlwZX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJub2RlaWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1uYW1lfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbGlua3MveHNsdC9saW5rczJ4aHRtbC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9saW5rcy94c2x0L2xpbmtzMnhodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmZThkMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9saW5rcy94c2x0L2xpbmtzMnhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczpkZWZhdWx0PSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9wdWJzL2RlZmF1bHQvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLT4KLQotICA8IS0tIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlIC0tPgotICA8eHNsOnBhcmFtIG5hbWU9InJlbmRlcnR5cGUiIHNlbGVjdD0iJyciLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkZWZhdWx0OmxpbmtzIj4KLSAgICA8ZGl2IGlkPSJib2R5Ij4KLSAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGVmYXVsdDp0aXRsZSIvPjwvaDE+Ci0gICAgICA8dWw+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZGVmYXVsdDpsaW5rIi8+Ci0gICAgICA8L3VsPgotICAgIDwvZGl2PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkZWZhdWx0OmxpbmsiPgotICAgIDxsaT4KLSAgICAgIDxhIGhyZWY9IntAaHJlZn0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9hPgotICAgIDwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL2NvY29vbi14Y29uZi9hbmFseXplcl9tYW5hZ2VyLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvYW5hbHl6ZXJfbWFuYWdlci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5YzMzOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL2NvY29vbi14Y29uZi9hbmFseXplcl9tYW5hZ2VyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbiIKLSAgdW5sZXNzPSIvY29jb29uL2FuYWx5emVyX21hbmFnZXJbQGxvZ2dlciA9ICdjb3JlLnNlYXJjaC5hbmFseXplcl9tYW5hZ2VyJ10iPgotCi0JPGFuYWx5emVyX21hbmFnZXIgbG9nZ2VyPSJjb3JlLnNlYXJjaC5hbmFseXplcl9tYW5hZ2VyIj4KLQkJPGFuYWx5emVyIGlkPSJzdGFuZGFyZCIgY2xhc3M9Im9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLlN0YW5kYXJkQW5hbHl6ZXIiLz4KLQkJPGFuYWx5emVyIGlkPSJzdG9wd29yZF9lbiIgY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmFuYWx5emVyLkNvbmZpZ3VyYWJsZVN0b3B3b3JkQW5hbHl6ZXIiIGNvbmZpZ2ZpbGU9ImNvbnRleHQ6Ly9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL0VuZ2xpc2hfZW4ueG1sIiBjaGVja3VwZGF0ZT0idHJ1ZSIvPgotCQk8YW5hbHl6ZXIgaWQ9InN0b3B3b3JkX2ZyIiBjbGFzcz0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guYW5hbHl6ZXIuQ29uZmlndXJhYmxlU3RvcHdvcmRBbmFseXplciIgY29uZmlnZmlsZT0iY29udGV4dDovL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvRnJlbmNoX2ZyLnhtbCIgY2hlY2t1cGRhdGU9InRydWUiLz4KLQkJPGFuYWx5emVyIGlkPSJhbmFseXplcl9yZXNlYXJjaCIgY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmFuYWx5emVyLkNvbmZpZ3VyYWJsZVBlckZpZWxkQW5hbHl6ZXIiIGNvbmZpZ2ZpbGU9ImNvbnRleHQ6Ly9XRUItSU5GL2FuYWx5emVyL3BlcmZpZWxkY29uZi54bWwiIGNoZWNrdXBkYXRlPSJmYWxzZSIvPgotCTwvYW5hbHl6ZXJfbWFuYWdlcj4KLQkKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL2NvY29vbi14Y29uZi9kZWZhdWx0X2luZGV4ZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL2NvY29vbi14Y29uZi9kZWZhdWx0X2luZGV4ZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWUwNTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvZGVmYXVsdF9pbmRleGVyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iCi0gIHVubGVzcz0iL2NvY29vbi9kZWZhdWx0X2luZGV4ZXJbQGxvZ2dlciA9ICdjb3JlLnNlYXJjaC5kZWZhdWx0X2luZGV4ZXInXSI+Ci0KLTwhLS0gZGVmYXVsdCBpbmRleGVyIGNvbXBvbmVudCAtLT4JCi0JPGRlZmF1bHRfaW5kZXhlciBsb2dnZXI9ImNvcmUuc2VhcmNoLmRlZmF1bHRfaW5kZXhlciI+Ci0JCTwhLS0gbnVtYmVyIG9mIGx1Y2VuZSBkb2N1bWVudHMgaW4gdGhlIGJ1ZmZlciAtLT4KLQkJPGJ1ZmZlcnNpemU+MjAwPC9idWZmZXJzaXplPgotCTwvZGVmYXVsdF9pbmRleGVyPgotCQotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL2luZGV4LXBhdGgtbW9kdWxlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5kZXgtcGF0aC1tb2R1bGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjAzY2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5kZXgtcGF0aC1tb2R1bGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcyIgdW5sZXNzPSIvY29jb29uL2lucHV0LW1vZHVsZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2luZGV4LXBhdGgnXSI+Ci0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBsb2dnZXI9ImNvcmUubW9kdWxlcy5pbnB1dC5pbmRleC1wYXRoIiBuYW1lPSJpbmRleC1wYXRoIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbmRleFBhdGhNb2R1bGUiPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotICA8L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5kZXgtdXBkYXRlci54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL2luZGV4LXVwZGF0ZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjU3ZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5kZXgtdXBkYXRlci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iCi0gIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMubHVjZW5lLkluZGV4VXBkYXRlciddIj4KLSAgPCEtLSBpZi1wcm9wPSJwYXRjaC53ZWJhcHAiIC0tPgotICAKLSAgPGNvbXBvbmVudCBsb2dnZXI9Imx1Y2VuZS5pbmRleHVwZGF0ZXIiCi0gICAgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMubHVjZW5lLkluZGV4VXBkYXRlciIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMubHVjZW5lLkluZGV4VXBkYXRlckltcGwiLz4KLQkKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL2NvY29vbi14Y29uZi9pbmRleF9tYW5hZ2VyLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5kZXhfbWFuYWdlci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3MmMzOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL2NvY29vbi14Y29uZi9pbmRleF9tYW5hZ2VyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iCi0gIHVubGVzcz0iL2NvY29vbi9pbmRleF9tYW5hZ2VyW0Bsb2dnZXIgPSAnY29yZS5zZWFyY2guaW5kZXhfbWFuYWdlciddIj4KLQotCTxpbmRleF9tYW5hZ2VyIGxvZ2dlcj0iY29yZS5zZWFyY2guaW5kZXhfbWFuYWdlciI+Ci0JCQotCQk8aW5kZXhlciByb2xlPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkluZGV4ZXIvZGVmYXVsdCIgLz4KLQkJCi0JPC9pbmRleF9tYW5hZ2VyPgotCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvcGFyYWxsZWxfaW5kZXhlci54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL3BhcmFsbGVsX2luZGV4ZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWNmNTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvcGFyYWxsZWxfaW5kZXhlci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uIgotICB1bmxlc3M9Ii9jb2Nvb24vcGFyYWxsZWxfaW5kZXhlcltAbG9nZ2VyID0gJ2NvcmUuc2VhcmNoLnBhcmFsbGVsX2luZGV4ZXInXSI+Ci0KLTwhLS0gcGFyYWxsZWwgaW5kZXhlciBjb21wb25lbnQgLS0+CQkKLQk8cGFyYWxsZWxfaW5kZXhlciBsb2dnZXI9ImNvcmUuc2VhcmNoLnBhcmFsbGVsX2luZGV4ZXIiPgotCQk8IS0tIG51bWJlciBvZiB0aHJlYWQgKG5vcm1hbHkgPSBudW1iZXIgb2YgQ1BVcykgLS0+Ci0JCTxudW10aHJlYWQ+MjwvbnVtdGhyZWFkPgotCTwvcGFyYWxsZWxfaW5kZXhlcj4KLQkKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWV4dGVybmFsT3BlbnNlYXJjaC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtZXh0ZXJuYWxPcGVuc2VhcmNoLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Y3ZDgxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtZXh0ZXJuYWxPcGVuc2VhcmNoLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnbHVjZW5lLmV4dGVybmFsT3BlbnNlYXJjaCddIj4KLQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ibHVjZW5lLmV4dGVybmFsT3BlbnNlYXJjaCIgbG9nZ2VyPSJsZW55YS5sdWNlbmUiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkR1bW15VXNlY2FzZSI+Ci0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvbHVjZW5lL3VzZWNhc2VzL2x1Y2VuZS9leHRlcm5hbE9wZW5zZWFyY2guangiLz4KLSAgICAgIDxleGl0IHVzZWNhc2U9Imx1Y2VuZS5leHRlcm5hbE9wZW5zZWFyY2giLz4KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLQotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtbHVjZW5lLmluZGV4Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1sdWNlbmUuaW5kZXgueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmU3NGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1sdWNlbmUuaW5kZXgueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2x1Y2VuZS5pbmRleCddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9Imx1Y2VuZS5pbmRleCIKLSAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI9ImxlbnlhLnVzZWNhc2VzLmx1Y2VuZS1vcmcuYXBhY2hlLmxlbnlhLmNtcy5sdWNlbmUuSW5kZXhEb2N1bWVudCIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMubHVjZW5lLkluZGV4RG9jdW1lbnQiPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLQotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtbHVjZW5lLmluZGV4U2l0ZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtbHVjZW5lLmluZGV4U2l0ZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5ZTEwZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWx1Y2VuZS5pbmRleFNpdGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2x1Y2VuZS5pbmRleFNpdGUnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJsdWNlbmUuaW5kZXhTaXRlIgotICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEudXNlY2FzZXMubHVjZW5lLW9yZy5hcGFjaGUubGVueWEuY21zLmx1Y2VuZS5JbmRleFNpdGUiCi0gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmx1Y2VuZS5JbmRleFNpdGUiPgotICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9sdWNlbmUvdXNlY2FzZXMvaW5kZXhTaXRlLmp4Ii8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1vcGVuc2VhcmNoLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1vcGVuc2VhcmNoLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzNjZjQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2Utb3BlbnNlYXJjaC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2x1Y2VuZS5vcGVuc2VhcmNoJ10iPgotCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJsdWNlbmUub3BlbnNlYXJjaCIgbG9nZ2VyPSJsZW55YS5sdWNlbmUiIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkR1bW15VXNlY2FzZSI+Ci0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvbHVjZW5lL3VzZWNhc2VzL2x1Y2VuZS9vcGVuc2VhcmNoLmp4Ii8+Ci0gICAgICA8ZXhpdCB1c2VjYXNlPSJsdWNlbmUub3BlbnNlYXJjaCIvPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotICAgIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2Utc2VhcmNoLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1zZWFyY2gueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjVkYTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1zZWFyY2gueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdsdWNlbmUuc2VhcmNoJ10iPgotCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJsdWNlbmUuc2VhcmNoIiBsb2dnZXI9ImxlbnlhLmx1Y2VuZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRHVtbXlVc2VjYXNlIj4KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9sdWNlbmUvdXNlY2FzZXMvbHVjZW5lL3NlYXJjaC5qeCIvPgotICAgICAgPGV4aXQgdXNlY2FzZT0ibHVjZW5lLnNlYXJjaCIvPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9tZW51LnhzcCBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvbWVudS54c3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYTBkMTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2NvbmZpZy9tZW51LnhzcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZ2VuZXJpYy54c3AgMTU1ODA2IDIwMDUtMDMtMDEgMTc6NTU6NDJaIGFuZHJlYXMgJCAtLT4KLQotPHhzcDpwYWdlIAotICAgIGxhbmd1YWdlPSJqYXZhIiAKLSAgICB4bWxuczp4c3A9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcCIKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICAgIHhtbG5zOnVjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLT4KLQotICA8bWVudT4KLSAgICA8bWVudXM+Ci0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkZpbGUiPgotICAgICAgICA8YmxvY2sgYWRtaW49ImZhbHNlIj4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJ1c2VjYXNlZG9jdW1lbnQuY3JlYXRlIiBocmVmPSI/dXNlY2FzZT1sdWNlbmUuc2VhcmNoIj48aTE4bjp0ZXh0Pk5ldyBTZWFyY2ggUGFnZTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJsdWNlbmUuaW5kZXhTaXRlIiBocmVmPSIiPjxpMThuOnRleHQ+UmUtSW5kZXggU2l0ZTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgPC9ibG9jaz4KLSAgICAgIDwvbWVudT4KLSAgICA8L21lbnVzPgotICA8L21lbnU+Ci0gIAotPC94c3A6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1NDU1ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5sdWNlbmU8L2lkPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy51c2VjYXNlIi8+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPG5hbWU+THVjZW5lIFNlYXJjaCBNb2R1bGU8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPkx1Y2VuZSBTZWFyY2ggTW9kdWxlIGluIG9yZGVyIHRvIGFsbG93IGluZGV4aW5nIGFuZCBzZWFyY2hpbmcgd2hlbiBjb250ZW50IGlzIGJlaW5nIGNoYW5nZWQuPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9JbmRleFBhdGhNb2R1bGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvSW5kZXhQYXRoTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5Njk3YzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9JbmRleFBhdGhNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5JbmRleDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkluZGV4TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5GU0RpcmVjdG9yeTsKLQotLyoqCi0gKiBUaGlzIG1vZHVsZSByZXR1cm5zIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIHNlYXJjaCBpbmRleCBnaXZlbiBieSBpdHMgaWQsCi0gKiB3aGljaCBub3JtYWxseSBpcyAicHViaWQtYXJlYSIuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleFBhdGhNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdElucHV0TW9kdWxlIGltcGxlbWVudHMgU2VydmljZWFibGUgewotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIHNlcnZpY2VNYW5hZ2VyOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNlcnZpY2VNYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZSNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbmRleE1hbmFnZXIgPSAoSW5kZXhNYW5hZ2VyKSB0aGlzLnNlcnZpY2VNYW5hZ2VyLmxvb2t1cChJbmRleE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEluZGV4IGluZGV4ID0gaW5kZXhNYW5hZ2VyLmdldEluZGV4KG5hbWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJubyBzZWFyY2ggaW5kZXggd2l0aCBpZCBbIiArIG5hbWUgKyAiXSBmb3VuZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFsdWUgPSAoKEZTRGlyZWN0b3J5KWluZGV4LmdldERpcmVjdG9yeSgpKS5nZXRGaWxlKCkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCi0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJyZXNvbHZlZCBzZWFyY2ggaW5kZXggd2l0aCBpZCBbIiArIG5hbWUgKyAiXSB0byBkaXJlY3RvcnkgIiArIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJSZXNvbHZpbmcgYXR0cmlidXRlIFsiICsgbmFtZSArICJdIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5kZXhNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VNYW5hZ2VyLnJlbGVhc2UoaW5kZXhNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuSW5wdXRNb2R1bGUjZ2V0QXR0cmlidXRlTmFtZXMob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEF0dHJpYnV0ZU5hbWVzKENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXR0cmlidXRlVmFsdWVzKFN0cmluZyBuYW1lLCBDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSB7IGdldEF0dHJpYnV0ZShuYW1lLCBtb2RlQ29uZiwgb2JqZWN0TW9kZWwpIH07Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL0luZGV4LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvSW5kZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkNmUzMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvSW5kZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkFuYWx5emVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkluZGV4ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guZmllbGRtb2RlbC5EYXRlRmllbGREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmZpZWxkbW9kZWwuRmllbGREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4UmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5GU0RpcmVjdG9yeTsKLQotLyoqCi0gKiBJbmRleCBDbGFzcwotICogCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqLwotcHVibGljIGNsYXNzIEluZGV4IHsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgYW5hbHl6ZXIgSUQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0QW5hbHl6ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRleCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgSW5kZXhTdHJ1Y3R1cmUgc3RydWN0dXJlOwotCi0gICAgLyoqCi0gICAgICogSW5kZXggSUQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEx1Y2VuZSBEaXJlY3Rvcnkgb2YgdGhlIGluZGV4Ci0gICAgICovCi0gICAgcHJpdmF0ZSBEaXJlY3RvcnkgZGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogTnVtYmVyIG9mIHRyeSB0byBhY2Nlc3MgdG8gdGhlIGluZGV4ZXIKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBudW10cmllcyA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGUgaW5kZXhlciB3b3JraW5nIChub3QgcmVsZWFzZWQpCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluZGV4ZXJfYnVzeTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRleGVyIFJvbGUgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGluZGV4ZXJfcm9sZTsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGx1Y2VuZSBkb2N1bWVudAotICAgICAqIAotICAgICAqIEBwYXJhbSB1aWQKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGUgZG9jdW1lbnQgdWlkCi0gICAgICogQHJldHVybiBEb2N1bWVudCBhIGVtcHR5IGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFN0cmluZyB1aWQpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2MuYWRkKGNyZWF0ZUZpZWxkKEluZGV4ZXIuRE9DVU1FTlRfVUlEX0ZJRUxELCB1aWQpKTsKLSAgICAgICAgfSBjYXRjaCAoSW5kZXhFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZSBhIGx1Y2VuZSBmaWVsZAotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWVsZG5hbWUKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBmaWVsZG5hbWUgKG11c3QgZXhpc3RlZCBpbiB0aGUgaW5kZXggc3RydWN0dXJlKQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkIGNyZWF0ZUZpZWxkKFN0cmluZyBmaWVsZG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpZWxkRGVmaW5pdGlvbiBmID0gc3RydWN0dXJlLmdldEZpZWxkRGVmKGZpZWxkbmFtZSk7Ci0gICAgICAgIGlmIChmID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleEV4Y2VwdGlvbigiRmllbGQgd2l0aCB0aGUgbmFtZTogIiArIGZpZWxkbmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBleGlzdCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmLmNyZWF0ZUxGaWVsZCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3JlYXRlIGEgbHVjZW5lIGZpZWxkIGZvciBkYXRlIHZhbHVlCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpZWxkbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIGZpZWxkbmFtZSAobXVzdCBleGlzdGVkIGluIHRoZSBpbmRleCBzdHJ1Y3R1cmUpCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICBTdHJpbmcgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRmllbGQgY3JlYXRlRmllbGQoU3RyaW5nIGZpZWxkbmFtZSwgRGF0ZSB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIERhdGVGaWVsZERlZmluaXRpb24gZiA9IChEYXRlRmllbGREZWZpbml0aW9uKSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAuZ2V0RmllbGREZWYoZmllbGRuYW1lKTsKLSAgICAgICAgaWYgKGYgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4RXhjZXB0aW9uKCJGaWVsZCB3aXRoIHRoZSBuYW1lOiAiICsgZmllbGRuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGYuY3JlYXRlTEZpZWxkKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBpbmRleGVyIG9mIHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSW5kZXhFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIEluZGV4ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEluZGV4ZXIgZ2V0SW5kZXhlcigpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBudW10cmllcyAqIDEwMDA7Ci0gICAgICAgIC8vIHdhaXQgdGhlIGVuZCBvZiB0aGUgaW5kZXhpbmcKLSAgICAgICAgd2hpbGUgKGluZGV4ZXJfYnVzeSAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IGVuZFRpbWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd2FpdCgxMDAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5kZXhlcl9idXN5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaW1lb3V0IHRvIGFjY2VzcyB0byB0aGUgaW5kZXhlciAodGhlIGluZGV4ZXIgaXMgaW5kZXhpbmcpIik7Ci0gICAgICAgIH0KLSAgICAgICAgQW5hbHl6ZXJNYW5hZ2VyIGFuYWx5emVyTSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGluZGV4ZXJfYnVzeSA9IHRydWU7Ci0gICAgICAgICAgICBJbmRleGVyIGluZGV4ZXIgPSAoSW5kZXhlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChpbmRleGVyX3JvbGUpOwotCi0gICAgICAgICAgICAvLyB1cGRhdGUgbWF5YmUgdGhlIGFuYWx5emVyCi0gICAgICAgICAgICBhbmFseXplck0gPSAoQW5hbHl6ZXJNYW5hZ2VyKSB0aGlzLm1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgLmxvb2t1cChBbmFseXplck1hbmFnZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIGluZGV4ZXIuc2V0QW5hbHl6ZXIoYW5hbHl6ZXJNLmdldEFuYWx5emVyKGdldERlZmF1bHRBbmFseXplcklEKCkpKTsKLSAgICAgICAgICAgIGluZGV4ZXIuc2V0SW5kZXgoZGlyZWN0b3J5KTsKLQotICAgICAgICAgICAgcmV0dXJuIGluZGV4ZXI7Ci0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhFeGNlcHRpb24oZXgxKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleEV4Y2VwdGlvbihleDIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGFuYWx5emVyTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKGFuYWx5emVyTSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSBpbmRleGVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUluZGV4ZXIoSW5kZXhlciBpbmRleGVyKSB7Ci0gICAgICAgIGlmIChpbmRleGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGluZGV4ZXIpOwotICAgICAgICAgICAgaW5kZXhlcl9idXN5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBpbmRleCBJRAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IElECi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW5kZXggSUQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIGluZGV4IElECi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIGRlZmF1bHQgQW5hbHl6ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgZGVmYXVsdCBhbmFseXplcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEFuYWx5emVySUQoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0QW5hbHl6ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0IHRoZSBkZWZhdWx0IEFuYWx5emVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGRlZmF1bHRBbmFseXplcklECi0gICAgICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGRlZmF1bHQgQW5hbHl6ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0QW5hbHl6ZXJJRChTdHJpbmcgZGVmYXVsdEFuYWx5emVySUQpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0QW5hbHl6ZXIgPSBkZWZhdWx0QW5hbHl6ZXJJRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGluZGV4IFN0cnVjdHVyZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IFN0cnVjdHVyZQotICAgICAqLwotICAgIHB1YmxpYyBJbmRleFN0cnVjdHVyZSBnZXRTdHJ1Y3R1cmUoKSB7Ci0gICAgICAgIHJldHVybiBzdHJ1Y3R1cmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbmRleCBzdHJ1Y3R1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RydWN0dXJlCi0gICAgICogICAgICAgICAgICBJbmRleFN0cnVjdHVyZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZShJbmRleFN0cnVjdHVyZSBzdHJ1Y3R1cmUpIHsKLSAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBsdWNlbmUgZGlyZWN0b3J5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbHVjZW5lIGRpcmVjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBEaXJlY3RvcnkgZ2V0RGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbHVjZW5lIERpcmVjdG9yeQotICAgICAqIAotICAgICAqIEBwYXJhbSBkaXIKLSAgICAgKiAgICAgICAgICAgIGx1Y2VuZSBEaXJlY3RvcnkKLSAgICAgKiBAcmV0dXJuIHN1Y2Nlc3Mgb3Igbm90Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldERpcmVjdG9yeShEaXJlY3RvcnkgZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcjsKLQotICAgICAgICAvLyBpZiBpbmRleCBpcyBsb2NrZWQKLSAgICAgICAgaWYgKEluZGV4UmVhZGVyLmlzTG9ja2VkKGRpcmVjdG9yeSkpIHsKLSAgICAgICAgICAgIEluZGV4UmVhZGVyLnVubG9jayhkaXJlY3RvcnkpOwotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBpbmRleCBpZiB0aGUgaW5kZXggZG9lc24ndCBleGlzdAotICAgICAgICBpZiAoIUluZGV4UmVhZGVyLmluZGV4RXhpc3RzKGRpcmVjdG9yeSkpIHsKLSAgICAgICAgICAgIChuZXcgSW5kZXhXcml0ZXIoZGlyZWN0b3J5LCBudWxsLCB0cnVlKSkuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsb2NrZWQ7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGluZGV4IHBhdGggZGlyZWN0b3J5Ci0gICAgICogCi0gICAgICogQHBhcmFtIHBhdGgKLSAgICAgKiAgICAgICAgICAgIFN0cmluZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXREaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZnBhdGggPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgRGlyZWN0b3J5IGRpciA9IEZTRGlyZWN0b3J5LmdldERpcmVjdG9yeShmcGF0aCwgIWZwYXRoLmV4aXN0cygpKTsKLSAgICAgICAgcmV0dXJuIHNldERpcmVjdG9yeShkaXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbmRleGVyIFRoZSBpbmRleGVyIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRleGVyKFN0cmluZyBpbmRleGVyKSB7Ci0gICAgICAgIHRoaXMuaW5kZXhlcl9yb2xlID0gaW5kZXhlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvSW5kZXhFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9JbmRleEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgwNTYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9JbmRleEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUUKLSAqIDBTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAwU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2g7Ci0KLS8qKgotICogSW5kZXggRXhjZXB0aW9uIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgTmljb2xhcyBNYWlzb25uZXV2ZQotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQotICAgIHB1YmxpYyBJbmRleEV4Y2VwdGlvbihTdHJpbmcgbWVzKSB7Ci0gICAgICAgIHRoaXMobWVzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5kZXhFeGNlcHRpb24oRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIHRoaXMoIiIsIGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXMKLSAgICAgKiAgICAgICAgICAgIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXgKLSAgICAgKiAgICAgICAgICAgIGluaXRpYWwgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEluZGV4RXhjZXB0aW9uKFN0cmluZyBtZXMsIEV4Y2VwdGlvbiBleCkgewotCi0gICAgICAgIG1lc3NhZ2UgPSBtZXM7Ci0gICAgICAgIGlmIChleCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0Q2F1c2UoZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gIm1lc3NhZ2U6ICIgKyBtZXNzYWdlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL0luZGV4U3RydWN0dXJlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvSW5kZXhTdHJ1Y3R1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhNTdhOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvSW5kZXhTdHJ1Y3R1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5maWVsZG1vZGVsLkZpZWxkRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBJbmRleCBEZWZpbml0aW9uIGNsYXNzLCBjb250YWluIGFsbCB0aGUgaW5kZXggZmllbGQgZGVmaW5pdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgTmljb2xhcyBNYWlzb25uZXV2ZQotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbmRleFN0cnVjdHVyZSB7Ci0KLSAgICBwcml2YXRlIE1hcCBmaWVsZGRlZnM7Ci0KLSAgICBwdWJsaWMgSW5kZXhTdHJ1Y3R1cmUoKSB7Ci0gICAgICAgIGZpZWxkZGVmcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgLy8gQSBpbmRleCBoYXMgYWx3YXlzIGFuIFVJRCBmaWVsZAotICAgICAgICBGaWVsZERlZmluaXRpb24gZmllbGRkZWYgPSBGaWVsZERlZmluaXRpb24uY3JlYXRlKAotICAgICAgICAgICAgICAgIEluZGV4ZXIuRE9DVU1FTlRfVUlEX0ZJRUxELCBGaWVsZERlZmluaXRpb24uS0VZV09SRCk7Ci0gICAgICAgIGZpZWxkZGVmLnNldFN0b3JlKHRydWUpOwotICAgICAgICB0aGlzLmFkZEZpZWxkRGVmKGZpZWxkZGVmKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBhIGZpZWxkRGVmaW5paXRpb24gdG8gdGhlIGluZGV4RGVmaW5pdGlvbgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWVsZGRlZgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpZWxkRGVmKEZpZWxkRGVmaW5pdGlvbiBmaWVsZGRlZikgewotICAgICAgICBpZiAoZmllbGRkZWZzLmNvbnRhaW5zS2V5KGZpZWxkZGVmLm5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiBmaWVsZCB3aXRoIHRoZSBuYW1lICIKLSAgICAgICAgICAgICAgICAgICAgKyBmaWVsZGRlZi5uYW1lKCkgKyAiIGlzIGFscmVhZHkgdXNlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpZWxkZGVmcy5wdXQoZmllbGRkZWYubmFtZSgpLCBmaWVsZGRlZik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbGwgZmllbGRuYW1lcyBjb250YWluZWQgaW4gdGhlIGluZGV4Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldEZpZWxkTmFtZXMoKSB7Ci0gICAgICAgIFNldCByZXN1bHRzID0gZmllbGRkZWZzLmtleVNldCgpOwotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybiBhbGwgZmllbGREZWZpbml0aW9ucwotICAgICAqIAotICAgICAqIEByZXR1cm4gRmllbGREZWZpbml0aW9uW10KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgRmllbGREZWZpbml0aW9uW10gZ2V0RmllbGREZWYoKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gcmVzdWx0cyA9IGZpZWxkZGVmcy52YWx1ZXMoKTsKLSAgICAgICAgcmV0dXJuIChGaWVsZERlZmluaXRpb25bXSkgcmVzdWx0cy50b0FycmF5KG5ldyBGaWVsZERlZmluaXRpb25bcmVzdWx0cwotICAgICAgICAgICAgICAgIC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGZpZWxkRGVmaW5pdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSBuYW1lCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpZWxkbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZERlZmluaWF0aW9uCi0gICAgICogQHJldHVybiBGaWVsZERlZmluaXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgRmllbGREZWZpbml0aW9uIGdldEZpZWxkRGVmKFN0cmluZyBmaWVsZG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChGaWVsZERlZmluaXRpb24pIGZpZWxkZGVmcy5nZXQoZmllbGRuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjaGVjayBpZiB0aGlzIGZpZWxkIGV4aXN0Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCdzIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBmaWVsZCB3aXRoIHRoaXMgbmFtZSBleGlzdAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0ZpZWxkKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZGRlZnMuY29udGFpbnNLZXkobmFtZS5pbnRlcm4oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkRvY3VtZW50RmFjdG9yeToiKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IHRoaXMuZmllbGRkZWZzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgRmllbGREZWZpbml0aW9uIGl0ZW0gPSAoRmllbGREZWZpbml0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIikuYXBwZW5kKGl0ZW0udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2FuYWx5emVyL0NvbmZpZ3VyYWJsZUFuYWx5emVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvYW5hbHl6ZXIvQ29uZmlndXJhYmxlQW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlOTZhNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvYW5hbHl6ZXIvQ29uZmlndXJhYmxlQW5hbHl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmFuYWx5emVyOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuQW5hbHl6ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLnV0aWxzLlNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOwotCi0vKioKLSAqIEFuYWx5emVyIFdyYXBwZXIgdG8gYWxsb3cgdG8gY29uZmlndXJlIGEgbHVjZW5lIGFuYWx5emVyIHdpdGggYSBYTUwgZmlsZQotICogCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbmZpZ3VyYWJsZUFuYWx5emVyIGV4dGVuZHMgQW5hbHl6ZXIgaW1wbGVtZW50cwotICAgICAgICBMb2dFbmFibGVkIHsKLQotICAgIC8qKgotICAgICAqIHRoZSBsdWNlbmUgYW5hbHl6ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQW5hbHl6ZXIgYW5hbHl6ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBhIGxvZ2dlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0gICAgLyoqCi0gICAgICogdGhlIGFuYWx5emVyIG1hbmFnZXIgY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEFuYWx5emVyTWFuYWdlciBhbmFseXplck07Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBjb25maWcgZmlsZSBvciBub3QgKHRvIHVwZGF0ZSB0aGUgYW5hbHl6ZXIgaWYgdGhlIGNvbmZpZyBmaWxlCi0gICAgICogY2hhbmdlcykKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDb25maWdGaWxlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmF0aW9uIGZpbGUgc291cmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTb3VyY2UgY29uZmlnRmlsZTsKLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSB0aGlzIGFuYWx5emVyLiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNyZWNvbmZpZ3VyZSgpIG1ldGhvZAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXIjdG9rZW5TdHJlYW0oamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEuaW8uUmVhZGVyKQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBUb2tlblN0cmVhbSB0b2tlblN0cmVhbShTdHJpbmcgZmllbGROYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIHJldHVybiBhbmFseXplci50b2tlblN0cmVhbShmaWVsZE5hbWUsIHJlYWRlcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ0VuYWJsZWQjZW5hYmxlTG9nZ2luZyhvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVMb2dnaW5nKExvZ2dlciBsb2cpIHsKLSAgICAgICAgbG9nZ2VyID0gbG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSB0aGUgY2hlY2sgb2YgdGhlIGNvbmZpZyBmaWxlICh0byB1cGRhdGUgdGhlIGFuYWx5emVyIGlmIHRoZSBjb25maWcKLSAgICAgKiBmaWxlIGNoYW5nZXMpIHdoZW4gdGhlIG1ldGhvZAotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50LnNlYXJjaC5jb21wb25lbnRzLkFuYWx5emVyTWFuYWdlciNnZXRBbmFseXplcihTdHJpbmcpCi0gICAgICogICAgICBpcyBjYWxsZWQKLSAgICAgKiBAcGFyYW0gY2hlY2sKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgd2Ugd2FudCB0aGF0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlQ2hlY2tGaWxlKGJvb2xlYW4gY2hlY2spIHsKLSAgICAgICAgdGhpcy5jaGVja0NvbmZpZ0ZpbGUgPSBjaGVjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGUgY2hlY2tGaWxlIHByb3BlcnR5IGVuYWJsZSA/Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZW5hYmxlQ2hlY2tGaWxlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jaGVja0NvbmZpZ0ZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVjb25maWd1cmUgdGhlIGFuYWx5emVyIGlmIHRoZSBjb25maWcgZmlsZSBoYXMgY2hhbmdlZAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBhbmFseXplciBpcyByZWNvbmZpZ3VyZWQgKD1maWxlIGhhcyBjaGFuZ2VkKQotICAgICAqICAgICAgICAgZWxzZSBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlY29uZmlndXJlKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoIVNvdXJjZUhlbHBlci5jaGVja1NvdXJjZVZhbGlkaXR5KGNvbmZpZ0ZpbGUpKSB7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygicmVjb25maWd1cmF0aW9uIG9mICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiAodGhlIHNvdXJjZSAiICsgY29uZmlnRmlsZS5nZXRVUkkoKQotICAgICAgICAgICAgICAgICAgICArICIgaGFzIGNoYW5nZWQuLi4pICAiKTsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IFNvdXJjZUhlbHBlci5idWlsZChjb25maWdGaWxlKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyZShjb25mKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogICAgICAgICAgICBTb3VyY2UgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZShTb3VyY2Ugc291cmNlKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29uZmlnRmlsZSA9IHNvdXJjZTsKLSAgICAgICAgU291cmNlSGVscGVyLnJlZ2lzdGVyU291cmNlKGNvbmZpZ0ZpbGUpOwotICAgICAgICBjb25maWd1cmUoU291cmNlSGVscGVyLmJ1aWxkKGNvbmZpZ0ZpbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgdGhlIGFuYWx5emVyTWFuYWdlcgotICAgICAqIAotICAgICAqIEBwYXJhbSBhbmFseXplck0KLSAgICAgKiAgICAgICAgICAgIEFuYWx5emVyTWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuYWx5ZXJNYW5hZ2VyKEFuYWx5emVyTWFuYWdlciBhbmFseXplck0pIHsKLSAgICAgICAgdGhpcy5hbmFseXplck0gPSBhbmFseXplck07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvYW5hbHl6ZXIvQ29uZmlndXJhYmxlUGVyRmllbGRBbmFseXplci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2FuYWx5emVyL0NvbmZpZ3VyYWJsZVBlckZpZWxkQW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzNmQ2OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvYW5hbHl6ZXIvQ29uZmlndXJhYmxlUGVyRmllbGRBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guYW5hbHl6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuUGVyRmllbGRBbmFseXplcldyYXBwZXI7Ci0KLS8qKgotICogQ29uZmlndXJhYmxlIFBlckZpZWxkQW5hbHl6ZXJXcmFwcGVyLiBBbGxvdyBvbmUgYW5hbHl6ZXIgcGVyIGZpZWxkIGZvcgotICogaW5kZXhpbmcgYSBkb2N1bWVudCAodXNlZnVsIGZvciBtdWx0aWxhbmd1YWdlIGRvY3VtZW50KQotICogCi0gKiAoQGxpbmsgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuUGVyRmllbGRBbmFseXplcldyYXBwZXIgY2xhc3MpCi0gKiAKLSAqIAotICogQSBjb25maWcgZmlsZSBmb3IgdGhpcyBhbmFseXplciBpczoKLSAqIAotICogPCEtLSBpZiBhIGx1Y2VuZSBkb2N1bWVudCBjb250YWluaW5nIGEgZmllbGQgbm90IHByZXNlbnQgaW4gdGhlICJmaWVsZCIgdGFncywKLSAqIHRoZSBkZWZhdWx0QW5hbHl6ZXIgd291bGQgYmUgdXNlZCAtLT4gPGNvbmZpZyBkZWZhdWx0QW5hbHl6ZXI9ImFuYWx5emVyRU4iPgotICogPGZpZWxkcz48IS0tIGlmIGEgbHVjZW5lIGRvY3VtZW50IGNvbnRhaW5zIHRoZSBmaWVsZCAic3VtbXVyeSIgLCB0aGUKLSAqIGFuYWx5emVyICJhbmFseXplckVOIiB3b3VsZCBiZSB1c2VkIC0tPiA8ZmllbGQgbmFtZT0ic3VtbXVyeSIKLSAqIGFuYWx5emVyPSJhbmFseXplckVOIi8+IDxmaWVsZCBuYW1lPSJkZXNjX2ZyIiBhbmFseXplcj0iYW5hbHl6ZXJGUiIvPiA8ZmllbGQKLSAqIG5hbWU9ImRlc2NfZW4iIGFuYWx5emVyPSJhbmFseXplckVOIi8+IDxmaWVsZCBuYW1lPSJkZXNjX2RlIgotICogYW5hbHl6ZXI9ImFuYWx5emVyREUiLz4gPC9maWVsZHM+IDwvY29uZmlnPgotICogCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYWJsZVBlckZpZWxkQW5hbHl6ZXIgZXh0ZW5kcyBDb25maWd1cmFibGVBbmFseXplciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfREVGQVVMVEFOQUxZWkVSX0FUVFJJQlVURSA9ICJkZWZhdWx0QW5hbHl6ZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERTX0VMRU1FTlQgPSAiZmllbGRzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0VMRU1FTlQgPSAiZmllbGQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BTkFMWVpFUklEX0FUVFJJQlVURSA9ICJhbmFseXplciI7Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmFuYWx5emVyLkNvbmZpZ3VyYWJsZUFuYWx5emVyI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGFuYWx5emVyaWQgPSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShDT05GSUdfREVGQVVMVEFOQUxZWkVSX0FUVFJJQlVURSk7Ci0KLSAgICAgICAgQW5hbHl6ZXIgYW5hbHl6ZXIgPSBhbmFseXplck0uZ2V0QW5hbHl6ZXIoYW5hbHl6ZXJpZCk7Ci0gICAgICAgIGlmIChhbmFseXplciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiYW5hbHl6ZXIgIiArIGFuYWx5emVyaWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgZXhpc3QiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBlckZpZWxkQW5hbHl6ZXJXcmFwcGVyIHRtcGFuYWx5emVyID0gbmV3IFBlckZpZWxkQW5hbHl6ZXJXcmFwcGVyKAotICAgICAgICAgICAgICAgIGFuYWx5emVyKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbltdIGNvbmZmaWVsZCA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGQoRklFTERTX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgLmdldENoaWxkcmVuKEZJRUxEX0VMRU1FTlQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmZpZWxkLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyBmaWVsZG5hbWUgPSBjb25mZmllbGRbaV0uZ2V0QXR0cmlidXRlKEZJRUxEX05BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGFuYWx5emVyaWQgPSBjb25mZmllbGRbaV0uZ2V0QXR0cmlidXRlKEZJRUxEX0FOQUxZWkVSSURfQVRUUklCVVRFKTsKLQotICAgICAgICAgICAgaWYgKGZpZWxkbmFtZSA9PSBudWxsIHx8IGZpZWxkbmFtZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oImVsZW1lbnQgIiArIEZJRUxEX0VMRU1FTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtdXN0IGhhdmUgdGhlICIgKyBGSUVMRF9OQU1FX0FUVFJJQlVURQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFuYWx5emVyaWQgPT0gbnVsbCB8fCBhbmFseXplcmlkLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiZWxlbWVudCAiICsgRklFTERfRUxFTUVOVAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgaGF2ZSB0aGUgIiArIEZJRUxEX0FOQUxZWkVSSURfQVRUUklCVVRFCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgYXR0cmlidXRlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFuYWx5emVyID0gYW5hbHl6ZXJNLmdldEFuYWx5emVyKGFuYWx5emVyaWQpOwotCi0gICAgICAgICAgICBpZiAoYW5hbHl6ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJhbmFseXplciAiICsgYW5hbHl6ZXJpZAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgZXhpc3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcGFuYWx5emVyLmFkZEFuYWx5emVyKGZpZWxkbmFtZSwgYW5hbHl6ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuYW5hbHl6ZXIgPSB0bXBhbmFseXplcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9hbmFseXplci9Db25maWd1cmFibGVTdG9wd29yZEFuYWx5emVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvYW5hbHl6ZXIvQ29uZmlndXJhYmxlU3RvcHdvcmRBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY1ZjY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9hbmFseXplci9Db25maWd1cmFibGVTdG9wd29yZEFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmFuYWx5emVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLlN0YW5kYXJkQW5hbHl6ZXI7Ci0KLS8qKgotICogQ29uZmlndXJhYmxlIFN0b3B3b3JkIEFuYWx5emVyCi0gKiAKLSAqIENvbmZpZyBmaWxlOgotICogCi0gKiA8c3RvcFdvcmRzPjxzdG9wV29yZD5hIDwvc3RvcFdvcmQ+IDxzdG9wV29yZD50aGUgPC9zdG9wV29yZD4gPHN0b3BXb3JkPmJ1dAotICogPC9zdG9wV29yZD4gPC9zdG9wV29yZHM+Ci0gKiAKLSAqIEBhdXRob3IgTmljb2xhcyBNYWlzb25uZXV2ZQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlU3RvcHdvcmRBbmFseXplciBleHRlbmRzIENvbmZpZ3VyYWJsZUFuYWx5emVyIHsKLQotICAgIC8qKiBUaGUgZWxlbWVudCBjb250YWluaW5nIGEgc3RvcCB3b3JkLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9QX1dPUkRfRUxFTUVOVCA9ICJzdG9wd29yZCI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoZSBhbmFseXplci4oc3RvcCB3b3JkcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSB3b3JkcyA9IHN0b3BUYWJsZUJ1aWxkZXIoY29uZmlndXJhdGlvbik7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJzdG9wIHdvcmRzIG51bWJlcjogIiArIHdvcmRzLmxlbmd0aCk7Ci0gICAgICAgIGFuYWx5emVyID0gbmV3IFN0YW5kYXJkQW5hbHl6ZXIod29yZHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIFN0b3AgVGFibGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uZgotICAgICAqICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlIChhYm92ZSB0aGUgU1RPUF9XT1JEUyBFTEVNRU5UKQotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgICAqIEByZXR1cm4gU3RyaW5nW10gYXJyYXkgd2l0aCBhbGwgZXhjbHVkZWQgd29yZHMKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZ1tdIHN0b3BUYWJsZUJ1aWxkZXIoQ29uZmlndXJhdGlvbiBjb25mKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIENvbmZpZ3VyYXRpb25bXSBjU3RvcHMgPSBjb25mLmdldENoaWxkcmVuKFNUT1BfV09SRF9FTEVNRU5UKTsKLSAgICAgICAgaWYgKGNTdG9wcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSB3b3JkcyA9IG5ldyBTdHJpbmdbY1N0b3BzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNTdG9wcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHdvcmRzW2ldID0gY1N0b3BzW2ldLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gd29yZHM7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSB3b3JkcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIHJldHVybiB3b3JkczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL0FuYWx5emVyTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvQW5hbHl6ZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjM3YjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvQW5hbHl6ZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXI7Ci0KLS8qKgotICogQW5hbHl6ZXIgTWFuYWdlciBDb21wb25lbnQKLSAqIAotICogQGF1dGhvciBNYWlzb25uZXV2ZSBOaWNvbGFzCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBBbmFseXplck1hbmFnZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRSA9IEFuYWx5emVyTWFuYWdlci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFuYWx5emVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICBhbmFseXplciBJRAotICAgICAqIEByZXR1cm4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyCi0gICAgICovCi0gICAgcHVibGljIEFuYWx5emVyIGdldEFuYWx5emVyKFN0cmluZyBpZCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGlzIGFuYWx5emVyIGV4aXN0Ci0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICBTdHJpbmcgdGhlIGFuYWx5emVyIGlkCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3QoU3RyaW5nIGlkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbGwgYW5hbHl6ZXIgSURzCi0gICAgICogCi0gICAgICogQHJldHVybiBBIGFycmF5IHdpdGggYWxsIGlkJ3MgYW5hbHl6ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QW5hbHl6ZXJzSUQoKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhIGx1Y2VuZSBhbmFseXNlcgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBhbmFseXplcgotICAgICAqIEBwYXJhbSBhbmFseXplcgotICAgICAqICAgICAgICAgICAgdGhlIGFuYWx5emVyIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgaWQsIEFuYWx5emVyIGFuYWx5emVyKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIGFuYWx5emVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgYW5hbHl6ZXIgSUQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGlkKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL0luZGV4TWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvSW5kZXhNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODMxMzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvSW5kZXhNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLkluZGV4OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLkluZGV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci0KLS8qKgotICogSW5kZXggTWFuYWdlciBDbGFzcyBhbGxvdyB0byByZWdpc3RlciBhbmQgYWNjZXNzIHRvIGEgc3BlY2lmaWMgaW5kZXgKLSAqIAotICogQGF1dGhvciBNYWlzb25uZXV2ZSBOaWNvbGFzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhNYW5hZ2VyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEUgPSBJbmRleE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCBpbmRleGVzCi0gICAgICogCi0gICAgICogQHJldHVybiBBcnJheSBvZiBpbmRleGVzCi0gICAgICovCi0gICAgcHVibGljIEluZGV4W10gZ2V0SW5kZXgoKSB0aHJvd3MgSW5kZXhFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGluZGV4IHdpdGggdGhlIGlkCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggSUQKLSAgICAgKiBAcmV0dXJuIGwnaW5kZXgsIG51bGwgaWYgbm8gZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5kZXggZ2V0SW5kZXgoU3RyaW5nIGlkKSB0aHJvd3MgSW5kZXhFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBhZGQgYSBpbmRleCBpbiB0aGUgaW5kZXhtYW5hZ2VyCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSW5kZXgoSW5kZXggaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlIGEgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIElEIGRlIGwnaW5kZXgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGlkKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBpbmRleCBleGlzdAotICAgICAqIAotICAgICAqIEBwYXJhbSBpZAotICAgICAqICAgICAgICAgICAgSUQgZGUgbCdpbmRleAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW5kZXggZXhpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgaWQpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgaW5kZXhlcyBmcm9tIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUgdG8gdGhlIGluZGV4IG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGNvbmZTb3VyY2UKLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJbmRleGVzKFNvdXJjZSBjb25mU291cmNlKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL0luZGV4ZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL0luZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiMWRkMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9JbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5JbmRleEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFID0gSW5kZXhlci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgbHVjZW5lIGRvY3VtZW50cyBtdXN0IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciBmaWVsZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1VJRF9GSUVMRCA9ICJ1aWQiOwotCi0gICAgLyoqCi0gICAgICogSW5kZXggZG9jdW1lbnQgKHVwZGF0ZSBvciBhZGQgaWYge0BsaW5rICNjbGVhckluZGV4KCl9IGlzIGNhbGxlZCBiZWZvcmUpCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqICAgICAgICAgICAgRG9jdW1lbnQKLSAgICAgKiBAdGhyb3dzIEluZGV4RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5kZXgoRG9jdW1lbnQgZG9jKSB0aHJvd3MgSW5kZXhFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgZG9jdW1lbnQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdWlkCi0gICAgICogICAgICAgICAgICB0aGUgdWlkIG9mIHRoZSBkb2N1bWVudAotICAgICAqIEByZXR1cm4gaW50IHRoZSBudW1iZXIgb2YgZGVsZXRlZCBkb2N1bWVudHMKLSAgICAgKiBAdGhyb3dzIEluZGV4RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBkZWwoU3RyaW5nIHVpZCkgdGhyb3dzIEluZGV4RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogT3B0aW1pemUgdGhlIGluZGV4Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3B0aW1pemUoKSB0aHJvd3MgSW5kZXhFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBsdWNlbmUgYW5hbHl6ZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5hbHl6ZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBhbmFsYXplcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuYWx5emVyKEFuYWx5emVyIGFuYWx5emVyKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbHVjZW5lIGFuYWx5emVyCi0gICAgICovCi0gICAgcHVibGljIEFuYWx5emVyIGdldEFuYWx5emVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBtZXJnZSBmYWN0b3IgdmFsdWUgKyBzZXQgbWluTWVyZ2VEb2NzPTIqbWVyZ2VGYWN0b3IgKHNlZSBsdWNlbmUKLSAgICAgKiBkb2NzKQotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBtZXJnZSBmYWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXJnZUZhY3RvcihpbnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWVyZ2VGYWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1lcmdlRmFjdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBjbGVhciB0aGUgaW5kZXgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhckluZGV4KCkgdGhyb3dzIEluZGV4RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbmRleCBkaXJlY3RvcnkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlyZWN0b3J5Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5kZXgoRGlyZWN0b3J5IGRpcmVjdG9yeSkgdGhyb3dzIEluZGV4RXhjZXB0aW9uOwotCi0gICAgcHVibGljIERpcmVjdG9yeSBnZXRJbmRleCgpIHRocm93cyBJbmRleEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL1NlYXJjaGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9TZWFyY2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODEwY2M5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL1NlYXJjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5IaXRzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7Ci0KLS8qKgotICogdGhpcyBTZWFyY2hlciBDb21wb25lbnQgYWxsb3dzOiA8YnIvPiAtIHNlYXJjaGluZyBpbiBzZXZlcmFsIGluZGV4ZXMgPGJyLz4gLSBzb3J0aW5nIGhpdHMgYnkgYQotICogc3BlY2lmaWVkIGZpZWxkIGFuZCBvcmRlcgotICogCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWFyY2hlciB7Ci0gICAgLyoqCi0gICAgICogVGhlIFJPTEUgbmFtZSBvZiB0aGlzIGF2YWxvbiBjb21wb25lbnQuCi0gICAgICogPHA+Ci0gICAgICogSXRzIHZhbHVlIGlmIHRoZSBGUU4gb2YgdGhpcyBpbnRlcmZhY2UsIGllLgotICAgICAqIDxjb2RlPm9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLlNlYXJjaGVyPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHNpbmNlCi0gICAgICovCi0gICAgU3RyaW5nIFJPTEUgPSBTZWFyY2hlci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBsdWNlbmUgZGlyZWN0b3J5IC0tIHlvdSBjYW4gYWRkIHNldmVyYWwgZGlyZWN0b3JpZXMKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGlyZWN0b3J5IHNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IHVzZWQgZm9yIGxvb2tpbmcgdXAgdGhlIGluZGV4LiBJdCBkZWZpbmVzIHRoZSBwaHlzaWNhbAotICAgICAqIHBsYWNlIG9mIHRoZSBpbmRleAotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IFRoZSBuZXcgZGlyZWN0b3J5IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KERpcmVjdG9yeSBkaXJlY3RvcnkpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmaWVsZCBieSB3aGljaCB0aGUgc2VhcmNoIHJlc3VsdHMgYXJlIHRvIGJlIHNvcnRlZAotICAgICAqIEBwYXJhbSBmaWVsZCB0aGUgaW5kZXggZmllbGQKLSAgICAgKiBAcGFyYW0gcmV2ZXJzZSByZXZlcnNlIG9yZGVyIG9yIG5vdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvcnRGaWVsZChTdHJpbmcgZmllbGQsIGJvb2xlYW4gcmV2ZXJzZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggdXNpbmcgYSBMdWNlbmUgUXVlcnkgb2JqZWN0LCByZXR1cm5pbmcgemVybywgb3IgbW9yZSBoaXRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBxdWVyeSBBIGx1Y2VuZSBxdWVyeQotICAgICAqIEByZXR1cm4gSGl0cyB6ZXJvIG9yIG1vcmUgaGl0cyBtYXRjaGluZyB0aGUgcXVlcnkgc3RyaW5nCi0gICAgICogQGV4Y2VwdGlvbiBQcm9jZXNzaW5nRXhjZXB0aW9uIHRocm93aW5nIGR1ZSB0byBwcm9jZXNzaW5nIGVycm9ycyB3aGlsZSBsb29raW5nIHVwIHRoZSBpbmRleAotICAgICAqICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgcGFyc2luZyB0aGUgcXVlcnkgc3RyaW5nLCBnZW5lcmF0aW5nIHRoZSBoaXRzLgotICAgICAqLwotICAgIHB1YmxpYyBIaXRzIHNlYXJjaChRdWVyeSBxdWVyeSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9pbXBsL0Fic3RyYWN0SW5kZXhlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvaW1wbC9BYnN0cmFjdEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiNTdjMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9pbXBsL0Fic3RyYWN0SW5kZXhlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5wb29sLlJlY3ljbGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guSW5kZXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4UmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OwotCi0vKioKLSAqIEFic3RyYWN0IEluZGV4ZXIKLSAqIAotICogQGF1dGhvciBOaWNvbGFzIE1haXNvbm5ldXZlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluZGV4ZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cwotICAgICAgICBJbmRleGVyLCBSZWN5Y2xhYmxlIHsKLQotICAgIC8qKgotICAgICAqIHRoZSBsdWNlbmUgQW5hbHl6ZXIgKHNlZSBsdWNlbmUgZG9jKQotICAgICAqLwotICAgIHByb3RlY3RlZCBBbmFseXplciBhbmFseXplcjsKLQotICAgIC8qKgotICAgICAqIGx1Y2VuZSBEaXJlY3RvcnkgKHNlZSBsdWNlbmUgZG9jKQotICAgICAqLwotICAgIHByb3RlY3RlZCBEaXJlY3RvcnkgZGlyOwotCi0gICAgLyoqCi0gICAgICogTWVyZ2VGYWN0b3IgKHNlZSBsdWNlbmUgZG9jKQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgbWVyZ2VGYWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBjbGVhciBtb2RlIChpZiB0cnVlIHRoZSBpbmRleCB3aWxsIGJlIGNsZWFyZWQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2xlYXJfbW9kZTsKLQotICAgIC8vIHJ1bnRpbWUgdmFyaWFibGVzOiBsdWNlbmUgaW5kZXh3cml0ZXIgYW5kIGluZGV4cmVhZGVyCi0gICAgcHJvdGVjdGVkIEluZGV4UmVhZGVyIGRlbGV0ZV9yZWFkZXI7Ci0KLSAgICBwcm90ZWN0ZWQgSW5kZXhXcml0ZXIgYWRkX3dyaXRlcjsKLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleGVyI3NldE1lcmdlRmFjdG9yKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXJnZUZhY3RvcihpbnQgdmFsdWUpIHsKLSAgICAgICAgbWVyZ2VGYWN0b3IgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlciNnZXRNZXJnZUZhY3RvcigpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNZXJnZUZhY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIG1lcmdlRmFjdG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleGVyI2dldEluZGV4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRGlyZWN0b3J5IGdldEluZGV4KCkgewotICAgICAgICByZXR1cm4gdGhpcy5kaXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkluZGV4ZXIjc2V0SW5kZXgob3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluZGV4KERpcmVjdG9yeSBkaXIpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2V0IGEgbnVsbCBkaXJlY3RvcnkiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmRpciA9IGRpcjsKLSAgICAgICAgY2xlYXJfbW9kZSA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5kZXhSZWFkZXIgcmVhZGVyID0gSW5kZXhSZWFkZXIub3BlbihkaXIpOwotICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAvLyBjb3VsZG4ndCBvcGVuIHRoZSBpbmRleCAtIHNvIHJlY3JlYXRlIGl0Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNXYXJuRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkud2FybigiY291bGRuJ3Qgb3BlbiB0aGUgaW5kZXggLSBzbyByZWNyZWF0ZSBpdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5jbGVhckluZGV4KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlciNzZXRBbmFseXplcihvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbmFseXplcihBbmFseXplciBhbmFseXplcikgewotICAgICAgICBpZiAoYW5hbHl6ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2V0IGEgbnVsbCBhbmFseXplciIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuYW5hbHl6ZXIgPSBhbmFseXplcjsKLQotICAgICAgICBpZiAodGhpcy5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICB0aGlzLmdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAic2V0IHRoZSBhbmFseXplciAiICsgdGhpcy5hbmFseXplci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlciNnZXRBbmFseXplcigpCi0gICAgICovCi0gICAgcHVibGljIEFuYWx5emVyIGdldEFuYWx5emVyKCkgewotICAgICAgICByZXR1cm4gYW5hbHl6ZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdXBkYXRlRG9jdW1lbnQoRG9jdW1lbnQgZG9jKSB0aHJvd3MgSW5kZXhFeGNlcHRpb247Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGREb2N1bWVudChEb2N1bWVudCBkb2MpIHRocm93cyBJbmRleEV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleGVyI2luZGV4KG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluZGV4KERvY3VtZW50IGRvYykgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuY2xlYXJfbW9kZSkgewotICAgICAgICAgICAgLy8gQXMgd2Uga25vdyB0aGUgaW5kZXggaXMgZW1wdHkgLCB3ZSBqdXN0IGFkZCB0aGUgZG9jdW1lbnQKLSAgICAgICAgICAgIGFkZERvY3VtZW50KGRvYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1cGRhdGVEb2N1bWVudChkb2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkluZGV4ZXIjZGVsKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGludCBkZWwoU3RyaW5nIHVpZCkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgc3dpdGNoVG9ERUxfTU9ERSgpOwotICAgICAgICByZXR1cm4gZGVsZXRlRG9jdW1lbnQoZGVsZXRlX3JlYWRlciwgdWlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgZG9jdW1lbnQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVsZXRlcgotICAgICAqICAgICAgICAgICAgdGhlIGx1Y2VuZSBpbmRleHJlYWRlciB0byBkZWxldGUgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gdWlkCi0gICAgICogICAgICAgICAgICB0aGUgdWlkIG9mIHRoZSBkb3VjbWVudCB0byBiZSBkZWxldGVkCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRlbGV0ZWQgZG9jdW1lbnRzCi0gICAgICogQHRocm93cyBJbmRleEV4Y2VwdGlvbgotICAgICAqLwotICAgIGZpbmFsIHByb3RlY3RlZCBpbnQgZGVsZXRlRG9jdW1lbnQoSW5kZXhSZWFkZXIgZGVsZXRlciwgU3RyaW5nIHVpZCkKLSAgICAgICAgICAgIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByID0gMDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHIgPSBkZWxldGVyLmRlbGV0ZShuZXcgVGVybShET0NVTUVOVF9VSURfRklFTEQsIHVpZCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaGFuZGxlRXJyb3IoImRlbGV0ZSBkb2N1bWVudCAodWlkOiIgKyB1aWQgKyAiKSBlcnJvciIsIGV4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICB0aGlzLmdldExvZ2dlcigpLmRlYnVnKCJkb2N1bWVudCBkZWxldGVkICh1aWQ6IiArIHVpZCArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGRvY3VtZW50IHRvIHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBsdWNlbmUgaW5kZXh3cml0ZXIKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0byBiZSBpbmRleGVkCi0gICAgICogQHRocm93cyBJbmRleEV4Y2VwdGlvbgotICAgICAqLwotICAgIGZpbmFsIHByb3RlY3RlZCB2b2lkIGFkZERvY3VtZW50KEluZGV4V3JpdGVyIHdyaXRlciwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvY3VtZW50LCBhbmFseXplcik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBoYW5kbGVFcnJvcigiYWRkIGRvY3VtZW50ICAodWlkOiIKLSAgICAgICAgICAgICAgICAgICAgKyBkb2N1bWVudC5nZXQoRE9DVU1FTlRfVUlEX0ZJRUxEKSArICIpIGVycm9yIiwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHRoaXMuZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJkb2N1bWVudCBhZGRlZCAodWlkOiIgKyBkb2N1bWVudC5nZXQoRE9DVU1FTlRfVUlEX0ZJRUxEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleGVyI29wdGltaXplKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvcHRpbWl6ZSgpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG9wdGltaXplIGluZGV4Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnN3aXRjaFRvQUREX01PREUoZmFsc2UpOwotICAgICAgICAgICAgYWRkX3dyaXRlci5vcHRpbWl6ZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4RXhjZXB0aW9uKCJvcHRpbWl6YXRpb24gZXJyb3IiLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlciNjbGVhckluZGV4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhckluZGV4KCkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jbGVhcl9tb2RlID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5zd2l0Y2hUb0FERF9NT0RFKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlbGVhc2luZyByZXNvdXJjZXMKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEluZGV4RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVsZWFzZSgpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY2xvc2VXcml0ZXIoKTsKLSAgICAgICAgdGhpcy5jbG9zZVJlYWRlcigpOwotICAgICAgICAvLyBzZXQgZGVmYXVsdCB2YWx1ZQotICAgICAgICBkaXIgPSBudWxsOwotICAgICAgICBhbmFseXplciA9IG51bGw7Ci0gICAgICAgIG1lcmdlRmFjdG9yID0gMTA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVjeWxjbGUgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVsZWFzZSgpOwotICAgICAgICB9IGNhdGNoIChJbmRleEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5lcnJvcigicmVjeWNsZSBlcnJvciIsIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN3aXRjaCB0byB3cml0ZSBtb2RlIChjbG9zZSByZWFkLCBvcGVuIHdyaXRlciApIGlmIGl0J3Mgbm90IGFscmVhZHkgZG9uZQotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGVhcgotICAgICAqICAgICAgICAgICAgY2xlYXIgaW5kZXgKLSAgICAgKiBAdGhyb3dzIEluZGV4RXhjZXB0aW9uCi0gICAgICovCi0gICAgZmluYWwgcHJvdGVjdGVkIHZvaWQgc3dpdGNoVG9BRERfTU9ERShib29sZWFuIGNsZWFyKSB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotICAgICAgICBpZiAoYWRkX3dyaXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbG9zZVJlYWRlcigpOwotICAgICAgICAgICAgb3BlbkluZGV4V3JpdGVyKGNsZWFyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN3aXRjaCB0byBkZWwgbW9kZSAoY2xvc2Ugd3JpdGVyLCBvcGVuIHJlYWRlciApIGlmIGl0J3Mgbm90IGFscmVhZHkgZG9uZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSW5kZXhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBmaW5hbCBwcm90ZWN0ZWQgdm9pZCBzd2l0Y2hUb0RFTF9NT0RFKCkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRlbGV0ZV9yZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xvc2VXcml0ZXIoKTsKLSAgICAgICAgICAgIG9wZW5JbmRleFJlYWRlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiB0aGUgaW5kZXggV3JpdGVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGNyZWF0ZQotICAgICAqICAgICAgICAgICAgY2xlYXIgaW5kZXggb3Igbm90Ci0gICAgICogQHRocm93cyBJbmRleEV4Y2VwdGlvbgotICAgICAqLwotICAgIGZpbmFsIHByb3RlY3RlZCB2b2lkIG9wZW5JbmRleFdyaXRlcihib29sZWFuIGNyZWF0ZSkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBub3cgb3BlbiB3cml0ZXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZF93cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBhbmFseXplciwgY3JlYXRlKTsKLSAgICAgICAgICAgIC8vIGFkZF93cml0ZXIuc2V0VXNlQ29tcG91bmRGaWxlKHRydWUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhFeGNlcHRpb24oIm9wZW4gd3JpdGVyIGVycm9yIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVyZ2VGYWN0b3IgPiBhZGRfd3JpdGVyLm1lcmdlRmFjdG9yKSB7Ci0gICAgICAgICAgICBhZGRfd3JpdGVyLm1pbk1lcmdlRG9jcyA9IG1lcmdlRmFjdG9yICogMjsKLSAgICAgICAgICAgIGFkZF93cml0ZXIubWVyZ2VGYWN0b3IgPSBtZXJnZUZhY3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1Zygid3JpdGVyIGlzIG9wZW5lZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiBJbmRleCBSZWFkZXIKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEluZGV4RXhjZXB0aW9uCi0gICAgICovCi0gICAgZmluYWwgcHJvdGVjdGVkIHZvaWQgb3BlbkluZGV4UmVhZGVyKCkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRlX3JlYWRlciA9IEluZGV4UmVhZGVyLm9wZW4oZGlyKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4RXhjZXB0aW9uKCJvcGVuIHJlYWRlciBlcnJvciIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygicmVhZGVyIGlzIG9wZW5lZCIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB3cml0ZXIKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEluZGV4RXhjZXB0aW9uCi0gICAgICovCi0gICAgZmluYWwgcHJvdGVjdGVkIHZvaWQgY2xvc2VXcml0ZXIoKSB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotICAgICAgICBpZiAoYWRkX3dyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFkZF93cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4RXhjZXB0aW9uKCJjbG9zZSB3cml0ZXIgZXJyb3IiLCBleCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGFkZF93cml0ZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1Zygid3JpdGVyIGlzIGNsb3NlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgcmVhZGVyCi0gICAgICogCi0gICAgICogQHRocm93cyBJbmRleEV4Y2VwdGlvbgotICAgICAqLwotICAgIGZpbmFsIHByb3RlY3RlZCB2b2lkIGNsb3NlUmVhZGVyKCkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZGVsZXRlX3JlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlbGV0ZV9yZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoImNsb3NlIHJlYWRlciBlcnJvciIsIGV4KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlX3JlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJyZWFkZXIgaXMgY2xvc2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgZXJyb3IgKGNsb3NlIHdyaXRlciwgcmVhZGVyLGV0Yy4uICkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBleGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEluZGV4RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUVycm9yKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgICAgICAgICAgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlbGVhc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW5kZXhFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbmRleEV4Y2VwdGlvbihtZXNzYWdlLCBleGNlcHRpb24pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvaW1wbC9BYnN0cmFjdFNlYXJjaGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9pbXBsL0Fic3RyYWN0U2VhcmNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2MWJhZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9pbXBsL0Fic3RyYWN0U2VhcmNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5wb29sLlJlY3ljbGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLlNlYXJjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5IaXRzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU29ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU29ydEZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlYXJjaGVyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgU2VhcmNoZXIsCi0gICAgICAgIERpc3Bvc2FibGUsIFJlY3ljbGFibGUgewotICAgIC8qKgotICAgICAqIEx1Y2VuZSBEaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBkaXJlY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIEx1Y2VuZSBTb3J0RmllbGQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU29ydEZpZWxkIHNvcnRmaWVsZDsKLQotICAgIC8qKgotICAgICAqIEx1Y2VuZSBTZWFyY2hlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU2VhcmNoZXIgbHVjZW5lU2VhcmNoZXI7Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuU2VhcmNoZXIjYWRkRGlyZWN0b3J5KG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoRGlyZWN0b3J5IGRpcmVjdG9yeSkgewotICAgICAgICBkaXJlY3Rvcmllcy5hZGQoZGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuU2VhcmNoZXIjc2VhcmNoKG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeSkKLSAgICAgKi8KLSAgICBwdWJsaWMgSGl0cyBzZWFyY2goUXVlcnkgcXVlcnkpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldEx1Y2VuZVNlYXJjaGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzb3J0ZmllbGQ9PW51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbHVjZW5lU2VhcmNoZXIuc2VhcmNoKHF1ZXJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBsdWNlbmVTZWFyY2hlci5zZWFyY2gocXVlcnksIG5ldyBTb3J0KHNvcnRmaWVsZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZ2V0THVjZW5lU2VhcmNoZXIoKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLlNlYXJjaGVyI3NldFNvcnRGaWVsZChqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3J0RmllbGQoU3RyaW5nIGZpZWxkLCBib29sZWFuIHJldmVyc2UpIHsKLSAgICAgICAgc29ydGZpZWxkID0gbmV3IFNvcnRGaWVsZChmaWVsZCwgcmV2ZXJzZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHkuRGlzcG9zYWJsZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICByZWN5Y2xlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5leGNhbGlidXIucG9vbC5SZWN5Y2xhYmxlI3JlY3ljbGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkaXJlY3Rvcmllcy5jbGVhcigpOwotICAgICAgICAgICAgc29ydGZpZWxkID0gbnVsbDsKLSAgICAgICAgICAgIGx1Y2VuZVNlYXJjaGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmdldExvZ2dlcigpLmVycm9yKCJyZWxlYXNlIGVycm9yIiwgZXgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvQW5hbHl6ZXJNYW5hZ2VySW1wbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvaW1wbC9BbmFseXplck1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYTdmYmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvaW1wbC9BbmFseXplck1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guYW5hbHl6ZXIuQ29uZmlndXJhYmxlQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5BbmFseXplck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXI7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIEFuYWx5emVyIENvbXBvbmVudAotICogCi0gKiBAYXV0aG9yIE1haXNvbm5ldXZlIE5pY29sYXMKLSAqIEB2ZXJzaW9uIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQW5hbHl6ZXJNYW5hZ2VySW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzCi0gICAgICAgIEFuYWx5emVyTWFuYWdlciwgU2VydmljZWFibGUsIENvbmZpZ3VyYWJsZSwgVGhyZWFkU2FmZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYW5hbHl6ZXIgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQUxZWkVSX0VMRU1FTlQgPSAiYW5hbHl6ZXIiOwotCi0gICAgLyoqCi0gICAgICogdGhlIGlkIG9mIHRoZSBhbmFseXplcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVCA9ICJpZCI7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgYW5hbHl6ZXIgY2xhc3MgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9BVFQgPSAiY2xhc3MiOwotCi0gICAgLyoqCi0gICAgICogKG9wdGlvbmFsKSBhIGZpbGUgdG8gY29uZmlndXJlIHRoZSBhbmFseXplcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19BVFQgPSAiY29uZmlnZmlsZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvbWF0aWMgdXBkYXRlIG9yIG5vdCB0aGUgYW5hbHl6ZXIgd2hlbiB0aGUgY29uZmlnIGZpbGUgY2hhbmdlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR0NIRUNLX0FUVCA9ICJjaGVja3VwZGF0ZSI7Ci0KLSAgICAvKioKLSAgICAgKiBNYXAgb2YgYWxsIHRoZSBhbmFseXplciAoSUQsIGFuYWx5emVyIGNsYXNzKQotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGFuYWx5emVycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdChTdHJpbmcgaWQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYW5hbHl6ZXJzLmNvbnRhaW5zS2V5KGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBBbmFseXplciBhbmFseXplcjsKLSAgICAgICAgU3RyaW5nIGtleTsKLSAgICAgICAgU291cmNlIGNvbmZmaWxlID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBjaGVja2NvbmZpZ2ZpbGUgPSBmYWxzZTsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXI7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbltdIGNvbmZBbmFseXplciA9IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW4oQU5BTFlaRVJfRUxFTUVOVCk7Ci0gICAgICAgIGlmIChjb25mQW5hbHl6ZXIubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJ0YWcgIiArIEFOQUxZWkVSX0VMRU1FTlQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGVjdGVkICIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgbWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIiBzb3VyY2UgcmVzb2x2ZXIgZXJyb3IiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZkFuYWx5emVyLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIC8vIEtFWQotICAgICAgICAgICAga2V5ID0gY29uZkFuYWx5emVyW2ldLmdldEF0dHJpYnV0ZShJRF9BVFQpOwotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oImVsZW1lbnQgIiArIEFOQUxZWkVSX0VMRU1FTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtdXN0IGhhdmUgYSAiICsgSURfQVRUICsgIiBhdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ0xBU1MKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBjb25mQW5hbHl6ZXJbaV0uZ2V0QXR0cmlidXRlKENMQVNTTkFNRV9BVFQpOwotICAgICAgICAgICAgaWYgKGNsYXNzbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oImVsZW1lbnQgIiArIEFOQUxZWkVSX0VMRU1FTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtdXN0IGhhdmUgYSAiICsgQ0xBU1NOQU1FX0FUVCArICIgYXR0cmlidXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFuYWx5emVyID0gKEFuYWx5emVyKSBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiYW5hbHl6ZXIgY2xhc3Mgbm90IGZvdW5kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NuYW1lLCBleCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiaW5zdGFuY2lhdGlvbiBvZiAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIgZXJyb3IiLCBleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbmFseXplciBpbnN0YW5jZW9mIExvZ0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNldHVwTG9nZ2VyKGFuYWx5emVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFuYWx5emVyIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQW5hbHl6ZXIpIHsKLSAgICAgICAgICAgICAgICBDb25maWd1cmFibGVBbmFseXplciBjb25mYW5hbHl6ZXIgPSAoKENvbmZpZ3VyYWJsZUFuYWx5emVyKSBhbmFseXplcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBDT05GSUdGSUxFCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbmZmaWxlbmFtZSA9IGNvbmZBbmFseXplcltpXS5nZXRBdHRyaWJ1dGUoQ09ORklHX0FUVCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29uZmZpbGVuYW1lID09IG51bGwgfHwgY29uZmZpbGVuYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oInRoZSBhbmFseXplciAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgaGF2ZSBhICIgKyBDT05GSUdfQVRUICsgIiBhdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjb25mZmlsZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoY29uZmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25maWcgZmlsZSBzb3VyY2UgZXJyb3IiLCBleDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENIRUNLVVBEQVRFCi0gICAgICAgICAgICAgICAgY2hlY2tjb25maWdmaWxlID0gY29uZkFuYWx5emVyW2ldLmdldEF0dHJpYnV0ZUFzQm9vbGVhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR0NIRUNLX0FUVCwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgY29uZmFuYWx5emVyLnNldEFuYWx5ZXJNYW5hZ2VyKHRoaXMpOwotICAgICAgICAgICAgICAgIGNvbmZhbmFseXplci5zZXRDb25maWdGaWxlKGNvbmZmaWxlKTsKLSAgICAgICAgICAgICAgICBjb25mYW5hbHl6ZXIuc2V0RW5hYmxlQ2hlY2tGaWxlKGNoZWNrY29uZmlnZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnB1dChrZXksIGFuYWx5emVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgIGdldExvZ2dlcigpLmluZm8oIkFuYWx5emVyTWFuYWdlciBjb25maWd1cmVkLiIpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkFuYWx5emVyTWFuYWdlciNwdXQoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgaWQsIEFuYWx5emVyIGFuYWx5emVyKSB7Ci0gICAgICAgIHRoaXMuYW5hbHl6ZXJzLnB1dChpZCwgYW5hbHl6ZXIpOwotICAgICAgICB0aGlzLmdldExvZ2dlcigpLmluZm8oCi0gICAgICAgICAgICAgICAgImFkZCBhbmFseXplciBpZDogIiArIGlkICsgIiB3aXRoIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYW5hbHl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5BbmFseXplck1hbmFnZXIjcmVtb3ZlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmFuYWx5emVycy5yZW1vdmUoaWQpOwotICAgICAgICBpZiAodGhpcy5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICB0aGlzLmdldExvZ2dlcigpLmRlYnVnKCJyZW1vdmUgYW5hbHl6ZXIgaWQ6ICIgKyBpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuQW5hbHl6ZXJNYW5hZ2VyI2dldEFuYWx5emVyc0lEKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QW5hbHl6ZXJzSUQoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGFuYWx5emVycy5rZXlTZXQoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbYW5hbHl6ZXJzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5BbmFseXplck1hbmFnZXIjZ2V0QW5hbHl6ZXIoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgQW5hbHl6ZXIgZ2V0QW5hbHl6ZXIoU3RyaW5nIGlkKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEFuYWx5emVyIGFuYWx5emVyID0gKEFuYWx5emVyKSB0aGlzLmFuYWx5emVycy5nZXQoaWQpOwotICAgICAgICBpZiAoYW5hbHl6ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oImFuYWx5emVyICIgKyBpZAotICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBleGlzdCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhbmFseXplciBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUFuYWx5emVyKSB7Ci0gICAgICAgICAgICBDb25maWd1cmFibGVBbmFseXplciBjb25mQW5hbHl6ZXIgPSAoKENvbmZpZ3VyYWJsZUFuYWx5emVyKSBhbmFseXplcik7Ci0gICAgICAgICAgICBpZiAoY29uZkFuYWx5emVyLmVuYWJsZUNoZWNrRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgY29uZkFuYWx5emVyLnJlY29uZmlndXJlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvRGVmYXVsdEluZGV4ZXJJbXBsLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9pbXBsL0RlZmF1bHRJbmRleGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk1YjFlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvRGVmYXVsdEluZGV4ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5JbmRleEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgTmljb2xhcyBNYWlzb25uZXV2ZQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEluZGV4ZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RJbmRleGVyIGltcGxlbWVudHMgQ29uZmlndXJhYmxlIHsKLQotICAgIC8qKgotICAgICAqIEJ1ZmZlciBzaXplIGlzIGVsZW1lbnQKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9CVUZGRVJFRF9OVU1fRUxFTUVOVCA9ICJidWZmZXJfc2l6ZSI7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBidWZmZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBkZWZhdWx0TWF4QnVmRG9jcyA9IDEwMDsKLQotICAgIC8qKgotICAgICAqIEJ1ZmZlciBTaXplOiB0aGUgbnVtYmVyIG9mIHRoZSBtYXhpbXVtIGRvY3VtZW50cyBidWZmZXJlZCwgYmVmb3JlIHRvCi0gICAgICogZmx1c2ggYW5kIGluZGV4IHRoaXMgZG9jdW1lbnRzICh0aGUgYnVmZmVyIGlzIHVzZWQgaW4gdGhlIHVwZGF0ZSBtb2RlKQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGJ1ZmZlclNpemU7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgYnVmZmVyOiB0aGUgTGlzdCB3aGVyZSBhcmUgc3RvcmVkIHRoZSBkb2N1bWVudHMKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgYnVmZmVyID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmFibGUjY29uZmlndXJlKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBkZWZhdWx0TWF4QnVmRG9jcyA9IGNvbmYuZ2V0Q2hpbGQoRE9DVU1FTlRfQlVGRkVSRURfTlVNX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgLmdldFZhbHVlQXNJbnRlZ2VyKDEwMCk7Ci0gICAgICAgIGlmICh0aGlzLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHRoaXMuZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IG1heCBidWZmZXJlZCBkb2N1bWVudHM6ICIgKyBkZWZhdWx0TWF4QnVmRG9jcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcmVkIGRvY3VtZW50cyB0byBhdm9pZCB0byBvcGVuIGFuZCBjbG9zZQotICAgICAqIHRoZSBJbmRleFdyaXRlciBhIGxvdCBvZiB0aW1lcwotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgaW50IG51bWJlciAoZGVmYXVsdCAxMDApCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgdmFsdWUpIHsKLSAgICAgICAgYnVmZmVyU2l6ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsLkFic3RyYWN0SW5kZXhlciNyZWxlYXNlKCkKLSAgICAgKi8KLSAgICBmaW5hbCBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKCkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZmx1c2ggdGhlIGxhc3QgZG9jdW1lbnRzIHRvIHVwZGF0ZQotICAgICAgICBpZiAoYnVmZmVyLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZsdXNoQnVmZmVyZWREb2NzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyU2l6ZSA9IGRlZmF1bHRNYXhCdWZEb2NzOwotICAgICAgICB0aGlzLm9wdGltaXplKCk7Ci0gICAgICAgIHN1cGVyLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuaW1wbC5BYnN0cmFjdEluZGV4ZXIjYWRkRG9jdW1lbnQob3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQpCi0gICAgICovCi0gICAgZmluYWwgcHJvdGVjdGVkIHZvaWQgYWRkRG9jdW1lbnQoRG9jdW1lbnQgZG9jKSB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotICAgICAgICBzd2l0Y2hUb0FERF9NT0RFKGZhbHNlKTsKLSAgICAgICAgYWRkRG9jdW1lbnQoYWRkX3dyaXRlciwgZG9jKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuaW1wbC5BYnN0cmFjdEluZGV4ZXIjdXBkYXRlRG9jdW1lbnQob3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQpCi0gICAgICovCi0gICAgZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRG9jdW1lbnQoRG9jdW1lbnQgZG9jKSB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotICAgICAgICAvLyBmaXJzdCBkZWxldGUgdGhlIG9sZCBkb2N1bWVudAotICAgICAgICBkZWwoZG9jLmdldChET0NVTUVOVF9VSURfRklFTEQpKTsKLQotICAgICAgICAvLyB0aGVuIHN0b3JlIGluIHRoZSBpbmRleCBxdWV1ZQotICAgICAgICBidWZmZXIuYWRkKGRvYyk7Ci0KLSAgICAgICAgLy8gZmx1c2ggdGhlIHF1ZXVlIGlmIGl0J3MgbmVjZXNzYXJ5Ci0gICAgICAgIGlmIChidWZmZXIuc2l6ZSgpID09IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgIGZsdXNoQnVmZmVyZWREb2NzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRleCB0aGUgbGlzdCBvZiBkb2N1bWVudHMgdG8gdXBkYXRlCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmbHVzaEJ1ZmZlcmVkRG9jcygpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc3dpdGNoVG9BRERfTU9ERShmYWxzZSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBidWZmZXIuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBhZGREb2N1bWVudChhZGRfd3JpdGVyLCAoRG9jdW1lbnQpIGl0ZXIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBidWZmZXIuY2xlYXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9pbXBsL0RlZmF1bHRTZWFyY2hlckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvRGVmYXVsdFNlYXJjaGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmVkYTdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvRGVmYXVsdFNlYXJjaGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkluZGV4U2VhcmNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLk11bHRpU2VhcmNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OwotCi0vKioKLSAqIHVzZSBsdWNlbmUgTXVsdGlTZWFyY2hlciAKLSAqIEBhdXRob3IgTmljb2xhcyBNYWlzb25uZXV2ZQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFNlYXJjaGVySW1wbCBleHRlbmRzIEFic3RyYWN0U2VhcmNoZXIgewotCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZ2V0THVjZW5lU2VhcmNoZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZGlyZWN0b3JpZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIEluZGV4U2VhcmNoZXJbXSBzZWFyY2hlcnMgPSBuZXcgSW5kZXhTZWFyY2hlcltkaXJlY3RvcmllcwotICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKV07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2VhcmNoZXJzW2ldPSBuZXcgSW5kZXhTZWFyY2hlcigoRGlyZWN0b3J5KShkaXJlY3RvcmllcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChpKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsdWNlbmVTZWFyY2hlciA9IG5ldyBNdWx0aVNlYXJjaGVyKHNlYXJjaGVycyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGx1Y2VuZVNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoKERpcmVjdG9yeSkgKGRpcmVjdG9yaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KDApKSk7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9pbXBsL0luZGV4TWFuYWdlckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvSW5kZXhNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg3M2YxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvSW5kZXhNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guSW5kZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guSW5kZXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guSW5kZXhTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5BbmFseXplck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guZmllbGRtb2RlbC5EYXRlRmllbGREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmZpZWxkbW9kZWwuRmllbGREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLnV0aWxzLlNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLmNvbnRleHQuQ29udGV4dFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbk1hbmFnZXI7Ci0KLS8qKgotICogSW5kZXggTWFuYWdlciBDb21wb25lbnQuIENvbmZpZ3VyZSBhbmQgTWFuYWdlIHRoZSBkaWZmZXJlbnRzIGluZGV4ZXMuCi0gKiAKLSAqIEBhdXRob3IgTWFpc29ubmV1dmUgTmljb2xhcwotICogQHZlcnNpb24gMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleE1hbmFnZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgSW5kZXhNYW5hZ2VyLCBTZXJ2aWNlYWJsZSwKLSAgICAgICAgVGhyZWFkU2FmZSwgQ29uZmlndXJhYmxlIHsKLQotICAgIC8qKgotICAgICAqIGluZGV4ZXIgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYRVJfRUxFTUVOVCA9ICJpbmRleGVyIjsKLQotICAgIC8qKgotICAgICAqIGluZGV4ZXIgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYRVJfUk9MRV9BVFRSSUJVVEUgPSAicm9sZSI7Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgb2YgaW5kZXhlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYRVNfRUxFTUVOVCA9ICJpbmRleGVzIjsKLQotICAgIC8qKgotICAgICAqIEluZGV4IGRlY2xhcmF0aW9uIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9FTEVNRU5UID0gImluZGV4IjsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgYW5hbHl6ZXIgb2YgYSBpbmRleAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX0RFRkFVTFRBTkFMWkVSX0FUVFJJQlVURSA9ICJhbmFseXplciI7Ci0KLSAgICAvKioKLSAgICAgKiBkaXJlY3Rvcnkgd2hlcmUgdGhlIGluZGV4IGlzIHN0b3JlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX0RJUkVDVE9SWV9BVFRSSUJVVEUgPSAiZGlyZWN0b3J5IjsKLQotICAgIC8qKgotICAgICAqIEluZGV4IFN0cnVjdHVyZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSVUNUVVJFX0VMRU1FTlQgPSAic3RydWN0dXJlIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGRlY2xhcmF0aW9uIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9FTEVNRU5UID0gImZpZWxkIjsKLQotICAgIC8qKgotICAgICAqIGZpZWxkIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJVVEUgPSAiaWQiOwotCi0gICAgLyoqCi0gICAgICogdHlwZSBvZiB0aGUgZmllbGQ6ICJ0ZXh0LCAia2V5d29yZCIsICJkYXRlIiAoc2VlCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5maWVsZG1vZGVsLkZpZWxkRGVmaW5pdGlvbiBjbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURSA9ICJ0eXBlIjsKLQotICAgIC8qKgotICAgICAqIHN0b3JlIGluZm9ybWF0aW9uIG9yIG5vdCAodHJ1ZS9mYWxzZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9BVFRSSUJVVEUgPSAic3RvcmV0ZXh0IjsKLQotICAgIC8qKgotICAgICAqIFRoZSBkYXRlIEZvcm1hdCB3aGVuIHRoZSBmaWVsZCB0eXBlIGlzIGEgZGF0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVGT1JNQVRfQVRUUklCVVRFID0gImRhdGVmb3JtYXQiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGluZGV4IGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9DT05GX0ZJTEUgPSAic2VhcmNoL2x1Y2VuZV9pbmRleC54bWwiOwotCi0gICAgLyoqCi0gICAgICogY2hlY2sgdGhlIGNvbmZpZyBmaWxlIGVhY2ggdGltZSB0aGUgZ2V0SW5kZXggaXMgY2FsbGVkIHRvIHVwZGF0ZSBpZiBuZWNlc3NhcnkgdGhlCi0gICAgICogY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0FUVFJJQlVURSA9ICJjaGVjayI7Ci0gICAgLyoqCi0gICAgICogU291cmNlIG9mIHRoZSBpbmRleCBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKi8KLSAgICAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfQVRUUklCVVRFID0gImNvbmZpZyI7Ci0gICAgLyoqCi0gICAgICogQ2hlY2sgb3Igbm90IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKGF1dG9tYXRpYyB1cGRhdGUgaWYgdGhlIGZpbGUgaXMgY2hhbmdlZCkKLSAgICAgKi8KLSAgICAvLyBwcml2YXRlIGJvb2xlYW4gY2hlY2s7Ci0gICAgLyoqCi0gICAgICogSW5kZXggY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICovCi0gICAgLy8gcHJpdmF0ZSBTb3VyY2UgY29uZmlnZmlsZTsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIE1hcCBpbmRleE1hcDsKLQotICAgIHByb3RlY3RlZCBNYXAgaW5kZXhlcygpIHsKLSAgICAgICAgaWYodGhpcy5pbmRleE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmluZGV4TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGxvYWRJbmRleGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5kZXhlclJvbGUgPSBudWxsOwotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkluZGV4TWFuYWdlciNjb250YWlucyhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBpZCkgewotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhlcygpLmdldChpZCkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLkluZGV4TWFuYWdlciNnZXRJbmRleChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBJbmRleCBnZXRJbmRleChTdHJpbmcgaWQpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGlkID09IG51bGwgfHwgaWQuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4RXhjZXB0aW9uKCIgaW5kZXggd2l0aCBubyBuYW1lIHdhcyBjYWxsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEluZGV4IGluZGV4ID0gKEluZGV4KSB0aGlzLmluZGV4ZXMoKS5nZXQoaWQpOwotICAgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4RXhjZXB0aW9uKCJJbmRleCAiICsgaWQgKyAiIGRvZXNuJ3QgZXhpc3QuIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gIgotICAgICAgICAgICAgICAgICAgICArIElOREVYX0NPTkZfRklMRSArICIgZXhpc3RzIGZvciB0aGlzIHB1YmxpY2F0aW9uISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleE1hbmFnZXIjYWRkSW5kZXgob3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guSW5kZXgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSW5kZXgoSW5kZXggYmFzZSkgewotICAgICAgICB0aGlzLmluZGV4ZXMoKS5wdXQoYmFzZS5nZXRJRCgpLCBiYXNlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhNYW5hZ2VyI3JlbW92ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5pbmRleGVzKCkucmVtb3ZlKGlkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkSW5kZXhlcygpIHsKLSAgICAgICAgLy8gY29uZmlndXJlIHRoZSBpbmRleCBtYW5hZ2VyOgotCi0gICAgICAgIC8vIG5vdyBjaGVjayBhbGwgcHVibGljYXRpb25zIGFuZCBhZGQgdGhlaXIgaW5kZXhlczoKLSAgICAgICAgUHVibGljYXRpb25NYW5hZ2VyIHB1Yk1hbmFnZXIgPSBudWxsOwotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFNvdXJjZSBjb25mU291cmNlID0gbnVsbDsKLSAgICAgICAgQ29udGV4dFV0aWxpdHkgdXRpbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1dGlsID0gKENvbnRleHRVdGlsaXR5KSB0aGlzLm1hbmFnZXIubG9va3VwKENvbnRleHRVdGlsaXR5LlJPTEUpOwotICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gdXRpbC5nZXRSZXF1ZXN0KCk7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5nZXREb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIHB1Yk1hbmFnZXIgPSAoUHVibGljYXRpb25NYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKFB1YmxpY2F0aW9uTWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uW10gcHVibGljYXRpb25zID0gcHViTWFuYWdlci5nZXRQdWJsaWNhdGlvbnMoZmFjdG9yeSk7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJsaWNhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gImNvbnRleHQ6Ly8iICsgUHVibGljYXRpb24uUFVCTElDQVRJT05fUFJFRklYX1VSSSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNhdGlvbnNbaV0uZ2V0SWQoKSArICIvIiArIFB1YmxpY2F0aW9uLkNPTkZJR1VSQVRJT05fUEFUSCArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBJTkRFWF9DT05GX0ZJTEU7Ci0gICAgICAgICAgICAgICAgY29uZlNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkodXJpKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uZlNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRJbmRleGVzKGNvbmZTb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvbmZpZyBmaWxlIGVycm9yIiwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlB1YmxpY2F0aW9uTWFuYWdlciBsb29rdXAgZXJyb3IiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwdWJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShwdWJNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKGNvbmZTb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodXRpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UodXRpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJTZWFyY2ggRW5naW5lIC0gSW5kZXggTWFuYWdlciBjb25maWd1cmVkLiIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5pbmRleGVyUm9sZSA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGQoSU5ERVhFUl9FTEVNRU5UKQotICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoSU5ERVhFUl9ST0xFX0FUVFJJQlVURSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBpbmRleGVzIGZyb20gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZmlsZSB0byB0aGUgaW5kZXggbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gY29uZlNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEluZGV4ZXMoU291cmNlIGNvbmZTb3VyY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gaW5kZXhDb25maWd1cmF0aW9uID0gU291cmNlSGVscGVyLmJ1aWxkKGNvbmZTb3VyY2UpOwotICAgICAgICAgICAgYWRkSW5kZXhlcyhpbmRleENvbmZpZ3VyYXRpb24pOwotICAgICAgICB9IGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aXRoIGNvbmZpZ3VyYXRpb24gZmlsZSAiICsgY29uZlNvdXJjZS5nZXRVUkkoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGluZGV4ZXMgZnJvbSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBvYmplY3QgdG8gdGhlIGluZGV4IG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkSW5kZXhlcyhDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgQW5hbHl6ZXJNYW5hZ2VyIGFuYWx5emVyTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25bXSBjb25mcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hpbGRyZW4oSU5ERVhfRUxFTUVOVCk7Ci0KLSAgICAgICAgaWYgKGNvbmZzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigibm8gaW5kZXggaXMgZGVmaW5lZCAhIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFuYWx5emVyTWFuYWdlciA9IChBbmFseXplck1hbmFnZXIpIHRoaXMubWFuYWdlci5sb29rdXAoQW5hbHl6ZXJNYW5hZ2VyLlJPTEUpOwotCi0gICAgICAgICAgICAvLyBjb25maWd1cmUgZWFjaCBpbmRleAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25mcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGNvbmZzW2ldLmdldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhbmFseXplcmlkID0gY29uZnNbaV0uZ2V0QXR0cmlidXRlKElOREVYX0RFRkFVTFRBTkFMWkVSX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeSA9IGNvbmZzW2ldLmdldEF0dHJpYnV0ZShJTkRFWF9ESVJFQ1RPUllfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFuYWx5emVyTWFuYWdlci5leGlzdChhbmFseXplcmlkKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQW5hbHl6ZXIgIiArIGFuYWx5emVyaWQgKyAiIG5vIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbltdIGZpZWxkcyA9IGNvbmZzW2ldLmdldENoaWxkKFNUUlVDVFVSRV9FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuKEZJRUxEX0VMRU1FTlQpOwotCi0gICAgICAgICAgICAgICAgSW5kZXhTdHJ1Y3R1cmUgZG9jZGVjbCA9IG5ldyBJbmRleFN0cnVjdHVyZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmllbGRzLmxlbmd0aDsgaisrKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgRmllbGREZWZpbml0aW9uIGZpZWxkZGVjbDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZCBpZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkX2ZpZWxkID0gZmllbGRzW2pdLmdldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlUyA9IGZpZWxkc1tqXS5nZXRBdHRyaWJ1dGUoVFlQRV9BVFRSSUJVVEUsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUgPSBGaWVsZERlZmluaXRpb24uc3RyaW5nVG90eXBlKHR5cGVTKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkZGVjbCA9IEZpZWxkRGVmaW5pdGlvbi5jcmVhdGUoaWRfZmllbGQsIHR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oImZpZWxkICIgKyBpZF9maWVsZCArICIgdHlwZSAiICsgdHlwZVMsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgc3RvcmUgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RvcmU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZGRlY2wuZ2V0VHlwZSgpID09IEZpZWxkRGVmaW5pdGlvbi5URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IGZpZWxkc1tqXS5nZXRBdHRyaWJ1dGVBc0Jvb2xlYW4oU1RPUkVfQVRUUklCVVRFLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IGZpZWxkc1tqXS5nZXRBdHRyaWJ1dGVBc0Jvb2xlYW4oU1RPUkVfQVRUUklCVVRFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaWVsZGRlY2wuc2V0U3RvcmUoc3RvcmUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGRhdGVmb3JtYXQgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZGRlY2wuZ2V0VHlwZSgpID09IEZpZWxkRGVmaW5pdGlvbi5EQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGF0ZWZvcm1hdF9maWVsZCA9IGZpZWxkc1tqXS5nZXRBdHRyaWJ1dGUoREFURUZPUk1BVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChEYXRlRmllbGREZWZpbml0aW9uKSBmaWVsZGRlY2wpLnNldERhdGVGb3JtYXQobmV3IFNpbXBsZURhdGVGb3JtYXQoZGF0ZWZvcm1hdF9maWVsZCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5kZWJ1ZygiZmllbGQgYWRkZWQ6ICIgKyBmaWVsZGRlY2wpOwotICAgICAgICAgICAgICAgICAgICBkb2NkZWNsLmFkZEZpZWxkRGVmKGZpZWxkZGVjbCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSW5kZXggaW5kZXggPSBuZXcgSW5kZXgoKTsKLSAgICAgICAgICAgICAgICBpbmRleC5zZXRJRChpZCk7Ci0gICAgICAgICAgICAgICAgaW5kZXguc2V0SW5kZXhlcihpbmRleGVyUm9sZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZGlyZWN0b3J5IHBhdGggaXMgcmVsYXRpdmUsIHByZXBlbmQgY29udGV4dCBwYXRoOgotICAgICAgICAgICAgICAgIGlmICghZGlyZWN0b3J5LnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IGdldFNlcnZsZXRDb250ZXh0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBkaXJlY3Rvcnk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4LnNldERpcmVjdG9yeShkaXJlY3RvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TG9nZ2VyKCkud2FybigiZGlyZWN0b3J5ICIgKyBkaXJlY3RvcnkgKyAiIHdhcyBsb2NrZWQgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4LnNldERlZmF1bHRBbmFseXplcklEKGFuYWx5emVyaWQpOwotICAgICAgICAgICAgICAgIGluZGV4LnNldFN0cnVjdHVyZShkb2NkZWNsKTsKLSAgICAgICAgICAgICAgICBpbmRleC5zZXRNYW5hZ2VyKG1hbmFnZXIpOwotCi0gICAgICAgICAgICAgICAgdGhpcy5hZGRJbmRleChpbmRleCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmluZm8oImFkZCBpbmRleCAgIiArIGluZGV4LmdldElEKCkgKyAiIGZvciBkaXJlY3RvcnkgIiArIGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkFuYWx5emVyTWFuYWdlciBsb29rdXAgZXJyb3IiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChhbmFseXplck1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGFuYWx5emVyTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzZXJ2bGV0IGNvbnRleHQgcGF0aC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q29udGV4dFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSSgiY29udGV4dDovLy8iKTsKLSAgICAgICAgICAgIHJldHVybiBTb3VyY2VVdGlsLmdldEZpbGUoc291cmNlKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleE1hbmFnZXIjZ2V0SW5kZXgoKQotICAgICAqLwotICAgIHB1YmxpYyBJbmRleFtdIGdldEluZGV4KCkgewotICAgICAgICByZXR1cm4gKEluZGV4W10pIHRoaXMuaW5kZXhlcygpLnZhbHVlcygpLnRvQXJyYXkobmV3IEluZGV4W2luZGV4ZXMoKS5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvY29tcG9uZW50cy9pbXBsL1BhcmFsbGVsSW5kZXhlckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvUGFyYWxsZWxJbmRleGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTNiZWQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvUGFyYWxsZWxJbmRleGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLkluZGV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5GU0RpcmVjdG9yeTsKLQotLyoqCi0gKiBQYXJyYWxsZWwgSW5kZXhlciBDbGFzcwotICogCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqLwotCi1wdWJsaWMgY2xhc3MgUGFyYWxsZWxJbmRleGVySW1wbCBleHRlbmRzIEFic3RyYWN0SW5kZXhlciBpbXBsZW1lbnRzCi0gICAgICAgIENvbnRleHR1YWxpemFibGUgewotCi0gICAgLy8gUGFyYWxsZWwgc3BlY2lmaWMgdmFyaWFibGVzCi0gICAgcHJpdmF0ZSBTdGFjayBxdWV1ZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiByZWxlYXNlU2Vzc2lvbiwgZmlyc3Rfd3JpdGluZzsKLQotICAgIC8qKgotICAgICAqIE51bWJlciBvZiB0aHJlYWRzIChudW1iZXIgb2Ygd3JpdGVycykKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBudW1UaHJlYWQ7Ci0KLSAgICAvKioKLSAgICAgKiB0ZW1wIGRpciB3aGVyZSBhcmUgc3RvcmVkIHRoZSB0ZW1wb3JhcmVkIGluZGV4Ci0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHRlbXBEaXI7Ci0KLSAgICAvKioKLSAgICAgKiBtdWx0aS10aHJlYWQgd3JpdGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBXcml0ZXJUaHJlYWRbXSB3cml0ZXJzOwotCi0gICAgcHVibGljIFBhcmFsbGVsSW5kZXhlckltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMucXVldWUgPSBuZXcgU3RhY2soKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQFRPRE8gc2VlIGhvdyBtYW55IHByb2Nlc3NvciB0aGVyZSBhcmUgYXV0b21hdGljYWxseQotICAgICAgICAgKi8KLSAgICAgICAgdGhpcy5zZXROdW1UaHJlYWQoMik7Ci0gICAgICAgIGZpcnN0X3dyaXRpbmcgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIHRocmVhZCB3cml0ZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHRocmVhZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE51bVRocmVhZChpbnQgbnVtKSB7Ci0gICAgICAgIG51bVRocmVhZCA9IG51bTsKLSAgICAgICAgd3JpdGVycyA9IG5ldyBXcml0ZXJUaHJlYWRbbnVtXTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHR1YWxpemFibGUjY29udGV4dHVhbGl6ZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29udGV4dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlbXBEaXIgPSAoRmlsZSkgY29udGV4dC5nZXQoQ29uc3RhbnRzLkNPTlRFWFRfV09SS19ESVIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbGVhc2UoKSB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotCi0gICAgICAgIC8vIG9rIHRoaXMgaXMgdGhlIGVuZCBvZiBpbmRleGF0aW9uIChpbmZvcm1hdGlvbiBmb3IgdGhlIHRocmVhZHMpCi0gICAgICAgIHJlbGVhc2VTZXNzaW9uID0gdHJ1ZTsKLQotICAgICAgICAvLyB3YWl0IGZvciB0aGUgZW5kIG9mIHdyaXRlciB0aHJlYWRzCi0gICAgICAgIGJvb2xlYW4gaXNpbmRleGluZyA9IHRydWU7Ci0gICAgICAgIHdoaWxlIChpc2luZGV4aW5nKSB7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFsbCB0aGUgdGhyZWFkIGFyZSBkaWVkCi0gICAgICAgICAgICBpc2luZGV4aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyaXRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpc2luZGV4aW5nIHw9IHdyaXRlcnNbaV0uYWxpdmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vLCBzbyBzbGVlcAotICAgICAgICAgICAgaWYgKGlzaW5kZXhpbmcpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtZXJnZSBpbmRleAotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIk1lcmdpbmcuLi4uIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zd2l0Y2hUb0FERF9NT0RFKGZhbHNlKTsKLSAgICAgICAgRGlyZWN0b3J5W10gZGlycyA9IG5ldyBEaXJlY3RvcnlbbnVtVGhyZWFkXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UaHJlYWQ7IGkrKykgewotICAgICAgICAgICAgZGlyc1tpXSA9IHdyaXRlcnNbaV0uZGlyOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmFkZF93cml0ZXIuYWRkSW5kZXhlcyhkaXJzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhFeGNlcHRpb24oIm1lcmdlIGVycm9yICIsIGV4MSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZWxlYXNlU2Vzc2lvbiA9IGZhbHNlOwotICAgICAgICBmaXJzdF93cml0aW5nID0gdHJ1ZTsKLSAgICAgICAgc3VwZXIucmVsZWFzZSgpOwotICAgIH0KLQotICAgIGZpbmFsIHByb3RlY3RlZCB2b2lkIGFkZERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotICAgICAgICBzdGFydFRocmVhZCgpOwotICAgICAgICAvLyBwdXQgdGhlIGRvY3VtZW50IGluIHRoZSBxdWV1ZQotICAgICAgICB0aGlzLnF1ZXVlLmFkZChkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotICAgICAgICBkZWwoZG9jdW1lbnQuZ2V0KERPQ1VNRU5UX1VJRF9GSUVMRCkpOwotICAgICAgICBhZGREb2N1bWVudChkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnQgdGhlIHRocmVhZHMgaWYgaXQncyBub3QgYWxyZWFkeSBkb25lCi0gICAgICogCi0gICAgICogQHRocm93cyBJbmRleEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydFRocmVhZCgpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmaXJzdF93cml0aW5nKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyaXRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB3cml0ZXJzW2ldID0gbmV3IFdyaXRlclRocmVhZCgpOwotICAgICAgICAgICAgICAgIHdyaXRlcnNbaV0uc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpcnN0X3dyaXRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlciBUaHJlYWQKLSAgICAgKi8KLSAgICBmaW5hbCBjbGFzcyBXcml0ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBib29sZWFuIGFsaXZlID0gdHJ1ZTsKLQotICAgICAgICBwcml2YXRlIEluZGV4V3JpdGVyIG15d3JpdGVyOwotCi0gICAgICAgIERpcmVjdG9yeSBkaXI7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdGVtcCBkaXJlY3RvcnkgdG8gc3RvcmUgYSBzdWJpbmRleAotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodGVtcERpciArIEZpbGUuc2VwYXJhdG9yICsgdGhpcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgZmlsZS5ta2RpcnMoKTsKLQotICAgICAgICAgICAgLy8gb3BlbiBhIHdyaXRlcgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkaXIgPSBGU0RpcmVjdG9yeS5nZXREaXJlY3RvcnkoZmlsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbXl3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBhbmFseXplciwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbXl3cml0ZXIubWVyZ2VGYWN0b3IgPSBtZXJnZUZhY3RvcjsKLSAgICAgICAgICAgICAgICBteXdyaXRlci5taW5NZXJnZURvY3MgPSBtZXJnZUZhY3RvciAqIDI7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiVGhyZWFkICIgKyBnZXROYW1lKCkgKyAiOiBvcGVuaW5nIGVycm9yIiwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiV3JpdGVyVGhyZWFkICIgKyB0aGlzLmdldE5hbWUoKSArICIgaXMgcmVhZHkuLi4uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYWxpdmUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpIHF1ZXVlLnBvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRG9jdW1lbnQobXl3cml0ZXIsIGRvYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluZGV4RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyZWFkICIgKyBnZXROYW1lKCkgKyAiOiBpbmRleGF0aW9uIGVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5kIHNlc3Npb24gPwotICAgICAgICAgICAgICAgICAgICBpZiAocmVsZWFzZVNlc3Npb24pIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCB0aHJlYWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaXZlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyZWFkICIgKyBnZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGNsb3NlIGVycm9yIiwgZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBuZXcgZG9jdW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJlYWQgIiArIGdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogc2xlZXAgZXJyb3IiLCBlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiV3JpdGVyVGhyZWFkICIgKyBnZXROYW1lKCkgKyAiIGlzIHN0b3BpbmcuLi4iKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvaW1wbC9QYXJhbGxlbFNlYXJjaGVySW1wbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2NvbXBvbmVudHMvaW1wbC9QYXJhbGxlbFNlYXJjaGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjZiZWVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9jb21wb25lbnRzL2ltcGwvUGFyYWxsZWxTZWFyY2hlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5JbmRleFNlYXJjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5QYXJhbGxlbE11bHRpU2VhcmNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OwotCi0vKioKLSAqIHVzZSBsdWNlbmUgUGFyYWxsZWxNdWx0aVNlYXJjaGVyIENsYXNzIAotICogQGF1dGhvciBOaWNvbGFzIE1haXNvbm5ldXZlCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbGxlbFNlYXJjaGVySW1wbCBleHRlbmRzIEFic3RyYWN0U2VhcmNoZXIgewotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsLkFic3RyYWN0U2VhcmNoZXIjZ2V0THVjZW5lU2VhcmNoZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdldEx1Y2VuZVNlYXJjaGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRpcmVjdG9yaWVzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBJbmRleFNlYXJjaGVyW10gc2VhcmNoZXJzID0gbmV3IEluZGV4U2VhcmNoZXJbZGlyZWN0b3JpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplKCldOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlYXJjaGVyc1tpXT0gbmV3IEluZGV4U2VhcmNoZXIoKERpcmVjdG9yeSkoZGlyZWN0b3JpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoaSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbHVjZW5lU2VhcmNoZXIgPSBuZXcgUGFyYWxsZWxNdWx0aVNlYXJjaGVyKHNlYXJjaGVycyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGx1Y2VuZVNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoKERpcmVjdG9yeSkgKGRpcmVjdG9yaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KDApKSk7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvZmllbGRtb2RlbC9EYXRlRmllbGREZWZpbml0aW9uLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvZmllbGRtb2RlbC9EYXRlRmllbGREZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGUzYTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2ZpZWxkbW9kZWwvRGF0ZUZpZWxkRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5maWVsZG1vZGVsOwotCi1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRGF0ZUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotCi0vKioKLSAqIEZpZWxkIERlZmluaXRpb24gZm9yIERhdGUgdHlwZQotICogCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqLwotcHVibGljIGNsYXNzIERhdGVGaWVsZERlZmluaXRpb24gZXh0ZW5kcyBGaWVsZERlZmluaXRpb24gewotCi0gICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IGRmOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGZpZWxkCi0gICAgICovCi0gICAgcHVibGljIERhdGVGaWVsZERlZmluaXRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSwgREFURSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkYXRlIGZvcm1hdCB0byBwYXJzZSBzdHJpbmcgZGF0ZSBpbiB0aGUKLSAgICAgKiAKLSAgICAgKiBAc2VlICNjcmVhdGVMRmllbGQoU3RyaW5nKSBtZXRob2QKLSAgICAgKiBAcGFyYW0gZGYKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlRm9ybWF0KFNpbXBsZURhdGVGb3JtYXQgZGYpIHsKLSAgICAgICAgdGhpcy5kZiA9IGRmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRhdGVmb3JtYXQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltcGxlRGF0ZUZvcm1hdCBnZXREYXRlRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gZGY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTHVjZW5lIEZpZWxkCi0gICAgICogCi0gICAgICogQHBhcmFtIGRhdGVTdHJpbmcKLSAgICAgKiAgICAgICAgICAgIFN0cmluZyBkYXRlIGluIHN0cmluZyBmb3JtYXQKLSAgICAgKiBAcmV0dXJuIEEgZmllbGQuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZAotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBGaWVsZCBjcmVhdGVMRmllbGQoU3RyaW5nIGRhdGVTdHJpbmcpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgRGF0ZSBkYXRlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRhdGUgPSBkZi5wYXJzZShkYXRlU3RyaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlTEZpZWxkKGRhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBMdWNlbmUgRmllbGQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIGRhdGUKLSAgICAgKiBAcmV0dXJuIEEgZmllbGQuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZAotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBGaWVsZCBjcmVhdGVMRmllbGQoRGF0ZSBkYXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmllbGQobmFtZSwgRGF0ZUZpZWxkLmRhdGVUb1N0cmluZyhkYXRlKSwgc3RvcmUsIHRydWUsIGluZGV4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9maWVsZG1vZGVsL0ZpZWxkRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2ZpZWxkbW9kZWwvRmllbGREZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzg3ZDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2ZpZWxkbW9kZWwvRmllbGREZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5maWVsZG1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7Ci0KLS8qKgotICogRmllbGQgRGVmaW5pdGlvbiBjbGFzcwotICogCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmllbGREZWZpbml0aW9uIHsKLSAgICAvKioKLSAgICAgKiBUZXh0IHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUID0gMDsKLQotICAgIC8qKgotICAgICAqIEtleXdvcmQgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkQgPSAxOwotCi0gICAgLyoqCi0gICAgICogRGF0ZSB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFURSA9IDI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNUUklOR19UWVBFID0geyAidGV4dCIsICJrZXl3b3JkIiwgImRhdGUiIH07Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBmaWVsZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIHR5cGUgb2YgdGhlIGZpZWxkICh0ZXh0LCBrZXl3b3JkLCBkYXRlKQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgdHlwZTsKLQotICAgIC8qKgotICAgICAqIEx1Y2VuZSBGaWVsZCBzcGVjaWZpY2F0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcmU7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmRleDsKLQotICAgIC8vIGZ1dHVyIGx1Y2VuZSAxLjk6IHByb3RlY3RlZCBGaWVsZC5TdG9yZSBzdG9yZTsKLSAgICAvLyBmdXR1ciBsdWNlbmUgMS45OiBwcm90ZWN0ZWQgRmllbGQuSW5kZXggaW5kZXg7Ci0KLSAgICBwcm90ZWN0ZWQgRmllbGREZWZpbml0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0aGlzKG5hbWUsIHN0cmluZ1RvdHlwZSh0eXBlKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpZWxkRGVmaW5pdGlvbihTdHJpbmcgbmFtZSwgaW50IHR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhuYW1lLCB0eXBlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWVsZERlZmluaXRpb24gY3JlYXRlKFN0cmluZyBuYW1lLCBpbnQgdHlwZSkgewotICAgICAgICBGaWVsZERlZmluaXRpb24gZmllbGQgPSBudWxsOwotCi0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBjYW5ub3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICBjYXNlIEtFWVdPUkQ6Ci0gICAgICAgICAgICBmaWVsZCA9IG5ldyBTdHJpbmdGaWVsZERlZmluaXRpb24obmFtZSwgdHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVRFOgotICAgICAgICAgICAgZmllbGQgPSBuZXcgRGF0ZUZpZWxkRGVmaW5pdGlvbihuYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidHlwZSBub3QgYWxsb3dlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWVsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIGZpZWxkJ3MgbmFtZQotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICBpbnQgaW5kZXhhdGlvbiB0eXBlCi0gICAgICogQHBhcmFtIHN0b3JlCi0gICAgICogICAgICAgICAgICBib29sZWFuIHN0b3JlIHZhbHVlIGluIHRoZSBpbmRleAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWVsZERlZmluaXRpb24oU3RyaW5nIG5hbWUsIGludCB0eXBlLCBib29sZWFuIHN0b3JlKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZS5pbnRlcm4oKTsKLSAgICAgICAgc2V0VHlwZSh0eXBlKTsKLSAgICAgICAgc2V0U3RvcmUoc3RvcmUpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLmhhc2hDb2RlKCkgKiB0aGlzLnR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RvcmUoYm9vbGVhbiBzdG9yZSkgewotICAgICAgICAvLyBmb3IgZnV0dXIgbHVjZW5lMS45Ci0gICAgICAgIC8vIHRoaXMuc3RvcmU9KHN0b3JlKT9GaWVsZC5TdG9yZS5ZRVM6RmllbGQuU3RvcmUuTk87Ci0gICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTdG9yZSgpIHsKLSAgICAgICAgLy8gZm9yIGZ1dHVyIGx1Y2VuZTEuOSByZXR1cm4gdGhpcy5zdG9yZT09RmllbGQuU3RvcmUuWUVTOwotICAgICAgICByZXR1cm4gc3RvcmU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEZpZWxkRGVmaW5pdGlvbiBmaWVsZGRlZikgewotICAgICAgICBpZiAobmFtZS5lcXVhbHMoZmllbGRkZWYubmFtZSgpKSAmJiBnZXRUeXBlKCkgPT0gZmllbGRkZWYuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGaWVsZERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKEZpZWxkRGVmaW5pdGlvbikgb2JqZWN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIEx1Y2VuZSBGaWVsZAotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgU3RyaW5nIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBsdWNlbmUgZmllbGQKLSAgICAgKiBAcmV0dXJuIEZpZWxkCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEZpZWxkIGNyZWF0ZUxGaWVsZChTdHJpbmcgdmFsdWUpOwotCi0gICAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHR5cGUgb2YgdGhlIEZpZWxkRGVmaW5pdGlvbiAoREFURSxURVhULEtFWVdPUkQpCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIGludAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGaWVsZERlZmluaXRpb24uVEVYVDoKLSAgICAgICAgICAgIGluZGV4ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpZWxkRGVmaW5pdGlvbi5EQVRFOgotICAgICAgICAgICAgaW5kZXggPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmllbGREZWZpbml0aW9uLktFWVdPUkQ6Ci0gICAgICAgICAgICBpbmRleCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0eXBlIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYi5hcHBlbmQoIm5hbWU6ICIgKyBuYW1lKTsKLSAgICAgICAgYi5hcHBlbmQoIiwgdHlwZTogIiArIEZpZWxkRGVmaW5pdGlvbi5TVFJJTkdfVFlQRVt0eXBlXSk7Ci0gICAgICAgIGIuYXBwZW5kKCIsIHN0b3JlOiAiICsgZ2V0U3RvcmUoKSk7Ci0gICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBTdHJpbmcgdG8gdHlwZQotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlbmFtZQotICAgICAqICAgICAgICAgICAgU3RyaW5nCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIGludCBzdHJpbmdUb3R5cGUoU3RyaW5nIHR5cGVuYW1lKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU1RSSU5HX1RZUEUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0eXBlbmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscyhTVFJJTkdfVFlQRVtpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0eXBlICIgKyB0eXBlbmFtZQotICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYWxsb3dlZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL2NvbXBvbmVudHMvc2VhcmNoL2ZpZWxkbW9kZWwvU3RyaW5nRmllbGREZWZpbml0aW9uLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvZmllbGRtb2RlbC9TdHJpbmdGaWVsZERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwMDc1NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvZmllbGRtb2RlbC9TdHJpbmdGaWVsZERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guZmllbGRtb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotCi0vKioKLSAqIFN0cmluZyBGaWVsZCBEZWZpbml0aW9uICh1c2VkIGZvciBUZXh0IGFuZCBLZXl3b3JkIHR5cGUpCi0gKiAKLSAqIEBhdXRob3IgTmljb2xhcyBNYWlzb25uZXV2ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nRmllbGREZWZpbml0aW9uIGV4dGVuZHMgRmllbGREZWZpbml0aW9uIHsKLQotICAgIHB1YmxpYyBTdHJpbmdGaWVsZERlZmluaXRpb24oU3RyaW5nIG5hbWUsIGludCB0eXBlKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEx1Y2VuZSBGaWVsZAotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdmFsdWUgdG8gaW5kZXgKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBGaWVsZCBjcmVhdGVMRmllbGQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmllbGQobmFtZSwgdmFsdWUsIHN0b3JlLCB0cnVlLCBpbmRleCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvbHVjZW5lMi5yb2xlcyBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9sdWNlbmUyLnJvbGVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjY2NTkwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC9sdWNlbmUyLnJvbGVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTwhLS0gJElkJCAtLT4NCi08cm9sZS1saXN0Pg0KLQ0KLSAgICA8IS0tIGRlZmF1bHQgaW5kZXhlciAtLT4NCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlci9kZWZhdWx0IiBzaG9ydGhhbmQ9ImRlZmF1bHRfaW5kZXhlciINCi1kZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLmltcGwuRGVmYXVsdEluZGV4ZXJJbXBsIi8+DQotDQotICAgIDwhLS0gcGFyYWxsZWwgaW5kZXhlciAtLT4NCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlci9wYXJhbGxlbCIgc2hvcnRoYW5kPSJwYXJhbGxlbF9pbmRleGVyIg0KLWRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuaW1wbC5QYXJhbGxlbEluZGV4ZXJJbXBsIi8+DQotDQotCTwhLS0gYW5hbHl6ZXIgbWFuYWdlciAtLT4NCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuQW5hbHl6ZXJNYW5hZ2VyIiBzaG9ydGhhbmQ9ImFuYWx5emVyX21hbmFnZXIiDQotZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsLkFuYWx5emVyTWFuYWdlckltcGwiLz4NCi0NCi0JPCEtLSBpbmRleCBtYW5hZ2VyIC0tPg0KLSAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleE1hbmFnZXIiIHNob3J0aGFuZD0iaW5kZXhfbWFuYWdlciINCi1kZWZhdWx0LWNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5jb21wb25lbnRzLmltcGwuSW5kZXhNYW5hZ2VySW1wbCIvPg0KLQ0KLTwvcm9sZS1saXN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC91dGlscy9Tb3VyY2VIZWxwZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9jb21wb25lbnRzL3NlYXJjaC91dGlscy9Tb3VyY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiNjc5NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvdXRpbHMvU291cmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLnV0aWxzOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MKLSAqIAotICogQGF1dGhvciBNYWlzb25uZXV2ZSBOaWNvbGFzCi0gKiAKLSAqLwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVZhbGlkaXR5OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNvdXJjZUhlbHBlciB7Ci0KLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBIYXNoTWFwIHNvdXJjZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyIGNvbmZCdWlsZGVyID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uQnVpbGRlcigpOwotCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyB2b2lkIHJlZ2lzdGVyU291cmNlKFNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgaWYgKCFzb3VyY2VzLmNvbnRhaW5zS2V5KHNvdXJjZSkpIHsKLSAgICAgICAgICAgIFNvdXJjZVZhbGlkaXR5IHJlZlZhbGlkaXR5ID0gc291cmNlLmdldFZhbGlkaXR5KCk7Ci0gICAgICAgICAgICBzb3VyY2VzLnB1dChzb3VyY2UsIHJlZlZhbGlkaXR5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc291cmNlIHdpdGggdGhlIHJlZ2lzdGVyZWQgc291cmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2UgZGlkbid0IGNoYW5nZWQKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIGJvb2xlYW4gY2hlY2tTb3VyY2VWYWxpZGl0eShTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIFNvdXJjZVZhbGlkaXR5IG5ld1ZhbGlkaXR5ID0gc291cmNlLmdldFZhbGlkaXR5KCk7Ci0gICAgICAgIFNvdXJjZVZhbGlkaXR5IHJlZlZhbGlkaXR5ID0gKFNvdXJjZVZhbGlkaXR5KSBzb3VyY2VzLmdldChzb3VyY2UpOwotICAgICAgICByZXR1cm4gY2hlY2tTb3VyY2VWYWxpZGl0eShuZXdWYWxpZGl0eSwgcmVmVmFsaWRpdHkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmUgdHdvIHNvdXJjZXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZSBkaWRuJ3QgY2hhbmdlZAotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgYm9vbGVhbiBjaGVja1NvdXJjZVZhbGlkaXR5KFNvdXJjZVZhbGlkaXR5IHMxVmFsaWRpdHksCi0gICAgICAgICAgICBTb3VyY2VWYWxpZGl0eSBzMlZhbGlkaXR5KSB7Ci0KLSAgICAgICAgaW50IHZhbGlkID0gczJWYWxpZGl0eS5pc1ZhbGlkKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZDsKLSAgICAgICAgaWYgKHZhbGlkID09IDApIHsKLSAgICAgICAgICAgIHZhbGlkID0gczJWYWxpZGl0eS5pc1ZhbGlkKHMxVmFsaWRpdHkpOwotICAgICAgICAgICAgaXNWYWxpZCA9ICh2YWxpZCA9PSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzVmFsaWQgPSAodmFsaWQgPT0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzVmFsaWQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBDb25maWd1cmF0aW9uIGJ1aWxkKFNvdXJjZSBzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY29uZkJ1aWxkZXIuYnVpbGQoc291cmNlLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkZpbGUgIiArIHNvdXJjZS5nZXRVUkkoKSwgZXgpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiU0FYIEVycm9yIGluIHRoZSBjb25maWd1cmF0aW9uIEZpbGUiLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9MdWNlbmVJbmRleFRyYW5zZm9ybWVyMi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL3RyYW5zZm9ybWF0aW9uL0x1Y2VuZUluZGV4VHJhbnNmb3JtZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OTQzY2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL3RyYW5zZm9ybWF0aW9uL0x1Y2VuZUluZGV4VHJhbnNmb3JtZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTMgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi50cmFuc2Zvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5wb29sLlJlY3ljbGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLlByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guSW5kZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guSW5kZXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5BbmFseXplck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5JbmRleGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKgotICogQW5vdGhlciBsdWNlbmUgaW5kZXggdHJhbnNmb3JtZXIuPC9icj4gYWxsb3cKLSAqIDx1bD4KLSAqIDxsaT5pbmRleCBmdW5jdGlvbiAodXBkYXRlIGluZGV4aW5nIG9yIGFkZCBpbmRleGluZyBpZiBjbGVhciBhdHRyaWJ1dGUgaXMKLSAqIHRydWUpPC9saT4KLSAqIDxsaT5sdWNlbmUgZmllbGQgYm9vc3Rpbmc8L2xpPgotICogPGxpPmRlbGV0ZSBmdW5jdGlvbjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiA8cD4KLSAqIFRoaXMgdHJhbmZvcm1lciB1c2VkIHNldmVyYWwgYXZhbG9uIGNvbXBvbmVudHMsIGJ1dCB5b3UgY2FuIHVzZSB0aGVtCi0gKiBzZXBhcmF0bHkgOgotICogPHVsPgotICogPGxpPkFuYWx5emVyTWFuYWdlcjogeW91IGNhbiBzZXR1cCBhIGFuYWx5emVyIChjb25maWd1cmFibGUpIGluIHRoZQotICogYW5hbHl6ZXJfbWFuYWdlciB0YWcgaW4gY29jb29uLnhjb25mIGZpbGU8L2xpPgotICogPGxpPkluZGV4TWFuYWdlcjogeW91IGNhbiBzZXR1cCBhIGluZGV4IGluIGEgdGhlIC9XRUItSU5GL2luZGV4LnhtbCAoZGVmYXVsdAotICogbG9jYXRpb24gLCBidXQgeW91IGNhbiBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBpbiB0aGUgSW5kZXhNYW5hZ2VyIGNvbXBvbmVudAotICogY29uZmlndXJhdGlvbiBpbiBjb2Nvb24ueGNvbmYgZmlsZSk8L2xpPgotICogPGxpPkluZGV4ZXIgKDIgaW1wbGVtZW50YXRpb25zOiBkZWZhdWx0ICh3aXRoIHVwZGF0ZSBvcHRpbWl6YXRpb24pIGFuZAotICogcGFyYWxsZWwgaW1wbGVtZW50YXRpb24gZm9yIG11bHRpcGxlIGNwdSk8L2xpPgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPkV4YW1wbGUgb2YgaW5wdXQgc291cmNlOiA8L3N0cm9uZz4KLSAqIDwvcD4KLSAqIDxwPgotICogPHVsPgotICogPGxpPnRvIEluZGV4IDxicj4KLSAqICZsdDtsdWNlbmU6aW5kZXggeG1sbnM6bHVjZW5lPSZxdW90O2h0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sdWNlbmUvMS4wJnF1b3QKLSAqIDxici8+aW5kZXhpZD0mcXVvdDtteWluZGV4JnF1b3Q7IDxicj4KLSAqIGNsZWFyPSJ0cnVlIiAob3B0aW5hbCBhdHRyaWJ1dGU6IGNsZWFyIGluZGV4KSA8YnIvPm1lcmdlLWZhY3Rvcj0iMTAwIiZndDsKLSAqIChvcHRpbmFsIGF0dHJpYnV0ZTogc2VlIGx1Y2VuZSBkb2MpIDxicj4KLSAqIDxici8+Jmx0O2x1Y2VuZTpkb2N1bWVudCB1aWQ9Imh0dHA6Ly9teWhvc3QvbXlmaWxlMS5kYXRhIiZndDsgPGJyLz4KLSAqICZsdDtsdWNlbmU6ZmllbGQgbmFtZT0idGlsZSIgJmd0OyBzcWRxc2RxICZsdDsvbHVjZW5lOmZpZWxkJmd0OyA8YnI+Ci0gKiAmbHQ7bHVjZW5lOmZpZWxkIG5hbWU9ImRlc2NyaXB0aW9uIiAmZ3Q7IGEgdGV4dCBibGEgYmFsIGJsYWxhZWwKLSAqIGJhbGJhbCZsdDsvbHVjZW5lOmZpZWxkJmd0OyA8YnI+Ci0gKiAmbHQ7bHVjZW5lOmZpZWxkIG5hbWU9ImRhdGUiICZndDsxMC8xMi8yMDAyJmx0Oy9sdWNlbmU6ZmllbGQmZ3Q7IDxici8+Ci0gKiAmbHQ7L2x1Y2VuZTpkb2N1bWVudCZndDsgPGJyPgotICogCi0gKiA8cD4KLSAqICZsdDtsdWNlbmU6ZG9jdW1lbnQgdWlkPSJodHRwOi8vbXlob3N0L215ZmlsZTIuZGF0YSIgJmd0OyA8YnI+Ci0gKiAmbHQ7bHVjZW5lOmZpZWxkIG5hbWU9ImF1dGhvciIgYm9vc3Q9IjIiICZndDtNciBBdXRob3IgJmx0Oy9sdWNlbmU6ZmllbGQmZ3Q7Ci0gKiA8ZW0+KGJvb3N0IHRoZSBmaWVsZCBmb3IgdGhlIHNlYXJjaCAoc2VlIEx1Y2VuZSBkb2N1bWVudGF0aW9uKSk8L2VtPiA8YnIvPgotICogJmx0O2x1Y2VuZTpmaWVsZCBuYW1lPSJsYW5nYWdlIiAmZ3Q7ZnJlbmNoJmx0Oy9sdWNlbmU6ZmllbGQmZ3Q7IDxicj4KLSAqICZsdDsvbHVjZW5lOmRvY3VtZW50Jmd0OyA8YnI+Ci0gKiAmbHQ7IC9sdWNlbmU6aW5kZXgmZ3Q7Ci0gKiA8L3A+Ci0gKiA8L2xpPgotICogCi0gKiA8bGk+VG8gZGVsZXRlIDxici8+Ci0gKiA8cD4KLSAqICZsdDtsdWNlbmU6ZGVsZXRlIGluZGV4aWQ9Im15aW5kZXgiICZndDsgPGJyPgotICogJmx0O2x1Y2VuZTpkb2N1bWVudCB1aWQ9Imh0dHA6Ly9teWhvc3QvbXlmaWxlLmRhdGEmcXVvdDsgJmd0OyA8YnI+Ci0gKiAmbHQ7bHVjZW5lOmRvY3VtZW50IHVpZD0iRU9ET0VELUVGRSIgPGJyPgotICogJmx0Oy9sdWNlbmU6ZGVsZXRlJmd0OwotICogPC9wPgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+RXhhbXBsZSBvZiBPdXRwdXQgU291cmNlIDwvc3Ryb25nPgotICogPC9wPgotICogPHA+Ci0gKiAmbHQ7cGFnZSB4bWxuczpsdWNlbmU9JnF1b3Q7aHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2x1Y2VuZS8xLjAmcXVvdDsmZ3Q7Ci0gKiA8YnI+Ci0gKiAmbHQ7IGx1Y2VuZTppbmRleCAmZ3Q7IDxicj4KLSAqICZsdDtsdWNlbmU6ZG9jdW1lbnQgdWlkPSJodHRwOi8vbXlob3N0L215ZmlsZTEuZGF0YSIvJmd0OyA8YnIvPgotICogJmx0O2x1Y2VuZTpkb2N1bWVudCB1aWQ9Imh0dHA6Ly9teWhvc3QvbXlmaWxlMi5kYXRhIi8mZ3Q7IDxici8+Ci0gKiAmbHQ7L2x1Y2VuZTppbmRleCZndDsKLSAqIDwvcD4KLSAqIDxwPgotICogJmx0O2x1Y2VuZTpkZWxldGUgJmd0OyAmbHQ7bHVjZW5lOmRvY3VtZW50Ci0gKiB1aWQ9Imh0dHA6Ly9teWhvc3QvbXlmaWxlMS5kYXRhIi8mZ3Q7IDxici8+Jmx0O2x1Y2VuZTpkb2N1bWVudAotICogdWlkPSJFT0RPRUQtRUZFIi8mZ3Q7IDxici8+Jmx0Oy9sdWNlbmU6ZGVsZXRlICZndDs8L2JyPjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAYXV0aG9yIE5pY29sYXMgTWFpc29ubmV1dmUKLSAqLwotCi1wdWJsaWMgY2xhc3MgTHVjZW5lSW5kZXhUcmFuc2Zvcm1lcjIgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zZm9ybWVyIGltcGxlbWVudHMgUmVjeWNsYWJsZSwKLSAgICAgICAgU2VydmljZWFibGUsIENvbmZpZ3VyYWJsZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfREVGQVVMVCA9ICJpbmRleCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVUNFTkVfVVJJID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sdWNlbmUvMS4wIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9QUkVYSUYgPSAibHVjZW5lIjsKLQotICAgIC8qKgotICAgICAqIGFjdGlvbiBlbGVtZW50IDogaW5kZXggZG9jCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFVDRU5FX0lOREVYSU5HX0VMRU1FTlQgPSAiaW5kZXgiOwotCi0gICAgLyoqCi0gICAgICogYWN0aW9uIGVsZW1lbnQ6IGRlbGV0ZSBkb2MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVUNFTkVfREVMRVRJTkdfRUxFTUVOVCA9ICJkZWxldGUiOwotCi0gICAgLyoqCi0gICAgICogaW5kZXggaWRlbnRpdHkgKHNlZSBpbmRleCBkZWZpbml0aW9uIGZpbGUpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFVDRU5FX0lOREVYSU5HX0lOREVYSURfQVRUUklCVVRFID0gImluZGV4aWQiOwotCi0gICAgLyoqCi0gICAgICogT3B0aW9uYWwgYXR0cmlidXRlOiBDbGVhciBpbmRleDogdHJ1ZS9mYWxzZSAoZGVmYXVsdDogZmFsc2UpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFVDRU5FX0lOREVYSU5HX0NSRUFURV9BVFRSSUJVVEUgPSAiY2xlYXIiOwotCi0gICAgLyoqCi0gICAgICogT3B0aW9uYWwgYXR0cmlidXRlOiBBbmFseXplciBpZGVudGl0eTogc2VlIGFuYWx5emVyTWFuYWdlciBDb21wb25lbnQKLSAgICAgKiAoZGVmYXVsdDogdGhlIGFuYWx5ZXIgb2YgdGhlIGluZGV4IGRlY2xhcmVkIGluIHRoZSBpbmRleCBkZWZpbml0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9JTkRFWElOR19BTkFMWVpFUl9BVFRSSUJVVEUgPSAiYW5hbHl6ZXIiOwotCi0gICAgLyoqCi0gICAgICogT3B0aW9uYWwgYXR0cmlidXRlOiBNZXJnZUZhY3RvciBudW1iZXIgKGRlZmF1bHQgMTApOiBpbXByb3ZlIHRoZSBpbmRleGluZwotICAgICAqIHNwZWVkIGZvciBsYXJnZSBpbmRleGluZyAoc2VlIEx1Y2VuZSBkb2NzKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9JTkRFWElOR19NRVJHRV9GQUNUT1JfQVRUUklCVVRFID0gIm1lcmdlZmFjdG9yIjsKLQotICAgIC8qKgotICAgICAqIEx1Y2VuZSBkb2N1bWVudCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFVDRU5FX0RPQ1VNRU5UX0VMRU1FTlQgPSAiZG9jdW1lbnQiOwotCi0gICAgLyoqCi0gICAgICogTHVjZW5lIGRvY3VtZW50IHVpZCBmaWVsZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9ET0NVTUVOVF9VSURfQVRUUklCVVRFID0gInVpZCI7Ci0KLSAgICAvKioKLSAgICAgKiBsdWNlbmUgZmllbGQgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9GSUVMRF9FTEVNRU5UID0gImZpZWxkIjsKLQotICAgIC8qKgotICAgICAqIGx1Y2VuZSBmaWVsZCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFVDRU5FX0ZJRUxEX05BTUVfQVRUUklCVVRFID0gIm5hbWUiOwotCi0gICAgLyoqCi0gICAgICogT3B0aW9uYWwgYXR0cmlidXRlOiBsdWNlbmUgZmllbGQgYm9vc3QgKHNlZSBsdWNlbmUgZG9jcykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVUNFTkVfRklFTERfQk9PU1RfQVRUUklCVVRFID0gImJvb3N0IjsKLQotICAgIC8vIFRoZSA2IHN0YXRlcyBvZiB0aGUgc3RhdGUgbWFjaGluZQotICAgIHByaXZhdGUgaW50IHByb2Nlc3Npbmc7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19QUk9DRVNTSU5HID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOREVYX1BST0NFU1MgPSAxOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fRE9DVU1FTlRfUFJPQ0VTUyA9IDI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9GSUVMRF9QUk9DRVNTID0gNDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVURV9QUk9DRVNTID0gNTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVUSU5HX1BST0NFU1MgPSA2OwotCi0gICAgLy8gUnVudGltZSB2YXJpYWJsZXMKLSAgICBwcml2YXRlIGludCBtZXJnZUZhY3RvcjsKLQotICAgIHByaXZhdGUgQXR0cmlidXRlc0ltcGwgYXR0cnMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLQotICAgIHByaXZhdGUgSW5kZXggaW5kZXg7Ci0KLSAgICBwcml2YXRlIEluZGV4ZXIgaW5kZXhlcjsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHByaXZhdGUgRG9jdW1lbnQgYm9keURvY3VtZW50OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdWlkOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmllbGRuYW1lOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBmaWVsZGJvb3N0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZmllbGR2YWx1ZTsKLQotICAgIHByaXZhdGUgUmVxdWVzdCByZXF1ZXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHViSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXJlYTsKLSAgICBwcml2YXRlIFN0cmluZyB1dWlkOwotICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlOwotCi0gICAgLyoqCi0gICAgICogU2V0dXAgdGhlIHRyYW5zZm9ybWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldHVwKFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBNYXAgb2JqZWN0TW9kZWwsIFN0cmluZyBzcmMsIFBhcmFtZXRlcnMgcGFyYW1ldGVycykKLSAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnB1YklkID0gcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoInB1YmxpY2F0aW9uSWQiKTsKLSAgICAgICAgICAgIHRoaXMuYXJlYSA9IHBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCJhcmVhIik7Ci0gICAgICAgICAgICB0aGlzLnV1aWQgPSBwYXJhbWV0ZXJzLmdldFBhcmFtZXRlcigidXVpZCIpOwotICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IHBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCJsYW5ndWFnZSIpOwotICAgICAgICB9IGNhdGNoIChQYXJhbWV0ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgewotICAgICAgICB0aGlzLmluZGV4ID0gbnVsbDsKLSAgICAgICAgdGhpcy5pbmRleGVyID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9jZXNzaW5nID0gTk9fUFJPQ0VTU0lORzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBzdXBlci5lbmREb2N1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJlZ2luIHRoZSBzY29wZSBvZiBhIHByZWZpeC1VUkkgTmFtZXNwYWNlIG1hcHBpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgTmFtZXNwYWNlIHByZWZpeCBiZWluZyBkZWNsYXJlZC4KLSAgICAgKiBAcGFyYW0gdXJpIFRoZSBOYW1lc3BhY2UgVVJJIHRoZSBwcmVmaXggaXMgbWFwcGVkIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb2Nlc3NpbmcgPT0gTk9fUFJPQ0VTU0lORykgewotICAgICAgICAgICAgc3VwZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuZCB0aGUgc2NvcGUgb2YgYSBwcmVmaXgtVVJJIG1hcHBpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRoYXQgd2FzIGJlaW5nIG1hcHBpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb2Nlc3NpbmcgPT0gTk9fUFJPQ0VTU0lORykgewotICAgICAgICAgICAgc3VwZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZ2V0TG9nZ2VyKCkuZGVidWcoIlNUQVJUIHByb2Nlc3Npbmc6ICIrcHJvY2Vzc2luZysiICIrbG9jYWxOYW1lKTsKLQotICAgICAgICBpZiAoTFVDRU5FX1VSSS5lcXVhbHMobmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgc3dpdGNoIChwcm9jZXNzaW5nKSB7Ci0KLSAgICAgICAgICAgIGNhc2UgTk9fUFJPQ0VTU0lORzoKLQotICAgICAgICAgICAgICAgIC8vIGluZGV4IGFjdGlvbgotICAgICAgICAgICAgICAgIGlmIChMVUNFTkVfSU5ERVhJTkdfRUxFTUVOVC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRJbmRleGVyKGF0dHMpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nID0gSU5ERVhfUFJPQ0VTUzsKLQotICAgICAgICAgICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBhY3Rpb24KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChMVUNFTkVfREVMRVRJTkdfRUxFTUVOVC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRJbmRleGVyKGF0dHMpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nID0gREVMRVRFX1BST0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiZWxlbWVudCAiICsgbG9jYWxOYW1lICsgIiB1bmtub3duIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElOREVYX1BST0NFU1M6Ci0KLSAgICAgICAgICAgICAgICAvLyBuZXcgZG9jdW1lbnQgdG8gaW5kZXgKLSAgICAgICAgICAgICAgICBpZiAoTFVDRU5FX0RPQ1VNRU5UX0VMRU1FTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQotICAgICAgICAgICAgICAgICAgICB1aWQgPSBhdHRzLmdldFZhbHVlKExVQ0VORV9ET0NVTUVOVF9VSURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiPCIgKyBMVUNFTkVfUFJFWElGICsgIjoiICsgTFVDRU5FX0RPQ1VNRU5UX0VMRU1FTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPiBlbGVtZW50IG11c3QgY29udGFpbiAiICsgTFVDRU5FX0RPQ1VNRU5UX1VJRF9BVFRSSUJVVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlEb2N1bWVudCA9IGluZGV4LmNyZWF0ZURvY3VtZW50KHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgPSBJTl9ET0NVTUVOVF9QUk9DRVNTOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJlbGVtZW50ICIgKyBsb2NhbE5hbWUgKyAiIGlzIG5vdCBhbGxvd2VkIGluICA8IiArIExVQ0VORV9QUkVYSUYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IiArIExVQ0VORV9ET0NVTUVOVF9FTEVNRU5UICsgIj4gZWxlbWVudCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBERUxFVEVfUFJPQ0VTUzoKLQotICAgICAgICAgICAgICAgIGlmIChMVUNFTkVfRE9DVU1FTlRfRUxFTUVOVC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB1aWQgPSBhdHRzLmdldFZhbHVlKExVQ0VORV9ET0NVTUVOVF9VSURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiPCIgKyBMVUNFTkVfUFJFWElGICsgIjoiICsgTFVDRU5FX0RPQ1VNRU5UX0VMRU1FTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPiBlbGVtZW50IG11c3QgY29udGFpbiAiICsgTFVDRU5FX0RPQ1VNRU5UX1VJRF9BVFRSSUJVVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgPSBERUxFVElOR19QUk9DRVNTOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJlbGVtZW50ICIgKyBsb2NhbE5hbWUgKyAiIGlzIG5vdCBhIDxsdWNlbmU6ZG9jdW1lbnQ+IGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSU5fRE9DVU1FTlRfUFJPQ0VTUzoKLSAgICAgICAgICAgICAgICBpZiAoTFVDRU5FX0ZJRUxEX0VMRU1FTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGZpZWxkIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZG5hbWUgPSBhdHRzLmdldFZhbHVlKExVQ0VORV9GSUVMRF9OQU1FX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkbmFtZSA9PSBudWxsIHx8IHRoaXMuZmllbGRuYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCI8bHVjZW5lOmZpZWxkPiBlbGVtZW50IG11c3QgY29udGFpbiBuYW1lIGF0dHJpYnV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgdGV4dCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBib29zdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmllbGRib29zdFMgPSBhdHRzLmdldFZhbHVlKExVQ0VORV9GSUVMRF9CT09TVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRib29zdFMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRib29zdCA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZGJvb3N0ID0gRmxvYXQucGFyc2VGbG9hdChmaWVsZGJvb3N0Uyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyA9IElOX0ZJRUxEX1BST0NFU1M7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIjwiICsgTFVDRU5FX1BSRVhJRiArICI6IiArIExVQ0VORV9GSUVMRF9FTEVNRU5UICsgIiB3YXMgZXhwZWN0ZWQhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYnlwYXNzCi0gICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBnZXRMb2dnZXIoKS5kZWJ1ZygiRU5EIHByb2Nlc3Npbmc6ICIrcHJvY2Vzc2luZysiICIrbG9jYWxOYW1lKTsKLQotICAgICAgICBpZiAoTFVDRU5FX1VSSS5lcXVhbHMobmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgc3dpdGNoIChwcm9jZXNzaW5nKSB7Ci0KLSAgICAgICAgICAgIGNhc2UgSU5ERVhfUFJPQ0VTUzoKLSAgICAgICAgICAgICAgICBpZiAoTFVDRU5FX0lOREVYSU5HX0VMRU1FTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBpbmRleGluZyAtPiBjbG9zZSB0aGUgaW5kZXhlcgotICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlSW5kZXhlcigpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBOT19QUk9DRVNTSU5HOwotICAgICAgICAgICAgICAgICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIjwvbHVjZW5lOiIgKyBMVUNFTkVfREVMRVRJTkdfRUxFTUVOVCArICIgd2FzIGV4cGVjdGVkISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBERUxFVEVfUFJPQ0VTUzoKLSAgICAgICAgICAgICAgICBpZiAoTFVDRU5FX0RFTEVUSU5HX0VMRU1FTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBkZWxldGluZyAtPiBjbG9zZSB0aGUgaW5kZXhlcgotICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlSW5kZXhlcigpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBOT19QUk9DRVNTSU5HOwotICAgICAgICAgICAgICAgICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIjwvbHVjZW5lOiIgKyBMVUNFTkVfREVMRVRJTkdfRUxFTUVOVCArICIgd2FzIGV4cGVjdGVkISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJTl9ET0NVTUVOVF9QUk9DRVNTOgotICAgICAgICAgICAgICAgIGlmIChMVUNFTkVfRE9DVU1FTlRfRUxFTUVOVC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2FuSW5kZXgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhlci5pbmRleChib2R5RG9jdW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhFeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXgxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldExvZ2dlcigpLmRlYnVnKCIgbHVjZW5lIGRvY3VtZW50OiAiICsgdGhpcy5ib2R5RG9jdW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlEb2N1bWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJzLmFkZEF0dHJpYnV0ZShuYW1lc3BhY2VVUkksICJ1aWQiLCAidWlkIiwgIkNEQVRBIiwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc2luZyA9IElOREVYX1BST0NFU1M7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIjwvbHVjZW5lOiIgKyBMVUNFTkVfRE9DVU1FTlRfRUxFTUVOVCArICIgd2FzIGV4cGVjdGVkISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBERUxFVElOR19QUk9DRVNTOgotICAgICAgICAgICAgICAgIGlmIChMVUNFTkVfRE9DVU1FTlRfRUxFTUVOVC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgYSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICBpZiAoY2FuSW5kZXgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVyLmRlbCh1aWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXgyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhdHRycy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBhdHRycy5hZGRBdHRyaWJ1dGUobmFtZXNwYWNlVVJJLCAidWlkIiwgInVpZCIsICJDREFUQSIsIHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW5kRWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBERUxFVEVfUFJPQ0VTUzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiPC9sdWNlbmU6IiArIExVQ0VORV9ET0NVTUVOVF9FTEVNRU5UICsgIiB3YXMgZXhwZWN0ZWQhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElOX0ZJRUxEX1BST0NFU1M6Ci0gICAgICAgICAgICAgICAgaWYgKExVQ0VORV9GSUVMRF9FTEVNRU5ULmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGx1Y2VuZSBmaWVsZAotICAgICAgICAgICAgICAgICAgICBGaWVsZCBmID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBpbmRleC5jcmVhdGVGaWVsZChmaWVsZG5hbWUsIGZpZWxkdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluZGV4RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZi5zZXRCb29zdChmaWVsZGJvb3N0KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZmllbGQgdG8gdGhlIGx1Y2VuZSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICBib2R5RG9jdW1lbnQuYWRkKGYpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nID0gSU5fRE9DVU1FTlRfUFJPQ0VTUzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiPC9sdWNlbmU6IiArIExVQ0VORV9GSUVMRF9FTEVNRU5UICsgIiB3YXMgZXhwZWN0ZWQhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJ1bmtub3cgZWxlbWVudCAnIiArIExVQ0VORV9GSUVMRF9FTEVNRU5UICsgIichIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhlciAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAocHJvY2Vzc2luZyA9PSBJTl9GSUVMRF9QUk9DRVNTKSB7Ci0gICAgICAgICAgICB0aGlzLmZpZWxkdmFsdWUuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgdGhlIEluZGV4ZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGluZGV4aWQKLSAgICAgKiBAcGFyYW0gYW5hbHl6ZXJpZAotICAgICAqIEBwYXJhbSBtZXJnZUYKLSAgICAgKiBAcGFyYW0gY2xlYXIKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0SW5kZXhlcihBdHRyaWJ1dGVzIGF0dHMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpZCA9IGF0dHMuZ2V0VmFsdWUoTFVDRU5FX0lOREVYSU5HX0lOREVYSURfQVRUUklCVVRFKTsKLSAgICAgICAgU3RyaW5nIGFuYWx5emVyaWQgPSBhdHRzLmdldFZhbHVlKExVQ0VORV9VUkksIExVQ0VORV9JTkRFWElOR19BTkFMWVpFUl9BVFRSSUJVVEUpOwotICAgICAgICBTdHJpbmcgbWVyZ2VGID0gYXR0cy5nZXRWYWx1ZShMVUNFTkVfVVJJLCBMVUNFTkVfSU5ERVhJTkdfTUVSR0VfRkFDVE9SX0FUVFJJQlVURSk7Ci0gICAgICAgIFN0cmluZyBjbGVhciA9IGF0dHMuZ2V0VmFsdWUoTFVDRU5FX1VSSSwgTFVDRU5FX0lOREVYSU5HX0NSRUFURV9BVFRSSUJVVEUpOwotICAgICAgICBhdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbChhdHRzKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGluZGV4ZXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEluZGV4TWFuYWdlciBpbmRleE0gPSAoSW5kZXhNYW5hZ2VyKSBtYW5hZ2VyLmxvb2t1cChJbmRleE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBpbmRleCA9IGluZGV4TS5nZXRJbmRleChpZCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJpbmRleCBbIiArIGlkICsgIl0gbm8gZm91bmQgaW4gdGhlIGluZGV4IGRlZmluaXRpb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZGV4ZXIgPSBpbmRleC5nZXRJbmRleGVyKCk7Ci0gICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2UoaW5kZXhNKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBleDEpIHsKLSAgICAgICAgICAgIGhhbmRsZUVycm9yKGV4MSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSW5kZXhFeGNlcHRpb24gZXgzKSB7Ci0gICAgICAgICAgICBoYW5kbGVFcnJvcigiZ2V0IEluZGV4ZXIgZXJyb3IgZm9yIGluZGV4IFsiICsgaWQgKyAiXSIsIGV4Myk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgYSBjdXN0dW0gYW5hbHl6ZXIgKGRlZmF1bHQ6IHRoZSBhbmFseXplciBvZiB0aGUgaW5kZXgpCi0gICAgICAgIGlmIChhbmFseXplcmlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFuYWx5emVyIGFuYWx5emVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQW5hbHl6ZXJNYW5hZ2VyIGFuYWx5emVyTSA9IChBbmFseXplck1hbmFnZXIpIG1hbmFnZXIubG9va3VwKEluZGV4TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgICAgICBhbmFseXplciA9IGFuYWx5emVyTS5nZXRBbmFseXplcihhbmFseXplcmlkKTsKLSAgICAgICAgICAgICAgICBpbmRleGVyLnNldEFuYWx5emVyKGFuYWx5emVyKTsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2UoYW5hbHl6ZXJNKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXgxKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoImVycm9yIHNldHRpbmcgYW5hbHl6ZXIgZm9yIGluZGV4IFsiICsgaWQgKyAiXSIsIGV4Mik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGF0dHJzLmFkZEF0dHJpYnV0ZShMVUNFTkVfVVJJLCBMVUNFTkVfSU5ERVhJTkdfQU5BTFlaRVJfQVRUUklCVVRFLAotICAgICAgICAgICAgICAgICAgICBMVUNFTkVfSU5ERVhJTkdfQU5BTFlaRVJfQVRUUklCVVRFLCAiQ0RBVEEiLCBpbmRleC5nZXREZWZhdWx0QW5hbHl6ZXJJRCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYW5JbmRleCgpKSB7Ci0gICAgICAgICAgICAvLyBzZXQgY2xlYXIgbW9kZQotICAgICAgICAgICAgYm9vbGVhbiBuZXdfaW5kZXggPSAoY2xlYXIgIT0gbnVsbCAmJiBjbGVhci50b0xvd2VyQ2FzZSgpLmVxdWFscygidHJ1ZSIpKSA/IHRydWUKLSAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChuZXdfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbmRleGVyLmNsZWFySW5kZXgoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbmRleEV4Y2VwdGlvbiBleDMpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoImVycm9yIGNsZWFyaW5nIGluZGV4IiwgZXgzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgbWVyZ2VGYWN0b3IKLSAgICAgICAgICAgIGlmIChtZXJnZUYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBtZXJnZUZhY3RvciA9IEludGVnZXIucGFyc2VJbnQobWVyZ2VGKTsKLSAgICAgICAgICAgICAgICBpbmRleGVyLnNldE1lcmdlRmFjdG9yKG1lcmdlRmFjdG9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIHRoaXMuZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggIiArIGlkICsgIiBjbGVhcjogIiArIG5ld19pbmRleCArICIgYW5hbHl6ZXJpZDogIiArIGFuYWx5emVyaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWVyZ2VmYWN0b3I6ICIgKyBtZXJnZUYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgaGFuZGxlRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZUVycm9yKG1lc3NhZ2UgKyAiOiAiICsgZ2V0RXhjZXB0aW9uTWVzc2FnZShleCkpOwotICAgIH0KLQotICAgIHZvaWQgaGFuZGxlRXJyb3IoRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlRXJyb3IoZ2V0RXhjZXB0aW9uTWVzc2FnZShleCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXhjZXB0aW9uTWVzc2FnZShFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZXhNc2cgPSBleC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBleE1zZyA9PSBudWxsID8gIiIgOiAiICgiICsgZXhNc2cgKyAiKSI7Ci0gICAgICAgIHJldHVybiBleC5nZXRDbGFzcygpLmdldE5hbWUoKSArIG1zZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgRXhjZXB0aW9uIG9yIEVycm9yCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZwotICAgICAqIEBwYXJhbSBleAotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgdm9pZCBoYW5kbGVFcnJvcihTdHJpbmcgbXNnKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgY2xvc2VJbmRleGVyKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFJlcG9zaXRvcnlVdGlsLmdldFNlc3Npb24odGhpcy5tYW5hZ2VyLCB0aGlzLnJlcXVlc3QpOwotICAgICAgICAgICAgVXNlciBzZW5kZXIgPSBzZXNzaW9uLmdldElkZW50aXR5KCkuZ2V0VXNlcigpOwotICAgICAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSAoVXNlck1hbmFnZXIpIHNlbmRlci5nZXRJdGVtTWFuYWdlcigpOwotICAgICAgICAgICAgVXNlciByZWNpcGllbnQgPSB1c2VyTWFuYWdlci5nZXRVc2VyKHRoaXMubm90aWZpY2F0aW9uUmVjaXBpZW50KTsKLSAgICAgICAgICAgIElkZW50aWZpYWJsZVtdIHJlY2lwaWVudHMgPSB7IHJlY2lwaWVudCB9OwotCi0gICAgICAgICAgICBTdHJpbmcgc3ViamVjdCA9ICJpbmRleGluZy1mYWlsZWQtc3ViamVjdCI7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdWJqZWN0UGFyYW1zID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgICAgIFN0cmluZyBib2R5ID0gImluZGV4aW5nLWZhaWxlZC1ib2R5IjsKLSAgICAgICAgICAgIFN0cmluZ1tdIGJvZHlQYXJhbXMgPSB7IHRoaXMucHViSWQsIHRoaXMuYXJlYSwgdGhpcy51dWlkLCB0aGlzLmxhbmd1YWdlLCBtc2cgfTsKLQotICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2Uoc3ViamVjdCwgc3ViamVjdFBhcmFtcywgYm9keSwgYm9keVBhcmFtcywgc2VuZGVyLAotICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRzKTsKLSAgICAgICAgICAgIE5vdGlmaWNhdGlvblV0aWwubm90aWZ5KHRoaXMubWFuYWdlciwgbWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKAotICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGluZGV4IGRvY3VtZW50IFsiICsgdGhpcy5wdWJJZCArICI6IiArIHRoaXMuYXJlYSArICI6IiArIHRoaXMudXVpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjoiICsgdGhpcy5sYW5ndWFnZSArICJdLCBzZW50IG1lc3NhZ2UgdG8gdXNlciBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5ub3RpZmljYXRpb25SZWNpcGllbnQgKyAiXS4iKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGlmIChleCA9PSBudWxsKSB7IC8vIHRoaXMuZ2V0TG9nZ2VyKCkuZXJyb3IobXNnKTsgdGhyb3cgbmV3Ci0gICAgICAgICAqIFNBWEV4Y2VwdGlvbihtc2cpOyB9IGVsc2UgeyAvLyB0aGlzLmdldExvZ2dlcigpLmVycm9yKG1zZywgZXgpOyB0aHJvdwotICAgICAgICAgKiBuZXcgU0FYRXhjZXB0aW9uKG1zZywgZXgpOyB9Ci0gICAgICAgICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBpbmRleGVyCi0gICAgICogCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICB2b2lkIGNsb3NlSW5kZXhlcigpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkgewotICAgICAgICAgICAgaW5kZXgucmVsZWFzZUluZGV4ZXIoaW5kZXhlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBub3RpZmljYXRpb25SZWNpcGllbnQgPSBudWxsOwotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubm90aWZpY2F0aW9uUmVjaXBpZW50ID0gY29uZmlnLmdldENoaWxkKCJub3RpZnkiKS5nZXRBdHRyaWJ1dGUoInVzZXIiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9MdWNlbmVJbmRleFRyYW5zZm9ybWVyT3B0aW1pemVkLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vdHJhbnNmb3JtYXRpb24vTHVjZW5lSW5kZXhUcmFuc2Zvcm1lck9wdGltaXplZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBlZGVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9MdWNlbmVJbmRleFRyYW5zZm9ybWVyT3B0aW1pemVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi50cmFuc2Zvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dHVhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLlByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY2FjaGluZy5DYWNoZWFibGVQcm9jZXNzaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLkluZGV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLkx1Y2VuZUNvY29vbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5MdWNlbmVYTUxJbmRleGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Cb29sZWFuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVZhbGlkaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5pbXBsLnZhbGlkaXR5Lk5PUFZhbGlkaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4UmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIEEgbHVjZW5lIGluZGV4IGNyZWF0aW9uIHRyYW5zZm9ybWVyLgotICogPHA+Ci0gKiBTZWUgPGEKLSAqIGhyZWY9Imh0dHA6Ly93aWtpLmNvY29vbmRldi5vcmcvV2lraS5qc3A/cGFnZT1MdWNlbmVJbmRleFRyYW5zZm9ybWVyIj5MdWNlbmVJbmRleFRyYW5zZm9ybWVyCi0gKiA8L2E+IGRvY3VtZW50YXRpb24gb24gdGhlIENvY29vbiBXaWtpLgotICogPC9wPgotICogPHA+Ci0gKiBUT0RPOiBXcml0ZSBtb3JlIGRvY3VtZW50YXRpb24uCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnZncml0c2Vua29AYXBhY2hlLm9yZyI+VmFkaW0gR3JpdHNlbmtvIDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNvbmFsQG56ZXRjLm9yZyI+Q29uYWwgVHVvaHkgPC9hPgotICogQGF1dGhvciBOaWNvbGFzIE1haXNvbm5ldXZlCi0gKi8KLXB1YmxpYyBjbGFzcyBMdWNlbmVJbmRleFRyYW5zZm9ybWVyT3B0aW1pemVkIGV4dGVuZHMgQWJzdHJhY3RUcmFuc2Zvcm1lciBpbXBsZW1lbnRzCi0gICAgICAgIENhY2hlYWJsZVByb2Nlc3NpbmdDb21wb25lbnQsIENvbmZpZ3VyYWJsZSwgQ29udGV4dHVhbGl6YWJsZSwKLSAgICAgICAgU2VydmljZWFibGUgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5BTFlaRVJfQ0xBU1NOQU1FX0NPTkZJRyA9ICJhbmFseXplci1jbGFzc25hbWUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5BTFlaRVJfQ0xBU1NOQU1FX1BBUkFNRVRFUiA9ICJhbmFseXplci1jbGFzc25hbWUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5BTFlaRVJfQ0xBU1NOQU1FX0RFRkFVTFQgPSAib3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc3RhbmRhcmQuU3RhbmRhcmRBbmFseXplciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfQ09ORklHID0gImRpcmVjdG9yeSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfUEFSQU1FVEVSID0gImRpcmVjdG9yeSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfREVGQVVMVCA9ICJpbmRleCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9GQUNUT1JfQ09ORklHID0gIm1lcmdlLWZhY3RvciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9GQUNUT1JfUEFSQU1FVEVSID0gIm1lcmdlLWZhY3RvciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVJHRV9GQUNUT1JfREVGQVVMVCA9IDIwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFVDRU5FX1VSSSA9ICJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbHVjZW5lLzEuMCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVUNFTkVfUVVFUllfRUxFTUVOVCA9ICJpbmRleCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVUNFTkVfUVVFUllfQU5BTFlaRVJfQVRUUklCVVRFID0gImFuYWx5emVyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9RVUVSWV9ESVJFQ1RPUllfQVRUUklCVVRFID0gImRpcmVjdG9yeSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVUNFTkVfUVVFUllfQ1JFQVRFX0FUVFJJQlVURSA9ICJjcmVhdGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFVDRU5FX1FVRVJZX01FUkdFX0ZBQ1RPUl9BVFRSSUJVVEUgPSAibWVyZ2UtZmFjdG9yIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9ET0NVTUVOVF9FTEVNRU5UID0gImRvY3VtZW50IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9ET0NVTUVOVF9VUkxfQVRUUklCVVRFID0gInVybCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVUNFTkVfRUxFTUVOVF9BVFRSX1RPX1RFWFRfQVRUUklCVVRFID0gInRleHQtYXR0ciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMVUNFTkVfRUxFTUVOVF9BVFRSX1NUT1JFX1ZBTFVFID0gInN0b3JlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExVQ0VORV9FTEFQU0VEX1RJTUVfQVRUUklCVVRFID0gImVsYXBzZWQtdGltZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQSA9ICJDREFUQSI7Ci0KLSAgICAvLyBUaGUgMyBzdGF0ZXMgb2YgdGhlIHN0YXRlIG1hY2hpbmUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfR1JPVU5EID0gMDsgLy8gaW5pdGlhbCBvciAiZ3JvdW5kIiBzdGF0ZQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1FVRVJZID0gMTsgLy8gcHJvY2Vzc2luZyBhIGx1Y2VuZTppbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFF1ZXJ5KSBlbGVtZW50Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRE9DVU1FTlQgPSAyOyAvLyBwcm9jZXNzaW5nIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsdWNlbmU6ZG9jdW1lbnQgZWxlbWVudAotCi0gICAgLy8gSW5pdGlhbGl6YXRpb24gdGltZSB2YXJpYWJsZXMKLSAgICBwcm90ZWN0ZWQgRmlsZSB3b3JrRGlyID0gbnVsbDsKLQotICAgIC8vIHNlcnZpY2UgbWFuYWdlcgotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHByaXZhdGUgSW5kZXhlciBpbmRleGVyOwotCi0gICAgLy8gRGVjbGFyYXRpb24gdGltZSBwYXJhbWV0ZXJzIHZhbHVlcyAoc3BlY2lmaWVkIGluIHNpdGVtYXAgY29tcG9uZW50Ci0gICAgLy8gY29uZmlnKQotICAgIHByaXZhdGUgSW5kZXhlckNvbmZpZ3VyYXRpb24gY29uZmlndXJlQ29uZmlndXJhdGlvbjsKLQotICAgIC8vIEludm9jYXRpb24gdGltZSBwYXJhbWV0ZXJzIHZhbHVlcyAoc3BlY2lmaWVkIGluIHNpdGVtYXAgdHJhbnNmb3JtCi0gICAgLy8gcGFyYW1ldGVycykKLSAgICBwcml2YXRlIEluZGV4ZXJDb25maWd1cmF0aW9uIHNldHVwQ29uZmlndXJhdGlvbjsKLQotICAgIC8vIFBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBkb2N1bWVudAotICAgIHByaXZhdGUgSW5kZXhlckNvbmZpZ3VyYXRpb24gcXVlcnlDb25maWd1cmF0aW9uOwotCi0gICAgLy8gUnVudGltZSB2YXJpYWJsZXMKLSAgICBwcml2YXRlIGludCBwcm9jZXNzaW5nOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUluZGV4ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBib2R5VGV4dDsKLQotICAgIHByaXZhdGUgRG9jdW1lbnQgYm9keURvY3VtZW50OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYm9keURvY3VtZW50VVJMOwotCi0gICAgcHJpdmF0ZSBTdGFjayBlbGVtZW50U3RhY2sgPSBuZXcgU3RhY2soKTsKLQotICAgIC8qKgotICAgICAqIFN0b3JhZ2UgZm9yIHRoZSBkb2N1bWVudCBlbGVtZW50J3MgYXR0cmlidXRlcyB1bnRpbCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4KLSAgICAgKiBpbmRleGVkLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNvcGllZCB0byB0aGUgb3V0cHV0IGFsb25nIHdpdGggYSBib29sZWFuCi0gICAgICogPGNvZGU+aW5kZXhlZDwvY29kZT4gYXR0cmlidXRlLgotICAgICAqLwotICAgIHByaXZhdGUgQXR0cmlidXRlc0ltcGwgZG9jdW1lbnRBdHRyaWJ1dGVzOwotCi0gICAgcHJpdmF0ZSBsb25nIGRvY3VtZW50U3RhcnRUaW1lOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVpZChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIHJldHVybiB1cmwucmVwbGFjZSgnLycsICdcdTAwMDAnKTsgLy8gKyAiXHUwMDAwIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGVGaWVsZC50aW1lVG9TdHJpbmcodXJsQ29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIHRoZSB0cmFuc2Zvcm1lci4gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgc3RvcmVkIGFzCi0gICAgICogZ2VuZXJhbCBkZWZhdWx0cywgd2hpY2ggbWF5IGJlIG92ZXItcmlkZGVuIGJ5IHBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzCi0gICAgICogcGFyYW1ldGVycyBpbiB0aGUgc2l0ZW1hcCBwaXBlbGluZSwgb3IgYnkgYXR0cmlidXRlcyBvZiB0aGUgcXVlcnkKLSAgICAgKiBlbGVtZW50KHMpIGluIHRoZSBYTUwgaW5wdXQgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbmZpZ3VyZUNvbmZpZ3VyYXRpb24gPSBuZXcgSW5kZXhlckNvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgY29uZi5nZXRDaGlsZChBTkFMWVpFUl9DTEFTU05BTUVfQ09ORklHKS5nZXRWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFOQUxZWkVSX0NMQVNTTkFNRV9ERUZBVUxUKSwgY29uZi5nZXRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9DT05GSUcpLmdldFZhbHVlKERJUkVDVE9SWV9ERUZBVUxUKSwgY29uZgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkKE1FUkdFX0ZBQ1RPUl9DT05GSUcpLmdldFZhbHVlQXNJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVJHRV9GQUNUT1JfREVGQVVMVCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHVwIHRoZSB0cmFuc2Zvcm1lci4gQ2FsbGVkIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGFzc2VtYmxlZC4gVGhlCi0gICAgICogcGFyYW1ldGVycyBhcmUgdGhvc2Ugc3BlY2lmaWVkIGFzIGNoaWxkIGVsZW1lbnRzIG9mIHRoZQotICAgICAqIDxjb2RlPiZsdDttYXA6dHJhbnNmb3JtJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgc2l0ZW1hcC4gVGhlc2UKLSAgICAgKiBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbDogSWYgbm8gcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkIGhlcmUgdGhlbiB0aGUKLSAgICAgKiBkZWZhdWx0cyBhcmUgc3VwcGxpZWQgYnkgdGhlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uLiBBbnkgcGFyYW1ldGVycwotICAgICAqIHNwZWNpZmllZCBoZXJlIG1heSBiZSBvdmVyLXJpZGRlbiBieSBhdHRyaWJ1dGVzIG9mIHRoZSBsdWNlbmU6aW5kZXgKLSAgICAgKiBlbGVtZW50IGluIHRoZSBpbnB1dCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXR1cChTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgTWFwIG9iamVjdE1vZGVsLCBTdHJpbmcgc3JjLAotICAgICAgICAgICAgUGFyYW1ldGVycyBwYXJhbWV0ZXJzKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb24gewotICAgICAgICBzZXR1cENvbmZpZ3VyYXRpb24gPSBuZXcgSW5kZXhlckNvbmZpZ3VyYXRpb24ocGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgQU5BTFlaRVJfQ0xBU1NOQU1FX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICBjb25maWd1cmVDb25maWd1cmF0aW9uLmFuYWx5emVyQ2xhc3NuYW1lKSwgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoRElSRUNUT1JZX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUNvbmZpZ3VyYXRpb24uaW5kZXhEaXJlY3RvcnkpLCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlckFzSW50ZWdlcihNRVJHRV9GQUNUT1JfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlQ29uZmlndXJhdGlvbi5tZXJnZUZhY3RvcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRleHR1YWxpemUgdGhpcyBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29udGV4dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud29ya0RpciA9IChGaWxlKSBjb250ZXh0LmdldChDb25zdGFudHMuQ09OVEVYVF9XT1JLX0RJUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzaW5nID0gU1RBVEVfR1JPVU5EOwotICAgICAgICBpZiAodGhpcy5pbmRleGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZShpbmRleGVyKTsKLSAgICAgICAgICAgIGluZGV4ZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5ib2R5VGV4dCA9IG51bGw7Ci0gICAgICAgIHRoaXMuYm9keURvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdGhpcy5ib2R5RG9jdW1lbnRVUkwgPSBudWxsOwotICAgICAgICB0aGlzLmVsZW1lbnRTdGFjay5jbGVhcigpOwotICAgICAgICBzdXBlci5yZWN5Y2xlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlIHVuaXF1ZSBrZXkuIFRoaXMga2V5IG11c3QgYmUgdW5pcXVlIGluc2lkZSB0aGUgc3BhY2Ugb2YgdGhpcwotICAgICAqIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBnZW5lcmF0ZWQga2V5Ci0gICAgICovCi0gICAgcHVibGljIFNlcmlhbGl6YWJsZSBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiAiMSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlIHZhbGlkaXR5IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBnZW5lcmF0ZWQgdmFsaWRpdHkgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotICAgICAqICAgICAgICAgY29tcG9uZW50IGlzIGN1cnJlbnRseSBub3QgY2FjaGVhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2VWYWxpZGl0eSBnZXRWYWxpZGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIE5PUFZhbGlkaXR5LlNIQVJFRF9JTlNUQU5DRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBzdXBlci5lbmREb2N1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJlZ2luIHRoZSBzY29wZSBvZiBhIHByZWZpeC1VUkkgTmFtZXNwYWNlIG1hcHBpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqICAgICAgICAgICAgVGhlIE5hbWVzcGFjZSBwcmVmaXggYmVpbmcgZGVjbGFyZWQuCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgVGhlIE5hbWVzcGFjZSBVUkkgdGhlIHByZWZpeCBpcyBtYXBwZWQgdG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb2Nlc3NpbmcgPT0gU1RBVEVfR1JPVU5EKSB7Ci0gICAgICAgICAgICBzdXBlci5zdGFydFByZWZpeE1hcHBpbmcocHJlZml4LCB1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5kIHRoZSBzY29wZSBvZiBhIHByZWZpeC1VUkkgbWFwcGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICogICAgICAgICAgICBUaGUgcHJlZml4IHRoYXQgd2FzIGJlaW5nIG1hcHBpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb2Nlc3NpbmcgPT0gU1RBVEVfR1JPVU5EKSB7Ci0gICAgICAgICAgICBzdXBlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAocHJvY2Vzc2luZyA9PSBTVEFURV9HUk9VTkQpIHsKLSAgICAgICAgICAgIGlmIChMVUNFTkVfVVJJLmVxdWFscyhuYW1lc3BhY2VVUkkpCi0gICAgICAgICAgICAgICAgICAgICYmIExVQ0VORV9RVUVSWV9FTEVNRU5ULmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNDcmVhdGUgPSBhdHRzLmdldFZhbHVlKExVQ0VORV9RVUVSWV9DUkVBVEVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVJbmRleCA9IEJvb2xlYW5VdGlscy50b0Jvb2xlYW4oc0NyZWF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5hbHl6ZXJDbGFzc25hbWUgPSBhdHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoTFVDRU5FX1FVRVJZX0FOQUxZWkVSX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGluZGV4RGlyZWN0b3J5ID0gYXR0cwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKExVQ0VORV9RVUVSWV9ESVJFQ1RPUllfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVyZ2VGYWN0b3IgPSBhdHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoTFVDRU5FX1FVRVJZX01FUkdFX0ZBQ1RPUl9BVFRSSUJVVEUpOwotCi0gICAgICAgICAgICAgICAgcXVlcnlDb25maWd1cmF0aW9uID0gbmV3IEluZGV4ZXJDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZXJDbGFzc25hbWUgIT0gbnVsbCA/IGFuYWx5emVyQ2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0dXBDb25maWd1cmF0aW9uLmFuYWx5emVyQ2xhc3NuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhEaXJlY3RvcnkgIT0gbnVsbCA/IGluZGV4RGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0dXBDb25maWd1cmF0aW9uLmluZGV4RGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VGYWN0b3IgIT0gbnVsbCA/IEludGVnZXIucGFyc2VJbnQobWVyZ2VGYWN0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0dXBDb25maWd1cmF0aW9uLm1lcmdlRmFjdG9yKTsKLQotICAgICAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSB0aGUgbHVjZW5lOmluZGV4IHRvIHRoZSBuZXh0IHN0YWdlIGluIHRoZSBwaXBlbGluZQotICAgICAgICAgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHMpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgPSBTVEFURV9RVUVSWTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzc2luZyA9PSBTVEFURV9RVUVSWSkgewotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBhIGx1Y2VuZTppbmRleCAtIGV4cGVjdGluZyBhIGx1Y2VuZTpkb2N1bWVudAotICAgICAgICAgICAgaWYgKExVQ0VORV9VUkkuZXF1YWxzKG5hbWVzcGFjZVVSSSkKLSAgICAgICAgICAgICAgICAgICAgJiYgTFVDRU5FX0RPQ1VNRU5UX0VMRU1FTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmJvZHlEb2N1bWVudFVSTCA9IGF0dHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZShMVUNFTkVfRE9DVU1FTlRfVVJMX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuYm9keURvY3VtZW50VVJMID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGx1Y2VuZTpkb2N1bWVudD4gbXVzdCBoYXZlIEB1cmwgYXR0cmlidXRlIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIHRpbWUgdGhlIGRvY3VtZW50IGluZGV4aW5nIGJlZ2FuCi0gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoZXNlIGF0dHJpYnV0ZXMgc28gdGhleSBjYW4gYmUgcGFzc2VkIG9uIHRvIHRoZQotICAgICAgICAgICAgICAgIC8vIG5leHQgc3RhZ2UgaW4gdGhlIHBpcGVsaW5lLAotICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBkb2N1bWVudCBlbGVtZW50IGlzIGVuZGVkLgotICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRBdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKGF0dHMpOwotICAgICAgICAgICAgICAgIHRoaXMuYm9keVRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5ib2R5RG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRTdGFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgPSBTVEFURV9ET0NVTUVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICI8bHVjZW5lOmluZGV4PiBlbGVtZW50IGNhbiBjb250YWluIG9ubHkgPGx1Y2VuZTpkb2N1bWVudD4gZWxlbWVudHMhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzc2luZyA9PSBTVEFURV9ET0NVTUVOVCkgewotICAgICAgICAgICAgZWxlbWVudFN0YWNrLnB1c2gobmV3IEluZGV4SGVscGVyRmllbGQobG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlc0ltcGwoYXR0cykpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHByb2Nlc3NpbmcgPT0gU1RBVEVfUVVFUlkpIHsKLSAgICAgICAgICAgIGlmIChMVUNFTkVfVVJJLmVxdWFscyhuYW1lc3BhY2VVUkkpCi0gICAgICAgICAgICAgICAgICAgICYmIExVQ0VORV9RVUVSWV9FTEVNRU5ULmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoZSBxdWVyeSBlbGVtZW50IHRvIHRoZSBuZXh0IHN0YWdlIGluIHRoZSBwaXBlbGluZQotICAgICAgICAgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lKTsKLSAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBTVEFURV9HUk9VTkQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIjwvbHVjZW5lOmluZGV4PiB3YXMgZXhwZWN0ZWQhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzc2luZyA9PSBTVEFURV9ET0NVTUVOVCkgewotICAgICAgICAgICAgaWYgKExVQ0VORV9VUkkuZXF1YWxzKG5hbWVzcGFjZVVSSSkKLSAgICAgICAgICAgICAgICAgICAgJiYgTFVDRU5FX0RPQ1VNRU5UX0VMRU1FTlQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBFbmQgZG9jdW1lbnQgcHJvY2Vzc2luZwotICAgICAgICAgICAgICAgIHRoaXMuYm9keURvY3VtZW50LmFkZChGaWVsZC5VblN0b3JlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEx1Y2VuZVhNTEluZGV4ZXIuQk9EWV9GSUVMRCwgdGhpcy5ib2R5VGV4dC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5ib2R5VGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICB0aGlzLmJvZHlEb2N1bWVudC5hZGQoRmllbGQuVW5JbmRleGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgTHVjZW5lWE1MSW5kZXhlci5VUkxfRklFTEQsIHRoaXMuYm9keURvY3VtZW50VVJMKSk7Ci0gICAgICAgICAgICAgICAgLy8gc3RvcmU6IGZhbHNlLCBpbmRleDogdHJ1ZSwgdG9rZW5pemU6IGZhbHNlCi0gICAgICAgICAgICAgICAgdGhpcy5ib2R5RG9jdW1lbnQuYWRkKG5ldyBGaWVsZChMdWNlbmVYTUxJbmRleGVyLlVJRF9GSUVMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpZCh0aGlzLmJvZHlEb2N1bWVudFVSTCksIGZhbHNlLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlaW5kZXhEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluZGV4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5ib2R5RG9jdW1lbnRVUkwgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoZSBsdWNlbmU6ZG9jdW1lbnQgZWxlbWVudCB0byB0aGUgbmV4dCBzdGFnZSBpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBwaXBlbGluZQotICAgICAgICAgICAgICAgIGxvbmcgZWxhcHNlZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGlzLmRvY3VtZW50U3RhcnRUaW1lOwotICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50QXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRBdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIExVQ0VORV9FTEFQU0VEX1RJTUVfQVRUUklCVVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgTFVDRU5FX0VMQVBTRURfVElNRV9BVFRSSUJVVEUsIENEQVRBLCBTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlT2YoZWxhcHNlZFRpbWUpKTsKLSAgICAgICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudEF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lKTsKLSAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBTVEFURV9RVUVSWTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIGVsZW1lbnQgcHJvY2Vzc2luZwotICAgICAgICAgICAgICAgIEluZGV4SGVscGVyRmllbGQgdG9zID0gKEluZGV4SGVscGVyRmllbGQpIGVsZW1lbnRTdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgdGV4dCA9IHRvcy5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHMgPSB0b3MuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gYXR0cmlidXRlc1RvVGV4dCA9IGF0dHMuZ2V0SW5kZXgoTFVDRU5FX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExVQ0VORV9FTEVNRU5UX0FUVFJfVE9fVEVYVF9BVFRSSUJVVEUpICE9IC0xOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBMdWNlbmUgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICBpZiAoTFVDRU5FX1VSSS5lcXVhbHMoYXR0cy5nZXRVUkkoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRzX2xuYW1lID0gYXR0cy5nZXRMb2NhbE5hbWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRzX3ZhbHVlID0gYXR0cy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9keURvY3VtZW50LmFkZChGaWVsZC5VblN0b3JlZChsb2NhbE5hbWUgKyAiQCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGF0dHNfbG5hbWUsIGF0dHNfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXNUb1RleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKGF0dHNfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlUZXh0LmFwcGVuZChhdHRzX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlUZXh0LmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdG9yZSA9IGF0dHMuZ2V0SW5kZXgoTFVDRU5FX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExVQ0VORV9FTEVNRU5UX0FUVFJfU1RPUkVfVkFMVUUpICE9IC0xOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib2R5RG9jdW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChGaWVsZC5UZXh0KGxvY2FsTmFtZSwgdGV4dC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib2R5RG9jdW1lbnQuYWRkKEZpZWxkLlVuU3RvcmVkKGxvY2FsTmFtZSwgdGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQWxsIG90aGVyIHRhZ3MKLSAgICAgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAocHJvY2Vzc2luZyA9PSBTVEFURV9ET0NVTUVOVCAmJiBjaC5sZW5ndGggPiAwICYmIHN0YXJ0ID49IDAKLSAgICAgICAgICAgICAgICAmJiBsZW5ndGggPiAxICYmIGVsZW1lbnRTdGFjay5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICAgICAgKChJbmRleEhlbHBlckZpZWxkKSBlbGVtZW50U3RhY2sucGVlaygpKS5hcHBlbmQodGV4dCk7Ci0gICAgICAgICAgICBib2R5VGV4dC5hcHBlbmQodGV4dCk7Ci0gICAgICAgICAgICBib2R5VGV4dC5hcHBlbmQoJyAnKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzaW5nID09IFNUQVRFX0dST1VORCkgewotICAgICAgICAgICAgc3VwZXIuY2hhcmFjdGVycyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb3BlbldyaXRlcigpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJ1c2UgbHVjZW5lSW5kZXhUcmFuc2Zvcm1lciB3aXRoIGluZGV4ZXIgY29tcG9uZW50Iik7Ci0gICAgICAgIC8vIGxvb2t1cCB0aGUgaW5kZXhlcgotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5kZXhlciA9IChJbmRleGVyKSB0aGlzLm1hbmFnZXIubG9va3VwKEluZGV4ZXIuUk9MRSsiL2RlZmF1bHQiKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIGluZGV4RGlyZWN0b3J5ID0gbmV3IEZpbGUocXVlcnlDb25maWd1cmF0aW9uLmluZGV4RGlyZWN0b3J5KTsKLSAgICAgICAgaWYgKCFpbmRleERpcmVjdG9yeS5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgIGluZGV4RGlyZWN0b3J5ID0gbmV3IEZpbGUod29ya0RpciwKLSAgICAgICAgICAgICAgICAgICAgcXVlcnlDb25maWd1cmF0aW9uLmluZGV4RGlyZWN0b3J5KTsKLSAgICAgICAgfQotICAgICAgICAvLyBJZiB0aGUgaW5kZXggZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHRoZW4gYWx3YXlzIGNyZWF0ZSBpdC4KLSAgICAgICAgYm9vbGVhbiBpbmRleEV4aXN0cyA9IEluZGV4UmVhZGVyLmluZGV4RXhpc3RzKGluZGV4RGlyZWN0b3J5KTsKLSAgICAgICAgaWYgKCFpbmRleEV4aXN0cykgewotICAgICAgICAgICAgY3JlYXRlSW5kZXggPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdldCB0aGUgaW5kZXggZGlyZWN0b3J5LCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpcmVjdG9yeSBkaXJlY3RvcnkgPSBMdWNlbmVDb2Nvb25IZWxwZXIuZ2V0RGlyZWN0b3J5KAotICAgICAgICAgICAgICAgICAgICBpbmRleERpcmVjdG9yeSwgY3JlYXRlSW5kZXgpOwotICAgICAgICAgICAgaW5kZXhlci5zZXRJbmRleChkaXJlY3RvcnkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhFeGNlcHRpb24oInNldCBkaXJlY3RvcnkgIiArIGluZGV4RGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICsgIiBlcnJvciIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdldCB0aGUgYW5hbHl6ZXIKLSAgICAgICAgQW5hbHl6ZXIgYW5hbHl6ZXIgPSBMdWNlbmVDb2Nvb25IZWxwZXIKLSAgICAgICAgICAgICAgICAuZ2V0QW5hbHl6ZXIocXVlcnlDb25maWd1cmF0aW9uLmFuYWx5emVyQ2xhc3NuYW1lKTsKLSAgICAgICAgaW5kZXhlci5zZXRBbmFseXplcihhbmFseXplcik7Ci0KLSAgICAgICAgdGhpcy5pbmRleGVyLnNldE1lcmdlRmFjdG9yKHF1ZXJ5Q29uZmlndXJhdGlvbi5tZXJnZUZhY3Rvcik7Ci0gICAgICAgIGlmICh0aGlzLmNyZWF0ZUluZGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmluZGV4ZXIuY2xlYXJJbmRleCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlaW5kZXhEb2N1bWVudCgpIHRocm93cyBJbmRleEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRoZSBpbmRleCBpcyBiZWluZyBjcmVhdGVkLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZGVsZXRlIHRoZSBkb2MgZnJvbQotICAgICAgICAvLyBhbiBleGlzdGluZyBpbmRleC4KLSAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBjYW4ga2VlcCBhIHNpbmdsZSBJbmRleFdyaXRlciBvcGVuIHRocm91Z2hvdXQgdGhlCi0gICAgICAgIC8vIHByb2Nlc3MuCi0gICAgICAgIGlmICh0aGlzLmluZGV4ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgb3BlbldyaXRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaW5kZXhlci5pbmRleCh0aGlzLmJvZHlEb2N1bWVudCk7Ci0gICAgICAgIHRoaXMuYm9keURvY3VtZW50ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBjbGFzcyBJbmRleEhlbHBlckZpZWxkIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgdGV4dDsKLQotICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7Ci0KLSAgICAgICAgSW5kZXhIZWxwZXJGaWVsZChTdHJpbmcgbG9jYWxOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpIHsKLSAgICAgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0czsKLSAgICAgICAgICAgIHRoaXMudGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0VGV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLnRleHQuYXBwZW5kKHRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kKGNoYXJbXSBzdHIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHRoaXMudGV4dC5hcHBlbmQoc3RyLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBJbmRleGVyQ29uZmlndXJhdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhbmFseXplckNsYXNzbmFtZTsKLQotICAgICAgICBTdHJpbmcgaW5kZXhEaXJlY3Rvcnk7Ci0KLSAgICAgICAgaW50IG1lcmdlRmFjdG9yOwotCi0gICAgICAgIHB1YmxpYyBJbmRleGVyQ29uZmlndXJhdGlvbihTdHJpbmcgYW5hbHl6ZXJDbGFzc25hbWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGluZGV4RGlyZWN0b3J5LCBpbnQgbWVyZ2VGYWN0b3IpIHsKLSAgICAgICAgICAgIHRoaXMuYW5hbHl6ZXJDbGFzc25hbWUgPSBhbmFseXplckNsYXNzbmFtZTsKLSAgICAgICAgICAgIHRoaXMuaW5kZXhEaXJlY3RvcnkgPSBpbmRleERpcmVjdG9yeTsKLSAgICAgICAgICAgIHRoaXMubWVyZ2VGYWN0b3IgPSBtZXJnZUZhY3RvcjsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvY29jb29uL3RyYW5zZm9ybWF0aW9uL1V1aWRUb1VybFRyYW5zZm9ybWVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vdHJhbnNmb3JtYXRpb24vVXVpZFRvVXJsVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyODA1Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vdHJhbnNmb3JtYXRpb24vVXVpZFRvVXJsVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb2Nvb24udHJhbnNmb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLlByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5BcmVhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD4KLSAqIFRyYW5zZm9ybQotICogPGNvZGU+PHNlYXJjaDpmaWVsZCBuYW1lPSJ1aWQiPmE1ZDMwMjUwLTJiN2MtMTFkYi05OGYwLWJlZjdiMjc4MWNmMDplbjwvc2VhcmNoOmZpZWxkPjwvY29kZT4KLSAqIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgVVJMLgotICogPC9wPgotICogPHA+Ci0gKiBQYXJhbWV0ZXJzOgotICogPC9wPgotICogPHVsPgotICogPGxpPnB1YklkIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBwYWdlKTwvbGk+Ci0gKiA8bGk+YXJlYSAob3B0aW9uYWwsIGRlZmF1bHRzIHRvIGN1cnJlbnQgcGFnZSk8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIFV1aWRUb1VybFRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RTQVhUcmFuc2Zvcm1lciB7Ci0KLSAgICBwcml2YXRlIFNpdGVTdHJ1Y3R1cmUgc2l0ZTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2VhcmNoLzEuMCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GSUVMRCA9ICJmaWVsZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVUlEID0gInVpZCI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXR1cChTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgTWFwIG9iamVjdE1vZGVsLCBTdHJpbmcgc3JjLCBQYXJhbWV0ZXJzIHBhcmFtcykKLSAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0dXAocmVzb2x2ZXIsIG9iamVjdE1vZGVsLCBzcmMsIHBhcmFtcyk7Ci0KLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBTZXJ2bGV0SGVscGVyLmdldFdlYmFwcFVSSShyZXF1ZXN0KTsKLSAgICAgICAgVVJMSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBVUkxJbmZvcm1hdGlvbih1cmwpOwotCi0gICAgICAgIFN0cmluZyBwdWJJZCA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoInB1YklkIiwgaW5mby5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICBTdHJpbmcgYXJlYUlkID0gcGFyYW1zLmdldFBhcmFtZXRlcigiYXJlYSIsIGluZm8uZ2V0QXJlYSgpKTsKLQotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5nZXREb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCByZXF1ZXN0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24ocHViSWQpOwotICAgICAgICAgICAgQXJlYSBhcmVhID0gcHViLmdldEFyZWEoYXJlYUlkKTsKLSAgICAgICAgICAgIHRoaXMuc2l0ZSA9IGFyZWEuZ2V0U2l0ZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5zaWRlVWlkRWxlbWVudCA9IGZhbHNlOwotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcmF3LCBBdHRyaWJ1dGVzIGF0dHIpCi0gICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbmFtZSwgcmF3LCBhdHRyKTsKLSAgICAgICAgaWYgKHVyaS5lcXVhbHMoTkFNRVNQQUNFKSAmJiBuYW1lLmVxdWFscyhFTEVNRU5UX0ZJRUxEKQotICAgICAgICAgICAgICAgICYmIGF0dHIuZ2V0VmFsdWUoQVRUUl9OQU1FKS5lcXVhbHMoQVRUUl9WQUxVRV9VSUQpKSB7Ci0gICAgICAgICAgICB0aGlzLmluc2lkZVVpZEVsZW1lbnQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmluc2lkZVVpZEVsZW1lbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXcgU3RyaW5nKGNoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ZXBzID0ga2V5LnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICBTdHJpbmcgdXVpZCA9IHN0ZXBzWzBdOwotICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gc3RlcHNbMV07Ci0KLSAgICAgICAgICAgIGlmIChzaXRlLmNvbnRhaW5zQnlVdWlkKHV1aWQsIGxhbmd1YWdlKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBzaXRlLmdldEJ5VXVpZCh1dWlkLCBsYW5ndWFnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxEb2N1bWVudFVSTCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSB1cmwudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2hhcmFjdGVycyhjaGFycywgMCwgY2hhcnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHJhdykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuaW5zaWRlVWlkRWxlbWVudCA9IGZhbHNlOwotICAgICAgICBzdXBlci5lbmRFbGVtZW50KHVyaSwgbmFtZSwgcmF3KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvSW5kZXhEb2N1bWVudC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2x1Y2VuZS9JbmRleERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTU4MTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2x1Y2VuZS9JbmRleERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubHVjZW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkRvY3VtZW50VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogVXNlY2FzZSB0byBtYWludGFpbiBsdWNlbmUgaW5kZXguCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleERvY3VtZW50IGV4dGVuZHMgRG9jdW1lbnRVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBVUkkgdG8gY29weSB0aGUgZG9jdW1lbnQgc291cmNlIGZyb20uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1VSSSA9ICJzb3VyY2VVcmkiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfQUNUSU9OID0gImluZGV4QWN0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWCA9ICJpbmRleCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gImRlbGV0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfQVJFQSA9ICJpbmRleEFyZWEiOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgYWN0aW9uID0gc3VwZXIuZ2V0UGFyYW1ldGVyQXNTdHJpbmcoSU5ERVhfQUNUSU9OKTsKLSAgICAgICAgU3RyaW5nIGFyZWEgPSBzdXBlci5nZXRQYXJhbWV0ZXJBc1N0cmluZyhJTkRFWF9BUkVBKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gZm9ybWF0cyA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0Rm9ybWF0cygpOwotICAgICAgICAgICAgaWYgKCFBcnJheXMuYXNMaXN0KGZvcm1hdHMpLmNvbnRhaW5zKCJsdWNlbmVJbmRleCIpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkud2FybigiRG9jdW1lbnQgWyIrZ2V0U291cmNlRG9jdW1lbnQoKSsiXSBpcyBub3QgYmVpbmcgaW5kZXhlZCBiZWNhdXNlIHJlc291cmNlIHR5cGUgWyIgKyBnZXRTb3VyY2VEb2N1bWVudCgpLmdldFJlc291cmNlVHlwZSgpLmdldE5hbWUoKSArICJdIGRvZXMgbm90IHN1cHBvcnQgaW5kZXhpbmchIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhJTkRFWCkpIHsKLSAgICAgICAgICAgICAgICAvLyBpbmRleAotICAgICAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoImNvY29vbjovL21vZHVsZXMvbHVjZW5lL2luZGV4LSIgKyBhcmVhICsgIi54bWwiKTsKLSAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSB4bWxJbnB1dFNvdXJjZSA9IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc291cmNlLlNvdXJjZVV0aWwuZ2V0SW5wdXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhERUxFVEUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVsZXRlCi0gICAgICAgICAgICAgICAgc291cmNlID0gcmVzb2x2ZXIucmVzb2x2ZVVSSSgiY29jb29uOi8vbW9kdWxlcy9sdWNlbmUvZGVsZXRlLSIgKyBhcmVhICsgIi54bWwiKTsKLSAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSB4bWxJbnB1dFNvdXJjZSA9IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc291cmNlLlNvdXJjZVV0aWwuZ2V0SW5wdXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNnZXROb2Rlc1RvTG9jaygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJJbmRleERvY3VtZW50OjpnZXRPYmplY3RzVG9Mb2NrKCkgY2FsbGVkIG9uIHNvdXJjZSBkb2N1bWVudCBbIgotICAgICAgICAgICAgICAgICAgICArIGdldFNvdXJjZURvY3VtZW50KCkgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZVtdIG9iamVjdHMgPSB7IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UmVwb3NpdG9yeU5vZGUoKSB9OwotICAgICAgICByZXR1cm4gb2JqZWN0czsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvSW5kZXhTaXRlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbHVjZW5lL0luZGV4U2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ZmZDdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvSW5kZXhTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMubHVjZW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uVVJMSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2U7Ci0KLS8qKgotICogSW5kZXggYWxsIGRvY3VtZW50cyBvZiB0aGUgY3VycmVudCBwdWJsaWNhdGlvbiBpbiB0aGUgY3VycmVudCBhcmVhLgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhTaXRlIGV4dGVuZHMgQWJzdHJhY3RVc2VjYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdXJsID0gZ2V0U291cmNlVVJMKCk7Ci0gICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24odXJsKTsKLSAgICAgICAgU3RyaW5nIHB1YklkID0gaW5mby5nZXRQdWJsaWNhdGlvbklkKCk7Ci0KLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBnZXREb2N1bWVudEZhY3RvcnkoKTsKLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJJZCk7Ci0gICAgICAgIEFyZWEgYXJlYSA9IHB1Yi5nZXRBcmVhKGluZm8uZ2V0QXJlYSgpKTsKLQotICAgICAgICBEb2N1bWVudFtdIGRvY3MgPSBhcmVhLmdldERvY3VtZW50cygpOwotCi0gICAgICAgIEluZGV4VXBkYXRlciB1cGRhdGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVwZGF0ZXIgPSAoSW5kZXhVcGRhdGVyKSB0aGlzLm1hbmFnZXIubG9va3VwKEluZGV4VXBkYXRlci5ST0xFKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZXIuaW5kZXgoZ2V0U2Vzc2lvbigpLCBkb2NzW2ldLmdldFJlc291cmNlVHlwZSgpLCBwdWJJZCwgYXJlYS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jc1tpXS5nZXRVVUlEKCksIGRvY3NbaV0uZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRXJyb3IgaW5kZXhpbmcgZG9jdW1lbnQgWyIgKyBkb2NzW2ldLmdldFBhdGgoKSArICI6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZG9jc1tpXS5nZXRMYW5ndWFnZSgpICsgIl0sIFVVSUQ9IiArIGRvY3NbaV0uZ2V0VVVJRCgpOwotICAgICAgICAgICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoZSArICIsIHNlZSBsb2dmaWxlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IobWVzc2FnZSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHVwZGF0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHVwZGF0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2x1Y2VuZS9JbmRleFVwZGF0ZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvSW5kZXhVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDE0MGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2x1Y2VuZS9JbmRleFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5sdWNlbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5JbmRleEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBJbmRleCB1cGRhdGVyIHdoaWNoIHVwZGF0ZXMgdGhlIGluZGV4IHdoZW4gYSBkb2N1bWVudCBjaGFuZ2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4VXBkYXRlciBleHRlbmRzIFJlcG9zaXRvcnlMaXN0ZW5lciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHNlcnZpY2Ugcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IEluZGV4VXBkYXRlci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZG9jdW1lbnQgdG8gdGhlIGluZGV4LgotICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uLgotICAgICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHJlc291cmNlIHR5cGUuCi0gICAgICogQHBhcmFtIHB1YmxpY2F0aW9uSWQgVGhlIHB1YmxpY2F0aW9uIElELgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBVVUlELgotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UuCi0gICAgICogQHRocm93cyBJbmRleEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgdm9pZCBpbmRleChTZXNzaW9uIHNlc3Npb24sIFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUsIFN0cmluZyBwdWJsaWNhdGlvbklkLCBTdHJpbmcgYXJlYSwgU3RyaW5nIHV1aWQsCi0gICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UpIHRocm93cyBJbmRleEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgc2Vzc2lvbi4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSByZXNvdXJjZSB0eXBlLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbklkIFRoZSBwdWJsaWNhdGlvbiBJRC4KLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gdXVpZCBUaGUgVVVJRC4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlLgotICAgICAqIEB0aHJvd3MgSW5kZXhFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgZGVsZXRlKFNlc3Npb24gc2Vzc2lvbiwgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIHB1YmxpY2F0aW9uSWQsIFN0cmluZyBhcmVhLAotICAgICAgICAgICAgU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIEluZGV4RXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvbHVjZW5lL0luZGV4VXBkYXRlckltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvSW5kZXhVcGRhdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUzYmU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvSW5kZXhVcGRhdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5sdWNlbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LlN0YXJ0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay50aHJlYWQuVGhyZWFkU2FmZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5JbmRleEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLlNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5PYnNlcnZhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5BcmVhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBJbmRleCB1cGRhdGVyIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhVcGRhdGVySW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIEluZGV4VXBkYXRlciwgU3RhcnRhYmxlLAotICAgICAgICBTZXJ2aWNlYWJsZSwgVGhyZWFkU2FmZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBldmVudEZpcmVkKFJlcG9zaXRvcnlFdmVudCByZXBvRXZlbnQpIHsKLQotICAgICAgICBpZiAoIShyZXBvRXZlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEV2ZW50KSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50RXZlbnQgZXZlbnQgPSAoRG9jdW1lbnRFdmVudCkgcmVwb0V2ZW50OwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RGVzY3JpcHRvcigpLmVxdWFscyhEb2N1bWVudEV2ZW50LkNIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXgoZXZlbnQuZ2V0U2Vzc2lvbigpLCBldmVudC5nZXRSZXNvdXJjZVR5cGUoKSwgZXZlbnQuZ2V0UHVibGljYXRpb25JZCgpLCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFyZWEoKSwgZXZlbnQuZ2V0VXVpZCgpLCBldmVudC5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0RGVzY3JpcHRvcigpLmVxdWFscyhEb2N1bWVudEV2ZW50LlJFTU9WRUQpKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlKGV2ZW50LmdldFNlc3Npb24oKSwgZXZlbnQuZ2V0UmVzb3VyY2VUeXBlKCksIGV2ZW50LmdldFB1YmxpY2F0aW9uSWQoKSwgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBcmVhKCksIGV2ZW50LmdldFV1aWQoKSwgZXZlbnQuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSW5kZXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbmRleChTdHJpbmcgb3BlcmF0aW9uLCBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCBTdHJpbmcgcHViSWQsCi0gICAgICAgICAgICBTdHJpbmcgYXJlYSwgU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdXJpID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGZvcm1hdHMgPSByZXNvdXJjZVR5cGUuZ2V0Rm9ybWF0cygpOwotICAgICAgICAgICAgaWYgKEFycmF5cy5hc0xpc3QoZm9ybWF0cykuY29udGFpbnMoImx1Y2VuZUluZGV4IikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZG9jU3RyaW5nID0gcHViSWQgKyAiLyIgKyBhcmVhICsgIi8iICsgdXVpZCArICIvIiArIGxhbmd1YWdlOwotICAgICAgICAgICAgICAgIC8vICsgZXZlbnQuZ2V0RG9jdW1lbnRVcmwoKTsKLSAgICAgICAgICAgICAgICB1cmkgPSAiY29jb29uOi8vbW9kdWxlcy9sdWNlbmUvIiArIG9wZXJhdGlvbiArICItZG9jdW1lbnQvIiArIGRvY1N0cmluZzsKLSAgICAgICAgICAgICAgICBTb3VyY2VVdGlsLnJlYWRET00odXJpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50IFsiICsgcHViSWQgKyAiOiIgKyBhcmVhICsgIjoiICsgdXVpZCArICI6IiArIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gaXMgbm90IGJlaW5nIGluZGV4ZWQgYmVjYXVzZSByZXNvdXJjZSB0eXBlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSArICJdIGRvZXMgbm90IHN1cHBvcnQgaW5kZXhpbmchIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiSW52b2tpbmcgaW5kZXhpbmcgZmFpbGVkIGZvciBVUkwgWyIgKyB1cmkgKyAiXTogIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPYnNlcnZhdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlZ2lzdHJ5ID0gKE9ic2VydmF0aW9uUmVnaXN0cnkpIHRoaXMubWFuYWdlci5sb29rdXAoT2JzZXJ2YXRpb25SZWdpc3RyeS5ST0xFKTsKLSAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoU2Vzc2lvbiBzZXNzaW9uLCBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCBTdHJpbmcgcHViSWQsIFN0cmluZyBhcmVhLAotICAgICAgICAgICAgU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIEluZGV4RXhjZXB0aW9uIHsKLSAgICAgICAgdXBkYXRlSW5kZXgoImRlbGV0ZSIsIHJlc291cmNlVHlwZSwgcHViSWQsIGFyZWEsIHV1aWQsIGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbmRleChTZXNzaW9uIHNlc3Npb24sIFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUsIFN0cmluZyBwdWJJZCwgU3RyaW5nIGFyZWEsCi0gICAgICAgICAgICBTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgSW5kZXhFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24ocHViSWQpOwotICAgICAgICAgICAgQXJlYSBhcmVhT2JqID0gcHViLmdldEFyZWEoYXJlYSk7Ci0gICAgICAgICAgICBpZiAoYXJlYU9iai5jb250YWlucyh1dWlkLCBsYW5ndWFnZSkpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVJbmRleCgiaW5kZXgiLCByZXNvdXJjZVR5cGUsIHB1YklkLCBhcmVhLCB1dWlkLCBsYW5ndWFnZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yaW5nIGRvY3VtZW50IFsiICsgcHViSWQgKyAiOiIgKyBhcmVhICsgIjoiICsgdXVpZCArICI6IiArIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gYmVjYXVzZSBpdCBkb2Vzbid0IGV4aXN0IChhbnltb3JlKS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvSW5kZXhVcGRhdGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvSW5kZXhVcGRhdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I5Yzk4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvbHVjZW5lL0luZGV4VXBkYXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5sdWNlbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotCi1wdWJsaWMgY2xhc3MgSW5kZXhVcGRhdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGV4VXBkYXRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBsb2dpbigibGVueWEiKTsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbihzZXNzaW9uLCAidGVzdCIpOwotICAgICAgICBTaXRlU3RydWN0dXJlIHNpdGUgPSBwdWIuZ2V0QXJlYSgiYXV0aG9yaW5nIikuZ2V0U2l0ZSgpOwotICAgICAgICAKLSAgICAgICAgU2l0ZU5vZGUgc291cmNlTm9kZSA9IHNpdGUuZ2V0Tm9kZSgiL3R1dG9yaWFsIik7Ci0gICAgICAgIFNpdGVOb2RlIGRlc3ROb2RlID0gc2l0ZS5nZXROb2RlKCIvY29uY2VwdHMiKTsKLSAgICAgICAgCi0gICAgICAgIERvY3VtZW50IHNvdXJjZURvYyA9IHNvdXJjZU5vZGUuZ2V0TGluayhzb3VyY2VOb2RlLmdldExhbmd1YWdlcygpWzBdKS5nZXREb2N1bWVudCgpOwotICAgICAgICBEb2N1bWVudCBkZXN0RG9jID0gZGVzdE5vZGUuZ2V0TGluayhkZXN0Tm9kZS5nZXRMYW5ndWFnZXMoKVswXSkuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgICBzb3VyY2VEb2MuZ2V0UmVwb3NpdG9yeU5vZGUoKS5sb2NrKCk7Ci0KLSAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY01nciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2NNZ3IgPSAoRG9jdW1lbnRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIGRvY01nci5jb3B5KHNvdXJjZURvYywgZGVzdERvYy5nZXRMb2NhdG9yKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRvY01nciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UoZG9jTWdyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGVja1NlYXJjaFJlc3VsdHMocHViLCBQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1NlYXJjaFJlc3VsdHMoUHVibGljYXRpb24gcHViLCBTdHJpbmcgYXJlYSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgU3RyaW5nIHNlYXJjaFVyaSA9ICJjb2Nvb246Ly9tb2R1bGVzL2x1Y2VuZS9zZWFyY2gueG1sP3F1ZXJ5U3RyaW5nPXR1dG9yaWFsIjsKLS8vICAgICAgICBTdHJpbmcgc2VhcmNoVXJpID0gImNvY29vbjovL21vZHVsZXMvbHVjZW5lL3NlYXJjaC8iICsgcHViLmdldElkKCkgKyAiLyIgKyBhcmVhICsgIi54bWwiOwotLy8gICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IHNlYXJjaFJlc3VsdCA9IFNvdXJjZVV0aWwucmVhZERPTShzZWFyY2hVcmksIGdldE1hbmFnZXIoKSk7Ci0gICAgICAgIAotLy8gICAgICAgIERvY3VtZW50SGVscGVyLndyaXRlRG9jdW1lbnQoc2VhcmNoUmVzdWx0LCBTeXN0ZW0ub3V0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2x1Y2VuZS9TZWFyY2hUZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL2x1Y2VuZS9TZWFyY2hUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMWE2ZWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9sdWNlbmUvU2VhcmNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmx1Y2VuZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLkluZGV4OwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLkx1Y2VuZUNvY29vblNlYXJjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkhpdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5UZXJtUXVlcnk7Ci0KLS8qKgotICogVGVzdCBmb3Igc2VhcmNoIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VhcmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEx1Y2VuZUNvY29vblNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKLSAgICAgICAgSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWFyY2hlciA9IChMdWNlbmVDb2Nvb25TZWFyY2hlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChMdWNlbmVDb2Nvb25TZWFyY2hlci5ST0xFKTsKLSAgICAgICAgICAgIGluZGV4TWFuYWdlciA9IChJbmRleE1hbmFnZXIpIGdldE1hbmFnZXIoKS5sb29rdXAoSW5kZXhNYW5hZ2VyLlJPTEUpOwotICAgICAgICAgICAgSW5kZXggaW5kZXggPSBpbmRleE1hbmFnZXIuZ2V0SW5kZXgoInRlc3QtYXV0aG9yaW5nIik7Ci0gICAgICAgICAgICBzZWFyY2hlci5zZXREaXJlY3RvcnkoaW5kZXguZ2V0RGlyZWN0b3J5KCkpOwotCi0gICAgICAgICAgICBUZXJtIHRlcm0gPSBuZXcgVGVybSgiYm9keSIsICJ0dXRvcmlhbCIpOwotICAgICAgICAgICAgUXVlcnkgcXVlcnkgPSBuZXcgVGVybVF1ZXJ5KHRlcm0pOwotCi0gICAgICAgICAgICBIaXRzIGhpdHMgPSBzZWFyY2hlci5zZWFyY2gocXVlcnkpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhlIGluZGV4aW5nIGRvZXNuJ3Qgd29yayBhdCB0aGUgbW9tZW50IHdoZW4gdGhlIHRlc3RzIGFyZSBleGVjdXRlZCBiZWNhdXNlIHRoZQotICAgICAgICAgICAgICogY29jb29uOi8vIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIHRlc3QgZW52aXJvbm1lbnQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIGFzc2VydFRydWUoaGl0cy5sZW5ndGgoKSA+IDApOwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWFyY2hlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2Uoc2VhcmNoZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluZGV4TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UoaW5kZXhNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL21lbnVzLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvbWVudXMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjN2UxOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvbWVudXMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbWVudXMueG1hcCAxNzg3MzggMjAwNS0wNS0yNyAwMzo0MjowOVogZ3JlZ29yICQgLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotICAgIAkKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKioiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9sdWNlbmUvY29uZmlnL21lbnUueHNwIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYxZTM0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU0MiAyMDA2LTA5LTE1IDA4OjE0OjM5WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0iU2VhcmNoIj5TZWFyY2g8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmFuayI+UmFuazwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTY29yZSI+U2NvcmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gVGl0bGUiPihubyB0aXRsZSk8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iaGl0cyI+ezB9IGhpdHM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGFnZXMiPlBhZ2VzPC9tZXNzYWdlPgotICAKLSAgPG1lc3NhZ2Uga2V5PSJpbmRleGluZy1mYWlsZWQtc3ViamVjdCI+SW5kZXhpbmcgZmFpbGVkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImluZGV4aW5nLWZhaWxlZC1ib2R5Ij5UaGUgZG9jdW1lbnQgW3swfTp7MX06ezJ9OnszfV0gY291bGQgbm90IGJlIGluZGV4ZWQ6IHs0fTwvbWVzc2FnZT4KLSAgCi0gIDxtZXNzYWdlIGtleT0iTmV3IFNlYXJjaCBQYWdlIj5OZXcgU2VhcmNoIFBhZ2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmUtSW5kZXggU2l0ZSI+UmUtSW5kZXggU2l0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZS1pbmRleCBzaXRlPyI+RG8geW91IHdhbnQgdG8gcmUtaW5kZXggYWxsIGRvY3VtZW50cyBvZiB0aGlzIHB1YmxpY2F0aW9uIGluIHRoZSBjdXJyZW50IGFyZWE/PC9tZXNzYWdlPgotICANCi08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliZjA2ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpX2RlLnhtbCA0NDY1NDIgMjAwNi0wOS0xNSAwODoxNDozOVogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImRlIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotDQotICA8bWVzc2FnZSBrZXk9IlNlYXJjaCI+U3VjaGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmFuayI+UmFuZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTY29yZSI+UXVvdGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gVGl0bGUiPihrZWluIFRpdGVsKTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJoaXRzIj57MH0gRXJnZWJuaXNzZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQYWdlcyI+U2VpdGVuPC9tZXNzYWdlPgotICANCi0gIDxtZXNzYWdlIGtleT0iaW5kZXhpbmctZmFpbGVkLXN1YmplY3QiPkluZGV4aWVydW5nIGZlaGxnZXNjaGxhZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImluZGV4aW5nLWZhaWxlZC1ib2R5Ij5EYXMgRG9rdW1lbnQgW3swfTp7MX06ezJ9OnszfV0ga29ubnRlIG5pY2h0IGluZGV4aWVydCB3ZXJkZW46IHs0fTwvbWVzc2FnZT4KLSAgCi0gIDxtZXNzYWdlIGtleT0iTmV3IFNlYXJjaCBQYWdlIj5OZXVlIFN1Y2hzZWl0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZS1JbmRleCBTaXRlIj5XZWJzaXRlIG5ldSBpbmRleGllcmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlLWluZGV4IHNpdGU/Ij4KLSAgICBXb2xsZW4gU2llIGFsbGUgRG9rdW1lbnRlIGRpZXNlciBQdWJsaWthdGlvbiBpbiBkZXIgYWt0dWVsbGVuIEFyZWEgbmV1IGluZGV4aWVyZW4/Ci0gIDwvbWVzc2FnZT4KLTwvY2F0YWxvZ3VlPg0KLQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9zaXRlbWFwLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQwMzQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS9zaXRlbWFwLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb21wb25lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8bWFwOmNvbXBvbmVudHM+Ci0KLSAgICA8bWFwOmFjdGlvbnMgZGVmYXVsdD0icmVxdWVzdCI+Ci0gICAgICA8bWFwOmFjdGlvbiBuYW1lPSJyZXF1ZXN0IiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLmFjdGluZy5SZXF1ZXN0UGFyYW1BY3Rpb24iLz4KLSAgICA8L21hcDphY3Rpb25zPgotCi0gICAgPG1hcDp0cmFuc2Zvcm1lcnMgZGVmYXVsdD0ieHNsdCI+Ci0gICAgICA8bWFwOnRyYW5zZm9ybWVyIG5hbWU9ImluZGV4MiIgbG9nZ2VyPSJzaXRlbWFwLnRyYW5zZm9ybWVyLmx1Y2VuZWluZGV4dHJhbnNmb3JtZXIyIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnRyYW5zZm9ybWF0aW9uLkx1Y2VuZUluZGV4VHJhbnNmb3JtZXIyIj4KLSAgICAgICAgPG5vdGlmeSB1c2VyPSJsZW55YSIvPgotICAgICAgPC9tYXA6dHJhbnNmb3JtZXI+Ci0gICAgICA8bWFwOnRyYW5zZm9ybWVyIG5hbWU9ImNpbmNsdWRlIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnRyYW5zZm9ybWF0aW9uLkNJbmNsdWRlVHJhbnNmb3JtZXIiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0idXVpZDJ1cmwiIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24udHJhbnNmb3JtYXRpb24uVXVpZFRvVXJsVHJhbnNmb3JtZXIiLz4KLSAgICA8L21hcDp0cmFuc2Zvcm1lcnM+Ci0KLSAgPC9tYXA6Y29tcG9uZW50cz4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGlwZWxpbmVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ibW9kdWxlcy8qLyoqIj4KLSAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSJtb2R1bGVzL3sxfS8iIHNyYz0iY29udGV4dDovL2xlbnlhL21vZHVsZXMvezF9L3NpdGVtYXAueG1hcCIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im9wZW5zZWFyY2gueG1sIj4KLSAgICAgICAgICA8IS0tIFRPRE86IGltcGxlbWVudCB0aGUgb3BlbnNlYXJjaCByZXN1bHRzIHRvIG1ha2UgdGhlIHNlYXJjaCByZXN1bHRzIGF2YWlsYWJsZSBmb3IgYW4gZXh0ZXJuYWwgYXBwIC0tPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlYXJjaCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHZhbHVlPSJ7aW5kZXgtcGF0aDp7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0te3BhZ2UtZW52ZWxvcGU6YXJlYX19Ii8+Ci0gICAgICAgIDwvbWFwOmdlbmVyYXRlPgotCi0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2x1Y2VuZS94c2x0L3NlYXJjaDJvcGVuc2VhcmNoLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icm9vdCIgdmFsdWU9Ii97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudC11dWlkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbi1pZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50LXR5cGUiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC10eXBlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icGFnZS1sZW5ndGgiIHZhbHVlPSJ7cGFnZUxlbmd0aH0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotCi0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImNpbmNsdWRlIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iZXh0ZXJuYWxvcGVuc2VhcmNoLnhtbCI+Ci0gICAgICAgIDwhLS0gVE9ETzogdGhlIGxvY2F0aW9uIG9mIHRoZSBzZWFyY2hlbmdpbmUgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSBzb21ld2hlcmUgZWxzZSAtLT4KLSAgICAgICAgPCEtLSBUT0RPOiB1c2UgdGhlIHF1ZXJ5U3RyaW5nIHBhcmFtZXRlcjogcmVxdWVzdCBhY3Rpb24gLS0+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvbHVjZW5lL3hzbHQvb3BlbnNlYXJjaC54bWwiLz4KLQotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9sdWNlbmUveHNsdC9vcGVuc2VhcmNoMmh0bWwueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11cmx9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmFyZWF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHViIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icm9vdCIgdmFsdWU9Ii97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJvcGVuc2VhcmNoIiB2YWx1ZT0ib3BlbnNlYXJjaC54bWwiLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotCi0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImNpbmNsdWRlIi8+Ci0KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL3hzbHQvcGFnZTJ4aHRtbC17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC10eXBlfS54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJvb3QiIHZhbHVlPSJ7cHJveHk6L3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudC11dWlkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudC10eXBlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdHlwZX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVybCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXVybH0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotCi0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0gezE6cHVifS97MjphcmVhfS97MzpxdWVyeVN0cmluZ30gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InNlYXJjaC1nZW5lcmF0b3IvKi8qLyoiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlYXJjaCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHZhbHVlPSJ7aW5kZXgtcGF0aDp7MX0tezJ9fSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InF1ZXJ5IiB2YWx1ZT0idGl0bGU6ezN9IE9SIGRlc2NyaXB0aW9uOnszfSBPUiBzdWJqZWN0OnszfSBPUiBib2R5OnszfSIvPgotICAgICAgICA8L21hcDpnZW5lcmF0ZT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSB7MTpwdWJ9L3syOmFyZWF9IC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJzZWFyY2gvKi8qLnhtbCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb2Nvb246L3NlYXJjaC1nZW5lcmF0b3IvezF9L3syfS97cmVxdWVzdC1wYXJhbTpxdWVyeVN0cmluZ30iLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0idXVpZDJ1cmwiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InB1YklkIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9InsyfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ic2VhcmNoLnhtbCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb2Nvb246L3NlYXJjaC97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0ueG1sIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2x1Y2VuZS94c2x0L3NlYXJjaDJodG1sLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJsIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXJsfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTphcmVhfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InB1YiIgdmFsdWU9IntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJvb3QiIHZhbHVlPSIve3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlLXJlcXVlc3QtcGFyYW1ldGVycyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJxdWVyeVN0cmluZyIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOnF1ZXJ5U3RyaW5nfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImNpbmNsdWRlIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InV1aWQydXJsIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDwhLS0ge3B1Yi1pZH0ve2FyZWF9L3t1dWlkfS97bGFuZ3VhZ2V9IC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJpbmRleC1kb2N1bWVudC8qLyovKi8qIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9IntyZXNvdXJjZS10eXBlOntkb2MtaW5mbzp7MX06ezJ9OnszfTp7NH06cmVzb3VyY2VUeXBlfTpmb3JtYXQtbHVjZW5lSW5kZXh9L3sxfS97Mn0vezN9L3s0fSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9sdWNlbmUveHNsdC9pbmRleC54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB2YWx1ZT0iezF9LXsyfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImlkIiB2YWx1ZT0iezN9Ons0fSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImluZGV4MiI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHVibGljYXRpb25JZCIgdmFsdWU9InsxfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJ7Mn0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1dWlkIiB2YWx1ZT0iezN9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibGFuZ3VhZ2UiIHZhbHVlPSJ7NH0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIHtwdWItaWR9L3thcmVhfS97dXVpZH0ve2xhbmd1YWdlfSAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iZGVsZXRlLWRvY3VtZW50LyovKi8qLyoiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29udGV4dDovL2xlbnlhL2NvbnRlbnQvdXRpbC9lbXB0eS54bWwiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvbHVjZW5lL3hzbHQvZGVsZXRlLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHZhbHVlPSJ7MX0tezJ9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaWQiIHZhbHVlPSJ7M306ezR9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLQotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpbmRleDIiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InB1YmxpY2F0aW9uSWQiIHZhbHVlPSJ7MX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhcmVhIiB2YWx1ZT0iezJ9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXVpZCIgdmFsdWU9InszfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0iezR9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3VzZWNhc2VzL2luZGV4U2l0ZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS91c2VjYXNlcy9pbmRleFNpdGUuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMDM0YTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3VzZWNhc2VzL2luZGV4U2l0ZS5qeAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbG9naW4uanggNTI5MTk1IDIwMDctMDQtMTYgMTA6NDU6MjdaIGFuZHJlYXMgJCAtLT4KLQotPHBhZ2U6cGFnZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiIAotICAgICAgICAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgICAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiID4KLQotICA8ang6c2V0IHZhcj0icHViIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncHVibGljYXRpb24nKX0iLz4KLQotICA8cGFnZTp0aXRsZT4KLSAgICA8aTE4bjp0ZXh0PlJlLUluZGV4IFNpdGU8L2kxOG46dGV4dD4KLSAgPC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICA8cD4KLSAgICAgIDxpMThuOnRleHQ+cmUtaW5kZXggc2l0ZT88L2kxOG46dGV4dD4KLSAgICA8L3A+Ci0gICAgPGZvcm0+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPgotICAgICAgPHA+Ci0gICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCIvPgotICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgbmFtZT0iY2FuY2VsIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgIDwvcD4KLSAgICA8L2Zvcm0+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvdXNlY2FzZXMvbHVjZW5lL2V4dGVybmFsT3BlbnNlYXJjaC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS91c2VjYXNlcy9sdWNlbmUvZXh0ZXJuYWxPcGVuc2VhcmNoLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmEzMzM5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS91c2VjYXNlcy9sdWNlbmUvZXh0ZXJuYWxPcGVuc2VhcmNoLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGNpbmNsdWRlOmluY2x1ZGV4bWwgeG1sbnM6Y2luY2x1ZGU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCI+Ci0gIDxjaW5jbHVkZTpzcmM+Y29jb29uOi8vbW9kdWxlcy9sdWNlbmUvZXh0ZXJuYWxvcGVuc2VhcmNoLnhtbDwvY2luY2x1ZGU6c3JjPgotPC9jaW5jbHVkZTppbmNsdWRleG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3VzZWNhc2VzL2x1Y2VuZS9vcGVuc2VhcmNoLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3VzZWNhc2VzL2x1Y2VuZS9vcGVuc2VhcmNoLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjFiZjY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS91c2VjYXNlcy9sdWNlbmUvb3BlbnNlYXJjaC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y2luY2x1ZGU6aW5jbHVkZXhtbCB4bWxuczpjaW5jbHVkZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2luY2x1ZGUvMS4wIj4KLSAgPGNpbmNsdWRlOnNyYz5jb2Nvb246Ly9tb2R1bGVzL2x1Y2VuZS9vcGVuc2VhcmNoLnhtbDwvY2luY2x1ZGU6c3JjPgotPC9jaW5jbHVkZTppbmNsdWRleG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3VzZWNhc2VzL2x1Y2VuZS9zZWFyY2guanggYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvdXNlY2FzZXMvbHVjZW5lL3NlYXJjaC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjNTdmOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUvdXNlY2FzZXMvbHVjZW5lL3NlYXJjaC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxjaW5jbHVkZTppbmNsdWRleG1sIHhtbG5zOmNpbmNsdWRlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaW5jbHVkZS8xLjAiPgotICA8Y2luY2x1ZGU6c3JjPmNvY29vbjovL21vZHVsZXMvbHVjZW5lL3NlYXJjaC54bWw8L2NpbmNsdWRlOnNyYz4KLTwvY2luY2x1ZGU6aW5jbHVkZXhtbD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS94c2x0L2RlbGV0ZS54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9kZWxldGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWEzMDRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS94c2x0L2RlbGV0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6bHVjZW5lPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbHVjZW5lLzEuMCIKLSAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIKLSAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgotPgotCi08eHNsOnBhcmFtIG5hbWU9ImluZGV4Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImlkIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPiAgCi0gIDxsdWNlbmU6ZGVsZXRlIGluZGV4aWQ9InskaW5kZXh9Ij4KLSAgICA8bHVjZW5lOmRvY3VtZW50IHVpZD0ieyRpZH0iLz4KLSAgPC9sdWNlbmU6ZGVsZXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9pbmRleC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9pbmRleC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDk1NWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3hzbHQvaW5kZXgueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmx1Y2VuZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2x1Y2VuZS8xLjAiCi0gIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiCi0gIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKLT4KLQotPHhzbDpwYXJhbSBuYW1lPSJpbmRleCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpZCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvbHVjZW5lOmluZGV4Ij4KLSAgPGx1Y2VuZTppbmRleCBjbGVhcj0iZmFsc2UiIGluZGV4aWQ9InskaW5kZXh9IiBtZXJnZS1mYWN0b3I9IjEwMCI+Ci0gICAgPGx1Y2VuZTpkb2N1bWVudCB1aWQ9InskaWR9Ij4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibHVjZW5lOmRvY3VtZW50LyoiLz4KLSAgICA8L2x1Y2VuZTpkb2N1bWVudD4KLSAgPC9sdWNlbmU6aW5kZXg+ICAKLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICA8eHNsOmNvcHk+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgPC94c2w6Y29weT4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3hzbHQvb3BlbnNlYXJjaC54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9vcGVuc2VhcmNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyZjQyOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9vcGVuc2VhcmNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotICA8cnNzIHhtbG5zOm9wZW5TZWFyY2g9Imh0dHA6Ly9hOS5jb20vLS9zcGVjL29wZW5zZWFyY2hyc3MvMS4wLyIgPgotICAgIDxjaGFubmVsPgotICAgICAgPHRpdGxlPmhpc3Rvcnk8L3RpdGxlPgotICAgICAgPGxpbms+aGlzdG9yeTwvbGluaz4KLSAgICAgIDxkZXNjcmlwdGlvbj5TZWFyY2ggQTkuY29tPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxsYW5ndWFnZT5lbi11czwvbGFuZ3VhZ2U+Ci0gICAgICA8b3BlblNlYXJjaDp0b3RhbFJlc3VsdHM+NDIzMDAwMDwvb3BlblNlYXJjaDp0b3RhbFJlc3VsdHM+Ci0gICAgICA8b3BlblNlYXJjaDpzdGFydEluZGV4PjE8L29wZW5TZWFyY2g6c3RhcnRJbmRleD4KLSAgICAgIDxvcGVuU2VhcmNoOml0ZW1zUGVyUGFnZT4xMDwvb3BlblNlYXJjaDppdGVtc1BlclBhZ2U+Ci0gICAgICA8bnV0Y2g6cXVlcnkgeG1sbnM6bnV0Y2g9Imh0dHA6Ly93d3cubnV0Y2gub3JnL29wZW5zZWFyY2hyc3MvMS4wLyI+b2ZkPC9udXRjaDpxdWVyeT4KLSAgICAgIDxpdGVtPgotICAgICAgICA8dGl0bGU+TmV3IFlvcmsgQ2l0eSBIaXN0b3J5PC90aXRsZT4KLSAgICAgICAgPGxpbms+aHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvY3UvbHdlYi9lZ3VpZGVzL2FtZXJpaGlzdC9ueWMuaHRtbDwvbGluaz4KLSAgICAgICAgPGRlc2NyaXB0aW9uPi4uLiBIYXJsZW0uTllDIC0gQSB2aXJ0dWFsIHRvdXIgYW5kIGluZm9ybWF0aW9uIG9uIAotICAgICAgICBidXNpbmVzc2VzIC4uLiAgd2l0aCBoaXN0b3JpYyBwaG90b3Mgb2YgQ29sdW1iaWEncyBvd24gTmV3IFlvcmsgCi0gICAgICAgIG5laWdoYm9yaG9vZCAuLi4gSW50ZXJuZXQgUmVzb3VyY2VzIGZvciB0aGUgQ2l0eSdzIEhpc3RvcnkuIC4uLjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2l0ZW0+Ci0gICAgICA8aXRlbT4KLSAgICAgICAgPHRpdGxlPkdvdGhhbSBDZW50ZXIgZm9yIE5ldyBZb3JrIENpdHkgSGlzdG9yeTwvdGl0bGU+Ci0gICAgICAgIDxsaW5rPmh0dHA6Ly93d3cuZ290aGFtY2VudGVyLm9yZy88L2xpbms+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4uLi4gU3VibWl0IEV2ZW50cyBFZGl0IFlvdXIgU3VibWlzc2lvbi4gTWFpbiBOZWlnaGJvcmhvb2QKLSAgICAgICAgU3RvcmllcyBOWUMgSGlzdG9yeSBpbiB0aGUgLi4uIFRoZSBHb3RoYW0gQ2VudGVyIGZvciBOZXcgWW9yayBDaXR5IEhpc3RvcnkKLSAgICAgICAgaXMgc3VwcG9ydGVkIGJ5IFRoZSBDVU5ZIEdyYWR1YXRlIC4uLjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2l0ZW0+Ci0gICAgICA8aXRlbT4KLSAgICAgICAgPHRpdGxlPldlbGNvbWUgdG8gdGhlIE11c2V1bSBvZiB0aGUgQ2l0eSBvZiBOZXcgWW9yazwvdGl0bGU+Ci0gICAgICAgIDxsaW5rPmh0dHA6Ly93d3cubWNueS5vcmcvPC9saW5rPgotICAgICAgICA8ZGVzY3JpcHRpb24+Li4uIGEgbGlzdCB3aXRoIHRoZSBldmVudCBzdGFmZi4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgICAgICB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maXJtaW5nIGVtYWlsLiAgTXVzZXVtIG9mIHRoZSBDaXR5Ci0gICAgICAgIG9mIE5ldyBZb3JrLjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2l0ZW0+Ci0gICAgPC9jaGFubmVsPgotICA8L3Jzcz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS94c2x0L29wZW5zZWFyY2gyaHRtbC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9vcGVuc2VhcmNoMmh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGVlMzQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS94c2x0L29wZW5zZWFyY2gyaHRtbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gQ1ZTICRJZDogc2VhcmNoMmh0bWwueHNsIDQ3Mjg1IDIwMDQtMDktMjcgMTI6NTI6NDRaIGN6aWVnZWxlciAkIC0tPgotPHhzbDpzdHlsZXNoZWV0IAotICB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczpzZWFyY2g9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zZWFyY2gvMS4wIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6Y2luY2x1ZGU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCIKLSAgeG1sbnM6b3BlblNlYXJjaD0iaHR0cDovL2E5LmNvbS8tL3NwZWMvb3BlbnNlYXJjaHJzcy8xLjAvIgotICB4bWxuczpudXRjaD0iaHR0cDovL3d3dy5udXRjaC5vcmcvb3BlbnNlYXJjaHJzcy8xLjAvIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGh0bWwgY2luY2x1ZGUgc2VhcmNoIHhzbCBvcGVuU2VhcmNoIgotPgotCi08eHNsOnBhcmFtIG5hbWU9InVybCIvPgotPHhzbDpwYXJhbSBuYW1lPSJhcmVhIi8+Ci08eHNsOnBhcmFtIG5hbWU9InB1YiIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb290Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im9wZW5zZWFyY2giLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvcnNzL2NoYW5uZWwiPiAgCi0gICAgPGNtc2JvZHk+Ci0gICAgICA8Y2luY2x1ZGU6aW5jbHVkZSBzcmM9ImNvY29vbjovbW9kdWxlcy9zaXRldHJlZS97JHB1Yn0veyRhcmVhfS9icmVhZGNydW1ieyR1cmx9LnhtbCIvPgotICAgICAgPGNpbmNsdWRlOmluY2x1ZGUgc3JjPSJjb2Nvb246L21vZHVsZXMvc2l0ZXRyZWUveyRwdWJ9L3skYXJlYX0vbWVudXskdXJsfS54bWwiLz4KLSAgICAgIDxjaW5jbHVkZTppbmNsdWRlIHNyYz0iY29jb29uOi9tb2R1bGVzL3NpdGV0cmVlL3skcHVifS97JGFyZWF9L3RhYnN7JHVybH0ueG1sIi8+Ci0gICAgICA8Y2luY2x1ZGU6aW5jbHVkZSBzcmM9ImNvY29vbjovbW9kdWxlcy9zaXRldHJlZS97JHB1Yn0veyRhcmVhfS9zZWFyY2h7JHVybH0ueG1sIi8+ICAgICAgCi0gICAgICA8eGh0bWw6ZGl2IGlkPSJib2R5Ij4KLSAgICAgICAgPGgxPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvcGVuU2VhcmNoOnRvdGFsUmVzdWx0cyIvPiBoaXQocykgb24gc2VhcmNoIGVuZ2luZQotICAgICAgICAgIDxhIGhyZWY9IntsaW5rfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRpdGxlIi8+PC9hPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibnV0Y2g6cXVlcnkiLz4KLQk8L2gxPgotCQotCTxwPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXNjcmlwdGlvbiIvPjwvcD4KLSAgICAgICAgPHVsPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaXRlbSIvPgotICAgICAgICA8L3VsPgotICAgICAgICA8cD48YSBocmVmPSJ7JHJvb3R9eyR1cmx9Ij5SZXR1cm4gdG8gZG9jdW1lbnQ8L2E+PC9wPgotICAgICAgPC94aHRtbDpkaXY+Ci0gICAgPC9jbXNib2R5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJudXRjaDpxdWVyeSI+Ci0gICAgd2l0aCBxdWVyeSA8ZW0+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L2VtPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJpdGVtIj4KLSAgICA8bGk+Ci0gICAgICA8aDI+PGEgaHJlZj0ie2xpbmt9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0idGl0bGUiLz48L2E+PC9oMj4KLSAgICAgIDxwPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXNjcmlwdGlvbiIvPjwvcD4KLSAgICA8L2xpPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIiBwcmlvcml0eT0iLTEiPgotPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS94c2x0L3NlYXJjaDJodG1sLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL2x1Y2VuZS94c2x0L3NlYXJjaDJodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0NjZkOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9zZWFyY2gyaHRtbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tIENWUyAkSWQ6IHNlYXJjaDJodG1sLnhzbCA0NzI4NSAyMDA0LTA5LTI3IDEyOjUyOjQ0WiBjemllZ2VsZXIgJCAtLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczpzZWFyY2g9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zZWFyY2gvMS4wIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmNpbmNsdWRlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaW5jbHVkZS8xLjAiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIKLSAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9ImNpbmNsdWRlIHNlYXJjaCB4aHRtbCIKLT4KLQotICA8eHNsOnBhcmFtIG5hbWU9InVybCIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImFyZWEiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJwdWIiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJyb290Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibGVueWEudXNlY2FzZSIvPgotICA8eHNsOnBhcmFtIG5hbWU9InF1ZXJ5U3RyaW5nIi8+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9InVzZWNhc2VQYXJhbSI+Ci0gICAgPHhzbDppZiB0ZXN0PSIkbGVueWEudXNlY2FzZSAhPSAnJyI+Ci0gICAgICA8eHNsOnRleHQ+bGVueWEudXNlY2FzZT08L3hzbDp0ZXh0PgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsZW55YS51c2VjYXNlIi8+Ci0gICAgICA8eHNsOnRleHQ+JmFtcDs8L3hzbDp0ZXh0PgotICAgIDwveHNsOmlmPgotICA8L3hzbDp2YXJpYWJsZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNlYXJjaDpyZXN1bHRzIj4gIAotICAgIDxkaXYgaWQ9ImJvZHkiPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwvZGl2PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWFyY2g6aGl0cyI+Ci0gICAgPCEtLQotICAgIDxoMT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0b3RhbC1jb3VudCIvPiBoaXQ8eHNsOmlmIHRlc3Q9IkB0b3RhbC1jb3VudCAmZ3Q7IDEiPnM8L3hzbDppZj4KLSAgICAgICAgPHhzbDp0ZXh0PiwgPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb3VudC1vZi1wYWdlcyIvPiByZXN1bHQgcGFnZTx4c2w6aWYgdGVzdD0iQGNvdW50LW9mLXBhZ2VzICZndDsgMSI+czwveHNsOmlmPiBvbiBxdWVyeQotICAgICAgICA8ZW0+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9AcXVlcnktc3RyaW5nIi8+PC9lbT4KLSAgICA8L2gxPgotICAgIC0tPgotICAgIDxoMT48aTE4bjp0ZXh0PlNlYXJjaDwvaTE4bjp0ZXh0PjwvaDE+Ci0gICAgPGZvcm0gY2xhc3M9InNlYXJjaC1yZXN1bHRzLWZvcm0iIGFjdGlvbj0iIiBtZXRob2Q9ImdldCI+Ci0gICAgICA8aW5wdXQgbmFtZT0icXVlcnlTdHJpbmciIHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDogNDAwcHgiIHZhbHVlPSJ7JHF1ZXJ5U3RyaW5nfSIKLSAgICAgIC8+JiMxNjA7PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU2VhcmNoIiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgPC9mb3JtPgotICAgIAotICAgIDxoMj4KLSAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgPGkxOG46dGV4dD5oaXRzPC9pMThuOnRleHQ+Ci0gICAgICAgIDxpMThuOnBhcmFtPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdG90YWwtY291bnQiLz48L2kxOG46cGFyYW0+Ci0gICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgIDwvaDI+Ci0gICAgPHVsIGNsYXNzPSJzZWFyY2gtcmVzdWx0cyI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC91bD4KLSAgICAKLSAgICA8cD4KLSAgICAgIDxpMThuOnRleHQ+UGFnZXM8L2kxOG46dGV4dD48eHNsOnRleHQ+OiA8L3hzbDp0ZXh0PgotCi0gICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KC9zZWFyY2g6cmVzdWx0cy9zZWFyY2g6bmF2aWdhdGlvbi9zZWFyY2g6bmF2aWdhdGlvbi1wYWdlKSAmZ3Q7IDEiPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3NlYXJjaDpyZXN1bHRzL3NlYXJjaDpuYXZpZ2F0aW9uL3NlYXJjaDpuYXZpZ2F0aW9uLXBhZ2UiPgotICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJuYXZpZ2F0aW9uLWxpbmsiPiAKLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJxdWVyeS1zdHJpbmciIHNlbGVjdD0iL3NlYXJjaDpyZXN1bHRzL0BxdWVyeS1zdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWdlLWxlbmd0aCIgc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvQHBhZ2UtbGVuZ3RoIi8+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RhcnQtaW5kZXgiIHNlbGVjdD0iQHN0YXJ0LWluZGV4Ii8+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGluay10ZXh0IiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4KLSAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDwveHNsOmlmPiAgCi0gICAgICAKLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJuYXZpZ2F0aW9uLXBhZ2luZy1saW5rIj4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InF1ZXJ5LXN0cmluZyIgc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvQHF1ZXJ5LXN0cmluZyIvPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFnZS1sZW5ndGgiIHNlbGVjdD0iL3NlYXJjaDpyZXN1bHRzL0BwYWdlLWxlbmd0aCIvPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaGFzLXByZXZpb3VzIiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9zZWFyY2g6bmF2aWdhdGlvbi9AaGFzLXByZXZpb3VzIi8+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJoYXMtbmV4dCIgc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvc2VhcmNoOm5hdmlnYXRpb24vQGhhcy1uZXh0Ii8+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwcmV2aW91cy1pbmRleCIgc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvc2VhcmNoOm5hdmlnYXRpb24vQHByZXZpb3VzLWluZGV4Ii8+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuZXh0LWluZGV4IiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9zZWFyY2g6bmF2aWdhdGlvbi9AbmV4dC1pbmRleCIvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3A+Ci0gICAgCi0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InNlYXJjaDpuYXZpZ2F0aW9uIj4KLSAgICA8IS0tCi0gICAgPHA+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im5hdmlnYXRpb24tcGFnaW5nLWZvcm0iPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InF1ZXJ5LXN0cmluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9AcXVlcnktc3RyaW5nIi8+PC94c2w6d2l0aC1wYXJhbT4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWdlLWxlbmd0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9AcGFnZS1sZW5ndGgiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imhhcy1wcmV2aW91cyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBoYXMtcHJldmlvdXMiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imhhcy1uZXh0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhhcy1uZXh0Ii8+PC94c2w6d2l0aC1wYXJhbT4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwcmV2aW91cy1pbmRleCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmV2aW91cy1pbmRleCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmV4dC1pbmRleCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuZXh0LWluZGV4Ii8+PC94c2w6d2l0aC1wYXJhbT4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwvcD4KLSAgICAtLT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWFyY2g6aGl0Ij4KLSAgICA8bGkgY2xhc3M9InNlYXJjaC1yZXN1bHQiPgotICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoLXJlc3VsdC1yYW5rIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJhbmsgKyAxIi8+LiA8L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC1yZXN1bHQtdGl0bGUiPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlRmllbGQiIHNlbGVjdD0ic2VhcmNoOmZpZWxkW2F0dHJpYnV0ZTo6bmFtZT0ndGl0bGUnXSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlIj4KLSAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3JtYWxpemUtc3BhY2UoJHRpdGxlRmllbGQpICE9ICcnIj4KLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZUZpZWxkIi8+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PGkxOG46dGV4dD5ObyBUaXRsZTwvaTE4bjp0ZXh0PjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm9ybWFsaXplLXNwYWNlKHNlYXJjaDpmaWVsZFtAbmFtZSA9ICd1aWQnXSkgIT0gJyciPgotICAgICAgICAgICAgPGEgaHJlZj0ieyRyb290fXtzZWFyY2g6ZmllbGRbYXR0cmlidXRlOjpuYW1lPSd1aWQnXX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L2E+Ci0gICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz4gKDxpMThuOnRleHQ+bm90IGluIHNpdGUgc3RydWN0dXJlPC9pMThuOnRleHQ+KQotICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgPHNwYW4gY2xhc3M9InNlYXJjaC1yZXN1bHQtc2NvcmUiPiAoPGkxOG46dGV4dD5TY29yZTwvaTE4bjp0ZXh0PjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoIEBzY29yZSwgJyMjIyAlJyApIi8+KTwvc3Bhbj4KLSAgICAgIDwvZGl2PgotICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoLXJlc3VsdC1kZXNjcmlwdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InNlYXJjaDpmaWVsZFthdHRyaWJ1dGU6Om5hbWU9J2Rlc2NyaXB0aW9uJ10iLz48L2Rpdj4KLSAgICA8L2xpPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG5hbWU9Im5hdmlnYXRpb24tcGFnaW5nLWZvcm0iPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icGFnZS1sZW5ndGgiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imhhcy1wcmV2aW91cyIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iaGFzLW5leHQiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InByZXZpb3VzLWluZGV4Ii8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJuZXh0LWluZGV4Ii8+Ci0KLSAgICA8eHNsOmlmIHRlc3Q9IiRoYXMtcHJldmlvdXMgPSAndHJ1ZSciPgotICAgICAgPGZvcm0gYWN0aW9uPSIiIGlkPSJmb3JtLXByZXZpb3VzIj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkbGVueWEudXNlY2FzZSAhPSAnJyI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9InskbGVueWEudXNlY2FzZX0iLz4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InN0YXJ0SW5kZXgiIHZhbHVlPSJ7JHByZXZpb3VzLWluZGV4fSIvPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJxdWVyeVN0cmluZyIgdmFsdWU9InskcXVlcnlTdHJpbmd9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhZ2VMZW5ndGgiIHZhbHVlPSJ7JHBhZ2UtbGVuZ3RofSIvPgotICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJwcmV2aW91cyIgdmFsdWU9IlByZXZpb3VzIiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICA8L2Zvcm0+Ci0gICAgPC94c2w6aWY+Ci0gICAgCi0gICAgPHhzbDppZiB0ZXN0PSIkaGFzLW5leHQgPSAndHJ1ZSciPgotICAgICAgPGZvcm0gYWN0aW9uPSIiIGlkPSJmb3JtLW5leHQiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImxlbnlhLnVzZWNhc2UgIT0gJyciPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSJ7JGxlbnlhLnVzZWNhc2V9Ii8+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzdGFydEluZGV4IiB2YWx1ZT0ieyRuZXh0LWluZGV4fSIvPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJxdWVyeVN0cmluZyIgdmFsdWU9InskcXVlcnlTdHJpbmd9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhZ2VMZW5ndGgiIHZhbHVlPSJ7JHBhZ2UtbGVuZ3RofSIvPgotICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJuZXh0IiB2YWx1ZT0iTmV4dCIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgPC9mb3JtPgotICAgIDwveHNsOmlmPgotICAgIAotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG5hbWU9Im5hdmlnYXRpb24tcGFnaW5nLWxpbmsiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icGFnZS1sZW5ndGgiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imhhcy1wcmV2aW91cyIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iaGFzLW5leHQiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InByZXZpb3VzLWluZGV4Ii8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJuZXh0LWluZGV4Ii8+Ci0KLSAgICA8eHNsOmlmIHRlc3Q9IiRoYXMtcHJldmlvdXMgPSAndHJ1ZSciPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im5hdmlnYXRpb24tbGluayI+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWdlLWxlbmd0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWdlLWxlbmd0aCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdGFydC1pbmRleCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmV2aW91cy1pbmRleCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJsaW5rLXRleHQiPiZsdDs8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgPHhzbDppZiB0ZXN0PSIkaGFzLW5leHQgPSAndHJ1ZSciPgotICAgICAgPGEgaHJlZj0iP3skdXNlY2FzZVBhcmFtfXN0YXJ0SW5kZXg9eyRuZXh0LWluZGV4fSZhbXA7cXVlcnlTdHJpbmc9eyRxdWVyeVN0cmluZ30mYW1wO3BhZ2VMZW5ndGg9eyRwYWdlLWxlbmd0aH0iPgotICAgICAgICA8eHNsOnRleHQ+Jmd0OzwveHNsOnRleHQ+Ci0gICAgICA8L2E+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJuYXZpZ2F0aW9uLWxpbmsiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icXVlcnktc3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwYWdlLWxlbmd0aCIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RhcnQtaW5kZXgiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImxpbmstdGV4dCIvPgotCi0gICAgPGEgaHJlZj0iP3skdXNlY2FzZVBhcmFtfXN0YXJ0SW5kZXg9eyRzdGFydC1pbmRleH0mYW1wO3F1ZXJ5U3RyaW5nPXskcXVlcnlTdHJpbmd9JmFtcDtwYWdlTGVuZ3RoPXskcGFnZS1sZW5ndGh9Ij4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluay10ZXh0Ii8+Ci0gICAgPC9hPgotICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIiBwcmlvcml0eT0iLTIiPjx4c2w6Y29weT48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPjwveHNsOmNvcHk+PC94c2w6dGVtcGxhdGU+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSIgcHJpb3JpdHk9Ii0xIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9zZWFyY2gyb3BlbnNlYXJjaC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9sdWNlbmUveHNsdC9zZWFyY2gyb3BlbnNlYXJjaC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZjgwMzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbHVjZW5lL3hzbHQvc2VhcmNoMm9wZW5zZWFyY2gueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSBDVlMgJElkOiBzZWFyY2gyaHRtbC54c2wgNDcyODUgMjAwNC0wOS0yNyAxMjo1Mjo0NFogY3ppZWdlbGVyICQgLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6c2VhcmNoPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2VhcmNoLzEuMCIKLSAgeG1sbnM6b3BlblNlYXJjaD0iaHR0cDovL2E5LmNvbS8tL3NwZWMvb3BlbnNlYXJjaHJzcy8xLjAvIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ib3BlblNlYXJjaCIKLT4KLQotPHhzbDpwYXJhbSBuYW1lPSJsYW5ndWFnZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb290Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InB1YmxpY2F0aW9uLWlkIi8+Ci08eHNsOnBhcmFtIG5hbWU9InBhZ2UtbGVuZ3RoIi8+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2VhcmNoOnJlc3VsdHMiPiAgCi0gICAgPHJzcyB2ZXJzaW9uPSIyLjAiPgotICAgICAgPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHVibGljYXRpb24taWQiLz48L3RpdGxlPgotICAgICAgPGxpbms+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb290Ii8+PC9saW5rPgotICAgICAgPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8bGFuZ3VhZ2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsYW5ndWFnZSIvPjwvbGFuZ3VhZ2U+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9yc3M+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2VhcmNoOmhpdHMiPgotICAgICAgPG9wZW5TZWFyY2g6dG90YWxSZXN1bHRzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdG90YWwtY291bnQiLz48L29wZW5TZWFyY2g6dG90YWxSZXN1bHRzPgotICAgICAgPG9wZW5TZWFyY2g6c3RhcnRJbmRleD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvdW50LW9mLXBhZ2VzIi8+PC9vcGVuU2VhcmNoOnN0YXJ0SW5kZXg+Ci0gICAgICA8b3BlblNlYXJjaDppdGVtc1BlclBhZ2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWdlLWxlbmd0aCIvPjwvb3BlblNlYXJjaDppdGVtc1BlclBhZ2U+Ci0gICAgICAKLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvc2VhcmNoOm5hdmlnYXRpb24vc2VhcmNoOm5hdmlnYXRpb24tcGFnZSI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJuYXZpZ2F0aW9uLWxpbmsiPiAKLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icXVlcnktc3RyaW5nIiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9AcXVlcnktc3RyaW5nIi8+Ci0gICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhZ2UtbGVuZ3RoIiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9AcGFnZS1sZW5ndGgiLz4KLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RhcnQtaW5kZXgiIHNlbGVjdD0iQHN0YXJ0LWluZGV4Ii8+Ci0gICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImxpbmstdGV4dCIgc2VsZWN0PSJwb3NpdGlvbigpIi8+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAKLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibmF2aWdhdGlvbi1wYWdpbmctbGluayI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icXVlcnktc3RyaW5nIiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9AcXVlcnktc3RyaW5nIi8+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFnZS1sZW5ndGgiIHNlbGVjdD0iL3NlYXJjaDpyZXN1bHRzL0BwYWdlLWxlbmd0aCIvPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imhhcy1wcmV2aW91cyIgc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvc2VhcmNoOm5hdmlnYXRpb24vQGhhcy1wcmV2aW91cyIvPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imhhcy1uZXh0IiBzZWxlY3Q9Ii9zZWFyY2g6cmVzdWx0cy9zZWFyY2g6bmF2aWdhdGlvbi9AaGFzLW5leHQiLz4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwcmV2aW91cy1pbmRleCIgc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvc2VhcmNoOm5hdmlnYXRpb24vQHByZXZpb3VzLWluZGV4Ii8+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmV4dC1pbmRleCIgc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvc2VhcmNoOm5hdmlnYXRpb24vQG5leHQtaW5kZXgiLz4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIAotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2VhcmNoOm5hdmlnYXRpb24iPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJuYXZpZ2F0aW9uLXBhZ2luZy1mb3JtIj4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJxdWVyeS1zdHJpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvQHF1ZXJ5LXN0cmluZyIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFnZS1sZW5ndGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvc2VhcmNoOnJlc3VsdHMvQHBhZ2UtbGVuZ3RoIi8+PC94c2w6d2l0aC1wYXJhbT4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJoYXMtcHJldmlvdXMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaGFzLXByZXZpb3VzIi8+PC94c2w6d2l0aC1wYXJhbT4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJoYXMtbmV4dCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBoYXMtbmV4dCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icHJldmlvdXMtaW5kZXgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJldmlvdXMtaW5kZXgiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5leHQtaW5kZXgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmV4dC1pbmRleCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWFyY2g6aGl0Ij4KLSAgICAgIDxpdGVtPgotICAgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InNlYXJjaDpmaWVsZFtAbmFtZT0ndGl0bGUnXSIvPjwvdGl0bGU+Ci0gICAgICAgIDxsaW5rPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJpIi8+PC9saW5rPgotICAgICAgICA8ZGVzY3JpcHRpb24+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InNlYXJjaDpmaWVsZFtAbmFtZT0nZGVzY3JpcHRpb24nXSIvPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2l0ZW0+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0ibmF2aWdhdGlvbi1wYWdpbmctZm9ybSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJxdWVyeS1zdHJpbmciLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InBhZ2UtbGVuZ3RoIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJoYXMtcHJldmlvdXMiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imhhcy1uZXh0Ii8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwcmV2aW91cy1pbmRleCIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ibmV4dC1pbmRleCIvPgotCi0gICAgPHhzbDppZiB0ZXN0PSIkaGFzLXByZXZpb3VzID0gJ3RydWUnIj4KLSAgICAgIDxmb3JtIGFjdGlvbj0iZmluZEl0IiBpZD0iZm9ybS1vcGVuc2VhcmNoX3ByZXZpb3VzIj4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3RhcnRJbmRleCIgdmFsdWU9InskcHJldmlvdXMtaW5kZXh9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InF1ZXJ5U3RyaW5nIiB2YWx1ZT0ieyRxdWVyeS1zdHJpbmd9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhZ2VMZW5ndGgiIHZhbHVlPSJ7JHBhZ2UtbGVuZ3RofSIvPgotICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJwcmV2aW91cyIgdmFsdWU9InByZXZpb3VzIi8+Ci0gICAgICA8L2Zvcm0+Ci0gICAgPC94c2w6aWY+Ci0gICAgCi0gICAgPHhzbDppZiB0ZXN0PSIkaGFzLW5leHQgPSAndHJ1ZSciPgotICAgICAgPGZvcm0gYWN0aW9uPSJmaW5kSXQiIGlkPSJmb3JtLW9wZW5zZWFyY2hfbmV4dCI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InN0YXJ0SW5kZXgiIHZhbHVlPSJ7JG5leHQtaW5kZXh9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InF1ZXJ5U3RyaW5nIiB2YWx1ZT0ieyRxdWVyeS1zdHJpbmd9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhZ2VMZW5ndGgiIHZhbHVlPSJ7JHBhZ2UtbGVuZ3RofSIvPgotICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJuZXh0IiB2YWx1ZT0ibmV4dCIvPgotICAgICAgPC9mb3JtPgotICAgIDwveHNsOmlmPgotICAgIAotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG5hbWU9Im5hdmlnYXRpb24tcGFnaW5nLWxpbmsiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icXVlcnktc3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwYWdlLWxlbmd0aCIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iaGFzLXByZXZpb3VzIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJoYXMtbmV4dCIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icHJldmlvdXMtaW5kZXgiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im5leHQtaW5kZXgiLz4KLQotICAgIDx4c2w6aWYgdGVzdD0iJGhhcy1wcmV2aW91cyA9ICd0cnVlJyI+Ci0gICAgICAKLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJuYXZpZ2F0aW9uLWxpbmsiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icXVlcnktc3RyaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5LXN0cmluZyIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWdlLWxlbmd0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWdlLWxlbmd0aCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdGFydC1pbmRleCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmV2aW91cy1pbmRleCIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJsaW5rLXRleHQiPlByZXZpb3VzIFBhZ2UgT2YgSGl0czwveHNsOndpdGgtcGFyYW0+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmlmPgotICAgICYjMTYwOwotICAgIDx4c2w6aWYgdGVzdD0iJGhhcy1uZXh0ID0gJ3RydWUnIj4KLSAgICAgIDxhIGhyZWY9ImZpbmRJdD9zdGFydEluZGV4PXskbmV4dC1pbmRleH0mYW1wO3F1ZXJ5U3RyaW5nPXskcXVlcnktc3RyaW5nfSZhbXA7cGFnZUxlbmd0aD17JHBhZ2UtbGVuZ3RofSI+Ci0gICAgICAgIE5leHQgUGFnZSBPZiBIaXRzCi0gICAgICA8L2E+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJuYXZpZ2F0aW9uLWxpbmsiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icXVlcnktc3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwYWdlLWxlbmd0aCIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RhcnQtaW5kZXgiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImxpbmstdGV4dCIvPgotCi0gICAgPGEgaHJlZj0iZmluZEl0P3N0YXJ0SW5kZXg9eyRzdGFydC1pbmRleH0mYW1wO3F1ZXJ5U3RyaW5nPXskcXVlcnktc3RyaW5nfSZhbXA7cGFnZUxlbmd0aD17JHBhZ2UtbGVuZ3RofSI+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpbmstdGV4dCIvPgotICAgIDwvYT4KLSAgICAmIzE2MDsKLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIiBwcmlvcml0eT0iLTIiPjx4c2w6Y29weT48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPjwveHNsOmNvcHk+PC94c2w6dGVtcGxhdGU+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSIgcHJpb3JpdHk9Ii0xIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9tZW51YmFyL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyZDc0My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9tZW51YmFyL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMubWVudWJhcjwvaWQ+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPG5hbWU+TWVudWJhciBNb2R1bGU8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPk1lbnViYXIgbW9kdWxlLjwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL21lbnViYXIvcmVzb3VyY2VzL2ltYWdlcy9pbmRpY2F0b3IuZ2lmIGIvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci9yZXNvdXJjZXMvaW1hZ2VzL2luZGljYXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NWNjYWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci9yZXNvdXJjZXMvaW1hZ2VzL2luZGljYXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9tZW51YmFyL3Jlc291cmNlcy9qYXZhc2NyaXB0L2xvYWRtZW51LmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci9yZXNvdXJjZXMvamF2YXNjcmlwdC9sb2FkbWVudS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiZjI0Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9tZW51YmFyL3Jlc291cmNlcy9qYXZhc2NyaXB0L2xvYWRtZW51LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0qIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0qIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0qICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0qIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLWRvam8ucmVxdWlyZSgiZG9qby5sb2dnaW5nLioiKTsKLWRvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Ci1kb2pvLnJlcXVpcmUoImRvam8uaW8uKiIpOwotCi1mdW5jdGlvbiBsb2FkTWVudShldmVudCkgewotICAgIHZhciBtZW51TnVtYmVyID0gZXZlbnQudGFyZ2V0LmlkLnN1YnN0cmluZygibmF2Ii5sZW5ndGgpOwotCXZhciBtZW51RnVuY3Rpb24gPSB7Ci0JCXVybDogTUVOVV9VUkwgKyAiJmxlbnlhLm1vZHVsZT1tZW51YmFyJmxlbnlhLm1lbnU9IiArIG1lbnVOdW1iZXIsCi0JCWxvYWQ6IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIGV2dCkgewotCQkgICAgdmFyIGRvY0VsZW1lbnQgPSBkYXRhLmRvY3VtZW50RWxlbWVudAotCQkgICAgdmFyIGF0dHJWYWx1ZSA9IGRvY0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgICAgICAgICAgdmFyIG1lbnVOdW1iZXIgPSBhdHRyVmFsdWUuc3Vic3RyaW5nKCJtZW51Ii5sZW5ndGgpOwotCQkJdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWVudSIgKyBtZW51TnVtYmVyKTsKLQkJCXZhciBwbGFjZWhvbGRlckVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWVudVBsYWNlaG9sZGVyIiArIG1lbnVOdW1iZXIpOwotCQkJZWxlbWVudC5yZW1vdmVDaGlsZChwbGFjZWhvbGRlckVsZW1lbnQpOwotCQkJdmFyIGNoaWxkcmVuID0gZG9jRWxlbWVudC5jaGlsZE5vZGVzOwotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRyZW5baV0uY2xvbmVOb2RlKHRydWUpKTsKLQkJCX0KLQkJCWRvam8uZXZlbnQuZGlzY29ubmVjdChkb2pvLmJ5SWQoIm5hdiIgKyBtZW51TnVtYmVyKSwgIm9uY2xpY2siLCAibG9hZE1lbnUiKTsKLQkJfSwKLQkJZXJyb3I6IGZ1bmN0aW9uKHR5cGUsIGVycm9yKSB7Ci0JCQlkb2pvLmxvZy5lcnJvcihlcnJvci5tZXNzYWdlKTsKLQkJfSwKLQkJbWltZXR5cGU6ICJ0ZXh0L3htbCIsCi0JCW1ldGhvZDogIkdFVCIKLQl9OwotCWRvam8uaW8uYmluZChtZW51RnVuY3Rpb24pOwotfQotCi0vKgotKiBDdXN0b21pemUgdGhpcyBtZXRob2QgZm9yIGV2ZW50LWJhc2VkIGxvYWRpbmcuCi0qLwotZnVuY3Rpb24gaW5pdEFqYXgoKSB7Ci0JdmFyIG1lbnVOdW1iZXIgPSA1OwotCWZvciAodmFyIGkgPSAxOyBpIDw9IG1lbnVOdW1iZXI7IGkrKykgewotCQlkb2pvLmV2ZW50LmNvbm5lY3QoZG9qby5ieUlkKCJuYXYiICsgaSksICJvbmNsaWNrIiwgImxvYWRNZW51Iik7Ci0JfQotfQotCi1kb2pvLmFkZE9uTG9hZChpbml0QWpheCk7CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9tZW51YmFyL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL21lbnViYXIvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQwNzYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL21lbnViYXIvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBnbG9iYWwtc2l0ZW1hcC54bWFwIDU0Njg0MCAyMDA3LTA2LTEzIDEyOjM4OjQ1WiBhbmRyZWFzICQgLS0+Ci0gICAgCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gPG1hcDpwaXBlbGluZXM+Ci0gICAKLSAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iZG9qby8qKiI+Ci0gICAgICAgPG1hcDpyZWFkIHNyYz0icmVzb3VyY2U6Ly9vcmcvYXBhY2hlL2NvY29vbi9kb2pvL3Jlc291cmNlcy97MX0iLz4KLSAgICAgPC9tYXA6bWF0Y2g+Ci0gICA8L21hcDpwaXBlbGluZT4gCi0KLSAgICA8bWFwOnBpcGVsaW5lIGludGVybmFsLW9ubHk9InRydWUiPiAgCi0gICAgICAKLSAgICAgIDwhLS0gQUpBWCBtZW51YmFyIC0tPgotICAgICAgPCEtLSBhamF4bWVudS97MTpwdWJJZH0vezI6YXJlYX0vezM6Li4ufSAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iYWpheG1lbnUvKi8qLyoqIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9InhzbHQvZW1wdHlNZW51LnhtbCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9tZW51L21lbnViYXIyeGh0bWwueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbmlkIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9InsyfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50dXJsIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXJsfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50aWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVzZXJpZCIgdmFsdWU9InthY2Nlc3MtY29udHJvbDp1c2VyLWlkfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InNlcnZlcnRpbWUiIHZhbHVlPSJ7ZGF0ZS1pMThuOmN1cnJlbnREYXRlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IndvcmtmbG93c3RhdGUiIHZhbHVlPSJ7d29ya2Zsb3c6c3RhdGV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaXNsaXZlIiB2YWx1ZT0ie3dvcmtmbG93OnZhcmlhYmxlLmlzX2xpdmV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlY2FzZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOmxlbnlhLnVzZWNhc2V9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idGFiR3JvdXAiIHZhbHVlPSJ7dXNlY2FzZTp0YWJHcm91cDp7cmVxdWVzdC1wYXJhbTpsZW55YS51c2VjYXNlfX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJuZXdNZXNzYWdlcyIgdmFsdWU9IntpbmJveDpuZXdNZXNzYWdlQ291bnR9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJ4c2x0L21lbnUyeHNsdC1hamF4LnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYVByZWZpeCIgdmFsdWU9Intwcm94eTovezF9L3syfX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbmlkIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9InsyfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50dXJsIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXJsfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InF1ZXJ5U3RyaW5nIiB2YWx1ZT0ie3JlcXVlc3Q6cXVlcnlTdHJpbmd9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0ie3JlcXVlc3Q6bG9jYWxlfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIAotICAgICAgPCEtLSBtZW51LXhtbC9tb2R1bGVzIC0tPgotICAgICAgPCEtLSBtZW51LXhtbC9tb2R1bGVzL3twdWItaWR9L3thcmVhfS54bWwgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im1lbnUteG1sL21vZHVsZXMvKi8qLnhtbCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJhZ2dyZWdhdGUtZmFsbGJhY2s6Ly9jb25maWcvcHVibGljYXRpb24ueG1sIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L21vZHVsZXMvbW9kdWxlczJ4aW5jbHVkZS54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJ7Mn0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJ4aW5jbHVkZSIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIG1lbnUteG1sL21vZHVsZS97YXJlYX0ve21vZHVsZS1pZH0ueG1sIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJtZW51LXhtbC9tb2R1bGUvKi8qLnhtbCI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Mn0vbWVudXMueG1hcCI+Ci0gICAgICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9Im1lbnUteG1sL21vZHVsZS97MX0vIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Mn0vbWVudXMueG1hcCIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIgcGFzcy10aHJvdWdoPSJ0cnVlIi8+Ci0gICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2VydmVycGFnZXMiIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9jb250ZW50L21lbnVzL2xpdmUueHNwIi8+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgICAgICA8L21hcDpvdGhlcndpc2U+Ci0gICAgICAgIDwvbWFwOnNlbGVjdD4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIG1lbnUteG1sL3twdWJsaWNhdGlvbi1pZH0vYWRtaW4vLi4uIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJtZW51LXhtbC8qL2FkbWluLyoqIiBpbnRlcm5hbC1vbmx5PSJ0cnVlIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJzZXJ2ZXJwYWdlcyIgc3JjPSJsZW55YS9jb250ZW50L21lbnVzL2FkbWluLnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIG1lbnUteG1sL3twdWJsaWNhdGlvbi1pZH0vLi4uIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJtZW51LXhtbC8qLyoqIiBpbnRlcm5hbC1vbmx5PSJ0cnVlIj4KLSAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSJtZW51LXhtbC97MX0vIiBzcmM9IntmYWxsYmFjazptZW51cy54bWFwfSIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIgcGFzcy10aHJvdWdoPSJ0cnVlIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICAgPG1hcDpwaXBlbGluZT4KLSAgICAgCi0gICAgIDwhLS0gRGVmYXVsdCBMZW55YSBtZW51YmFyIC0tPgotICAgICA8IS0tIHsxOnB1YklkfS97MjphcmVhfS97MzouLi59IC0tPgotICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKi8qKiI+Ci0gICAgICAgCi0gICAgICAgPG1hcDphZ2dyZWdhdGUgZWxlbWVudD0ibWVudSIgbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCI+Ci0gICAgICAgICA8bWFwOnBhcnQgc3JjPSJjb2Nvb246L21lbnUteG1sL3sxfS97Mn0vezN9IiBzdHJpcC1yb290PSJ0cnVlIi8+Ci0gICAgICAgICA8bWFwOnBhcnQgc3JjPSJjb2Nvb246L21lbnUteG1sL21vZHVsZXMvezF9L3syfS54bWwiIHN0cmlwLXJvb3Q9InRydWUiLz4KLSAgICAgICA8L21hcDphZ2dyZWdhdGU+Ci0gICAgICAgCi0gICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvbWVudS9tZXJnZS1tZW51cy54c2wiLz4KLSAgICAgICAKLSAgICAgICAKLSAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9InhzbHQvc2VsZWN0U2luZ2xlTWVudS54c2wiPgotICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOmxlbnlhLm1lbnV9Ii8+Ci0gICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgIAotICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L21lbnUvZmlsdGVyLW1lbnUueHNsIj4KLSAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InRhYkdyb3VwIiB2YWx1ZT0ie3VzZWNhc2U6dGFiR3JvdXA6e3JlcXVlc3QtcGFyYW06bGVueWEudXNlY2FzZX19Ii8+Ci0gICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgIAotICAgICAgIDwhLS0gRGlzYWJsZSBtZW51IGl0ZW1zIGFjY29yZGluZyB0byB1c2VjYXNlIHBvbGljaWVzIC0tPgotICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InVzZWNhc2VtZW51Ii8+Ci0gICAgICAgCi0gICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvbWVudS9tZW51MnhodG1sLnhzbCI+Ci0gICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbmlkIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhcmVhIiB2YWx1ZT0iezJ9Ii8+Ci0gICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudHVybCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXVybH0iLz4KLSAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50aWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSIvPgotICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlcmlkIiB2YWx1ZT0ie2FjY2Vzcy1jb250cm9sOnVzZXItaWR9Ii8+Ci0gICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJzZXJ2ZXJ0aW1lIiB2YWx1ZT0ie2RhdGUtaTE4bjpjdXJyZW50RGF0ZX0iLz4KLSAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IndvcmtmbG93c3RhdGUiIHZhbHVlPSJ7d29ya2Zsb3c6c3RhdGV9Ii8+Ci0gICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJpc2xpdmUiIHZhbHVlPSJ7d29ya2Zsb3c6dmFyaWFibGUuaXNfbGl2ZX0iLz4KLSAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVzZWNhc2UiIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpsZW55YS51c2VjYXNlfSIvPgotICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idGFiR3JvdXAiIHZhbHVlPSJ7dXNlY2FzZTp0YWJHcm91cDp7cmVxdWVzdC1wYXJhbTpsZW55YS51c2VjYXNlfX0iLz4KLSAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Im5ld01lc3NhZ2VzIiB2YWx1ZT0ie2luYm94Om5ld01lc3NhZ2VDb3VudH0iLz4KLSAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06bGVueWEubWVudX0iLz4KLSAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgCi0gICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+Ci0gICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0ieHNsdC9jb252ZXJ0TWVzc2FnZXMueHNsIi8+Ci0gICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvcHJldHR5cHJpbnRpbmcveHNsdC94bWwybmljZXhtbC54c2wiLz4KLSAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgIAotICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAKLSA8L21hcDpwaXBlbGluZXM+Ci0KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9tZW51YmFyL3hzbHQvY29udmVydE1lc3NhZ2VzLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL21lbnViYXIveHNsdC9jb252ZXJ0TWVzc2FnZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDZjYjliLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL21lbnViYXIveHNsdC9jb252ZXJ0TWVzc2FnZXMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG1lbnUyeHNsdC54c2wgNTIwNDE4IDIwMDctMDMtMjAgMTU6MDM6MzRaIGFuZHJlYXMgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczptZW51PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiCi0gIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJtZW51IgotICA+Ci0gIAotICA8IS0tIGFkZCBvbmx5IGZpcnN0IG1lc3NhZ2UgYXMgdGl0bGUgYXR0cmlidXRlIC0tPiAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudTptZXNzYWdlW3ByZWNlZGluZy1zaWJsaW5nOjptZW51Om1lc3NhZ2VdIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZW51Om1lc3NhZ2UiPgotICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRpdGxlIj4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+Ci0gICAgPC94c2w6YXR0cmlidXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiIHByaW9yaXR5PSItMSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL21lbnViYXIveHNsdC9lbXB0eU1lbnUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci94c2x0L2VtcHR5TWVudS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjVjM2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci94c2x0L2VtcHR5TWVudS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbWVudTJ4c2x0LnhzbCA1MjA0MTggMjAwNy0wMy0yMCAxNTowMzozNFogYW5kcmVhcyAkIC0tPgotCi08bWVudTptZW51IHhtbG5zOm1lbnU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIj4KLSAgPG1lbnU6bWVudXM+Ci0gICAgPG1lbnU6bWVudSBuYW1lPSJGaWxlIiBpMThuOmF0dHI9Im5hbWUiLz4KLSAgICA8bWVudTptZW51IG5hbWU9IkVkaXQiIGkxOG46YXR0cj0ibmFtZSIvPgotICAgIDxtZW51Om1lbnUgbmFtZT0iV29ya2Zsb3ciIGkxOG46YXR0cj0ibmFtZSIvPgotICAgIDxtZW51Om1lbnUgbmFtZT0iSGVscCIgaTE4bjphdHRyPSJuYW1lIi8+Ci0gICAgPG1lbnU6bWVudSBuYW1lPSJEZXZlbG9wbWVudCIgaTE4bjphdHRyPSJuYW1lIi8+Ci0gIDwvbWVudTptZW51cz4KLTwvbWVudTptZW51PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci94c2x0L21lbnUyeHNsdC1hamF4LnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL21lbnViYXIveHNsdC9tZW51MnhzbHQtYWpheC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMmRkNjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci94c2x0L21lbnUyeHNsdC1hamF4LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbWVudTJ4c2x0LnhzbCA1MjA0MTggMjAwNy0wMy0yMCAxNTowMzozNFogYW5kcmVhcyAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczp4c289Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS94c2x0LzEuMCIKLSAgeG1sbnM6bWVudT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21lbnViYXIvMS4wIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ibWVudSIKLSAgPgotIAotICA8eHNsOnBhcmFtIG5hbWU9ImFyZWFQcmVmaXgiLz4gCi0gIDx4c2w6cGFyYW0gbmFtZT0icHVibGljYXRpb25pZCIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImFyZWEiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJkb2N1bWVudHVybCIvPgotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJxdWVyeVN0cmluZyIvPgotICAKLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN1ZmZpeCI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJHF1ZXJ5U3RyaW5nICE9ICcnIj4KLSAgICAgICAgPHhzbDp0ZXh0Pj88L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+Ci0gICAgICAgIDx4c2w6dGV4dD4mYW1wO2xlbnlhLm1vZHVsZT1tZW51YmFyPC94c2w6dGV4dD4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDp0ZXh0Pj9sZW55YS5tb2R1bGU9bWVudWJhcjwveHNsOnRleHQ+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp2YXJpYWJsZT4KLSAgCi0gIDx4c2w6bmFtZXNwYWNlLWFsaWFzIHN0eWxlc2hlZXQtcHJlZml4PSJ4c28iIHJlc3VsdC1wcmVmaXg9InhzbCIvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgCi0gICAgPHhzbzpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhodG1sIj4KLSAgICAgIAotICAgICAgPHhzbzpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+Ci0gICAgICAKLSAgICAgIDx4c286dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDx4c286Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0aXRsZSIvPgotICAgICAgICAgICAgPHNjcmlwdCBzcmM9Ii9sZW55YS9tZW51L21lbnUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+JiMxNjA7PC9zY3JpcHQ+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDxsaW5rIGhyZWY9Ii9sZW55YS9jc3MvbWVudS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiLz4KLSAgICAgICAgICAgIDxsaW5rIHJlbD0iaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIiB0eXBlPSJpbWFnZS9pY28iLz4KLSAgICAgICAgICAgIDx4c286YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6aHRtbC94aHRtbDpoZWFkLypbbG9jYWwtbmFtZSgpICE9ICd0aXRsZSddIi8+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgICAgZGpDb25maWcgPSB7IGlzRGVidWc6IGZhbHNlIH07Ci0gICAgICAgICAgICA8L3NjcmlwdD4KLSAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9tb2R1bGVzL21lbnViYXIvZG9qby9kb2pvLmpzIj4mIzE2MDs8L3NjcmlwdD4KLSAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgICAgTUVOVV9VUkwgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgkYXJlYVByZWZpeCwgJGRvY3VtZW50dXJsLCAnPycsICRxdWVyeVN0cmluZykiLz4iOwotICAgICAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvbW9kdWxlcy9tZW51YmFyL2phdmFzY3JpcHQvbG9hZG1lbnUuanMiPiYjMTYwOzwvc2NyaXB0PgotICAgICAgICAgIDwvaGVhZD4KLSAgICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDx4c286YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6aHRtbC94aHRtbDpib2R5L0AqIi8+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmRpdltAaWQgPSAnbGVueWEtbG9nbyddIi8+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmRpdi94aHRtbDpkaXZbQGlkID0gJ2xlbnlhLW1lbnVzJ10iLz4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImxlbnlhLWNtc2JvZHkiPgotICAgICAgICAgICAgICA8eHNvOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmh0bWwveGh0bWw6Ym9keS9ub2RlKCkiLz4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiBpbml0aWFsaXplKCk7IDwvc2NyaXB0PgotICAgICAgICAgIDwvYm9keT4KLSAgICAgICAgPC9odG1sPgotICAgICAgPC94c286dGVtcGxhdGU+Ci0gICAgICAKLSAgICAgIDx4c286dGVtcGxhdGUgbmFtZT0idGl0bGUiPgotICAgICAgICA8dGl0bGU+Ci0gICAgICAgICAgQXBhY2hlIExlbnlhIHwKLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1YmxpY2F0aW9uaWQiLz4gfAotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXJlYSIvPiB8Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb2N1bWVudHVybCIvPiB8Ci0gICAgICAgICAgPHhzbzp2YWx1ZS1vZiBzZWxlY3Q9InhodG1sOmh0bWwveGh0bWw6aGVhZC94aHRtbDp0aXRsZSIvPgotICAgICAgICA8L3RpdGxlPgotICAgICAgPC94c286dGVtcGxhdGU+Ci0gICAgICAKLSAgICAgIDx4c286dGVtcGxhdGUgbWF0Y2g9InhodG1sOnNjcmlwdCI+Ci0gICAgICAgIDx4c286Y29weT4KLSAgICAgICAgICA8eHNvOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgICAgIDx4c286aWYgdGVzdD0ibm90KC4vL3RleHQoKSkiPjx4c286dGV4dD4mIzE2MDs8L3hzbzp0ZXh0PjwveHNvOmlmPgotICAgICAgICA8L3hzbzpjb3B5PgotICAgICAgPC94c286dGVtcGxhdGU+Ci0gICAgICAKLSAgICAgIDx4c286dGVtcGxhdGUgbWF0Y2g9InhodG1sOioiPgotICAgICAgICA8eHNvOmVsZW1lbnQgbmFtZT0ie3N0cmluZygne2xvY2FsLW5hbWUoKX0nKX0iPgotICAgICAgICAgIDx4c286YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgICAgIDwveHNvOmVsZW1lbnQ+Ci0gICAgICA8L3hzbzp0ZW1wbGF0ZT4KLSAgICAgIAotICAgICAgCi0gICAgICA8eHNvOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICAgICAgICA8eHNvOmNvcHk+Ci0gICAgICAgICAgPHhzbzphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICAgICAgPC94c286Y29weT4KLSAgICAgIDwveHNvOnRlbXBsYXRlPgotICAgICAgCi0gICAgPC94c286c3R5bGVzaGVldD4KLSAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmRpdltAaWQgPSAnbGVueWEtb3B0aW9ucyddL3hodG1sOnVsL3hodG1sOmxpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+bmF2PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz48L3hzbDphdHRyaWJ1dGU+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJub2RlKCkiLz4KLSAgICAgIDx1bCBpZD0ibWVudXtwb3NpdGlvbigpfSI+Ci0gICAgICAgIDxsaSBpZD0ibWVudVBsYWNlaG9sZGVye3Bvc2l0aW9uKCl9Ij48aW1nIHNyYz0iL21vZHVsZXMvbWVudWJhci9pbWFnZXMvaW5kaWNhdG9yLmdpZiIvPjwvbGk+Ci0gICAgICA8L3VsPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6KiI+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Intsb2NhbC1uYW1lKCl9Ij4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci94c2x0L3NlbGVjdFNpbmdsZU1lbnUueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvbWVudWJhci94c2x0L3NlbGVjdFNpbmdsZU1lbnUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTQzZDQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL21lbnViYXIveHNsdC9zZWxlY3RTaW5nbGVNZW51LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBtZW51MnhzbHQueHNsIDUyMDQxOCAyMDA3LTAzLTIwIDE1OjAzOjM0WiBhbmRyZWFzICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6bWVudT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21lbnViYXIvMS4wIgotICA+Ci0gIAotICA8eHNsOnBhcmFtIG5hbWU9Im1lbnUiLz4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6bWVudXMiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWVudTptZW51W3Bvc2l0aW9uKCkgPSAkbWVudV0iLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiIHByaW9yaXR5PSItMSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL21pZ3JhdGlvbi9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL21pZ3JhdGlvbi9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4OGJhMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9taWdyYXRpb24vY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5taWdyYXRpb248L2lkPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPk1pZ3JhdGlvbiBNb2R1bGU8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPk1pZ3JhdGlvbjwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL21pZ3JhdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWlncmF0aW9uL01pZ3JhdGVVdWlkc1Rlc3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL21pZ3JhdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvbWlncmF0aW9uL01pZ3JhdGVVdWlkc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzYzBjNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9taWdyYXRpb24vamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL21pZ3JhdGlvbi9NaWdyYXRlVXVpZHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5BcmVhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLQotLyoqCi0gKiBNaWdyYXRlIGZyb20gcGF0aC1iYXNlZCBjb250ZW50IHRvIFVVSURzLgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0ZVV1aWRzVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgLyoqCi0gICAgICogRG8gdGhlIG1pZ3JhdGlvbi4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNaWdyYXRlVXVpZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBsb2dpbigibGVueWEiKTsKLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KGdldE1hbmFnZXIoKSwgc2Vzc2lvbik7Ci0gICAgICAgIFB1YmxpY2F0aW9uW10gcHVicyA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVicy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdGhpcy5taWdyYXRlZERvY3MuY2xlYXIoKTsKLSAgICAgICAgICAgIG1pZ3JhdGVQdWJsaWNhdGlvbihwdWJzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmNvbW1pdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtaWdyYXRlUHVibGljYXRpb24oUHVibGljYXRpb24gcHViKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiTWlncmF0aW5nIHB1YmxpY2F0aW9uIFsiICsgcHViLmdldElkKCkgKyAiXSIpOwotCi0gICAgICAgIFN0cmluZ1tdIGFyZWFOYW1lcyA9IHB1Yi5nZXRBcmVhTmFtZXMoKTsKLSAgICAgICAgaWYgKGFyZWFOYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZWFOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEFyZWEgYXJlYSA9IHB1Yi5nZXRBcmVhKGFyZWFOYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgbWlncmF0ZUFyZWEoYXJlYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbWlncmF0ZUFyZWEoQXJlYSBhcmVhKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiTWlncmF0aW5nIGFyZWEgWyIgKyBhcmVhICsgIl0iKTsKLQotICAgICAgICBTaXRlTm9kZVtdIG5vZGVzID0gYXJlYS5nZXRTaXRlKCkuZ2V0Tm9kZXMoKTsKLQotICAgICAgICBNYXAgcGF0aDJsYW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykgewotCi0gICAgICAgICAgICBTdHJpbmcgdXVpZCA9IG5vZGVzW25dLmdldFV1aWQoKTsKLSAgICAgICAgICAgIGlmICh1dWlkICE9IG51bGwgJiYgdXVpZC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBsYW5ndWFnZXMgPSBub2Rlc1tuXS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGxhbmd1YWdlcy5sZW5ndGg7IGwrKykgewotICAgICAgICAgICAgICAgICAgICBwYXRoMmxhbmdzLnB1dChub2Rlc1tuXS5nZXRQYXRoKCksIGxhbmd1YWdlcyk7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGFyZWEuZ2V0RG9jdW1lbnQobm9kZXNbbl0uZ2V0UGF0aCgpLCBsYW5ndWFnZXNbbF0pOwotICAgICAgICAgICAgICAgICAgICBtaWdyYXRlRG9jdW1lbnQoZG9jKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmVyaWZ5TWlncmF0aW9uKGFyZWEsIHBhdGgybGFuZ3MpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeU1pZ3JhdGlvbihBcmVhIGFyZWEsIE1hcCBwYXRoMmxhbmdzKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZVN0cnVjdHVyZSBzaXRlID0gYXJlYS5nZXRTaXRlKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhdGgybGFuZ3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nW10gbGFuZ3MgPSAoU3RyaW5nW10pIHBhdGgybGFuZ3MuZ2V0KHBhdGgpOwotICAgICAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IHNpdGUuZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgICAgIERvY3VtZW50IG1pZ3JhdGVkRG9jID0gbm9kZS5nZXRMaW5rKG5vZGUuZ2V0TGFuZ3VhZ2VzKClbMF0pLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBtaWdyYXRlZExhbmdzID0gbWlncmF0ZWREb2MuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChsYW5ncyksIEFycmF5cy5hc0xpc3QobWlncmF0ZWRMYW5ncykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgbWlncmF0ZWREb2NzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByaXZhdGUgdm9pZCBtaWdyYXRlRG9jdW1lbnQoRG9jdW1lbnQgZG9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCJNaWdyYXRpbmcgZG9jdW1lbnQgWyIgKyBkb2MgKyAiXSIpOwotCi0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2NNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgU2l0ZU1hbmFnZXIgc2l0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2NNYW5hZ2VyID0gKERvY3VtZW50TWFuYWdlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChEb2N1bWVudE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIGdldE1hbmFnZXIoKS5sb29rdXAoU2l0ZU1hbmFnZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgc2l0ZU1hbmFnZXIgPSAoU2l0ZU1hbmFnZXIpIHNlbGVjdG9yLnNlbGVjdChkb2MuZ2V0UHVibGljYXRpb24oKS5nZXRTaXRlTWFuYWdlckhpbnQoKSk7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkb2MuZ2V0UGF0aCgpOwotCi0gICAgICAgICAgICBOb2RlIG5vZGUgPSBzaXRlTWFuYWdlci5nZXRTaXRlU3RydWN0dXJlKGRvYy5nZXRGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgIGRvYy5nZXRQdWJsaWNhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0QXJlYSgpKS5nZXRSZXBvc2l0b3J5Tm9kZSgpOwotCi0gICAgICAgICAgICBpZiAoIW5vZGUuaXNMb2NrZWQoKSkgewotICAgICAgICAgICAgICAgIG5vZGUubG9jaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEb2N1bWVudCBuZXdEb2M7Ci0vKgotICAgICAgICAgICAgU3RyaW5nIGRvY0lkID0gZG9jLmdldFVVSUQoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLm1pZ3JhdGVkRG9jcy5jb250YWluc0tleShkb2NJZCkpIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBtaWdyYXRlZERvYyA9IChEb2N1bWVudCkgdGhpcy5taWdyYXRlZERvY3MuZ2V0KGRvY0lkKTsKLSAgICAgICAgICAgICAgICBuZXdEb2MgPSBkb2NNYW5hZ2VyLmFkZFZlcnNpb24obWlncmF0ZWREb2MsIGRvYy5nZXRBcmVhKCksIGRvYy5nZXRMYW5ndWFnZSgpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgU291cmNlVXRpbC5jb3B5KHJlc29sdmVyLCBkb2MuZ2V0U291cmNlVVJJKCksIG5ld0RvYy5nZXRTb3VyY2VVUkkoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld0RvYyA9IGRvY01hbmFnZXIuYWRkKGRvYy5nZXRGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0UmVzb3VyY2VUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0U291cmNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0UHVibGljYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5nZXRBcmVhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0TGFuZ3VhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5nZXRFeHRlbnNpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICBtaWdyYXRlZERvY3MucHV0KGRvY0lkLCBuZXdEb2MpOwotICAgICAgICAgICAgICAgIHNpdGVNYW5hZ2VyLnNldChwYXRoLCBuZXdEb2MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdbXSB1cmlzID0gZG9jLmdldE1ldGFEYXRhTmFtZXNwYWNlVXJpcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbmV3RG9jLmdldE1ldGFEYXRhKHVyaXNbaV0pLnJlcGxhY2VCeShkb2MuZ2V0TWV0YURhdGEodXJpc1tpXSkpOwotICAgICAgICAgICAgfQotKi8KLSAgICAgICAgICAgIGRvYy5kZWxldGUoKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRvY01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZWxlYXNlKGRvY01hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHNpdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24vY2hlY2tpbi1leGNlcHRpb24ueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9jaGVja2luLWV4Y2VwdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTM0ZjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9jaGVja2luLWV4Y2VwdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRPRE86IEFsc28gc2VlIE5ldXRyb24gU3BlYyAuLi4gLS0+Ci08ZXhjZXB0aW9uIHhtbG5zPSJodHRwOi8vd3d3Lnd5b25hLm9yZy9uZXV0cm9uLzEuMCIgdHlwZT0iY2hlY2tpbiI+Ci0gIDxtZXNzYWdlPlNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBjaGVja2luIC4uLjwvbWVzc2FnZT4KLTwvZXhjZXB0aW9uPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9jaGVja291dC1leGNlcHRpb24ueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9jaGVja291dC1leGNlcHRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTdlMTdiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24vY2hlY2tvdXQtZXhjZXB0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVE9ETzogUmV0dXJuIHVzZXIsIGV0Yy4gQWxzbyBzZWUgTmV1dHJvbiBTcGVjIC4uLiAtLT4KLTxleGNlcHRpb24geG1sbnM9Imh0dHA6Ly93d3cud3lvbmEub3JnL25ldXRyb24vMS4wIiB0eXBlPSJjaGVja291dCI+Ci0gIDxtZXNzYWdlPkRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC1vdXQgYnkgLi4uPC9tZXNzYWdlPgotPC9leGNlcHRpb24+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXV0cm9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jaGVja2luLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY2hlY2tpbi54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhYjJkOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXV0cm9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jaGVja2luLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ25ldXRyb24uY2hlY2tpbiddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJuZXV0cm9uLmNoZWNraW4iIGxvZ2dlcj0ibGVueWEubmV1dHJvbiINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy5TYXZlRG9jdW1lbnQiPg0KLSAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic291cmNlVXJpIiB2YWx1ZT0iY29jb29uOi8vbW9kdWxlcy9lZGl0b3JzL3N0cmVhbS54bWwiLz4KLSAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlY2FzZU5hbWUiIHZhbHVlPSJlZGl0b3JzLnB1YmxpY2F0aW9uRWRpdCIvPgotICAgICAgPHZpZXcgdXJpPSIvbW9kdWxlcy9uZXV0cm9uL2xvYWQueG1sIi8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24vY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWNoZWNrb3V0Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY2hlY2tvdXQueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MDQ4ZDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY2hlY2tvdXQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnbmV1dHJvbi5jaGVja291dCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJuZXV0cm9uLmNoZWNrb3V0IiBsb2dnZXI9ImxlbnlhLm5ldXRyb24iDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzLkludm9rZVdvcmtmbG93Ij4KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9uZXV0cm9uL3VzZWNhc2VzL25ldXRyb24uangiIG1lbnU9ImZhbHNlIiBjcmVhdGVDb250aW51YXRpb249ImZhbHNlIi8+Ci0gICAgICA8dHJhbnNhY3Rpb24gcG9saWN5PSJwZXNzaW1pc3RpYyIvPgotICAgICAgPGV2ZW50IGlkPSJlZGl0Ii8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24vY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9uZXV0cm9uL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzE5ZDhkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24vY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueG1sIDM3NDY4NyAyMDA2LTAyLTAzIDE1OjI0OjU1WiBtaWNoaSAkIC0tPgotCi08bGVueWE6bW9kdWxlIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGxlbnlhOmlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5uZXV0cm9uPC9sZW55YTppZD4KLSAgPGxlbnlhOmRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8bGVueWE6ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5zaXRlbWFuYWdlbWVudCIvPgotICA8bGVueWE6cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L2xlbnlhOnBhY2thZ2U+Ci0gIDxsZW55YTp2ZXJzaW9uPjAuMS1kZXY8L2xlbnlhOnZlcnNpb24+Ci0gIDxsZW55YTpuYW1lPk5ldXRyb24gTW9kdWxlPC9sZW55YTpuYW1lPgotICA8bGVueWE6bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhOmxlbnlhLXZlcnNpb24+Ci0gIDxsZW55YTpkZXNjcmlwdGlvbj5OZXV0cm9uIE1vZHVsZTwvbGVueWE6ZGVzY3JpcHRpb24+Ci08L2xlbnlhOm1vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24vc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOWEyMzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi9zaXRlbWFwLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDxtYXA6Y29tcG9uZW50cz4KLSAgICA8bWFwOm1hdGNoZXJzIGRlZmF1bHQ9IndpbGRjYXJkIj4KLSAgICAgIDxtYXA6bWF0Y2hlciBsb2dnZXI9InNpdGVtYXAubWF0Y2hlci51c2VjYXNlIiBuYW1lPSJhY3Rpb24iCi0gICAgICAgICAgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5tYXRjaGluZy5XaWxkY2FyZFJlcXVlc3RQYXJhbWV0ZXJNYXRjaGVyIj4KLSAgICAgICAgPHBhcmFtZXRlci1uYW1lPmxlbnlhLmFjdGlvbjwvcGFyYW1ldGVyLW5hbWU+Ci0gICAgICA8L21hcDptYXRjaGVyPgotICAgIDwvbWFwOm1hdGNoZXJzPgotICAgIDxtYXA6dHJhbnNmb3JtZXJzIGRlZmF1bHQ9InhzbHQiPgotICAgICAgPG1hcDp0cmFuc2Zvcm1lciBsb2dnZXI9ImxlbnlhLnNpdGVtYXAudHJhbnNmb3JtZXIudXVpZDJ1cmwiIG5hbWU9InV1aWQydXJsLXNpdGV0cmVlIgotICAgICAgICBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5VdWlkVG9VcmxUcmFuc2Zvcm1lciI+Ci0gICAgICAgIDx1cmxzIHR5cGU9InJlbGF0aXZlIi8+Ci0gICAgICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbmF2aWdhdGlvbi8xLjAiIGVsZW1lbnQ9Im5vZGUiIGF0dHJpYnV0ZT0iaHJlZiIvPgotICAgICAgPC9tYXA6dHJhbnNmb3JtZXI+Ci0gICAgICA8bWFwOnRyYW5zZm9ybWVyIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC50cmFuc2Zvcm1lci5wcm94eSIgbmFtZT0icHJveHktc2l0ZXRyZWUiCi0gICAgICAgIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uLlByb3h5VHJhbnNmb3JtZXIiPgotICAgICAgICA8dHJhbnNmb3JtIG5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL25hdmlnYXRpb24vMS4wIiBlbGVtZW50PSJub2RlIiBhdHRyaWJ1dGU9ImhyZWYiLz4KLSAgICAgIDwvbWFwOnRyYW5zZm9ybWVyPgotICAgIDwvbWFwOnRyYW5zZm9ybWVycz4KLSAgPC9tYXA6Y29tcG9uZW50cz4KLSAgCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgICAgCi0gICAgPCEtLSBJbnRyb3NwZWN0aW9uIC0tPgotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0ibm9uY2FjaGluZyI+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggdHlwZT0iYWN0aW9uIiBwYXR0ZXJuPSJpbnRyb3NwZWN0Ij4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRleHQ6Ly9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL25ldXRyb24veHNsdC9pbnRyb3NwZWN0aW9uLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJpIiB2YWx1ZT0ie3Byb3h5OntyZXF1ZXN0OnJlcXVlc3RVUkl9fSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggdHlwZT0iYWN0aW9uIiBwYXR0ZXJuPSJzaXRldHJlZSI+Ci0gICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qLyoqIj4KLSAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi8vbW9kdWxlcy9zaXRldHJlZS97MX0vezJ9L3NpdGV0cmVlLnhtbCIvPgotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9zaXRldHJlZTJuYXYueHNsIiBsYWJlbD0ibmF2dHJlZSI+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjaG9zZW5sYW5ndWFnZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOmxhbmd1YWdlfSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZGVmYXVsdGxhbmd1YWdlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZGVmYXVsdC1sYW5ndWFnZX0iLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImV4dGVuc2lvbiIgdmFsdWU9Imh0bWwiLz4KLSAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InV1aWQydXJsLXNpdGV0cmVlIi8+Ci0gICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icHJveHktc2l0ZXRyZWUiLz4KLSAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9InhzbHQvc2l0ZXRyZWUueHNsIi8+Ci0gICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0gZG9jdW1lbnQgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImRvY3VtZW50Ij4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImxlbnlhLWRvY3VtZW50OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL25ldXRyb24veHNsdC9hZGRDc3MueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjc3MiIHZhbHVlPSJ7cHJveHk6L3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfS9jc3MvcGFnZS5jc3N9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotCi08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi91c2VjYXNlcy9uZXV0cm9uLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi91c2VjYXNlcy9uZXV0cm9uLmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWZmMDIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24vdXNlY2FzZXMvbmV1dHJvbi5qeAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPGp4OmNob29zZQotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOmNpPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaW5jbHVkZS8xLjAiPgotICAKLSAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmhhc0Vycm9ycygpfSI+Ci0gICAgPHBhZ2U6cGFnZQotICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICAgICAgPgotICAgICAgCi0gICAgICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0Pk5ldXRyb24gRWRpdG9yPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICAgICAgCi0gICAgICA8ang6c2V0IHZhcj0ic291cmNlVXJsIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFNvdXJjZVVSTCgpfSIvPgotICAgICAgPGp4OnNldCB2YXI9InN0ZXBzIiB2YWx1ZT0iJHtzb3VyY2VVcmwuc3BsaXQoJy8nKX0iLz4KLSAgICAgIDxqeDpzZXQgdmFyPSJsYXN0U3RlcCIgdmFsdWU9IiR7c3RlcHNbc3RlcHMuc2l6ZSgpIC0gMV19Ii8+Ci0gICAgICAKLSAgICAgIDxwYWdlOmJvZHk+Ci0gICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgIDwvcGFnZTpib2R5PgotICAgIDwvcGFnZTpwYWdlPgotICA8L2p4OndoZW4+Ci0gIDxqeDpvdGhlcndpc2U+Ci0gICAgPGp4OnNldCB2YXI9ImRvY3VtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKX0iLz4KLSAgICA8Y2k6aW5jbHVkZSBzcmM9ImNvY29vbjovL21vZHVsZXMvbmV1dHJvbi9kb2N1bWVudCIvPgotICA8L2p4Om90aGVyd2lzZT4KLTwvang6Y2hvb3NlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24veHNsdC9hZGRDc3MueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi94c2x0L2FkZENzcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2N2FhOWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi94c2x0L2FkZENzcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHJlbW92ZVNvdXJjZVRhZ3MueHNsIDQyNzAzIDIwMDQtMDMtMTMgMTI6NTc6NTNaIGdyZWdvciAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0iY3NzIi8+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aGVhZCI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ieyRjc3N9Ii8+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIqIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi94c2x0L2ludHJvc3BlY3Rpb24ueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi94c2x0L2ludHJvc3BlY3Rpb24ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjdlZjlkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ldXRyb24veHNsdC9pbnRyb3NwZWN0aW9uLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcHVibGljYXRpb24ueHNsIDM4ODUwOSAyMDA2LTAzLTI0IDEzOjA3OjEwWiBtaWNoaSAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zPSJodHRwOi8vd3d3Lnd5b25hLm9yZy9uZXV0cm9uLzEuMCIKLT4KLQotPHhzbDpwYXJhbSBuYW1lPSJ1cmkiLz4KLSAgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgPGludHJvc3BlY3Rpb24+Ci0KLSAgICA8bmF2aWdhdGlvbj4KLSAgICAgIDxzaXRldHJlZSBocmVmPSJ7JHVyaX0/bGVueWEubW9kdWxlPW5ldXRyb24mYW1wO2xlbnlhLmFjdGlvbj1zaXRldHJlZSIgbWV0aG9kPSJHRVQiLz4KLSAgICA8L25hdmlnYXRpb24+Ci0gICAgCi0gICAgPCEtLQotICAgIFRPRE86IEluIG9yZGVyIHRvIGdldCB0aGUgV1lTSVdZRyB2aWV3IG9uZSBuZWVkcyB0byBjaGFuZ2UgdGhlIG1pbWUtdHlwZQotICAgIHRvIHhodG1sK3htbCwgYnV0IHNvbWVob3cgdGhpcyBjYXVzZXMgcHJvYmxlbXMgcmUgc2F2aW5nIC4uLgotICAgIFNlZSBtaXNzaW5nIG1pbWUtdHlwZSB3aXRoaW4KLSAgICBjb2Nvb25fMl8xX3gvc3JjL2phdmEvb3JnL2FwYWNoZS9jb2Nvb24vZ2VuZXJhdGlvbi9TdHJlYW1HZW5lcmF0b3IuamF2YQotICAgIC0tPgotICAgIDxlZGl0IG1pbWUtdHlwZT0iYXBwbGljYXRpb24veGh0bWwreG1sIiBuYW1lPSJCb2R5IENvbnRlbnQiPgotCi0gICAgICA8Y2hlY2tvdXQgdXJsPSJ7JHVyaX0/bGVueWEudXNlY2FzZT1uZXV0cm9uLmNoZWNrb3V0IiBtZXRob2Q9IkdFVCIvPgotCi08IS0tIFNhdmUgd2l0aG91dCByZWxlYXNpbmcgdGhlIGxvY2ssIGUuZy4gZm9yICJnbG9iYWwiIHRlbXBvcmFyeSBzYXZpbmcgLS0+Ci08IS0tCi0gICAgICA8c2F2ZSB1cmw9InskdXJpfT9sZW55YS5tb2R1bGU9bmV1dHJvbiZhbXA7bGVueWEuc3RlcD1zYXZlIiBtZXRob2Q9IlBVVCIvPgotLS0+Ci0gICAgICA8Y2hlY2tpbiB1cmw9InskdXJpfT9sZW55YS51c2VjYXNlPWJ4ZS5jbG9zZSIgbWV0aG9kPSJQVVQiLz4KLQotPCEtLQotICAgICAgPHNjaGVtYXM+Ci0gICAgICAgIDxzY2hlbWEgaHJlZj0iaHR0cDovL2Zvby5iYXIuY29tL2xlbnlhL21vZHVsZXMvZG9jYm9vay9zY2hlbWFzL3NpbXBsZS5ybmciIHR5cGU9IlJlbGF4TkciLz4KLSAgICAgICAgPHNjaGVtYSBocmVmPSJodHRwOi8vZm9vLmJhci5jb20vbGVueWEvbW9kdWxlcy9kb2Nib29rL3NjaGVtYXMvZGVmYXVsdC5ybmciIHR5cGU9IlJlbGF4TkciLz4KLSAgICAgIDwvc2NoZW1hcz4KLSAgICAgIDxzdHlsZXM+Ci0gICAgICAgIDxzdHlsZSBocmVmPSJ7JHVyaX0ueHNsIi8+Ci0gICAgICA8L3N0eWxlcz4KLS0tPgotICAgIDwvZWRpdD4KLSAgPC9pbnRyb3NwZWN0aW9uPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXV0cm9uL3hzbHQvc2l0ZXRyZWUueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV1dHJvbi94c2x0L3NpdGV0cmVlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0M2ZiNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXV0cm9uL3hzbHQvc2l0ZXRyZWUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiByZW1vdmVTb3VyY2VUYWdzLnhzbCA0MjcwMyAyMDA0LTAzLTEzIDEyOjU3OjUzWiBncmVnb3IgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOm5hdj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL25hdmlnYXRpb24vMS4wIgotICB4bWxucz0iREFWOiI+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJuYXY6c2l0ZSI+Ci0gICAgPG11bHRpc3RhdHVzIHhtbG5zPSJEQVY6Ij4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibmF2Om5vZGUiLz4KLSAgICA8L211bHRpc3RhdHVzPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5hdjpub2RlIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im5hdjpsYWJlbCIvPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibmF2Om5vZGUiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJuYXY6bGFiZWwiPgotICAgIDxyZXNwb25zZT4KLSAgICAgIDxocmVmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AaHJlZiIvPjwvaHJlZj4KLSAgICAgIDxwcm9wc3RhdD4KLSAgICAgICAgPHByb3A+Ci0gICAgICAgICAgPGRpc3BsYXluYW1lPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9kaXNwbGF5bmFtZT4KLSAgICAgICAgICA8cmVzb3VyY2V0eXBlLz4KLSAgICAgICAgICA8Z2V0Y29udGVudHR5cGU+YXBwbGljYXRpb24veGh0bWwreG1sPC9nZXRjb250ZW50dHlwZT4KLSAgICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgPGxpbms+Ci0gICAgICAgICAgICAgIDxzcmM+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BocmVmIi8+PC9zcmM+Ci0gICAgICAgICAgICAgIDxkc3Q+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BocmVmIi8+PC9kc3Q+Ci0gICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgPC9zb3VyY2U+Ci0gICAgICAgIDwvcHJvcD4KLSAgICAgICAgPHN0YXR1cz5IVFRQLzEuMSAyMDAgT0s8L3N0YXR1cz4KLSAgICAgIDwvcHJvcHN0YXQ+Ci0gICAgPC9yZXNwb25zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvY29uZmlnL2NvY29vbi14Y29uZi9yZXNvdXJjZXR5cGUtbmV3cy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvY29uZmlnL2NvY29vbi14Y29uZi9yZXNvdXJjZXR5cGUtbmV3cy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyNzc1OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2V0eXBlLW5ld3MueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi9yZXNvdXJjZS10eXBlcyIgdW5sZXNzPSIvY29jb29uL3Jlc291cmNlLXR5cGVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICduZXdzJ10iPgotCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ibmV3cyIKLSAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI9ImxlbnlhLnJlc291cmNldHlwZXMubmV3cyIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlSW1wbCI+Ci0gICAgCi0gICAgPCEtLSBEZWZhdWx0IHRpbWUgaW4gc2Vjb25kcyB1bnRpbCB0aGUgcmVzb3VyY2UtdHlwZSBoYXMgZXhwaXJlZCAtLT4gIAotICAgIDxleHBpcmVzIHNlY29uZHM9IjM2MDAiIC8+Ci0gICAgCi0gICAgPHNhbXBsZSAKLSAgICAgICBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3htbCIgCi0gICAgICAgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvbmV3cy9zYW1wbGVzL25ld3MueG1sIgotICAgIC8+Ci0gICAgPGZvcm1hdCBuYW1lPSJ4aHRtbCIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL25ld3MveGh0bWwueG1sIi8+Ci0gICAgPGZvcm1hdCBuYW1lPSJpbmNsdWRlIiB1cmk9ImNvY29vbjovL21vZHVsZXMvbmV3cy9pbmNsdWRlLnhtbCIvPgotICAgIDxmb3JtYXQgbmFtZT0icnNzIiB1cmk9ImNvY29vbjovL21vZHVsZXMvbmV3cy9yc3MueG1sIi8+Ci0gICAgPGZvcm1hdCBuYW1lPSJoZWFkZXIiIHVyaT0iY29jb29uOi8vbW9kdWxlcy9uZXdzL2hlYWRlci54bWwiLz4KLSAgICAKLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0KLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1uZXdzLWVkaXQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9uZXdzL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1uZXdzLWVkaXQueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjg4MzIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtbmV3cy1lZGl0Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgQ29weXJpZ2h0IDE5OTktMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICduZXdzLmVkaXQnXSI+DQotICAgIA0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9Im5ld3MuZWRpdCIgbG9nZ2VyPSJsZW55YS5uZXdzIiANCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLm5ld3MudXNlY2FzZXMuRWRpdCI+DQotICAgICAgPHZpZXcgdXJpPSJtb2R1bGVzL25ld3MvdXNlY2FzZXMvZWRpdC5qeCIgbWVudT0iZmFsc2UiLz4NCi0gICAgICA8ZXZlbnQgaWQ9ImVkaXQiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICAgIA0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL2NvbmZpZy9tZW51LnhzcCBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvY29uZmlnL21lbnUueHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk1NjAzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvY29uZmlnL21lbnUueHNwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBnZW5lcmljLnhzcCAxNTU4MDYgMjAwNS0wMy0wMSAxNzo1NTo0MlogYW5kcmVhcyAkIC0tPgotCi08eHNwOnBhZ2UgCi0gICAgbGFuZ3VhZ2U9ImphdmEiIAotICAgIHhtbG5zOnhzcD0iaHR0cDovL2FwYWNoZS5vcmcveHNwIgotICAgIHhtbG5zOnhzcC1yZXF1ZXN0PSJodHRwOi8vYXBhY2hlLm9yZy94c3AvcmVxdWVzdC8yLjAiCi0gICAgeG1sbnM6aW5wdXQ9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi94c3AvaW5wdXQvMS4wIgotICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gICAgeG1sbnM6d2Y9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS93b3JrZmxvdy8xLjAiCi0gICAgeG1sbnM6dWM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91c2VjYXNlLzEuMCIKLSAgICB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21lbnViYXIvMS4wIgotPgotCi0gIDx4c3A6c3RydWN0dXJlPgotICAgIDx4c3A6aW5jbHVkZT5vcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDwveHNwOmluY2x1ZGU+Ci0gIDwveHNwOnN0cnVjdHVyZT4KLSAgCi0gIDxtZW51PgotICAgIDxtZW51cz4KLSAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iRmlsZSI+Ci0gICAgICAgIDxibG9jayBhcmVhcz0ic2l0ZSBhdXRob3JpbmciIGlkPSJjcmVhdGUiPgotICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9InNpdGVtYW5hZ2VtZW50LmNyZWF0ZSIgaHJlZj0iP2RvY3R5cGU9bmV3cyI+Ci0gICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+TmV3IC4uLiBEb2N1bWVudDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48aTE4bjp0ZXh0PnJlc291cmNlVHlwZS1uZXdzPC9pMThuOnRleHQ+PC9pMThuOnBhcmFtPgotICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDwvYmxvY2s+Ci0gICAgICA8L21lbnU+Ci0gICAgICAKLSAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iRWRpdCI+Ci0gICAgICAgIDx4c3A6bG9naWM+Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgT2JqZWN0IGRvYyA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9Im9iamVjdCIgbmFtZT0iZG9jdW1lbnQiLz47Ci0gICAgICAgICAgICAgIGlmIChkb2MgaW5zdGFuY2VvZiBEb2N1bWVudCAmYW1wOyZhbXA7ICgoRG9jdW1lbnQpIGRvYykuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlID0gPGlucHV0OmdldC1hdHRyaWJ1dGUgbW9kdWxlPSJwYWdlLWVudmVsb3BlIiBhcz0ic3RyaW5nIiBuYW1lPSJkb2N1bWVudC10eXBlIi8+OwotICAgICAgICAgICAgICAgICAgaWYgKCJuZXdzIi5lcXVhbHMoZG9jdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICA8YmxvY2sgYXJlYXM9ImF1dGhvcmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJuZXdzLmVkaXQiIGhyZWY9Ij8iPjxpMThuOnRleHQ+bmV3cy1zZXR0aW5nczwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICA8L2Jsb2NrPgotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIG1lbnUgZ2VuZXJhdGlvbjogIiwgZSk7Ci0gICAgICAgICAgfQotICAgICAgICA8L3hzcDpsb2dpYz4KLSAgICAgIDwvbWVudT4KLSAgICAgIAotICAgIDwvbWVudXM+Ci0gIDwvbWVudT4KLSAgCi08L3hzcDpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWJjYjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLm5ld3M8L2lkPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uIi8+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPG5hbWU+TmV3czwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+TmV3cyBmZWVkPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL25ld3MvTmV3c1dyYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL25ld3MvTmV3c1dyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0YWUwOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvbW9kdWxlcy9uZXdzL05ld3NXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLm5ld3M7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmNvbGxlY3Rpb24uQ29sbGVjdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogV3JhcHBlciBmb3IgYSBuZXdzIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTmV3c1dyYXBwZXIgZXh0ZW5kcyBDb2xsZWN0aW9uV3JhcHBlciB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOQ0xVREVfSVRFTVMgPSAzOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JTkNMVURFX0lURU1TID0gImluY2x1ZGVJdGVtcyI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzaG9ydCBpbmNsdWRlSXRlbU51bWJlciA9IERFRkFVTFRfSU5DTFVERV9JVEVNUzsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdyYXAuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBOZXdzV3JhcHBlcihEb2N1bWVudCBkb2MsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgc3VwZXIoZG9jLCBsb2dnZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxvYWRYbWwoTmFtZXNwYWNlSGVscGVyIGhlbHBlcikgewotICAgICAgICBzdXBlci5sb2FkWG1sKGhlbHBlcik7Ci0gICAgICAgIEVsZW1lbnQgZG9jRWxlbWVudCA9IGhlbHBlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBpZiAoZG9jRWxlbWVudC5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX0lOQ0xVREVfSVRFTVMpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbnVtYmVyID0gZG9jRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0lOQ0xVREVfSVRFTVMpOwotICAgICAgICAgICAgdGhpcy5pbmNsdWRlSXRlbU51bWJlciA9IFNob3J0LnBhcnNlU2hvcnQobnVtYmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVYbWwoTmFtZXNwYWNlSGVscGVyIGhlbHBlcikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNhdmVYbWwoaGVscGVyKTsKLSAgICAgICAgRWxlbWVudCBkb2NFbGVtZW50ID0gaGVscGVyLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIGRvY0VsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9JTkNMVURFX0lURU1TLCBTaG9ydC50b1N0cmluZyh0aGlzLmluY2x1ZGVJdGVtTnVtYmVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGFwcGVhciBvbiBvdmVydmlld3Mgd2hpY2ggYXJlIGdlbmVyYXRlZAotICAgICAqICAgICAgICAgdXNpbmcgdGhlICJpbmNsdWRlIiBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIHNob3J0IGdldEluY2x1ZGVJdGVtTnVtYmVyKCkgewotICAgICAgICBsb2FkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmluY2x1ZGVJdGVtTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBudW1iZXIgVGhlIG51bWJlciBvZiBpdGVtcyB0byBhcHBlYXIgb24gb3ZlcnZpZXdzIHdoaWNoIGFyZQotICAgICAqICAgICAgICBnZW5lcmF0ZWQgdXNpbmcgdGhlICJpbmNsdWRlIiBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUl0ZW1OdW1iZXIoc2hvcnQgbnVtYmVyKSB7Ci0gICAgICAgIGxvYWQoKTsKLSAgICAgICAgdGhpcy5pbmNsdWRlSXRlbU51bWJlciA9IG51bWJlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTmFtZXNwYWNlSGVscGVyIGluaXRpYWxpemVOYW1lc3BhY2VIZWxwZXIoKSB7Ci0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBzdXBlci5pbml0aWFsaXplTmFtZXNwYWNlSGVscGVyKCk7Ci0gICAgICAgIEVsZW1lbnQgZG9jRWxlbWVudCA9IGhlbHBlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBkb2NFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfSU5DTFVERV9JVEVNUywgU2hvcnQudG9TdHJpbmcoZ2V0SW5jbHVkZUl0ZW1OdW1iZXIoKSkpOwotICAgICAgICByZXR1cm4gaGVscGVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL21vZHVsZXMvbmV3cy91c2VjYXNlcy9FZGl0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9uZXdzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvbW9kdWxlcy9uZXdzL3VzZWNhc2VzL0VkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0NThlMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvbW9kdWxlcy9uZXdzL3VzZWNhc2VzL0VkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMubmV3cy51c2VjYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlcy5JbnZva2VXb3JrZmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuY29sbGVjdGlvbi5Db2xsZWN0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMubmV3cy5OZXdzV3JhcHBlcjsKLQotLyoqCi0gKiBFZGl0IHRoZSBwcm9wZXJ0aWVzIG9mIGEgbmV3cyBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIEVkaXQgZXh0ZW5kcyBJbnZva2VXb3JrZmxvdyB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0lURU1fTlVNQkVSID0gImluY2x1ZGVJdGVtcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXU19XUkFQUEVSID0gIm5ld3NXcmFwcGVyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVJTID0gIm51bWJlcnMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFJFRiA9ICJocmVmIjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgTmV3c1dyYXBwZXIgbmV3cyA9IG5ldyBOZXdzV3JhcHBlcihnZXRTb3VyY2VEb2N1bWVudCgpLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIHNldFBhcmFtZXRlcihORVdTX1dSQVBQRVIsIG5ld3MpOwotICAgICAgICAKLSAgICAgICAgc2V0UGFyYW1ldGVyKElOQ0xVREVfSVRFTV9OVU1CRVIsIG5ldyBTaG9ydChuZXdzLmdldEluY2x1ZGVJdGVtTnVtYmVyKCkpKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKFRZUEUsIG5ld3MuZ2V0VHlwZSgpKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKEhSRUYsIG5ld3MuZ2V0SHJlZigpKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgbnVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTA7IGkrKykgewotICAgICAgICAgICAgbnVtYmVycy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHNldFBhcmFtZXRlcihOVU1CRVJTLCBudW1iZXJzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbnVtYmVyU3RyaW5nID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoSU5DTFVERV9JVEVNX05VTUJFUik7Ci0gICAgICAgIHNob3J0IG51bWJlciA9IFNob3J0LnBhcnNlU2hvcnQobnVtYmVyU3RyaW5nKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHdlIG11c3QgY3JlYXRlIGEgbmV3IHdyYXBwZXIsIGJlY2F1c2UgYSBuZXcgKG1vZGlmaWFibGUpIHNlc3Npb24gaXMgdXNlZAotICAgICAgICBOZXdzV3JhcHBlciBuZXdzID0gbmV3IE5ld3NXcmFwcGVyKGdldFNvdXJjZURvY3VtZW50KCksIGdldExvZ2dlcigpKTsKLSAgICAgICAgbmV3cy5zZXRJbmNsdWRlSXRlbU51bWJlcihudW1iZXIpOwotICAgICAgICBTdHJpbmcgdHlwZSA9IGdldFBhcmFtZXRlckFzU3RyaW5nKFRZUEUpOwotICAgICAgICBuZXdzLnNldFR5cGUodHlwZSk7Ci0gICAgICAgIGlmICh0eXBlLmVxdWFscyhDb2xsZWN0aW9uV3JhcHBlci5UWVBFX0xJTkspKSB7Ci0gICAgICAgICAgICBuZXdzLnNldEhyZWYoZ2V0UGFyYW1ldGVyQXNTdHJpbmcoSFJFRikpOwotICAgICAgICB9Ci0gICAgICAgIG5ld3Muc2F2ZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9tZW51cy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9tZW51cy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTkyMTdiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvbWVudXMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbWVudXMueG1hcCAxNzg3MzggMjAwNS0wNS0yNyAwMzo0MjowOVogZ3JlZ29yICQgLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotICAgIAkKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKioiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9uZXdzL2NvbmZpZy9tZW51LnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmFiMDdjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDczOTUgMjAwNi0wOS0xOCAxMzowMTozM1ogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotICANCi0gIDxtZXNzYWdlIGtleT0icmVzb3VyY2VUeXBlLW5ld3MiPk5ld3M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibmV3LW5ld3MtbWVzc2FnZS1oaW50Ij5UbyBhZGQgYSBuZXcgbmV3cyBtZXNzYWdlLCBjaG9vc2UgJ0ZpbGUnIC0+ICdOZXcgWEhUTUwgRG9jdW1lbnQnLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJuZXdzLXNldHRpbmdzIj5OZXdzIFNldHRpbmdzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImluY2x1ZGUtaXRlbXMiPk51bWJlciBvZiBpdGVtcyB0byBkaXNwbGF5IG9uIG92ZXJ2aWV3IHBhZ2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHlwZS1jaGlsZHJlbiI+Q2hpbGQgZG9jdW1lbnRzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImFjcXVpcmUtbmV3cy1mcm9tIj5BY3F1aXJlIG1lc3NhZ2VzIGZyb208L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXh0ZXJuYWwtc291cmNlIj5FeHRlcm5hbCBzb3VyY2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm90ZS1mZWVkLW1vZHVsZSI+Ci0gICAgQWNxdWlyaW5nIG1lc3NhZ2VzIGZyb20gYSBsaW5rIHJlcXVpcmVzIHRoZSA8ZW0+ZmVlZHM8L2VtPiBtb2R1bGUgd2hpY2gKLSAgICBpcyBjdXJyZW50bHkgaW4gdGhlIHNhbmRib3ggKG5vdCBzdGFibGUgeWV0KS4KLSAgPC9tZXNzYWdlPgotICAKLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDEzZDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NzM5NSAyMDA2LTA5LTE4IDEzOjAxOjMzWiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0gIAotICA8bWVzc2FnZSBrZXk9InJlc291cmNlVHlwZS1uZXdzIj5OZXdzPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJuZXctbmV3cy1tZXNzYWdlLWhpbnQiPgotICAgIFVtIGVpbmUgbmV1ZSBOZXdzLU1lbGR1bmcgenUgZXJzdGVsbGVuLAotICAgIHfDpGhsZW4gU2llICdEYXRlaScgLT4gJ05ldWVzIE5ld3MtRG9rdW1lbnQnLgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibmV3cy1zZXR0aW5ncyI+TmV3cy1FaW5zdGVsbHVuZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImluY2x1ZGUtaXRlbXMiPkFuemFobCBkZXIgTWVsZHVuZ2VuLCBkaWUgYXVmIGRlciDDnGJlcnNpY2h0IGRhcmdlc3RlbGx0IHdlcmRlbiBzb2xsZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHlwZS1jaGlsZHJlbiI+S2luZC1Eb2t1bWVudGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImFjcXVpcmUtbmV3cy1mcm9tIj5NZWxkdW5nZW4gYmV6aWVoZW4gdm9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImV4dGVybmFsLXNvdXJjZSI+RXh0ZXJuZSBRdWVsbGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm90ZS1mZWVkLW1vZHVsZSI+Ci0gICAgVW0gTWVsZHVuZ2VuIHZvbiBlaW5lciBleHRlcm5lbiBRdWVsbGUgYmV6aWVoZW4genUga8O2bm5lbiwgaXN0IGRhcyA8ZW0+ZmVlZHM8L2VtPi1Nb2R1bCBlcmZvcmRlcmxpY2gsCi0gICAgZGFzIHNpY2ggZGVyemVpdCBpbiBkZXIgU2FuZGJveCBiZWZpbmRldCAobm9jaCBuaWNodCBzdGFiaWwpLgotICA8L21lc3NhZ2U+Ci0gIAotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy9yZXNvdXJjZXMvaWNvbnMvbmV3cy5naWYgYi90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3Jlc291cmNlcy9pY29ucy9uZXdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiYjFhMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3Jlc291cmNlcy9pY29ucy9uZXdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3Mvc2FtcGxlcy9uZXdzLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3Mvc2FtcGxlcy9uZXdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjOTZhZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3NhbXBsZXMvbmV3cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29sbGVjdGlvbiB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2NvbGxlY3Rpb24vMS4wIiB0eXBlPSJjaGlsZHJlbiIgaW5jbHVkZUl0ZW1zPSIzIi8+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3Mvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzVhYmJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3Mvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhtYXAgMTc5NDg4IDIwMDUtMDYtMDIgMDI6Mjk6MzlaIGdyZWdvciAkIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb21wb25lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDxtYXA6Y29tcG9uZW50cz4KLSAgCi0gICAgPG1hcDpzZXJpYWxpemVycyBkZWZhdWx0PSJ4aHRtbCI+IAotICAgICAgPG1hcDpzZXJpYWxpemVyIG5hbWU9InhtbC1nZXQiIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uc2VyaWFsaXphdGlvbi5YTUxTZXJpYWxpemVyIiBtaW1lLXR5cGU9InRleHQveG1sIj4KLSAgICAgICAgPGRvY3R5cGUtcHVibGljPi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOPC9kb2N0eXBlLXB1YmxpYz4KLSAgICAgICAgPGRvY3R5cGUtc3lzdGVtPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQ8L2RvY3R5cGUtc3lzdGVtPgotICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgotICAgICAgPC9tYXA6c2VyaWFsaXplcj4KLSAgICA8L21hcDpzZXJpYWxpemVycz4KLSAKLSAgPC9tYXA6Y29tcG9uZW50cz4KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0KLSAgICAgIDwhLS0gcGFyYW1ldHJpemVkIGRvY3R5cGUgbWF0Y2hlciAtLT4KLSAgICAgIDwhLS0gcGF0dGVybj0ie2Zvcm1hdH0ueG1sIiAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi54bWwiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi97MX0ueG1sL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfS97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfS97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX0iLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSBwYXR0ZXJuPSJ7Zm9ybWF0fS54bWwve3B1YklkfS97YXJlYX0ve3V1aWR9L3tsYW5ndWFnZX0iIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLnhtbC8qLyovKi8qIj4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gVGhpcyBpcyBhIHdvcmthcm91bmQgKHNlZSBiZWxvdykuIC0tPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0ibGVueWEtZG9jdW1lbnQ6ezR9LHB1Yj17Mn0sYXJlYT17M30sbGFuZz17NX17bGluazpyZXZ9Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL2NvbGxlY3Rpb24veHNsdC9wcmVwYXJlQ2luY2x1ZGUueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1dWlkIiB2YWx1ZT0iezR9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibGFuZ3VhZ2UiIHZhbHVlPSJ7NX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJjaW5jbHVkZSIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSBUaGlzIHdvdWxkIGJlIGEgbmljZXIgd2F5LCBidXQgY2F1c2VzIE5QRVMgaW4gQWJzdHJhY3RFbnZpcm9ubWVudC5yZWxlYXNlKEFic3RyYWN0RW52aXJvbm1lbnQuamF2YTo1NjEpCi0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJ7cmVzb3VyY2UtdHlwZTpjb2xsZWN0aW9uOmZvcm1hdC1jb2xsZWN0aW9ufS97Mn0vezN9L3s0fS97NX0iLz4KLSAgICAgICAgLS0+Ci0gICAgICAgIAotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9jb2xsZWN0aW9uL3hzbHQvY29sbGVjdGlvbjJjaW5jbHVkZS54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InV1aWQiIHZhbHVlPSJ7NH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9Ins1fSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImNpbmNsdWRlIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL25ld3MveHNsdC9jb2xsZWN0aW9uMnsxfS54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0iezV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHZhbHVlPSIiLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhcmVhIiB2YWx1ZT0iezN9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXVpZCIgdmFsdWU9Ins0fSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImJhc2VVcmwiIHZhbHVlPSIvezJ9L3szfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0icnNzLnhtbC8qKiI+Ci0gICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0idXVpZDJ1cmwiLz4KLSAgICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJwcm94eSIvPgotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0ieHNsdC9yc3MveGh0bWxsaW5rMnJzc2xpbmsueHNsIi8+Ci0gICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7NX0iLz4KLSAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Imljb24vKi8qLyovKiI+Ci0gICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9uZXdzL3Jlc291cmNlcy9pY29ucy9uZXdzLmdpZiIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvdXNlY2FzZXMvZWRpdC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3MvdXNlY2FzZXMvZWRpdC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhZDYyZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3VzZWNhc2VzL2VkaXQuangKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiBvbmVmb3JtLmp4IDUxMDA3MyAyMDA3LTAyLTIxIDE2OjAxOjUyWiBhbmRyZWFzICQgLS0+Ci08cGFnZTpwYWdlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIKLSAgeG1sbnM6Y2luY2x1ZGU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pbmNsdWRlLzEuMCIKLSAgPgotICAKLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5uZXdzLXNldHRpbmdzPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAgIAotICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAKLSAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtLW5ld3MtZWRpdCI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSIke2NvbnRpbnVhdGlvbi5pZH0iLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPgotICAgICAgCi0gICAgICA8ang6c2V0IHZhcj0ibmV3c1dyYXBwZXIiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCduZXdzV3JhcHBlcicpfSIvPgotICAgICAgPGp4OnNldCB2YXI9ImluY2x1ZGVJdGVtcyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2luY2x1ZGVJdGVtcycpfSIvPgotICAgICAgCi0gICAgICA8cD48aTE4bjp0ZXh0PmFjcXVpcmUtbmV3cy1mcm9tPC9pMThuOnRleHQ+OjwvcD4KLSAgICAgIAotICAgICAgPGp4OnNldCB2YXI9InR5cGUiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd0eXBlJyl9Ii8+Ci0gICAgICA8cCBzdHlsZT0icGFkZGluZy1sZWZ0OiAzZW07Ij4KLSAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3R5cGUuZXF1YWxzKCdjaGlsZHJlbicpfSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InR5cGUiIHZhbHVlPSJjaGlsZHJlbiIgY2hlY2tlZD0iY2hlY2tlZCIvPgotICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJ0eXBlIiB2YWx1ZT0iY2hpbGRyZW4iLz4KLSAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgIDxpMThuOnRleHQ+dHlwZS1jaGlsZHJlbjwvaTE4bjp0ZXh0PgotICAgICAgPC9wPgotICAgICAgPHAgc3R5bGU9InBhZGRpbmctbGVmdDogM2VtOyBjb2xvcjogIzk5OTk5OTsiPgotICAgICAgICA8aTE4bjp0ZXh0Pm5vdGUtZmVlZC1tb2R1bGU8L2kxOG46dGV4dD4KLSAgICAgIDwvcD4KLSAgICAgIDxwIHN0eWxlPSJwYWRkaW5nLWxlZnQ6IDNlbTsiPgotICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dHlwZS5lcXVhbHMoJ2xpbmsnKX0iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJ0eXBlIiB2YWx1ZT0ibGluayIgY2hlY2tlZD0iY2hlY2tlZCIvPgotICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJ0eXBlIiB2YWx1ZT0ibGluayIvPgotICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgPGkxOG46dGV4dD5leHRlcm5hbC1zb3VyY2U8L2kxOG46dGV4dD46Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJocmVmIiBzaXplPSI1MCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2hyZWYnKX0iLz4KLSAgICAgIDwvcD4KLSAgICAgIAotICAgICAgPHAgc3R5bGU9Im1hcmdpbjogM2VtIDA7Ij4KLSAgICAgICAgPGxhYmVsIGZvcj0iaW5jbHVkZUl0ZW1zIj48aTE4bjp0ZXh0PmluY2x1ZGUtaXRlbXM8L2kxOG46dGV4dD46PC9sYWJlbD4KLSAgICAgICAgPHNlbGVjdCBuYW1lPSJpbmNsdWRlSXRlbXMiPgotICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0ibnVtYmVyIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbnVtYmVycycpfSI+Ci0gICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke2luY2x1ZGVJdGVtcyA9PSBudW1iZXJ9Ij4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke251bWJlcn0iIHNlbGVjdGVkPSJzZWxlY3RlZCI+PGp4Om91dCB2YWx1ZT0iJHtudW1iZXJ9Ii8+PC9vcHRpb24+Ci0gICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke251bWJlcn0iPjxqeDpvdXQgdmFsdWU9IiR7bnVtYmVyfSIvPjwvb3B0aW9uPgotICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICA8L3A+Ci0gICAgICAKLSAgICAgIDxwPgotICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2F2ZSIgbmFtZT0ic3VibWl0IiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDYW5jZWwiIG5hbWU9ImNhbmNlbCIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgPC9wPgotICAgICAgCi0gICAgPC9mb3JtPgotICAgIAotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MveHNsdC9jb2xsZWN0aW9uMmhlYWRlci54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvY29sbGVjdGlvbjJoZWFkZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODNlOGE3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MveHNsdC9jb2xsZWN0aW9uMmhlYWRlci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHhodG1sMnhodG1sLnhzbCAyMDE3NzYgMjAwNS0wNi0yNSAxODoyNToyNlogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIgCi0gICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgotICAgIHhtbG5zOmNvbD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2NvbGxlY3Rpb24vMS4wIgotICAgIHhtbG5zOm1ldGE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZXRhZGF0YS8xLjAiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4aHRtbCBsZW55YSBjb2wgbWV0YSBkYyBpMThuIgotICAgID4KLSAgICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJ1dWlkIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvY29sOmNvbGxlY3Rpb24iPgotICAgIDxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJhcHBsaWNhdGlvbi9yc3MreG1sIgotICAgICAgdGl0bGU9IlJTUyIgaHJlZj0ibGVueWEtZG9jdW1lbnQ6eyR1dWlkfT91dWlkMnVybC5leHRlbnNpb249cnNzIiAvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvY29sbGVjdGlvbjJpbmNsdWRlLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3MveHNsdC9jb2xsZWN0aW9uMmluY2x1ZGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2NkNjMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MveHNsdC9jb2xsZWN0aW9uMmluY2x1ZGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB4aHRtbDJ4aHRtbC54c2wgMjAxNzc2IDIwMDUtMDYtMjUgMTg6MjU6MjZaIGdyZWdvciAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiIAotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKLSAgICB4bWxuczpjb2w9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jb2xsZWN0aW9uLzEuMCIKLSAgICB4bWxuczptZXRhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWV0YWRhdGEvMS4wIgotICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGh0bWwgbGVueWEgY29sIG1ldGEgZGMgaTE4biIKLSAgICA+Ci0gICAgCi0gIDx4c2w6aW1wb3J0IGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9uZXdzL3hzbHQvY29sbGVjdGlvbjJ4aHRtbC54c2wiLz4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0ibm9kZWlkIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibGFuZ3VhZ2UiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJ1dWlkIi8+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImluY2x1ZGVJdGVtcyIgc2VsZWN0PSIvY29sOmNvbGxlY3Rpb24vQGluY2x1ZGVJdGVtcyIvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2NvbDpjb2xsZWN0aW9uIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlIiBzZWxlY3Q9Im1ldGE6bWV0YWRhdGEvZGM6ZWxlbWVudHMvZGM6dGl0bGUiLz4KLSAgICA8ZGl2IGlkPSJuZXdzIj4KLSAgICAgIDxkaXYgY2xhc3M9InJzc2xpbmsiPgotICAgICAgICA8YSB0eXBlPSJhcHBsaWNhdGlvbi9yc3MreG1sIiBocmVmPSJsZW55YS1kb2N1bWVudDp7JHV1aWR9P3V1aWQydXJsLmV4dGVuc2lvbj1yc3MiPlJTUyAyLjA8L2E+Ci0gICAgICA8L2Rpdj4KLSAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC9oMT4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29sOmRvY3VtZW50Ly94aHRtbDpkaXZbQGNsYXNzID0gJ25ld3NJdGVtJ10iPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjb2w6ZG9jdW1lbnQvL3hodG1sOmRpdltAY2xhc3MgPSAnbmV3c0l0ZW0nXSI+Ci0gICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJ4aHRtbDpoMi94aHRtbDpzcGFuW0BjbGFzcyA9ICduZXdzRGF0ZSddL2kxOG46ZGF0ZS10aW1lL0B2YWx1ZSIgb3JkZXI9ImRlc2NlbmRpbmciLz4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAmbHQ7PSBudW1iZXIoJGluY2x1ZGVJdGVtcykiPgotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iLz4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29sOmRvY3VtZW50Ij4KLSAgICAgICAgICAgIDx4c2w6c29ydCBvcmRlcj0iZGVzY2VuZGluZyIgc2VsZWN0PSJtZXRhOm1ldGFkYXRhL2RjOmVsZW1lbnRzL2RjOmRhdGUiLz4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAmbHQ7PSBudW1iZXIoJGluY2x1ZGVJdGVtcykiPgotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iLz4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC9kaXY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLQotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvY29sbGVjdGlvbjJyc3MueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy94c2x0L2NvbGxlY3Rpb24ycnNzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5MjY3Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvY29sbGVjdGlvbjJyc3MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogeGh0bWwyeGh0bWwueHNsIDIwMTc3NiAyMDA1LTA2LTI1IDE4OjI1OjI2WiBncmVnb3IgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIiAKLSAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCi0gICAgeG1sbnM6Y29sPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY29sbGVjdGlvbi8xLjAiCi0gICAgeG1sbnM6bWV0YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21ldGFkYXRhLzEuMCIKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhodG1sIGxlbnlhIGNvbCBtZXRhIGRjIGkxOG4iCi0gICAgPgotICAgIAotICA8eHNsOmluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3hzbHQvaGVscGVyLW9iamVjdC54c2wiLz4KLSAgPHhzbDppbmNsdWRlIGhyZWY9InNoYXJlZC54c2wiLz4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0ibm9kZWlkIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibGFuZ3VhZ2UiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJhcmVhIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iYmFzZVVybCIvPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9jb2w6Y29sbGVjdGlvbiI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aXRsZSIgc2VsZWN0PSJtZXRhOm1ldGFkYXRhL2RjOmVsZW1lbnRzL2RjOnRpdGxlIi8+Ci0gICAgCi0gICAgPHJzcyB2ZXJzaW9uPSIyLjAiPgotICAgICAgCi0gICAgICA8Y2hhbm5lbD4KLSAgICAgICAgPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotICAgICAgICA8bGluaz48eGh0bWw6YSBocmVmPSJ7JGJhc2VVcmx9Ii8+PC9saW5rPgotICAgICAgICA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxhbmd1YWdlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGFuZ3VhZ2UiLz48L2xhbmd1YWdlPgotICAgICAgICA8Y29weXJpZ2h0PjwvY29weXJpZ2h0PgotICAgICAgICA8cHViRGF0ZT48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGF0ZSIvPjwvcHViRGF0ZT4KLSAgICAgICAgCi0gICAgICAgIDwhLS0KLSAgICAgICAgPGltYWdlPgotICAgICAgICAgIDx1cmw+PC91cmw+Ci0gICAgICAgICAgPHRpdGxlPjwvdGl0bGU+Ci0gICAgICAgICAgPGxpbms+PC9saW5rPgotICAgICAgICA8L2ltYWdlPgotICAgICAgICAtLT4KLSAgICAgICAgCi0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29sOmRvY3VtZW50Ij4KLSAgICAgICAgICA8eHNsOnNvcnQgb3JkZXI9ImRlc2NlbmRpbmciIHNlbGVjdD0ibWV0YTptZXRhZGF0YS9kYzplbGVtZW50cy9kYzpkYXRlIi8+Ci0gICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgCi0gICAgICA8L2NoYW5uZWw+Ci0gICAgICAKLSAgICA8L3Jzcz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkYXRlIj4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29sOmRvY3VtZW50Ij4KLSAgICAgIDx4c2w6c29ydCBzZWxlY3Q9Im1ldGE6bWV0YWRhdGEvZGM6ZWxlbWVudHMvZGM6ZGF0ZSIvPgotICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpID0gMSI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGF0ZSIgc2VsZWN0PSJtZXRhOm1ldGFkYXRhL2RjOmVsZW1lbnRzL2RjOmRhdGUiLz4KLSAgICAgICAgPGkxOG46ZGF0ZS10aW1lIGxvY2FsZT0iZW4iIHNyYy1wYXR0ZXJuPSJ5eXl5LU1NLWRkIGhoOm1tOnNzIiBwYXR0ZXJuPSJFRUUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIFoiIHZhbHVlPSJ7JGRhdGV9IiAvPgotICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29sOmRvY3VtZW50Ij4KLSAgICA8aXRlbT4KLSAgICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibWV0YTptZXRhZGF0YS9kYzplbGVtZW50cy9kYzp0aXRsZSIvPjwvdGl0bGU+Ci0gICAgICA8ZGVzY3JpcHRpb24+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1ldGE6bWV0YWRhdGEvZGM6ZWxlbWVudHMvZGM6ZGVzY3JpcHRpb24iLz48L2Rlc2NyaXB0aW9uPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdldEhyZWYiLz4KLSAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgPGxpbms+PHhodG1sOmEgaHJlZj0ieyRocmVmfSIvPjwvbGluaz4KLSAgICAgIDxhdXRob3I+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1ldGE6bWV0YWRhdGEvZGM6ZWxlbWVudHMvZGM6Y3JlYXRvciIvPjwvYXV0aG9yPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkYXRlIiBzZWxlY3Q9Im1ldGE6bWV0YWRhdGEvZGM6ZWxlbWVudHMvZGM6ZGF0ZSIvPgotICAgICAgPHB1YkRhdGU+PGkxOG46ZGF0ZS10aW1lIGxvY2FsZT0iZW4iIHNyYy1wYXR0ZXJuPSJ5eXl5LU1NLWRkIGhoOm1tOnNzIiBwYXR0ZXJuPSJFRUUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIFoiIHZhbHVlPSJ7JGRhdGV9IiAvPjwvcHViRGF0ZT4KLSAgICA8L2l0ZW0+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLQotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvY29sbGVjdGlvbjJ4aHRtbC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvY29sbGVjdGlvbjJ4aHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhM2EyYTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy94c2x0L2NvbGxlY3Rpb24yeGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogeGh0bWwyeGh0bWwueHNsIDIwMTc3NiAyMDA1LTA2LTI1IDE4OjI1OjI2WiBncmVnb3IgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIiAKLSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCi0gICAgeG1sbnM6Y29sPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY29sbGVjdGlvbi8xLjAiCi0gICAgeG1sbnM6bWV0YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21ldGFkYXRhLzEuMCIKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhodG1sIGxlbnlhIGNvbCBtZXRhIGRjIGkxOG4iCi0gICAgPgotICAgIAotICA8eHNsOmluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3hzbHQvaGVscGVyLW9iamVjdC54c2wiLz4KLSAgPHhzbDppbmNsdWRlIGhyZWY9InNoYXJlZC54c2wiLz4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0ibm9kZWlkIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibGFuZ3VhZ2UiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJhcmVhIi8+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1heENoYXJzIj4xMDA8L3hzbDp2YXJpYWJsZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvY29sOmNvbGxlY3Rpb24iPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiIHNlbGVjdD0ibWV0YTptZXRhZGF0YS9kYzplbGVtZW50cy9kYzp0aXRsZSIvPgotICAgIDxodG1sPgotICAgICAgPGJvZHk+Ci0gICAgICAgIDxkaXYgaWQ9ImJvZHkiPgotICAgICAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC9oMT4KLSAgICAgICAgICAKLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhcmVhID0gJ2F1dGhvcmluZyciPgotICAgICAgICAgICAgPHAgc3R5bGU9ImNvbG9yOiAjOTk5OTk5OyI+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+bmV3LW5ld3MtbWVzc2FnZS1oaW50PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29sOmRvY3VtZW50Ly94aHRtbDpkaXZbQGNsYXNzID0gJ25ld3NJdGVtJ10iPgotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbDpkb2N1bWVudC8veGh0bWw6ZGl2W0BjbGFzcyA9ICduZXdzSXRlbSddIj4KLSAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJ4aHRtbDpoMi94aHRtbDpzcGFuW0BjbGFzcyA9ICduZXdzRGF0ZSddL2kxOG46ZGF0ZS10aW1lL0B2YWx1ZSIgb3JkZXI9ImRlc2NlbmRpbmciLz4KLSAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbDpkb2N1bWVudCI+Ci0gICAgICAgICAgICAgICAgPHhzbDpzb3J0IG9yZGVyPSJkZXNjZW5kaW5nIiBzZWxlY3Q9Im1ldGE6bWV0YWRhdGEvZGM6ZWxlbWVudHMvZGM6ZGF0ZSIvPgotICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L2Rpdj4KLSAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29sOmRvY3VtZW50Ij4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRhdGUiIHNlbGVjdD0ibWV0YTptZXRhZGF0YS9kYzplbGVtZW50cy9kYzpkYXRlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aXRsZSIgc2VsZWN0PSJtZXRhOm1ldGFkYXRhL2RjOmVsZW1lbnRzL2RjOnRpdGxlIi8+Ci0gICAgPGRpdiBjbGFzcz0ibmV3c0l0ZW0iPgotICAgICAgPGgyPgotICAgICAgICA8c3BhbiBjbGFzcz0ibmV3c0RhdGUiPgotICAgICAgICAgIDxpMThuOmRhdGUtdGltZSBzcmMtcGF0dGVybj0ieXl5eS1NTS1kZCBISDptbTpzcyIgbG9jYWxlPSJ7JGxhbmd1YWdlfSIgdmFsdWU9InskZGF0ZX0iIC8+Ci0gICAgICAgIDwvc3Bhbj48YnIgLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2V0SHJlZiIvPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPGEgaHJlZj0ieyRocmVmfSIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvYT4KLSAgICAgIDwvaDI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmh0bWwveGh0bWw6Ym9keS94aHRtbDpwWzFdIiBtb2RlPSJleGNlcnB0Ii8+Ci0gICAgPC9kaXY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOnAiIG1vZGU9ImV4Y2VycHQiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IkAqIi8+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nKC4sIDEsICRtYXhDaGFycykiLz4KLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguKSAmZ3Q7ICRtYXhDaGFycyI+Ci0gICAgICAgIDx4c2w6dGV4dD4mI3gyMDI2OzwveHNsOnRleHQ+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0KLTwveHNsOnN0eWxlc2hlZXQ+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbmV3cy94c2x0L3Jzcy94aHRtbGxpbmsycnNzbGluay54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvcnNzL3hodG1sbGluazJyc3NsaW5rLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5MDkyOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvcnNzL3hodG1sbGluazJyc3NsaW5rLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6YSI+Ci0gICAgPHhzbDp0ZXh0Lz4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiLz4KLSAgICA8eHNsOnRleHQvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9uZXdzL3hzbHQvc2hhcmVkLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL25ld3MveHNsdC9zaGFyZWQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc1NTZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25ld3MveHNsdC9zaGFyZWQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iZ2V0SHJlZiI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQHV1aWQiPmxlbnlhLWRvY3VtZW50Ojx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXVpZCIvPjwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiIvPjwveHNsOndoZW4+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi9pbmJveG1hbmFnZXIueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi9pbmJveG1hbmFnZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjIyMTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5ib3htYW5hZ2VyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5pbmJveC5JbmJveE1hbmFnZXInXSI+Ci0KLSAgPGNvbXBvbmVudCBsb2dnZXI9ImxlbnlhLmluYm94IgotICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEuaW5ib3guSW5ib3hNYW5hZ2VyIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmluYm94LnhtbC5YbWxTb3VyY2VJbmJveE1hbmFnZXIiLz4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5ib3htb2R1bGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi9pbmJveG1vZHVsZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjZmZlMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi9pbmJveG1vZHVsZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnaW5ib3gnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbG9nZ2VyPSJjb3JlLm1vZHVsZXMuaW5wdXQuaW5ib3giIG5hbWU9ImluYm94Ig0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmluYm94LkluYm94TW9kdWxlIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb25maWcvY29jb29uLXhjb25mL25vdGlmaWNhdGlvbmxpc3RlbmVyLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvbm90aWZpY2F0aW9ubGlzdGVuZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODliZmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvbm90aWZpY2F0aW9ubGlzdGVuZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkxpc3RlbmVyJ10iPgotCi0gIDxjb21wb25lbnQgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXIiCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkxpc3RlbmVyIgotICAgIGxvZ2dlcj0ibGVueWEubm90aWZpY2F0aW9uIi8+Ci0gIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb25maWcvY29jb29uLXhjb25mL25vdGlmaWVyLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvbm90aWZpZXIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGE2ZjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvbm90aWZpZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL2NvbXBvbmVudFtAcm9sZSA9ICdvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5Ob3RpZmllciddIj4KLQotICA8Y29tcG9uZW50IGxvZ2dlcj0ibGVueWEubm90aWZpY2F0aW9uIgotICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk5vdGlmaWVyIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmluYm94LkluYm94Tm90aWZpZXIiLz4KLQotICA8IS0tIFVzZSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gdG8gc2VuZCBlLW1haWwgbm90aWZpY2F0aW9ucyAtLT4KLSAgPCEtLQotICA8Y29tcG9uZW50IGxvZ2dlcj0ibGVueWEubm90aWZpY2F0aW9uIgotICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk5vdGlmaWVyIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5FbWFpbE5vdGlmaWVyIj4KLSAgICAKLSAgICA8c210cCBob3N0PSJsb2NhbGhvc3QiLz4KLSAgICAKLSAgICA8IS0gdXNlIHRoaXMgZm9yIGF1dGhlbnRpY2F0aW9uCi0gICAgPHNtdHAgaG9zdD0ibG9jYWxob3N0IiB1c2VybmFtZT0iam9obiIgcGFzc3dvcmQ9InN3b3JkZmlzaCIgLz4KLSAgICAtPgotICAgIAotICA8L2NvbXBvbmVudD4KLSAgLS0+Ci0gIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3RhYi54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3RhYi54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZjA0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vY29uZmlnL2NvY29vbi14Y29uZi90YWIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vZ3VpLW1hbmFnZXIvdGFiLWdyb3VwW0BuYW1lID0gJ2FkbWluJ10iCi0gICAgdW5sZXNzPSIvY29jb29uL2d1aS1tYW5hZ2VyL3RhYi1ncm91cFtAbmFtZSA9ICdhZG1pbiddL3RhYltAbmFtZSA9ICdpbmJveCddIj4NCi0gICAgPHRhYiBuYW1lPSJpbmJveCIgbGFiZWw9IkluYm94IiB1c2VjYXNlPSJub3RpZmljYXRpb24uaW5ib3giLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbmJveC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtaW5ib3gueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzUxMDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1pbmJveC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ25vdGlmaWNhdGlvbi5pbmJveCddIj4KLQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ibm90aWZpY2F0aW9uLmluYm94IiBsb2dnZXI9ImxlbnlhLm5vdGlmaWNhdGlvbiIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmluYm94LnVzZWNhc2VzLkluYm94Ij4KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvaW5ib3guangiIG1lbnU9InRydWUiPgotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iaW5ib3giLz4KLSAgICAgIDwvdmlldz4KLSAgICAgIDxleGl0IHVzZWNhc2U9Im5vdGlmaWNhdGlvbi5pbmJveCIvPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1zZW5kTWVzc2FnZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2Utc2VuZE1lc3NhZ2UueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiODQ1MzUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1zZW5kTWVzc2FnZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ25vdGlmaWNhdGlvbi5zZW5kTWVzc2FnZSddIj4KLQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ibm90aWZpY2F0aW9uLnNlbmRNZXNzYWdlIiBsb2dnZXI9ImxlbnlhLm5vdGlmaWNhdGlvbiIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmluYm94LnVzZWNhc2VzLlNlbmRNZXNzYWdlIj4KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvc2VuZE1lc3NhZ2UuangiIG1lbnU9InRydWUiPgotICAgICAgICA8dGFiIGdyb3VwPSJhZG1pbiIgbmFtZT0iaW5ib3giLz4KLSAgICAgIDwvdmlldz4KLSAgICAgIDxleGl0IHVzZWNhc2U9Im5vdGlmaWNhdGlvbi5pbmJveCIvPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9sZW55YS1yb2xlcy9ub3RpZmllci54cm9sZXMgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vY29uZmlnL2xlbnlhLXJvbGVzL25vdGlmaWVyLnhyb2xlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyMmJjMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vY29uZmlnL2xlbnlhLXJvbGVzL25vdGlmaWVyLnhyb2xlcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4cm9sZXMgeHBhdGg9Ii9yb2xlLWxpc3QiIHVubGVzcz0iL3JvbGUtbGlzdC9yb2xlW0BuYW1lID0gJ29yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk5vdGlmaWVyJ10iPgotCi0gIDxyb2xlIG5hbWU9Im9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk5vdGlmaWVyIgotICAgIHNob3J0aGFuZD0ibm90aWZpZXIiCi0gICAgZGVmYXVsdC1jbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uRW1haWxOb3RpZmllciIvPgotICAKLTwveHJvbGVzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2FkODFlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLm5vdGlmaWNhdGlvbjwvaWQ+Ci0gIDxleHBvcnQgcGFja2FnZT0ib3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24iLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuYWRtaW5pc3RyYXRpb24iLz4gPCEtLSBuZWNlc3NhcnkgZm9yIHRhYnMgLS0+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnVzZWNhc2UiLz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5Ob3RpZmljYXRpb248L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPk5vdGlmaWNhdGlvbiBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vY29udGVudC9tZXNzYWdlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb250ZW50L21lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzkyZmRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb250ZW50L21lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhtYXAgMTc5NDg4IDIwMDUtMDYtMDIgMDI6Mjk6MzlaIGdyZWdvciAkIC0tPgotPG1lc3NhZ2UgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL25vdGlmaWNhdGlvbi8yLjAiPgotICA8c3ViamVjdC8+Ci0gIDxib2R5Lz4KLTwvbWVzc2FnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC9BYnN0cmFjdEluYm94TWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvQWJzdHJhY3RJbmJveE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkNGM1ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC9BYnN0cmFjdEluYm94TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuaW5ib3g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnRocmVhZC5UaHJlYWRTYWZlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBpbmJveCBtYW5hZ2Vycy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5ib3hNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgSW5ib3hNYW5hZ2VyLAotICAgICAgICBUaHJlYWRTYWZlIHsKLQotICAgIHByaXZhdGUgTWFwIGluYm94ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBJbmJveCBnZXRJbmJveChVc2VyIHVzZXIpIHsKLSAgICAgICAgSW5ib3ggaW5ib3ggPSAoSW5ib3gpIHRoaXMuaW5ib3hlcy5nZXQodXNlcik7Ci0gICAgICAgIGlmIChpbmJveCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbmJveCA9IGRvR2V0SW5ib3godXNlcik7Ci0gICAgICAgICAgICB0aGlzLmluYm94ZXMucHV0KHVzZXIsIGluYm94KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5ib3g7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEluYm94IGRvR2V0SW5ib3goVXNlciB1c2VyKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvQWJzdHJhY3RJbmJveE1lc3NhZ2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L0Fic3RyYWN0SW5ib3hNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYWU2OTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvQWJzdHJhY3RJbmJveE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmluYm94OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIEluYm94IG1lc3NhZ2UgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluYm94TWVzc2FnZSBpbXBsZW1lbnRzIEluYm94TWVzc2FnZSB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbWFya2VkQXNSZWFkOwotICAgIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBpZCBUaGUgSUQuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gd3JhcC4KLSAgICAgKiBAcGFyYW0gbWFya2VkQXNSZWFkIGlmIHRoZSBtZXNzYWdlIGlzIG1hcmtlZCBhcyByZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEluYm94TWVzc2FnZShTdHJpbmcgaWQsIE1lc3NhZ2UgbWVzc2FnZSwgYm9vbGVhbiBtYXJrZWRBc1JlYWQpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImlkIiwgaWQpOwotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJtZXNzYWdlIiwgbWVzc2FnZSk7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIHRoaXMubWFya2VkQXNSZWFkID0gbWFya2VkQXNSZWFkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc01hcmtlZEFzUmVhZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWFya2VkQXNSZWFkOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFya0FzUmVhZChib29sZWFuIG1hcmtlZCkgewotICAgICAgICB0aGlzLm1hcmtlZEFzUmVhZCA9IG1hcmtlZDsKLSAgICAgICAgY2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNoYW5nZWQoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvSW5ib3guamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L0luYm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNDFmNDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvSW5ib3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmluYm94OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTWVzc2FnZTsKLQotLyoqCi0gKiBBbiBpbmJveC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmJveCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBbGwgbWVzc2FnZXMgaW4gdGhpcyBpbmJveC4KLSAgICAgKi8KLSAgICBJbmJveE1lc3NhZ2VbXSBnZXRNZXNzYWdlcygpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbmJveCBtZXNzYWdlIHdoaWNoIHdyYXBzIHRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIEluYm94TWVzc2FnZSBhZGQoTWVzc2FnZSBtZXNzYWdlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHJlbW92ZS4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZShJbmJveE1lc3NhZ2UgbWVzc2FnZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlkIFRoZSBJRC4KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHdpdGggdGhpcyBJRC4KLSAgICAgKi8KLSAgICBJbmJveE1lc3NhZ2UgZ2V0TWVzc2FnZShTdHJpbmcgaWQpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvSW5ib3hNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC9JbmJveE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1OGRlMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC9JbmJveE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmluYm94OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotCi0vKioKLSAqIEluYm94IG1hbmFnZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5ib3hNYW5hZ2VyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgQXZhbG9uIHNlcnZpY2Ugcm9sZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgUk9MRSA9IEluYm94TWFuYWdlci5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlci4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbmJveCBvZiB0aGlzIHVzZXIuCi0gICAgICovCi0gICAgSW5ib3ggZ2V0SW5ib3goVXNlciB1c2VyKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L0luYm94TWVzc2FnZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvSW5ib3hNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1M2YyZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvSW5ib3hNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5pbmJveDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk1lc3NhZ2U7Ci0KLS8qKgotICogQSBtZXNzYWdlIGVudHJ5IGluIGFuIGluYm94LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluYm94TWVzc2FnZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFya3MgdGhpcyBtZXNzYWdlIGFzIHJlYWQuCi0gICAgICogQHBhcmFtIG1hcmtlZCBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgdm9pZCBtYXJrQXNSZWFkKGJvb2xlYW4gbWFya2VkKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIHRoaXMgbWVzc2FnZSBpcyBtYXJrZWQgYXMgcmVhZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTWFya2VkQXNSZWFkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSB3aGljaCBpcyB3cmFwcGVkIGJ5IHRoaXMgaW5ib3ggbWVzc2FnZS4KLSAgICAgKi8KLSAgICBNZXNzYWdlIGdldE1lc3NhZ2UoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGlzIG1lc3NhZ2UuCi0gICAgICovCi0gICAgU3RyaW5nIGdldElkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L0luYm94TW9kdWxlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC9JbmJveE1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWI3NzA5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L0luYm94TW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5pbmJveDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuQWJzdHJhY3RJbnB1dE1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiA8cD4KLSAqIEluYm94IG1vZHVsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogQXR0cmlidXRlczoKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT48c3Ryb25nPm5ld01lc3NhZ2VDb3VudDwvc3Ryb25nPiAtIHRoZSBudW1iZXIgb2YgdW5yZWFkIG1lc3NhZ2VzIGFzCi0gKiBzdHJpbmc8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIEluYm94TW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RJbnB1dE1vZHVsZSBpbXBsZW1lbnRzIFNlcnZpY2VhYmxlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19NRVNTQUdFX0NPVU5UID0gIm5ld01lc3NhZ2VDb3VudCI7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgQ29uZmlndXJhdGlvbiBtb2RlQ29uZiwgTWFwIG9iamVjdE1vZGVsKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhORVdfTUVTU0FHRV9DT1VOVCkpIHsKLSAgICAgICAgICAgIEluYm94TWFuYWdlciBpbmJveE1hbmFnZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbmJveE1hbmFnZXIgPSAoSW5ib3hNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKEluYm94TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXF1ZXN0KG9iamVjdE1vZGVsKTsKLSAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBSZXBvc2l0b3J5VXRpbC5nZXRTZXNzaW9uKG1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgICAgIFVzZXIgdXNlciA9IHNlc3Npb24uZ2V0SWRlbnRpdHkoKS5nZXRVc2VyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjAiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEluYm94IGluYm94ID0gaW5ib3hNYW5hZ2VyLmdldEluYm94KHVzZXIpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBJbmJveE1lc3NhZ2VbXSBtZXNzYWdlcyA9IGluYm94LmdldE1lc3NhZ2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZXNbaV0uaXNNYXJrZWRBc1JlYWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkF0dHJpYnV0ZSBbIiArIG5hbWUgKyAiXTogIiwgZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChpbmJveE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShpbmJveE1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJBdHRyaWJ1dGU6IFsiICsgbmFtZSArICJdIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvSW5ib3hOb3RpZmllci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvSW5ib3hOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDVkODI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L0luYm94Tm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmluYm94OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBOb3RpZmllciB3aGljaCBhZGRzIHRoZSBtZXNzYWdlIHRvIHRoZSByZWNpcGllbnRzJyBpbmJveGVzLgotICovCi1wdWJsaWMgY2xhc3MgSW5ib3hOb3RpZmllciBleHRlbmRzIEFic3RyYWN0Tm90aWZpZXIgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5KFVzZXIgdXNlciwgTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIEluYm94TWFuYWdlciBpbmJveE1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5ib3hNYW5hZ2VyID0gKEluYm94TWFuYWdlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChJbmJveE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICBJbmJveCBpbmJveCA9IGluYm94TWFuYWdlci5nZXRJbmJveCh1c2VyKTsKLSAgICAgICAgICAgIGluYm94LmFkZChtZXNzYWdlKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGluYm94TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoaW5ib3hNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC91c2VjYXNlcy9JbmJveC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvdXNlY2FzZXMvSW5ib3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxNTIzOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC91c2VjYXNlcy9JbmJveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuaW5ib3gudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5pbmJveC5JbmJveE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5pbmJveC5JbmJveE1lc3NhZ2U7Ci0KLS8qKgotICogU2hvdyBhbmQgbWFuYWdlIGFuIGluYm94LgotICovCi1wdWJsaWMgY2xhc3MgSW5ib3ggZXh0ZW5kcyBBYnN0cmFjdFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIAotICAgICAgICBVc2VyIHVzZXIgPSBnZXRTZXNzaW9uKCkuZ2V0SWRlbnRpdHkoKS5nZXRVc2VyKCk7Ci0gICAgICAgIHNldFBhcmFtZXRlcigidXNlciIsIHVzZXIpOwotICAgICAgICAKLSAgICAgICAgSW5ib3hNYW5hZ2VyIGluYm94TWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbmJveE1hbmFnZXIgPSAoSW5ib3hNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKEluYm94TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubGVueWEuaW5ib3guSW5ib3ggaW5ib3ggPSBpbmJveE1hbmFnZXIuZ2V0SW5ib3godXNlcik7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoImluYm94IiwgaW5ib3gpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5ib3hNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShpbmJveE1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoIm1lc3NhZ2VJZCIpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5pbmJveC5JbmJveCBpbmJveCA9IChvcmcuYXBhY2hlLmxlbnlhLmluYm94LkluYm94KSBnZXRQYXJhbWV0ZXIoImluYm94Iik7Ci0gICAgICAgICAgICBJbmJveE1lc3NhZ2UgbWVzc2FnZSA9IGluYm94LmdldE1lc3NhZ2UoaWQpOwotICAgICAgICAgICAgbWVzc2FnZS5tYXJrQXNSZWFkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBkZWxldGVJZCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKCJkZWxldGVNZXNzYWdlSWQiKTsKLSAgICAgICAgaWYgKGRlbGV0ZUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubGVueWEuaW5ib3guSW5ib3ggaW5ib3ggPSAob3JnLmFwYWNoZS5sZW55YS5pbmJveC5JbmJveCkgZ2V0UGFyYW1ldGVyKCJpbmJveCIpOwotICAgICAgICAgICAgSW5ib3hNZXNzYWdlIG1lc3NhZ2UgPSBpbmJveC5nZXRNZXNzYWdlKGRlbGV0ZUlkKTsKLSAgICAgICAgICAgIGluYm94LnJlbW92ZShtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvdXNlY2FzZXMvU2VuZE1lc3NhZ2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L3VzZWNhc2VzL1NlbmRNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNDIwYWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gvdXNlY2FzZXMvU2VuZE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmluYm94LnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogU2hvdyBhbmQgbWFuYWdlIGFuIGluYm94LgotICovCi1wdWJsaWMgY2xhc3MgU2VuZE1lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHN1cGVyLmluaXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgVXNlciB1c2VyID0gZ2V0U2Vzc2lvbigpLmdldElkZW50aXR5KCkuZ2V0VXNlcigpOwotICAgICAgICBzZXRQYXJhbWV0ZXIoInVzZXIiLCB1c2VyKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSB1c2VyLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpOwotICAgICAgICAgICAgVXNlcltdIHVzZXJzID0gdXNlck1hbmFnZXIuZ2V0VXNlcnMoKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcigidXNlcnMiLCB1c2Vycyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotCi0gICAgICAgIGlmIChnZXRSZWNpcGllbnQoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlBsZWFzZSBjaG9vc2UgYSByZWNpcGllbnQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0U3ViamVjdCgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiUGxlYXNlIGNob29zZSBhIHN1YmplY3QuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1YmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJBc1N0cmluZygic3ViamVjdCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVjaXBpZW50KCkgewotICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoInJlY2lwaWVudCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9keSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlckFzU3RyaW5nKCJib2R5Iik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotCi0gICAgICAgIFN0cmluZyByZWNpcGllbnRJZCA9IGdldFJlY2lwaWVudCgpOwotICAgICAgICBVc2VyIHNlbmRlciA9IGdldFNlc3Npb24oKS5nZXRJZGVudGl0eSgpLmdldFVzZXIoKTsKLSAgICAgICAgVXNlciByZWNpcGllbnQ7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyID0gc2VuZGVyLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpOwotICAgICAgICAgICAgcmVjaXBpZW50ID0gdXNlck1hbmFnZXIuZ2V0VXNlcihyZWNpcGllbnRJZCk7Ci0gICAgICAgICAgICBBc3NlcnQubm90TnVsbCgidXNlciAiICsgcmVjaXBpZW50SWQsIHJlY2lwaWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIElkZW50aWZpYWJsZVtdIHJlY2lwaWVudHMgPSB7IHJlY2lwaWVudCB9OwotICAgICAgICBTdHJpbmcgc3ViamVjdCA9IGdldFN1YmplY3QoKTsKLSAgICAgICAgU3RyaW5nIGJvZHkgPSBnZXRCb2R5KCk7Ci0KLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2Uoc3ViamVjdCwgbmV3IFN0cmluZ1swXSwgYm9keSwgbmV3IFN0cmluZ1swXSwgc2VuZGVyLAotICAgICAgICAgICAgICAgIHJlY2lwaWVudHMpOwotICAgICAgICBOb3RpZmljYXRpb25VdGlsLm5vdGlmeSh0aGlzLm1hbmFnZXIsIG1lc3NhZ2UpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC94bWwvWG1sU291cmNlSW5ib3guamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L3htbC9YbWxTb3VyY2VJbmJveC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWEwYTJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L3htbC9YbWxTb3VyY2VJbmJveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmluYm94LnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMudXVpZC5VVUlER2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5jb21wb25lbnRzLnV1aWQuVVVJREdlbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5JZGVudGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmluYm94LkluYm94OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuaW5ib3guSW5ib3hNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBJbmJveCBiYXNlZCBvbiBYTUwgc291cmNlcy4KLSAqLwotcHVibGljIGNsYXNzIFhtbFNvdXJjZUluYm94IGltcGxlbWVudHMgSW5ib3ggewotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgVXNlciB1c2VyOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sU291cmNlSW5ib3goU2VydmljZU1hbmFnZXIgbWFuYWdlciwgVXNlciB1c2VyKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIHRoaXMudXNlciA9IHVzZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBJbmJveE1lc3NhZ2UgYWRkKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICBJbmJveE1lc3NhZ2UgbXNnID0gbmV3IFhtbFNvdXJjZUluYm94TWVzc2FnZSh0aGlzLCBnZW5lcmF0ZUlkKCksIG1lc3NhZ2UsIGZhbHNlKTsKLSAgICAgICAgbWVzc2FnZXMoKS5hZGQobXNnKTsKLSAgICAgICAgc2F2ZSgpOwotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVJZCgpIHsKLSAgICAgICAgVVVJREdlbiBnZW5lcmF0b3IgPSBVVUlER2VuRmFjdG9yeS5nZXRVVUlER2VuKCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IGdlbmVyYXRvci5uZXh0VVVJRCgpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShJbmJveE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICBBc3NlcnQuaXNUcnVlKCJjb250YWluZWQiLCBtZXNzYWdlcygpLmNvbnRhaW5zKG1lc3NhZ2UpKTsKLSAgICAgICAgbWVzc2FnZXMoKS5yZW1vdmUobWVzc2FnZSk7Ci0gICAgICAgIHNhdmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5ib3hNZXNzYWdlW10gZ2V0TWVzc2FnZXMoKSB7Ci0gICAgICAgIExpc3QgbWVzc2FnZXMgPSBtZXNzYWdlcygpOwotICAgICAgICByZXR1cm4gKEluYm94TWVzc2FnZVtdKSBtZXNzYWdlcy50b0FycmF5KG5ldyBJbmJveE1lc3NhZ2VbbWVzc2FnZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IG1lc3NhZ2VzOwotCi0gICAgcHJvdGVjdGVkIExpc3QgbWVzc2FnZXMoKSB7Ci0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkID0gLTE7Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9hZCgpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgaWYgKFNvdXJjZVV0aWwuZXhpc3RzKGdldFNvdXJjZVVyaSgpLCB0aGlzLm1hbmFnZXIpKSB7Ci0KLSAgICAgICAgICAgICAgICB0aGlzLmxhc3RNb2RpZmllZCA9IFNvdXJjZVV0aWwuZ2V0TGFzdE1vZGlmaWVkKGdldFNvdXJjZVVyaSgpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IHhtbCA9IFNvdXJjZVV0aWwucmVhZERPTShnZXRTb3VyY2VVcmkoKSwgdGhpcy5tYW5hZ2VyKTsKLQotICAgICAgICAgICAgICAgIEFzc2VydC5pc1RydWUoImRvY3VtZW50IGVsZW1lbnQgaXMgPGluYm94PiIsIHhtbC5nZXREb2N1bWVudEVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsTmFtZSgpLmVxdWFscygiaW5ib3giKSk7Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlSGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoTm90aWZpZXIuTkFNRVNQQUNFLCAiIiwgeG1sKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBtZXNzYWdlRWxlbWVudHMgPSBoZWxwZXIuZ2V0Q2hpbGRyZW4oeG1sLmdldERvY3VtZW50RWxlbWVudCgpLCAibWVzc2FnZSIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlRWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKCJpZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IG1lc3NhZ2VFbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IGdlbmVyYXRlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbmRlcklkID0gbWVzc2FnZUVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgic2VuZGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXIgc2VuZGVyID0gZ2V0VXNlcihzZW5kZXJJZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByZWNpcGllbnRFbGVtZW50ID0gaGVscGVyLmdldEZpcnN0Q2hpbGQobWVzc2FnZUVsZW1lbnRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNpcGllbnRzIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudFtdIHVzZXJFbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbihyZWNpcGllbnRFbGVtZW50LCAidXNlciIpOwotICAgICAgICAgICAgICAgICAgICBFbGVtZW50W10gZ3JvdXBFbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbihyZWNpcGllbnRFbGVtZW50LCAiZ3JvdXAiKTsKLQotICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWFibGVbXSByZWNpcGllbnRzID0gbmV3IElkZW50aWZpYWJsZVt1c2VyRWxlbWVudHMubGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBncm91cEVsZW1lbnRzLmxlbmd0aF07Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgdSA9IDA7IHUgPCB1c2VyRWxlbWVudHMubGVuZ3RoOyB1KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VySWQgPSB1c2VyRWxlbWVudHNbdV0uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50c1t1XSA9IGdldFVzZXIodXNlcklkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGcgPSAwOyBnIDwgZ3JvdXBFbGVtZW50cy5sZW5ndGg7IGcrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGdyb3VwSWQgPSBncm91cEVsZW1lbnRzW2ddLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudHNbdXNlckVsZW1lbnRzLmxlbmd0aCArIGddID0gZ2V0R3JvdXAoZ3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGJvZHlFbGVtZW50ID0gaGVscGVyLmdldEZpcnN0Q2hpbGQobWVzc2FnZUVsZW1lbnRzW2ldLCAiYm9keSIpOwotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGJvZHlUZXh0RWxlbWVudCA9IGhlbHBlci5nZXRGaXJzdENoaWxkKGJvZHlFbGVtZW50LCAidGV4dCIpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9keSA9IERvY3VtZW50SGVscGVyLmdldFNpbXBsZUVsZW1lbnRUZXh0KGJvZHlUZXh0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBib2R5UGFyYW1FbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbihib2R5RWxlbWVudCwgInBhcmFtIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGJvZHlQYXJhbXMgPSBuZXcgU3RyaW5nW2JvZHlQYXJhbUVsZW1lbnRzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgYm9keVBhcmFtRWxlbWVudHMubGVuZ3RoOyBwKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlQYXJhbXNbcF0gPSBEb2N1bWVudEhlbHBlci5nZXRTaW1wbGVFbGVtZW50VGV4dChib2R5UGFyYW1FbGVtZW50c1twXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHN1YmplY3RFbGVtZW50ID0gaGVscGVyLmdldEZpcnN0Q2hpbGQobWVzc2FnZUVsZW1lbnRzW2ldLCAic3ViamVjdCIpOwotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHN1YmplY3RUZXh0RWxlbWVudCA9IGhlbHBlci5nZXRGaXJzdENoaWxkKHN1YmplY3RFbGVtZW50LCAidGV4dCIpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViamVjdCA9IERvY3VtZW50SGVscGVyLmdldFNpbXBsZUVsZW1lbnRUZXh0KHN1YmplY3RUZXh0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBzdWJqZWN0UGFyYW1FbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbihzdWJqZWN0RWxlbWVudCwgInBhcmFtIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN1YmplY3RQYXJhbXMgPSBuZXcgU3RyaW5nW3N1YmplY3RQYXJhbUVsZW1lbnRzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgc3ViamVjdFBhcmFtRWxlbWVudHMubGVuZ3RoOyBwKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RQYXJhbXNbcF0gPSBEb2N1bWVudEhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2ltcGxlRWxlbWVudFRleHQoc3ViamVjdFBhcmFtRWxlbWVudHNbcF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhZFN0cmluZyA9ICJmYWxzZSI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlRWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKCJyZWFkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJpbmcgPSBtZXNzYWdlRWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJyZWFkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWFkID0gQm9vbGVhbi52YWx1ZU9mKHJlYWRTdHJpbmcpLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHN1YmplY3QsIHN1YmplY3RQYXJhbXMsIGJvZHksIGJvZHlQYXJhbXMsIHNlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgSW5ib3hNZXNzYWdlIG1zZyA9IG5ldyBYbWxTb3VyY2VJbmJveE1lc3NhZ2UodGhpcywgaWQsIG1lc3NhZ2UsIHJlYWQpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLmFkZChtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVXNlciBnZXRVc2VyKFN0cmluZyBpZCkgdGhyb3dzIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy51c2VyLmdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpLmdldFVzZXIoaWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBHcm91cCBnZXRHcm91cChTdHJpbmcgaWQpIHRocm93cyBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXNlci5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0R3JvdXBNYW5hZ2VyKCkuZ2V0R3JvdXAoaWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZVVyaTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlVXJpKCkgewotICAgICAgICBpZiAodGhpcy5zb3VyY2VVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ1VyaSA9IHRoaXMudXNlci5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbkNvbGxlY3Rpb25VcmkoKTsKLSAgICAgICAgICAgIGlmIChjb25maWdVcmkuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIGNvbmZpZ1VyaSA9IGNvbmZpZ1VyaS5zdWJzdHJpbmcoMCwgY29uZmlnVXJpLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnNvdXJjZVVyaSA9IGNvbmZpZ1VyaSArICIvaW5ib3hlcy8iICsgdGhpcy51c2VyLmdldElkKCkgKyAiLnhtbCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlVXJpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlKCkgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBsb25nIG5ld0xhc3RNb2RpZmllZCA9IFNvdXJjZVV0aWwuZ2V0TGFzdE1vZGlmaWVkKGdldFNvdXJjZVVyaSgpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICAgICAgaWYgKHRoaXMubGFzdE1vZGlmaWVkID4gLTEgJiYgbmV3TGFzdE1vZGlmaWVkID4gdGhpcy5sYXN0TW9kaWZpZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIGluYm94IGZpbGUgWyIgKyBnZXRTb3VyY2VVcmkoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBoYXMgYmVlbiBjaGFuZ2VkIGV4dGVybmFsbHkgYW5kIGNhbid0IGJlIHNhdmVkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gYnVpbGRYbWwoKTsKLSAgICAgICAgICAgIFNvdXJjZVV0aWwud3JpdGVET00oaGVscGVyLmdldERvY3VtZW50KCksIGdldFNvdXJjZVVyaSgpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICAgICAgdGhpcy5sYXN0TW9kaWZpZWQgPSBTb3VyY2VVdGlsLmdldExhc3RNb2RpZmllZChnZXRTb3VyY2VVcmkoKSwgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE5hbWVzcGFjZUhlbHBlciBidWlsZFhtbCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgTmFtZXNwYWNlSGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoTm90aWZpZXIuTkFNRVNQQUNFLCAiIiwgImluYm94Iik7Ci0KLSAgICAgICAgSW5ib3hNZXNzYWdlW10gbWVzc2FnZXMgPSBnZXRNZXNzYWdlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRWxlbWVudCBtZXNzYWdlRWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KCJtZXNzYWdlIik7Ci0gICAgICAgICAgICBoZWxwZXIuZ2V0RG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChtZXNzYWdlRWxlbWVudCk7Ci0gICAgICAgICAgICBVc2VyIHNlbmRlciA9IChVc2VyKSBtZXNzYWdlLmdldFNlbmRlcigpOwotICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJzZW5kZXIiLCBzZW5kZXIuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgcmVjaXBpZW50c0VsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgicmVjaXBpZW50cyIpOwotICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuYXBwZW5kQ2hpbGQocmVjaXBpZW50c0VsZW1lbnQpOwotCi0gICAgICAgICAgICBJZGVudGlmaWFibGVbXSByZWNpcGllbnRzID0gbWVzc2FnZS5nZXRSZWNpcGllbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHJlY2lwaWVudHMubGVuZ3RoOyByKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjaXBpZW50c1tyXSBpbnN0YW5jZW9mIFVzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB1c2VyRWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KCJ1c2VyIik7Ci0gICAgICAgICAgICAgICAgICAgIHVzZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgiaWQiLCAoKFVzZXIpIHJlY2lwaWVudHNbcl0pLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRzRWxlbWVudC5hcHBlbmRDaGlsZCh1c2VyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNpcGllbnRzW3JdIGluc3RhbmNlb2YgR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBncm91cEVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgiZ3JvdXAiKTsKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXBFbGVtZW50LnNldEF0dHJpYnV0ZSgiaWQiLCAoKEdyb3VwKSByZWNpcGllbnRzW3JdKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50c0VsZW1lbnQuYXBwZW5kQ2hpbGQoZ3JvdXBFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgc3ViamVjdEVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgic3ViamVjdCIpOwotICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc3ViamVjdEVsZW1lbnQpOwotICAgICAgICAgICAgRWxlbWVudCBzdWJqZWN0VGV4dEVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgidGV4dCIsIG1lc3NhZ2UuZ2V0U3ViamVjdCgpKTsKLSAgICAgICAgICAgIHN1YmplY3RFbGVtZW50LmFwcGVuZENoaWxkKHN1YmplY3RUZXh0RWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdWJqZWN0UGFyYW1zID0gbWVzc2FnZS5nZXRTdWJqZWN0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBzdWJqZWN0UGFyYW1zLmxlbmd0aDsgcCsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBwYXJhbUVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgicGFyYW0iLCBzdWJqZWN0UGFyYW1zW3BdKTsKLSAgICAgICAgICAgICAgICBzdWJqZWN0RWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbGVtZW50IGJvZHlFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTsKLSAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFwcGVuZENoaWxkKGJvZHlFbGVtZW50KTsKLSAgICAgICAgICAgIEVsZW1lbnQgYm9keVRleHRFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoInRleHQiLCBtZXNzYWdlLmdldEJvZHkoKSk7Ci0gICAgICAgICAgICBib2R5RWxlbWVudC5hcHBlbmRDaGlsZChib2R5VGV4dEVsZW1lbnQpOwotICAgICAgICAgICAgU3RyaW5nW10gYm9keVBhcmFtcyA9IG1lc3NhZ2UuZ2V0Qm9keVBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgYm9keVBhcmFtcy5sZW5ndGg7IHArKykgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgcGFyYW1FbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoInBhcmFtIiwgYm9keVBhcmFtc1twXSk7Ci0gICAgICAgICAgICAgICAgYm9keUVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1FbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJyZWFkIiwgQm9vbGVhbi50b1N0cmluZyhtZXNzYWdlc1tpXS5pc01hcmtlZEFzUmVhZCgpKSk7Ci0gICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImlkIiwgbWVzc2FnZXNbaV0uZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5ib3hNZXNzYWdlIGdldE1lc3NhZ2UoU3RyaW5nIGlkKSB7Ci0gICAgICAgIEluYm94TWVzc2FnZVtdIG1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2ldLmdldElkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gbWVzc2FnZSBmb3VuZCB3aXRoIElEIFsiICsgaWQgKyAiXSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L3htbC9YbWxTb3VyY2VJbmJveE1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2luYm94L3htbC9YbWxTb3VyY2VJbmJveE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiY2ExOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC94bWwvWG1sU291cmNlSW5ib3hNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5pbmJveC54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmluYm94LkFic3RyYWN0SW5ib3hNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuaW5ib3guSW5ib3g7Ci0KLS8qKgotICogWE1MLXNvdXJjZSBiYXNlZCBpbmJveCBtYW5hZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgWG1sU291cmNlSW5ib3hNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RJbmJveE1hbmFnZXIgaW1wbGVtZW50cyBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHByb3RlY3RlZCBJbmJveCBkb0dldEluYm94KFVzZXIgdXNlcikgewotICAgICAgICByZXR1cm4gbmV3IFhtbFNvdXJjZUluYm94KHRoaXMubWFuYWdlciwgdXNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC94bWwvWG1sU291cmNlSW5ib3hNZXNzYWdlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9pbmJveC94bWwvWG1sU291cmNlSW5ib3hNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjgyNjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvaW5ib3gveG1sL1htbFNvdXJjZUluYm94TWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuaW5ib3gueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5pbmJveC5BYnN0cmFjdEluYm94TWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5NZXNzYWdlOwotCi0vKioKLSAqIFhNTCBzb3VyY2UgaW5ib3ggbWVzc2FnZS4KLSAqLwotcHVibGljIGNsYXNzIFhtbFNvdXJjZUluYm94TWVzc2FnZSBleHRlbmRzIEFic3RyYWN0SW5ib3hNZXNzYWdlIHsKLQotICAgIHByaXZhdGUgWG1sU291cmNlSW5ib3ggaW5ib3g7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW5ib3ggVGhlIGluYm94IHRoaXMgbWVzc2FnZSBiZWxvbmdzIHRvLgotICAgICAqIEBwYXJhbSBpZCBUaGUgSUQuCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gd3JhcC4KLSAgICAgKiBAcGFyYW0gbWFya2VkQXNSZWFkIGlmIHRoZSBtZXNzYWdlIGlzIG1hcmtlZCBhcyByZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBYbWxTb3VyY2VJbmJveE1lc3NhZ2UoWG1sU291cmNlSW5ib3ggaW5ib3gsIFN0cmluZyBpZCwgTWVzc2FnZSBtZXNzYWdlLAotICAgICAgICAgICAgYm9vbGVhbiBtYXJrZWRBc1JlYWQpIHsKLSAgICAgICAgc3VwZXIoaWQsIG1lc3NhZ2UsIG1hcmtlZEFzUmVhZCk7Ci0gICAgICAgIHRoaXMuaW5ib3ggPSBpbmJveDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VkKCkgewotICAgICAgICB0aGlzLmluYm94LnNhdmUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9BYnN0cmFjdE5vdGlmaWVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vQWJzdHJhY3ROb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTEzODA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9BYnN0cmFjdE5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250ZXh0dWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5JMThuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aWZpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3Igbm90aWZpZXIgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vdGlmaWVyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgTm90aWZpZXIsIFNlcnZpY2VhYmxlLAotICAgICAgICBDb250ZXh0dWFsaXphYmxlIHsKLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeShNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIFNldCBub0R1cGxpY2F0ZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIElkZW50aWZpYWJsZVtdIHJlY2lwaWVudHMgPSBtZXNzYWdlLmdldFJlY2lwaWVudHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY2lwaWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChyZWNpcGllbnRzW2ldIGluc3RhbmNlb2YgR3JvdXApIHsKLSAgICAgICAgICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgcmVjaXBpZW50c1tpXTsKLSAgICAgICAgICAgICAgICBub0R1cGxpY2F0ZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ3JvdXAuZ2V0TWVtYmVycygpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5vRHVwbGljYXRlcy5hZGQocmVjaXBpZW50c1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub0R1cGxpY2F0ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlID0gKElkZW50aWZpYWJsZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaWRlbnRpZmlhYmxlIGluc3RhbmNlb2YgVXNlcikgewotICAgICAgICAgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKSBpZGVudGlmaWFibGU7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSB0cmFuc2xhdGVkTWVzc2FnZSA9IHRyYW5zbGF0ZU1lc3NhZ2UodXNlci5nZXREZWZhdWx0TWVudUxvY2FsZSgpLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBub3RpZnkodXNlciwgdHJhbnNsYXRlZE1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBub3RpZnkoVXNlciB1c2VyLCBNZXNzYWdlIHRyYW5zbGF0ZWRNZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHByb3RlY3RlZCBNZXNzYWdlIHRyYW5zbGF0ZU1lc3NhZ2UoU3RyaW5nIGxvY2FsZSwgTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihOQU1FU1BBQ0UsICJub3QiLCAibWVzc2FnZSIpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gaGVscGVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaTE4bkhlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoSTE4blRyYW5zZm9ybWVyLkkxOE5fTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgImkxOG4iLCBkb2MpOwotCi0gICAgICAgICAgICBFbGVtZW50IGRvY0VsZW1lbnQgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgc3ViamVjdEVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudCgic3ViamVjdCIpOwotICAgICAgICAgICAgZG9jRWxlbWVudC5hcHBlbmRDaGlsZChzdWJqZWN0RWxlbWVudCk7Ci0gICAgICAgICAgICBFbGVtZW50IGkxOG5UcmFuc2xhdGVTdWJqZWN0RWxlbWVudCA9IGkxOG5IZWxwZXIuY3JlYXRlRWxlbWVudCgidHJhbnNsYXRlIik7Ci0gICAgICAgICAgICBzdWJqZWN0RWxlbWVudC5hcHBlbmRDaGlsZChpMThuVHJhbnNsYXRlU3ViamVjdEVsZW1lbnQpOwotICAgICAgICAgICAgRWxlbWVudCBzdWJqZWN0STE4bkVsZW1lbnQgPSBpMThuSGVscGVyLmNyZWF0ZUVsZW1lbnQoInRleHQiLCBtZXNzYWdlLmdldFN1YmplY3QoKSk7Ci0gICAgICAgICAgICBpMThuVHJhbnNsYXRlU3ViamVjdEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3ViamVjdEkxOG5FbGVtZW50KTsKLQotICAgICAgICAgICAgU3RyaW5nW10gc3ViamVjdFBhcmFtcyA9IG1lc3NhZ2UuZ2V0U3ViamVjdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViamVjdFBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgcGFyYW1FbGVtZW50ID0gaTE4bkhlbHBlci5jcmVhdGVFbGVtZW50KCJwYXJhbSIsIHN1YmplY3RQYXJhbXNbaV0pOwotICAgICAgICAgICAgICAgIGkxOG5UcmFuc2xhdGVTdWJqZWN0RWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbGVtZW50IGJvZHlFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTsKLSAgICAgICAgICAgIGRvY0VsZW1lbnQuYXBwZW5kQ2hpbGQoYm9keUVsZW1lbnQpOwotICAgICAgICAgICAgRWxlbWVudCBpMThuVHJhbnNsYXRlRWxlbWVudCA9IGkxOG5IZWxwZXIuY3JlYXRlRWxlbWVudCgidHJhbnNsYXRlIik7Ci0gICAgICAgICAgICBib2R5RWxlbWVudC5hcHBlbmRDaGlsZChpMThuVHJhbnNsYXRlRWxlbWVudCk7Ci0gICAgICAgICAgICBFbGVtZW50IGJvZHlJMThuRWxlbWVudCA9IGkxOG5IZWxwZXIuY3JlYXRlRWxlbWVudCgidGV4dCIsIG1lc3NhZ2UuZ2V0Qm9keSgpKTsKLSAgICAgICAgICAgIGkxOG5UcmFuc2xhdGVFbGVtZW50LmFwcGVuZENoaWxkKGJvZHlJMThuRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIG1zZ1BhcmFtcyA9IG1lc3NhZ2UuZ2V0Qm9keVBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXNnUGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBwYXJhbUVsZW1lbnQgPSBpMThuSGVscGVyLmNyZWF0ZUVsZW1lbnQoInBhcmFtIiwgbXNnUGFyYW1zW2ldKTsKLSAgICAgICAgICAgICAgICBpMThuVHJhbnNsYXRlRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSB0aGlzLnJlcXVlc3QuZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoIm5vdGlmaWNhdGlvbi5kb20iLCBkb2MpOwotCi0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkoImNvY29vbjovL21vZHVsZXMvbm90aWZpY2F0aW9uL21lc3NhZ2UvIiArIGxvY2FsZSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQoc291cmNlLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoTkFNRVNQQUNFLCAibm90IiwgZG9jKTsKLQotICAgICAgICAgICAgICAgIHN1YmplY3RFbGVtZW50ID0gaGVscGVyLmdldEZpcnN0Q2hpbGQoZG9jLmdldERvY3VtZW50RWxlbWVudCgpLCAic3ViamVjdCIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdWJqZWN0ID0gRG9jdW1lbnRIZWxwZXIuZ2V0U2ltcGxlRWxlbWVudFRleHQoc3ViamVjdEVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgYm9keUVsZW1lbnQgPSBoZWxwZXIuZ2V0Rmlyc3RDaGlsZChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksICJib2R5Iik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJvZHkgPSBEb2N1bWVudEhlbHBlci5nZXRTaW1wbGVFbGVtZW50VGV4dChib2R5RWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2Uoc3ViamVjdCwgbmV3IFN0cmluZ1swXSwgYm9keSwgbmV3IFN0cmluZ1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0U2VuZGVyKCksIG1lc3NhZ2UuZ2V0UmVjaXBpZW50cygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGluIHRoZSB0ZXN0Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiY29jb29uIHByb3RvY29sIG5vdCBhdmFpbGFibGUsIG5vdCB0cmFuc2xhdGluZyBtZXNzYWdlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXF1ZXN0IHJlcXVlc3Q7Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0dWFsaXplKENvbnRleHQgY29udGV4dCkgdGhyb3dzIENvbnRleHRFeGNlcHRpb24gewotICAgICAgICB0aGlzLnJlcXVlc3QgPSBDb250ZXh0SGVscGVyLmdldFJlcXVlc3QoY29udGV4dCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vRW1haWxOb3RpZmllci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvbm90aWZpY2F0aW9uL0VtYWlsTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4YTMzMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vRW1haWxOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uOwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5BZGRyZXNzRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLm1haWwuTWFpbFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aWZpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5pbmJveC5JbmJveE5vdGlmaWVyOwotCi0vKioKLSAqIERlZmF1bHQgbm90aWZpZXIgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWFpbE5vdGlmaWVyIGV4dGVuZHMgSW5ib3hOb3RpZmllciBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnkoVXNlciByZWNpcGllbnQsIE1lc3NhZ2UgdHJhbnNsYXRlZE1lc3NhZ2UpIHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgc3VwZXIubm90aWZ5KHJlY2lwaWVudCwgdHJhbnNsYXRlZE1lc3NhZ2UpOwotICAgICAgICAKLSAgICAgICAgaWYgKCF0aGlzLm1hbmFnZXIuaGFzU2VydmljZShNYWlsU2VuZGVyLlJPTEUpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiQ2FuJ3Qgc2VuZCBtYWlscyAtIG5vIE1haWxTZW5kZXIgc2VydmljZSBmb3VuZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElkZW50aWZpYWJsZSBzZW5kZXIgPSB0cmFuc2xhdGVkTWVzc2FnZS5nZXRTZW5kZXIoKTsKLSAgICAgICAgTWFpbFNlbmRlciBtYWlsZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFpbGVyID0gKE1haWxTZW5kZXIpIHRoaXMubWFuYWdlci5sb29rdXAoTWFpbFNlbmRlci5ST0xFKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnVzZXJuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYWlsZXIuc2V0U210cEhvc3QodGhpcy5zbXRwSG9zdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1haWxlci5zZXRTbXRwSG9zdCh0aGlzLnNtdHBIb3N0LCB0aGlzLnVzZXJuYW1lLCB0aGlzLnBhc3N3b3JkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWFpbGVyLnNldFRvKHJlY2lwaWVudC5nZXRFbWFpbCgpKTsKLSAgICAgICAgICAgIGlmIChzZW5kZXIgaW5zdGFuY2VvZiBVc2VyKSB7Ci0gICAgICAgICAgICAgICAgbWFpbGVyLnNldEZyb20oKChVc2VyKSBzZW5kZXIpLmdldEVtYWlsKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYWlsZXIuc2V0U3ViamVjdCh0cmFuc2xhdGVkTWVzc2FnZS5nZXRTdWJqZWN0KCkpOwotICAgICAgICAgICAgbWFpbGVyLnNldEJvZHkodHJhbnNsYXRlZE1lc3NhZ2UuZ2V0Qm9keSgpLCAidGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCIpOwotICAgICAgICAgICAgbWFpbGVyLnNlbmQoKTsKLSAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEFkZHJlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIlNlbmRpbmcgbWFpbCBmYWlsZWQgKGFkZHJlc3MgZXJyb3IpOiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiU2VuZGluZyBtYWlsIGZhaWxlZCAobWFpbCBlcnJvcik6ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG1haWxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UobWFpbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNtdHBIb3N0OwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOwotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gc210cCA9IGNvbmZpZy5nZXRDaGlsZCgic210cCIpOwotICAgICAgICB0aGlzLnNtdHBIb3N0ID0gc210cC5nZXRBdHRyaWJ1dGUoImhvc3QiKTsKLSAgICAgICAgdGhpcy51c2VybmFtZSA9IHNtdHAuZ2V0QXR0cmlidXRlKCJ1c2VybmFtZSIsIG51bGwpOwotICAgICAgICBpZiAodGhpcy51c2VybmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gc210cC5nZXRBdHRyaWJ1dGUoInBhc3N3b3JkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9NZXNzYWdlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTQ3NzFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpZmlhYmxlOwotCi0vKioKLSAqIEEgbm90aWZpY2F0aW9uIG1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHN1YmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzdWJqZWN0UGFyYW1zOwotICAgIHByaXZhdGUgU3RyaW5nIGJvZHk7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBib2R5UGFyYW1zOwotICAgIHByaXZhdGUgSWRlbnRpZmlhYmxlIHNlbmRlcjsKLSAgICBwcml2YXRlIElkZW50aWZpYWJsZVtdIHJlY2lwaWVudHM7Ci0gICAgcHJpdmF0ZSBEYXRlIHRpbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBzdWJqZWN0IFRoZSBzdWJqZWN0LgotICAgICAqIEBwYXJhbSBzdWJqZWN0UGFyYW1zIFRoZSBzdWJqZWN0IHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIGJvZHkgVGhlIGJvZHkuCi0gICAgICogQHBhcmFtIGJvZHlQYXJhbXMgVGhlIGJvZHkgcGFyYW1ldGVycy4KLSAgICAgKiBAcGFyYW0gc2VuZGVyIFRoZSBzZW5kZXIuCi0gICAgICogQHBhcmFtIHJlY2lwaWVudHMgVGhlIHJlY2lwaWVudHMuCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UoU3RyaW5nIHN1YmplY3QsIFN0cmluZ1tdIHN1YmplY3RQYXJhbXMsIFN0cmluZyBib2R5LCBTdHJpbmdbXSBib2R5UGFyYW1zLAotICAgICAgICAgICAgSWRlbnRpZmlhYmxlIHNlbmRlciwgSWRlbnRpZmlhYmxlW10gcmVjaXBpZW50cykgewotICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwotICAgICAgICB0aGlzLnN1YmplY3RQYXJhbXMgPSBzdWJqZWN0UGFyYW1zOwotICAgICAgICB0aGlzLmJvZHkgPSBib2R5OwotICAgICAgICB0aGlzLmJvZHlQYXJhbXMgPSBib2R5UGFyYW1zOwotICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICAgICAgdGhpcy5yZWNpcGllbnRzID0gcmVjaXBpZW50czsKLSAgICAgICAgdGhpcy50aW1lID0gbmV3IERhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhpcyBtZXNzYWdlIGhhcyBwYXJhbWV0ZXJzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGhhcyBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQm9keVBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBib2R5UGFyYW1zICE9IG51bGwgJiYgYm9keVBhcmFtcy5sZW5ndGggPiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBtZXNzYWdlIGNvbnRlbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCb2R5KCkgewotICAgICAgICByZXR1cm4gYm9keTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBtZXNzYWdlCi0gICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRCb2R5UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIGJvZHlQYXJhbXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoaXMgbWVzc2FnZSBoYXMgcGFyYW1ldGVycwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBoYXMgcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1N1YmplY3RQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gc3ViamVjdFBhcmFtcyAhPSBudWxsICYmIHN1YmplY3RQYXJhbXMubGVuZ3RoID4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgbWVzc2FnZSBzdWJqZWN0Ci0gICAgICogQHJldHVybiB0aGUgc3ViamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHN1YmplY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgbWVzc2FnZQotICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3ViamVjdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBzdWJqZWN0UGFyYW1zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzZW5kZXIuCi0gICAgICovCi0gICAgcHVibGljIElkZW50aWZpYWJsZSBnZXRTZW5kZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlbmRlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcmVjaXBpZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSWRlbnRpZmlhYmxlW10gZ2V0UmVjaXBpZW50cygpIHsKLSAgICAgICAgLy8gZG9uJ3QgZXhwb3NlIHRoZSBpbnRlcm5hbCBhcnJheQotICAgICAgICByZXR1cm4gKElkZW50aWZpYWJsZVtdKSBBcnJheXMuYXNMaXN0KHRoaXMucmVjaXBpZW50cykudG9BcnJheSgKLSAgICAgICAgICAgICAgICBuZXcgSWRlbnRpZmlhYmxlW3RoaXMucmVjaXBpZW50cy5sZW5ndGhdKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgdGltZSB3aGVuIHRoZSBtZXNzYWdlIHdhcyBzZW50LgotICAgICAqLwotICAgIHB1YmxpYyBEYXRlIGdldFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRGF0ZSl0aGlzLnRpbWUuY2xvbmUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FdmVudERlc2NyaXB0b3IuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FdmVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4ZDM0NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uRXZlbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIERlc2NyaXB0b3IgZm9yIG5vdGlmaWNhdGlvbiBldmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25FdmVudERlc2NyaXB0b3IgewotCi0gICAgcHJpdmF0ZSBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIE5vdGlmaWNhdGlvbkV2ZW50RGVzY3JpcHRvcihNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoIm1lc3NhZ2UiLCBtZXNzYWdlKTsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4Zjc2ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb247Ci0KLS8qKgotICogTm90aWZpY2F0aW9uIGV4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvLWdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDM1NDQ3ODMxODk3MDk5MjU1N0w7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBOb3RpZmljYXRpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgY2F1c2UuCi0gICAgICovCi0gICAgcHVibGljIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLSAgICAgICAgc3VwZXIoYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm90aWZpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIGFyZzAgVGhlIGNhdXNlLgotICAgICAqLwotICAgIHB1YmxpYyBOb3RpZmljYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uTGlzdGVuZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDRmNWI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uQWJzdHJhY3RSZXBvc2l0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uUmVwb3NpdG9yeUV2ZW50OwotCi0vKioKLSAqIFJlcG9zaXRvcnkgbGlzdGVuZXIgdG8gZGlzdHJpYnV0ZSBub3RpZmljYXRpb24gZXZlbnRzLgotICovCi1wdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFJlcG9zaXRvcnlMaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBldmVudEZpcmVkKFJlcG9zaXRvcnlFdmVudCBldmVudCkgewotCi0gICAgICAgIGlmICghKGV2ZW50LmdldERlc2NyaXB0b3IoKSBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbkV2ZW50RGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE5vdGlmaWNhdGlvbkV2ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKE5vdGlmaWNhdGlvbkV2ZW50RGVzY3JpcHRvcikgZXZlbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGRlc2NyaXB0b3IuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgIE5vdGlmaWVyIG5vdGlmaWVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5vdGlmaWVyID0gKE5vdGlmaWVyKSB0aGlzLm1hbmFnZXIubG9va3VwKE5vdGlmaWVyLlJPTEUpOwotICAgICAgICAgICAgbm90aWZpZXIubm90aWZ5KG1lc3NhZ2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobm90aWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKG5vdGlmaWVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uVXRpbC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3ODFmNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLQotLyoqCi0gKiBOb3RpZmljYXRpb24gdXRpbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vdGlmaWNhdGlvblV0aWwgewotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyBhIG5vdGlmaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgbm90aWZ5KFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIE1lc3NhZ2UgbWVzc2FnZSkKLSAgICAgICAgICAgIHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIE5vdGlmaWVyIG5vdGlmaWVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5vdGlmaWVyID0gKE5vdGlmaWVyKSBtYW5hZ2VyLmxvb2t1cChOb3RpZmllci5ST0xFKTsKLSAgICAgICAgICAgIG5vdGlmaWVyLm5vdGlmeShtZXNzYWdlKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG5vdGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbGVhc2Uobm90aWZpZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vTm90aWZpZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQ1ZWM0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubm90aWZpY2F0aW9uOwotCi0vKioKLSAqIE5vdGlmaWNhdGlvbiBzZXJ2aWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vdGlmaWVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBub3RpZmljYXRpb24gbmFtZXNwYWNlLgotICAgICAqLwotICAgIFN0cmluZyBOQU1FU1BBQ0UgPSAiaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbm90aWZpY2F0aW9uLzIuMCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSByb2xlLgotICAgICAqLwotICAgIFN0cmluZyBST0xFID0gTm90aWZpZXIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNlbmQgYSBub3RpZmljYXRpb24uCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCi0gICAgICogQHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5KE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbjsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9pbmJveC9JbmJveFRlc3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9pbmJveC9JbmJveFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkNmEyZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvaW5ib3gvSW5ib3hUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5pbmJveDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpZmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmluYm94LnhtbC5YbWxTb3VyY2VJbmJveDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbi5BYnN0cmFjdE5vdGlmaWNhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb24uTWVzc2FnZTsKLQotLyoqCi0gKiBJbmJveCB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgSW5ib3hUZXN0IGV4dGVuZHMgQWJzdHJhY3ROb3RpZmljYXRpb25UZXN0IHsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJKRUNUID0gImhlbGxvIjsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXN0LgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5ib3goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFVzZXIgbGVueWEgPSBnZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCkuZ2V0VXNlck1hbmFnZXIoKS5nZXRVc2VyKCJsZW55YSIpOwotICAgICAgICBJbmJveCBpbmJveCA9IGdldEluYm94KGxlbnlhKTsKLSAgICAgICAgCi0gICAgICAgIGNsZWFuVXAoaW5ib3gsIFNVQkpFQ1QpOwotICAgICAgICBhc3NlcnRGYWxzZShjb250YWluc01lc3NhZ2UoaW5ib3gsIFNVQkpFQ1QpKTsKLSAgICAgICAgCi0gICAgICAgIElkZW50aWZpYWJsZVtdIHJlY2lwaWVudHMgPSB7IGxlbnlhIH07Ci0KLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoU1VCSkVDVCwgbmV3IFN0cmluZ1swXSwgImJvZHkiLCBuZXcgU3RyaW5nWzBdLCBsZW55YSwKLSAgICAgICAgICAgICAgICByZWNpcGllbnRzKTsKLSAgICAgICAgSW5ib3hNZXNzYWdlIGluYm94TWVzc2FnZSA9IGluYm94LmFkZChtZXNzYWdlKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhpbmJveE1lc3NhZ2UuZ2V0TWVzc2FnZSgpLmdldFN1YmplY3QoKSwgU1VCSkVDVCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZShpbmJveE1lc3NhZ2UuaXNNYXJrZWRBc1JlYWQoKSk7Ci0gICAgICAgIGluYm94TWVzc2FnZS5tYXJrQXNSZWFkKHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGluYm94TWVzc2FnZS5pc01hcmtlZEFzUmVhZCgpKTsKLSAgICAgICAgCi0gICAgICAgIFhtbFNvdXJjZUluYm94IHhtbEluYm94ID0gbmV3IFhtbFNvdXJjZUluYm94KGdldE1hbmFnZXIoKSwgbGVueWEpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zTWVzc2FnZSh4bWxJbmJveCwgU1VCSkVDVCkpOwotICAgICAgICAKLSAgICAgICAgSW5ib3hNZXNzYWdlIHhtbE1lc3NhZ2UgPSBnZXRNZXNzYWdlKHhtbEluYm94LCBTVUJKRUNUKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWxNZXNzYWdlLmlzTWFya2VkQXNSZWFkKCkpOwotICAgICAgICAKLSAgICAgICAgY2xlYW5VcChpbmJveCwgU1VCSkVDVCk7Ci0gICAgICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9BYnN0cmFjdE5vdGlmaWNhdGlvblRlc3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vQWJzdHJhY3ROb3RpZmljYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MmE3ODQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9BYnN0cmFjdE5vdGlmaWNhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLm5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmluYm94LkluYm94OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuaW5ib3guSW5ib3hNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuaW5ib3guSW5ib3hNZXNzYWdlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG5vdGlmaWNhdGlvbiB0ZXN0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm90aWZpY2F0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotCi0gICAgcHJvdGVjdGVkIEluYm94IGdldEluYm94KFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEluYm94TWFuYWdlciBpbmJveE1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5ib3hNYW5hZ2VyID0gKEluYm94TWFuYWdlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChJbmJveE1hbmFnZXIuUk9MRSk7Ci0gICAgICAgICAgICByZXR1cm4gaW5ib3hNYW5hZ2VyLmdldEluYm94KHVzZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGluYm94TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbGVhc2UoaW5ib3hNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zTWVzc2FnZShJbmJveCBpbmJveCwgU3RyaW5nIHN1YmplY3QpIHsKLSAgICAgICAgSW5ib3hNZXNzYWdlW10gbWVzc2FnZXMgPSBpbmJveC5nZXRNZXNzYWdlcygpOwotICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0uZ2V0TWVzc2FnZSgpLmdldFN1YmplY3QoKS5lcXVhbHMoc3ViamVjdCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJbmJveE1lc3NhZ2UgZ2V0TWVzc2FnZShJbmJveCBpbmJveCwgU3RyaW5nIHN1YmplY3QpIHsKLSAgICAgICAgSW5ib3hNZXNzYWdlW10gbWVzc2FnZXMgPSBpbmJveC5nZXRNZXNzYWdlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZXNbaV0uZ2V0TWVzc2FnZSgpLmdldFN1YmplY3QoKS5lcXVhbHMoc3ViamVjdCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZXNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoSW5ib3ggaW5ib3gsIFN0cmluZyBzdWJqZWN0KSB7Ci0gICAgICAgIEluYm94TWVzc2FnZVtdIG1lc3NhZ2VzID0gaW5ib3guZ2V0TWVzc2FnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2ldLmdldE1lc3NhZ2UoKS5nZXRTdWJqZWN0KCkuZXF1YWxzKHN1YmplY3QpKSB7Ci0gICAgICAgICAgICAgICAgaW5ib3gucmVtb3ZlKG1lc3NhZ2VzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTIwODUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5ub3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aWZpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMub2JzZXJ2YXRpb24uUmVwb3NpdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLlJlcG9zaXRvcnlFdmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuaW5ib3guSW5ib3g7Ci0KLS8qKgotICogTm90aWZpY2F0aW9uIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3ROb3RpZmljYXRpb25UZXN0IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQkpFQ1QgPSAiaGVsbG8iOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRlc3QuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZpY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbG9naW4oImxlbnlhIik7Ci0KLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RmFjdG9yeSgpLmdldFNlc3Npb24oKTsKLQotICAgICAgICBVc2VyIGxlbnlhID0gZ2V0QWNjcmVkaXRhYmxlTWFuYWdlcigpLmdldFVzZXJNYW5hZ2VyKCkuZ2V0VXNlcigibGVueWEiKTsKLSAgICAgICAgVXNlciBhbGljZSA9IGdldEFjY3JlZGl0YWJsZU1hbmFnZXIoKS5nZXRVc2VyTWFuYWdlcigpLmdldFVzZXIoImFsaWNlIik7Ci0KLSAgICAgICAgSWRlbnRpZmlhYmxlW10gcmVjaXBpZW50cyA9IHsgYWxpY2UgfTsKLQotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShTVUJKRUNULCBuZXcgU3RyaW5nWzBdLCAiYm9keSIsIG5ldyBTdHJpbmdbMF0sIGxlbnlhLAotICAgICAgICAgICAgICAgIHJlY2lwaWVudHMpOwotICAgICAgICBOb3RpZmljYXRpb25FdmVudERlc2NyaXB0b3IgZGVzY3IgPSBuZXcgTm90aWZpY2F0aW9uRXZlbnREZXNjcmlwdG9yKG1lc3NhZ2UpOwotICAgICAgICBSZXBvc2l0b3J5RXZlbnQgZXZlbnQgPSBSZXBvc2l0b3J5RXZlbnRGYWN0b3J5LmNyZWF0ZUV2ZW50KGdldE1hbmFnZXIoKSwgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSwgZGVzY3IpOwotCi0gICAgICAgIHNlc3Npb24uZW5xdWV1ZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgCi0gICAgICAgIEluYm94IGluYm94ID0gZ2V0SW5ib3goYWxpY2UpOwotICAgICAgICBjbGVhblVwKGluYm94LCBTVUJKRUNUKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKGNvbnRhaW5zTWVzc2FnZShpbmJveCwgU1VCSkVDVCkpOwotICAgICAgICBzZXNzaW9uLmNvbW1pdCgpOwotICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluc01lc3NhZ2UoaW5ib3gsIFNVQkpFQ1QpKTsKLSAgICAgICAgCi0gICAgICAgIGNsZWFuVXAoaW5ib3gsIFNVQkpFQ1QpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3ZmY4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDczOTUgMjAwNi0wOS0xOCAxMzowMTozM1ogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotICANCi0gIDxtZXNzYWdlIGtleT0iaW5ib3gtb2YiPkluYm94IG9mIFVzZXIgezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNlbmRlciI+U2VuZGVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5ldy1tZXNzYWdlIj5OZXcgTWVzc2FnZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGcm9tIj5Gcm9tPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRvIj5UbzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNZXNzYWdlIj5NZXNzYWdlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1lc3NhZ2VzIj5NZXNzYWdlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTZW5kIj5TZW5kPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InNlbGVjdGVkLW1lc3NhZ2UiPlNlbGVjdGVkJiMxNjA7bWVzc2FnZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ1bnJlYWQtbWVzc2FnZXMiPnswfSBuZXcgbWVzc2FnZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idW5yZWFkLW1lc3NhZ2UiPjEgbmV3IG1lc3NhZ2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVhZCI+UmVhZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbmJveCI+SW5ib3g8L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTIyOTU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NzM5NSAyMDA2LTA5LTE4IDEzOjAxOjMzWiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0gIA0KLSAgPG1lc3NhZ2Uga2V5PSJpbmJveC1vZiI+UG9zdGVpbmdhbmcgdm9uIE51dHplciB7MH08L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlNlbmRlciI+QWJzZW5kZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibmV3LW1lc3NhZ2UiPk5ldWUgTmFjaHJpY2h0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkZyb20iPlZvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUbyI+QW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTWVzc2FnZSI+TmFjaHJpY2h0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1lc3NhZ2VzIj5OYWNocmljaHRlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTZW5kIj5TZW5kZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic2VsZWN0ZWQtbWVzc2FnZSI+QXVzZ2V3w6RobHRlJiMxNjA7TmFjaHJpY2h0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVucmVhZC1tZXNzYWdlcyI+ezB9IG5ldWUgTmFjaHJpY2h0ZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idW5yZWFkLW1lc3NhZ2UiPjEgbmV1ZSBOYWNocmljaHQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVhZCI+R2VsZXNlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbmJveCI+UG9zdGVpbmdhbmc8L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9zaXRlbWFwLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODgxNzM5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9zaXRlbWFwLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ibWVzc2FnZS8qIj4KLSAgICAgIAotICAgICAgPCEtLQotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL25vdGlmaWNhdGlvbi9jb250ZW50L21lc3NhZ2UueG1sIi8+Ci0gICAgICAgIC0tPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlc3Npb24tYXR0ciI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXR0ci1uYW1lIiB2YWx1ZT0ibm90aWZpY2F0aW9uLmRvbSIvPgotICAgICAgICA8L21hcDpnZW5lcmF0ZT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICAgIAotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vdGVzdC9jYW5vby90ZXN0LnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi90ZXN0L2Nhbm9vL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmE5ZDdhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi90ZXN0L2Nhbm9vL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCFET0NUWVBFIHByb2plY3QgU1lTVEVNICIuLi8uLi8uLi8uLi9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vbGVueWFfd2VidGVzdC5kdGQiPgotCi08cHJvamVjdCBuYW1lPSJOb3RpZmljYXRpb24gdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+Ci0gIAotICA8aW1wb3J0IGZpbGU9Ii4uLy4uLy4uLy4uL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby9tYWNyb3MueG1sIi8+Ci0gIAotICA8dGFyZ2V0IG5hbWU9Im1haW4iPgotICAgIDx3ZWJ0ZXN0IG5hbWU9Im5vdGlmaWNhdGlvbiI+Ci0gICAgICAmZG9Db25maWc7Ci0gICAgICA8c3RlcHM+Ci0gICAgICAgIDxkb0xvZ2luIHVzZXJuYW1lPSJsZW55YSIgcGFzc3dvcmQ9ImxldmkiLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gaW5ib3ggdXNlY2FzZSAtLT4KLSAgICAgICAgPGludm9rZSB1cmw9ImluZGV4Lmh0bWw/bGVueWEudXNlY2FzZT1ub3RpZmljYXRpb24uaW5ib3giLz4KLSAgICAgICAgPHZlcmlmeUVsZW1lbnRUZXh0IHR5cGU9ImgxIiB0ZXh0PSJJbmJveCBvZiBVc2VyIGxlbnlhIi8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIHNlbmQgbWVzc2FnZSAtLT4KLSAgICAgICAgPGludm9rZSB1cmw9ImluZGV4Lmh0bWw/bGVueWEudXNlY2FzZT1ub3RpZmljYXRpb24uc2VuZE1lc3NhZ2UiLz4KLSAgICAgICAgPHZlcmlmeUVsZW1lbnRUZXh0IHR5cGU9ImgxIiB0ZXh0PSJOZXcgTWVzc2FnZSIvPgotICAgICAgICA8c2V0U2VsZWN0RmllbGQgbmFtZT0icmVjaXBpZW50IiB2YWx1ZT0ibGVueWEiLz4KLSAgICAgICAgPHNldElucHV0RmllbGQgbmFtZT0ic3ViamVjdCIgdmFsdWU9Ik5vdGlmaWNhdGlvblRlc3RTdWJqZWN0Ii8+Ci0gICAgICAgIDxzZXRJbnB1dEZpZWxkIG5hbWU9ImJvZHkiIHZhbHVlPSJOb3RpZmljYXRpb25UZXN0Qm9keSIvPgotICAgICAgICA8Y2xpY2tCdXR0b24gbmFtZT0ic3VibWl0Ii8+Ci0gICAgICAgIDx2ZXJpZnlFbGVtZW50VGV4dCB0eXBlPSJoMSIgdGV4dD0iSW5ib3ggb2YgVXNlciBsZW55YSIvPgotICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJOb3RpZmljYXRpb25UZXN0U3ViamVjdCIvPgotICAgICAgICAKLSAgICAgICAgPCEtLSByZWFkIG1lc3NhZ2UgLS0+Ci0gICAgICAgIDxjbGlja0xpbmsgeHBhdGg9Ii8vYVtub3JtYWxpemUtc3BhY2UoLikgPSAnTm90aWZpY2F0aW9uVGVzdFN1YmplY3QnXSIvPgotICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJTZWxlY3RlZCIvPgotICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJOb3RpZmljYXRpb25UZXN0Qm9keSIvPgotCi0gICAgICAgIDwhLS0gZGVsZXRlIG1lc3NhZ2UgLS0+ICAgICAgICAKLSAgICAgICAgPGNsaWNrQnV0dG9uIG5hbWU9InN1Ym1pdCIvPgotICAgICAgICA8dmVyaWZ5RWxlbWVudFRleHQgdHlwZT0iaDEiIHRleHQ9IkluYm94IG9mIFVzZXIgbGVueWEiLz4KLSAgICAgICAgPG5vdD4KLSAgICAgICAgICA8dmVyaWZ5VGV4dCB0ZXh0PSJOb3RpZmljYXRpb25UZXN0U3ViamVjdCIvPgotICAgICAgICA8L25vdD4KLQotICAgICAgIDxkb0xvZ291dC8+Ci0gICAgICA8L3N0ZXBzPgotICAgIDwvd2VidGVzdD4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvY3VycmVudE1lc3NhZ2UuanggYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvY3VycmVudE1lc3NhZ2UuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDc2OWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL3VzZWNhc2VzL2N1cnJlbnRNZXNzYWdlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiBncm91cHMuanggNDczODYxIDIwMDYtMTEtMTIgMDM6NTE6MTRaIGdyZWdvciAkIC0tPgotCi08ang6dGVtcGxhdGUKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPGp4OmlmIHRlc3Q9IiR7dXNlY2FzZS5nZXROYW1lKCkuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG1lc3NhZ2VJZCl9Ij4KLSAgICA8ang6c2V0IHZhcj0ibWVzc2FnZSIgdmFsdWU9IiR7aW5ib3guZ2V0TWVzc2FnZShtZXNzYWdlSWQpfSIvPgotICAgIAotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCIgc3R5bGU9IndpZHRoOiAxMDAlIj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+PGkxOG46dGV4dD5zZWxlY3RlZC1tZXNzYWdlPC9pMThuOnRleHQ+PC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGkxOG46dGV4dD5Gcm9tPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICA8dGQgc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXAiPgotICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke21lc3NhZ2UuZ2V0TWVzc2FnZSgpLmdldFNlbmRlcigpLmdldE5hbWUoKX0iLz4KLSAgICAgICAgICAgICAgKDxhIGhyZWY9Ij9sZW55YS51c2VjYXNlPWFkbWluLnVzZXImYW1wO3VzZXJJZD0ke21lc3NhZ2UuZ2V0TWVzc2FnZSgpLmdldFNlbmRlcigpLmdldElkKCl9Ij48ang6b3V0IHZhbHVlPSIke21lc3NhZ2UuZ2V0TWVzc2FnZSgpLmdldFNlbmRlcigpLmdldElkKCl9Ii8+PC9hPikKLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+U3ViamVjdDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgPGkxOG46dGV4dD48ang6b3V0IHZhbHVlPSIke21lc3NhZ2UuZ2V0TWVzc2FnZSgpLmdldFN1YmplY3QoKX0iLz48L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InBhcmFtIiBpdGVtcz0iJHttZXNzYWdlLmdldE1lc3NhZ2UoKS5nZXRTdWJqZWN0UGFyYW1ldGVycygpfSI+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke3BhcmFtfSIvPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIiB2YWxpZ249InRvcCI+PGkxOG46dGV4dD5NZXNzYWdlPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PjxqeDpvdXQgdmFsdWU9IiR7bWVzc2FnZS5nZXRNZXNzYWdlKCkuZ2V0Qm9keSgpfSIvPjwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0icGFyYW0iIGl0ZW1zPSIke21lc3NhZ2UuZ2V0TWVzc2FnZSgpLmdldEJvZHlQYXJhbWV0ZXJzKCl9Ij4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnBhcmFtPjxqeDpvdXQgdmFsdWU9IiR7cGFyYW19Ii8+PC9pMThuOnBhcmFtPgotICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImRlbGV0ZU1lc3NhZ2VJZCIgdmFsdWU9IiR7bWVzc2FnZUlkfSIvPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkRlbGV0ZSIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgICAKLSAgPC9qeDppZj4KLSAgCi08L2p4OnRlbXBsYXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi91c2VjYXNlcy9pbmJveC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi91c2VjYXNlcy9pbmJveC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0M2ExYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvaW5ib3guangKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IGdyb3Vwcy5qeCA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICAgIDxoMT4KLSAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgIDxpMThuOnRleHQ+aW5ib3gtb2Y8L2kxOG46dGV4dD4KLSAgICAgICAgICA8aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1c2VyJyl9Ii8+PC9pMThuOnBhcmFtPgotICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgPC9oMT4KLSAgICAgIAotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICAKLSAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHg7Ij4KLSAgICAgICAgPGEgaHJlZj0iP2xlbnlhLnVzZWNhc2U9bm90aWZpY2F0aW9uLnNlbmRNZXNzYWdlIj48aTE4bjp0ZXh0Pm5ldy1tZXNzYWdlPC9pMThuOnRleHQ+PC9hPgotICAgICAgPC9kaXY+Ci0gICAgICAKLSAgICAgIDxqeDpzZXQgdmFyPSJpbmJveCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2luYm94Jyl9Ii8+Ci0gICAgICA8ang6c2V0IHZhcj0ibWVzc2FnZUlkIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbWVzc2FnZUlkJyl9Ii8+Ci0gICAgICAKLSAgICAgIDx0YWJsZT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgc3R5bGU9InBhZGRpbmc6IDBweDsgcGFkZGluZy1yaWdodDogMjBweDsiPgotICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvbWVzc2FnZUxpc3QuangiLz4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgc3R5bGU9InBhZGRpbmc6IDBweDsgcGFkZGluZy1sZWZ0OiAyMHB4OyI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL25vdGlmaWNhdGlvbi91c2VjYXNlcy9jdXJyZW50TWVzc2FnZS5qeCIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgICAgICAgICAgCi0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL3VzZWNhc2VzL21lc3NhZ2VMaXN0Lmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL3VzZWNhc2VzL21lc3NhZ2VMaXN0Lmp4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTBmZWE5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi91c2VjYXNlcy9tZXNzYWdlTGlzdC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogZ3JvdXBzLmp4IDQ3Mzg2MSAyMDA2LTExLTEyIDAzOjUxOjE0WiBncmVnb3IgJCAtLT4KLQotPGp4OnRlbXBsYXRlCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbGlzdCI+Ci0gICAgPHRyPgotICAgICAgPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nLXJpZ2h0OiAyMHB4OyI+PGkxOG46dGV4dD5TdWJqZWN0PC9pMThuOnRleHQ+PC90aD4KLSAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZy1yaWdodDogMjBweDsiPjxpMThuOnRleHQ+U2VuZGVyPC9pMThuOnRleHQ+PC90aD4KLSAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZy1yaWdodDogMjBweDsiPjxpMThuOnRleHQ+RGF0ZTwvaTE4bjp0ZXh0PjwvdGg+Ci0gICAgICA8dGggc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmctcmlnaHQ6IDIwcHg7Ij48aTE4bjp0ZXh0PlJlYWQ8L2kxOG46dGV4dD48L3RoPgotICAgICAgPHRoPiYjMTYwOzwvdGg+Ci0gICAgPC90cj4KLSAgICA8ang6Zm9yRWFjaCB2YXI9Im1lc3NhZ2UiIGl0ZW1zPSIke2luYm94LmdldE1lc3NhZ2VzKCl9Ij4KLSAgICAgIAotICAgICAgPGp4OnNldCB2YXI9ImNsYXNzIiB2YWx1ZT0ibm9ybWFsIi8+Ci0gICAgICA8ang6aWYgdGVzdD0iJHttZXNzYWdlSWQuZXF1YWxzKG1lc3NhZ2UuZ2V0SWQoKSl9Ij4KLSAgICAgICAgPGp4OnNldCB2YXI9ImNsYXNzIiB2YWx1ZT0iaGlnaGxpZ2h0Ii8+Ci0gICAgICA8L2p4OmlmPgotICAgICAgCi0gICAgICA8dHIgY2xhc3M9IiR7Y2xhc3N9Ij4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxhIGhyZWY9Ij9sZW55YS51c2VjYXNlPW5vdGlmaWNhdGlvbi5pbmJveCZhbXA7bWVzc2FnZUlkPSR7bWVzc2FnZS5nZXRJZCgpfSI+Ci0gICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+PGp4Om91dCB2YWx1ZT0iJHttZXNzYWdlLmdldE1lc3NhZ2UoKS5nZXRTdWJqZWN0KCl9Ii8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0icGFyYW0iIGl0ZW1zPSIke21lc3NhZ2UuZ2V0TWVzc2FnZSgpLmdldFN1YmplY3RQYXJhbWV0ZXJzKCl9Ij4KLSAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48ang6b3V0IHZhbHVlPSIke3BhcmFtfSIvPjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8YSBocmVmPSI/bGVueWEudXNlY2FzZT1hZG1pbi51c2VyJmFtcDt1c2VySWQ9JHttZXNzYWdlLmdldE1lc3NhZ2UoKS5nZXRTZW5kZXIoKS5nZXRJZCgpfSI+PGp4Om91dCB2YWx1ZT0iJHttZXNzYWdlLmdldE1lc3NhZ2UoKS5nZXRTZW5kZXIoKS5nZXRJZCgpfSIvPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxqeDpmb3JtYXREYXRlIHBhdHRlcm49Inl5eXktTU0tZGQgSEg6bW06c3MiIHZhbHVlPSIke21lc3NhZ2UuZ2V0TWVzc2FnZSgpLmdldFRpbWUoKX0iLz4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KLSAgICAgICAgICA8ang6aWYgdGVzdD0iJHttZXNzYWdlLmlzTWFya2VkQXNSZWFkKCl9Ij4mIzEwMDA0Ozwvang6aWY+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+Ci0gICAgICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3VzZWNhc2UuZ2V0TmFtZSgpfSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkZWxldGVNZXNzYWdlSWQiIHZhbHVlPSIke21lc3NhZ2UuZ2V0SWQoKX0iLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkRlbGV0ZSIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC9qeDpmb3JFYWNoPgotICA8L3RhYmxlPgotICAKLTwvang6dGVtcGxhdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL3VzZWNhc2VzL25vdGlmaWNhdGlvbi91c2VjYXNlLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvbm90aWZpY2F0aW9uL3VzZWNhc2UueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkMjBmYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvbm90aWZpY2F0aW9uL3VzZWNhc2UueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54bWFwIDE3OTQ4OCAyMDA1LTA2LTAyIDAyOjI5OjM5WiBncmVnb3IgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDxtYXA6Y29tcG9uZW50cz4KLSAgICA8bWFwOmdlbmVyYXRvcnMgZGVmYXVsdD0iZmlsZSI+Ci0gICAgICA8bWFwOmdlbmVyYXRvciBuYW1lPSJzZXNzaW9uLWF0dHIiIGxvZ2dlcj0ic2l0ZW1hcC5nZW5lcmF0b3Iuc2Vzc2lvbi1hdHRyIgotICAgICAgICAgICBzcmM9Im9yZy5hcGFjaGUuY29jb29uLmdlbmVyYXRpb24uU2Vzc2lvbkF0dHJpYnV0ZUdlbmVyYXRvciIvPgotICAgIDwvbWFwOmdlbmVyYXRvcnM+Ci0gIDwvbWFwOmNvbXBvbmVudHM+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0gIAotICAgIDxtYXA6cGlwZWxpbmUgaW50ZXJuYWwtb25seT0idHJ1ZSI+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2Vzc2lvbi1hdHRyIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhdHRyLW5hbWUiIHZhbHVlPSJub3RpZmljYXRpb24uZG9tIi8+Ci0gICAgICAgIDwvbWFwOmdlbmVyYXRlPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7bG9jYWxlfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi91c2VjYXNlcy9zZW5kTWVzc2FnZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi91c2VjYXNlcy9zZW5kTWVzc2FnZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhZGFjMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24vdXNlY2FzZXMvc2VuZE1lc3NhZ2UuangKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IGdyb3Vwcy5qeCA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiIj4KLSAgICAgIDxoMT48aTE4bjp0ZXh0Pm5ldy1tZXNzYWdlPC9pMThuOnRleHQ+PC9oMT4KLSAgICAgIAotICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICA8ang6aW1wb3J0IHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdGVtcGxhdGVzL21lc3NhZ2VzLmp4Ii8+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICAKLSAgICAgIDxqeDpzZXQgdmFyPSJzZW5kZXIiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1c2VyJyl9Ii8+Ci0gICAgICAKLSAgICAgIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9IlBPU1QiPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbjogMTBweCAwcHgiPgotICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+RnJvbTwvaTE4bjp0ZXh0PjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8ang6b3V0IHZhbHVlPSIke3NlbmRlci5nZXRJZCgpfSI+PC9qeDpvdXQ+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+VG88L2kxOG46dGV4dD48L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiBuYW1lPSJyZWNpcGllbnQiPgotICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJyZWNpcGllbnQiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCd1c2VycycpfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7cmVjaXBpZW50LmdldElkKCl9Ij48ang6b3V0IHZhbHVlPSIke3JlY2lwaWVudC5nZXRJZCgpfSIvPjwvb3B0aW9uPgotICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PlN1YmplY3Q8L2kxOG46dGV4dD48L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIG5hbWU9InN1YmplY3QiIHR5cGU9InRleHQiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiIgdmFsaWduPSJ0b3AiPjxpMThuOnRleHQ+TWVzc2FnZTwvaTE4bjp0ZXh0PjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8dGV4dGFyZWEgc3R5bGU9ImhlaWdodDogMzAwcHgiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIG5hbWU9ImJvZHkiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZW5kIiBpMThuOmF0dHI9InZhbHVlIi8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgPC9mb3JtPgotICAgICAgCi0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvbm90aWZpY2F0aW9uL3hzbHQvaW5zZXJ0Q29udGVudC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24veHNsdC9pbnNlcnRDb250ZW50LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2ZGIyZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9ub3RpZmljYXRpb24veHNsdC9pbnNlcnRDb250ZW50LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54bWFwIDE3OTQ4OCAyMDA1LTA2LTAyIDAyOjI5OjM5WiBncmVnb3IgJCAtLT4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICB4bWxuczpub3Q9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL25vdGlmaWNhdGlvbi8yLjAiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIKLSAgPgotCi0gIDx4c2w6cGFyYW0gbmFtZT0ic3ViamVjdCIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImJvZHkiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvbm90Om1lc3NhZ2UiPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm90OnN1YmplY3QiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDxpMThuOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdWJqZWN0Ii8+PC9pMThuOnRleHQ+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5vdDpib2R5Ij4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8aTE4bjp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYm9keSIvPjwvaTE4bjp0ZXh0PgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIAotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi9yZXNvdXJjZS10eXBlLW9wZW5kb2N1bWVudC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9jb25maWcvY29jb29uLXhjb25mL3Jlc291cmNlLXR5cGUtb3BlbmRvY3VtZW50Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE4NDcwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9jb25maWcvY29jb29uLXhjb25mL3Jlc291cmNlLXR5cGUtb3BlbmRvY3VtZW50Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vcmVzb3VyY2UtdHlwZXMiIHVubGVzcz0iL2NvY29vbi9yZXNvdXJjZS10eXBlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnb3BlbmRvY3VtZW50J10iPgotCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ib3BlbmRvY3VtZW50IgotICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEucmVzb3VyY2V0eXBlcy5vcGVuZG9jdW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZUltcGwiPgotICAgIDxzYW1wbGUgCi0gICAgICBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCIKLSAgICAgIHVyaT0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL29wZW5kb2N1bWVudC9zYW1wbGVzL2hlbGxvd29ybGQub2R0IgotICAgIC8+Ci0gICAgPCEtLSBOT1RFOiBXaWxsIGJlIG1hdGNoZWQgd2l0aGluIHNpdGVtYXAgb2YgdGhpcyBtb2R1bGUgKG1vZHVsZXMvb3BlbmRvY3VtZW50L3NpdGVtYXAueG1hcCkgLS0+Ci0gICAgPGZvcm1hdCBuYW1lPSJ4aHRtbCIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL29wZW5kb2N1bWVudC94aHRtbC54bWwiLz4KLSAgICA8Zm9ybWF0IG5hbWU9IndlYmRhdkdFVCIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL29wZW5kb2N1bWVudC9kYXZnZXQueG1sIi8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jcmVhdGUtb2R0Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jcmVhdGUtb2R0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWViNDk0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY3JlYXRlLW9kdC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdXNlY2FzZS1jcmVhdGUtbWV0YWRhdGEueGNvbmYgNzA4MSAyMDA1LTExLTExIDEzOjA0OjIzWiBmZWxpeCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnb3BlbmRvY3VtZW50LmNyZWF0ZSddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9Im9wZW5kb2N1bWVudC5jcmVhdGUiIGxvZ2dlcj0ibGVueWEubW9kdWxlLm9kdCIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DcmVhdGVPcGVuRG9jdW1lbnQiPgotICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9zaXRlbWFuYWdlbWVudC91c2VjYXNlcy9zaXRlL2NyZWF0ZS5qeCIvPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS11cGxvYWQtb2R0Lnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS11cGxvYWQtb2R0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWJmYzdiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtdXBsb2FkLW9kdC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdXNlY2FzZS1jcmVhdGUtbWV0YWRhdGEueGNvbmYgNzA4MSAyMDA1LTExLTExIDEzOjA0OjIzWiBmZWxpeCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnb3BlbmRvY3VtZW50LnVwbG9hZCddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9Im9wZW5kb2N1bWVudC51cGxvYWQiIGxvZ2dlcj0ibGVueWEubW9kdWxlLm9kdCIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5VcGxvYWRPcGVuRG9jdW1lbnQiPgotICAgIDx2aWV3IHVyaT0ibW9kdWxlcy9vcGVuZG9jdW1lbnQvdXNlY2FzZXMvdXBsb2FkLmp4Ii8+Ci0gICAgPGV2ZW50IGlkPSJlZGl0Ii8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotICAKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvY29uZmlnL21lbnVzL29wZW5kb2N1bWVudC54c3AgYi90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvY29uZmlnL21lbnVzL29wZW5kb2N1bWVudC54c3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDBlOTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2NvbmZpZy9tZW51cy9vcGVuZG9jdW1lbnQueHNwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiQgLS0+Ci0KLTx4c3A6cGFnZSAKLSAgICBsYW5ndWFnZT0iamF2YSIgCi0gICAgeG1sbnM6eHNwPSJodHRwOi8vYXBhY2hlLm9yZy94c3AiCi0gICAgeG1sbnM6eHNwLXJlcXVlc3Q9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcC9yZXF1ZXN0LzIuMCIKLSAgICB4bWxuczppbnB1dD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3hzcC9pbnB1dC8xLjAiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgICB4bWxuczp3Zj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3dvcmtmbG93LzEuMCIKLSAgICB4bWxuczp1Yz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3VzZWNhc2UvMS4wIgotICAgIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiCi0+Ci0KLSAgPHhzcDpzdHJ1Y3R1cmU+Ci0gICAgPHhzcDppbmNsdWRlPm9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50PC94c3A6aW5jbHVkZT4KLSAgICA8eHNwOmluY2x1ZGU+b3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb248L3hzcDppbmNsdWRlPgotICA8L3hzcDpzdHJ1Y3R1cmU+Ci0gIAotICA8bWVudT4KLQotICAgIDxtZW51cz4KLSAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iRmlsZSI+Ci0gICAgICAgIDxibG9jayBhcmVhcz0ic2l0ZSBhdXRob3JpbmciIGlkPSJjcmVhdGUiPgotICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9Im9wZW5kb2N1bWVudC5jcmVhdGUiIGhyZWY9Ij9kb2N0eXBlPW9wZW5kb2N1bWVudCI+Ci0gICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+TmV3IC4uLiBEb2N1bWVudDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48aTE4bjp0ZXh0PnJlc291cmNlVHlwZS1vcGVuZG9jdW1lbnQ8L2kxOG46dGV4dD48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgIDwvaXRlbT4KLSAgICAgICAgPC9ibG9jaz4KLSAgICAgIDwvbWVudT4KLSAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iRWRpdCI+Ci0gICAgICAgICAgPHhzcDpsb2dpYz4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGRvYyA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9Im9iamVjdCIgbmFtZT0iZG9jdW1lbnQiLz47Ci0gICAgICAgICAgICAgICAgaWYgKGRvYyBpbnN0YW5jZW9mIERvY3VtZW50ICZhbXA7JmFtcDsgKChEb2N1bWVudCkgZG9jKS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG9jdHlwZSA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9InN0cmluZyIgbmFtZT0iZG9jdW1lbnQtdHlwZSIvPjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJvcGVuZG9jdW1lbnQiLmVxdWFscyhkb2N0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkgPSA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InJlcXVlc3QiIGFzPSJzdHJpbmciIG5hbWU9InJlcXVlc3RVUkkiLz47Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlVVJJID0gcmVxdWVzdFVSSS5zdWJzdHJpbmcoMCxyZXF1ZXN0VVJJLmxhc3RJbmRleE9mKCIuaHRtbCIpKS5jb25jYXQoIi5vZHQ/bGVueWEubW9kdWxlPW9wZW5kb2N1bWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgPGJsb2NrIGFyZWFzPSJhdXRob3JpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNwOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c3A6ZXhwcj5tb2R1bGVVUkk8L3hzcDpleHByPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNwOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PkRvd25sb2FkIE9EVDwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYmxvY2s+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YmxvY2sgYXJlYXM9ImF1dGhvcmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9Im9wZW5kb2N1bWVudC51cGxvYWQiIGhyZWY9Ij8iPjxpMThuOnRleHQ+VXBsb2FkIE9EVDwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYmxvY2s+Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIG1lbnUgZ2VuZXJhdGlvbjogIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgPC94c3A6bG9naWM+Ci0gICAgICA8L21lbnU+Ci0gICAgPC9tZW51cz4KLQotICAgIAotICA8L21lbnU+Ci08L3hzcDpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWY0ODQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLm9wZW5kb2N1bWVudDwvaWQ+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnNpdGVtYW5hZ2VtZW50Ii8+Ci0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnVzZWNhc2UiLz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5PREYgTW9kdWxlPC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj5PREYgTW9kdWxlPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL09wZW5Eb2N1bWVudFdyYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi9PcGVuRG9jdW1lbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTJkYzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL09wZW5Eb2N1bWVudFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5zZXJ2bGV0Lm11bHRpcGFydC5QYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQuQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgZm9yIHRoZSBPRFQgcmVzb3VyY2UgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5Eb2N1bWVudFdyYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgewotCi0gICAgLyoqCi0gICAgICogVGhlIGV4dGVuc2lvbiBmb3IgT0RUIGRvY3VtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRFRfRVhURU5TSU9OID0gIm9kdCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWltZS10eXBlIGZvciBPRFQgZG9jdW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9EVF9NSU1FX1RZUEUgPSAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0IjsKLQotICAgIHByaXZhdGUgRG9jdW1lbnQgZGVsZWdhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3cmFwLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlbkRvY3VtZW50V3JhcHBlcihEb2N1bWVudCBkb2MsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgZW5hYmxlTG9nZ2luZyhsb2dnZXIpOwotICAgICAgICB0aGlzLmRlbGVnYXRlID0gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBwYXJ0IHRvIHdyaXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKFBhcnQgZmlsZSkgewotICAgICAgICBpZiAoIWZpbGUuZ2V0TWltZVR5cGUoKS5lcXVhbHMoT0RUX01JTUVfVFlQRSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgbWltZSB0eXBlOiBbIiArIGZpbGUuZ2V0TWltZVR5cGUoKSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlKGZpbGUuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4KLSAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gVGhlIGlucHV0IHN0cmVhbSBwcm92aWRpbmcgdGhlIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLSAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNvdXJjZUJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBPdXRwdXRTdHJlYW0gZGVzdE91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIElPVXRpbHMuY29weShpbnB1dFN0cmVhbSwgc291cmNlQm9zKTsKLQotICAgICAgICAgICAgZGVzdE91dHB1dFN0cmVhbSA9IGRlbGVnYXRlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgSU9VdGlscy53cml0ZShzb3VyY2VCb3MudG9CeXRlQXJyYXkoKSwgZGVzdE91dHB1dFN0cmVhbSk7Ci0KLSAgICAgICAgICAgIGRlbGVnYXRlLnNldE1pbWVUeXBlKE9EVF9NSU1FX1RZUEUpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkZXN0T3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBkZXN0T3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZU9wZW5Eb2N1bWVudC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ3JlYXRlT3BlbkRvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OGIxNGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvQ3JlYXRlT3BlbkRvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLk9wZW5Eb2N1bWVudFdyYXBwZXI7Ci0KLQotLyoqCi0gKiBVc2VjYXNlIHRvIGNyZWF0ZSBhIGRvY3VtZW50LgotICogCi0gKiBAdmVyc2lvbiAkSWQ6IENyZWF0ZURvY3VtZW50LmphdmEgMzc5MDk4IDIwMDYtMDItMjAgMTE6MzU6MTBaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlT3BlbkRvY3VtZW50IGV4dGVuZHMgQ3JlYXRlRG9jdW1lbnQgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VFeHRlbnNpb24oKSB7Ci0gICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBPcGVuRG9jdW1lbnRXcmFwcGVyLk9EVF9FWFRFTlNJT047Ci0gICAgICAgIHJldHVybiBleHRlbnNpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvVXBsb2FkT3BlbkRvY3VtZW50LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9VcGxvYWRPcGVuRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllMzAzNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9VcGxvYWRPcGVuRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uc2VydmxldC5tdWx0aXBhcnQuUGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5PcGVuRG9jdW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LnVzZWNhc2VzLkludm9rZVdvcmtmbG93OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gY3JlYXRlIGEgZG9jdW1lbnQuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogQ3JlYXRlRG9jdW1lbnQuamF2YSAzNzkwOTggMjAwNi0wMi0yMCAxMTozNToxMFogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRPcGVuRG9jdW1lbnQgZXh0ZW5kcyBJbnZva2VXb3JrZmxvdyB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrUHJlY29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrUHJlY29uZGl0aW9ucygpOwotICAgICAgICBpZiAoIVNlcnZsZXRIZWxwZXIuaXNVcGxvYWRFbmFibGVkKG1hbmFnZXIpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIlVwbG9hZCBpcyBub3QgZW5hYmxlZC4gUGxlYXNlIGNoZWNrIGxvY2FsLmJ1aWxkLnByb3BlcnRpZXMhIik7Ci0gICAgICAgIH0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKCFkb2MuZ2V0QXJlYSgpLmVxdWFscyhQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhpcyB1c2VjYXNlIGNhbiBvbmx5IGJlIGludm9rZWQgaW4gdGhlIGF1dGhvcmluZyBhcmVhISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLSAgICAgICAgUGFydCBmaWxlID0gZ2V0UGFydCgiZmlsZSIpOwotICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoIm1pc3NpbmctZmlsZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZpbGUuaXNSZWplY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyBJbnRlZ2VyLnRvU3RyaW5nKGZpbGUuZ2V0U2l6ZSgpKSB9OwotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgidXBsb2FkLXNpemUtZXhjZWVkZWQiLCBwYXJhbXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBmaWxlLmdldE1pbWVUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFPcGVuRG9jdW1lbnRXcmFwcGVyLk9EVF9NSU1FX1RZUEUuZXF1YWxzKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSB7IG1pbWVUeXBlLCBPcGVuRG9jdW1lbnRXcmFwcGVyLk9EVF9NSU1FX1RZUEUgfTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJ3cm9uZy1taW1lLXR5cGUiLCBwYXJhbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgICAgIE9wZW5Eb2N1bWVudFdyYXBwZXIgb2R0ID0gbmV3IE9wZW5Eb2N1bWVudFdyYXBwZXIoZ2V0U291cmNlRG9jdW1lbnQoKSwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICBQYXJ0IGZpbGUgPSBnZXRQYXJ0KCJmaWxlIik7Ci0gICAgICAgIG9kdC53cml0ZShmaWxlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9tZW51cy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L21lbnVzLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjM5Y2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L21lbnVzLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDokIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICAKLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2VydmVycGFnZXMiIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL29wZW5kb2N1bWVudC9jb25maWcvbWVudXMvb3BlbmRvY3VtZW50LnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlMWQ3ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGNtc3VpLnhtbCA0NDY1NDIgMjAwNi0wOS0xNSAwODoxNDozOVogYW5kcmVhcyAkIC0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVuIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotDQotICA8bWVzc2FnZSBrZXk9InJlc291cmNlVHlwZS1vcGVuZG9jdW1lbnQiPk9EVDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVcGxvYWQgT0RUIj5VcGxvYWQgT0RUPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvd25sb2FkIE9EVCI+RG93bmxvYWQgT0RUPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVwbG9hZCBPRFQgRmlsZSI+VXBsb2FkIE9EVCBGaWxlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ildhcm5pbmciPldhcm5pbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZG9jdW1lbnQtd2lsbC1iZS1vdmVyd3JpdHRlbiI+VGhlIGV4aXN0aW5nIGRvY3VtZW50IHdpbGwgYmUgb3ZlcndyaXR0ZW4hPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im1pc3NpbmctZmlsZSI+UGxlYXNlIHNlbGVjdCBhIGZpbGUuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Indyb25nLW1pbWUtdHlwZSI+Ci0gICAgVGhlIG1pbWUgdHlwZSBvZiB0aGUgZG9jdW1lbnQgeW91IHdhbnQgdG8gdXBsb2FkICgiezB9IikgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIG1pbWUgdHlwZSAiezF9IgotICA8L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI1MzRiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWlfZGUueG1sIDQ0NjU0MiAyMDA2LTA5LTE1IDA4OjE0OjM5WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUtb3BlbmRvY3VtZW50Ij5PRFQ8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlVwbG9hZCBPRFQiPk9EVCBob2NobGFkZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG93bmxvYWQgT0RUIj5PRFQgaGVydW50ZXJsYWRlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVcGxvYWQgT0RUIEZpbGUiPk9EVC1EYXRlaSBob2NobGFkZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV2FybmluZyI+V2FybnVuZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2N1bWVudC13aWxsLWJlLW92ZXJ3cml0dGVuIj5EYXMgZXhpc3RpZXJlbmRlIERva3VtZW50IHdpcmQgw7xiZXJzY2hyaWViZW4hPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im1pc3NpbmctZmlsZSI+Qml0dGUgd8OkaGxlbiBTaWUgZWluZSBEYXRlaS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0id3JvbmctbWltZS10eXBlIj4KLSAgICBEZXIgTWltZS1UeXBlIGRlciBEYXRlaSwgZGllIFNpZSBob2NobGFkZW4gbcO2Y2h0ZW4gKCJ7MH0iKSwgZW50c3ByaWNodCBuaWNodCBkZW0KLSAgICBiZW7DtnRpZ3RlbiBNaW1lLVR5cGUgInsxfSIKLSAgPC9tZXNzYWdlPgotICANCi08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvc2FtcGxlcy9oZWxsb3dvcmxkLm9kdCBiL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9zYW1wbGVzL2hlbGxvd29ybGQub2R0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTRiYTMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9zYW1wbGVzL2hlbGxvd29ybGQub2R0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZGNkM2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8IS0tIHdlYmRhdiBHRVQgbWF0Y2hlciAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iZGF2Z2V0LnhtbCI+Ci0gICAgICAgIDxtYXA6YWN0IHR5cGU9InNldC1oZWFkZXIiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Ikxhc3QtTW9kaWZpZWQiIHZhbHVlPSJ7ZGF0ZS1pc284NjAxLXJmYzgyMjp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYXN0bW9kaWZpZWR9fSIgLz4KLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJsZW55YS1kb2N1bWVudDp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSxsYW5nPXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLz4KLSAgICAgICAgPC9tYXA6YWN0PgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDwhLS0gcGFyYW1ldHJpemVkIGRvY3R5cGUgbWF0Y2hlciAtLT4KLSAgICAgIDwhLS0gcGF0dGVybj0ie3JlbmRlcnR5cGV9IiAtLT4KLQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLnhtbCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJ6aXA6bGVueWEtZG9jdW1lbnQ6e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0sbGFuZz17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX0hL2NvbnRlbnQueG1sIi8+Ci0KLTwhLS0KLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibWV0YUZpbGVVUkwiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9L21ldGEueG1sIi8+Ci0gICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InN0eWxlc0ZpbGVVUkwiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9L3N0eWxlcy54bWwiLz4KLS0tPgotCi0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL29wZW5kb2N1bWVudC94c2x0L29wZW5kb2N1bWVudDJ4aHRtbC54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJlbmRlcnR5cGUiIHZhbHVlPSJ7MX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJub2RlaWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1uYW1lfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKi5vZHQiPgotICAgICAgICA8bWFwOnJlYWQgc3JjPSJsZW55YS1kb2N1bWVudDp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSxsYW5nPXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvdXNlY2FzZXMvdXBsb2FkLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L3VzZWNhc2VzL3VwbG9hZC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3YzhjYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQvdXNlY2FzZXMvdXBsb2FkLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGFzc2V0cy5qeCAzNzQzOTEgMjAwNi0wMi0wMiAxNDowMjoxN1ogYW5kcmVhcyAkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSI+Ci0KLSAgPHBhZ2U6dGl0bGU+Ci0gICAgPGkxOG46dGV4dD5VcGxvYWQgT0RUIEZpbGU8L2kxOG46dGV4dD4KLSAgPC9wYWdlOnRpdGxlPiAKLSAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICA8aTE4bjp0ZXh0PlVwbG9hZCBPRFQgRmlsZTwvaTE4bjp0ZXh0PgotICAgIDwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgaWQ9ImZvcm0tdXBsb2FkIj4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXROYW1lKCl9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgc3R5bGU9InBhZGRpbmctYm90dG9tOiAyZW07Ij4KLSAgICAgICAgICAgICAgPHN0cm9uZz48aTE4bjp0ZXh0Pldhcm5pbmc8L2kxOG46dGV4dD46PC9zdHJvbmc+IDxpMThuOnRleHQ+ZG9jdW1lbnQtd2lsbC1iZS1vdmVyd3JpdHRlbjwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0iZmlsZSI+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+RmlsZTwvaTE4bjp0ZXh0PiAqPC9sYWJlbD48L3RkPgotICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiBzaXplPSI1MCIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPioKLSAgICAgICAgICAgICAgPGkxOG46dGV4dD5yZXF1aXJlZCBmaWVsZHM8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQgT0RUIi8+Ci0gICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJjYW5jZWwiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9mb3JtPgotICAgIDwvZGl2PgotICAgIDwvZGl2PgotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvb3BlbmRvY3VtZW50L3hzbHQvY29tbW9uL29kdF90b194aHRtbC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQveHNsdC9jb21tb24vb2R0X3RvX3hodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk0MjE0Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQveHNsdC9jb21tb24vb2R0X3RvX3hodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSBBcGFjaGUgMi4wCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0KLWh0dHA6Ly93d3cub3BlbmRvY3VtZW50Zm91bmRhdGlvbi5vcmcvcmVwb3Mvc3ZuL2xpYm9wZW5kb2N1bWVudC90cnVuay94c2wvZGVmYXVsdC9kb2N1bWVudDJ4aHRtbC54c2wKLQotcmVzcC4KLQotaHR0cDovL3d3dy5vcGVuZG9jdW1lbnRmb3VuZGF0aW9uLm9yZy9yZXBvcy9zdm4vbGlib3BlbmRvY3VtZW50L3RydW5rLwotCi1yZXNwLgotCi1odHRwOi8vYm9va3MuZXZjLWNpdC5pbmZvL29kZl91dGlscy9vZHRfdG9feGh0bWwuaHRtbAotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM6b2ZmaWNlPSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm9mZmljZToxLjAiCi0gICAgeG1sbnM6bWV0YT0idXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczptZXRhOjEuMCIKLSAgICB4bWxuczpjb25maWc9InVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6Y29uZmlnOjEuMCIKLSAgICB4bWxuczp0ZXh0PSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnRleHQ6MS4wIgotICAgIHhtbG5zOnRhYmxlPSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnRhYmxlOjEuMCIKLSAgICB4bWxuczpkcmF3PSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRyYXdpbmc6MS4wIgotICAgIHhtbG5zOnByZXNlbnRhdGlvbj0idXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpwcmVzZW50YXRpb246MS4wIgotICAgIHhtbG5zOmRyM2Q9InVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6ZHIzZDoxLjAiCi0gICAgeG1sbnM6Y2hhcnQ9InVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6Y2hhcnQ6MS4wIgotICAgIHhtbG5zOmZvcm09InVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6Zm9ybToxLjAiCi0gICAgeG1sbnM6c2NyaXB0PSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnNjcmlwdDoxLjAiCi0gICAgeG1sbnM6c3R5bGU9InVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6c3R5bGU6MS4wIgotICAgIHhtbG5zOm51bWJlcj0idXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpkYXRhc3R5bGU6MS4wIgotICAgIHhtbG5zOmFuaW09InVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6YW5pbWF0aW9uOjEuMCIKLQotICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKLSAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKLSAgICB4bWxuczptYXRoPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIgotICAgIHhtbG5zOnhmb3Jtcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMi94Zm9ybXMiCi0KLSAgICB4bWxuczpmbz0idXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp4c2wtZm8tY29tcGF0aWJsZToxLjAiCi0gICAgeG1sbnM6c3ZnPSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnN2Zy1jb21wYXRpYmxlOjEuMCIKLSAgICB4bWxuczpzbWlsPSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnNtaWwtY29tcGF0aWJsZToxLjAiCi0JCi0JeG1sbnM6b29vPSJodHRwOi8vb3Blbm9mZmljZS5vcmcvMjAwNC9vZmZpY2UiCi0JeG1sbnM6b29vdz0iaHR0cDovL29wZW5vZmZpY2Uub3JnLzIwMDQvd3JpdGVyIgotCXhtbG5zOm9vb2M9Imh0dHA6Ly9vcGVub2ZmaWNlLm9yZy8yMDA0L2NhbGMiCi0JeG1sbnM6aW50PSJodHRwOi8vY2F0Y29kZS5jb20vb2RmX3RvX3hodG1sL2ludGVybmFsIgotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCWV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJvZmZpY2UgbWV0YSBjb25maWcgdGV4dCB0YWJsZSBkcmF3IHByZXNlbnRhdGlvbgotCQlkcjNkIGNoYXJ0IGZvcm0gc2NyaXB0IHN0eWxlIG51bWJlciBhbmltIGRjIHhsaW5rIG1hdGggeGZvcm1zIGZvCi0JCXN2ZyBzbWlsIG9vbyBvb293IG9vb2MgaW50ICNkZWZhdWx0IgotPgotCi08eHNsOm91dHB1dAotCW1ldGhvZD0ieG1sIgotCWluZGVudD0ieWVzIgotCW9taXQteG1sLWRlY2xhcmF0aW9uPSJ5ZXMiCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIgotCWVuY29kaW5nPSJVVEYtOCIKLS8+Ci08eHNsOnZhcmlhYmxlIG5hbWU9ImxpbmVCcmVhayI+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD48L3hzbDp2YXJpYWJsZT4KLQotPHhzbDprZXkgbmFtZT0ibGlzdFR5cGVzIiBtYXRjaD0idGV4dDpsaXN0LXN0eWxlIiB1c2U9IkBzdHlsZTpuYW1lIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9vZmZpY2U6ZG9jdW1lbnQtY29udGVudCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTx0aXRsZT5Db252ZXJ0ZWQgYnkgb2R0X3RvX3hodG1sLnhzbDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgotPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJvZmZpY2U6YXV0b21hdGljLXN0eWxlcyIvPgotPC9oZWFkPgotPGJvZHk+Ci08eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im9mZmljZTpib2R5L29mZmljZTp0ZXh0Ii8+Ci08L2JvZHk+Ci08L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci08IS0tCi0JVGhpcyBzZWN0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBoYW5kbGVzIHN0eWxlcyBpbiB0aGUKLQljb250ZW50LnhtbCBmaWxlCi0tLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im9mZmljZTphdXRvbWF0aWMtc3R5bGVzIj4KLQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQk8L3N0eWxlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InN0eWxlOnN0eWxlIj4KLQk8eHNsOmNob29zZT4KLQkJPHhzbDp3aGVuIHRlc3Q9IkBzdHlsZTpmYW1pbHk9J3RhYmxlJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy10YWJsZS1zdHlsZSIvPgotCQk8L3hzbDp3aGVuPgotCQk8eHNsOndoZW4gdGVzdD0iQHN0eWxlOmZhbWlseT0ndGFibGUtY29sdW1uJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy10YWJsZS1jb2x1bW4tc3R5bGUiLz4KLQkJPC94c2w6d2hlbj4KLQkJPHhzbDp3aGVuIHRlc3Q9IkBzdHlsZTpmYW1pbHk9J3RhYmxlLWNlbGwnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXRhYmxlLWNlbGwtc3R5bGUiLz4KLQkJPC94c2w6d2hlbj4KLQkJPHhzbDp3aGVuIHRlc3Q9IkBzdHlsZTpmYW1pbHk9J3BhcmFncmFwaCciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtcGFyYWdyYXBoLXN0eWxlIi8+Ci0JCTwveHNsOndoZW4+Ci0JCTx4c2w6d2hlbiB0ZXN0PSJAc3R5bGU6ZmFtaWx5PSd0ZXh0JyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy10ZXh0LXN0eWxlIi8+Ci0JCTwveHNsOndoZW4+Ci0JPC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy10YWJsZS1zdHlsZSI+Ci0JPHhzbDppZiB0ZXN0PSJzdHlsZTp0YWJsZS1wcm9wZXJ0aWVzIj4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLQkJPHhzbDp0ZXh0Pi48L3hzbDp0ZXh0PgotCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKEBzdHlsZTpuYW1lLCcuJywnXycpIi8+Ci0JCTx4c2w6dGV4dD57d2lkdGg6IDwveHNsOnRleHQ+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdHlsZTp0YWJsZS1wcm9wZXJ0aWVzLwotCQkJQHN0eWxlOndpZHRoIi8+Ci0JCTx4c2w6dGV4dD59PC94c2w6dGV4dD4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLQk8L3hzbDppZj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9InByb2Nlc3MtdGFibGUtY29sdW1uLXN0eWxlIj4KLQk8eHNsOmlmIHRlc3Q9InN0eWxlOnRhYmxlLWNvbHVtbi1wcm9wZXJ0aWVzIj4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLQkJPHhzbDp0ZXh0Pi48L3hzbDp0ZXh0PgotCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKEBzdHlsZTpuYW1lLCcuJywnXycpIi8+Ci0JCTx4c2w6dGV4dD57d2lkdGg6IDwveHNsOnRleHQ+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdHlsZTp0YWJsZS1jb2x1bW4tcHJvcGVydGllcy8KLQkJCUBzdHlsZTpjb2x1bW4td2lkdGgiLz48eHNsOnRleHQ+OzwveHNsOnRleHQ+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluZUJyZWFrIi8+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImhhbmRsZS1zdHlsZS1wcm9wZXJ0aWVzIj4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlU2V0IgotCQkJCXNlbGVjdD0ic3R5bGU6dGFibGUtcHJvcGVydGllcyIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8eHNsOnRleHQ+fTwveHNsOnRleHQ+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluZUJyZWFrIi8+Ci0JPC94c2w6aWY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXRhYmxlLWNlbGwtc3R5bGUiPgotCTx4c2w6aWYgdGVzdD0ic3R5bGU6dGFibGUtY2VsbC1wcm9wZXJ0aWVzIj4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLQkJPHhzbDp0ZXh0Pi48L3hzbDp0ZXh0PgotCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKEBzdHlsZTpuYW1lLCcuJywnXycpIi8+Ci0JCTx4c2w6dGV4dD57PC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpbmVCcmVhayIvPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaGFuZGxlLXN0eWxlLXByb3BlcnRpZXMiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVTZXQiCi0JCQkJc2VsZWN0PSJzdHlsZTp0YWJsZS1jZWxsLXByb3BlcnRpZXMiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPHhzbDp0ZXh0Pn08L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluZUJyZWFrIi8+Ci0JPC94c2w6aWY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXBhcmFncmFwaC1zdHlsZSI+Ci0JPHhzbDppZiB0ZXN0PSJzdHlsZTpwYXJhZ3JhcGgtcHJvcGVydGllcyI+Ci0JCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluZUJyZWFrIi8+Ci0JCTx4c2w6dGV4dD4uPC94c2w6dGV4dD4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZShAc3R5bGU6bmFtZSwnLicsJ18nKSIvPgotCQk8eHNsOnRleHQ+ezwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImhhbmRsZS1zdHlsZS1wcm9wZXJ0aWVzIj4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlU2V0IgotCQkJCXNlbGVjdD0ic3R5bGU6cGFyYWdyYXBoLXByb3BlcnRpZXMiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPHhzbDp0ZXh0Pn08L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluZUJyZWFrIi8+Ci0JPC94c2w6aWY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9jZXNzLXRleHQtc3R5bGUiPgotCTx4c2w6aWYgdGVzdD0ic3R5bGU6dGV4dC1wcm9wZXJ0aWVzIj4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLQkJPHhzbDp0ZXh0Pi48L3hzbDp0ZXh0PgotCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKEBzdHlsZTpuYW1lLCcuJywnXycpIi8+Ci0JCTx4c2w6dGV4dD57PC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpbmVCcmVhayIvPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaGFuZGxlLXN0eWxlLXByb3BlcnRpZXMiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVTZXQiCi0JCQkJc2VsZWN0PSJzdHlsZTp0ZXh0LXByb3BlcnRpZXMiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJPHhzbDp0ZXh0Pn08L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluZUJyZWFrIi8+Ci0JPC94c2w6aWY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJoYW5kbGUtc3R5bGUtcHJvcGVydGllcyI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJub2RlU2V0Ii8+Ci0JPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRub2RlU2V0L0AqIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aGlzIiBzZWxlY3Q9Ii4iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmaW5kIiBzZWxlY3Q9ImRvY3VtZW50KCcnKS94c2w6c3R5bGVzaGVldC8KLQkJCWludDphdHRyLW1hcC9pbnQ6YXR0cltAbmFtZT1uYW1lKCR0aGlzKV0iLz4KLQkJPHhzbDppZiB0ZXN0PSIkZmluZCI+Ci0JCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFjdGlvbiIgc2VsZWN0PSIkZmluZC9AYWN0aW9uIi8+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iJGFjdGlvbj0ncGFzcy10aHJvdWdoJyI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXNzLXRocm91Z2giLz4KLQkJCQk8L3hzbDp3aGVuPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSIkYWN0aW9uPSdjaGVjay1hbGlnbiciPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2hlY2stYWxpZ24iLz4KLQkJCQk8L3hzbDp3aGVuPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDppZj4KLQk8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBhc3MtdGhyb3VnaCI+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxvY2FsLW5hbWUoKSIvPjx4c2w6dGV4dD46IDwveHNsOnRleHQ+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48eHNsOnRleHQ+OzwveHNsOnRleHQ+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImNoZWNrLWFsaWduIj4KLQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibG9jYWwtbmFtZSgpIi8+PHhzbDp0ZXh0PjogPC94c2w6dGV4dD4KLQk8eHNsOmNob29zZT4KLQkJPHhzbDp3aGVuIHRlc3Q9Ii49J3N0YXJ0JyI+PHhzbDp0ZXh0PmxlZnQ8L3hzbDp0ZXh0PjwveHNsOndoZW4+Ci0JCTx4c2w6d2hlbiB0ZXN0PSIuPSdlbmQnIj48eHNsOnRleHQ+cmlnaHQ8L3hzbDp0ZXh0PjwveHNsOndoZW4+Ci0JCTx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLQk8eHNsOnRleHQ+OzwveHNsOnRleHQ+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0Omxpc3QtbGV2ZWwtc3R5bGUtYnVsbGV0Ij4KLQk8eHNsOnRleHQ+LjwveHNsOnRleHQ+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BzdHlsZTpuYW1lIi8+Ci0JPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0PgotCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGV4dDpsZXZlbCIvPgotCTx4c2w6dGV4dD57IGxpc3Qtc3R5bGUtdHlwZTogPC94c2w6dGV4dD4KLQk8eHNsOmNob29zZT4KLQkJPHhzbDp3aGVuIHRlc3Q9IkB0ZXh0OmxldmVsIG1vZCAzID0gMSI+ZGlzYzwveHNsOndoZW4+Ci0JCTx4c2w6d2hlbiB0ZXN0PSJAdGV4dDpsZXZlbCBtb2QgMyA9IDIiPmNpcmNsZTwveHNsOndoZW4+Ci0JCTx4c2w6d2hlbiB0ZXN0PSJAdGV4dDpsZXZlbCBtb2QgMyA9IDAiPnNxdWFyZTwveHNsOndoZW4+Ci0JCTx4c2w6b3RoZXJ3aXNlPmRlY2ltYWw8L3hzbDpvdGhlcndpc2U+Ci0JPC94c2w6Y2hvb3NlPgotCTx4c2w6dGV4dD47fTwveHNsOnRleHQ+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaW5lQnJlYWsiLz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQ6bGlzdC1sZXZlbC1zdHlsZS1udW1iZXIiPgotCTx4c2w6dGV4dD4uPC94c2w6dGV4dD4KLQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHN0eWxlOm5hbWUiLz4KLQk8eHNsOnRleHQ+XzwveHNsOnRleHQ+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0ZXh0OmxldmVsIi8+Ci0JPHhzbDp0ZXh0PnsgbGlzdC1zdHlsZS10eXBlOiA8L3hzbDp0ZXh0PgotCTx4c2w6Y2hvb3NlPgotCQk8eHNsOndoZW4gdGVzdD0iQHN0eWxlOm51bS1mb3JtYXQ9JzEnIj5kZWNpbWFsPC94c2w6d2hlbj4KLQkJPHhzbDp3aGVuIHRlc3Q9IkBzdHlsZTpudW0tZm9ybWF0PSdJJyI+dXBwZXItcm9tYW48L3hzbDp3aGVuPgotCQk8eHNsOndoZW4gdGVzdD0iQHN0eWxlOm51bS1mb3JtYXQ9J2knIj5sb3dlci1yb21hbjwveHNsOndoZW4+Ci0JCTx4c2w6d2hlbiB0ZXN0PSJAc3R5bGU6bnVtLWZvcm1hdD0nQSciPnVwcGVyLWFscGhhPC94c2w6d2hlbj4KLQkJPHhzbDp3aGVuIHRlc3Q9IkBzdHlsZTpudW0tZm9ybWF0PSdhJyI+bG93ZXItYWxwaGE8L3hzbDp3aGVuPgotCQk8eHNsOm90aGVyd2lzZT5kZWNpbWFsPC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLQk8eHNsOnRleHQ+O308L3hzbDp0ZXh0PgotCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGluZUJyZWFrIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotPCEtLQotCVRoaXMgc2VjdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24gaGFuZGxlcyB0aGUgdHJ1ZSBjb250ZW50Ci0JZWxlbWVudHMgaW4gdGhlIGNvbnRlbnQueG1sIGZpbGUKLS0tPgotCi08IS0tCi0JWWVzLCBwYXJhZ3JhcGhzIGluIE9EVCByZWFsbHkgcHJvZHVjZSBhIDxkaXY+IGluIFhIVE1MLAotCWJlY2F1c2UgYW4gT0RUIHBhcmFncmFwaCBoYXMgbm8gZXh0cmEgbGluZSBzcGFjaW5nLgotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0OnAiPgotCTxkaXYgY2xhc3M9Int0cmFuc2xhdGUoQHRleHQ6c3R5bGUtbmFtZSwnLicsJ18nKX0iPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQobm9kZSgpKT0wIj48YnIgLz48L3hzbDppZj4KLQk8L2Rpdj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0OnNwYW4iPgotCTxzcGFuIGNsYXNzPSJ7dHJhbnNsYXRlKEB0ZXh0OnN0eWxlLW5hbWUsJy4nLCdfJyl9Ij4KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotCTwvc3Bhbj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0OmgiPgotCTwhLS0gSGVhZGluZyBsZXZlbHMgZ28gb25seSB0byA2IGluIFhIVE1MIC0tPgotCTx4c2w6dmFyaWFibGUgbmFtZT0ibGV2ZWwiPgotCQk8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSJAdGV4dDpvdXRsaW5lLWxldmVsICZndDsgNiI+NjwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRleHQ6b3V0bGluZS1sZXZlbCIvPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dmFyaWFibGU+Ci0JPHhzbDplbGVtZW50IG5hbWU9Intjb25jYXQoJ2gnLCAkbGV2ZWwpfSI+Ci0JCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLQkJCTx4c2w6dmFsdWUtb2YKLQkJCXNlbGVjdD0idHJhbnNsYXRlKEB0ZXh0OnN0eWxlLW5hbWUsJy4nLCdfJykiLz4KLQkJPC94c2w6YXR0cmlidXRlPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0JPC94c2w6ZWxlbWVudD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tCi0JV2hlbiBwcm9jZXNzaW5nIGEgbGlzdCwgeW91IGhhdmUgdG8gbG9vayBhdCB0aGUgcGFyZW50IHN0eWxlCi0JKmFuZCogbGV2ZWwgb2YgbmVzdGluZwotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0Omxpc3QiPgotCTx4c2w6dmFyaWFibGUgbmFtZT0ibGV2ZWwiIHNlbGVjdD0iY291bnQoYW5jZXN0b3I6OnRleHQ6bGlzdCkrMSIvPgotCQotCTwhLS0gdGhlIGxpc3QgY2xhc3MgaXMgdGhlIEB0ZXh0OnN0eWxlLW5hbWUgb2YgdGhlIG91dGVybW9zdAotCQk8dGV4dDpsaXN0PiBlbGVtZW50IC0tPgotCTx4c2w6dmFyaWFibGUgbmFtZT0ibGlzdENsYXNzIj4KLQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGxldmVsPTEiPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGV4dDpzdHlsZS1uYW1lIi8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IgotCQkJCQlhbmNlc3Rvcjo6dGV4dDpsaXN0W2xhc3QoKV0vQHRleHQ6c3R5bGUtbmFtZSIvPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dmFyaWFibGU+Ci0JCi0JPCEtLSBOb3cgc2VsZWN0IHRoZSA8dGV4dDpsaXN0LWxldmVsLXN0eWxlLWZvbz4gZWxlbWVudCBhdCB0aGlzCi0JCWxldmVsIG9mIG5lc3RpbmcgZm9yIHRoaXMgbGlzdCAtLT4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9Im5vZGUiIHNlbGVjdD0ia2V5KCdsaXN0VHlwZXMnLAotCQkkbGlzdENsYXNzKS8qW0B0ZXh0OmxldmVsPSckbGV2ZWwnXSIvPgotCi0JPCEtLSBlbWl0IGFwcHJvcHJpYXRlIGxpc3QgdHlwZSAtLT4KLQk8eHNsOmNob29zZT4KLQkJPHhzbDp3aGVuIHRlc3Q9ImxvY2FsLW5hbWUoJG5vZGUpPSdsaXN0LWxldmVsLXN0eWxlLW51bWJlciciPgotCQkJPG9sIGNsYXNzPSJ7Y29uY2F0KCRsaXN0Q2xhc3MsJ18nLCRsZXZlbCl9Ij4KLQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0JCQk8L29sPgotCQk8L3hzbDp3aGVuPgotCQk8eHNsOm90aGVyd2lzZT4KLQkJCTx1bCBjbGFzcz0ie2NvbmNhdCgkbGlzdENsYXNzLCdfJywkbGV2ZWwpfSI+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotCQkJPC91bD4KLQkJPC94c2w6b3RoZXJ3aXNlPgotCTwveHNsOmNob29zZT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0Omxpc3QtaXRlbSI+Ci0JPGxpPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2xpPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRhYmxlOnRhYmxlIj4KLQk8dGFibGUgY2xhc3M9IntAdGFibGU6c3R5bGUtbmFtZX0iPgotCQk8Y29sZ3JvdXA+Ci0JCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRhYmxlOnRhYmxlLWNvbHVtbiIvPgotCQk8L2NvbGdyb3VwPgotCQk8eHNsOmlmIHRlc3Q9InRhYmxlOnRhYmxlLWhlYWRlci1yb3dzL3RhYmxlOnRhYmxlLXJvdyI+Ci0JCQk8dGhlYWQ+Ci0JCQk8eHNsOmFwcGx5LXRlbXBsYXRlcwotCQkJCXNlbGVjdD0idGFibGU6dGFibGUtaGVhZGVyLXJvd3MvdGFibGU6dGFibGUtcm93Ii8+Ci0JCQkJPC90aGVhZD4KLQkJPC94c2w6aWY+Ci0JCTx0Ym9keT4KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0YWJsZTp0YWJsZS1yb3ciLz4KLQkJPC90Ym9keT4KLQk8L3RhYmxlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRhYmxlOnRhYmxlLWNvbHVtbiI+Ci08Y29sPgotCTx4c2w6aWYgdGVzdD0iQHRhYmxlOm51bWJlci1jb2x1bW5zLXJlcGVhdGVkIj4KLQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3BhbiI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRhYmxlOm51bWJlci1jb2x1bW5zLXJlcGVhdGVkIi8+Ci0JCTwveHNsOmF0dHJpYnV0ZT4KLQk8L3hzbDppZj4KLQk8eHNsOmlmIHRlc3Q9IkB0YWJsZTpzdHlsZS1uYW1lIj4KLQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZShAdGFibGU6c3R5bGUtbmFtZSwnLicsJ18nKSIvPgotCQk8L3hzbDphdHRyaWJ1dGU+Ci0JPC94c2w6aWY+Ci08L2NvbD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YWJsZTp0YWJsZS1yb3ciPgotPHRyPgotCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGFibGU6dGFibGUtY2VsbCIvPgotPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YWJsZTp0YWJsZS1jZWxsIj4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9Im4iPgotCQk8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSJAdGFibGU6bnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQgIT0gMCI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0YWJsZTpudW1iZXItY29sdW1ucy1yZXBlYXRlZCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPjE8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQk8L3hzbDp2YXJpYWJsZT4KLQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy10YWJsZS1jZWxsIj4KLQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im4iIHNlbGVjdD0iJG4iLz4KLQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzcy10YWJsZS1jZWxsIj4KLQk8eHNsOnBhcmFtIG5hbWU9Im4iLz4KLQk8eHNsOmlmIHRlc3Q9IiRuICE9IDAiPgotCQk8dGQ+Ci0JCTx4c2w6aWYgdGVzdD0iQHRhYmxlOnN0eWxlLW5hbWUiPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoQHRhYmxlOnN0eWxlLW5hbWUsCi0JCQkJCScuJywnXycpIi8+Ci0JCQk8L3hzbDphdHRyaWJ1dGU+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IkB0YWJsZTpudW1iZXItY29sdW1ucy1zcGFubmVkIj4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbHNwYW4iPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGFibGU6bnVtYmVyLWNvbHVtbnMtc3Bhbm5lZCIvPgotCQkJPC94c2w6YXR0cmlidXRlPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSJAdGFibGU6bnVtYmVyLXJvd3Mtc3Bhbm5lZCI+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyb3dzcGFuIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRhYmxlOm51bWJlci1yb3dzLXNwYW5uZWQiLz4KLQkJCTwveHNsOmF0dHJpYnV0ZT4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQkJPC90ZD4KLQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2Nlc3MtdGFibGUtY2VsbCI+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ibiIgc2VsZWN0PSIkbiAtIDEiLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQk8L3hzbDppZj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0OnRhYiI+Ci0JPHhzbDp0ZXh0IHhtbDpzcGFjZT0icHJlc2VydmUiPgk8L3hzbDp0ZXh0PgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQ6bGluZS1icmVhayI+Ci0JPGJyIC8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJzcGFjZXMiCi0gICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQ6cyI+Ci08eHNsOmNob29zZT4KLSAgICA8eHNsOndoZW4gdGVzdD0iQHRleHQ6YyI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbnNlcnQtc3BhY2VzIj4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuIiBzZWxlY3Q9IkB0ZXh0OmMiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3hzbDp3aGVuPgotICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgPC94c2w6b3RoZXJ3aXNlPgotPC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iaW5zZXJ0LXNwYWNlcyI+Ci08eHNsOnBhcmFtIG5hbWU9Im4iLz4KLTx4c2w6Y2hvb3NlPgotICAgIDx4c2w6d2hlbiB0ZXN0PSIkbiAmbHQ7PSAzMCI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmcoJHNwYWNlcywgMSwgJG4pIi8+Ci0gICAgPC94c2w6d2hlbj4KLSAgICAKLSAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzcGFjZXMiLz4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imluc2VydC1zcGFjZXMiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im4iPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbiAtIDMwIi8+Ci0gICAgICAgICAgICA8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0OmEiPgotPGEgaHJlZj0ie0B4bGluazpocmVmfSI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYT4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tCi0JPHRleHQ6Ym9va21hcmstc3RhcnQgLz4gYW5kIDx0ZXh0OmJvb2ttYXJrLWVuZCAvPiBjYW4KLQliZSBvbiBub24td2VsbGZvcm1lZCBib3VuZGFyaWVzLiBUaGUgcXVpY2tlc3Qgc29sdXRpb24gaXMKLQl0byBjcmVhdGUgYW4gPGEgbmFtZT0iIj48L2E+IGVsZW1lbnQuCi0JCi0JSWYgeW91IGRvbid0IHB1dCBpbiBhbnkgY29udGVudCwgaXQgYmVjb21lcyBhbiBlbXB0eSBlbGVtZW50LAotCXdoaWNoIHdpbGwgY29uZnVzZSBicm93c2Vycy4gV2hpbGUgd2Ugd291bGQgbG92ZSB0byBpbnNlcnQKLQlhIHplcm8td2lkdGggbm9uLWJyZWFraW5nIHNwYWNlIChVbmljb2RlIDB4MjAwYiksIEludGVybmV0Ci0JRXhwbG9yZXIgZG9lc24ndCByZWNvZ25pemUgaXQuICBIZW5jZSB0aGlzIHVnbHkgaGFjazoKLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dDpib29rbWFyay1zdGFydHx0ZXh0OmJvb2ttYXJrIj4KLTxhIG5hbWU9IntAdGV4dDpuYW1lfSI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMHB4Ij48eHNsOnRleHQ+IDwveHNsOnRleHQ+PC9zcGFuPjwvYT4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tCi0JVGhpcyB0ZW1wbGF0ZSBpcyB0b28gZGFuZ2Vyb3VzIHRvIGxlYXZlIGFjdGl2ZS4uLgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dCgpIj4KLQk8eHNsOmlmIHRlc3Q9Im5vcm1hbGl6ZS1zcGFjZSguKSAhPScnIj4KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vcm1hbGl6ZS1zcGFjZSguKSIvPgotCTwveHNsOmlmPgotPC94c2w6dGVtcGxhdGU+Ci0tLT4KLQotPCEtLQotCVRoaXMgaXMgYSBsaXN0IG9mIGZvOiBhdHRyaWJ1dGVzIHRvIGJlIHRyYW5zZmVycmVkIHRvIHRoZQotCW91dHB1dCBkb2N1bWVudC4gVGhlIGFjdGlvbiB0ZWxscyB3aGljaCB0ZW1wbGF0ZSBpcyB0byBiZQotCWNhbGxlZCB0byBwcm9jZXNzIHRoZSBhdHRyaWJ1dGUuCi0tLT4KLTxpbnQ6YXR0ci1tYXA+Ci0JPGludDphdHRyIG5hbWU9ImZvOmJvcmRlci1sZWZ0IiBhY3Rpb249InBhc3MtdGhyb3VnaCIvPgotCTxpbnQ6YXR0ciBuYW1lPSJmbzpib3JkZXItcmlnaHQiIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOmJvcmRlci10b3AiIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOmJvcmRlci1ib3R0b20iIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOmJvcmRlciIgYWN0aW9uPSJwYXNzLXRocm91Z2giLz4KLQk8aW50OmF0dHIgbmFtZT0iZm86bWFyZ2luLWxlZnQiIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOm1hcmdpbi1yaWdodCIgYWN0aW9uPSJwYXNzLXRocm91Z2giLz4KLQk8aW50OmF0dHIgbmFtZT0iZm86bWFyZ2luLXRvcCIgYWN0aW9uPSJwYXNzLXRocm91Z2giLz4KLQk8aW50OmF0dHIgbmFtZT0iZm86bWFyZ2luLWJvdHRvbSIgYWN0aW9uPSJwYXNzLXRocm91Z2giLz4KLQk8aW50OmF0dHIgbmFtZT0iZm86bWFyZ2luIiBhY3Rpb249InBhc3MtdGhyb3VnaCIvPgotCTxpbnQ6YXR0ciBuYW1lPSJmbzpwYWRkaW5nLWxlZnQiIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOnBhZGRpbmctcmlnaHQiIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOnBhZGRpbmctdG9wIiBhY3Rpb249InBhc3MtdGhyb3VnaCIvPgotCTxpbnQ6YXR0ciBuYW1lPSJmbzpwYWRkaW5nLWJvdHRvbSIgYWN0aW9uPSJwYXNzLXRocm91Z2giLz4KLQk8aW50OmF0dHIgbmFtZT0iZm86cGFkZGluZyIgYWN0aW9uPSJwYXNzLXRocm91Z2giLz4KLQk8aW50OmF0dHIgbmFtZT0iZm86dGV4dC1pbmRlbnQiIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOmZvbnQtdmFyaWFudCIgYWN0aW9uPSJwYXNzLXRocm91Z2giLz4KLQk8aW50OmF0dHIgbmFtZT0iZm86Zm9udC1mYW1pbHkiIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOmNvbG9yIiBhY3Rpb249InBhc3MtdGhyb3VnaCIvPgotCTxpbnQ6YXR0ciBuYW1lPSJmbzpiYWNrZ3JvdW5kLWNvbG9yIiBhY3Rpb249InBhc3MtdGhyb3VnaCIvPgotCTxpbnQ6YXR0ciBuYW1lPSJmbzpmb250LXN0eWxlIiBhY3Rpb249InBhc3MtdGhyb3VnaCIvPgotCTxpbnQ6YXR0ciBuYW1lPSJmbzpmb250LXdlaWdodCIgYWN0aW9uPSJwYXNzLXRocm91Z2giLz4KLQk8aW50OmF0dHIgbmFtZT0iZm86bGluZS1oZWlnaHQiIGFjdGlvbj0icGFzcy10aHJvdWdoIi8+Ci0JPGludDphdHRyIG5hbWU9ImZvOnRleHQtYWxpZ24iIGFjdGlvbj0iY2hlY2stYWxpZ24iLz4KLTwvaW50OmF0dHItbWFwPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC94c2x0L29wZW5kb2N1bWVudDJ4aHRtbC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9vcGVuZG9jdW1lbnQveHNsdC9vcGVuZG9jdW1lbnQyeGh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRmYzFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL29wZW5kb2N1bWVudC94c2x0L29wZW5kb2N1bWVudDJ4aHRtbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOm9mZmljZT0idXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpvZmZpY2U6MS4wIgotICB4bWxuczp0ZXh0PSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnRleHQ6MS4wIgotICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKLT4KLTx4c2w6aW1wb3J0IGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9vcGVuZG9jdW1lbnQveHNsdC9jb21tb24vb2R0X3RvX3hodG1sLnhzbCIvPgotCi08IS0tIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlIC0tPgotPHhzbDpwYXJhbSBuYW1lPSJyZW5kZXJ0eXBlIiBzZWxlY3Q9IidudWxsJyIvPgotPHhzbDpwYXJhbSBuYW1lPSJsYW5ndWFnZSIgc2VsZWN0PSInbm9uZSciLz4KLTx4c2w6cGFyYW0gbmFtZT0ibm9kZWlkIiBzZWxlY3Q9IidudWxsJyIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJvZmZpY2U6ZG9jdW1lbnQtY29udGVudCI+Ci0gIDxkaXYgaWQ9ImJvZHkiPgotPCEtLQotTGFuZ3VhZ2U6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGFuZ3VhZ2UiLz4KLS0tPgotICAgIDxoMT5PcGVuRG9jdW1lbnQgQ29udGVudCAoPGEgaHJlZj0ieyRub2RlaWR9Lm9kdCI+T0RUPC9hPik8L2gxPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ib2ZmaWNlOmJvZHkvb2ZmaWNlOnRleHQiLz4KLSAgPC9kaXY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcHJldHR5cHJpbnRpbmcvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9wcmV0dHlwcmludGluZy9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4MzI0MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9wcmV0dHlwcmludGluZy9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnByZXR0eXByaW50aW5nPC9pZD4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjI8L3ZlcnNpb24+Ci0gIDxuYW1lPlhNTCBwcmV0dHktcHJpbnRpbmc8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPlRoaXMgbW9kdWxlIGNvbnRhaW5zIGFuIFhNTCBwcmV0dHkgcHJpbnRpbmcgc3R5bGVzaGVldCB0aGF0Ci0gIHdpbGwgYmVoYXZlIGNvcnJlY3RseSB3cnQgd2hpdGVzcGFjZSBpbiBYSFRNTC48L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9wcmV0dHlwcmludGluZy94c2x0L3htbDJuaWNleG1sLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3ByZXR0eXByaW50aW5nL3hzbHQveG1sMm5pY2V4bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTYzOTllLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3ByZXR0eXByaW50aW5nL3hzbHQveG1sMm5pY2V4bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotPCEtLSAKLSAgIHhtbCBwcmV0dHlwcmludGVyIGZvciBhcGFjaGUgY29jb29uL2xlbnlhLCBjb250cmlidXRlZCBieSA8bmV0dGluZ3NAYXBhY2hlLm9yZz4KLSAgIGV2ZXJ5dGhpbmcgdGhhdCBpcyBub24tdHJpdmlhbCBpbiB0aGlzIHNjcmlwdCBoYXMgYmVlbiBib3Jyb3dlZCBmcm9tIHNvbWV3aGVyZS4KLSAgIHRoaXMgc2NyaXB0IGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiLz4KLQotPHhzbDpwYXJhbSBuYW1lPSJpbmRlbnQtaW5jcmVtZW50IiBzZWxlY3Q9IicgICciIC8+Ci0KLSAgPCEtLSAKLSAgICBpbmRlbnRhdGlvbgotICAgIHRoYW5rcyB0byBKb2huIE1vbmdhbiwgdGFrZW4gZnJvbSBodHRwOi8vd3d3LmRwYXdzb24uY28udWsveHNsL3NlY3QyL3ByZXR0eS5odG1sCi0gIC0tPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IioiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IicmI3hBOyciLz4KLQotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+Ci0KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAKiIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9ImNvbmNhdCgkaW5kZW50LCAkaW5kZW50LWluY3JlbWVudCkiLz4KLSAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgIDwhLS0gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBpZiB0aGUgbm9kZSBoYXMgY2hpbGRyZW4gYW5kIGlzIG5vdCBhIG1peGVkIGNvbnRlbnQgbm9kZSAtLT4KLSAgICAgIDx4c2w6aWYgdGVzdD0iKiBhbmQgbm90KCpbLi4vdGV4dCgpW25vcm1hbGl6ZS1zcGFjZSguKSAhPSAnJ11dKSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDpjb3B5PgotICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbW1lbnQoKXxwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkiPgotICAgICAgPHhzbDpjb3B5IC8+Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tIAotICAgIG1peGVkIGNvbnRlbnQgZGV0ZWN0aW9uIGFuZCBoYW5kbGluZwotICAgIHRoYW5rcyB0byBEYXZpZCBDYXJsaXNsZSBhbmQgV2VuZGVsbCBQaWV6LCB0YWtlbiBmcm9tIGh0dHA6Ly93d3cuZHBhd3Nvbi5jby51ay94c2wvc2VjdDIvbm9ybWFsaXNlLmh0bWwjZDcyMDZlNTIgCi0gIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIqWy4uL3RleHQoKVtub3JtYWxpemUtc3BhY2UoLikgIT0gJyddXSI+Ci0gICAgPCEtLSBidXQgdGhpcyB0ZW1wbGF0ZSBtYXRjaGVzIGFueSBlbGVtZW50IGFwcGVhcmluZyBpbiBtaXhlZCBjb250ZW50IC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGV4dGJlZm9yZSIKLSAgICAgICAgIHNlbGVjdD0icHJlY2VkaW5nLXNpYmxpbmc6Om5vZGUoKVsxXVtzZWxmOjp0ZXh0KCldIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXh0YWZ0ZXIiCi0gICAgICAgICBzZWxlY3Q9ImZvbGxvd2luZy1zaWJsaW5nOjpub2RlKClbMV1bc2VsZjo6dGV4dCgpXSIvPgotICAgIDwhLS0gRWl0aGVyIG9mIHRoZSBwcmVjZWRpbmcgdmFyaWFibGVzIHdpbGwgYmUgYW4gZW1wdHkgbm9kZSBzZXQgCi0gICAgICAgICBpZiB0aGUgbmVpZ2hib3Igbm9kZSBpcyBub3QgdGV4dCgpLCByaWdodD8gLS0+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmV2Y2hhciIKLSAgICAgICAgIHNlbGVjdD0ic3Vic3RyaW5nKCR0ZXh0YmVmb3JlLCBzdHJpbmctbGVuZ3RoKCR0ZXh0YmVmb3JlKSkiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5leHRjaGFyIgotICAgICAgICAgc2VsZWN0PSJzdWJzdHJpbmcoJHRleHRhZnRlciwgMSwgMSkiLz4KLSAgCi0gICAgPCEtLSBOb3cgdGhlIGFjdGlvbjogLS0+Ci0gICAgPHhzbDppZiB0ZXN0PSIkcHJldmNoYXIgIT0gbm9ybWFsaXplLXNwYWNlKCRwcmV2Y2hhcikiPgotICAgIDwhLS0gSWYgdGhlIG9yaWdpbmFsIHRleHQgaGFkIGEgc3BhY2UgYmVmb3JlLCBhZGQgb25lIGJhY2sgLS0+Ci0gICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgPC94c2w6aWY+Ci0gIAotICAgIDx4c2w6Y29weT4KLSAgICA8IS0tIENvcHkgdGhlIGVsZW1lbnQgb3ZlciAtLT4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IkAqIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6Y29weT4KLSAgCi0gICAgPHhzbDppZiB0ZXN0PSIkbmV4dGNoYXIgIT0gbm9ybWFsaXplLXNwYWNlKCRuZXh0Y2hhcikiPgotICAgIDwhLS0gSWYgdGhlIG9yaWdpbmFsIHRleHQgaGFkIGEgc3BhY2UgYWZ0ZXIsIGFkZCBvbmUgYmFjayAtLT4KLSAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICA8L3hzbDppZj4KLSAgCi0gIDwveHNsOnRlbXBsYXRlPgotCi08IS0tCi0gIG5vcm1hbGl6ZSBhbGwgd2hpdGVzcGFjZSBpbiB0ZXh0IG5vZGVzIChpLmUuIHRob3NlIHRoYXQgZG9uJ3QgZ2V0IG1hdGNoZWQgYnkgdGhlIG1peGVkIGNvbnRlbnQgaGFuZGxlcikKLS0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KCkiPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub3JtYWxpemUtc3BhY2UoLikiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0KLSAgbGVhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSB4aHRtbCBwcmUgdGFnIGFsb25lIHRvIHByZXNlcnZlIGludGVuZGVkIGZvcm1hdHRpbmcKLS0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpwcmUvbm9kZSgpIj4KLSAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIuIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Byb2ZpbGluZy9jb25maWcvbWVudS54c3AgYi90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcvY29uZmlnL21lbnUueHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU0NTFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Byb2ZpbGluZy9jb25maWcvbWVudS54c3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICAgfAotICAgfCAgTGVueWEgbWVudS54c3AKLSAgIHwKLSAgIC0tPgotCi0KLTx4c3A6cGFnZSAKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gICAgeG1sbnM6aW5wdXQ9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi94c3AvaW5wdXQvMS4wIgotICAgIHhtbG5zOnhzcD0iaHR0cDovL2FwYWNoZS5vcmcveHNwIgotICAgIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiCi0gICAgbGFuZ3VhZ2U9ImphdmEiCi0+Ci0gICA8bWVudT4KLSAgICAgIDxtZW51cz4KLSAgICAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iRGV2ZWxvcG1lbnQiPgotICAgICAgICAgICAgPGJsb2NrPgotICAgICAgICAgICAgICAgPCEtLSAKLSAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIG5hc3R5IGtpbmQgb2YgaGFjay4gVGhlIGdvYWwgaXMgdG8gb3BlbiAKLSAgICAgICAgICAgICAgICAgICAgdGhlIHByb2ZpbGVyIG91dHB1dCBpbiBhIHNlcGFyYXRlIHdpbmRvdyB3aXRoIEphdmFzY3JpcHQuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBVc2VjYXNlTWVudVRyYW5zZm9ybWVyIHdpbGwgb25seSBhY2NlcHQgYSBocmVmPSIiIAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsIGkuZS4gd2UgY2FuJ3QgdXNlIG9uY2xpY2s9IiIgb3IgdGFyZ2V0PSIiIGhlcmUuIAotICAgICAgICAgICAgICAgICAgICBUbyBtYWtlIHN1cmUgdGhlIHdpbmRvdyBhbHdheXMgcG9wcyB1cCBpbiBmcm9udCwKLSAgICAgICAgICAgICAgICAgICAgd2UgZm9jdXMoKSBpdC4KLSAgICAgICAgICAgICAgICAgICAgQXQgdGhlIHNhbWUgdGltZSwgd2Ugd2FudCB0aGUgb3JpZ2luYWwgd2luZG93IHRvIHJlbWFpbiAKLSAgICAgICAgICAgICAgICAgICAgdW5jaGFuZ2VkLCBzbyB3ZSB1c2UgdGhlICJ2b2lkIiBvcGVyYXRvciB0byBzdXBwcmVzcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIG9mIHRoZSB3aG9sZSBleHByZXNzaW9uLiAKLSAgICAgICAgICAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgdGhlIHdlYmFwcCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCBtYW51YWxseSwgYmVjYXVzZSBMZW55YSdzIFByb3h5VHJhbnNmb3JtZXIgY2FuJ3QgCi0gICAgICAgICAgICAgICAgICAgIHJlYWNoIGludG8gdGhpcyBqYXZhc2NyaXB0OiBsaW5rLgotICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgPGl0ZW0+Ci0gICAgICAgICAgICAgICAgIDx4c3A6YXR0cmlidXRlPiAKLSAgICAgICAgICAgICAgICAgICA8eHNwOnBhcmFtIG5hbWU9Im5hbWUiPmhyZWY8L3hzcDpwYXJhbT4KLSAgICAgICAgICAgICAgICAgICA8eHNwOmV4cHI+ImphdmFzY3JpcHQ6dm9pZCB3aW5kb3cub3BlbignIgotICAgICAgICAgICAgICAgICAgICArIDxpbnB1dDpnZXQtYXR0cmlidXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZT0icHJveHkiIAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzPSJzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ii9tb2R1bGVzL3Byb2ZpbGluZy9wcm9maWxlLmh0bWwiCi0gICAgICAgICAgICAgICAgICAgICAgLz4gCi0gICAgICAgICAgICAgICAgICAgICsgIicsIgotICAgICAgICAgICAgICAgICAgICArICInQ29jb29uIFByb2ZpbGVyJywiCi0gICAgICAgICAgICAgICAgICAgICsgIidsb2NhdGlvbj15ZXMsc2Nyb2xsYmFycz15ZXMsbWVudWJhcj1ubywiCi0gICAgICAgICAgICAgICAgICAgICsgInRvb2xiYXI9bm8sc3RhdHVzPXllcyx0b3A9MTAwLGxlZnQ9MTAwLCIKLSAgICAgICAgICAgICAgICAgICAgKyAiaGVpZ2h0PTUwMCx3aWR0aD03MDAnIgotICAgICAgICAgICAgICAgICAgICArICIpLmZvY3VzKCkiCi0gICAgICAgICAgICAgICAgICAgPC94c3A6ZXhwcj4KLSAgICAgICAgICAgICAgICAgPC94c3A6YXR0cmlidXRlPiAKLSAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD5Qcm9maWxpbmc8L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgIDwvaXRlbT4KLSAgICAgICAgICAgIDwvYmxvY2s+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L21lbnVzPgotICAgPC9tZW51PgotPC94c3A6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjBjOGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcHJvZmlsaW5nL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMucHJvZmlsaW5nPC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMucHJldHR5cHJpbnRpbmciLz4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjAuMzwvdmVyc2lvbj4KLSAgPG5hbWU+Q29jb29uIFBpcGVsaW5lIFByb2ZpbGluZyBNb2R1bGU8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPk1ha2VzIHRoZSBDb2Nvb24gcHJvZmlsaW5nIG1lY2hhbmlzbSBhdmFpbGFibGUgdG8gTGVueWEgc2l0ZQotYWRtaW5pc3RyYXRvcnMuIFNlZSBhbHNvCi1odHRwOi8vY29jb29uLmFwYWNoZS5vcmcvMi4xL3VzZXJkb2NzL2NvbmNlcHRzL3Byb2ZpbGVyLmh0bWw8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcHJvZmlsaW5nL21lbnVzLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcvbWVudXMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwNzExOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcvbWVudXMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICAgPG1hcDpwaXBlbGluZXM+Ci0gICAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKiI+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImNvbmZpZy9tZW51LnhzcCI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InNlcnZsZXQtY29udGV4dCIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9tYXA6Z2VuZXJhdGU+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgPC9tYXA6cGlwZWxpbmU+Ci0gICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Byb2ZpbGluZy9yZXNvdXJjZXMvY3NzL3htbHZlcmJhdGltLmNzcyBiL3RydW5rL3NyYy9tb2R1bGVzL3Byb2ZpbGluZy9yZXNvdXJjZXMvY3NzL3htbHZlcmJhdGltLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5ZDE0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcvcmVzb3VyY2VzL2Nzcy94bWx2ZXJiYXRpbS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0ueG1sdmVyYi1kZWZhdWx0ICAgICAgICAgIHsgY29sb3I6ICMzMzMzMzM7IGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSB9Ci0ueG1sdmVyYi1lbGVtZW50LW5hbWUgICAgIHsgY29sb3I6ICM5OTAwMDAgfQotLnhtbHZlcmItZWxlbWVudC1uc3ByZWZpeCB7IGNvbG9yOiAjNjY2NjAwIH0KLS54bWx2ZXJiLWF0dHItbmFtZSAgICAgICAgeyBjb2xvcjogIzY2MDAwMCB9Ci0ueG1sdmVyYi1hdHRyLWNvbnRlbnQgICAgIHsgY29sb3I6ICMwMDAwOTk7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS54bWx2ZXJiLW5zLW5hbWUgICAgICAgICAgeyBjb2xvcjogIzY2NjYwMCB9Ci0ueG1sdmVyYi1ucy11cmkgICAgICAgICAgIHsgY29sb3I6ICMzMzAwOTkgfQotLnhtbHZlcmItdGV4dCAgICAgICAgICAgICB7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZCB9Ci0ueG1sdmVyYi1jb21tZW50ICAgICAgICAgIHsgY29sb3I6ICMwMDY2MDA7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0ueG1sdmVyYi1waS1uYW1lICAgICAgICAgIHsgY29sb3I6ICMwMDY2MDA7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0ueG1sdmVyYi1waS1jb250ZW50ICAgICAgIHsgY29sb3I6ICMwMDY2NjY7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Byb2ZpbGluZy9zaXRlbWFwLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQ3MDUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Byb2ZpbGluZy9zaXRlbWFwLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotPG1hcDpjb21wb25lbnRzPgotICA8bWFwOmdlbmVyYXRvcnMgZGVmYXVsdD0iZmlsZSI+Ci0gICAgPG1hcDpnZW5lcmF0b3IgbGFiZWw9ImNvbnRlbnQsZGF0YSIgbG9nZ2VyPSJzaXRlbWFwLmdlbmVyYXRvci5wcm9maWxlciIgbmFtZT0icHJvZmlsZXIiCi0gICAgICAgIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uZ2VuZXJhdGlvbi5Qcm9maWxlckdlbmVyYXRvciIvPgotICA8L21hcDpnZW5lcmF0b3JzPgotPC9tYXA6Y29tcG9uZW50cz4KLQotPG1hcDp2aWV3cz4KLSAgPG1hcDp2aWV3IG5hbWU9InByZXR0eS1jb250ZW50IiBmcm9tLWxhYmVsPSJkYXRhIj4KLSAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9wcmV0dHlwcmludGluZy94c2x0L3htbDJuaWNleG1sLnhzbCIvPgotICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0ieHNsdC94bWx2ZXJiYXRpbXdyYXBwZXIueHNsIj4KLSAgICAgIDxtYXA6cGFyYW1ldGVyIAotICAgICAgICAgIG5hbWU9ImNzcy1zdHlsZXNoZWV0IiAKLSAgICAgICAgICB2YWx1ZT0ie3Byb3h5Oi9tb2R1bGVzL3Byb2ZpbGluZy9jc3MveG1sdmVyYmF0aW0uY3NzfSIKLSAgICAgIC8+Ci0gICAgPC9tYXA6dHJhbnNmb3JtPgotICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ii8+Ci0gICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieGh0bWwiLz4KLSAgPC9tYXA6dmlldz4KLTwvbWFwOnZpZXdzPgotIAotPG1hcDpwaXBlbGluZXM+Ci0gIDxtYXA6cGlwZWxpbmU+Ci0gICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJwcm9maWxlLmh0bWwiPgotICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJwcm9maWxlciIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJ4c2x0L3Byb2ZpbGUyeGh0bWwueHNsIj4KLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlLXJlcXVlc3QtcGFyYW1ldGVycyIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhodG1sIi8+Ci0gICAgPC9tYXA6bWF0Y2g+Ci0gICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJwcm9maWxlLnhtbCI+Ci0gICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InByb2ZpbGVyIi8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9wcmV0dHlwcmludGluZy94c2x0L3htbDJuaWNleG1sLnhzbCIvPgotICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgPC9tYXA6bWF0Y2g+ICAgIAotICA8L21hcDpwaXBlbGluZT4KLTwvbWFwOnBpcGVsaW5lcz4KLQotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Byb2ZpbGluZy94c2x0L3Byb2ZpbGUyeGh0bWwueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvcHJvZmlsaW5nL3hzbHQvcHJvZmlsZTJ4aHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTI5OTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcHJvZmlsaW5nL3hzbHQvcHJvZmlsZTJ4aHRtbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0geG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0geG1sbnM6cHJvZmlsZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3Byb2ZpbGVyLzEuMCI+Ci0KLSAgPHhzbDpwYXJhbSBuYW1lPSJzb3J0Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ia2V5Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icmVzdWx0Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29tcG9uZW50Ii8+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkNvY29vbjIgcHJvZmlsZSBpbmZvcm1hdGlvbiBbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2ZpbGU6cHJvZmlsZXJpbmZvL0BkYXRlIi8+XTwvdGl0bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjb21wb25lbnQhPScnIj4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzCi0gICAgICAgICAgICAgIHNlbGVjdD0icHJvZmlsZTpwcm9maWxlcmluZm8vcHJvZmlsZTpwaXBlbGluZS9wcm9maWxlOnJlc3VsdC9wcm9maWxlOmNvbXBvbmVudFtAaW5kZXg9JGNvbXBvbmVudF0iCi0gICAgICAgICAgICAgIG1vZGU9ImZyYWdtZW50Ii8+Ci0gICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHJlc3VsdCE9JyciPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9maWxlOnByb2ZpbGVyaW5mby9wcm9maWxlOnBpcGVsaW5lL3Byb2ZpbGU6cmVzdWx0IiBtb2RlPSJyZXN1bHQiLz4KLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9maWxlOnByb2ZpbGVyaW5mbyIgbW9kZT0icGlwZWxpbmVzIi8+Ci0gICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9maWxlOnByb2ZpbGVyaW5mbyIgbW9kZT0icGlwZWxpbmVzIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QocHJvZmlsZTpwaXBlbGluZSkiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaGVscCIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotCi0gICAgPHA+Ci0gICAgICBTb3J0IHJlc3VsdHMgYnkgPGEgaHJlZj0iP3NvcnQ9dXJpIj51cmk8L2E+LAotICAgICAgPGEgaHJlZj0iP3NvcnQ9Y291bnQiPmNvdW50PC9hPiwgPGEgaHJlZj0iP3NvcnQ9dGltZSI+dGltZTwvYT4uCi0gICAgPC9wPgotICAgIDxwPgotICAgICAgU3RhcnQgYXQgdGhlIHNlY3Rpb24gd2hpY2ggbWF0Y2hlcyB0aGUgb3JpZ2luYWwgcmVxdWVzdCwgdGhlbiBmb2xsb3cgdGhlCi0gICAgICBwcm9jZXNzaW5nLiBUaGUgcmlnaHQtaGFuZCBjb2x1bW5zIGFyZSB0aGUgdGltZXMgKGluIG1pbGxpc2Vjb25kcykgZm9yIAotICAgICAgZWFjaCBvY2Nhc2lvbiB0aGF0IGEgY29tcG9uZW50IHdhcyBwcm9jZXNzZWQuIFRoZSBmYXIgcmlnaHQgY29sdW1uIGlzCi0gICAgICB0aGUgaW5pdGlhbCBvY2Nhc2lvbi4KLSAgICA8L3A+Ci0KLSAgICAgIAotICAgIDx0YWJsZSBub3NoYWRlPSJub3NoYWRlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCI+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzb3J0ID0gJ3VyaSciPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvZmlsZTpwaXBlbGluZSI+Ci0gICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAdXJpIi8+Ci0gICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNvcnQgPSAndGltZSciPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvZmlsZTpwaXBlbGluZSI+Ci0gICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAdGltZSIgZGF0YS10eXBlPSJudW1iZXIiLz4KLSAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc29ydCA9ICdjb3VudCciPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvZmlsZTpwaXBlbGluZSI+Ci0gICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAY291bnQiIGRhdGEtdHlwZT0ibnVtYmVyIi8+Ci0gICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3RhYmxlPgotCi0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iaGVscCI+Ci0gICAgPHA+Ci0gICAgICBUaGUgPHN0cm9uZz5Db2Nvb24gcHJvZmlsZXI8L3N0cm9uZz4gaXMgYSBncmVhdCB0b29sIHRvIGRlYnVnIGFuZCAKLSAgICAgIHByb2ZpbGUgeW91ciBwaXBlbGluZXMuPGJyIC8+Ci0gICAgICBJbiBvcmRlciB0byB1c2UgaXQsIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgcGlwZWxpbmUgeW91IHdhbnQgdG8gCi0gICAgICBpbnNwZWN0IHRvICJwcm9maWxlLW5vbmNhY2hpbmciLCBsaWtlIHNvOgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIDxjb2RlPgotICAgICAgICAmbHQ7bWFwOnBpcGVsaW5lIHR5cGU9InByb2ZpbGUtbm9uY2FjaGluZyImZ3Q7PGJyIC8+Ci0gICAgICAgIC4uLjxiciAvPgotICAgICAgICAmbHQ7L21hcDpwaXBlbGluZSZndDsKLSAgICAgIDwvY29kZT4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICBPbmNlIHlvdSd2ZSBkb25lIHRoaXMsIGFuZCB5b3UgaGF2ZSBzZW50IGEgY291cGxlIG9mIHJlcXVlc3RzIHRvIAotICAgICAgdGhlIHBpcGVsaW5lIGluIHF1ZXN0aW9uLCB0aGlzIHBhZ2Ugd2lsbCBkaXNwbGF5IHVzZWZ1bCBpbmZvcm1hdGlvbgotICAgICAgYWJvdXQgcHJvY2Vzc2luZyBhbmQgc2V0dXAgdGltZSBvZiB0aGUgaW5kaXZpZHVhbCBwaXBlbGluZSBjb21wb25lbnRzLiAKLSAgICAgIFdoYXQncyBldmVuIG1vcmUgaW50ZXJlc3RpbmcsIHlvdSB3aWxsIGJlIGFibGUgdG8gdmlldyB0aGUgWE1MIAotICAgICAgb3V0cHV0IG9mIGFsbCBpbnRlcm1lZGlhdGUgc3RhZ2VzIQotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIFRvIG1ha2UgcHJvZmlsaW5nIHdvcmssIHRoZSBwcm9maWxlciBibG9jayBpbiBDb2Nvb24gbXVzdCBiZQotICAgICAgaW5jbHVkZWQsIGFuZCB0aGUgcHJvZmlsaW5nIHBpcGVsaW5lIHR5cGUgbmVlZHMgdG8gYmUgZGVjbGFyZWQuIAotICAgICAgTGVueWEgcHJvdmlkZXMgYm90aCBieSBkZWZhdWx0LgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byAKLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jb2Nvb24uYXBhY2hlLm9yZy8yLjEvdXNlcmRvY3MvY29uY2VwdHMvcHJvZmlsZXIuaHRtbCI+dGhlIENvY29vbiBkb2N1bWVudGF0aW9uPC9hPi4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICA8ZW0+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBwcm9maWxpbmcgY29tZXMgd2l0aCBhIHN1YnN0YW50aWFsIAotICAgICAgcGVyZm9ybWFuY2UgcGVuYWx0eSBhbmQgc2hvdWxkIG5vdCBiZSBsZWZ0IGFjdGl2YXRlZCBvbiBwcm9kdWN0aW9uCi0gICAgICBzeXN0ZW1zIHVubGVzcyB5b3UgYXJlIGFjdGl2ZWx5IGRlYnVnZ2luZyB0aGVtLjwvZW0+Ci0gICAgPC9wPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2ZpbGU6cGlwZWxpbmUiPgotICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgNSA9IDEiPgotICAgICAgPHRyIGJnY29sb3I9IiNGRkMwQzAiPgotICAgICAgIDx0aD48L3RoPgotICAgICAgIDx0aD5Db21wb25lbnQ8L3RoPgotICAgICAgIDx0aD5BdmVyYWdlPC90aD4KLSAgICAgICA8dGggY29sc3Bhbj0iMTAiPkxhc3QgUmVzdWx0czwvdGg+Ci0gICAgICA8L3RyPgotICAgIDwveHNsOmlmPgotICAgIDx0ciBiZ2NvbG9yPSIjQzBDMEZGIj4KLSAgICAgPHRkIGNvbHNwYW49IjMiPgotICAgICAgIDxmb250IGZhY2U9InZlcmRhbmEiPjxzdHJvbmc+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1cmkiLz48L3N0cm9uZz48L2ZvbnQ+Ci0gICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY291bnQiLz4gcmVzdWx0cywKLSAgICAgICB0b3RhbCB0aW1lOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByb2Nlc3NpbmdUaW1lIi8+LAotICAgICAgIGF2ZXJhZ2UgdGltZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2ZpbGU6YXZlcmFnZS9AdGltZSIvPikKLSAgICAgPC90ZD4KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb2ZpbGU6cmVzdWx0Ij4KLSAgICAgIDx0ZD4KLSAgICAgICA8YSBocmVmPSI/a2V5PXsuLi9Aa2V5fSZhbXA7cmVzdWx0PXtAaW5kZXh9Ij4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpbmRleCIvPgotICAgICAgIDwvYT4KLSAgICAgIDwvdGQ+Ci0gICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwvdHI+Ci0KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvZmlsZTphdmVyYWdlL3Byb2ZpbGU6Y29tcG9uZW50Ij4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmdjb2xvciI+Ci0gICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMCI+I0QwRDBEMDwveHNsOmlmPgotICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDEiPiNFMEUwRTA8L3hzbDppZj4KLSAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgPHRyIGJnY29sb3I9InskYmdjb2xvcn0iPgotCi0gICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwb3MiIHNlbGVjdD0icG9zaXRpb24oKSIvPgotICAgICAgIDx0ZD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3MiLz4KLSAgICAgICA8L3RkPgotICAgICAgIDx0ZD4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcm9sZSIvPgotICAgICAgICAgPHhzbDp0ZXh0PiYjMTYwOzwveHNsOnRleHQ+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9IkBzb3VyY2UiPgotICAgICAgICAgICA8aT5zcmM9PC9pPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc291cmNlIi8+Ci0gICAgICAgICA8L3hzbDppZj4KLSAgICAgICA8L3RkPgotCi0gICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL3Byb2ZpbGU6YXZlcmFnZS9wcm9maWxlOmNvbXBvbmVudFtwb3NpdGlvbigpPSRwb3NdIj4KLSAgICAgICAgPHRoPgotICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aW1lIi8+Ci0gICAgICAgIDwvdGg+Ci0gICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vcHJvZmlsZTpyZXN1bHQvcHJvZmlsZTpjb21wb25lbnRbcG9zaXRpb24oKT0kcG9zXSI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpbWUiLz4KLSAgICAgICAgPC90ZD4KLSAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgPC90cj4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zIiBzZWxlY3Q9ImNvdW50KHByb2ZpbGU6YXZlcmFnZS9wcm9maWxlOmNvbXBvbmVudCkiLz4KLSAgICAgIDx0cj4KLSAgICAgICA8dGQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zKzEiLz4KLSAgICAgICA8L3RkPgotICAgICAgIDx0ZD4KLSAgICAgICAgVE9UQUwKLSAgICAgICA8L3RkPgotCi0gICAgICAgIDx0aD4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9maWxlOmF2ZXJhZ2UvQHRpbWUiLz4KLSAgICAgICAgPC90aD4KLQotICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9maWxlOnJlc3VsdCI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGltZSIvPgotICAgICAgICA8L3RkPgotICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICA8L3RyPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9maWxlOnJlc3VsdCIgbW9kZT0icmVzdWx0Ij4KLSAgICA8aDE+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2ZpbGU6ZW52aXJvbm1lbnRpbmZvL3Byb2ZpbGU6dXJpIi8+PC9oMT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHIgYmdjb2xvcj0iI0ZGQzBDMCI+Ci0gICAgICAgIDx0aD48L3RoPgotICAgICAgICA8dGg+Q29tcG9uZW50PC90aD4KLSAgICAgICAgPHRoIGNvbHNwYW49IjMiPkVsYXBzZWQgdGltZSBpbiBtczwvdGg+Ci0gICAgICAgIDx0aD5WaWV3IHNvdXJjZTwvdGg+Ci0gICAgICA8L3RyPgotICAgICAgPHRyIGJnY29sb3I9IiNDMEMwRkYiPgotICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgPGZvbnQgZmFjZT0idmVyZGFuYSI+PHN0cm9uZz48eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvZmlsZTplbnZpcm9ubWVudGluZm8vcHJvZmlsZTp1cmkiLz48L3N0cm9uZz48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD5Ub3RhbDwvdGQ+Ci0gICAgICAgIDx0ZD5TZXR1cDwvdGQ+Ci0gICAgICAgIDx0ZD5Qcm9jZXNzaW5nPC90ZD4KLSAgICAgICAgPHRkLz4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9maWxlOmNvbXBvbmVudCI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmdjb2xvciI+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMCI+I0QwRDBEMDwveHNsOmlmPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDEiPiNFMEUwRTA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx0ciBiZ2NvbG9yPSJ7JGJnY29sb3J9Ij4KLQotICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zIiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvcyIvPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByb2xlIi8+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+JiMxNjA7PC94c2w6dGV4dD4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHNvdXJjZSI+Ci0gICAgICAgICAgICAgIDxpPnNyYz08L2k+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb3VyY2UiLz4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpbWUiLz4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXR1cCIvPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByb2Nlc3NpbmciLz4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9IGxhc3QoKSI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9InByb2ZpbGUueG1sP2tleT17JGtleX0mYW1wO3Jlc3VsdD17JHJlc3VsdH0mYW1wO2NvbXBvbmVudD17QGluZGV4fSZhbXA7ZnJhZ21lbnRvbmx5PXRydWUiPltYTUxdPC9hPgotICAgICAgICAgICAgICAmIzE2MDsmIzE2MDsKLSAgICAgICAgICAgICAgPGEgaHJlZj0icHJvZmlsZS54bWw/a2V5PXska2V5fSZhbXA7cmVzdWx0PXskcmVzdWx0fSZhbXA7Y29tcG9uZW50PXtAaW5kZXh9JmFtcDtmcmFnbWVudG9ubHk9dHJ1ZSZhbXA7Y29jb29uLXZpZXc9cHJldHR5LWNvbnRlbnQiPltYTUwgYXMgSFRNTF08L2E+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC90YWJsZT4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InByb2ZpbGU6ZW52aXJvbm1lbnRpbmZvIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2ZpbGU6ZW52aXJvbm1lbnRpbmZvIj4KLSAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvZmlsZTpyZXF1ZXN0LXBhcmFtZXRlcnMiLz4KLSAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvZmlsZTpzZXNzaW9uLWF0dHJpYnV0ZXMiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvZmlsZTpyZXF1ZXN0LXBhcmFtZXRlcnMiPgotICAgIDx0YWJsZT4KLSAgICAgIDx0ciBiZ2NvbG9yPSIjQzBDMEZGIj4KLSAgICAgICA8dGggY29sc3Bhbj0iMiI+Ci0gICAgICAgIFJlcXVlc3QgcGFyYW1ldGVycwotICAgICAgIDwvdGg+Ci0gICAgICA8L3RyPgotICAgICAgPHRyIGJnY29sb3I9IiNGRkMwQzAiPgotICAgICAgICA8dGg+TmFtZTwvdGg+Ci0gICAgICAgIDx0aD5WYWx1ZTwvdGg+Ci0gICAgICA8L3RyPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb2ZpbGU6cGFyYW1ldGVyIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiZ2NvbG9yIj4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj4jRDBEMEQwPC94c2w6aWY+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+I0UwRTBFMDwveHNsOmlmPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8dHIgYmdjb2xvcj0ieyRiZ2NvbG9yfSI+Ci0gICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+Ci0gICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC90YWJsZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvZmlsZTpzZXNzaW9uLWF0dHJpYnV0ZXMiPgotICAgIDx0YWJsZT4KLSAgICAgIDx0ciBiZ2NvbG9yPSIjQzBDMEZGIj4KLSAgICAgICA8dGggY29sc3Bhbj0iMiI+Ci0gICAgICAgIFNlc3Npb24gYXR0cmlidXRlcwotICAgICAgIDwvdGg+Ci0gICAgICA8L3RyPgotICAgICAgPHRyIGJnY29sb3I9IiNGRkMwQzAiPgotICAgICAgICA8dGg+TmFtZTwvdGg+Ci0gICAgICAgIDx0aD5WYWx1ZTwvdGg+Ci0gICAgICA8L3RyPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb2ZpbGU6YXR0cmlidXRlIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiZ2NvbG9yIj4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj4jRDBEMEQwPC94c2w6aWY+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+I0UwRTBFMDwveHNsOmlmPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8dHIgYmdjb2xvcj0ieyRiZ2NvbG9yfSI+Ci0gICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+Ci0gICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC90YWJsZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcveHNsdC94bWx2ZXJiYXRpbS54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcveHNsdC94bWx2ZXJiYXRpbS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTkxZDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcHJvZmlsaW5nL3hzbHQveG1sdmVyYmF0aW0ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCEtLQotICBYTUwgdG8gSFRNTCBWZXJiYXRpbSBGb3JtYXR0ZXIgd2l0aCBTeW50YXggSGlnaGxpZ2h0aW5nCi0gIFZlcnNpb24gMS4xCi0gIENvbnRyaWJ1dG9yczogRG91ZyBEaWNrcywgYWRkZWQgYXV0by1pbmRlbnQgKHBhcmFtZXRlciBpbmRlbnQtZWxlbWVudHMpCi0gICAgICAgICAgICAgICAgZm9yIHByZXR0eS1wcmludAotCi0gIENvcHlyaWdodCAyMDAyIE9saXZlciBCZWNrZXIKLSAgb2JAb2Jxby5kZQotIAotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIAotICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpLgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgeG1sbnM6dmVyYj0iaHR0cDovL2luZm9ybWF0aWsuaHUtYmVybGluLmRlL3htbHZlcmJhdGltIgotICAgICAgICAgICAgICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ2ZXJiIj4KLQotICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIiBpbmRlbnQ9Im5vIi8+Ci0KLSAgIDx4c2w6cGFyYW0gbmFtZT0iaW5kZW50LWVsZW1lbnRzIiBzZWxlY3Q9ImZhbHNlKCkiIC8+Ci0KLSAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJ4bWx2ZXJiIiAvPgotICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgIDwhLS0gcm9vdCAtLT4KLSAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iIG1vZGU9InhtbHZlcmIiPgotICAgICAgPHhzbDp0ZXh0PiYjeEE7PC94c2w6dGV4dD4KLSAgICAgIDx4c2w6Y29tbWVudD4KLSAgICAgICAgIDx4c2w6dGV4dD4gY29udmVydGVkIGJ5IHhtbHZlcmJhdGltLnhzbCAxLjEsIChjKSBPLiBCZWNrZXIgPC94c2w6dGV4dD4KLSAgICAgIDwveHNsOmNvbW1lbnQ+Ci0gICAgICA8eHNsOnRleHQ+JiN4QTs8L3hzbDp0ZXh0PgotICAgICAgPGRpdiBjbGFzcz0ieG1sdmVyYi1kZWZhdWx0Ij4KLSAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9InhtbHZlcmIiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudC1lbGVtZW50cyIgc2VsZWN0PSIkaW5kZW50LWVsZW1lbnRzIiAvPgotICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgPC9kaXY+Ci0gICAgICA8eHNsOnRleHQ+JiN4QTs8L3hzbDp0ZXh0PgotICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgIDwhLS0gd3JhcHBlciAtLT4KLSAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InZlcmI6d3JhcHBlciI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJ4bWx2ZXJiIj4KLSAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQtZWxlbWVudHMiIHNlbGVjdD0iJGluZGVudC1lbGVtZW50cyIgLz4KLSAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgIDwveHNsOnRlbXBsYXRlPgotCi0gICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ2ZXJiOndyYXBwZXIiIG1vZGU9InhtbHZlcmIiPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0ieG1sdmVyYiI+Ci0gICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50LWVsZW1lbnRzIiBzZWxlY3Q9IiRpbmRlbnQtZWxlbWVudHMiIC8+Ci0gICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgPCEtLSBlbGVtZW50IG5vZGVzIC0tPgotICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiIgbW9kZT0ieG1sdmVyYiI+Ci0gICAgICA8eHNsOnBhcmFtIG5hbWU9ImluZGVudC1lbGVtZW50cyIgc2VsZWN0PSJmYWxzZSgpIiAvPgotICAgICAgPHhzbDpwYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iJyciIC8+Ci0gICAgICA8eHNsOnBhcmFtIG5hbWU9ImluZGVudC1pbmNyZW1lbnQiIHNlbGVjdD0iJyYjeEEwOyYjeEEwOyYjeEEwOyciIC8+Ci0gICAgICA8eHNsOmlmIHRlc3Q9IiRpbmRlbnQtZWxlbWVudHMiPgotICAgICAgICAgPGJyLz4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50IiAvPgotICAgICAgPC94c2w6aWY+Ci0gICAgICA8eHNsOnRleHQ+Jmx0OzwveHNsOnRleHQ+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5zLXByZWZpeCIKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKG5hbWUoKSwnOicpIiAvPgotICAgICAgPHhzbDppZiB0ZXN0PSIkbnMtcHJlZml4ICE9ICcnIj4KLSAgICAgICAgIDxzcGFuIGNsYXNzPSJ4bWx2ZXJiLWVsZW1lbnQtbnNwcmVmaXgiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRucy1wcmVmaXgiLz4KLSAgICAgICAgIDwvc3Bhbj4KLSAgICAgICAgIDx4c2w6dGV4dD46PC94c2w6dGV4dD4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHNwYW4gY2xhc3M9InhtbHZlcmItZWxlbWVudC1uYW1lIj4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsb2NhbC1uYW1lKCkiLz4KLSAgICAgIDwvc3Bhbj4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG5zIiBzZWxlY3Q9Ii4uL25hbWVzcGFjZTo6KiIvPgotICAgICAgPHhzbDppZiB0ZXN0PSIkcG5zW25hbWUoKT0nJ10gYW5kIG5vdChuYW1lc3BhY2U6OipbbmFtZSgpPScnXSkiPgotICAgICAgICAgPHNwYW4gY2xhc3M9InhtbHZlcmItbnMtbmFtZSI+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+IHhtbG5zPC94c2w6dGV4dD4KLSAgICAgICAgIDwvc3Bhbj4KLSAgICAgICAgIDx4c2w6dGV4dD49JnF1b3Q7JnF1b3Q7PC94c2w6dGV4dD4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5hbWVzcGFjZTo6KiI+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkcG5zW25hbWUoKT1uYW1lKGN1cnJlbnQoKSkgYW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLj1jdXJyZW50KCldKSI+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ieG1sdmVyYi1ucyIgLz4KLSAgICAgICAgIDwveHNsOmlmPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQCoiPgotICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InhtbHZlcmItYXR0cnMiIC8+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vZGUoKSI+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+Jmd0OzwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJ4bWx2ZXJiIj4KLSAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudC1lbGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJGluZGVudC1lbGVtZW50cyIvPgotICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSJjb25jYXQoJGluZGVudCwgJGluZGVudC1pbmNyZW1lbnQpIi8+Ci0gICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQtaW5jcmVtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkaW5kZW50LWluY3JlbWVudCIvPgotICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIqIGFuZCAkaW5kZW50LWVsZW1lbnRzIj4KLSAgICAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIgLz4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDp0ZXh0PiZsdDsvPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5zLXByZWZpeCAhPSAnJyI+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ieG1sdmVyYi1lbGVtZW50LW5zcHJlZml4Ij4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnMtcHJlZml4Ii8+Ci0gICAgICAgICAgICAgICA8L3NwYW4+Ci0gICAgICAgICAgICAgICA8eHNsOnRleHQ+OjwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ4bWx2ZXJiLWVsZW1lbnQtbmFtZSI+Ci0gICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibG9jYWwtbmFtZSgpIi8+Ci0gICAgICAgICAgICA8L3NwYW4+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+Jmd0OzwveHNsOnRleHQ+Ci0gICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+IC8mZ3Q7PC94c2w6dGV4dD4KLSAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgIDwveHNsOmNob29zZT4KLSAgICAgIDx4c2w6aWYgdGVzdD0ibm90KHBhcmVudDo6KikiPjxiciAvPjx4c2w6dGV4dD4mI3hBOzwveHNsOnRleHQ+PC94c2w6aWY+Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgPCEtLSBhdHRyaWJ1dGUgbm9kZXMgLS0+Ci0gICA8eHNsOnRlbXBsYXRlIG5hbWU9InhtbHZlcmItYXR0cnMiPgotICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgPHNwYW4gY2xhc3M9InhtbHZlcmItYXR0ci1uYW1lIj4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKCkiLz4KLSAgICAgIDwvc3Bhbj4KLSAgICAgIDx4c2w6dGV4dD49JnF1b3Q7PC94c2w6dGV4dD4KLSAgICAgIDxzcGFuIGNsYXNzPSJ4bWx2ZXJiLWF0dHItY29udGVudCI+Ci0gICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaHRtbC1yZXBsYWNlLWVudGl0aWVzIj4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXh0IiBzZWxlY3Q9Im5vcm1hbGl6ZS1zcGFjZSguKSIgLz4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJhdHRycyIgc2VsZWN0PSJ0cnVlKCkiIC8+Ci0gICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPC9zcGFuPgotICAgICAgPHhzbDp0ZXh0PiZxdW90OzwveHNsOnRleHQ+Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgPCEtLSBuYW1lc3BhY2Ugbm9kZXMgLS0+Ci0gICA8eHNsOnRlbXBsYXRlIG5hbWU9InhtbHZlcmItbnMiPgotICAgICAgPHhzbDppZiB0ZXN0PSJuYW1lKCkhPSd4bWwnIj4KLSAgICAgICAgIDxzcGFuIGNsYXNzPSJ4bWx2ZXJiLW5zLW5hbWUiPgotICAgICAgICAgICAgPHhzbDp0ZXh0PiB4bWxuczwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5hbWUoKSE9JyciPgotICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pjo8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSgpIi8+Ci0gICAgICAgICA8L3NwYW4+Ci0gICAgICAgICA8eHNsOnRleHQ+PSZxdW90OzwveHNsOnRleHQ+Ci0gICAgICAgICA8c3BhbiBjbGFzcz0ieG1sdmVyYi1ucy11cmkiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgICAgIDwvc3Bhbj4KLSAgICAgICAgIDx4c2w6dGV4dD4mcXVvdDs8L3hzbDp0ZXh0PgotICAgICAgPC94c2w6aWY+Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgPCEtLSB0ZXh0IG5vZGVzIC0tPgotICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGV4dCgpIiBtb2RlPSJ4bWx2ZXJiIj4KLSAgICAgIDxzcGFuIGNsYXNzPSJ4bWx2ZXJiLXRleHQiPgotICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByZWZvcm1hdHRlZC1vdXRwdXQiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiPgotICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imh0bWwtcmVwbGFjZS1lbnRpdGllcyI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSIuIiAvPgotICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgIDwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPC9zcGFuPgotICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgIDwhLS0gY29tbWVudHMgLS0+Ci0gICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb21tZW50KCkiIG1vZGU9InhtbHZlcmIiPgotICAgICAgPHhzbDp0ZXh0PiZsdDshLS08L3hzbDp0ZXh0PgotICAgICAgPHNwYW4gY2xhc3M9InhtbHZlcmItY29tbWVudCI+Ci0gICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJlZm9ybWF0dGVkLW91dHB1dCI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSIuIiAvPgotICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDwvc3Bhbj4KLSAgICAgIDx4c2w6dGV4dD4tLSZndDs8L3hzbDp0ZXh0PgotICAgICAgPHhzbDppZiB0ZXN0PSJub3QocGFyZW50OjoqKSI+PGJyIC8+PHhzbDp0ZXh0PiYjeEE7PC94c2w6dGV4dD48L3hzbDppZj4KLSAgIDwveHNsOnRlbXBsYXRlPgotCi0gICA8IS0tIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIC0tPgotICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIiBtb2RlPSJ4bWx2ZXJiIj4KLSAgICAgIDx4c2w6dGV4dD4mbHQ7PzwveHNsOnRleHQ+Ci0gICAgICA8c3BhbiBjbGFzcz0ieG1sdmVyYi1waS1uYW1lIj4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKCkiLz4KLSAgICAgIDwvc3Bhbj4KLSAgICAgIDx4c2w6aWYgdGVzdD0iLiE9JyciPgotICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgPHNwYW4gY2xhc3M9InhtbHZlcmItcGktY29udGVudCI+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICAgICAgICAgPC9zcGFuPgotICAgICAgPC94c2w6aWY+Ci0gICAgICA8eHNsOnRleHQ+PyZndDs8L3hzbDp0ZXh0PgotICAgICAgPHhzbDppZiB0ZXN0PSJub3QocGFyZW50OjoqKSI+PGJyIC8+PHhzbDp0ZXh0PiYjeEE7PC94c2w6dGV4dD48L3hzbDppZj4KLSAgIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8IS0tICAgICAgICAgICAgICAgICAgICBQcm9jZWR1cmVzIC8gRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgPCEtLSBnZW5lcmF0ZSBlbnRpdGllcyBieSByZXBsYWNpbmcgJiwgIiwgPCBhbmQgPiBpbiAkdGV4dCAtLT4KLSAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iaHRtbC1yZXBsYWNlLWVudGl0aWVzIj4KLSAgICAgIDx4c2w6cGFyYW0gbmFtZT0idGV4dCIgLz4KLSAgICAgIDx4c2w6cGFyYW0gbmFtZT0iYXR0cnMiIC8+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRtcCI+Ci0gICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVwbGFjZS1zdWJzdHJpbmciPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZyb20iIHNlbGVjdD0iJyZndDsnIiAvPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvIiBzZWxlY3Q9IicmYW1wO2d0OyciIC8+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiPgotICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlcGxhY2Utc3Vic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmcm9tIiBzZWxlY3Q9IicmbHQ7JyIgLz4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0byIgc2VsZWN0PSInJmFtcDtsdDsnIiAvPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIj4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZXBsYWNlLXN1YnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZnJvbSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSInJmFtcDsnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9IicmYW1wO2FtcDsnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9IiR0ZXh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICAgICAgPC94c2w6d2l0aC1wYXJhbT4KLSAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgPCEtLSAkdGV4dCBpcyBhbiBhdHRyaWJ1dGUgdmFsdWUgLS0+Ci0gICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGF0dHJzIj4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZXBsYWNlLXN1YnN0cmluZyI+Ci0gICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZnJvbSIgc2VsZWN0PSInJiN4QTsnIiAvPgotICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvIiBzZWxlY3Q9IicmYW1wOyN4QTsnIiAvPgotICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZXBsYWNlLXN1YnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZnJvbSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSInJnF1b3Q7JyIgLz4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0byIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSInJmFtcDtxdW90OyciIC8+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRtcCIgLz4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICAgICA8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wIiAvPgotICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgPC94c2w6Y2hvb3NlPgotICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgIDwhLS0gcmVwbGFjZSBpbiAkdmFsdWUgc3Vic3RyaW5nICRmcm9tIHdpdGggJHRvIC0tPgotICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZXBsYWNlLXN1YnN0cmluZyI+Ci0gICAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIiAvPgotICAgICAgPHhzbDpwYXJhbSBuYW1lPSJmcm9tIiAvPgotICAgICAgPHhzbDpwYXJhbSBuYW1lPSJ0byIgLz4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCR2YWx1ZSwkZnJvbSkiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHZhbHVlLCRmcm9tKSIgLz4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG8iIC8+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVwbGFjZS1zdWJzdHJpbmciPgotICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkdmFsdWUsJGZyb20pIiAvPgotICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZyb20iIHNlbGVjdD0iJGZyb20iIC8+Ci0gICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idG8iIHNlbGVjdD0iJHRvIiAvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFsdWUiIC8+Ci0gICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgPCEtLSBwcmVmb3JtYXR0ZWQgb3V0cHV0OiBzcGFjZSBhcyAmbmJzcDssIHRhYiBhcyA4ICZuYnNwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubCBhcyA8YnI+IC0tPgotICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcmVmb3JtYXR0ZWQtb3V0cHV0Ij4KLSAgICAgIDx4c2w6cGFyYW0gbmFtZT0idGV4dCIgLz4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdXRwdXQtbmwiPgotICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlcGxhY2Utc3Vic3RyaW5nIj4KLSAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9InRyYW5zbGF0ZSgkdGV4dCwnICcsJyYjeEEwOycpIiAvPgotICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZyb20iIHNlbGVjdD0iJyYjOTsnIiAvPgotICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9IicmI3hBMDsmI3hBMDsmI3hBMDsmI3hBMDsmI3hBMDsmI3hBMDsmI3hBMDsmI3hBMDsnIiAvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgIDwveHNsOndpdGgtcGFyYW0+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgIDwhLS0gb3V0cHV0IG5sIGFzIDxicj4gLS0+Ci0gICA8eHNsOnRlbXBsYXRlIG5hbWU9Im91dHB1dC1ubCI+Ci0gICAgICA8eHNsOnBhcmFtIG5hbWU9InRleHQiIC8+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucygkdGV4dCwnJiN4QTsnKSI+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkdGV4dCwnJiN4QTsnKSIgLz4KLSAgICAgICAgICAgIDxiciAvPgotICAgICAgICAgICAgPHhzbDp0ZXh0PiYjeEE7PC94c2w6dGV4dD4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdXRwdXQtbmwiPgotICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCR0ZXh0LCcmI3hBOycpIiAvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGV4dCIgLz4KLSAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgIDwveHNsOmNob29zZT4KLSAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcveHNsdC94bWx2ZXJiYXRpbXdyYXBwZXIueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvcHJvZmlsaW5nL3hzbHQveG1sdmVyYmF0aW13cmFwcGVyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5MjFhOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9wcm9maWxpbmcveHNsdC94bWx2ZXJiYXRpbXdyYXBwZXIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCEtLQotICBYTUwgdG8gSFRNTCBWZXJiYXRpbSBGb3JtYXR0ZXIgd2l0aCBTeW50YXggSGlnaGxpZ2h0aW5nCi0gIFZlcnNpb24gMS4xCi0KLSAgQ29weXJpZ2h0IDIwMDIgT2xpdmVyIEJlY2tlcgotICBvYkBvYnFvLmRlCi0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkuCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLSAgIDx4c2w6aW1wb3J0IGhyZWY9InhtbHZlcmJhdGltLnhzbCIgLz4KLQotICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4aHRtbCIvPgotCi0gICA8IS0tIHNlbGVjdCB0aGUgbmFtZSBvZiBhbiBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIGZvcm1hdHRlZAotICAgICAgICAocHJpbnQgb25seSB0aGVzZSBlbGVtZW50cyBhbmQgdGhlaXIgY29udGVudHMpIC0tPgotICAgPHhzbDpwYXJhbSBuYW1lPSJzZWxlY3QiIC8+Ci0KLSAgIDwhLS0gQ1NTIFN0eWxlc2hlZXQgLS0+Ci0gICA8eHNsOnBhcmFtIG5hbWU9ImNzcy1zdHlsZXNoZWV0IiBzZWxlY3Q9InByb2ZpbGluZy5FUlJPUiIgLz4KLQotICAgPCEtLSByb290IC0tPgotICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii8iIG1vZGU9InhtbHZlcmJ3cmFwcGVyIiAvPgotICAgPC94c2w6dGVtcGxhdGU+Ci0KLQotCi0gICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIiBtb2RlPSJ4bWx2ZXJid3JhcHBlciI+Ci0gICAgIDwhLS0KLSAgICAgICBjaGVjayBzaXRlbWFwIHBhcmFtZXRlcnMuCi0gICAgIC0tPgotICAgICA8eHNsOmlmIHRlc3Q9IiRjc3Mtc3R5bGVzaGVldD0ncHJvZmlsaW5nLkVSUk9SJyI+Ci0gICAgICAgPHhzbDptZXNzYWdlIHRlcm1pbmF0ZT0ieWVzIj4KLSAgICAgICAgIE1pc3NpbmcgY3NzLXN0eWxlc2hlZXQgcGFyYW1ldGVyISBDaGVjayB5b3VyIHByb2ZpbGluZyBzaXRlbWFwLgotICAgICAgIDwveHNsOm1lc3NhZ2U+Ci0gICAgIDwveHNsOmlmPgotICAgICAgPGh0bWw+Ci0gICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDx0aXRsZT5YTUwgc291cmNlIHZpZXc8L3RpdGxlPgotICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgCi0JICAgICAgICAgIGhyZWY9InskY3NzLXN0eWxlc2hlZXR9IiAvPgotICAgICAgICAgPC9oZWFkPgotICAgICAgICAgPGJvZHkgY2xhc3M9InhtbHZlcmItZGVmYXVsdCI+Ci0gICAgICAgICAgICA8dHQ+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDwhLS0gInNlbGVjdCIgcGFyYW1ldGVyIHByZXNlbnQ/IC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzZWxlY3QiPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0ieG1sdmVyYndyYXBwZXIiIC8+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InhtbHZlcmIiIC8+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3R0PgotICAgICAgICAgPC9ib2R5PgotICAgICAgPC9odG1sPgotICAgICAgPHhzbDp0ZXh0PiYjeEE7PC94c2w6dGV4dD4KLSAgIDwveHNsOnRlbXBsYXRlPgotCi0gICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIqIiBtb2RlPSJ4bWx2ZXJid3JhcHBlciI+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJuYW1lKCk9JHNlbGVjdCI+Ci0gICAgICAgICAgICA8IS0tIHN3aXRjaCB0byByZW5kZXIgbW9kZSAtLT4KLSAgICAgICAgICAgIDwhLS0gcHJpbnQgaW5kZW50IC0tPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9InhtbHZlcmItdGV4dCI+Ci0gICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJlZm9ybWF0dGVkLW91dHB1dCI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZmluZC1sYXN0LWxpbmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9InByZWNlZGluZy1zaWJsaW5nOjpub2RlKClbMV1bc2VsZjo6dGV4dCgpXSIgLz4KLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgIDwvc3Bhbj4KLSAgICAgICAgICAgIDwhLS0gcHJpbnQgZWxlbWVudCAtLT4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ieG1sdmVyYiIgLz4KLSAgICAgICAgICAgIDxiciAvPjxiciAvPgotICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPCEtLSBsb29rIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCBhbW9uZyB0aGUgY2hpbGRyZW4gLS0+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IioiIG1vZGU9InhtbHZlcmJ3cmFwcGVyIiAvPgotICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgPC94c2w6Y2hvb3NlPgotICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgIDwhLS0gcmV0dXJuIHRoZSBsYXN0IGxpbmUgKGFmdGVyIG5ld2xpbmUpIGluIHBhcmFtZXRlciAkdGV4dCAtLT4KLSAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZmluZC1sYXN0LWxpbmUiPgotICAgICAgPHhzbDpwYXJhbSBuYW1lPSJ0ZXh0IiAvPgotICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHRleHQsJyYjeEE7JykiPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImZpbmQtbGFzdC1saW5lIj4KLSAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXh0IgotICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkdGV4dCwnJiN4QTsnKSIgLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRleHQiIC8+Ci0gICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvbWVkaWEtbWV0YWRhdGEueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL21lZGlhLW1ldGFkYXRhLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2JlZjVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvbWVkaWEtbWV0YWRhdGEueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL21ldGEtZGF0YSINCi0gICAgdW5sZXNzPSIvY29jb29uL21ldGEtZGF0YS9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvbWVkaWEvMS4wJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL21lZGlhLzEuMCINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuQ29uZmlndXJhYmxlRWxlbWVudFNldCI+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZW5hbWUiIG11bHRpcGxlPSJmYWxzZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9IndpZHRoIiBtdWx0aXBsZT0iZmFsc2UiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJoZWlnaHQiIG11bHRpcGxlPSJmYWxzZSIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQotICANCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL21vZHVsZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvbW9kdWxlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmNkZDllLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvbW9kdWxlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi9yZXNvdXJjZS10eXBlcyIgdW5sZXNzPSIvY29jb29uL3Jlc291cmNlLXR5cGVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdyZXNvdXJjZSddIj4KLQotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InJlc291cmNlIgotICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEucmVzb3VyY2V0eXBlcy5yZXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlSW1wbCI+Ci0gICAgPHNjaGVtYSAKLSAgICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9yZXNvdXJjZS9yZXNvdXJjZXMvc2NoZW1hcy9yZXNvdXJjZS5ybmciIAotICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8wLjkiCi0gICAgLz4KLSAgICA8c2FtcGxlIAotICAgICAgIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veG1sIiAKLSAgICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9yZXNvdXJjZS9zYW1wbGVzL3Jlc291cmNlLnhtbCIKLSAgICAvPgotICAgIDxmb3JtYXQgbmFtZT0ieGh0bWwiIHVyaT0iY29jb29uOi8vbW9kdWxlcy9yZXNvdXJjZS94aHRtbC54bWwiLz4KLSAgICA8Zm9ybWF0IG5hbWU9ImRvd25sb2FkTGluayIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL3Jlc291cmNlL2Rvd25sb2FkTGluay54bWwiLz4KLSAgICA8Zm9ybWF0IG5hbWU9Imljb24iIHVyaT0iY29jb29uOi8vbW9kdWxlcy9yZXNvdXJjZS9pY29uIi8+Ci0gICAgPGZvcm1hdCBuYW1lPSJsdWNlbmVJbmRleCIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL3Jlc291cmNlL2x1Y2VuZS1pbmRleCIvPgotICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLQotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jcmVhdGUtcmVzb3VyY2UueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY3JlYXRlLXJlc291cmNlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY3YjJhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS1jcmVhdGUtcmVzb3VyY2UueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAncmVzb3VyY2UuY3JlYXRlJ10iPgotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0icmVzb3VyY2UuY3JlYXRlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEuc2l0ZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DcmVhdGVSZXNvdXJjZSI+Ci0gICAgICA8dmlldyB1cmk9Im1vZHVsZXMvcmVzb3VyY2UvdXNlY2FzZXMvY3JlYXRlLXJlc291cmNlLmp4Ii8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0gIDwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtdXBsb2FkLXJlc291cmNlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLXVwbG9hZC1yZXNvdXJjZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkZjcxNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtdXBsb2FkLXJlc291cmNlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB1c2VjYXNlLWNyZWF0ZS1tZXRhZGF0YS54Y29uZiA3MDgxIDIwMDUtMTEtMTEgMTM6MDQ6MjNaIGZlbGl4ICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdyZXNvdXJjZS51cGxvYWQnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJyZXNvdXJjZS51cGxvYWQiIGxvZ2dlcj0ibGVueWEubW9kdWxlLnJlc291cmNlIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLlVwbG9hZFJlc291cmNlIj4KLSAgICA8dmlldyB1cmk9Im1vZHVsZXMvcmVzb3VyY2UvdXNlY2FzZXMvdXBsb2FkLXJlc291cmNlLmp4Ii8+Ci0gICAgPGV2ZW50IGlkPSJlZGl0Ii8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotICAKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvbWVudXMvcmVzb3VyY2UueHNwIGIvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvY29uZmlnL21lbnVzL3Jlc291cmNlLnhzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMzJmZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvbWVudXMvcmVzb3VyY2UueHNwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiQgLS0+Ci0KLTx4c3A6cGFnZSAKLSAgICBsYW5ndWFnZT0iamF2YSIgCi0gICAgeG1sbnM6eHNwPSJodHRwOi8vYXBhY2hlLm9yZy94c3AiCi0gICAgeG1sbnM6eHNwLXJlcXVlc3Q9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcC9yZXF1ZXN0LzIuMCIKLSAgICB4bWxuczppbnB1dD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3hzcC9pbnB1dC8xLjAiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgICB4bWxuczp3Zj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3dvcmtmbG93LzEuMCIKLSAgICB4bWxuczp1Yz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3VzZWNhc2UvMS4wIgotICAgIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiCi0+Ci0gIDx4c3A6c3RydWN0dXJlPgotICAgIDx4c3A6aW5jbHVkZT5vcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDwveHNwOmluY2x1ZGU+Ci0gICAgPHhzcDppbmNsdWRlPm9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uPC94c3A6aW5jbHVkZT4KLSAgPC94c3A6c3RydWN0dXJlPgotICAKLSAgPG1lbnU+Ci0gICAgPG1lbnVzPgotICAgICAgPG1lbnUgaTE4bjphdHRyPSJuYW1lIiBuYW1lPSJGaWxlIj4KLSAgICAgICAgPGJsb2NrIGFyZWFzPSJzaXRlIGF1dGhvcmluZyIgaWQ9ImNyZWF0ZSI+Ci0gICAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0icmVzb3VyY2UuY3JlYXRlIiBocmVmPSI/ZG9jdHlwZT1yZXNvdXJjZSI+Ci0gICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+TmV3IC4uLiBEb2N1bWVudDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48aTE4bjp0ZXh0PnJlc291cmNlVHlwZS1yZXNvdXJjZTwvaTE4bjp0ZXh0PjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgPC9pdGVtPgotICAgICAgICA8L2Jsb2NrPgotICAgICAgPC9tZW51PgotICAgICAgPG1lbnUgaTE4bjphdHRyPSJuYW1lIiBuYW1lPSJFZGl0Ij4KLSAgICAgICAgPHhzcDpsb2dpYz4KLSAgICAgICAgICBTdHJpbmcgZG9jdHlwZSA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9InN0cmluZyIgbmFtZT0iZG9jdW1lbnQtdHlwZSIvPjsKLSAgICAgICAgICBpZiAoInJlc291cmNlIi5lcXVhbHMoZG9jdHlwZSkpIHsKLSAgICAgICAgICAgIDxibG9jayBhcmVhcz0iYXV0aG9yaW5nIj4KLSAgICAgICAgICAgICAgPGl0ZW0gd2Y6ZXZlbnQ9ImVkaXQiIHVjOnVzZWNhc2U9InJlc291cmNlLnVwbG9hZCIgaHJlZj0iPyI+PGkxOG46dGV4dD5VcGxvYWQgRmlsZTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICAgIDwvYmxvY2s+Ci0gICAgICAgICAgfQotICAgICAgICA8L3hzcDpsb2dpYz4KLSAgICAgIDwvbWVudT4KLSAgICA8L21lbnVzPgotICA8L21lbnU+Ci08L3hzcDpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxZjYyOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxsZW55YTptb2R1bGUgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8bGVueWE6aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnJlc291cmNlPC9sZW55YTppZD4KLSAgPGxlbnlhOmV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzIi8+Ci0gIDxsZW55YTpkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnVzZWNhc2UiLz4KLSAgPGxlbnlhOmRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuc2l0ZW1hbmFnZW1lbnQiLz4KLSAgPGxlbnlhOnBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9sZW55YTpwYWNrYWdlPgotICA8bGVueWE6dmVyc2lvbj4wLjEtZGV2PC9sZW55YTp2ZXJzaW9uPgotICA8bGVueWE6bmFtZT5SZXNvdXJjZSBNb2R1bGU8L2xlbnlhOm5hbWU+Ci0gIDxsZW55YTpsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWE6bGVueWEtdmVyc2lvbj4KLSAgPGxlbnlhOmRlc2NyaXB0aW9uPkEgbW9kdWxlIHRvIG1hbmFnZSBhcmJpdHJhcnkgcmVzb3VyY2VzIChQREYsIEdJRiwgLi4uKTwvbGVueWE6ZGVzY3JpcHRpb24+Ci08L2xlbnlhOm1vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1Jlc291cmNlV3JhcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUmVzb3VyY2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1M2IwNWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUmVzb3VyY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5zZXJ2bGV0Lm11bHRpcGFydC5QYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQuQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuVHJhdmVyc2FibGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0vKioKLSAqIFdyYXBwZXIgdG8gaGFuZGxlIHJlc291cmNlIGRvY3VtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlV3JhcHBlciBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCB7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0lNQUdFX1BKUEVHID0gImltYWdlL3BqcGVnIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9JTUFHRV9KUEVHID0gImltYWdlL2pwZWciOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byB3cmFwLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVdyYXBwZXIoRG9jdW1lbnQgZG9jdW1lbnQsIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICBlbmFibGVMb2dnaW5nKGxvZ2dlcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldERvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmlsZSBUaGUgcGFydCB0byB3cml0ZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShQYXJ0IGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWV0YURhdGFFeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24sCi0gICAgICAgICAgICBSZXBvc2l0b3J5RXhjZXB0aW9uLCBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZmlsZS5nZXRNaW1lVHlwZSgpOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEZpbGVOYW1lKCk7Ci0gICAgICAgIGludCBmaWxlU2l6ZSA9IGZpbGUuZ2V0U2l6ZSgpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGZpbGUuZ2V0SW5wdXRTdHJlYW0oKTsKLQotICAgICAgICB3cml0ZShpbnB1dFN0cmVhbSwgbWltZVR5cGUsIGZpbGVOYW1lLCBmaWxlU2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZSBmcm9tIGEgc291cmNlLgotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkgVGhlIHNvdXJjZSBVUkkuCi0gICAgICogQHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc291cmNlVXJpKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb24sIFJlcG9zaXRvcnlFeGNlcHRpb24sIERvY3VtZW50RXhjZXB0aW9uLCBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgVHJhdmVyc2FibGVTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gKFRyYXZlcnNhYmxlU291cmNlKSByZXNvbHZlci5yZXNvbHZlVVJJKHNvdXJjZVVyaSk7Ci0gICAgICAgICAgICB3cml0ZShzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldE1pbWVUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRDb250ZW50TGVuZ3RoKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLgotICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtIHByb3ZpZGluZyB0aGUgY29udGVudC4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZS4KLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIGZpbGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gZmlsZVNpemUgVGhlIGZpbGUgc2l6ZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBmaWxlTmFtZSwgbG9uZyBmaWxlU2l6ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTWV0YURhdGFFeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFJlcG9zaXRvcnlFeGNlcHRpb24sIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNvdXJjZUJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgSU9VdGlscy5jb3B5KGlucHV0U3RyZWFtLCBzb3VyY2VCb3MpOwotCi0gICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNvdXJjZUJvcy50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICBNZXRhRGF0YSBtZWRpYU1ldGEgPSBudWxsOwotCi0gICAgICAgIE91dHB1dFN0cmVhbSBkZXN0T3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1lZGlhTWV0YSA9IGRvY3VtZW50LmdldE1ldGFEYXRhKCJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhZGF0YS9tZWRpYS8xLjAiKTsKLSAgICAgICAgICAgIGFkZFJlc291cmNlTWV0YShmaWxlTmFtZSwgbWltZVR5cGUsIGlucHV0LCBtZWRpYU1ldGEpOwotCi0gICAgICAgICAgICBkZXN0T3V0cHV0U3RyZWFtID0gZG9jdW1lbnQuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBJT1V0aWxzLndyaXRlKHNvdXJjZUJvcy50b0J5dGVBcnJheSgpLCBkZXN0T3V0cHV0U3RyZWFtKTsKLQotICAgICAgICAgICAgZG9jdW1lbnQuc2V0TWltZVR5cGUobWltZVR5cGUpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZGVzdE91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGVzdE91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGRlc3RPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlc291cmNlOjphZGRSZXNvdXJjZSgpIGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VNZXRhKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIG1pbWVUeXBlLCBJbnB1dFN0cmVhbSBzdHJlYW0sCi0gICAgICAgICAgICBNZXRhRGF0YSBjdXN0b21NZXRhKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGN1c3RvbU1ldGEgIT0gbnVsbCkgewotICAgICAgICAgICAgY3VzdG9tTWV0YS5zZXRWYWx1ZSgiZmlsZW5hbWUiLCBmaWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhblJlYWRNaW1lVHlwZShtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW5wdXQgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsKLSAgICAgICAgICAgIFN0cmluZyB3aWR0aCA9IEludGVnZXIudG9TdHJpbmcoaW5wdXQuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgaGVpZ2h0ID0gSW50ZWdlci50b1N0cmluZyhpbnB1dC5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBjdXN0b21NZXRhLnNldFZhbHVlKCJoZWlnaHQiLCBoZWlnaHQpOwotICAgICAgICAgICAgY3VzdG9tTWV0YS5zZXRWYWx1ZSgid2lkdGgiLCB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBtaW1lIHR5cGUgZGVub3RlcyBhbiBpbWFnZS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZS4KLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVhZE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBJdGVyYXRvciBpdGVyID0gSW1hZ2VJTy5nZXRJbWFnZVJlYWRlcnNCeU1JTUVUeXBlKHRyYW5zbGF0ZU1pbWVUeXBlKG1pbWVUeXBlKSk7Ci0gICAgICAgIHJldHVybiBpdGVyLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHRoZSBtaW1lIHR5cGUgaWYgaXQgY2FuIGJlIHJlYWQsIGJ1dCB0aGUgdG9vbHMgZG9uJ3QgdGhpbmsgc28uCi0gICAgICogRm9yIGV4YW1wbGUsIGFsbCBqcGVncyBmcm9tIElFIGFyZSBtYXJrZWQgYXMgaW1hZ2UvcGpwZWcsIHdoaWNoIEltYWdlSU8KLSAgICAgKiBkb2Vzbid0IHJldHVybiBhIEltYWdlUmVhZGVyIGZvciwgZXZlbiB0aG91Z2ggdGhlIG9uZSBmb3IgaW1hZ2UvanBlZyAKLSAgICAgKiB3b3JrcyBqdXN0IGZpbmUsIGV2ZW4gZm9yIGEgcmVhbCBpbWFnZS9wanBlZy4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZS4KLSAgICAgKiBAcmV0dXJuIFRoZSB0cmFuc2xhdGVkIG9yIG9yaWdpbmFsIG1pbWUgdHlwZSBpZiBubyB0cmFuc2xhdGlvbiB3YXMgYXBwbGllZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgaWYobWltZVR5cGUuZXF1YWxzKE1JTUVfSU1BR0VfUEpQRUcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUlNRV9JTUFHRV9KUEVHOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtaW1lVHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZVJlc291cmNlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZjViMDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DcmVhdGVSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uc2VydmxldC5tdWx0aXBhcnQuUGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyByZXNvdXJjZSBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZVJlc291cmNlIGV4dGVuZHMgQ3JlYXRlRG9jdW1lbnQgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX0ZJTEUgPSAiZmlsZSI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9VUExPQURfRElTQUJMRUQgPSAidXBsb2FkLWRpc2FibGVkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1VQTE9BRF9FTlRFUl9USVRMRSA9ICJ1cGxvYWQtZW50ZXItdGl0bGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfVVBMT0FEX0NIT09TRV9GSUxFID0gInVwbG9hZC1jaG9vc2UtZmlsZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9VUExPQURfU0laRV9FWENFRURFRCA9ICJ1cGxvYWQtc2l6ZS1leGNlZWRlZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9VUExPQURfUkVTRVQgPSAidXBsb2FkLXJlc2V0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1VQTE9BRF9NSVNTSU5HX0VYVEVOU0lPTiA9ICJ1cGxvYWQtbWlzc2luZy1leHRlbnNpb24iOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja1ByZWNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja1ByZWNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKCFTZXJ2bGV0SGVscGVyLmlzVXBsb2FkRW5hYmxlZChtYW5hZ2VyKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKE1FU1NBR0VfVVBMT0FEX0RJU0FCTEVEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLQotICAgICAgICBQYXJ0IGZpbGUgPSBnZXRQYXJ0KFBBUkFNRVRFUl9GSUxFKTsKLSAgICAgICAgaWYgKGhhc0Vycm9ycygpICYmIGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzZXRVcGxvYWRGaWVsZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZShNRVNTQUdFX1VQTE9BRF9DSE9PU0VfRklMRSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuaXNSZWplY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyBJbnRlZ2VyLnRvU3RyaW5nKGZpbGUuZ2V0U2l6ZSgpKSB9OwotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZShNRVNTQUdFX1VQTE9BRF9TSVpFX0VYQ0VFREVELCBwYXJhbXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGJyb3dzZXIgY2FuJ3Qgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBzZWN1cml0eSByZWFzb25zLCBzbyB3ZSBoYXZlIHRvCi0gICAgICogcmVtb3ZlIHRoZSBmaWxlIHBhcmFtZXRlciBhbmQgdGhlIHVzZXIgaGFzIHRvIHNlbGVjdCB0aGUgZmlsZSBhZ2Fpbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNldFVwbG9hZEZpZWxkKCkgewotICAgICAgICBkZWxldGVQYXJhbWV0ZXIoUEFSQU1FVEVSX0ZJTEUpOwotICAgICAgICBhZGRFcnJvck1lc3NhZ2UoTUVTU0FHRV9VUExPQURfUkVTRVQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotICAgICAgICBkZWxldGVQYXJhbWV0ZXIoUkVTT1VSQ0VfVFlQRVMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7Ci0gICAgICAgIGFkZFJlc291cmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgcmVzc291cmNlLiBJZiBhc3NldCB1cGxvYWQgaXMgbm90IGVuYWJsZWQsIGFuIGVycm9yIG1lc3NhZ2UgaXMgYWRkZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2UoKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIERvY3VtZW50RXhjZXB0aW9uLAotICAgICAgICAgICAgUmVwb3NpdG9yeUV4Y2VwdGlvbiwgTWV0YURhdGFFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkFzc2V0czo6YWRkQXNzZXQoKSBjYWxsZWQiKTsKLQotICAgICAgICBQYXJ0IGZpbGUgPSBnZXRQYXJ0KFBBUkFNRVRFUl9GSUxFKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXROZXdEb2N1bWVudCgpOwotICAgICAgICBSZXNvdXJjZVdyYXBwZXIgd3JhcHBlciA9IG5ldyBSZXNvdXJjZVdyYXBwZXIoZG9jdW1lbnQsIHRoaXMubWFuYWdlciwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB3cmFwcGVyLndyaXRlKGZpbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlRXh0ZW5zaW9uKCkgewotICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gIiI7Ci0KLSAgICAgICAgUGFydCBmaWxlID0gZ2V0UGFydChQQVJBTUVURVJfRklMRSk7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgaW50IGxhc3REb3RJbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgIGlmIChsYXN0RG90SW5kZXggPiAtMSkgewotICAgICAgICAgICAgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKE1FU1NBR0VfVVBMT0FEX01JU1NJTkdfRVhURU5TSU9OKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1VwbG9hZFJlc291cmNlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL1VwbG9hZFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDUwNTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9VcGxvYWRSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5zZXJ2bGV0Lm11bHRpcGFydC5QYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy51c2VjYXNlcy5JbnZva2VXb3JrZmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU2VydmxldEhlbHBlcjsKLQotLyoqCi0gKiBVc2VjYXNlIHRvIHVwbG9hZCBhIHJlc291cmNlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRSZXNvdXJjZSBleHRlbmRzIEludm9rZVdvcmtmbG93IHsKLQotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIGlmICghU2VydmxldEhlbHBlci5pc1VwbG9hZEVuYWJsZWQobWFuYWdlcikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVXBsb2FkIGlzIG5vdCBlbmFibGVkLiBQbGVhc2UgY2hlY2sgbG9jYWwuYnVpbGQucHJvcGVydGllcyEiKTsKLSAgICAgICAgfQotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBpZiAoIWRvYy5nZXRBcmVhKCkuZXF1YWxzKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKSkgewotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJUaGlzIHVzZWNhc2UgY2FuIG9ubHkgYmUgaW52b2tlZCBpbiB0aGUgYXV0aG9yaW5nIGFyZWEhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0NoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotICAgICAgICBQYXJ0IGZpbGUgPSBnZXRQYXJ0KCJmaWxlIik7Ci0gICAgICAgIGlmIChmaWxlLmlzUmVqZWN0ZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyBJbnRlZ2VyLnRvU3RyaW5nKGZpbGUuZ2V0U2l6ZSgpKSB9OwotICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKCJ1cGxvYWQtc2l6ZS1leGNlZWRlZCIsIHBhcmFtcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2RvRXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvRXhlY3V0ZSgpOwotICAgICAgICBQYXJ0IGZpbGUgPSBnZXRQYXJ0KCJmaWxlIik7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgUmVzb3VyY2VXcmFwcGVyIHdyYXBwZXIgPSBuZXcgUmVzb3VyY2VXcmFwcGVyKGRvY3VtZW50LCB0aGlzLm1hbmFnZXIsIGdldExvZ2dlcigpKTsKLSAgICAgICAgd3JhcHBlci53cml0ZShmaWxlKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUmVzb3VyY2VXcmFwcGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3B1YmxpY2F0aW9uL1Jlc291cmNlV3JhcHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzOTk3YS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUmVzb3VyY2VXcmFwcGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5UcmF2ZXJzYWJsZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBSZXNvdXJjZSB3cmFwcGVyIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVdyYXBwZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9VUkwgPSAiY29udGV4dDovL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvcHJvamVjdC1sb2dvLnBuZyI7Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VXcmFwcGVyKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24sIFB1YmxpY2F0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgU2VydmljZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgTWV0YURhdGFFeGNlcHRpb24sIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBwYXRoID0gIi90ZXN0UmVzb3VyY2UiOwotCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGxvZ2luKCJsZW55YSIpOwotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkoZ2V0TWFuYWdlcigpLCBzZXNzaW9uKTsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbigidGVzdCIpOwotCi0gICAgICAgIERvY3VtZW50IGRvYyA9IGNyZWF0ZVJlc291cmNlKGZhY3RvcnksIHB1YiwgcGF0aCwgZ2V0TWFuYWdlcigpLCBnZXRMb2dnZXIoKSk7Ci0KLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBUcmF2ZXJzYWJsZVNvdXJjZSBzb3VyY2UgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgZ2V0TWFuYWdlcigpLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIHNvdXJjZSA9IChUcmF2ZXJzYWJsZVNvdXJjZSkgcmVzb2x2ZXIucmVzb2x2ZVVSSShJTUFHRV9VUkwpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZG9jLmdldE1pbWVUeXBlKCksIHNvdXJjZS5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb2MuZ2V0Q29udGVudExlbmd0aCgpLCBzb3VyY2UuZ2V0Q29udGVudExlbmd0aCgpKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKiBAcGFyYW0gcHViCi0gICAgICogQHBhcmFtIHBhdGgKLSAgICAgKiBAcGFyYW0gbWFuYWdlciAKLSAgICAgKiBAcGFyYW0gbG9nZ2VyIAotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IGNyZWF0ZVJlc291cmNlKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBwYXRoLAotICAgICAgICAgICAgU2VydmljZU1hbmFnZXIgbWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24sIERvY3VtZW50QnVpbGRFeGNlcHRpb24sCi0gICAgICAgICAgICBQdWJsaWNhdGlvbkV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUmVwb3NpdG9yeUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIERvY3VtZW50RXhjZXB0aW9uLCBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9ICJwbmciOwotCi0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0KLSAgICAgICAgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IG51bGw7Ci0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIERvY3VtZW50TWFuYWdlciBkb2NNYW5hZ2VyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jTWFuYWdlciA9IChEb2N1bWVudE1hbmFnZXIpIG1hbmFnZXIubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLQotICAgICAgICAgICAgcHViLmdldEFyZWEoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpLmdldFNpdGUoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpLmxvY2soKTsKLQotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSBtYW5hZ2VyLmxvb2t1cChSZXNvdXJjZVR5cGUuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgcmVzb3VyY2VUeXBlID0gKFJlc291cmNlVHlwZSkgc2VsZWN0b3Iuc2VsZWN0KCJyZXNvdXJjZSIpOwotCi0gICAgICAgICAgICBSZXNvdXJjZVR5cGUuU2FtcGxlIHNhbXBsZSA9IHJlc291cmNlVHlwZS5nZXRTYW1wbGUocmVzb3VyY2VUeXBlLmdldFNhbXBsZU5hbWVzKClbMF0pOwotICAgICAgICAgICAgZG9jID0gZG9jTWFuYWdlci5hZGQoZmFjdG9yeSwgcmVzb3VyY2VUeXBlLCBzYW1wbGUuZ2V0VXJpKCksIHB1YiwgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEsCi0gICAgICAgICAgICAgICAgICAgIHBhdGgsIHB1Yi5nZXREZWZhdWx0TGFuZ3VhZ2UoKSwgZXh0ZW5zaW9uLCAiVGVzdCBSZXNvdXJjZSIsIHRydWUpOwotICAgICAgICAgICAgZG9jLnNldE1pbWVUeXBlKHNhbXBsZS5nZXRNaW1lVHlwZSgpKTsKLQotICAgICAgICAgICAgUmVzb3VyY2VXcmFwcGVyIHJlc291cmNlID0gbmV3IFJlc291cmNlV3JhcHBlcihkb2MsIG1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgICAgICAgICByZXNvdXJjZS53cml0ZShJTUFHRV9VUkwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRvY01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZShkb2NNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvUmVzb3VyY2VMaW5rUmV3cml0ZXJUZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9SZXNvdXJjZUxpbmtSZXdyaXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhZWQ3Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9SZXNvdXJjZUxpbmtSZXdyaXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVdyYXBwZXJUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLQotLyoqCi0gKiBMaW5rIHJld3JpdGVyIHRlc3QgZm9yIHRoZSAicmVzb3VyY2UiIHJlc291cmNlIHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUxpbmtSZXdyaXRlclRlc3QgZXh0ZW5kcyBMaW5rUmV3cml0ZXJUZXN0IHsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBsaW5rIHJld3JpdGVyIGRvZXNuJ3QgdHJ5IHRvIHJld3JpdGUgbGlua3MgaW4gcmVzb3VyY2VzLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUxpbmtSZXdyaXRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGRvY3VtZW50SWQgPSAiL3Rlc3RSZXNvdXJjZUxpbmtSZXdyaXRpbmciOwotICAgICAgICAKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbG9naW4oImxlbnlhIik7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeShnZXRNYW5hZ2VyKCksIHNlc3Npb24pOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIAotICAgICAgICBSZXNvdXJjZVdyYXBwZXJUZXN0LmNyZWF0ZVJlc291cmNlKGZhY3RvcnksIHB1YiwgZG9jdW1lbnRJZCwgZ2V0TWFuYWdlcigpLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci50ZXN0TGlua1Jld3JpdGVyKCk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL21lbnVzLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9tZW51cy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2FkZTJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL21lbnVzLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDokIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICAKLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2VydmVycGFnZXMiIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3Jlc291cmNlL2NvbmZpZy9tZW51cy9yZXNvdXJjZS54c3AiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkMjc3My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU0MiAyMDA2LTA5LTE1IDA4OjE0OjM5WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0icmVzb3VyY2VUeXBlLXJlc291cmNlIj5NZWRpYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhZGF0YS9tZWRpYS8xLjAiPk1lZGlhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZpbGVuYW1lIj5GaWxlIG5hbWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEltYWdlIj5JbnNlcnQgSW1hZ2U8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBBc3NldCI+SW5zZXJ0IEFzc2V0PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJBc3NldCBVcGxvYWQiPkFzc2V0IFVwbG9hZDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IGEgbmV3IEltYWdlIj5JbnNlcnQgYSBuZXcgSW1hZ2U8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlVwbG9hZCBhbiBBc3NldCI+VXBsb2FkIGFuIEFzc2V0PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ1cGxvYWQtc2l6ZS1leGNlZWRlZCI+VGhlIGZpbGUgaXMgdG9vIGJpZyAoezB9KS48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InVwbG9hZC1lbnRlci10aXRsZSI+UGxlYXNlIGVudGVyIGEgdGl0bGUuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ1cGxvYWQtY2hvb3NlLWZpbGUiPlBsZWFzZSBjaG9vc2UgYSBmaWxlIHRvIHVwbG9hZC48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InVwbG9hZC1taXNzaW5nLWV4dGVuc2lvbiI+UGxlYXNlIHVwbG9hZCBhIGZpbGUgd2l0aCBhbiBleHRlbnNpb24uPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ1cGxvYWQtZGlzYWJsZWQiPlVwbG9hZCBpcyBub3QgZW5hYmxlZC4gUGxlYXNlIGNoZWNrIGxvY2FsLmJ1aWxkLnByb3BlcnRpZXMhPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ1cGxvYWQtcmVzZXQiPg0KLSAgICBUaGUgYnJvd3NlciBjYW4ndCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWxlIHVwbG9hZCB3aWRnZXQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuDQotICAgIFBsZWFzZSBzZWxlY3QgdGhlIGZpbGUgYWdhaW4uDQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IndpZHRoIj5XaWR0aDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJoZWlnaHQiPkhlaWdodDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQcmV2aWV3Ij5QcmV2aWV3PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkF2YWlsYWJsZSBBc3NldHMiPkF2YWlsYWJsZSBBc3NldHM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXBsb2FkIEFzc2V0Ij5VcGxvYWQgQXNzZXQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTWVkaWEgRG9jdW1lbnQiPk1lZGlhIERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRpdGxlIj5UaXRsZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29udGVudCI+Q29udGVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTaXplIj5TaXplPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1pbWVUeXBlIj5NaW1lIFR5cGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGltZW5zaW9uICh3IHggaCkiPkRpbWVuc2lvbiAod2lkdGgmIzE2MDsmIzIxNTsmIzE2MDtoZWlnaHQpPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldpZHRoIj5XaWR0aDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIZWlnaHQiPkhlaWdodDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVcGxvYWQgRmlsZSI+VXBsb2FkIEZpbGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV2FybmluZyI+V2FybmluZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2N1bWVudC13aWxsLWJlLW92ZXJ3cml0dGVuIj5UaGUgZXhpc3RpbmcgZG9jdW1lbnQgd2lsbCBiZSBvdmVyd3JpdHRlbiE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm8tcHJldmlldy1hdmFpbGFibGUiPk5vIHByZXZpZXcgYXZhaWxhYmxlIGZvciB0aGlzIHJlc291cmNlLjwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTM3MmY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aV9kZS54bWwgNDQ2NTQyIDIwMDYtMDktMTUgMDg6MTQ6MzlaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJkZSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUtcmVzb3VyY2UiPk1lZGlhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL21lZGlhLzEuMCI+TWVkaWE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmlsZW5hbWUiPkRhdGVpbmFtZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgSW1hZ2UiPkJpbGQgZWluZsO8Z2VuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgQXNzZXQiPkFubGFnZSBlaW5mw7xnZW48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkFzc2V0IFVwbG9hZCI+QW5sYWdlIGhvY2hsYWRlbjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IGEgbmV3IEltYWdlIj5OZXVlcyBCaWxkIGVpbmbDvGdlbjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iVXBsb2FkIGFuIEFzc2V0Ij5BbmxhZ2UgaG9jaGxhZGVuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ1cGxvYWQtc2l6ZS1leGNlZWRlZCI+RGllIERhdGVpIGlzdCB6dSBncm/DnyAoezB9KS48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InVwbG9hZC1lbnRlci10aXRsZSI+Qml0dGUgZ2ViZW4gU2llIGVpbmVuIFRpdGVsIGVpbi48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InVwbG9hZC1jaG9vc2UtZmlsZSI+Qml0dGUgd8OkaGxlbiBTaWUgZWluZSBEYXRlaS48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InVwbG9hZC1taXNzaW5nLWV4dGVuc2lvbiI+Qml0dGUgd8OkaGxlbiBTaWUgZWluZSBEYXRlaSBtaXQgZWluZXIgRW5kdW5nLjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0idXBsb2FkLWRpc2FibGVkIj4NCi0gICAgRGFzIEhvY2hsYWRlbiB2b24gRGF0ZWllbiBpc3QgbmljaHQgZXJsYXVidC4NCi0gICAgQml0dGUgcHLDvGZlbiBTaWUgZGllIEVpbnN0ZWxsdW5nZW4gaW4gbG9jYWwuYnVpbGQucHJvcGVydGllcyENCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0idXBsb2FkLXJlc2V0Ij4NCi0gICAgRGVyIEJyb3dzZXIgZGFyZiBhdXMgU2ljaGVyaGVpdHNncsO8bmRlbiBkZW4gV2VydCBkZXMgRGF0ZWktVXBsb2FkLUZlbGRzIG5pY2h0IHNldHplbi4NCi0gICAgQml0dGUgd8OkaGxlbiBTaWUgZGllIERhdGVpIGVybmV1dC4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0id2lkdGgiPkJyZWl0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJoZWlnaHQiPkjDtmhlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlByZXZpZXciPlZvcnNjaGF1PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkF2YWlsYWJsZSBBc3NldHMiPlZlcmbDvGdiYXJlIEFubGFnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXBsb2FkIEFzc2V0Ij5BbmxhZ2UgaG9jaGxhZGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1lZGlhIERvY3VtZW50Ij5NZWRpZW4tRG9rdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGl0bGUiPlRpdGVsPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlc2NyaXB0aW9uIj5CZXNjaHJlaWJ1bmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29udGVudCI+SW5oYWx0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNpemUiPkdyw7bDn2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTWltZVR5cGUiPk1pbWUtVHlwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEaW1lbnNpb24gKHcgeCBoKSI+QWJtZXNzdW5nZW4gKEJyZWl0ZSYjMTYwOyYjMjE1OyYjMTYwO0jDtmhlKTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXaWR0aCI+QnJlaXRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkhlaWdodCI+SMO2aGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXBsb2FkIEZpbGUiPkRhdGVpIGhvY2hsYWRlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXYXJuaW5nIj5XYXJudW5nPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRvY3VtZW50LXdpbGwtYmUtb3ZlcndyaXR0ZW4iPkRhcyBleGlzdGllcmVuZGUgRG9rdW1lbnQgd2lyZCDDvGJlcnNjaHJpZWJlbiE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm8tcHJldmlldy1hdmFpbGFibGUiPkbDvHIgZGllc2UgUmVzc291cmNlIGlzdCBrZWluZSBWb3JzY2hhdSB2ZXJmw7xnYmFyLjwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQotDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvcmVzb3VyY2VzL2kxOG4vY21zdWlfZXMueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvcmVzb3VyY2VzL2kxOG4vY21zdWlfZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY0MDVjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aV9lcy54bWwgNDQ2NTQyIDIwMDYtMDktMTUgMDg6MTQ6MzlaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJlcyIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJEaW1lbnNpb24gKHcgeCBoKSI+RGltZW5zaW9uZXMgKGFuY2hvJiMxNjA7JiMyMTU7JiMxNjA7YWx0byk8L21lc3NhZ2U+Ci0gIA0KLTwvY2F0YWxvZ3VlPg0KLQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2ZyLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2ZyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkNmFmMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9mci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWlfZnIueG1sIDQ0NjU0MiAyMDA2LTA5LTE1IDA4OjE0OjM5WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZnIiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0iRGltZW5zaW9uICh3IHggaCkiPkRpbWVuc2lvbiAobCYjMTYwOyYjMjE1OyYjMTYwO2gpPC9tZXNzYWdlPgotICANCi08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9yZXNvdXJjZXMvaWNvbnMvZGVmYXVsdC5naWYgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9yZXNvdXJjZXMvaWNvbnMvZGVmYXVsdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGI3ZGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvcmVzb3VyY2VzL2ljb25zL2RlZmF1bHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvcmVzb3VyY2VzL2ljb25zL2RlZmF1bHRfbWVkLmdpZiBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pY29ucy9kZWZhdWx0X21lZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZWNiNWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvcmVzb3VyY2VzL2ljb25zL2RlZmF1bHRfbWVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9zY2hlbWFzL3Jlc291cmNlLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9zY2hlbWFzL3Jlc291cmNlLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3ZDVmOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9yZXNvdXJjZXMvc2NoZW1hcy9yZXNvdXJjZS5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogeGh0bWwucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tKwotICAgIHwgWEhUTUwgZG9jdHlwZQotICAgICstLT4KLQotPCEtLSsKLSAgICB8IE5hbWVzcGFjZXM6Ci0gICAgfCBsZW55YSBuYW1lc3BhY2UgaXMgcmVxdWlyZWQgZm9yIGVtYmVkZGluZyBhc3NldHMuCi0gICAgKy0tPgotCi08Z3JhbW1hciBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiCi0gICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIKLSAgICA+Ci0KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC5ybmciLz4KLQotPC9ncmFtbWFyPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2Uvc2FtcGxlcy9yZXNvdXJjZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9zYW1wbGVzL3Jlc291cmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyYjA2MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS9zYW1wbGVzL3Jlc291cmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxkdW1teS8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2Uvc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2Uvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2NlYmQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54bWFwIDE3OTQ4OCAyMDA1LTA2LTAyIDAyOjI5OjM5WiBncmVnb3IgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgPG1hcDpjb21wb25lbnRzPgotICAgIDxtYXA6Z2VuZXJhdG9ycyBkZWZhdWx0PSJmaWxlIj4KLSAgICAgIDxtYXA6Z2VuZXJhdG9yIGxhYmVsPSJjb250ZW50IiBsb2dnZXI9InNpdGVtYXAuZ2VuZXJhdG9yLmRpcmVjdG9yeSIKLSAgICAgICAgbmFtZT0ibGVueWFNZXRhRGF0YSIgcG9vbC1tYXg9IjE2IgotICAgICAgICBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5nZW5lcmF0aW9uLkxlbnlhTWV0YURhdGFHZW5lcmF0b3IiLz4KLSAgICA8L21hcDpnZW5lcmF0b3JzPgotICAgIDxtYXA6c2VyaWFsaXplcnMgZGVmYXVsdD0ieGh0bWwiPgotICAgICAgPG1hcDpzZXJpYWxpemVyIGxvZ2dlcj0ic2l0ZW1hcC5zZXJpYWxpemVyLmxpbmtzIiBuYW1lPSJsaW5rcyIgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc2VyaWFsaXphdGlvbi5MaW5rU2VyaWFsaXplciIvPgotICAgIDwvbWFwOnNlcmlhbGl6ZXJzPgotICA8L21hcDpjb21wb25lbnRzPgotICAKLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIAotICAgICAgPCEtLSBHZW5lcmF0ZXMgdGhlIGxlbnlhIG1ldGFkYXRhIHRvIGJlIGFnZ3JlZ2F0ZWQgZm9yIGVhY2ggcGFnZSAtLT4KLSAgICAgIDwhLS0gezE6cHViSWR9L3syOmFyZWF9L3szOnV1aWR9L3s0Omxhbmd1YWdlfS97NTpyZXZpc2lvbn0gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImxlbnlhbWV0YWRhdGEueG1sLyovKi8qLyovKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ibGVueWFNZXRhRGF0YSIgc3JjPSJsZW55YS1kb2N1bWVudDp7M30scHViPXsxfSxhcmVhPXsyfSxsYW5nPXs0fSxyZXY9ezV9Ii8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0ge3B1Yi1pZH0ve2FyZWF9L3t1dWlkfS97bGFuZ3VhZ2V9IC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJsdWNlbmUtaW5kZXgvKi8qLyovKiI+Ci0gICAgICAgIDxtYXA6YWdncmVnYXRlIGVsZW1lbnQ9ImNtc2JvZHkiPgotICAgICAgICAgIDxtYXA6cGFydCBzcmM9ImNvY29vbjovbGVueWFtZXRhZGF0YS54bWwvezF9L3syfS97M30vezR9Ly0xIi8+Ci0gICAgICAgIDwvbWFwOmFnZ3JlZ2F0ZT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwveHNsdC94aHRtbDJpbmRleC54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVybCIgdmFsdWU9IntyZXF1ZXN0OnJlcXVlc3RVUkl9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgICAKLSAgICAgIDwhLS0gcGF0dGVybj0ie2Zvcm1hdH0ueG1sIiAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi54bWwiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi97MX0ueG1sL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfS97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfS97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX0iLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSB7Zm9ybWF0fS54bWwve3B1YklkfS97YXJlYX0ve3V1aWR9L3tsYW5ndWFnZX0gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImRvd25sb2FkTGluay54bWwvKi8qLyovKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb2Nvb246L2xlbnlhbWV0YWRhdGEueG1sL3sxfS97Mn0vezN9L3s0fS8iLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvcmVzb3VyY2UveHNsdC9kb3dubG9hZExpbmsueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjb250ZW50TGVuZ3RoIiB2YWx1ZT0ie2RvYy1pbmZvOnsxfTp7Mn06ezN9Ons0fX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdmFsdWU9Intkb2MtaW5mbzp7MX06ezJ9OnszfTp7NH19Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXVpZCIgdmFsdWU9InszfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0iezR9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaW1hZ2VwcmVmaXgiIHZhbHVlPSJ7cHJveHk6L3sxfS9tb2R1bGVzL3Jlc291cmNlfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0ge2Zvcm1hdH0ueG1sL3twdWJJZH0ve2FyZWF9L3t1dWlkfS97bGFuZ3VhZ2V9IC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJ4aHRtbC54bWwvKi8qLyovKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb2Nvb246L2xlbnlhbWV0YWRhdGEueG1sL3sxfS97Mn0vezN9L3s0fS97cmVxdWVzdC1wYXJhbTpsZW55YS5yZXZpc2lvbn0iLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvcmVzb3VyY2UveHNsdC9yZXNvdXJjZTJ4aHRtbC54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50LXR5cGUiIHZhbHVlPSJ7ZG9jLWluZm86ezF9OnsyfTp7M306ezR9OnJlc291cmNlVHlwZTp7cmVxdWVzdC1wYXJhbTpsZW55YS5yZXZpc2lvbn19Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibm9kZUlkIiB2YWx1ZT0ie2RvYy1pbmZvOnsxfTp7Mn06ezN9Ons0fTpub2RlTmFtZX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYXRoIiB2YWx1ZT0ie2RvYy1pbmZvOnsxfTp7Mn06ezN9Ons0fTpwYXRofSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0iezR9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icm9vdCIgdmFsdWU9Intwcm94eTovezF9L3syfX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdmFsdWU9Intkb2MtaW5mbzp7MX06ezJ9OnszfTp7NH06bWltZVR5cGU6e3JlcXVlc3QtcGFyYW06bGVueWEucmV2aXNpb259fSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNvbnRlbnRMZW5ndGgiIHZhbHVlPSJ7ZG9jLWluZm86ezF9OnsyfTp7M306ezR9OmNvbnRlbnRMZW5ndGg6e3JlcXVlc3QtcGFyYW06bGVueWEucmV2aXNpb259fSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50VXJsIiB2YWx1ZT0ie2RvYy1pbmZvOnsxfTp7Mn06ezN9Ons0fTpkb2N1bWVudFVybH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJzb3VyY2VFeHRlbnNpb24iIHZhbHVlPSJ7ZG9jLWluZm86ezF9OnsyfTp7M306ezR9OnNvdXJjZUV4dGVuc2lvbjp7cmVxdWVzdC1wYXJhbTpsZW55YS5yZXZpc2lvbn19Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHViaWQiIHZhbHVlPSJ7MX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJpbWFnZXByZWZpeCIgdmFsdWU9Intwcm94eTovezF9L21vZHVsZXMvcmVzb3VyY2V9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmV2aXNpb24iIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpsZW55YS5yZXZpc2lvbn0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iaWNvbi8qLyovKi8qIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pY29ucy9kZWZhdWx0LmdpZiIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iYml0bWFwLWljb25zLyoiPgotICAgICAgICA8bWFwOnJlYWQgc3JjPSJyZXNvdXJjZXMvaWNvbnMvezF9Ii8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJpY29ucy8qLioiPgotICAgICAgICA8bWFwOmFjdCB0eXBlPSJyZXNvdXJjZS1leGlzdHMtZW5oYW5jZWQiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVybCIgdmFsdWU9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9yZXNvdXJjZS9yZXNvdXJjZXMvaWNvbnMvezJ9LnszfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InR5cGUiIHZhbHVlPSJmaWxlIi8+Ci0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3Jlc291cmNlL3Jlc291cmNlcy9pY29ucy97Mn0uezN9Ii8+Ci0gICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRleHQ6Ly9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3Jlc291cmNlL3hzbHQvc3ZnSWNvbi54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImJhc2VQYXRoIiB2YWx1ZT0ie3JlYWxwYXRoOi59Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZXh0ZW5zaW9uIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ic3ZnMnBuZyIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3VzZWNhc2VzL2NyZWF0ZS1yZXNvdXJjZS5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3VzZWNhc2VzL2NyZWF0ZS1yZXNvdXJjZS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkM2Q5Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS91c2VjYXNlcy9jcmVhdGUtcmVzb3VyY2UuangKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogYXNzZXRzLmp4IDM3NDM5MSAyMDA2LTAyLTAyIDE0OjAyOjE3WiBhbmRyZWFzICQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIj4KLQotICA8cGFnZTp0aXRsZT4KLSAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICA8aTE4bjp0ZXh0Pk5ldyAuLi4gRG9jdW1lbnQ8L2kxOG46dGV4dD4KLSAgICAgIDxpMThuOnBhcmFtPjxpMThuOnRleHQ+cmVzb3VyY2VUeXBlLTxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3R5cGUnKX0iLz48L2kxOG46dGV4dD48L2kxOG46cGFyYW0+Ci0gICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgPC9wYWdlOnRpdGxlPgotCi0gIDxwYWdlOmJvZHk+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPgotICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICA8aTE4bjp0ZXh0Pk5ldyAuLi4gRG9jdW1lbnQ8L2kxOG46dGV4dD4KLSAgICAgICAgPGkxOG46cGFyYW0+PGkxOG46dGV4dD5yZXNvdXJjZVR5cGUtPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdHlwZScpfSIvPjwvaTE4bjp0ZXh0PjwvaTE4bjpwYXJhbT4KLSAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0iZm9ybS1hZGRfYXNzZXQiPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0iZmlsZSI+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+RmlsZTwvaTE4bjp0ZXh0PiAqPC9sYWJlbD48L3RkPgotICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50Ii8+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvc2l0ZW1hbmFnZW1lbnQvdXNlY2FzZXMvc2l0ZS9jcmVhdGVGaWVsZHMuangiLz4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9Ik5ldyBBc3NldCIvPgotICAgICAgICAgICAgICAmIzE2MDsKLSAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIG5hbWU9ImNhbmNlbCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2FuY2VsIi8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS91c2VjYXNlcy91cGxvYWQtcmVzb3VyY2UuanggYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS91c2VjYXNlcy91cGxvYWQtcmVzb3VyY2UuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNGU4OGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvcmVzb3VyY2UvdXNlY2FzZXMvdXBsb2FkLXJlc291cmNlLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGFzc2V0cy5qeCAzNzQzOTEgMjAwNi0wMi0wMiAxNDowMjoxN1ogYW5kcmVhcyAkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSI+Ci0gIAotICA8cGFnZTp0aXRsZT4KLSAgICAgIDxpMThuOnRleHQ+VXBsb2FkIEZpbGU8L2kxOG46dGV4dD4KLSAgPC9wYWdlOnRpdGxlPgotICAKLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+Ci0gICAgICA8aTE4bjp0ZXh0PlVwbG9hZCBGaWxlPC9pMThuOnRleHQ+Ci0gICAgPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0iZm9ybS11cGxvYWQiPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldE5hbWUoKX0iLz4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBzdHlsZT0icGFkZGluZy1ib3R0b206IDJlbTsiPgotICAgICAgICAgICAgICA8c3Ryb25nPjxpMThuOnRleHQ+V2FybmluZzwvaTE4bjp0ZXh0Pjo8L3N0cm9uZz4gPGkxOG46dGV4dD5kb2N1bWVudC13aWxsLWJlLW92ZXJ3cml0dGVuPC9pMThuOnRleHQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJmaWxlIj4KLSAgICAgICAgICAgICAgPGkxOG46dGV4dD5GaWxlPC9pMThuOnRleHQ+OiAqPC9sYWJlbD48L3RkPgotICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiBzaXplPSI1MCIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPioKLSAgICAgICAgICAgICAgPGkxOG46dGV4dD5yZXF1aXJlZCBmaWVsZHM8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQgRmlsZSIvPgotICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgbmFtZT0iY2FuY2VsIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDYW5jZWwiLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3hzbHQvY29tbW9uL21pbWV0eXBlLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3hzbHQvY29tbW9uL21pbWV0eXBlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmMmNjZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS94c2x0L2NvbW1vbi9taW1ldHlwZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG1pbWV0eXBlLnhzbCA5MTg3IDIwMDUtMTItMjIgMTU6NTM6MjFaIGpvc2lhcyAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiCi0gICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgotICAgIHhtbG5zOm1lZGlhPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9wdWJzL2RlZmF1bHQvbWVkaWEvMS4wIiAgICAKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gICAgeG1sbnM6ZGN0ZXJtcz0iaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLyIKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGh0bWwgbGVueWEgZGMiPgotICAgIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9Imljb24iPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ibWltZXR5cGUiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImltYWdlcHJlZml4Ii8+Ci0gICAgCi0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8IS0tIEF1ZGlvIGZpbGUgdHlwZXMgLS0+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ2F1ZGlvL3gtYWlmZiciPgotICAgICAgICA8aW1nIHNyYz0ieyRpbWFnZXByZWZpeH0vaWNvbnMvYWlmX21lZC5naWYiIGJvcmRlcj0iMCIgYWx0PSIiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ2F1ZGlvL21wZWcnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL21wM19tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhdWRpby94LXBuLXJlYWxhdWRpbyciPgotICAgICAgICA8aW1nIHNyYz0ieyRpbWFnZXByZWZpeH0vaWNvbnMvcm1fbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnYXVkaW8veC13YXYnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL3dhdl9tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotCi0gICAgICA8IS0tIFZpZGVvIGZpbGUgdHlwZXMgLS0+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ3ZpZGVvL3gtbXN2aWRlbyciPgotICAgICAgICA8aW1nIHNyYz0ieyRpbWFnZXByZWZpeH0vaWNvbnMvYXZpX21lZC5naWYiIGJvcmRlcj0iMCIgYWx0PSIiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ3ZpZGVvL3F1aWNrdGltZSciPgotICAgICAgICA8aW1nIHNyYz0ieyRpbWFnZXByZWZpeH0vaWNvbnMvbW92X21lZC5naWYiIGJvcmRlcj0iMCIgYWx0PSIiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ3ZpZGVvL21wZWcnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL21wZ19tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICd2aWRlby94LW1zLXdtdiciPgotICAgICAgICA8aW1nIHNyYz0ieyRpbWFnZXByZWZpeH0vaWNvbnMvd212X21lZC5naWYiIGJvcmRlcj0iMCIgYWx0PSIiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgIDwhLS0gSW1hZ2UgZmlsZSB0eXBlcyAtLT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnaW1hZ2UvZ2lmJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9naWZfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnaW1hZ2UvcG5nJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9wbmdfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnaW1hZ2UveC1wbmcnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL3BuZ19tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdpbWFnZS9qcGVnJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9qcGdfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnaW1hZ2UvcGpwZWcnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL2pwZ19tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdpbWFnZS90aWZmJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy90aWZfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnaW1hZ2UvYm1wJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9ibXBfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAKLSAgICAgIDwhLS0gQ29tcHJlc3NlZCBmaWxlIHR5cGVzIC0tPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhcHBsaWNhdGlvbi94LWJ6aXAyJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9iejJfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnYXBwbGljYXRpb24veC1nemlwJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9nel9tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhcHBsaWNhdGlvbi94LXRhciciPgotICAgICAgICA8aW1nIHNyYz0ieyRpbWFnZXByZWZpeH0vaWNvbnMvdGd6X21lZC5naWYiIGJvcmRlcj0iMCIgYWx0PSIiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ2FwcGxpY2F0aW9uL3ppcCciPgotICAgICAgICA8aW1nIHNyYz0ieyRpbWFnZXByZWZpeH0vaWNvbnMvemlwX21lZC5naWYiIGJvcmRlcj0iMCIgYWx0PSIiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ2FwcGxpY2F0aW9uL3gtemlwLWNvbXByZXNzZWQnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL3ppcF9tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotCi0gICAgICA8IS0tIFRleHQgZmlsZSB0eXBlcyAtLT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnYXBwbGljYXRpb24vcnRmJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9ydGZfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnYXBwbGljYXRpb24vcGRmJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9wZGZfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnYXBwbGljYXRpb24veC1wZGYnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL3BkZl9tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICd0ZXh0L3BsYWluJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy90eHRfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAndGV4dC9odG1sJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9odG1sX21lZC5naWYiIGJvcmRlcj0iMCIgYWx0PSIiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ3RleHQveG1sJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy94bWxfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgPCEtLSBBcHBsaWNhdGlvbiBmaWxlIHR5cGVzIC0tPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL2V4ZV9tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotCi0gICAgICA8IS0tIE11bHRpbWVkaWEgZmlsZSB0eXBlcyAtLT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL3N3Zl9tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotCi0gICAgICA8IS0tIE1pY3Jvc2Z0IE9mZmljZSBmaWxlIHR5cGVzIC0tPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhcHBsaWNhdGlvbi9tc3dvcmQnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL2RvY19tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL3hsc19tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhcHBsaWNhdGlvbi94LWV4Y2VsJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy94bHNfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL3BwdF9tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhcHBsaWNhdGlvbi9tc3Bvd2VycG9pbnQnIj4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL3BwdF9tZWQuZ2lmIiBib3JkZXI9IjAiIGFsdD0iIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdhcHBsaWNhdGlvbi9wb3dlcnBvaW50JyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JGltYWdlcHJlZml4fS9pY29ucy9wcHRfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgPCEtLSBVbmtub3duIGZpbGUgdHlwZXMgLS0+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPGltZyBzcmM9InskaW1hZ2VwcmVmaXh9L2ljb25zL2RlZmF1bHRfbWVkLmdpZiIgYm9yZGVyPSIwIiBhbHQ9IiIvPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9InByZXZpZXciPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ibWltZXR5cGUiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im1lZGlhVVJJIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ3aWR0aCIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iaGVpZ2h0Ii8+Ci0gICAgCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXhQcmV2aWV3V2lkdGgiPjQwMDwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJldmlld1dpZHRoIj4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHdpZHRoICZndDsgJG1heFByZXZpZXdXaWR0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXhQcmV2aWV3V2lkdGgiLz48L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdpZHRoIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOnZhcmlhYmxlPgotICAgIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3ZnU3VmZml4Ij4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJG1lZGlhVVJJLCAnPycpIj4mYW1wOzwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPj88L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICA8eHNsOnRleHQ+bGVueWEubW9kdWxlPXN2ZyZhbXA7aGVpZ2h0PTwveHNsOnRleHQ+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZXZpZXdXaWR0aCAqICgkaGVpZ2h0IGRpdiAkd2lkdGgpIi8+Ci0gICAgICA8eHNsOnRleHQ+JmFtcDt3aWR0aD08L3hzbDp0ZXh0PgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmV2aWV3V2lkdGgiLz4KLSAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAKLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnaW1hZ2UvZ2lmJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JG1lZGlhVVJJfSIgYm9yZGVyPSIxIiBhbHQ9InByZXZpZXciLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ2ltYWdlL3BuZyciPgotICAgICAgICA8aW1nIHNyYz0ieyRtZWRpYVVSSX0iIGJvcmRlcj0iMSIgYWx0PSJwcmV2aWV3Ii8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdpbWFnZS94LXBuZyciPgotICAgICAgICA8aW1nIHNyYz0ieyRtZWRpYVVSSX0iIGJvcmRlcj0iMSIgYWx0PSJwcmV2aWV3Ii8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW1ldHlwZSA9ICdpbWFnZS9qcGVnJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JG1lZGlhVVJJfXskc3ZnU3VmZml4fSIgYm9yZGVyPSIxIiBhbHQ9InByZXZpZXciLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ2ltYWdlL3BqcGVnJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JG1lZGlhVVJJfSIgYm9yZGVyPSIxIiBhbHQ9InByZXZpZXciLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbWV0eXBlID0gJ2ltYWdlL3RpZmYnIj4KLSAgICAgICAgPGltZyBzcmM9InskbWVkaWFVUkl9IiBib3JkZXI9IjEiIGFsdD0icHJldmlldyIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWltZXR5cGUgPSAnaW1hZ2UvYm1wJyI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7JG1lZGlhVVJJfSIgYm9yZGVyPSIxIiBhbHQ9InByZXZpZXciLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPGk+PGkxOG46dGV4dD5uby1wcmV2aWV3LWF2YWlsYWJsZTwvaTE4bjp0ZXh0PjwvaT4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgIAotICAgIDwveHNsOmNob29zZT4gCi0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3hzbHQvZG93bmxvYWRMaW5rLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3hzbHQvZG93bmxvYWRMaW5rLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1YTMzNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS94c2x0L2Rvd25sb2FkTGluay54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogeGh0bWwtc3RhbmRhcmQueHNsLHYgMS40NCAyMDA0LzEyLzE0IDExOjAwOjQxIGpvc2lhcyBFeHAgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczptZXRhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWV0YWRhdGEvMS4wIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgotICB4bWxuczptZWRpYT0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvcHVicy9kZWZhdWx0L21lZGlhLzEuMCIKLSAgeG1sbnM6bWVkaWFtZXRhPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhZGF0YS9tZWRpYS8xLjAiCi0gIHhtbG5zOmRvY21ldGE9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL2RvY3VtZW50LzEuMCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxuczpkY3Rlcm1zPSJodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGh0bWwgbWV0YSBkYyI+Ci0gIAotICA8eHNsOmltcG9ydCBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvcmVzb3VyY2UveHNsdC9jb21tb24vbWltZXR5cGUueHNsIi8+Ci0gIAotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJkb2N1bWVudFVybCIvPgotICA8eHNsOnBhcmFtIG5hbWU9InNvdXJjZUV4dGVuc2lvbiIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnRMZW5ndGgiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJ1dWlkIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibGFuZ3VhZ2UiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJpbWFnZXByZWZpeCIvPgotICA8eHNsOnBhcmFtIG5hbWU9Im1pbWVUeXBlIi8+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1lZGlhVXJsIiBzZWxlY3Q9ImNvbmNhdChzdWJzdHJpbmctYmVmb3JlKCRkb2N1bWVudFVybCwgJy5odG1sJyksICcuJywgJHNvdXJjZUV4dGVuc2lvbikiLz4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLy9tZXRhOm1ldGFkYXRhIiBtb2RlPSJtZWRpYSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0YTptZXRhZGF0YSIgbW9kZT0ibWVkaWEiPgotICAKLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlIj4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm9ybWFsaXplLXNwYWNlKGRjOmVsZW1lbnRzL2RjOnRpdGxlKSAhPSAnJyI+Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRjOmVsZW1lbnRzL2RjOnRpdGxlIi8+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgIDxpMThuOnRleHQ+Tm8gdGl0bGU8L2kxOG46dGV4dD4KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOnZhcmlhYmxlPgotICAgIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2l6ZSI+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkY29udGVudExlbmd0aCBkaXYgMTAyNCwgJyMsIyMjLiMjJykiLz4KLSAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAKLSAgICA8c3BhbiBjbGFzcz0iYXNzZXQiPgotICAgICAgPGEgaHJlZj0ibGVueWEtZG9jdW1lbnQ6eyR1dWlkfSxsYW5nPXskbGFuZ3VhZ2V9IiB0aXRsZT0ie3RleHQoKX0iPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWNvbiI+Ci0gICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1pbWV0eXBlIiBzZWxlY3Q9IiRtaW1lVHlwZSIvPgotICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbWFnZXByZWZpeCIgc2VsZWN0PSIkaW1hZ2VwcmVmaXgiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDwvYT4KLSAgICAgICYjMTYwOwotICAgICAgPGEgaHJlZj0ibGVueWEtZG9jdW1lbnQ6eyR1dWlkfSxsYW5nPXskbGFuZ3VhZ2V9IiB0aXRsZT0ie3RleHQoKX0iPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+Ci0gICAgICA8L2E+Ci0gICAgICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im51bWJlcigkc2l6ZSkiLz4gS0IpCi0gICAgPC9zcGFuPgotCi0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS94c2x0L3Jlc291cmNlMnhodG1sLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3hzbHQvcmVzb3VyY2UyeGh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODZmZDYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3hzbHQvcmVzb3VyY2UyeGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB4aHRtbC1zdGFuZGFyZC54c2wsdiAxLjQ0IDIwMDQvMTIvMTQgMTE6MDA6NDEgam9zaWFzIEV4cCAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOm1ldGE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZXRhZGF0YS8xLjAiCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCi0gIHhtbG5zOm1lZGlhPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9wdWJzL2RlZmF1bHQvbWVkaWEvMS4wIgotICB4bWxuczptZWRpYW1ldGE9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL21lZGlhLzEuMCIKLSAgeG1sbnM6ZG9jbWV0YT0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvZG9jdW1lbnQvMS4wIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zOmRjdGVybXM9Imh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8iCi0gIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4aHRtbCBtZXRhIGRjIj4KLSAgCi0gIDx4c2w6aW1wb3J0IGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9yZXNvdXJjZS94c2x0L2NvbW1vbi9taW1ldHlwZS54c2wiLz4KLSAgPHhzbDppbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC94c2x0L2hlbHBlci1vYmplY3QueHNsIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icm9vdCIvPiA8IS0tIHRoZSBVUkwgdXAgdG8gKGluY2x1ZGluZykgdGhlIGFyZWEgLS0+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icGF0aCIvPgotICA8eHNsOnBhcmFtIG5hbWU9InB1YmlkIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibGFuZ3VhZ2UiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJkb2N1bWVudC10eXBlIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29udGVudExlbmd0aCIvPgotICA8eHNsOnBhcmFtIG5hbWU9Im1pbWVUeXBlIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iZG9jdW1lbnRVcmwiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJzb3VyY2VFeHRlbnNpb24iLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJpbWFnZXByZWZpeCIvPgotICA8eHNsOnBhcmFtIG5hbWU9InJldmlzaW9uIi8+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9InJldmlzaW9uU3VmZml4Ij4KLSAgICA8eHNsOmlmIHRlc3Q9IiRyZXZpc2lvbiAhPSAnJyI+Ci0gICAgICA8eHNsOnRleHQ+P2xlbnlhLnJldmlzaW9uPTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXZpc2lvbiIvPgotICAgIDwveHNsOmlmPgotICA8L3hzbDp2YXJpYWJsZT4KLSAgCi0gIDx4c2w6dmFyaWFibGUgbmFtZT0ibWVkaWFVcmwiIHNlbGVjdD0iY29uY2F0KHN1YnN0cmluZy1iZWZvcmUoJGRvY3VtZW50VXJsLCAnLmh0bWwnKSwgJy4nLCAkc291cmNlRXh0ZW5zaW9uLCAkcmV2aXNpb25TdWZmaXgpIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8eGh0bWw6ZGl2IGlkPSJib2R5Ij4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLy9tZXRhOm1ldGFkYXRhIiBtb2RlPSJtZWRpYSIvPgotICAgIDwveGh0bWw6ZGl2PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0YTptZXRhZGF0YSIgbW9kZT0ibWVkaWEiPgotICAgIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWVkaWFVUkkiPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb290Ii8+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1lZGlhVXJsIi8+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0gICAgCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaXplIj4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCRjb250ZW50TGVuZ3RoIGRpdiAxMDI0LCAnIywjIyMuIyMnKSIvPgotICAgIDwveHNsOnZhcmlhYmxlPgotICAgIAotICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoIGNsYXNzPSJ2ZXJ0aWNhbCI+PGEgaHJlZj0ieyRtZWRpYVVSSX0iIHRhcmdldD0iX25ldyI+Ci0gICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imljb24iPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1pbWV0eXBlIiBzZWxlY3Q9IiRtaW1lVHlwZSIvPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImltYWdlcHJlZml4IiBzZWxlY3Q9IiRpbWFnZXByZWZpeCIvPgotICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+IDwvYT4KLSAgICAgICAgPC90aD4KLSAgICAgICAgPHRkPjxoMT48aTE4bjp0ZXh0Pk1lZGlhIERvY3VtZW50PC9pMThuOnRleHQ+PC9oMT48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoIGNsYXNzPSJ2ZXJ0aWNhbCI+PGkxOG46dGV4dD5UaXRsZTwvaTE4bjp0ZXh0Pjo8L3RoPgotICAgICAgICA8dGQ+PHN0cm9uZz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGM6ZWxlbWVudHMvZGM6dGl0bGUiLz48L3N0cm9uZz48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoIGNsYXNzPSJ2ZXJ0aWNhbCI+PGkxOG46dGV4dD5EZXNjcmlwdGlvbjwvaTE4bjp0ZXh0Pjo8L3RoPgotICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRjOmVsZW1lbnRzL2RjOmRlc2NyaXB0aW9uIi8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0aCBjbGFzcz0idmVydGljYWwiPjxpMThuOnRleHQ+Q29udGVudDwvaTE4bjp0ZXh0Pjo8L3RoPgotICAgICAgICA8dGQ+PGEgaHJlZj0ieyRtZWRpYVVSSX0iIHRhcmdldD0iX25ldyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZWRpYVVybCIvPgotICAgICAgICAgIDwvYT48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoIGNsYXNzPSJ2ZXJ0aWNhbCI+PGkxOG46dGV4dD5TaXplPC9pMThuOnRleHQ+OjwvdGg+Ci0gICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNpemUiLz4gS0I8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoIGNsYXNzPSJ2ZXJ0aWNhbCI+PGkxOG46dGV4dD5NaW1lVHlwZTwvaTE4bjp0ZXh0Pjo8L3RoPgotICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaW1lVHlwZSIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHhzbDppZiB0ZXN0PSJtZWRpYW1ldGE6ZWxlbWVudHMvbWVkaWFtZXRhOndpZHRoICE9ICcnIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0aCBjbGFzcz0idmVydGljYWwiPjxpMThuOnRleHQ+V2lkdGg8L2kxOG46dGV4dD46PC90aD4KLSAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lZGlhbWV0YTplbGVtZW50cy9tZWRpYW1ldGE6d2lkdGgiLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRoIGNsYXNzPSJ2ZXJ0aWNhbCI+PGkxOG46dGV4dD5IZWlnaHQ8L2kxOG46dGV4dD46PC90aD4KLSAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lZGlhbWV0YTplbGVtZW50cy9tZWRpYW1ldGE6aGVpZ2h0Ii8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHRyPgotICAgICAgICA8dGggY2xhc3M9InZlcnRpY2FsIiBzdHlsZT0icGFkZGluZy10b3A6IDFlbTsgdmVydGljYWwtYWxpZ246IHRvcDsiPjxpMThuOnRleHQ+UHJldmlldzwvaTE4bjp0ZXh0Pjo8L3RoPgotICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmctdG9wOiAxZW07Ij4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJldmlldyI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWltZXR5cGUiIHNlbGVjdD0iJG1pbWVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWVkaWFVUkkiIHNlbGVjdD0iJG1lZGlhVVJJIi8+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0id2lkdGgiIHNlbGVjdD0ibWVkaWFtZXRhOmVsZW1lbnRzL21lZGlhbWV0YTp3aWR0aCIvPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImhlaWdodCIgc2VsZWN0PSJtZWRpYW1ldGE6ZWxlbWVudHMvbWVkaWFtZXRhOmhlaWdodCIvPgotICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+PGJyLz48YnIvPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotCi0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIiBwcmlvcml0eT0iLTEiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3hzbHQvc3ZnSWNvbi54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9yZXNvdXJjZS94c2x0L3N2Z0ljb24ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjlhNTZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3Jlc291cmNlL3hzbHQvc3ZnSWNvbi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0iYmFzZVBhdGgiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJleHRlbnNpb24iLz4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8qIj4KLSAgICAKLSAgICA8c3ZnOnN2ZyB3aWR0aD0iMzMiIGhlaWdodD0iNDAiPgotICAgICAgCi0gICAgICA8c3ZnOmltYWdlIHg9IjAiIHk9IjAiIHdpZHRoPSIzMyIgaGVpZ2h0PSI0MCIKLSAgICAgICAgeGxpbms6aHJlZj0iZmlsZTovL3skYmFzZVBhdGh9L2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvaWNvbnMvZW1wdHktaWNvbi5wbmciLz4KLSAgICAgICAgCi0gICAgICA8c3ZnOnRleHQgeD0iMTYiIHk9IjI0IgotICAgICAgICBzdHlsZT0idGV4dC1hbmNob3I6IG1pZGRsZTsgZm9udC1zaXplOiAxMTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZpbGw6ICMwMDAwMDA7Ij4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZShzdWJzdHJpbmcoJGV4dGVuc2lvbiwgMSwgMyksCi0gICAgICAgICAgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JywKLSAgICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonKSIvPgotICAgICAgPC9zdmc6dGV4dD4KLSAgICAgIAotICAgIDwvc3ZnOnN2Zz4KLSAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2ltcGxlc2l0ZS9jb25maWcvY29jb29uLXhjb25mL3NpdGUtbWFuYWdlcnMueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9zaW1wbGVzaXRlL2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS1tYW5hZ2Vycy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjZjRiNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaW1wbGVzaXRlL2NvbmZpZy9jb2Nvb24teGNvbmYvc2l0ZS1tYW5hZ2Vycy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9zaXRlLW1hbmFnZXJzIiB1bmxlc3M9Ii9jb2Nvb24vc2l0ZS1tYW5hZ2Vycy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnc2ltcGxlJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InNpbXBsZSIgbG9nZ2VyPSJsZW55YS5zaXRlIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnNpbXBsZS5TaW1wbGVTaXRlTWFuYWdlciIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaW1wbGVzaXRlL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2ltcGxlc2l0ZS9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmNjNkNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaW1wbGVzaXRlL2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuc2ltcGxlc2l0ZTwvaWQ+Ci0gIDxleHBvcnQgcGFja2FnZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5zaW1wbGUiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuY29sbGVjdGlvbiIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPlNpbXBsZSBTaXRlIE1hbmFnZXI8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPkNvbGxlY3Rpb24tYmFzZWQgc2l0ZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpbXBsZXNpdGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9zaW1wbGUvRG9jdW1lbnRTdG9yZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2ltcGxlc2l0ZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3NpbXBsZS9Eb2N1bWVudFN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGVhZjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2ltcGxlc2l0ZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3NpbXBsZS9Eb2N1bWVudFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuc2ltcGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50QnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uLkNvbGxlY3Rpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBTaXRlIHN0cnVjdHVyZSBvYmplY3Qgd2hpY2ggc3RvcmVzIGEgbGlzdCBvZiBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50U3RvcmUgZXh0ZW5kcyBDb2xsZWN0aW9uV3JhcHBlciBpbXBsZW1lbnRzIFNpdGVTdHJ1Y3R1cmUgewotCi0gICAgLyoqCi0gICAgICogVGhlIGlkZW50aWZpYWJsZSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJQUJMRV9UWVBFID0gImRvY3VtZW50c3RvcmUiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU0lURV9QQVRIID0gIi9zaXRlc3RydWN0dXJlIjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHdoZXJlIHRoZSBjb2xsZWN0aW9uIGlzIHN0b3JlZC4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50U3RvcmUoRG9jdW1lbnQgZG9jLCBMb2dnZXIgbG9nZ2VyKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBzdXBlcihkb2MsIGxvZ2dlcik7Ci0gICAgICAgIHRoaXMuZG9jMnBhdGgucHV0KGdldEtleShkb2MuZ2V0VVVJRCgpLCBkb2MuZ2V0TGFuZ3VhZ2UoKSksIFNJVEVfUEFUSCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL3NpdGVtYW5hZ2VtZW50L3NpbXBsZS8xLjAiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0xBTkdVQUdFID0gInhtbDpsYW5nIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfUEFUSCA9ICJwYXRoIjsKLQotICAgIHByaXZhdGUgTWFwIGRvYzJwYXRoID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgcmV0dXJuIHV1aWQgKyAiOiIgKyBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhbmd1YWdlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGtleS5zcGxpdCgiOiIpWzFdOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VXVpZChTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBrZXkuc3BsaXQoIjoiKVswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5jb2xsZWN0aW9uLkNvbGxlY3Rpb25XcmFwcGVyI2NyZWF0ZURvY3VtZW50RWxlbWVudChvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEueG1sLk5hbWVzcGFjZUhlbHBlcikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVEb2N1bWVudEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIpCi0gICAgICAgICAgICB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBzdXBlci5jcmVhdGVEb2N1bWVudEVsZW1lbnQoZG9jdW1lbnQsIGhlbHBlcik7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9MQU5HVUFHRSwgZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UGF0aChkb2N1bWVudC5nZXRVVUlEKCksIGRvY3VtZW50LmdldExhbmd1YWdlKCkpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUEFUSCwgcGF0aCk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmNvbGxlY3Rpb24uQ29sbGVjdGlvbldyYXBwZXIjbG9hZERvY3VtZW50KG9yZy53M2MuZG9tLkVsZW1lbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGxvYWREb2N1bWVudChFbGVtZW50IGRvY3VtZW50RWxlbWVudCkgdGhyb3dzIERvY3VtZW50QnVpbGRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdXVpZCA9IGRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VVSUQpOwotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBkb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9MQU5HVUFHRSk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUEFUSCk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0RGVsZWdhdGUoKS5nZXRGYWN0b3J5KCkuZ2V0KGdldERlbGVnYXRlKCkuZ2V0UHVibGljYXRpb24oKSwKLSAgICAgICAgICAgICAgICBnZXREZWxlZ2F0ZSgpLmdldEFyZWEoKSwgdXVpZCwgbGFuZ3VhZ2UpOwotICAgICAgICBTdHJpbmcga2V5ID0gZ2V0S2V5KHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgaWYgKCF0aGlzLmRvYzJwYXRoLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgIHRoaXMuZG9jMnBhdGgucHV0KGtleSwgcGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgdGhlIGRvY3VtZW50IGV4aXN0cy4KLSAgICAgKiBAdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlKCkuZXhpc3RzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRG9jdW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXRSZXBvc2l0b3J5Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlKCkuZ2V0UmVwb3NpdG9yeU5vZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZG9jMnBhdGgoKS52YWx1ZXMoKS5jb250YWlucyhwYXRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0J5VXVpZChTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHJldHVybiBkb2MycGF0aCgpLmNvbnRhaW5zS2V5KGdldEtleSh1dWlkLCBsYW5ndWFnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5BbnlMYW5ndWFnZShTdHJpbmcgdXVpZCkgewotICAgICAgICByZXR1cm4gZG9jMnBhdGgoKS5jb250YWluc0tleSh1dWlkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIHV1aWQpIHsKLSAgICAgICAgRG9jdW1lbnRbXSBkb2NzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jcyA9IGdldERvY3VtZW50cygpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChkb2NzW2ldLmdldFVVSUQoKS5lcXVhbHModXVpZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZG9jc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGluayBnZXRCeVV1aWQoU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFBhdGgodXVpZCwgbGFuZ3VhZ2UpOwotICAgICAgICBTaXRlTm9kZSBub2RlID0gbmV3IFNpbXBsZVNpdGVOb2RlKHRoaXMsIHBhdGgsIHV1aWQsIGdldExvZ2dlcigpKTsKLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0TGluayhsYW5ndWFnZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoKFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IGdldEtleSh1dWlkLCBsYW5ndWFnZSk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoImNvbnRhaW5zIFsiICsga2V5ICsgIl0iLCBjb250YWluc0J5VXVpZCh1dWlkLCBsYW5ndWFnZSkpOwotICAgICAgICByZXR1cm4gKFN0cmluZykgZG9jMnBhdGgoKS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCBwYXRoMm5vZGUgPSBuZXcgV2Vha0hhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBTaXRlTm9kZSBnZXROb2RlKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IChTaXRlTm9kZSkgdGhpcy5wYXRoMm5vZGUuZ2V0KHBhdGgpOwotICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQga2V5cyA9IGRvYzJwYXRoKCkua2V5U2V0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBrZXlzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBkb2MycGF0aCgpLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMocGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHV1aWQgPSBnZXRVdWlkKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgU2ltcGxlU2l0ZU5vZGUodGhpcywgcGF0aCwgdXVpZCwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGgybm9kZS5wdXQocGF0aCwgbm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJbIiArIHRoaXMgKyAiXSBkb2VzIG5vdCBjb250YWluIHRoZSBwYXRoIFsiICsgcGF0aCArICJdIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKSArICI6IiArIGdldEFyZWEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXREZWxlZ2F0ZSgpLmdldFB1YmxpY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmVhKCkgewotICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRBcmVhKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmsgYWRkKFN0cmluZyBwYXRoLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBBc3NlcnQubm90TnVsbCgicGF0aCIsIHBhdGgpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgiZG9jdW1lbnQiLCBkb2N1bWVudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUoImRvY3VtZW50IFsiICsgZG9jdW1lbnQgKyAiXSBpcyBhbHJlYWR5IGNvbnRhaW5lZCEiLCAhY29udGFpbnMoZG9jdW1lbnQpKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkoZG9jdW1lbnQuZ2V0VVVJRCgpLCBkb2N1bWVudC5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgIGlmICghZG9jMnBhdGgoKS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgZG9jMnBhdGgoKS5wdXQoa2V5LCBwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN1cGVyLmFkZChkb2N1bWVudCk7Ci0gICAgICAgICAgICBzYXZlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE5vZGUocGF0aCkuZ2V0TGluayhkb2N1bWVudC5nZXRMYW5ndWFnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXRoIGZvciBhIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBwYXRoCi0gICAgICogQHRocm93cyBUcmFuc2FjdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwYXRoKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICBBc3NlcnQubm90TnVsbCgicGF0aCIsIHBhdGgpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgiZG9jdW1lbnQiLCBkb2N1bWVudCk7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkoZG9jdW1lbnQuZ2V0VVVJRCgpLCBkb2N1bWVudC5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgZG9jMnBhdGgoKS5wdXQoa2V5LCBwYXRoKTsKLSAgICAgICAgc2F2ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXAgZG9jMnBhdGgoKSB7Ci0gICAgICAgIGxvYWQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9jMnBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlW10gZ2V0Tm9kZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudFtdIGRvY3MgPSBnZXREb2N1bWVudHMoKTsKLSAgICAgICAgICAgIFNldCBwYXRocyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwYXRocy5hZGQoZ2V0UGF0aChkb2NzW2ldLmdldFVVSUQoKSwgZG9jc1tpXS5nZXRMYW5ndWFnZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXQgbm9kZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGF0aHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBub2Rlcy5hZGQoZ2V0Tm9kZShwYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKFNpdGVOb2RlW10pIG5vZGVzLnRvQXJyYXkobmV3IFNpdGVOb2RlW25vZGVzLnNpemUoKV0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZU5vZGUgYWRkKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IFsiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICArICJdISIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIERvY3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIucmVtb3ZlKGRvY3VtZW50KTsKLSAgICAgICAgdGhpcy5kb2MycGF0aC5yZW1vdmUoZ2V0S2V5KGRvY3VtZW50LmdldFVVSUQoKSwgZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKSkpOwotICAgICAgICBzYXZlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlIGFkZChTdHJpbmcgcGF0aCwgU3RyaW5nIGZvbGxvd2luZ1NpYmxpbmdQYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBhZGQocGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlW10gZ2V0VG9wTGV2ZWxOb2RlcygpIHsKLSAgICAgICAgU2l0ZU5vZGVbXSBub2RlcyA9IGdldE5vZGVzKCk7Ci0gICAgICAgIExpc3QgdG9wTGV2ZWxOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG5vZGVzW2ldLmlzVG9wTGV2ZWwoKSkgewotICAgICAgICAgICAgICAgIHRvcExldmVsTm9kZXMuYWRkKG5vZGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFNpdGVOb2RlW10pIHRvcExldmVsTm9kZXMudG9BcnJheShuZXcgU2l0ZU5vZGVbdG9wTGV2ZWxOb2Rlcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcGF0aCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIGlmIChjb250YWlucyhwYXRoKSkgewotICAgICAgICAgICAgU2l0ZU5vZGUgbm9kZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm9kZSA9IGdldE5vZGUocGF0aCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBub2RlLmhhc0xpbmsobGFuZ3VhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeU5vZGUoKS5nZXRTZXNzaW9uKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpbXBsZXNpdGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9zaW1wbGUvRG9jdW1lbnRTdG9yZUZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpbXBsZXNpdGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9zaW1wbGUvRG9jdW1lbnRTdG9yZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiZWY2ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaW1wbGVzaXRlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvc2ltcGxlL0RvY3VtZW50U3RvcmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuc2ltcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5SXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBzaXRldHJlZSBvYmplY3RzLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFN0b3JlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFJlcG9zaXRvcnlJdGVtRmFjdG9yeSB7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50U3RvcmVGYWN0b3J5KFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKHRoaXMsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtRmFjdG9yeSNnZXRJdGVtVHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJdGVtVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERvY3VtZW50U3RvcmUuSURFTlRJRklBQkxFX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtRmFjdG9yeSNidWlsZEl0ZW0ob3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUl0ZW0gYnVpbGRJdGVtKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIGtleSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzbmlwcGV0cyA9IGtleS5zcGxpdCgiOiIpOwotCi0gICAgICAgIEFzc2VydC5pc1RydWUoImtleSBbIiArIGtleSArICJdIGlzIGludmFsaWQhIiwgc25pcHBldHMubGVuZ3RoID09IDMpOwotCi0gICAgICAgIFN0cmluZyBwdWJsaWNhdGlvbklkID0gc25pcHBldHNbMF07Ci0gICAgICAgIFN0cmluZyBhcmVhTmFtZSA9IHNuaXBwZXRzWzFdOwotICAgICAgICBTdHJpbmcgdXVpZCA9IHNuaXBwZXRzWzJdOwotICAgICAgICBEb2N1bWVudFN0b3JlIHN0b3JlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KHRoaXMubWFuYWdlciwgc2Vzc2lvbik7Ci0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24ocHVibGljYXRpb25JZCk7Ci0gICAgICAgICAgICBBcmVhIGFyZWEgPSBwdWJsaWNhdGlvbi5nZXRBcmVhKGFyZWFOYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBsYW5nID0gcHVibGljYXRpb24uZ2V0RGVmYXVsdExhbmd1YWdlKCk7Ci0KLSAgICAgICAgICAgIGlmICghYXJlYS5jb250YWlucyh1dWlkLCBsYW5nKSkgewotICAgICAgICAgICAgICAgIGNyZWF0ZUFyZWFWZXJzaW9uKHB1YmxpY2F0aW9uLCBhcmVhTmFtZSwgdXVpZCwgbGFuZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGFyZWEuZ2V0RG9jdW1lbnQodXVpZCwgbGFuZyk7Ci0KLSAgICAgICAgICAgIHN0b3JlID0gbmV3IERvY3VtZW50U3RvcmUoZG9jLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RvcmU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXJlYVZlcnNpb24oUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBhcmVhTmFtZSwgU3RyaW5nIHV1aWQsCi0gICAgICAgICAgICBTdHJpbmcgbGFuZykgdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uLCBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY01hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJlYSBhdXRob3JpbmcgPSBwdWJsaWNhdGlvbi5nZXRBcmVhKFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBKTsKLSAgICAgICAgICAgIERvY3VtZW50IGF1dGhvcmluZ0RvYyA9IGF1dGhvcmluZy5nZXREb2N1bWVudCh1dWlkLCBsYW5nKTsKLSAgICAgICAgICAgIGRvY01hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIGRvY01hbmFnZXIuY29weVRvQXJlYShhdXRob3JpbmdEb2MsIGFyZWFOYW1lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChkb2NNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShkb2NNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2hhcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaW1wbGVzaXRlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvc2ltcGxlL1NpbXBsZUxpbmsuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpbXBsZXNpdGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9zaW1wbGUvU2ltcGxlTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJiNzcwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpbXBsZXNpdGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9zaW1wbGUvU2ltcGxlTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuc2ltcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuQWJzdHJhY3RMaW5rOwotCi0vKioKLSAqIExpbmsgZm9yIFNpbXBsZVNpdGVNYW5hZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGluayBleHRlbmRzIEFic3RyYWN0TGluayB7Ci0KLSAgICBwcm90ZWN0ZWQgU2ltcGxlTGluayhEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgU2ltcGxlU2l0ZU5vZGUgbm9kZSwgU3RyaW5nIF9sYWJlbCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHN1cGVyKGZhY3RvcnksIG5vZGUsIF9sYWJlbCwgbGFuZ3VhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLSAgICAgICAgU2ltcGxlU2l0ZU5vZGUgbm9kZSA9IChTaW1wbGVTaXRlTm9kZSkgZ2V0Tm9kZSgpOwotICAgICAgICBEb2N1bWVudFN0b3JlIHN0b3JlID0gKERvY3VtZW50U3RvcmUpIG5vZGUuZ2V0U3RydWN0dXJlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZS5yZW1vdmUoZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2ltcGxlc2l0ZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3NpbXBsZS9TaW1wbGVTaXRlTWFuYWdlci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2ltcGxlc2l0ZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3NpbXBsZS9TaW1wbGVTaXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRmNjhiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpbXBsZXNpdGUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS9zaW1wbGUvU2ltcGxlU2l0ZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUl0ZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuQWJzdHJhY3RTaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaW1wbGUgc2l0ZSBtYW5hZ2VyIHdoaWNoIGRvZXMgbm90IGltcGx5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24uIFRoZSBkb2N1bWVudHMgYXJlIHN0b3JlZCBpbgotICogY29sbGVjdGlvbnMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNpdGVNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RTaXRlTWFuYWdlciBpbXBsZW1lbnRzIFNlcnZpY2VhYmxlIHsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXIjcmVxdWlyZXMob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZSwgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlcyhEb2N1bWVudEZhY3RvcnkgbWFwLCBTaXRlTm9kZSBkZXBlbmRpbmdSZXNvdXJjZSwKLSAgICAgICAgICAgIFNpdGVOb2RlIHJlcXVpcmVkUmVzb3VyY2UpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNnZXRSZXF1aXJpbmdSZXNvdXJjZXMob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZU5vZGVbXSBnZXRSZXF1aXJpbmdSZXNvdXJjZXMoRG9jdW1lbnRGYWN0b3J5IG1hcCwgU2l0ZU5vZGUgcmVzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgU2l0ZU5vZGVbMF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBwYXRoLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBnZXRTdG9yZShkb2N1bWVudCkuYWRkKHBhdGgsIGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gVGhlIHN0b3JlIG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByaXZhdGUgRG9jdW1lbnRTdG9yZSBnZXRTdG9yZShEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGRvY3VtZW50LmdldFB1YmxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhcmVhID0gZG9jdW1lbnQuZ2V0QXJlYSgpOwotICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gZG9jdW1lbnQuZ2V0RmFjdG9yeSgpOwotICAgICAgICByZXR1cm4gZ2V0U3RvcmUobWFwLCBwdWJsaWNhdGlvbiwgYXJlYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1hcCBUaGUgaWRlbnRpdHkgbWFwLgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHJldHVybiBBIGRvY3VtZW50IHN0b3JlLgotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50U3RvcmUgZ2V0U3RvcmUoRG9jdW1lbnRGYWN0b3J5IG1hcCwgUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBhcmVhKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcga2V5ID0gZ2V0S2V5KHB1YmxpY2F0aW9uLCBhcmVhKTsKLSAgICAgICAgRG9jdW1lbnRTdG9yZSBzdG9yZTsKLSAgICAgICAgUmVwb3NpdG9yeUl0ZW1GYWN0b3J5IGZhY3RvcnkgPSBuZXcgRG9jdW1lbnRTdG9yZUZhY3RvcnkodGhpcy5tYW5hZ2VyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZSA9IChEb2N1bWVudFN0b3JlKSBtYXAuZ2V0U2Vzc2lvbigpLmdldFJlcG9zaXRvcnlJdGVtKGZhY3RvcnksIGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdG9yZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbGxlY3Rpb25VdWlkKFB1YmxpY2F0aW9uIHB1YikgewotICAgICAgICBTdHJpbmcgc291cmNlVXJpID0gcHViLmdldENvbnRlbnRVUkkoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpICsgRE9DVU1FTlRfUEFUSDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFTb3VyY2VVdGlsLmV4aXN0cyhzb3VyY2VVcmksIG1hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBzaXRlIGNvbmZpZ3VyYXRpb24gWyIgKyBzb3VyY2VVcmkgKyAiXSBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgeG1sID0gU291cmNlVXRpbC5yZWFkRE9NKHNvdXJjZVVyaSwgbWFuYWdlcik7Ci0gICAgICAgICAgICBpZiAoIXhtbC5nZXREb2N1bWVudEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoInV1aWQiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgZG9jdW1lbnQgZWxlbWVudCBvZiBbIiArIHNvdXJjZVVyaQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBkb2Vzbid0IGNvbnRhaW4gYSB1dWlkIGF0dHJpYnV0ZSEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB4bWwuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJ1dWlkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1BBVEggPSAiL3NpdGUueG1sIjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHJldHVybiBUaGUga2V5IHRvIHN0b3JlIHNpdGV0cmVlIG9iamVjdHMgaW4gdGhlIGlkZW50aXR5IG1hcC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEpIHsKLSAgICAgICAgcmV0dXJuIHB1YmxpY2F0aW9uLmdldElkKCkgKyAiOiIgKyBhcmVhICsgIjoiICsgZ2V0Q29sbGVjdGlvblV1aWQocHVibGljYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNjb250YWlucyhvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhEb2N1bWVudCByZXNvdXJjZSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudFN0b3JlIHN0b3JlID0gZ2V0U3RvcmUocmVzb3VyY2UpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlLmVxdWFscyhzdG9yZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdG9yZS5jb250YWlucyhyZXNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2NvbnRhaW5zSW5BbnlMYW5ndWFnZShvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0luQW55TGFuZ3VhZ2UoRG9jdW1lbnQgcmVzb3VyY2UpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQotICAgICAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gcmVzb3VyY2UuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhbmd1YWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IHJlc291cmNlLmdldFRyYW5zbGF0aW9uKGxhbmd1YWdlc1tpXSk7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRTdG9yZSBzdG9yZSA9IGdldFN0b3JlKGRvYyk7Ci0gICAgICAgICAgICAgICAgY29udGFpbnMgPSBjb250YWlucyB8fCBzdG9yZS5jb250YWlucyhkb2MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY29udGFpbnM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNjb3B5KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weShEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgRG9jdW1lbnQgZGVzdGluYXRpb25Eb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudFN0b3JlIGRlc3RpbmF0aW9uU3RvcmUgPSBnZXRTdG9yZShkZXN0aW5hdGlvbkRvY3VtZW50KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghZGVzdGluYXRpb25TdG9yZS5jb250YWlucyhkZXN0aW5hdGlvbkRvY3VtZW50KSkgewotICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uU3RvcmUuYWRkKGRlc3RpbmF0aW9uRG9jdW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXIjc2V0VmlzaWJsZUluTmF2KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50LAotICAgICAqICAgICAgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlSW5OYXYoRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gdmlzaWJsZUluTmF2KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2dldERvY3VtZW50cyhvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3RvcnksCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiwgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRbXSBnZXREb2N1bWVudHMoRG9jdW1lbnRGYWN0b3J5IGlkZW50aXR5TWFwLCBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50U3RvcmUgc3RvcmUgPSBnZXRTdG9yZShpZGVudGl0eU1hcCwgcHVibGljYXRpb24sIGFyZWEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldERvY3VtZW50cygpOwotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNnZXRTaXRlU3RydWN0dXJlKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeSwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTaXRlU3RydWN0dXJlIGdldFNpdGVTdHJ1Y3R1cmUoRG9jdW1lbnRGYWN0b3J5IG1hcCwgUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBhcmVhKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0U3RvcmUobWFwLCBwdWJsaWNhdGlvbiwgYXJlYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2dldEF2YWlsYWJsZUxvY2F0b3IoRG9jdW1lbnRGYWN0b3J5LAotICAgICAqICAgICAgRG9jdW1lbnRMb2NhdG9yKQotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0QXZhaWxhYmxlTG9jYXRvcihEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgRG9jdW1lbnRMb2NhdG9yIGRvY3VtZW50KQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlSW5OYXYoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBwYXRoLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U3RvcmUoZG9jdW1lbnQpLnNldFBhdGgoZG9jdW1lbnQsIHBhdGgpOwotICAgICAgICB9IGNhdGNoIChUcmFuc2FjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3JbXSBnZXRSZXF1aXJlZFJlc291cmNlcyhEb2N1bWVudEZhY3RvcnkgbWFwLCBEb2N1bWVudExvY2F0b3IgbG9jYXRvcikKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudExvY2F0b3JbMF07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaW1wbGVzaXRlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvc2ltcGxlL1NpbXBsZVNpdGVOb2RlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaW1wbGVzaXRlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvc2ltcGxlL1NpbXBsZVNpdGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzZjM2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2ltcGxlc2l0ZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3NpbXBsZS9TaW1wbGVTaXRlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnNpbXBsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkFic3RyYWN0U2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotCi0vKioKLSAqIE5vZGUgZm9yIFNpbXBsZVNpdGVNYW5hZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU2l0ZU5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNpdGVOb2RlIHsKLQotICAgIHByb3RlY3RlZCBTaW1wbGVTaXRlTm9kZShEb2N1bWVudFN0b3JlIHN0b3JlLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHV1aWQsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgc3VwZXIoc3RvcmUuZ2V0UHVibGljYXRpb24oKSwgc3RvcmUsIHBhdGgsIHV1aWQsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmsgZ2V0TGluayhTdHJpbmcgbGFuZ3VhZ2UpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRTdG9yZSBzdG9yZSA9IChEb2N1bWVudFN0b3JlKSBnZXRTdHJ1Y3R1cmUoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVMaW5rKHN0b3JlLmdldERlbGVnYXRlKCkuZ2V0RmFjdG9yeSgpLCB0aGlzLCAiIiwgbGFuZ3VhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgU3RyaW5nW10gc3RlcHMgPSBnZXRQYXRoKCkuc3BsaXQoIi8iKTsKLSAgICAgICAgcmV0dXJuIHN0ZXBzW3N0ZXBzLmxlbmd0aCAtIDFdOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMYW5ndWFnZXMoKSB7Ci0gICAgICAgIERvY3VtZW50U3RvcmUgc3RvcmUgPSAoRG9jdW1lbnRTdG9yZSkgZ2V0U3RydWN0dXJlKCk7Ci0gICAgICAgIExpc3QgbGFuZ3VhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBEb2N1bWVudFtdIGRvY3M7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2NzID0gc3RvcmUuZ2V0RG9jdW1lbnRzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGRvY3NbaV0uZ2V0VVVJRCgpLmVxdWFscyhnZXRVdWlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlcy5jb250YWlucyhkb2NzW2ldLmdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEb2N1bWVudCBbIiArIGRvY3NbaV0gKyAiXSBpcyBjb250YWluZWQgdHdpY2UhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhbmd1YWdlcy5hZGQoZG9jc1tpXS5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBsYW5ndWFnZXMudG9BcnJheShuZXcgU3RyaW5nW2xhbmd1YWdlcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlSW5OYXYpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IGdldExhbmd1YWdlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhbmd1YWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRMaW5rKGxhbmd1YWdlc1tpXSkuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZVtdIGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpdGVOb2RlWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0xpbmsoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZU5vZGUgZ2V0UGFyZW50KCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9jb25maWcvY29jb29uLXhjb25mL21vZHVsZS54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2NvbmZpZy9jb2Nvb24teGNvbmYvbW9kdWxlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTYzZWRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2NvbmZpZy9jb2Nvb24teGNvbmYvbW9kdWxlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vc2l0ZS1tYW5hZ2VycyIgdW5sZXNzPSIvY29jb29uL3NpdGUtbWFuYWdlcnMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3RyZWUnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ0cmVlIiBsb2dnZXI9ImxlbnlhLnNpdGUiCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTIuVHJlZVNpdGVNYW5hZ2VyIi8+Ci0gIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2NvbmZpZy9jb2Nvb24teGNvbmYvbW9kdWxlcy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2NvbmZpZy9jb2Nvb24teGNvbmYvbW9kdWxlcy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMmRiYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9jb25maWcvY29jb29uLXhjb25mL21vZHVsZXMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhjb25mIDE2NDYzNSAyMDA1LTA0LTI1IDIwOjAxOjQzWiB0c2NobGFiYWNoICQgLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnc2l0ZXRyZWUnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBsb2dnZXI9ImNvcmUubW9kdWxlcy5pbnB1dC5zaXRldHJlZSIgbmFtZT0ic2l0ZXRyZWUiCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuU2l0ZXRyZWVNb2R1bGUiLz4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OWVmMmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3NpdGV0cmVlLm51ZGdlJ10iPgotCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0ic2l0ZXRyZWUubnVkZ2UiIGxvZ2dlcj0ibGVueWEuc2l0ZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuTnVkZ2UiLz4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlZjNlZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnNpdGV0cmVlPC9pZD4KLSAgPGV4cG9ydCBwYWNrYWdlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuYWMiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPlNpdGV0cmVlPC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj5UcmVlLWJhc2VkIHNpdGUgbWFuYWdlciBpbXBsZW1lbnRhdGlvbjwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9jb25maWcvc2l0ZW1hcC9nZW5lcmF0b3Itc2l0ZXRyZWVmcmFnbWVudC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvY29uZmlnL3NpdGVtYXAvZ2VuZXJhdG9yLXNpdGV0cmVlZnJhZ21lbnQueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlYThjOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9jb25maWcvc2l0ZW1hcC9nZW5lcmF0b3Itc2l0ZXRyZWVmcmFnbWVudC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx4bWFwIHhwYXRoPSIvc2l0ZW1hcC9jb21wb25lbnRzL2dlbmVyYXRvcnMiIA0KLSAgdW5sZXNzPSIvc2l0ZW1hcC9jb21wb25lbnRzL2dlbmVyYXRvcnMvZ2VuZXJhdG9yW0BuYW1lID0gJ3NpdGV0cmVlLWZyYWdtZW50J10iDQotICB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+DQotDQotICAgIDxtYXA6Z2VuZXJhdG9yIG5hbWU9InNpdGV0cmVlLWZyYWdtZW50IiBsYWJlbD0iY29udGVudCxkYXRhIiBsb2dnZXI9InNpdGVtYXAuZ2VuZXJhdG9yLnNpdGV0cmVlLWZyYWdtZW50IiBwb29sLWdyb3c9IjIiIHBvb2wtbWF4PSIxNiIgcG9vbC1taW49IjIiIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmdlbmVyYXRpb24uU2l0ZXRyZWVGcmFnbWVudEdlbmVyYXRvciIvPg0KLQ0KLTwveG1hcD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9jb25maWcvc2l0ZW1hcC90cmFuc2Zvcm1lci1hY2Nlc3Njb250cm9sc2l0ZXRyZWUueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVyLWFjY2Vzc2NvbnRyb2xzaXRldHJlZS54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWIyZDk3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVyLWFjY2Vzc2NvbnRyb2xzaXRldHJlZS54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx4bWFwIHhwYXRoPSIvc2l0ZW1hcC9jb21wb25lbnRzL3RyYW5zZm9ybWVycyIgDQotICB1bmxlc3M9Ii9zaXRlbWFwL2NvbXBvbmVudHMvdHJhbnNmb3JtZXJzL3RyYW5zZm9ybWVyW0BuYW1lID0gJ2FjY2Vzcy1jb250cm9sLXNpdGV0cmVlJ10iDQotICB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+DQotICAgIA0KLSAgPG1hcDp0cmFuc2Zvcm1lciBuYW1lPSJhY2Nlc3MtY29udHJvbC1zaXRldHJlZSIgbG9nZ2VyPSJsZW55YS5zaXRlbWFwLnRyYW5zZm9ybWVyLmFjY2Vzc2NvbnRyb2xzaXRldHJlZSINCi0gICAgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24udHJhbnNmb3JtYXRpb24uQWNjZXNzQ29udHJvbFNpdGV0cmVlVHJhbnNmb3JtZXIiLz4NCi0gIA0KLTwveG1hcD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1NpdGV0cmVlTW9kdWxlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1NpdGV0cmVlTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Y2M5OGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2NvbXBvbmVudHMvbW9kdWxlcy9pbnB1dC9TaXRldHJlZU1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUGFnZUVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5UcmVlU2l0ZU1hbmFnZXI7Ci0KLS8qKgotICogTW9kdWxlIGZvciBzaXRldHJlZSBhY2Nlc3MuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogU2l0ZXRyZWVNb2R1bGUuamF2YSAxNTk1ODQgMjAwNS0wMy0zMSAxMjo0OTo0MVogYW5kcmVhcyAkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRldHJlZU1vZHVsZSBleHRlbmRzIEFic3RyYWN0UGFnZUVudmVsb3BlTW9kdWxlIHsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPkFVVEhPUklOR19OT0RFPC9jb2RlPiBUaGUgYXV0aG9yaW5nIG5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJTkdfTk9ERSA9ICJhdXRob3Jpbmctbm9kZSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+TElWRV9OT0RFPC9jb2RlPiBUaGUgbGl2ZSBub2RlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElWRV9OT0RFID0gImxpdmUtbm9kZSI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+VFJBU0hfTk9ERTwvY29kZT4gVGhlIHRyYXNoIG5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFTSF9OT0RFID0gInRyYXNoLW5vZGUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkFSQ0hJVkVfTk9ERTwvY29kZT4gVGhlIGFyY2hpdmUgbm9kZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hJVkVfTk9ERSA9ICJhcmNoaXZlLW5vZGUiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVJBTUVURVJfTkFNRVMgPSB7IEFVVEhPUklOR19OT0RFLCBMSVZFX05PREUsIFRSQVNIX05PREUsCi0gICAgICAgICAgICBBUkNISVZFX05PREUgfTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbiwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBUcmVlU2l0ZU1hbmFnZXIgX21hbmFnZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQYWdlRW52ZWxvcGUgZW52ZWxvcGUgPSBnZXRFbnZlbG9wZShvYmplY3RNb2RlbCwgbmFtZSk7Ci0gICAgICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGVudmVsb3BlLmdldFB1YmxpY2F0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTaXRlTWFuYWdlci5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICBfbWFuYWdlciA9IChUcmVlU2l0ZU1hbmFnZXIpIHNlbGVjdG9yLnNlbGVjdChwdWJsaWNhdGlvbi5nZXRTaXRlTWFuYWdlckhpbnQoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IE9iamVjdE1vZGVsSGVscGVyLmdldFJlcXVlc3Qob2JqZWN0TW9kZWwpOwotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gUmVwb3NpdG9yeVV0aWwuZ2V0U2Vzc2lvbih0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgRG9jdW1lbnRGYWN0b3J5IG1hcCA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLQotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKEFVVEhPUklOR19OT0RFKSkgewotICAgICAgICAgICAgICAgIFNpdGVUcmVlIGF1dGhvcmluZ1RyZWUgPSBfbWFuYWdlci5nZXRUcmVlKG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gYXV0aG9yaW5nVHJlZS5nZXROb2RlKGVudmVsb3BlLmdldERvY3VtZW50KCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKExJVkVfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICBTaXRlVHJlZSBsaXZlVHJlZSA9IF9tYW5hZ2VyLmdldFRyZWUobWFwLCBwdWJsaWNhdGlvbiwgUHVibGljYXRpb24uTElWRV9BUkVBKTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpdmVUcmVlLmdldE5vZGUoZW52ZWxvcGUuZ2V0RG9jdW1lbnQoKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoVFJBU0hfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICBTaXRlVHJlZSB0cmFzaFRyZWUgPSBfbWFuYWdlci5nZXRUcmVlKG1hcCwgcHVibGljYXRpb24sIFB1YmxpY2F0aW9uLlRSQVNIX0FSRUEpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gdHJhc2hUcmVlLmdldE5vZGUoZW52ZWxvcGUuZ2V0RG9jdW1lbnQoKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoQVJDSElWRV9OT0RFKSkgewotICAgICAgICAgICAgICAgIFNpdGVUcmVlIGFyY2hpdmVUcmVlID0gX21hbmFnZXIuZ2V0VHJlZShtYXAsIHB1YmxpY2F0aW9uLCBQdWJsaWNhdGlvbi5BUkNISVZFX0FSRUEpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gYXJjaGl2ZVRyZWUuZ2V0Tm9kZShlbnZlbG9wZS5nZXREb2N1bWVudCgpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiT2J0YWluaW5nIHZhbHVlIGZvciBbIiArIG5hbWUgKyAiXSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoX21hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKF9tYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LklucHV0TW9kdWxlI2dldEF0dHJpYnV0ZU5hbWVzKG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBdHRyaWJ1dGVOYW1lcyhDb25maWd1cmF0aW9uIG1vZGVDb25mLCBNYXAgb2JqZWN0TW9kZWwpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KFBBUkFNRVRFUl9OQU1FUykuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5JbnB1dE1vZHVsZSNnZXRBdHRyaWJ1dGVWYWx1ZXMoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb24sCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBdHRyaWJ1dGVWYWx1ZXMoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IHsgZ2V0QXR0cmlidXRlKG5hbWUsIG1vZGVDb25mLCBvYmplY3RNb2RlbCkgfTsKLSAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2dlbmVyYXRpb24vU2l0ZXRyZWVGcmFnbWVudEdlbmVyYXRvci5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvY29jb29uL2dlbmVyYXRpb24vU2l0ZXRyZWVGcmFnbWVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTgzMTYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9nZW5lcmF0aW9uL1NpdGV0cmVlRnJhZ21lbnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogQHZlcnNpb24gJElkOiBTaXRldHJlZUZyYWdtZW50R2VuZXJhdG9yLmphdmEgMTU5NTg0IDIwMDUtMDMtMzEgMTI6NDk6NDFaIGFuZHJlYXMgJCovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50Lk9iamVjdE1vZGVsSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZ2VuZXJhdGlvbi5TZXJ2aWNlYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZyYWdtZW50IG9mIHRoZSBuYXZpZ2F0aW9uIFhNTCBmcm9tIHRoZSBzaXRldHJlZSwgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIG5vZGUuIFRoZQotICogbm9kZSBpcyBzcGVjaWZpZWQgYnkgdGhlIHNpdGVtYXAgcGFyYW1ldGVycyBhcmVhL3BhdGguIElmIHRoZSBzaXRlbWFwIHBhcmFtZXRlciBpbml0aWFsVHJlZQotICogaXMgdHJ1ZSwgdGhlIHRvcCBub2RlcyBvZiB0aGUgdHJlZSB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgdGhlIG5vZGUgZ2l2ZW4gYnkgdGhlIHNpdGVtYXAgcGFyYW1ldGVycwotICogYXJlYS9wYXRoIHdpbGwgYmUgdW5mb2xkZWQuIElmIGluaXRpYWxUcmVlIGlzIGZhbHNlLCBvbmx5IHRoZSBjaGlsZHJlbiBvZiB0aGUgc2VsZWN0ZWQgbm9kZQotICogd2lsbCBiZSBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRldHJlZUZyYWdtZW50R2VuZXJhdG9yIGV4dGVuZHMgU2VydmljZWFibGVHZW5lcmF0b3IgewotCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uOwotCi0gICAgLyoqIFBhcmFtZXRlciB3aGljaCBkZW5vdGVzIHRoZSBwYXRoIG9mIHRoZSBjbGlja2VkIG5vZGUgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGg7Ci0KLSAgICAvKiogUGFyYW1ldGVyIHdoaWNoIGRlbm90ZXMgdGhlIGFyZWEgb2YgdGhlIGNsaWNrZWQgbm9kZSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgYXJlYTsKLQotICAgIC8qKgotICAgICAqIFBhcmFtZXRlciB3aGljaCBkZWNpZGVzIGlmIHRoZSBpbml0aWFsIHRyZWUgd2l0aCB0aGUgcm9vdCBub2RlcyBpcyBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsVHJlZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJhbWV0ZXIgd2hpY2ggZGVjaWRlcyBpZiB0aGUgbm9kZSBtaW1lIHR5cGVzIHNob3VsZCBiZSByZXBvcnRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHNob3dUeXBlOwotCi0gICAgLyoqIEZJWE1FOiBzaG91bGQgcGFzcyB0aGlzIGFzIGEgcGFyYW1ldGVyICovCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGFyZWFzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG9iamVjdCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gQXR0cmlidXRlc0ltcGwgZm9yIGV2ZXJ5IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEF0dHJpYnV0ZXNJbXBsIGF0dHJpYnV0ZXM7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BUkVBID0gImFyZWEiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BBVEggPSAicGF0aCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fSU5JVElBTCA9ICJpbml0aWFsIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFID0gIm1pbWV0eXBlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BUkVBUyA9ICJhcmVhcyI7Ci0KLSAgICAvKiogVGhlIFVSSSBvZiB0aGUgbmFtZXNwYWNlIG9mIHRoaXMgZ2VuZXJhdG9yLiAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSSA9ICJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvc2l0ZXRyZWUvMS4wIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVVJJID0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI7Ci0KLSAgICAvKiogVGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlLiAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJzaXRlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUFJFRklYID0gInhtbCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX05PREUgPSAibm9kZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9MQUJFTCA9ICJsYWJlbCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9TSVRFID0gInNpdGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfRlJBR01FTlQgPSAiZnJhZ21lbnQiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT0xERVIgPSAiZm9sZGVyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FSRUEgPSAiYXJlYSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QVUJMSUNBVElPTiA9ICJwdWJsaWNhdGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQUJFTCA9ICJsYWJlbCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WSVNJQkxFSU5OQVYgPSAidmlzaWJsZWlubmF2IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xJTksgPSAibGluayI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFID0gImJhc2UiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1VGRklYID0gInN1ZmZpeCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9IUkVGID0gImhyZWYiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVVJRCA9ICJ1dWlkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBTkcgPSAibGFuZyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFID0gIm1pbWV0eXBlIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb2Nvb24uc2l0ZW1hcC5TaXRlbWFwTW9kZWxDb21wb25lbnQjc2V0dXAob3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXIsCi0gICAgICogICAgICBqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldHVwKFNvdXJjZVJlc29sdmVyIF9yZXNvbHZlciwgTWFwIF9vYmplY3RNb2RlbCwgU3RyaW5nIHNyYywgUGFyYW1ldGVycyBwYXIpCi0gICAgICAgICAgICB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldHVwKF9yZXNvbHZlciwgX29iamVjdE1vZGVsLCBzcmMsIHBhcik7Ci0KLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChfb2JqZWN0TW9kZWwpOwotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlc29sdmluZyBwYWdlIGVudmVsb3BlIGZvciBVUkwgWyIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmFyZWEgPSBwYXIuZ2V0UGFyYW1ldGVyKFBBUkFNX0FSRUEsIG51bGwpOwotICAgICAgICB0aGlzLnBhdGggPSBwYXIuZ2V0UGFyYW1ldGVyKFBBUkFNX1BBVEgsIG51bGwpOwotCi0gICAgICAgIGlmIChwYXIuaXNQYXJhbWV0ZXIoUEFSQU1fSU5JVElBTCkpIHsKLSAgICAgICAgICAgIHRoaXMuaW5pdGlhbFRyZWUgPSBCb29sZWFuLnZhbHVlT2YocGFyLmdldFBhcmFtZXRlcihQQVJBTV9JTklUSUFMLCBudWxsKSkKLSAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5pbml0aWFsVHJlZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocGFyLmlzUGFyYW1ldGVyKFBBUkFNX1RZUEUpKSB7Ci0gICAgICAgICAgICB0aGlzLnNob3dUeXBlID0gQm9vbGVhbi52YWx1ZU9mKHBhci5nZXRQYXJhbWV0ZXIoUEFSQU1fVFlQRSwgbnVsbCkpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5zaG93VHlwZSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhci5pc1BhcmFtZXRlcihQQVJBTV9BUkVBUykpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJBcmVhcyA9IHBhci5nZXRQYXJhbWV0ZXIoUEFSQU1fQVJFQVMsIG51bGwpOwotICAgICAgICAgICAgdGhpcy5hcmVhcyA9IHBhckFyZWFzLnNwbGl0KCIsIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcFtdID0geyAiYXV0aG9yaW5nIiwgImFyY2hpdmUiLCAidHJhc2giIH07Ci0gICAgICAgICAgICB0aGlzLmFyZWFzID0gdGVtcDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHRoaXMuZ2V0TG9nZ2VyKCkuZGVidWcoIlBhcmFtZXRlciBhcmVhOiAiICsgdGhpcy5hcmVhKTsKLSAgICAgICAgICAgIHRoaXMuZ2V0TG9nZ2VyKCkuZGVidWcoIlBhcmFtZXRlciBwYXRoOiAiICsgdGhpcy5wYXRoKTsKLSAgICAgICAgICAgIHRoaXMuZ2V0TG9nZ2VyKCkuZGVidWcoIlBhcmFtZXRlciBpbml0aWFsVHJlZTogIiArIHRoaXMuaW5pdGlhbFRyZWUpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGFyZWFzU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFyZWFzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXJlYXNTdHIuYXBwZW5kKHRoaXMuYXJlYXNbaV0pLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5kZWJ1ZygiUGFyYW1ldGVyIGFyZWFzOiAiICsgYXJlYXNTdHIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5wdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbih0aGlzLm1hbmFnZXIsIF9vYmplY3RNb2RlbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBwdWJsaWNhdGlvbjogIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29jb29uLmdlbmVyYXRpb24uR2VuZXJhdG9yI2dlbmVyYXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKFBSRUZJWCwgVVJJKTsKLQotICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBBVFRSX1BVQkxJQ0FUSU9OLCBBVFRSX1BVQkxJQ0FUSU9OLCAiQ0RBVEEiLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnB1YmxpY2F0aW9uLmdldElkKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbFRyZWUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBBVFRSX0FSRUEsIEFUVFJfQVJFQSwgIkNEQVRBIiwgdGhpcy5hcmVhKTsKLSAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBBVFRSX0JBU0UsIEFUVFJfQkFTRSwgIkNEQVRBIiwgdGhpcy5wYXRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQoVVJJLAotICAgICAgICAgICAgICAgICAgICBOT0RFX0ZSQUdNRU5ULAotICAgICAgICAgICAgICAgICAgICBQUkVGSVggKyAnOicgKyBOT0RFX0ZSQUdNRU5ULAotICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMpOwotCi0gICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsVHJlZSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hcmVhcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUZyYWdtZW50SW5pdGlhbCh0aGlzLmFyZWFzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlRnJhZ21lbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KFVSSSwgTk9ERV9GUkFHTUVOVCwgUFJFRklYICsgJzonICsgTk9ERV9GUkFHTUVOVCk7Ci0KLSAgICAgICAgICAgIHRoaXMuY29udGVudEhhbmRsZXIuZW5kUHJlZml4TWFwcGluZyhQUkVGSVgpOwotICAgICAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpOwotCi0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgU2l0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgZnJhZ21lbnQgb2YgdGhlIHRyZWUgd2hpY2ggY29udGFpbnMgdGhlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gbm9kZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRnJhZ21lbnQoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIXRoaXMuYXJlYS5lcXVhbHMoUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpCi0gICAgICAgICAgICAgICAgJiYgIXRoaXMuYXJlYS5lcXVhbHMoUHVibGljYXRpb24uQVJDSElWRV9BUkVBKQotICAgICAgICAgICAgICAgICYmICF0aGlzLmFyZWEuZXF1YWxzKFB1YmxpY2F0aW9uLlRSQVNIX0FSRUEpCi0gICAgICAgICAgICAgICAgJiYgIXRoaXMuYXJlYS5lcXVhbHMoUHVibGljYXRpb24uTElWRV9BUkVBKQotICAgICAgICAgICAgICAgICYmICF0aGlzLmFyZWEuZXF1YWxzKFB1YmxpY2F0aW9uLlNUQUdJTkdfQVJFQSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJJbnZhbGlkIGFyZWE6ICIgKyB0aGlzLmFyZWEpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzaXRlID0gdGhpcy5wdWJsaWNhdGlvbi5nZXRBcmVhKHRoaXMuYXJlYSkuZ2V0U2l0ZSgpOwotCi0gICAgICAgICAgICBTaXRlTm9kZVtdIGNoaWxkcmVuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGhpcy5wYXRoLmVxdWFscygiLyIpKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBzaXRlLmdldFRvcExldmVsTm9kZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFNpdGVOb2RlIG5vZGUgPSBzaXRlLmdldE5vZGUodGhpcy5wYXRoKTsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkTm9kZXMoY2hpbGRyZW4pOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIG5vZGVzIChub3QgcmVjdXJzaXZlKS4KLSAgICAgKiBAcGFyYW0gY2hpbGRyZW4KLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGROb2RlcyhTaXRlTm9kZVtdIGNoaWxkcmVuKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc3RhcnROb2RlKE5PREVfTk9ERSwgY2hpbGRyZW5baV0pOwotICAgICAgICAgICAgYWRkTGFiZWxzKGNoaWxkcmVuW2ldKTsKLSAgICAgICAgICAgIGVuZE5vZGUoTk9ERV9OT0RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgdG9wIG5vZGUgb2YgdGhlIGdpdmVuIGFyZWEgYW5kIHRoZW4gY2FsbHMgYSByZWN1cnNpdmUgbWV0aG9kIHRvIHRyYXZlcnNlIHRoZQotICAgICAqIHRyZWUsIGlmIHRoZSBub2RlIGdpdmVuIGJ5IGFyZWEvcGF0aCBpcyBpbiB0aGlzIGFyZWEuCi0gICAgICogQHBhcmFtIHNpdGVBcmVhCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUZyYWdtZW50SW5pdGlhbChTdHJpbmcgc2l0ZUFyZWEpIHRocm93cyBTaXRlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sCi0gICAgICAgICAgICBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIFNpdGVNYW5hZ2VyIHNpdGVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gKFNlcnZpY2VTZWxlY3RvcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTaXRlTWFuYWdlci5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICBzaXRlTWFuYWdlciA9IChTaXRlTWFuYWdlcikgc2VsZWN0b3Iuc2VsZWN0KHRoaXMucHVibGljYXRpb24uZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzaXRlVHJlZSA9IHRoaXMucHVibGljYXRpb24uZ2V0QXJlYShzaXRlQXJlYSkuZ2V0U2l0ZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyBpc0ZvbGRlciA9ICIiOwotCi0gICAgICAgICAgICAvLyBGSVhNRTogZG9uJ3QgaGFyZGNvZGUgYXJlYSBsYWJlbAotICAgICAgICAgICAgaWYgKHNpdGVBcmVhLmVxdWFscyhQdWJsaWNhdGlvbi5BVVRIT1JJTkdfQVJFQSkpCi0gICAgICAgICAgICAgICAgbGFiZWwgPSAiQXV0aG9yaW5nIjsKLSAgICAgICAgICAgIGlmIChzaXRlQXJlYS5lcXVhbHMoUHVibGljYXRpb24uQVJDSElWRV9BUkVBKSkKLSAgICAgICAgICAgICAgICBsYWJlbCA9ICJBcmNoaXZlIjsKLSAgICAgICAgICAgIGlmIChzaXRlQXJlYS5lcXVhbHMoUHVibGljYXRpb24uVFJBU0hfQVJFQSkpCi0gICAgICAgICAgICAgICAgbGFiZWwgPSAiVHJhc2giOwotICAgICAgICAgICAgaWYgKHNpdGVBcmVhLmVxdWFscyhQdWJsaWNhdGlvbi5MSVZFX0FSRUEpKQotICAgICAgICAgICAgICAgIGxhYmVsID0gIkxpdmUiOwotICAgICAgICAgICAgaWYgKHNpdGVBcmVhLmVxdWFscyhQdWJsaWNhdGlvbi5TVEFHSU5HX0FSRUEpKQotICAgICAgICAgICAgICAgIGxhYmVsID0gIlN0YWdpbmciOwotCi0gICAgICAgICAgICBpZiAoc2l0ZVRyZWUuZ2V0VG9wTGV2ZWxOb2RlcygpLmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgaXNGb2xkZXIgPSAidHJ1ZSI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaXNGb2xkZXIgPSAiZmFsc2UiOwotCi0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIEFUVFJfQVJFQSwgQVRUUl9BUkVBLCAiQ0RBVEEiLCBzaXRlQXJlYSk7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBBVFRSX0ZPTERFUiwgQVRUUl9GT0xERVIsICJDREFUQSIsIGlzRm9sZGVyKTsKLSAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIEFUVFJfTEFCRUwsIEFUVFJfTEFCRUwsICJDREFUQSIsIGxhYmVsKTsKLQotICAgICAgICAgICAgc3RhcnROb2RlKE5PREVfU0lURSk7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmFyZWEuZXF1YWxzKHNpdGVBcmVhKSkgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlRnJhZ21lbnRSZWN1cnNpdmUoc2l0ZVRyZWUuZ2V0VG9wTGV2ZWxOb2RlcygpLCB0aGlzLnBhdGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbmROb2RlKE5PREVfU0lURSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShzaXRlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvbGxvd3MgdGhlIHBhdGggdG8gZmluZCB0aGUgd2F5IGluIHRoZSBzaXRldHJlZSB0byB0aGUgc3BlY2lmaWVkIG5vZGUgYW5kIG9wZW5zIGFsbAotICAgICAqIGZvbGRlcnMgb24gaXRzIHdheS4KLSAgICAgKiBAcGFyYW0gbm9kZXMKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVGcmFnbWVudFJlY3Vyc2l2ZShTaXRlTm9kZVtdIG5vZGVzLCBTdHJpbmcgcGF0aCkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbm9kZWlkOwotICAgICAgICBTdHJpbmcgY2hpbGRpZDsKLQotICAgICAgICBpZiAobm9kZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKQotICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotICAgICAgICBpZiAocGF0aC5pbmRleE9mKCIvIikgIT0gLTEpIHsKLSAgICAgICAgICAgIG5vZGVpZCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGguaW5kZXhPZigiLyIpKTsKLSAgICAgICAgICAgIGNoaWxkaWQgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoIi8iKSArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm9kZWlkID0gcGF0aDsKLSAgICAgICAgICAgIGNoaWxkaWQgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFkZE5vZGVSZWN1cnNpdmUobm9kZXNbaV0sIG5vZGVpZCwgY2hpbGRpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBub2RlLCBhbmQgaWYgdGhlIG5vZGUncyBpZCBtYXRjaGVkIHRoZSBnaXZlbiBub2RlaWQsIGl0IGNvbnRpbnVlcyByZWN1cnNpdmVseS4KLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEBwYXJhbSBub2RlaWQKLSAgICAgKiBAcGFyYW0gY2hpbGRpZAotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTm9kZVJlY3Vyc2l2ZShTaXRlTm9kZSBub2RlLCBTdHJpbmcgbm9kZWlkLCBTdHJpbmcgY2hpbGRpZCkKLSAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24sIFNpdGVFeGNlcHRpb24gewotICAgICAgICBzdGFydE5vZGUoTk9ERV9OT0RFLCBub2RlKTsKLSAgICAgICAgYWRkTGFiZWxzKG5vZGUpOwotICAgICAgICBpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKG5vZGVpZCkpIHsKLSAgICAgICAgICAgIGdlbmVyYXRlRnJhZ21lbnRSZWN1cnNpdmUobm9kZS5nZXRDaGlsZHJlbigpLCBjaGlsZGlkKTsKLSAgICAgICAgfQotICAgICAgICBlbmROb2RlKE5PREVfTk9ERSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmVnaW5zIGEgbmFtZWQgbm9kZSBhbmQgY2FsbHMgc2V0Tm9kZUF0dHJpYnV0ZXMgdG8gc2V0IGl0cyBhdHRyaWJ1dGVzLgotICAgICAqIEBwYXJhbSBub2RlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IG5vZGUKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIG5vZGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydE5vZGUoU3RyaW5nIG5vZGVOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQoVVJJLCBub2RlTmFtZSwgUFJFRklYICsgJzonICsgbm9kZU5hbWUsIHRoaXMuYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmVnaW5zIGEgbmFtZWQgbm9kZSBhbmQgY2FsbHMgc2V0Tm9kZUF0dHJpYnV0ZXMgdG8gc2V0IGl0cyBhdHRyaWJ1dGVzLgotICAgICAqIEBwYXJhbSBub2RlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IG5vZGUKLSAgICAgKiBAcGFyYW0gbm9kZSBUaGUgYXR0cmlidXRlcyBhcmUgdGFrZW4gZnJvbSB0aGlzIG5vZGUKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIG5vZGUKLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnROb2RlKFN0cmluZyBub2RlTmFtZSwgU2l0ZU5vZGUgbm9kZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldE5vZGVBdHRyaWJ1dGVzKG5vZGUpOwotICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChVUkksIG5vZGVOYW1lLCBQUkVGSVggKyAnOicgKyBub2RlTmFtZSwgdGhpcy5hdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIG5vZGUuIFNldHMgYXR0cmlidXRlcyBpZCwgaHJlZiwgZm9sZGVyLCBzdWZmaXgsIGJhc2ljLXVybCwKLSAgICAgKiBsYW5ndWFnZS1zdWZmaXguCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgYXR0cmlidXRlcwotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXROb2RlQXR0cmlidXRlcyhTaXRlTm9kZSBub2RlKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gbm9kZS5nZXROYW1lKCk7Ci0gICAgICAgIC8vIFN0cmluZyBpc1Zpc2libGUgPSBCb29sZWFuLnRvU3RyaW5nKG5vZGUudmlzaWJsZUluTmF2KCkpOwotICAgICAgICBTdHJpbmcgaGFzTGluayA9IEJvb2xlYW4udG9TdHJpbmcobm9kZS5oYXNMaW5rKCkpOwotICAgICAgICBTdHJpbmcgaHJlZiA9IG5vZGUuZ2V0SHJlZigpOwotICAgICAgICBTdHJpbmcgc3VmZml4ID0gbm9kZS5nZXRTdWZmaXgoKTsKLSAgICAgICAgU3RyaW5nIGlzRm9sZGVyID0gQm9vbGVhbi50b1N0cmluZyhpc0ZvbGRlcihub2RlKSk7Ci0gICAgICAgIFN0cmluZyB1dWlkID0gbm9kZS5nZXRVdWlkKCk7Ci0KLSAgICAgICAgaWYgKHRoaXMuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5kZWJ1ZygiYWRkaW5nIGF0dHJpYnV0ZSBpZDogIiArIGlkKTsKLSAgICAgICAgICAgIC8vIHRoaXMuZ2V0TG9nZ2VyKCkuZGVidWcoImFkZGluZyBhdHRyaWJ1dGUgdmlzaWJsZWlubmF2OiAiICsKLSAgICAgICAgICAgIC8vIGlzVmlzaWJsZSk7Ci0gICAgICAgICAgICB0aGlzLmdldExvZ2dlcigpLmRlYnVnKCJhZGRpbmcgYXR0cmlidXRlIGxpbms6ICIgKyBoYXNMaW5rKTsKLSAgICAgICAgICAgIGlmIChocmVmICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5kZWJ1ZygiYWRkaW5nIGF0dHJpYnV0ZSBocmVmOiAiICsgaHJlZik7Ci0gICAgICAgICAgICBpZiAoc3VmZml4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5kZWJ1ZygiYWRkaW5nIGF0dHJpYnV0ZSBzdWZmaXg6ICIgKyBzdWZmaXgpOwotICAgICAgICAgICAgdGhpcy5nZXRMb2dnZXIoKS5kZWJ1ZygiYWRkaW5nIGF0dHJpYnV0ZSBmb2xkZXI6ICIgKyBpc0ZvbGRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgQVRUUl9JRCwgQVRUUl9JRCwgIkNEQVRBIiwgaWQpOwotICAgICAgICAvLyBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgQVRUUl9WSVNJQkxFSU5OQVYsIEFUVFJfVklTSUJMRUlOTkFWLAotICAgICAgICAvLyAiQ0RBVEEiLCBpc1Zpc2libGUpOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBBVFRSX0xJTkssIEFUVFJfTElOSywgIkNEQVRBIiwgaGFzTGluayk7Ci0gICAgICAgIGlmIChocmVmICE9IG51bGwpCi0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLCBBVFRSX0hSRUYsIEFUVFJfSFJFRiwgIkNEQVRBIiwgaHJlZik7Ci0gICAgICAgIGlmIChzdWZmaXggIT0gbnVsbCkKLSAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIEFUVFJfU1VGRklYLCBBVFRSX1NVRkZJWCwgIkNEQVRBIiwgc3VmZml4KTsKLSAgICAgICAgaWYgKHV1aWQgIT0gbnVsbCkKLSAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoIiIsIEFUVFJfVVVJRCwgQVRUUl9VVUlELCAiQ0RBVEEiLCB1dWlkKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwgQVRUUl9GT0xERVIsIEFUVFJfRk9MREVSLCAiQ0RBVEEiLCBpc0ZvbGRlcik7Ci0gICAgICAgIAotICAgICAgICBpZiAodGhpcy5zaG93VHlwZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHRoaXMucHVibGljYXRpb24uZ2V0QXJlYSh0aGlzLmFyZWEpCi0gICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudChub2RlLmdldFV1aWQoKSx0aGlzLnB1YmxpY2F0aW9uLmdldERlZmF1bHRMYW5ndWFnZSgpKQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKCIiLEFUVFJfVFlQRSwgQVRUUl9UWVBFLCAiQ0RBVEEiLCB0eXBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgYSBub2RlIGlzIGEgZm9sZGVyIChjb250YWlucyBzdWJub2RlcykuIFdpdGggdGhlCi0gICAgICogaW5jcmVtZW50YWwgc2l0ZXRyZWUgbG9hZGluZywgd2Ugc29tZXRpbWVzIGxvYWQgbm9kZXMgd2hpY2ggYXJlIGZvbGRlcnMsIGJ1dCB3ZSBkb24ndCBsb2FkCi0gICAgICogdGhlaXIgY2hpbGRyZW4uIEJ1dCB3ZSBzdGlsbCBoYXZlIHRvIGtub3cgaWYgaXQncyBhIGZvbGRlciBvciBub3QsIGkuZS4gaWYgaXQgY2FuIGJlIG9wZW5lZC4KLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRm9sZGVyKFNpdGVOb2RlIG5vZGUpIHsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmRzIHRoZSBuYW1lZCBub2RlLgotICAgICAqIEBwYXJhbSBub2RlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IG5vZGUKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGUgbm9kZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGVuZE5vZGUoU3RyaW5nIG5vZGVOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KFVSSSwgbm9kZU5hbWUsIFBSRUZJWCArICc6JyArIG5vZGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhbGwgdGhlIGxhYmVsIGNoaWxkcmVuIG9mIGEgbm9kZSBhbmQgYWRkcyB0aGVtIHRvIHRoZSBuYXYgeG1sLgotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRMYWJlbHMoU2l0ZU5vZGUgbm9kZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IG5vZGUuZ2V0TGFuZ3VhZ2VzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ndWFnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIExpbmsgbGluazsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbGluayA9IG5vZGUuZ2V0TGluayhsYW5ndWFnZXNbaV0pOwotICAgICAgICAgICAgfSBjYXRjaCAoU2l0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRMYWJlbChsaW5rLmdldExhYmVsKCksIGxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGFiZWwgZWxlbWVudCBvZiBhIGdpdmVuIGxhbmd1YWdlLgotICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgdmFsdWUgb2YgdGhlIGxhYmVsCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIHRoZSBsYW5ndWFnZSBvZiB0aGUgbGFiZWwKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZExhYmVsKFN0cmluZyBsYWJlbCwgU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoWE1MX1VSSSwKLSAgICAgICAgICAgICAgICBBVFRSX0xBTkcsCi0gICAgICAgICAgICAgICAgWE1MX1BSRUZJWCArICI6IiArIEFUVFJfTEFORywKLSAgICAgICAgICAgICAgICAiQ0RBVEEiLAotICAgICAgICAgICAgICAgIGxhbmd1YWdlKTsKLQotICAgICAgICB0aGlzLmNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChVUkksCi0gICAgICAgICAgICAgICAgTk9ERV9MQUJFTCwKLSAgICAgICAgICAgICAgICBQUkVGSVggKyAnOicgKyBOT0RFX0xBQkVMLAotICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyk7Ci0gICAgICAgIGNoYXJbXSBsYWJlbEFycmF5ID0gbGFiZWwudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKGxhYmVsQXJyYXksIDAsIGxhYmVsQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KFVSSSwgTk9ERV9MQUJFTCwgUFJFRklYICsgJzonICsgTk9ERV9MQUJFTCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vdHJhbnNmb3JtYXRpb24vQWNjZXNzQ29udHJvbFNpdGV0cmVlVHJhbnNmb3JtZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9BY2Nlc3NDb250cm9sU2l0ZXRyZWVUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDI2N2M0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi90cmFuc2Zvcm1hdGlvbi9BY2Nlc3NDb250cm9sU2l0ZXRyZWVUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQ6IEFjY2Vzc0NvbnRyb2xTaXRldHJlZVRyYW5zZm9ybWVyLmphdmEgMTUzNTYxIDIwMDUtMDItMTIgMjE6NDk6MThaIGdyZWdvciAkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLlByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5BYnN0cmFjdFNBWFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2Nlc3NDb250cm9sbGVyUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5BY2NyZWRpdGFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5Qb2xpY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuUm9sZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuRGVmYXVsdFNpdGVUcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5TZXJ2bGV0SGVscGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKgotICogVGhpcyB0cmFuc2Zvcm1lciBpcyBhcHBsaWVkIHRvIHRoZSBzaXRldHJlZS4gSXQgbWFya3MgdGhlIHNpdGUgZWxlbWVudCBhbmQgYWxsIG5vZGUgZWxlbWVudHMgdGhlCi0gKiBjdXJyZW50IGlkZW50aXR5IGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB3aXRoIGEgPGNvZGU+cHJvdGVjdGVkPSJ0cnVlIjwvY29kZT4gYXR0cmlidXRlLgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzQ29udHJvbFNpdGV0cmVlVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFNBWFRyYW5zZm9ybWVyIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5BVFRSSUJVVEVfUFJPVEVDVEVEPC9jb2RlPiBUaGUgYXR0cmlidXRlIGZvciBwcm90ZWN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfUFJPVEVDVEVEID0gInByb3RlY3RlZCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+UEFSQU1FVEVSX1BVQkxJQ0FUSU9OX0lEPC9jb2RlPiBUaGUgcHVibGljYXRpb24gaWQgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1BVQkxJQ0FUSU9OX0lEID0gInB1YmxpY2F0aW9uLWlkIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5QQVJBTUVURVJfQVJFQTwvY29kZT4gVGhlIGFyZWEgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX0FSRUEgPSAiYXJlYSI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkb2N1bWVudElkOwotICAgIHByaXZhdGUgU2VydmljZVNlbGVjdG9yIHNlcnZpY2VTZWxlY3RvcjsKLSAgICBwcml2YXRlIFBvbGljeU1hbmFnZXIgcG9saWN5TWFuYWdlcjsKLSAgICBwcml2YXRlIEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlciBhY1Jlc29sdmVyOwotICAgIHByaXZhdGUgQWNjcmVkaXRhYmxlTWFuYWdlciBhY2NyZWRpdGFibGVNYW5hZ2VyOwotICAgIHByaXZhdGUgSWRlbnRpdHkgaWRlbnRpdHk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsUHJlZml4OwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvY29vbi5zaXRlbWFwLlNpdGVtYXBNb2RlbENvbXBvbmVudCNzZXR1cChvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5Tb3VyY2VSZXNvbHZlciwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXAsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0dXAoU291cmNlUmVzb2x2ZXIgX3Jlc29sdmVyLCBNYXAgX29iamVjdE1vZGVsLCBTdHJpbmcgc3JjLCBQYXJhbWV0ZXJzIHBhcikKLSAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0dXAoX3Jlc29sdmVyLCBfb2JqZWN0TW9kZWwsIHNyYywgcGFyKTsKLQotICAgICAgICB0aGlzLnNlcnZpY2VTZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIHRoaXMuYWNSZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRoaXMucG9saWN5TWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAgdGhpcy5pZGVudGl0eSA9IElkZW50aXR5LmdldElkZW50aXR5KHRoaXMucmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwdWJsaWNhdGlvbklkID0gcGFyLmdldFBhcmFtZXRlcihQQVJBTUVURVJfUFVCTElDQVRJT05fSUQpOwotICAgICAgICAgICAgU3RyaW5nIGFyZWEgPSBwYXIuZ2V0UGFyYW1ldGVyKFBBUkFNRVRFUl9BUkVBKTsKLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiU2V0dGluZyB1cCB0cmFuc2Zvcm1lciIpOwotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIgICAgSWRlbnRpdHk6ICAgICAgIFsiICsgdGhpcy5pZGVudGl0eSArICJdIik7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBQdWJsaWNhdGlvbiBJRDogWyIgKyBwdWJsaWNhdGlvbklkICsgIl0iKTsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiICAgIEFyZWE6ICAgICAgICAgICBbIiArIGFyZWEgKyAiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLnVybFByZWZpeCA9ICIvIiArIHB1YmxpY2F0aW9uSWQgKyAiLyIgKyBhcmVhOwotCi0gICAgICAgICAgICBSZXF1ZXN0IF9yZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChfb2JqZWN0TW9kZWwpOwotCi0gICAgICAgICAgICB0aGlzLnNlcnZpY2VTZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoQWNjZXNzQ29udHJvbGxlclJlc29sdmVyLlJPTEUKLSAgICAgICAgICAgICAgICAgICAgKyAiU2VsZWN0b3IiKTsKLQotICAgICAgICAgICAgdGhpcy5hY1Jlc29sdmVyID0gKEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlcikgdGhpcy5zZXJ2aWNlU2VsZWN0b3Iuc2VsZWN0KEFjY2Vzc0NvbnRyb2xsZXJSZXNvbHZlci5ERUZBVUxUX1JFU09MVkVSKTsKLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiICAgIFJlc29sdmVkIEFDIHJlc29sdmVyIFsiICsgdGhpcy5hY1Jlc29sdmVyICsgIl0iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHdlYmFwcFVybCA9IFNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKF9yZXF1ZXN0KTsKLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIgYWNjZXNzQ29udHJvbGxlciA9IHRoaXMuYWNSZXNvbHZlci5yZXNvbHZlQWNjZXNzQ29udHJvbGxlcih3ZWJhcHBVcmwpOwotICAgICAgICAgICAgdGhpcy5hY2NyZWRpdGFibGVNYW5hZ2VyID0gYWNjZXNzQ29udHJvbGxlci5nZXRBY2NyZWRpdGFibGVNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB0aGlzLnBvbGljeU1hbmFnZXIgPSBhY2Nlc3NDb250cm9sbGVyLmdldFBvbGljeU1hbmFnZXIoKTsKLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiICAgIFVzaW5nIHBvbGljeSBtYW5hZ2VyIFsiICsgdGhpcy5wb2xpY3lNYW5hZ2VyICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyYW1ldGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5hY3Rpdml0eS5EaXNwb3NhYmxlI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiRGlzcG9zaW5nIHRyYW5zZm9ybWVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMuc2VydmljZVNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmFjUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZVNlbGVjdG9yLnJlbGVhc2UodGhpcy5hY1Jlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHRoaXMuc2VydmljZVNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnREb2N1bWVudCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydERvY3VtZW50KCk7Ci0gICAgICAgIHRoaXMuZG9jdW1lbnRJZCA9ICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHJhdywgQXR0cmlidXRlcyBhdHRyKQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gYXR0cjsKLQotICAgICAgICBpZiAoaXNGcmFnbWVudE5vZGUodXJpLCBsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJlYSA9IGF0dHIuZ2V0VmFsdWUoImFyZWEiKTsgLy8gRklYTUU6IGRvbid0IGhhcmRjb2RlCi0gICAgICAgICAgICBTdHJpbmcgYmFzZSA9IGF0dHIuZ2V0VmFsdWUoImJhc2UiKTsKLSAgICAgICAgICAgIGlmIChhcmVhICE9IG51bGwgJiYgYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudElkID0gIi8iICsgYXJlYSArIGJhc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzTm9kZSh1cmksIGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IGF0dHIuZ2V0VmFsdWUoU2l0ZVRyZWVOb2RlSW1wbC5JRF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRJZCArPSAiLyIgKyBpZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiQ2hlY2tpbmcgbm9kZSIpOwotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCIgICAgRG9jdW1lbnQgSUQ6IFsiICsgdGhpcy5kb2N1bWVudElkICsgIl0iKTsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiICAgIFVSTDogICAgICAgICBbIiArIHRoaXMudXJsUHJlZml4ICsgdGhpcy5kb2N1bWVudElkICsgIl0iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gdGhpcy51cmxQcmVmaXggKyB0aGlzLmRvY3VtZW50SWQ7Ci0gICAgICAgICAgICAgICAgUm9sZVtdIHJvbGVzID0gdGhpcy5wb2xpY3lNYW5hZ2VyLmdldEdyYW50ZWRSb2xlcyh0aGlzLmFjY3JlZGl0YWJsZU1hbmFnZXIsIHRoaXMuaWRlbnRpdHksIHVybCk7Ci0KLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiICAgIFJvbGVzOiAgICAgICBbIiArIHJvbGVzLmxlbmd0aCArICJdIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocm9sZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIiAgICBBZGRpbmcgYXR0cmlidXRlIFtwcm90ZWN0ZWQ9J3RydWUnXSIpOwotCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHJpYnV0ZXNJbXBsID0gbmV3IEF0dHJpYnV0ZXNJbXBsKGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzSW1wbC5hZGRBdHRyaWJ1dGUoIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUklCVVRFX1BST1RFQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSSUJVVEVfUFJPVEVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlc0ltcGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcmF3LCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcmF3KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZW5kRWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcmF3KTsKLSAgICAgICAgaWYgKGlzTm9kZSh1cmksIGxvY2FsTmFtZSkgJiYgdGhpcy5kb2N1bWVudElkLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdGhpcy5kb2N1bWVudElkID0gdGhpcy5kb2N1bWVudElkLnN1YnN0cmluZygwLCB0aGlzLmRvY3VtZW50SWQubGFzdEluZGV4T2YoIi8iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIGFuIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNpdGV0cmVlIG5vZGUuCi0gICAgICogQHBhcmFtIHVyaSBUaGUgbmFtZXNwYWNlIFVSSS4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lLgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTm9kZShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIHJldHVybiB1cmkuZXF1YWxzKERlZmF1bHRTaXRlVHJlZS5OQU1FU1BBQ0VfVVJJKQotICAgICAgICAgICAgICAgICYmIChsb2NhbE5hbWUuZXF1YWxzKFNpdGVUcmVlTm9kZUltcGwuTk9ERV9OQU1FKSB8fCBsb2NhbE5hbWUuZXF1YWxzKCJzaXRlIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgYW4gZWxlbWVudCByZXByZXNlbnRzIGEgZnJhZ21lbnQgbm9kZS4KLSAgICAgKiBAcGFyYW0gdXJpIFRoZSBuYW1lc3BhY2UgVVJJLgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUuCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGcmFnbWVudE5vZGUoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gdXJpLmVxdWFscyhEZWZhdWx0U2l0ZVRyZWUuTkFNRVNQQUNFX1VSSSkgJiYgKGxvY2FsTmFtZS5lcXVhbHMoImZyYWdtZW50IikpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL0RlZmF1bHRTaXRlVHJlZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL0RlZmF1bHRTaXRlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q0MDRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9EZWZhdWx0U2l0ZVRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5YUGF0aEFQSTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIERlZmF1bHQgc2l0ZXRyZWUgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogRGVmYXVsdFNpdGVUcmVlLmphdmEgMjA4NzY0IDIwMDUtMDctMDEgMTU6NTc6MjFaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFNpdGVUcmVlIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgU2l0ZVRyZWUgewotCi0gICAgLyoqCi0gICAgICogVGhlIHNpdGV0cmVlIG5hbWVzcGFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9zaXRldHJlZS8xLjAiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHNpdGV0cmVlIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9UUkVFX0ZJTEVOQU1FID0gInNpdGV0cmVlLnhtbCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzb3VyY2VVcmk7Ci0gICAgLy8gdGhlIGFyZWEgaXMgb25seSByZXRhaW5lZCB0byBwcm92aWRlIHNvbWUgbW9yZSBpbmZvIHdoZW4gcmFpc2luZyBhbgotICAgIC8vIGV4Y2VwdGlvbi4KLSAgICBwcml2YXRlIFN0cmluZyBhcmVhID0gIiI7Ci0gICAgcHJpdmF0ZSBQdWJsaWNhdGlvbiBwdWI7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLSAgICBwcml2YXRlIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5OwotCi0gICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGUgcmVwb3NpdG9yeU5vZGU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hhbmdlZDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIERlZmF1bHRTaXRlVHJlZQotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkb2N1bWVudCBmYWN0b3J5LgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIF9hcmVhIFRoZSBhcmVhLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERlZmF1bHRTaXRlVHJlZShEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBfYXJlYSwKLSAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLQotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodGhpcywgbG9nZ2VyKTsKLQotICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgICAgICB0aGlzLnB1YiA9IHB1YmxpY2F0aW9uOwotICAgICAgICB0aGlzLnNvdXJjZVVyaSA9IHB1YmxpY2F0aW9uLmdldFNvdXJjZVVSSSgpICsgIi9jb250ZW50LyIgKyBfYXJlYSArICIvIgotICAgICAgICAgICAgICAgICsgU0lURV9UUkVFX0ZJTEVOQU1FOwotICAgICAgICB0aGlzLmFyZWEgPSBfYXJlYTsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChnZXRSZXBvc2l0b3J5Tm9kZSgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudCA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudChnZXRSZXBvc2l0b3J5Tm9kZSgpLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiRW1wdHkgc2l0ZXRyZWUgd2lsbCBiZSBjcmVhdGVkL2luaXRpYWxpemVkISIpOwotICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlRG9jdW1lbnQoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEhlbHBlci53cml0ZURvY3VtZW50KHRoaXMuZG9jdW1lbnQsIGdldFJlcG9zaXRvcnlOb2RlKCkuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIHRyZWUgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBleHRlcm5hbGx5IGFuZCByZWxvYWRzIHRoZSBzaXRlCi0gICAgICogdHJlZS4gcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrTW9kaWZpZWQoKSB7IGlmCi0gICAgICogKHRoaXMuYXJlYS5lcXVhbHMoUHVibGljYXRpb24uTElWRV9BUkVBKSAmJiB0aGlzLnRyZWVmaWxlLmxhc3RNb2RpZmllZCgpID4KLSAgICAgKiB0aGlzLmxhc3RNb2RpZmllZCkgewotICAgICAqIAotICAgICAqIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7IGdldExvZ2dlcigpLmRlYnVnKCJTaXRldHJlZSBbIiArCi0gICAgICogdGhpcy50cmVlZmlsZSArICJdIGhhcyBjaGFuZ2VkOiByZWxvYWRpbmcuIik7IH0KLSAgICAgKiAKLSAgICAgKiB0cnkgeyB0aGlzLmRvY3VtZW50ID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KHRoaXMudHJlZWZpbGUpOyB9IGNhdGNoCi0gICAgICogKEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOyB9Ci0gICAgICogdGhpcy5sYXN0TW9kaWZpZWQgPSB0aGlzLnRyZWVmaWxlLmxhc3RNb2RpZmllZCgpOyB9IH0KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEZWZhdWx0U2l0ZVRyZWUgeG1sIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBzaXRlIGRvY3VtZW50Ci0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRG9jdW1lbnQoTkFNRVNQQUNFX1VSSSwgInNpdGUiLCBudWxsKTsKLQotICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpOwotICAgICAgICByb290Ci0gICAgICAgICAgICAgICAgLnNldEF0dHJpYnV0ZSgieHNpOnNjaGVtYUxvY2F0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvc2l0ZXRyZWUvMS4wICAuLi8uLi8uLi8uLi9yZXNvdXJjZXMvZW50aXRpZXMvc2l0ZXRyZWUueHNkIik7Ci0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYSBub2RlIGluIGEgc3VidHJlZS4gVGhlIHNlYXJjaCBpcyBzdGFydGVkIGF0IHRoZSBnaXZlbiBub2RlLiBUaGUKLSAgICAgKiBsaXN0IG9mIGlkcyBjb250YWlucyB0aGUgZG9jdW1lbnQtaWQgc3BsaXQgYnkgIi8iLgotICAgICAqIEBwYXJhbSBub2RlIHdoZXJlIHRvIHN0YXJ0IHRoZSBzZWFyY2gKLSAgICAgKiBAcGFyYW0gaWRzIGxpc3Qgb2Ygbm9kZSBpZHMKLSAgICAgKiBAcmV0dXJuIHRoZSBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgbGlzdCBvZiBpZHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIE5vZGUgZmluZE5vZGUoTm9kZSBub2RlLCBMaXN0IGlkcykgewotICAgICAgICBpZiAoaWRzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVMaXN0IG5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGVzLml0ZW0oaSkuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBpZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJpZCIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlkQXR0cmlidXRlICE9IG51bGwgJiYgISIiLmVxdWFscyhpZEF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGlkQXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpLmVxdWFscyhpZHMuZ2V0KDApKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluZE5vZGUobm9kZXMuaXRlbShpKSwgaWRzLnN1Ykxpc3QoMSwgaWRzLnNpemUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vZGUgd2Fzbid0IGZvdW5kCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGROb2RlKFNpdGVUcmVlTm9kZSBub2RlLCBTdHJpbmcgcmVmcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTaXRlVHJlZU5vZGUgdGFyZ2V0ID0gYWRkTm9kZShub2RlLmdldFBhcmVudCgpLmdldFBhdGgoKSwgbm9kZS5nZXROYW1lKCksIG5vZGUuZ2V0VXVpZCgpLAotICAgICAgICAgICAgICAgIG5vZGUuaXNWaXNpYmxlKCksIG5vZGUuZ2V0SHJlZigpLCBub2RlLmdldFN1ZmZpeCgpLCBub2RlLmhhc0xpbmsoKSwgcmVmcGF0aCk7Ci0gICAgICAgIGNvcHlMaW5rcyhub2RlLCB0YXJnZXQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlMaW5rcyhTaXRlVHJlZU5vZGUgc291cmNlLCBTaXRlVHJlZU5vZGUgdGFyZ2V0KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IHNvdXJjZS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ndWFnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFkZExhYmVsKHRhcmdldC5nZXRQYXRoKCksIGxhbmd1YWdlc1tpXSwgc291cmNlLmdldExpbmsobGFuZ3VhZ2VzW2ldKS5nZXRMYWJlbCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGROb2RlKFN0cmluZyBwYXJlbnRpZCwgU3RyaW5nIGlkLCBTdHJpbmcgdXVpZCwgYm9vbGVhbiB2aXNpYmxlSW5OYXYpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGFkZE5vZGUocGFyZW50aWQsIGlkLCB1dWlkLCB2aXNpYmxlSW5OYXYsIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgYWRkTm9kZShTaXRlVHJlZU5vZGUgbm9kZSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBhZGROb2RlKG5vZGUsIG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU2l0ZVRyZWVOb2RlSW1wbCBhZGROb2RlKFN0cmluZyBwYXRoLCBTdHJpbmcgdXVpZCwgYm9vbGVhbiB2aXNpYmxlSW5OYXYsCi0gICAgICAgICAgICBTdHJpbmcgaHJlZiwgU3RyaW5nIHN1ZmZpeCwgYm9vbGVhbiBsaW5rLCBTdHJpbmcgcmVmcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgsICIvIik7Ci0gICAgICAgIGludCBsZW5ndGggPSBzdC5jb3VudFRva2VucygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGxlbmd0aCAtIDEpOyBpKyspIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIi8iICsgc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXJlbnRpZCA9IGJ1Zi50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgaWQgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIGFkZE5vZGUocGFyZW50aWQsIGlkLCB1dWlkLCB2aXNpYmxlSW5OYXYsIGhyZWYsIHN1ZmZpeCwgbGluaywgcmVmcGF0aCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTaXRlVHJlZU5vZGVJbXBsIGFkZE5vZGUoU3RyaW5nIHBhdGgsIFN0cmluZyB1dWlkLCBib29sZWFuIHZpc2libGVJbk5hdiwKLSAgICAgICAgICAgIFN0cmluZyBocmVmLCBTdHJpbmcgc3VmZml4LCBib29sZWFuIGxpbmspIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGFkZE5vZGUocGF0aCwgdXVpZCwgdmlzaWJsZUluTmF2LCBocmVmLCBzdWZmaXgsIGxpbmssIG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU2l0ZVRyZWVOb2RlSW1wbCBhZGROb2RlKFN0cmluZyBwYXJlbnRpZCwgU3RyaW5nIGlkLCBTdHJpbmcgdXVpZCwKLSAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZUluTmF2LCBTdHJpbmcgaHJlZiwgU3RyaW5nIHN1ZmZpeCwgYm9vbGVhbiBsaW5rKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBhZGROb2RlKHBhcmVudGlkICsgIi8iICsgaWQsIHV1aWQsIHZpc2libGVJbk5hdiwgaHJlZiwgc3VmZml4LCBsaW5rLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYXJlbnRzKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIHN0ZXBzID0gcGF0aC5zdWJzdHJpbmcoMSkuc3BsaXQoIi8iKTsKLSAgICAgICAgaW50IHMgPSAwOwotICAgICAgICBTdHJpbmcgYW5jZXN0b3JQYXRoID0gIiI7Ci0gICAgICAgIHdoaWxlIChzIDwgc3RlcHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpZiAoIWNvbnRhaW5zKGFuY2VzdG9yUGF0aCkpIHsKLSAgICAgICAgICAgICAgICBhZGQoYW5jZXN0b3JQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFuY2VzdG9yUGF0aCArPSAiLyIgKyBzdGVwc1tzXTsKLSAgICAgICAgICAgIHMrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU2l0ZVRyZWVOb2RlSW1wbCBhZGROb2RlKFN0cmluZyBwYXJlbnRQYXRoLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHV1aWQsCi0gICAgICAgICAgICBib29sZWFuIHZpc2libGVJbk5hdiwgU3RyaW5nIGhyZWYsIFN0cmluZyBzdWZmaXgsIGJvb2xlYW4gbGluaywgU3RyaW5nIHJlZnBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBwYXJlbnRQYXRoICsgIi8iICsgbmFtZTsKLSAgICAgICAgY3JlYXRlUGFyZW50cyhwYXRoKTsKLQotICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBnZXROb2RlSW50ZXJuYWwocGFyZW50UGF0aCk7Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlBBUkVOVCBFTEVNRU5UOiAiICsgcGFyZW50Tm9kZSk7Ci0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJWSVNJQkxFSU5OQVYgSVM6ICIgKyB2aXNpYmxlSW5OYXYpOwotCi0gICAgICAgIC8vIENoZWNrIGlmIGNoaWxkIGFscmVhZHkgZXhpc3RzCi0gICAgICAgIE5vZGUgY2hpbGROb2RlID0gZ2V0Tm9kZUludGVybmFsKHBhdGgpOwotCi0gICAgICAgIGlmIChjaGlsZE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbygiVGhpcyBub2RlOiAiICsgcGF0aCArICIgaGFzIGFscmVhZHkgYmVlbiBpbnNlcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIChTaXRlVHJlZU5vZGVJbXBsKSBnZXROb2RlKHBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5vZGUKLSAgICAgICAgTmFtZXNwYWNlSGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoTkFNRVNQQUNFX1VSSSwgIiIsIHRoaXMuZG9jdW1lbnQpOwotICAgICAgICBFbGVtZW50IGNoaWxkID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoU2l0ZVRyZWVOb2RlSW1wbC5OT0RFX05BTUUpOwotICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoU2l0ZVRyZWVOb2RlSW1wbC5JRF9BVFRSSUJVVEVfTkFNRSwgbmFtZSk7Ci0gICAgICAgIGlmICh1dWlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShTaXRlVHJlZU5vZGVJbXBsLlVVSURfQVRUUklCVVRFX05BTUUsIHV1aWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZpc2libGVJbk5hdikgewotICAgICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFNpdGVUcmVlTm9kZUltcGwuVklTSUJMRUlOTkFWX0FUVFJJQlVURV9OQU1FLCAidHJ1ZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFNpdGVUcmVlTm9kZUltcGwuVklTSUJMRUlOTkFWX0FUVFJJQlVURV9OQU1FLCAiZmFsc2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoaHJlZiAhPSBudWxsKSAmJiAoaHJlZi5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoU2l0ZVRyZWVOb2RlSW1wbC5IUkVGX0FUVFJJQlVURV9OQU1FLCBocmVmKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoc3VmZml4ICE9IG51bGwpICYmIChzdWZmaXgubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFNpdGVUcmVlTm9kZUltcGwuU1VGRklYX0FUVFJJQlVURV9OQU1FLCBzdWZmaXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmspIHsKLSAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShTaXRlVHJlZU5vZGVJbXBsLkxJTktfQVRUUklCVVRFX05BTUUsICJ0cnVlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgTm9kZQotICAgICAgICBpZiAocmVmcGF0aCAhPSBudWxsICYmICFyZWZwYXRoLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIE5vZGUgbmV4dFNpYmxpbmcgPSBnZXROb2RlSW50ZXJuYWwocmVmcGF0aCk7Ci0gICAgICAgICAgICBpZiAobmV4dFNpYmxpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0U2libGluZyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlRyZWUgaGFzIGJlZW4gbW9kaWZpZWQ6ICIgKyBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgIHNhdmVEb2N1bWVudCgpOwotICAgICAgICByZXR1cm4gKFNpdGVUcmVlTm9kZUltcGwpIGdldE5vZGUocGF0aCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGFkZExhYmVsKFN0cmluZyBwYXRoLCBTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBsYWJlbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2l0ZVRyZWVOb2RlSW1wbCBub2RlID0gKFNpdGVUcmVlTm9kZUltcGwpIGdldE5vZGUocGF0aCk7Ci0gICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbm9kZS5hZGRMYWJlbChsYW5ndWFnZSwgbGFiZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2F2ZURvY3VtZW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGFiZWwoU3RyaW5nIHBhdGgsIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2l0ZVRyZWVOb2RlSW1wbCBub2RlID0gKFNpdGVUcmVlTm9kZUltcGwpIGdldE5vZGUocGF0aCk7Ci0gICAgICAgICAgICBub2RlLnJlbW92ZUxhYmVsKGxhbmd1YWdlKTsKLSAgICAgICAgICAgIHNhdmVEb2N1bWVudCgpOwotICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTaXRlVHJlZU5vZGUgcmVtb3ZlTm9kZShTdHJpbmcgcGF0aCkgewotICAgICAgICBhc3NlcnQgcGF0aCAhPSBudWxsOwotCi0gICAgICAgIE5vZGUgbm9kZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5vZGUgPSByZW1vdmVOb2RlSW50ZXJuYWwocGF0aCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTaXRlVHJlZU5vZGUgbmV3Tm9kZSA9IG5ldyBTaXRlVHJlZU5vZGVJbXBsKHRoaXMuZmFjdG9yeSwgdGhpcywgKEVsZW1lbnQpIG5vZGUsIGdldExvZ2dlcigpKTsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKG5ld05vZGUsIGdldExvZ2dlcigpKTsKLSAgICAgICAgcmV0dXJuIG5ld05vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlcyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBkb2N1bWVudC1pZCBhbmQgcmV0dXJucyBpdAotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBkb2N1bWVudC1pZCBvZiB0aGUgTm9kZSB0byBiZSByZW1vdmVkCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Tm9kZTwvY29kZT4gdGhhdCB3YXMgcmVtb3ZlZAotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIE5vZGUgcmVtb3ZlTm9kZUludGVybmFsKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoImNvbnRhaW5zICIgKyBwYXRoLCBjb250YWlucyhwYXRoKSk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHRoaXMuZ2V0Tm9kZUludGVybmFsKHBhdGgpOwotICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgTm9kZSBuZXdOb2RlID0gcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNhdmVEb2N1bWVudCgpOwotICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ld05vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhIG5vZGUgZm9yIGEgZ2l2ZW4gZG9jdW1lbnQtaWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgZG9jdW1lbnQtaWQgb2YgdGhlIE5vZGUgdGhhdCB3ZSdyZSB0cnlpbmcgdG8gZ2V0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgTm9kZSBpZiB0aGVyZSBpcyBhIE5vZGUgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC1pZCwgbnVsbAotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTm9kZSBnZXROb2RlSW50ZXJuYWwoU3RyaW5nIHBhdGgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCAiLyIpOwotICAgICAgICBBcnJheUxpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIGlkcy5hZGQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZSBub2RlID0gZmluZE5vZGUodGhpcy5kb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwgaWRzKTsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWUjZ2V0Tm9kZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2l0ZU5vZGUgZ2V0Tm9kZShTdHJpbmcgcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcGF0aCAhPSBudWxsOwotCi0gICAgICAgIFNpdGVUcmVlTm9kZSB0cmVlTm9kZSA9IG51bGw7Ci0KLSAgICAgICAgTm9kZSBub2RlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbm9kZSA9IGdldE5vZGVJbnRlcm5hbChwYXRoKTsKLSAgICAgICAgfSBjYXRjaCAoU2l0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cmVlTm9kZSA9IG5ldyBTaXRlVHJlZU5vZGVJbXBsKHRoaXMuZmFjdG9yeSwgdGhpcywgKEVsZW1lbnQpIG5vZGUsIGdldExvZ2dlcigpKTsKLSAgICAgICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0cmVlTm9kZSwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oIk5vIG5vZGUgY29udGFpbmVkIGZvciBwYXRoIFsiICsgcGF0aCArICJdISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRyZWVOb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vdmUgdXAgdGhlIG5vZGUgYW1vbmdzdCBpdHMgc2libGluZ3MuCi0gICAgICogQHBhcmFtIHBhdGggVGhlIGRvY3VtZW50IGlkIGZvciB0aGUgbm9kZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgdGhlIG1vdmluZyBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vdmVVcChTdHJpbmcgcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBOb2RlIG5vZGUgPSB0aGlzLmdldE5vZGVJbnRlcm5hbChwYXRoKTsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oIk5vZGUgdG8gbW92ZTogIiArIHBhdGggKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiUGFyZW50aWQgb2Ygbm9kZSB3aXRoIHBhdGg6ICIgKyBwYXRoICsgIiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE5vZGUgcHJldmlvdXNOb2RlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gWFBhdGhBUEkuc2VsZWN0U2luZ2xlTm9kZShub2RlLAotICAgICAgICAgICAgICAgICAgICAiKHByZWNlZGluZy1zaWJsaW5nOjoqW2xvY2FsLW5hbWUoKSA9ICdub2RlJ10pW2xhc3QoKV0iKTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJldmlvdXNOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oIkNvdWxkbid0IGZvdW5kIGEgcHJlY2VkaW5nIHNpYmxpbmciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBOb2RlIGluc2VydE5vZGUgPSBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwotICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShpbnNlcnROb2RlLCBwcmV2aW91c05vZGUpOwotICAgICAgICBzYXZlRG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlIGRvd24gdGhlIG5vZGUgYW1vbmdzdCBpdHMgc2libGluZ3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdGggVGhlIGRvY3VtZW50IGlkIGZvciB0aGUgbm9kZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgdGhlIG1vdmluZyBmYWlsZWQuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vdmVEb3duKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHRoaXMuZ2V0Tm9kZUludGVybmFsKHBhdGgpOwotICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiTm9kZSB0byBtb3ZlOiAiICsgcGF0aCArICIgbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJQYXJlbnRpZCBvZiBub2RlIHdpdGggcGF0aDogIiArIHBhdGggKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGUgbmV4dE5vZGU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXh0Tm9kZSA9IFhQYXRoQVBJLnNlbGVjdFNpbmdsZU5vZGUobm9kZSwKLSAgICAgICAgICAgICAgICAgICAgImZvbGxvd2luZy1zaWJsaW5nOjoqW2xvY2FsLW5hbWUoKSA9ICdub2RlJ11bcG9zaXRpb24oKT0yXSIpOwotICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE5vZGUgaW5zZXJ0Tm9kZSA9IHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7Ci0KLSAgICAgICAgaWYgKG5leHROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJDb3VsZG4ndCBmb3VuZCB0aGUgc2Vjb25kIGZvbGxvd2luZyBzaWJsaW5nIik7Ci0gICAgICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGluc2VydE5vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zZXJ0Tm9kZSwgbmV4dE5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHNhdmVEb2N1bWVudCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRMYWJlbChTdHJpbmcgcGF0aCwgU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpdGVUcmVlTm9kZSBub2RlID0gKFNpdGVUcmVlTm9kZSkgZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgICAgIG5vZGUuZ2V0TGluayhsYW5ndWFnZSkuc2V0TGFiZWwobGFiZWwpOwotICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVTdHJ1Y3R1cmUjZ2V0UmVwb3NpdG9yeU5vZGUoKQotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGUgZ2V0UmVwb3NpdG9yeU5vZGUoKSB7Ci0gICAgICAgIGlmICh0aGlzLnJlcG9zaXRvcnlOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHRoaXMuZ2V0UHVibGljYXRpb24oKS5nZXRGYWN0b3J5KCkuZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgTm9kZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoTm9kZUZhY3RvcnkpIG1hbmFnZXIubG9va3VwKE5vZGVGYWN0b3J5LlJPTEUpOwotICAgICAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeU5vZGUgPSAob3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlKQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFJlcG9zaXRvcnlJdGVtKGZhY3RvcnksIHRoaXMuc291cmNlVXJpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNyZWF0aW5nIHJlcG9zaXRvcnkgbm9kZSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hbmFnZXIucmVsZWFzZShmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVwb3NpdG9yeU5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNhdmVEb2N1bWVudCgpOwotICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmVhKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hcmVhOwotICAgIH0KLQotICAgIHB1YmxpYyBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHViOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Tm9kZUludGVybmFsKHBhdGgpICE9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKFNpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0J5VXVpZChTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHJldHVybiBnZXRCeVV1aWRJbnRlcm5hbCh1dWlkLCBsYW5ndWFnZSkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2l0ZU5vZGUgZ2V0QnlVdWlkSW50ZXJuYWwoU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBTdHJpbmcgeFBhdGggPSAiLy8qW0B1dWlkID0gJyIgKyB1dWlkICsgIiddIjsKLSAgICAgICAgU2l0ZU5vZGVbXSBub2RlcyA9IGdldE5vZGVzQnlYcGF0aCh4UGF0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChub2Rlc1tpXS5oYXNMaW5rKGxhbmd1YWdlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBub2Rlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2l0ZU5vZGUgZ2V0Tm9kZUJ5WHBhdGgoU3RyaW5nIHhQYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgWFBhdGhBUEkuc2VsZWN0U2luZ2xlTm9kZSh0aGlzLmRvY3VtZW50LCB4UGF0aCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2l0ZVRyZWVOb2RlSW1wbCh0aGlzLmZhY3RvcnksIHRoaXMsIGVsZW1lbnQsIGdldExvZ2dlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNpdGVOb2RlW10gZ2V0Tm9kZXNCeVhwYXRoKFN0cmluZyB4UGF0aCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTm9kZUxpc3QgbGlzdCA9IFhQYXRoQVBJLnNlbGVjdE5vZGVMaXN0KHRoaXMuZG9jdW1lbnQsIHhQYXRoKTsKLSAgICAgICAgICAgIFNpdGVOb2RlW10gbm9kZXMgPSBuZXcgU2l0ZU5vZGVbbGlzdC5nZXRMZW5ndGgoKV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBub2Rlc1tpXSA9IG5ldyBTaXRlVHJlZU5vZGVJbXBsKHRoaXMuZmFjdG9yeSwgdGhpcywgZWxlbWVudCwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5vZGVzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGluayBnZXRCeVV1aWQoU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTaXRlTm9kZSBub2RlID0gZ2V0QnlVdWlkSW50ZXJuYWwodXVpZCwgbGFuZ3VhZ2UpOwotICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiVGhlIGxpbmsgZm9yIFsiICsgdXVpZCArICI6IiArIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICsgIl0gaXMgbm90IGNvbnRhaW5lZCEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZS5nZXRMaW5rKGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmsgYWRkKFN0cmluZyBwYXRoLCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCBkb2MpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5zKHBhdGgpKSB7Ci0gICAgICAgICAgICBTaXRlTm9kZSBub2RlID0gZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgICAgIGlmIChub2RlLmdldExhbmd1YWdlcygpLmxlbmd0aCA+IDAgJiYgIW5vZGUuZ2V0VXVpZCgpLmVxdWFscyhkb2MuZ2V0VVVJRCgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJOb2RlIGZvciBwYXRoIFsiICsgcGF0aCArICJdIGV4aXN0cyB3aXRoIGRpZmZlcmVudCBVVUlEISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2l0ZVRyZWVOb2RlSW1wbCBub2RlID0gYWRkTm9kZShwYXRoLCBkb2MuZ2V0VVVJRCgpLCB0cnVlLCBudWxsLCAiIiwgZmFsc2UpOwotICAgICAgICBub2RlLmFkZExhYmVsKGRvYy5nZXRMYW5ndWFnZSgpLCAiIik7Ci0KLSAgICAgICAgaWYgKG5vZGUuZ2V0TGFuZ3VhZ2VzKCkubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIG5vZGUuc2V0VVVJRChkb2MuZ2V0VVVJRCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBub2RlLmdldExpbmsoZG9jLmdldExhbmd1YWdlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZSBhZGQoU3RyaW5nIHBhdGgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZVRyZWVOb2RlIG5vZGUgPSBhZGROb2RlKHBhdGgsIG51bGwsIHRydWUsIG51bGwsICIiLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5BbnlMYW5ndWFnZShTdHJpbmcgdXVpZCkgewotICAgICAgICBTdHJpbmcgeFBhdGggPSAiLy8qW0B1dWlkID0gJyIgKyB1dWlkICsgIiddIjsKLSAgICAgICAgcmV0dXJuIGdldE5vZGVCeVhwYXRoKHhQYXRoKSAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZVtdIGdldE5vZGVzKCkgewotICAgICAgICBMaXN0IG5vZGVzID0gZ2V0Um9vdE5vZGUoKS5wcmVPcmRlcigpOwotICAgICAgICBub2Rlcy5yZW1vdmUoZ2V0Um9vdE5vZGUoKSk7Ci0gICAgICAgIHJldHVybiAoU2l0ZU5vZGVbXSkgbm9kZXMudG9BcnJheShuZXcgU2l0ZU5vZGVbbm9kZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlIGFkZChTdHJpbmcgcGF0aCwgU3RyaW5nIGZvbGxvd2luZ1NpYmxpbmdQYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpdGVUcmVlTm9kZSBub2RlID0gYWRkTm9kZShwYXRoLCBudWxsLCB0cnVlLCBudWxsLCAiIiwgZmFsc2UsIGZvbGxvd2luZ1NpYmxpbmdQYXRoKTsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlW10gZ2V0VG9wTGV2ZWxOb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldFJvb3ROb2RlKCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2l0ZVRyZWVOb2RlSW1wbCBnZXRSb290Tm9kZSgpIHsKLSAgICAgICAgU2l0ZVRyZWVOb2RlSW1wbCByb290OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcm9vdCA9IChTaXRlVHJlZU5vZGVJbXBsKSBnZXROb2RlKCIvIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHBhdGgsIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBpZiAoY29udGFpbnMocGF0aCkpIHsKLSAgICAgICAgICAgIFNpdGVOb2RlIG5vZGU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG5vZGUgPSBnZXROb2RlKHBhdGgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU2l0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5oYXNMaW5rKGxhbmd1YWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnlOb2RlKCkuZ2V0U2Vzc2lvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZVtdIHByZU9yZGVyKCkgewotICAgICAgICBMaXN0IHByZU9yZGVyID0gZ2V0Um9vdE5vZGUoKS5wcmVPcmRlcigpOwotICAgICAgICByZXR1cm4gKFNpdGVOb2RlW10pIHByZU9yZGVyLnRvQXJyYXkobmV3IFNpdGVOb2RlW3ByZU9yZGVyLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYW5nZWQoKSB7Ci0gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvU2l0ZVRyZWUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjljMjFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotCi0vKioKLSAqIEEgc2l0ZXRyZWUuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogU2l0ZVRyZWUuamF2YSAxNzc5MjMgMjAwNS0wNS0yMyAwNToxNTo1MVogZ3JlZ29yICQKLSAqLwotcHVibGljIGludGVyZmFjZSBTaXRlVHJlZSBleHRlbmRzIFNpdGVTdHJ1Y3R1cmUgewotCi0gICAgLyoqCi0gICAgICogVGhlIHR5cGUgb2Ygc2l0ZXRyZWUgaWRlbnRpZmlhYmxlIG9iamVjdHMuCi0gICAgICovCi0gICAgU3RyaW5nIElERU5USUZJQUJMRV9UWVBFID0gInNpdGUiOwotCi0gICAgLyoqCi0gICAgICogTW92ZSB1cCB0aGUgbm9kZSBhbW9uZ3N0IGl0cyBzaWJsaW5ncy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZG9jdW1lbnQgaWQgb2YgdGhlIG5vZGUuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIHRoZSBtb3ZpbmcgZmFpbGVkLgotICAgICAqLwotICAgIHZvaWQgbW92ZVVwKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIE1vdmUgZG93biB0aGUgbm9kZSBhbW9uZ3N0IGl0cyBzaWJsaW5ncy4KLSAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZG9jdW1lbnQgaWQgb2YgdGhlIG5vZGUuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIHRoZSBtb3ZpbmcgZmFpbGVkLgotICAgICAqLwotICAgIHZvaWQgbW92ZURvd24oU3RyaW5nIHBhdGgpIHRocm93cyBTaXRlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbm9kZXMgaW4gcHJlIG9yZGVyLgotICAgICAqLwotICAgIFNpdGVOb2RlW10gcHJlT3JkZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL1NpdGVUcmVlRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL1NpdGVUcmVlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzFhNzdmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5SXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci0KLS8qKgotICogRmFjdG9yeSBmb3Igc2l0ZXRyZWUgb2JqZWN0cy4KLSAqIAotICogQHZlcnNpb24gJElkOiBTaXRlVHJlZUZhY3RvcnkuamF2YSAxNzk1NjggMjAwNS0wNi0wMiAwOToyNzoyNlogandrYWx0eiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlVHJlZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBSZXBvc2l0b3J5SXRlbUZhY3RvcnkgewotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBTaXRlVHJlZUZhY3RvcnkoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodGhpcywgbG9nZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUl0ZW0gYnVpbGRJdGVtKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIGtleSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzbmlwcGV0cyA9IGtleS5zcGxpdCgiOiIpOwotICAgICAgICBTdHJpbmcgcHVibGljYXRpb25JZCA9IHNuaXBwZXRzWzBdOwotICAgICAgICBTdHJpbmcgYXJlYSA9IHNuaXBwZXRzWzFdOwotICAgICAgICBEZWZhdWx0U2l0ZVRyZWUgdHJlZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeSh0aGlzLm1hbmFnZXIsIHNlc3Npb24pOwotICAgICAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBmYWN0b3J5LmdldFB1YmxpY2F0aW9uKHB1YmxpY2F0aW9uSWQpOwotICAgICAgICAgICAgdHJlZSA9IG5ldyBEZWZhdWx0U2l0ZVRyZWUoZmFjdG9yeSwgcHVibGljYXRpb24sIGFyZWEsIHRoaXMubWFuYWdlciwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRyZWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJdGVtVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNpdGVUcmVlLklERU5USUZJQUJMRV9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2hhcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZUxpbmsuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2MmMxYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvU2l0ZVRyZWVMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuQWJzdHJhY3RMaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBTaXRlVHJlZSBsaW5rLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZVRyZWVMaW5rIGV4dGVuZHMgQWJzdHJhY3RMaW5rIHsKLQotICAgIHByb3RlY3RlZCBTaXRlVHJlZUxpbmsoRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnksIFNpdGVOb2RlIG5vZGUsIFN0cmluZyBfbGFuZ3VhZ2UsCi0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgc3VwZXIoZmFjdG9yeSwgbm9kZSwgIiIsIF9sYW5ndWFnZSk7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKCkgewotICAgICAgICBTaXRlVHJlZU5vZGVJbXBsIG5vZGUgPSAoU2l0ZVRyZWVOb2RlSW1wbCkgZ2V0Tm9kZSgpOwotICAgICAgICBub2RlLnJlbW92ZUxhYmVsKGdldExhbmd1YWdlKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgYWN0dWFsIGxhYmVsIG9mIHRoZSBsYWJlbCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgRG9jdW1lbnRIZWxwZXIuc2V0U2ltcGxlRWxlbWVudFRleHQodGhpcy5lbGVtZW50LCBsYWJlbCk7Ci0gICAgICAgICgoU2l0ZVRyZWVOb2RlSW1wbCkgZ2V0Tm9kZSgpKS5zYXZlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmdldFNpbXBsZUVsZW1lbnRUZXh0KHRoaXMuZWxlbWVudCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvU2l0ZVRyZWVOb2RlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvU2l0ZVRyZWVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWIyZjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL1NpdGVUcmVlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZDogU2l0ZVRyZWVOb2RlLmphdmEgMTU1MjcwIDIwMDUtMDItMjQgMjI6NDM6MzRaIGFuZHJlYXMgJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIG1vcmUgZ2VuZXJhbCB3M2MuTm9kZSB3aGljaAotICogaGlkZXMgc29tZSBkZXRhaWxzIHdoaWNoIGFyZSBpcnJlbGV2YW50IGZvciBzaXRlIHRyZWUgbm9kZXMuIEl0IGJhc2ljYWxseQotICogZGVsZWdhdGVzIGV2ZXJ5dGhpbmcgdG8gdGhlIE5vZGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2l0ZVRyZWVOb2RlIGV4dGVuZHMgU2l0ZU5vZGUgewotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzaXRldHJlZW5vZGVzLCB3aGljaCBhcmUgdGhlIHNpYmxpbmdzIHByZWNlZGluZyB0aGlzIG5vZGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBTaXRlVHJlZU5vZGVbXSBnZXRQcmVjZWRpbmdTaWJsaW5ncygpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzaXRldHJlZW5vZGVzLCB3aGljaCBhcmUgdGhlIHNpYmxpbmdzIGZvbGxvd2luZyB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlTaXRlVHJlZU5vZGVbXSBnZXROZXh0U2libGluZ3MoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL1NpdGVUcmVlTm9kZUltcGwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OGJhNzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL1NpdGVUcmVlTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPlNpdGVUcmVlTm9kZTwvY29kZT4gaW50ZXJmYWNlLgotICogCi0gKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGUKLSAqIEB2ZXJzaW9uICRJZDogU2l0ZVRyZWVOb2RlSW1wbC5qYXZhIDE1NTMxNiAyMDA1LTAyLTI1IDEwOjUzOjI5WiBhbmRyZWFzICQKLSAqLwotcHVibGljIGNsYXNzIFNpdGVUcmVlTm9kZUltcGwgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBTaXRlVHJlZU5vZGUgewotCi0gICAgLyoqCi0gICAgICogPGNvZGU+SURfQVRUUklCVVRFX05BTUU8L2NvZGU+IFRoZSBpZCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJVVEVfTkFNRSA9ICJpZCI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+VVVJRF9BVFRSSUJVVEVfTkFNRTwvY29kZT4gVGhlIHV1aWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVVJRF9BVFRSSUJVVEVfTkFNRSA9ICJ1dWlkIjsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5JU0lCTEVJTk5BVl9BVFRSSUJVVEVfTkFNRTwvY29kZT5UaGUgdmlzaWJsZWlubmF2IGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lCTEVJTk5BVl9BVFRSSUJVVEVfTkFNRSA9ICJ2aXNpYmxlaW5uYXYiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkhSRUZfQVRUUklCVVRFX05BTUU8L2NvZGU+IFRoZSBocmVmIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhSRUZfQVRUUklCVVRFX05BTUUgPSAiaHJlZiI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+U1VGRklYX0FUVFJJQlVURV9OQU1FPC9jb2RlPiBUaGUgc3VmZml4IGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWF9BVFRSSUJVVEVfTkFNRSA9ICJzdWZmaXgiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkxJTktfQVRUUklCVVRFX05BTUU8L2NvZGU+IFRoZSBsaW5rIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUklCVVRFX05BTUUgPSAibGluayI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+TEFOR1VBR0VfQVRUUklCVVRFX05BTUU8L2NvZGU+IFRoZSBsYW5ndWFnZSBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HVUFHRV9BVFRSSUJVVEVfTkFNRSA9ICJ4bWw6bGFuZyI7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+Tk9ERV9OQU1FPC9jb2RlPiBUaGUgbm9kZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9OQU1FID0gIm5vZGUiOwotICAgIC8qKgotICAgICAqIDxjb2RlPkxBQkVMX05BTUU8L2NvZGU+IFRoZSBsYWJlbCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfTkFNRSA9ICJsYWJlbCI7Ci0KLSAgICBwcml2YXRlIEVsZW1lbnQgbm9kZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBEZWZhdWx0U2l0ZVRyZWUgdHJlZTsKLQotICAgIHByaXZhdGUgRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFNpdGVUcmVlTm9kZUltcGwgb2JqZWN0LgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkb2N1bWVudCBmYWN0b3J5LgotICAgICAqIEBwYXJhbSB0cmVlIFRoZSB0cmVlLgotICAgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gX25vZGUgdGhlIG5vZGUgd2hpY2ggaXMgdG8gYmUgd3JhcHBlZCBieSB0aGlzIFNpdGVUcmVlTm9kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTaXRlVHJlZU5vZGVJbXBsKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBEZWZhdWx0U2l0ZVRyZWUgdHJlZSwgRWxlbWVudCBub2RlLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwotICAgICAgICB0aGlzLnRyZWUgPSB0cmVlOwotICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgaWYgKHRoaXMubm9kZSA9PSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElEX0FUVFJJQlVURV9OQU1FKS5nZXROb2RlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFV1aWQoKSB7Ci0gICAgICAgIGlmICh0aGlzLm5vZGUgPT0gdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkud2FybigiTm9kZSBlcXVhbHMgT3duZXJEb2N1bWVudDogIiArIHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSB0aGlzLm5vZGU7Ci0gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShVVUlEX0FUVFJJQlVURV9OQU1FKSkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFVVSURfQVRUUklCVVRFX05BTUUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExhbmd1YWdlcygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKAotICAgICAgICAgICAgICAgICAgICAgICAgIkFzc3VtaW5nIG5vbi1VVUlEIGNvbnRlbnQgYmVjYXVzZSBubyAndXVpZCcgYXR0cmlidXRlIGlzIHNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCB0aGUgbm9kZSBjb250YWlucyBsaW5rcy4gUmV0dXJuaW5nIHBhdGggWyIgKyBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gYXMgVVVJRC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0gICAgICAgIFN0cmluZyBhYnNvbHV0ZUlkID0gIiI7Ci0gICAgICAgIE5vZGUgY3VycmVudE5vZGUgPSB0aGlzLm5vZGU7Ci0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgTm9kZSBpZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLSAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBjdXJyZW50Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShJRF9BVFRSSUJVVEVfTkFNRSk7Ci0KLSAgICAgICAgICAgIGlmIChpZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFic29sdXRlSWQgPSAiLyIgKyBpZEF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKSArIGFic29sdXRlSWQ7Ci0gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhYnNvbHV0ZUlkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTaXRlVHJlZUxpbmtbXSBnZXRMaW5rcygpIHsKLSAgICAgICAgQXJyYXlMaXN0IGxhYmVscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHRoaXMubm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQotICAgICAgICAgICAgaWYgKChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgICAgICAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhMQUJFTF9OQU1FKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbExhbmd1YWdlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBOb2RlIGxhbmd1YWdlQXR0cmlidXRlID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZWRJdGVtKExBTkdVQUdFX0FUVFJJQlVURV9OQU1FKTsKLQotICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsTGFuZ3VhZ2UgPSBsYW5ndWFnZUF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsYWJlbHMuYWRkKG5ldyBTaXRlVHJlZUxpbmsodGhpcy5mYWN0b3J5LCB0aGlzLCBsYWJlbExhbmd1YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnQpIGNoaWxkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFNpdGVUcmVlTGlua1tdKSBsYWJlbHMudG9BcnJheShuZXcgU2l0ZVRyZWVMaW5rW2xhYmVscy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMYWJlbChTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBsYWJlbCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBBc3NlcnQuaXNUcnVlKCJub3QgY29udGFpbnMgIiArIGxhbmd1YWdlLCAhaGFzTGluayhsYW5ndWFnZSkpOwotCi0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBnZXROYW1lc3BhY2VIZWxwZXIoKTsKLSAgICAgICAgRWxlbWVudCBsYWJlbEVsZW0gPSBoZWxwZXIuY3JlYXRlRWxlbWVudChTaXRlVHJlZU5vZGVJbXBsLkxBQkVMX05BTUUsIGxhYmVsKTsKLSAgICAgICAgbGFiZWxFbGVtLnNldEF0dHJpYnV0ZShTaXRlVHJlZU5vZGVJbXBsLkxBTkdVQUdFX0FUVFJJQlVURV9OQU1FLCBsYW5ndWFnZSk7Ci0gICAgICAgIG5vZGUuaW5zZXJ0QmVmb3JlKGxhYmVsRWxlbSwgbm9kZS5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICBnZXRUcmVlKCkuY2hhbmdlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxhYmVsKFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBpZiAoIWhhc0xpbmsobGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aGlzICsgIiBkb2VzIG5vdCBjb250YWluIHRoZSBsYW5ndWFnZSBbIiArIGxhbmd1YWdlICsgIl0iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgbm9kZSBkb2Vzbid0IGNvbnRhaW4gdGhpcyBsYWJlbAotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gdGhpcy5ub2RlLmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoTEFCRUxfTkFNRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBsYW5ndWFnZUF0dHJpYnV0ZSA9IGNoaWxkLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBTkdVQUdFX0FUVFJJQlVURV9OQU1FKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlQXR0cmlidXRlICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGFuZ3VhZ2VBdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKGxhbmd1YWdlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJlZSgpLmNoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGVJZkVtcHR5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY291bGQgbm90IHNhdmUgc2l0ZXRyZWUgYWZ0ZXIgZGVsZXRpbmcgbGFiZWwgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzICsgIiBbIiArIGxhbmd1YWdlICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlSWZFbXB0eSgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldExhbmd1YWdlcygpLmxlbmd0aCA9PSAwICYmIGdldENoaWxkcmVuKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlI3Zpc2libGVJbk5hdigpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaWJsZUluTmF2KCkgewotICAgICAgICBOb2RlIGF0dHJpYnV0ZSA9IHRoaXMubm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKFZJU0lCTEVJTk5BVl9BVFRSSUJVVEVfTkFNRSk7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpLmVxdWFscygidHJ1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlTm9kZSNnZXRIcmVmKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0gICAgICAgIE5vZGUgYXR0cmlidXRlID0gdGhpcy5ub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSFJFRl9BVFRSSUJVVEVfTkFNRSk7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlTm9kZSNnZXRTdWZmaXgoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotICAgICAgICBOb2RlIGF0dHJpYnV0ZSA9IHRoaXMubm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKFNVRkZJWF9BVFRSSUJVVEVfTkFNRSk7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlTm9kZSNoYXNMaW5rKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNMaW5rKCkgewotICAgICAgICBOb2RlIGF0dHJpYnV0ZSA9IHRoaXMubm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKExJTktfQVRUUklCVVRFX05BTUUpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKS5lcXVhbHMoInRydWUiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlI2dldENoaWxkcmVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZU5vZGVbXSBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgTGlzdCBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBnZXROYW1lc3BhY2VIZWxwZXIoKTsKLSAgICAgICAgRWxlbWVudFtdIGVsZW1lbnRzID0gaGVscGVyLmdldENoaWxkcmVuKChFbGVtZW50KSB0aGlzLm5vZGUsIFNpdGVUcmVlTm9kZUltcGwuTk9ERV9OQU1FKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTaXRlVHJlZU5vZGUgbmV3Tm9kZSA9IG5ldyBTaXRlVHJlZU5vZGVJbXBsKHRoaXMuZmFjdG9yeSwgZ2V0VHJlZSgpLCBlbGVtZW50c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQobmV3Tm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFNpdGVOb2RlW10pIGNoaWxkRWxlbWVudHMudG9BcnJheShuZXcgU2l0ZU5vZGVbY2hpbGRFbGVtZW50cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGUjcmVtb3ZlQ2hpbGRyZW4oKQotICAgICAqLwotICAgIHB1YmxpYyBTaXRlVHJlZU5vZGVbXSByZW1vdmVDaGlsZHJlbigpIHsKLSAgICAgICAgTGlzdCBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gZ2V0TmFtZXNwYWNlSGVscGVyKCk7Ci0gICAgICAgIEVsZW1lbnRbXSBlbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbigoRWxlbWVudCkgdGhpcy5ub2RlLCBTaXRlVHJlZU5vZGVJbXBsLk5PREVfTkFNRSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVDaGlsZChlbGVtZW50c1tpXSk7Ci0gICAgICAgICAgICBTaXRlVHJlZU5vZGUgbmV3Tm9kZSA9IG5ldyBTaXRlVHJlZU5vZGVJbXBsKHRoaXMuZmFjdG9yeSwgZ2V0VHJlZSgpLCBlbGVtZW50c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQobmV3Tm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTaXRlVHJlZU5vZGVbXSkgY2hpbGRFbGVtZW50cy50b0FycmF5KG5ldyBTaXRlVHJlZU5vZGVbY2hpbGRFbGVtZW50cy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGUjZ2V0TmV4dFNpYmxpbmdzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZVRyZWVOb2RlW10gZ2V0TmV4dFNpYmxpbmdzKCkgewotICAgICAgICBMaXN0IHNpYmxpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gZ2V0TmFtZXNwYWNlSGVscGVyKCk7Ci0gICAgICAgIEVsZW1lbnRbXSBlbGVtZW50cyA9IGhlbHBlcgotICAgICAgICAgICAgICAgIC5nZXROZXh0U2libGluZ3MoKEVsZW1lbnQpIHRoaXMubm9kZSwgU2l0ZVRyZWVOb2RlSW1wbC5OT0RFX05BTUUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNpdGVUcmVlTm9kZSBuZXdOb2RlID0gbmV3IFNpdGVUcmVlTm9kZUltcGwodGhpcy5mYWN0b3J5LCBnZXRUcmVlKCksIGVsZW1lbnRzW2ldLAotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICBzaWJsaW5nRWxlbWVudHMuYWRkKG5ld05vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTaXRlVHJlZU5vZGVbXSkgc2libGluZ0VsZW1lbnRzLnRvQXJyYXkobmV3IFNpdGVUcmVlTm9kZVtzaWJsaW5nRWxlbWVudHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlI2dldFByZWNlZGluZ1NpYmxpbmdzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZVRyZWVOb2RlW10gZ2V0UHJlY2VkaW5nU2libGluZ3MoKSB7Ci0gICAgICAgIExpc3Qgc2libGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBnZXROYW1lc3BhY2VIZWxwZXIoKTsKLSAgICAgICAgRWxlbWVudFtdIGVsZW1lbnRzID0gaGVscGVyLmdldFByZWNlZGluZ1NpYmxpbmdzKChFbGVtZW50KSB0aGlzLm5vZGUsCi0gICAgICAgICAgICAgICAgU2l0ZVRyZWVOb2RlSW1wbC5OT0RFX05BTUUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNpdGVUcmVlTm9kZSBuZXdOb2RlID0gbmV3IFNpdGVUcmVlTm9kZUltcGwodGhpcy5mYWN0b3J5LCBnZXRUcmVlKCksIGVsZW1lbnRzW2ldLAotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICBzaWJsaW5nRWxlbWVudHMuYWRkKG5ld05vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTaXRlVHJlZU5vZGVbXSkgc2libGluZ0VsZW1lbnRzLnRvQXJyYXkobmV3IFNpdGVUcmVlTm9kZVtzaWJsaW5nRWxlbWVudHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlI2dldE5leHRTaWJsaW5nRG9jdW1lbnRJZCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROZXh0U2libGluZ0RvY3VtZW50SWQoKSB7Ci0gICAgICAgIFNpdGVUcmVlTm9kZVtdIHNpYmxpbmdzID0gZ2V0TmV4dFNpYmxpbmdzKCk7Ci0gICAgICAgIGlmIChzaWJsaW5ncyAhPSBudWxsICYmIHNpYmxpbmdzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBzaWJsaW5nc1swXS5nZXRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlI2FjY2VwdChvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlVmlzaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHQoU2l0ZVRyZWVOb2RlVmlzaXRvciB2aXNpdG9yKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICB2aXNpdG9yLnZpc2l0U2l0ZVRyZWVOb2RlKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlTm9kZSNhY2NlcHRTdWJ0cmVlKG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGVWaXNpdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjY2VwdFN1YnRyZWUoU2l0ZVRyZWVOb2RlVmlzaXRvciB2aXNpdG9yKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb24gewotICAgICAgICB0aGlzLmFjY2VwdCh2aXNpdG9yKTsKLSAgICAgICAgU2l0ZU5vZGVbXSBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmluZm8oIlRoZSBub2RlICIgKyBnZXRQYXRoKCkgKyAiIGhhcyBubyBjaGlsZHJlbiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICgoU2l0ZVRyZWVOb2RlSW1wbCkgY2hpbGRyZW5baV0pLmFjY2VwdFN1YnRyZWUodmlzaXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhY2NlcHRSZXZlcnNlU3VidHJlZShTaXRlVHJlZU5vZGVWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Qgb3JkZXJlZE5vZGVzID0gdGhpcy5wb3N0T3JkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkTm9kZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNpdGVUcmVlTm9kZUltcGwgX25vZGUgPSAoU2l0ZVRyZWVOb2RlSW1wbCkgb3JkZXJlZE5vZGVzLmdldChpKTsKLSAgICAgICAgICAgIF9ub2RlLmFjY2VwdCh2aXNpdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlTm9kZSNwb3N0T3JkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHBvc3RPcmRlcigpIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTaXRlTm9kZVtdIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBMaXN0IG9yZGVyZWRDaGlsZHJlbiA9ICgoU2l0ZVRyZWVOb2RlSW1wbCkgY2hpbGRyZW5baV0pLnBvc3RPcmRlcigpOwotICAgICAgICAgICAgbGlzdC5hZGRBbGwob3JkZXJlZENoaWxkcmVuKTsKLSAgICAgICAgfQotICAgICAgICBsaXN0LmFkZCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlI3NldE5vZGVBdHRyaWJ1dGUoU3RyaW5nLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSB0aGlzLm5vZGU7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGUjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZVRyZWVOb2RlW10gZ2V0Q2hpbGRyZW4oU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIFNpdGVOb2RlW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotICAgICAgICBMaXN0IGxhbmd1YWdlQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLmhhc0xpbmsobGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgbGFuZ3VhZ2VDaGlsZHJlbi5hZGQoY2hpbGRyZW5baV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTaXRlVHJlZU5vZGVbXSkgbGFuZ3VhZ2VDaGlsZHJlbi50b0FycmF5KG5ldyBTaXRlVHJlZU5vZGVbbGFuZ3VhZ2VDaGlsZHJlbi5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGUjZ2V0UGFyZW50KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZU5vZGUgZ2V0UGFyZW50KCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTaXRlVHJlZU5vZGUgcGFyZW50ID0gbnVsbDsKLQotICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSB0aGlzLm5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFCi0gICAgICAgICAgICAgICAgJiYgcGFyZW50Tm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoTk9ERV9OQU1FKSkgewotICAgICAgICAgICAgcGFyZW50ID0gbmV3IFNpdGVUcmVlTm9kZUltcGwodGhpcy5mYWN0b3J5LCBnZXRUcmVlKCksIChFbGVtZW50KSBwYXJlbnROb2RlLAotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSk7Ci0gICAgICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcocGFyZW50LCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiVGhlIG5vZGUgWyIgKyB0aGlzICsgIl0gaGFzIG5vIHBhcmVudC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIGhlbHBlciBvZiB0aGUgc2l0ZXRyZWUgWE1MIGRvY3VtZW50LgotICAgICAqIEByZXR1cm4gQSBuYW1lc3BhY2UgaGVscGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VIZWxwZXIgZ2V0TmFtZXNwYWNlSGVscGVyKCkgewotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihEZWZhdWx0U2l0ZVRyZWUuTkFNRVNQQUNFX1VSSSwgIiIsIHRoaXMubm9kZQotICAgICAgICAgICAgICAgIC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICByZXR1cm4gaGVscGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlTm9kZSNnZXRQYXJlbnQoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZVRyZWVOb2RlIGdldFBhcmVudChTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgU2l0ZVRyZWVOb2RlIHBhcmVudDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcmVudCA9IChTaXRlVHJlZU5vZGUpIGdldFBhcmVudCgpOwotICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcGFyZW50Lmhhc0xpbmsobGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICBwYXJlbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlI3ByZU9yZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBwcmVPcmRlcigpIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsaXN0LmFkZCh0aGlzKTsKLSAgICAgICAgU2l0ZU5vZGVbXSBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgTGlzdCBvcmRlcmVkQ2hpbGRyZW4gPSAoKFNpdGVUcmVlTm9kZUltcGwpIGNoaWxkcmVuW2ldKS5wcmVPcmRlcigpOwotICAgICAgICAgICAgbGlzdC5hZGRBbGwob3JkZXJlZENoaWxkcmVuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIHRoaXMubm9kZTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVVSUQoU3RyaW5nIHV1aWQpIHsKLSAgICAgICAgc2V0Tm9kZUF0dHJpYnV0ZShVVUlEX0FUVFJJQlVURV9OQU1FLCB1dWlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZVN0cnVjdHVyZSBnZXRTdHJ1Y3R1cmUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUcmVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlZmF1bHRTaXRlVHJlZSBnZXRUcmVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50cmVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMYW5ndWFnZXMoKSB7Ci0gICAgICAgIExpbmtbXSBsaW5rcyA9IGdldExpbmtzKCk7Ci0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IG5ldyBTdHJpbmdbbGlua3MubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbGFuZ3VhZ2VzW2ldID0gbGlua3NbaV0uZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGFuZ3VhZ2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5rIGdldExpbmsoU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpbmsgbGluayA9IGdldExpbmtJbnRlcm5hbChsYW5ndWFnZSk7Ci0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJUaGUgbm9kZSBbIiArIHRoaXMgKyAiXSBkb2Vzbid0IGNvbnRhaW4gdGhlIGxhbmd1YWdlIFsiCi0gICAgICAgICAgICAgICAgICAgICsgbGFuZ3VhZ2UgKyAiXS4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGluazsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2l0ZVRyZWVMaW5rIGdldExpbmtJbnRlcm5hbChTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgU2l0ZVRyZWVMaW5rW10gbGlua3MgPSBnZXRMaW5rcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobGlua3NbaV0uZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmtzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0xpbmsoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5rSW50ZXJuYWwobGFuZ3VhZ2UpICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCFnZXRDbGFzcygpLmlzSW5zdGFuY2Uob2JqKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRLZXkoKS5lcXVhbHMoKChTaXRlVHJlZU5vZGVJbXBsKSBvYmopLmdldEtleSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRyZWUoKS5nZXRQdWJsaWNhdGlvbigpLmdldElkKCkgKyAiOiIgKyBnZXRUcmVlKCkuZ2V0QXJlYSgpICsgIjoiICsgZ2V0UGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRLZXkoKS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldE5vZGVBdHRyaWJ1dGUoU2l0ZVRyZWVOb2RlSW1wbC5WSVNJQkxFSU5OQVZfQVRUUklCVVRFX05BTUUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZUluTmF2KSB7Ci0gICAgICAgIGlmICh2aXNpYmxlSW5OYXYpIHsKLSAgICAgICAgICAgIHNldE5vZGVBdHRyaWJ1dGUoU2l0ZVRyZWVOb2RlSW1wbC5WSVNJQkxFSU5OQVZfQVRUUklCVVRFX05BTUUsICJ0cnVlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXROb2RlQXR0cmlidXRlKFNpdGVUcmVlTm9kZUltcGwuVklTSUJMRUlOTkFWX0FUVFJJQlVURV9OQU1FLCAiZmFsc2UiKTsKLSAgICAgICAgfQotICAgICAgICBzYXZlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2l0ZVRyZWVOb2RlSW1wbCBwYXJlbnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKCFpc1RvcExldmVsKCkpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSAoU2l0ZVRyZWVOb2RlSW1wbCkgZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRUcmVlKCkucmVtb3ZlTm9kZShnZXRQYXRoKCkpOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50LmRlbGV0ZUlmRW1wdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2l0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVG9wTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXRoKCkubGFzdEluZGV4T2YoIi8iKSA9PSAwOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgKChEZWZhdWx0U2l0ZVRyZWUpIGdldFRyZWUoKSkuc2F2ZURvY3VtZW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZU5vZGVWaXNpdG9yLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvU2l0ZVRyZWVOb2RlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWMwODJjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZU5vZGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkOiBTaXRlVHJlZU5vZGVWaXNpdG9yLmphdmEgMTIzMzQ4IDIwMDQtMTItMjUgMjI6NDk6NTdaIGdyZWdvciAkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFZpc2l0b3IgaW50ZXJmYWNlIHRvIGRlZmluZSBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiBTaXRlVHJlZU5vZGUKLSAqIChWaXNpdG9yIHBhdHRlcm4pCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNpdGVUcmVlTm9kZVZpc2l0b3IgewotCi0JLyoqCi0JICogT3BlcmF0aW9uIHBlcmZvcm1lZCBvbiBhIFNpdGVUcmVlTm9kZQotCSAqIEBwYXJhbSBub2RlIFRoZSBTaXRlVHJlZU5vZGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBEb2N1bWVudEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLQkgKi8KLQl2b2lkIHZpc2l0U2l0ZVRyZWVOb2RlKFNpdGVUcmVlTm9kZSBub2RlKSB0aHJvd3MgRG9jdW1lbnRFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9UcmVlU2l0ZU1hbmFnZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9UcmVlU2l0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhMTg3OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvVHJlZVNpdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5SXRlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5BYnN0cmFjdFNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLk5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotCi0vKioKLSAqIEEgdHJlZS1iYXNlZCBzaXRlIG1hbmFnZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogVHJlZVNpdGVNYW5hZ2VyLmphdmEgMjA4NzY2IDIwMDUtMDctMDEgMTY6MDU6MDBaIGFuZHJlYXMgJAotICovCi1wdWJsaWMgY2xhc3MgVHJlZVNpdGVNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RTaXRlTWFuYWdlciBpbXBsZW1lbnRzIFNlcnZpY2VhYmxlIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFRyZWVTaXRlTWFuYWdlcigpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpdGV0cmVlIGZvciBhIHNwZWNpZmljIGFyZWEgb2YgdGhpcyBwdWJsaWNhdGlvbi4gU2l0ZXRyZWVzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZAotICAgICAqIGFuZCBhcmUgY2FjaGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgVGhlIGRvY3VtZW50IGlkZW50aXR5IG1hcC4KLSAgICAgKiBAcGFyYW0gcHVibGljYXRpb24gVGhlIHB1YmxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmVhIFRoZSBhcmVhLgotICAgICAqIEByZXR1cm4gQSBzaXRlIHRyZWUuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdFNpdGVUcmVlIGdldFRyZWUoRG9jdW1lbnRGYWN0b3J5IG1hcCwgUHVibGljYXRpb24gcHVibGljYXRpb24sIFN0cmluZyBhcmVhKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkocHVibGljYXRpb24sIGFyZWEpOwotICAgICAgICBEZWZhdWx0U2l0ZVRyZWUgc2l0ZXRyZWU7Ci0gICAgICAgIFJlcG9zaXRvcnlJdGVtRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFNpdGVUcmVlRmFjdG9yeSh0aGlzLm1hbmFnZXIsIGdldExvZ2dlcigpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNpdGV0cmVlID0gKERlZmF1bHRTaXRlVHJlZSkgbWFwLmdldFNlc3Npb24oKS5nZXRSZXBvc2l0b3J5SXRlbShmYWN0b3J5LCBrZXkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2l0ZXRyZWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlZmF1bHRTaXRlVHJlZSBnZXRUcmVlKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRUcmVlKGRvY3VtZW50LmdldEZhY3RvcnkoKSwgZG9jdW1lbnQuZ2V0UHVibGljYXRpb24oKSwgZG9jdW1lbnQuZ2V0QXJlYSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbmNlc3RvcnMgb2YgYSByZXNvdXJjZSwgYmVnaW5uaW5nIHdpdGggdGhlIHBhcmVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZSBUaGUgcmVzb3VyY2UuCi0gICAgICogQHJldHVybiBBIGxpc3Qgb2YgcmVzb3VyY2VzLgotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0QW5jZXN0b3JzKFNpdGVOb2RlIG5vZGUpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBhbmNlc3RvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNpdGVOb2RlIHBhcmVudCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIW5vZGUuaXNUb3BMZXZlbCgpKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBhbmNlc3RvcnMuYWRkKHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgYW5jZXN0b3JzLmFkZEFsbChnZXRBbmNlc3RvcnMocGFyZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5jZXN0b3JzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNyZXF1aXJlcyhvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3RvcnksCi0gICAgICogICAgICBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlLCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzKERvY3VtZW50RmFjdG9yeSBtYXAsIFNpdGVOb2RlIGRlcGVuZGluZ1Jlc291cmNlLAotICAgICAgICAgICAgU2l0ZU5vZGUgcmVxdWlyZWRSZXNvdXJjZSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0QW5jZXN0b3JzKGRlcGVuZGluZ1Jlc291cmNlKS5jb250YWlucyhyZXF1aXJlZFJlc291cmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRMb2NhdG9yW10gZ2V0UmVxdWlyZWRSZXNvdXJjZXMoRG9jdW1lbnRGYWN0b3J5IG1hcCwgZmluYWwgRG9jdW1lbnRMb2NhdG9yIGxvYykKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIExpc3QgYW5jZXN0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBEb2N1bWVudExvY2F0b3IgbG9jYXRvciA9IGxvYzsKLSAgICAgICAgd2hpbGUgKGxvY2F0b3IuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHBhcmVudCA9IGxvY2F0b3IuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBhbmNlc3RvcnMuYWRkKHBhcmVudCk7Ci0gICAgICAgICAgICBsb2NhdG9yID0gcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRG9jdW1lbnRMb2NhdG9yW10pIGFuY2VzdG9ycy50b0FycmF5KG5ldyBEb2N1bWVudExvY2F0b3JbYW5jZXN0b3JzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNnZXRSZXF1aXJpbmdSZXNvdXJjZXMob3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTm9kZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZU5vZGVbXSBnZXRSZXF1aXJpbmdSZXNvdXJjZXMoRG9jdW1lbnRGYWN0b3J5IG1hcCwgU2l0ZU5vZGUgcmVzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJPYnRhaW5pbmcgcmVxdWlyaW5nIHJlc291cmNlcyBvZiBbIiArIHJlc291cmNlICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIE5vZGVTZXQgbm9kZXMgPSBuZXcgTm9kZVNldCh0aGlzLm1hbmFnZXIpOwotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSByZXNvdXJjZS5nZXRTdHJ1Y3R1cmUoKS5nZXRQdWJsaWNhdGlvbigpOwotICAgICAgICBTdHJpbmcgYXJlYSA9IHJlc291cmNlLmdldFN0cnVjdHVyZSgpLmdldEFyZWEoKTsKLSAgICAgICAgU2l0ZVRyZWUgdHJlZSA9IGdldFRyZWUobWFwLCBwdWIsIGFyZWEpOwotCi0gICAgICAgIFNpdGVUcmVlTm9kZUltcGwgbm9kZSA9IChTaXRlVHJlZU5vZGVJbXBsKSB0cmVlLmdldE5vZGUocmVzb3VyY2UuZ2V0UGF0aCgpKTsKLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdCBwcmVPcmRlciA9IG5vZGUucHJlT3JkZXIoKTsKLQotICAgICAgICAgICAgLy8gcmVtb3ZlIG9yaWdpbmFsIHJlc291cmNlIChkb2VzIG5vdCByZXF1aXJlIGl0c2VsZikKLSAgICAgICAgICAgIHByZU9yZGVyLnJlbW92ZSgwKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVPcmRlci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFNpdGVUcmVlTm9kZSBkZXNjZW5kYW50ID0gKFNpdGVUcmVlTm9kZSkgcHJlT3JkZXIuZ2V0KGkpOwotICAgICAgICAgICAgICAgIG5vZGVzLmFkZChkZXNjZW5kYW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiT2J0YWluaW5nIHJlcXVpcmluZyByZXNvdXJjZXMgY29tcGxldGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5vZGVzLmdldE5vZGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2NvbnRhaW5zKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKERvY3VtZW50IHJlc291cmNlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpdGVUcmVlIHRyZWUgPSBnZXRUcmVlKHJlc291cmNlKTsKLSAgICAgICAgcmV0dXJuIHRyZWUuY29udGFpbnNCeVV1aWQocmVzb3VyY2UuZ2V0VVVJRCgpLCByZXNvdXJjZS5nZXRMYW5ndWFnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXIjY29udGFpbnNJbkFueUxhbmd1YWdlKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5BbnlMYW5ndWFnZShEb2N1bWVudCByZXNvdXJjZSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTaXRlVHJlZSB0cmVlID0gZ2V0VHJlZShyZXNvdXJjZSk7Ci0gICAgICAgIHJldHVybiB0cmVlLmNvbnRhaW5zSW5BbnlMYW5ndWFnZShyZXNvdXJjZS5nZXRVVUlEKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNjb3B5KG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29weShEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgRG9jdW1lbnQgZGVzdGluYXRpb25Eb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBEZWZhdWx0U2l0ZVRyZWUgZGVzdGluYXRpb25UcmVlID0gZ2V0VHJlZShkZXN0aW5hdGlvbkRvY3VtZW50KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2l0ZVRyZWVOb2RlIHNvdXJjZU5vZGUgPSAoU2l0ZVRyZWVOb2RlKSBzb3VyY2VEb2N1bWVudC5nZXRMaW5rKCkuZ2V0Tm9kZSgpOwotCi0gICAgICAgICAgICBTaXRlVHJlZU5vZGVbXSBzaWJsaW5ncyA9IHNvdXJjZU5vZGUuZ2V0TmV4dFNpYmxpbmdzKCk7Ci0gICAgICAgICAgICBTaXRlTm9kZSBwYXJlbnQgPSBzb3VyY2VOb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmVudElkID0gIiI7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRJZCA9IHBhcmVudC5nZXRQYXRoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTaXRlVHJlZU5vZGUgc2libGluZyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgc2libGluZ1BhdGggPSBudWxsOwotCi0gICAgICAgICAgICAvLyBzYW1lIFVVSUQgLT4gaW5zZXJ0IGF0IHRoZSBzYW1lIHBvc2l0aW9uCi0gICAgICAgICAgICBpZiAoc291cmNlRG9jdW1lbnQuZ2V0VVVJRCgpLmVxdWFscyhkZXN0aW5hdGlvbkRvY3VtZW50LmdldFVVSUQoKSkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcGFyZW50SWQgKyAiLyIgKyBzaWJsaW5nc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNpYmxpbmcgPSAoU2l0ZVRyZWVOb2RlKSBkZXN0aW5hdGlvblRyZWUuZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ1BhdGggPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlTm9kZS5oYXNMaW5rKHNvdXJjZURvY3VtZW50LmdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIG5vZGUgdGhhdCB3ZSdyZSB0cnlpbmcgdG8gcHVibGlzaAotICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB0aGlzIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oIlRoZSBub2RlICIgKyBzb3VyY2VEb2N1bWVudC5nZXRQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IGNvbnRhaW4gYSBsYWJlbCBmb3IgbGFuZ3VhZ2UgIiArIHNvdXJjZURvY3VtZW50LmdldExhbmd1YWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGluayBsaW5rID0gc291cmNlTm9kZS5nZXRMaW5rKHNvdXJjZURvY3VtZW50LmdldExhbmd1YWdlKCkpOwotICAgICAgICAgICAgU2l0ZVRyZWVOb2RlIGRlc3RpbmF0aW9uTm9kZSA9IChTaXRlVHJlZU5vZGUpIGRlc3RpbmF0aW9uVHJlZS5nZXROb2RlKGRlc3RpbmF0aW9uRG9jdW1lbnQuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbk5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVHJlZS5hZGROb2RlKGRlc3RpbmF0aW9uRG9jdW1lbnQuZ2V0UGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uRG9jdW1lbnQuZ2V0VVVJRCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGUuaXNWaXNpYmxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZS5nZXRIcmVmKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZS5nZXRTdWZmaXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlLmhhc0xpbmsoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVHJlZS5hZGRMYWJlbChkZXN0aW5hdGlvbkRvY3VtZW50LmdldFBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkRvY3VtZW50LmdldExhbmd1YWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5nZXRMYWJlbCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRyZWUuYWRkTm9kZShkZXN0aW5hdGlvbkRvY3VtZW50LmdldFBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkRvY3VtZW50LmdldFVVSUQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlLmlzVmlzaWJsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGUuZ2V0SHJlZigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGUuZ2V0U3VmZml4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZS5oYXNMaW5rKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ1BhdGgpOwotICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRyZWUuYWRkTGFiZWwoZGVzdGluYXRpb25Eb2N1bWVudC5nZXRQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Eb2N1bWVudC5nZXRMYW5ndWFnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBub2RlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBsaXZlCi0gICAgICAgICAgICAgICAgLy8gdHJlZSBzaW1wbHkgaW5zZXJ0IHRoZSBsYWJlbCBpbiB0aGUKLSAgICAgICAgICAgICAgICAvLyBsaXZlIHRyZWUKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkRvY3VtZW50LmdldExpbmsoKS5zZXRMYWJlbChsaW5rLmdldExhYmVsKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI3NldFZpc2libGVJbk5hdihvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudCwKLSAgICAgKiAgICAgIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZUluTmF2KERvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIHZpc2libGVJbk5hdikgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTaXRlVHJlZSB0cmVlID0gZ2V0VHJlZShkb2N1bWVudCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cmVlLmdldE5vZGUoZG9jdW1lbnQuZ2V0UGF0aCgpKS5zZXRWaXNpYmxlKHZpc2libGVJbk5hdik7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgb2JqZWN0IG9mIGEgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIEEgbGFiZWwuCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGluayBnZXRMYWJlbE9iamVjdChEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBMaW5rIGxhYmVsID0gbnVsbDsKLSAgICAgICAgU2l0ZVRyZWUgc2l0ZVRyZWUgPSBnZXRUcmVlKGRvY3VtZW50KTsKLSAgICAgICAgaWYgKHNpdGVUcmVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNpdGVUcmVlTm9kZSBub2RlID0gKFNpdGVUcmVlTm9kZSkgc2l0ZVRyZWUuZ2V0QnlVdWlkKGRvY3VtZW50LmdldFVVSUQoKSwKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKSkuZ2V0Tm9kZSgpOwotICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJOb2RlIGZvciBkb2N1bWVudCBbIiArIGRvY3VtZW50ICsgIl0gZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsYWJlbCA9IChMaW5rKSBub2RlLmdldExpbmsoZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGFiZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oIlRoZSBsYWJlbCBvZiBkb2N1bWVudCBbIiArIGRvY3VtZW50ICsgIl0gaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXIjZ2V0RG9jdW1lbnRzKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeSwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudFtdIGdldERvY3VtZW50cyhEb2N1bWVudEZhY3RvcnkgbWFwLCBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaXRlVHJlZU5vZGVJbXBsIHJvb3QgPSAoU2l0ZVRyZWVOb2RlSW1wbCkgZ2V0VHJlZShtYXAsIHB1YmxpY2F0aW9uLCBhcmVhKS5nZXROb2RlKCIvIik7Ci0gICAgICAgICAgICBMaXN0IGFsbE5vZGVzID0gcm9vdC5wcmVPcmRlcigpOwotICAgICAgICAgICAgTGlzdCBkb2N1bWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYWxsTm9kZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTaXRlVHJlZU5vZGUgbm9kZSA9IChTaXRlVHJlZU5vZGUpIGFsbE5vZGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBtYXAuZ2V0KHB1YmxpY2F0aW9uLCBhcmVhLCBub2RlLmdldFV1aWQoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gZG9jLmdldExhbmd1YWdlcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cy5hZGQoZG9jLmdldFRyYW5zbGF0aW9uKGxhbmd1YWdlc1tsXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoRG9jdW1lbnRbXSkgZG9jdW1lbnRzLnRvQXJyYXkobmV3IERvY3VtZW50W2RvY3VtZW50cy5zaXplKCldKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBwYXRoLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChjb250YWlucyhkb2N1bWVudCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJUaGUgZG9jdW1lbnQgWyIgKyBkb2N1bWVudCArICJdIGlzIGFscmVhZHkgY29udGFpbmVkISIpOwotICAgICAgICB9Ci0gICAgICAgIERlZmF1bHRTaXRlVHJlZSB0cmVlID0gZ2V0VHJlZShkb2N1bWVudCk7Ci0KLSAgICAgICAgU2l0ZVRyZWVOb2RlIG5vZGU7Ci0gICAgICAgIGlmICghdHJlZS5jb250YWlucyhwYXRoKSkgewotICAgICAgICAgICAgLy8gZG9uZSBmb3Igc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyBhZGROb2ROb2RlLCBub3QgdGhlIHJlc3VsdGluZyByZXR1cm4gdmFsdWUKLSAgICAgICAgICAgIG5vZGUgPSB0cmVlLmFkZE5vZGUocGF0aCwgZG9jdW1lbnQuZ2V0VVVJRCgpLCB0cnVlLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub2RlID0gKFNpdGVUcmVlTm9kZSkgdHJlZS5nZXROb2RlKHBhdGgpOwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0VXVpZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAoKFNpdGVUcmVlTm9kZUltcGwpIG5vZGUpLnNldFVVSUQoZG9jdW1lbnQuZ2V0VVVJRCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0cmVlLmFkZExhYmVsKHBhdGgsIGRvY3VtZW50LmdldExhbmd1YWdlKCksICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHBhdGgsIERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5zKGRvY3VtZW50KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oIlRoZSBkb2N1bWVudCBbIiArIGRvY3VtZW50ICsgIl0gaXMgYWxyZWFkeSBjb250YWluZWQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgRGVmYXVsdFNpdGVUcmVlIHRyZWUgPSBnZXRUcmVlKGRvY3VtZW50KTsKLSAgICAgICAgU2l0ZVRyZWVOb2RlSW1wbCBub2RlID0gKFNpdGVUcmVlTm9kZUltcGwpIHRyZWUuZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgbm9kZS5zZXRVVUlEKGRvY3VtZW50LmdldFVVSUQoKSk7Ci0gICAgICAgIHRyZWUuY2hhbmdlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwdWJsaWNhdGlvbiBUaGUgcHVibGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHJldHVybiBUaGUga2V5IHRvIHN0b3JlIHNpdGV0cmVlIG9iamVjdHMgaW4gdGhlIGlkZW50aXR5IG1hcC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiwgU3RyaW5nIGFyZWEpIHsKLSAgICAgICAgcmV0dXJuIHB1YmxpY2F0aW9uLmdldElkKCkgKyAiOiIgKyBhcmVhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlTWFuYWdlciNnZXRTaXRlU3RydWN0dXJlKG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeSwKLSAgICAgKiAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTaXRlU3RydWN0dXJlIGdldFNpdGVTdHJ1Y3R1cmUoRG9jdW1lbnRGYWN0b3J5IG1hcCwgUHVibGljYXRpb24gcHVibGlhdGlvbiwgU3RyaW5nIGFyZWEpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRUcmVlKG1hcCwgcHVibGlhdGlvbiwgYXJlYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyI2dldEF2YWlsYWJsZUxvY2F0b3IoRG9jdW1lbnRGYWN0b3J5LAotICAgICAqICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRMb2NhdG9yKQotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0QXZhaWxhYmxlTG9jYXRvcihEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgRG9jdW1lbnRMb2NhdG9yIGxvY2F0b3IpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBEb2N1bWVudExvY2F0b3IuZ2V0TG9jYXRvcihsb2NhdG9yLmdldFB1YmxpY2F0aW9uSWQoKSwKLSAgICAgICAgICAgICAgICBsb2NhdG9yLmdldEFyZWEoKSwKLSAgICAgICAgICAgICAgICBjb21wdXRlVW5pcXVlUGF0aChmYWN0b3J5LCBsb2NhdG9yKSwKLSAgICAgICAgICAgICAgICBsb2NhdG9yLmdldExhbmd1YWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbXB1dGUgYW4gdW5pcXVlIGRvY3VtZW50IGlkCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkuCi0gICAgICogQHBhcmFtIGxvY2F0b3IgVGhlIGxvY2F0b3IuCi0gICAgICogQHJldHVybiB0aGUgdW5pcXVlIGRvY3VtZW50aWQKLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVVuaXF1ZVBhdGgoRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnksIERvY3VtZW50TG9jYXRvciBsb2NhdG9yKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcGF0aCA9IGxvY2F0b3IuZ2V0UGF0aCgpOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIHB1YjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24obG9jYXRvci5nZXRQdWJsaWNhdGlvbklkKCkpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBTaXRlVHJlZSB0cmVlID0gZ2V0VHJlZShmYWN0b3J5LCBwdWIsIGxvY2F0b3IuZ2V0QXJlYSgpKTsKLQotICAgICAgICBTdHJpbmcgc3VmZml4ID0gbnVsbDsKLSAgICAgICAgaW50IHZlcnNpb24gPSAwOwotICAgICAgICBTdHJpbmcgaWR3aXRob3V0c3VmZml4ID0gbnVsbDsKLQotICAgICAgICBpZiAodHJlZS5jb250YWlucyhwYXRoKSkgewotICAgICAgICAgICAgaW50IG4gPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBTdHJpbmcgbGFzdFRva2VuID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgc3Vic3RyaW5nID0gcGF0aDsKLSAgICAgICAgICAgIGlmICgobiA8IHBhdGgubGVuZ3RoKCkpICYmIChuID4gMCkpIHsKLSAgICAgICAgICAgICAgICBsYXN0VG9rZW4gPSBwYXRoLnN1YnN0cmluZyhuKTsKLSAgICAgICAgICAgICAgICBzdWJzdHJpbmcgPSBwYXRoLnN1YnN0cmluZygwLCBuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGwgPSBsYXN0VG9rZW4ubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBsYXN0VG9rZW4ubGFzdEluZGV4T2YoIi0iKTsKLSAgICAgICAgICAgIGlmICgwIDwgaW5kZXggJiYgaW5kZXggPCBsKSB7Ci0gICAgICAgICAgICAgICAgc3VmZml4ID0gbGFzdFRva2VuLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgICAgICAgIGlkd2l0aG91dHN1ZmZpeCA9IHN1YnN0cmluZyArIGxhc3RUb2tlbi5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIHZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHN1ZmZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlkd2l0aG91dHN1ZmZpeCA9IHN1YnN0cmluZyArIGxhc3RUb2tlbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKHRyZWUuY29udGFpbnMocGF0aCkpIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiArIDE7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IGlkd2l0aG91dHN1ZmZpeCArICItIiArIHZlcnNpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGVJbk5hdihEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTaXRlVHJlZSB0cmVlID0gZ2V0VHJlZShkb2N1bWVudCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJlZS5nZXROb2RlKGRvY3VtZW50LmdldFBhdGgoKSkuaXNWaXNpYmxlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKERvY3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBhcmVhLCBTdHJpbmcgdXVpZCwKLSAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTaXRlVHJlZSB0cmVlID0gZ2V0VHJlZShmYWN0b3J5LCBwdWIsIGFyZWEpOwotICAgICAgICBTaXRlTm9kZSBub2RlID0gdHJlZS5nZXRCeVV1aWQodXVpZCwgbGFuZ3VhZ2UpLmdldE5vZGUoKTsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oIk5vIG5vZGUgZm91bmQgZm9yIFsiICsgcHViLmdldElkKCkgKyAiOiIgKyBhcmVhICsgIjoiICsgdXVpZAotICAgICAgICAgICAgICAgICAgICArICI6IiArIGxhbmd1YWdlICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZS5nZXRQYXRoKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVVUlEKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBhcmVhLCBTdHJpbmcgcGF0aCkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZVRyZWUgdHJlZSA9IGdldFRyZWUoZmFjdG9yeSwgcHViLCBhcmVhKTsKLSAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IHRyZWUuZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oIk5vIG5vZGUgZm91bmQgZm9yIFsiICsgcHViLmdldElkKCkgKyAiOiIgKyBhcmVhICsgIjoiICsgcGF0aAotICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VXVpZCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBEb2N1bWVudExvY2F0b3IgbG9jYXRvcikKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgUHVibGljYXRpb24gcHViOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihsb2NhdG9yLmdldFB1YmxpY2F0aW9uSWQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIFNpdGVUcmVlIHRyZWUgPSBnZXRUcmVlKGZhY3RvcnksIHB1YiwgbG9jYXRvci5nZXRBcmVhKCkpOwotICAgICAgICBpZiAodHJlZS5jb250YWlucyhsb2NhdG9yLmdldFBhdGgoKSkpIHsKLSAgICAgICAgICAgIFNpdGVOb2RlIG5vZGUgPSB0cmVlLmdldE5vZGUobG9jYXRvci5nZXRQYXRoKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5vZGUuaGFzTGluayhsb2NhdG9yLmdldExhbmd1YWdlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL0RlbGVnYXRpbmdMaW5rLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL0RlbGVnYXRpbmdMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmM4NGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlMi9EZWxlZ2F0aW5nTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5BYnN0cmFjdExpbms7Ci0KLS8qKgotICogU2l0ZSB0cmVlIGxpbmsgd2hpY2ggZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIGEgc2hhcmVkIGxpbmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nTGluayBleHRlbmRzIEFic3RyYWN0TGluayB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRvY3VtZW50IGZhY3RvcnkuCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgd2hpY2ggdGhpcyBsaW5rIGJlbG9uZ3MgdG8uCi0gICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbC4KLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlLgotICAgICAqLwotICAgIHB1YmxpYyBEZWxlZ2F0aW5nTGluayhEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgRGVsZWdhdGluZ05vZGUgbm9kZSwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgc3VwZXIoZmFjdG9yeSwgbm9kZSwgbGFiZWwsIGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvRGVsZWdhdGluZ05vZGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvRGVsZWdhdGluZ05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkNDkzZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL0RlbGVnYXRpbmdOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlOwotCi0vKioKLSAqIFNpdGUgdHJlZSBub2RlIHdoaWNoIGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBhIHNoYXJlZCB0cmVlIG5vZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nTm9kZSBpbXBsZW1lbnRzIFRyZWVOb2RlIHsKLSAgICAKLSAgICBwcml2YXRlIFNpdGVOb2RlIG5vZGU7Ci0gICAgcHJpdmF0ZSBEZWxlZ2F0aW5nU2l0ZVRyZWUgdHJlZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0cmVlIFRoZSB0cmVlLgotICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgZGVsZWdhdGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVsZWdhdGluZ05vZGUoRGVsZWdhdGluZ1NpdGVUcmVlIHRyZWUsIFNpdGVOb2RlIGRlbGVnYXRlKSB7Ci0gICAgICAgIHRoaXMubm9kZSA9IGRlbGVnYXRlOwotICAgICAgICB0aGlzLnRyZWUgPSB0cmVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdCBjaGlsZHJlbjsKLSAgICBwcml2YXRlIExpc3QgcHJlT3JkZXI7Ci0gICAgCi0gICAgcHVibGljIFNpdGVOb2RlW10gZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgICAgICAgIFNpdGVOb2RlW10gZGVsZWdhdGVDaGlsZHJlbiA9IHRoaXMubm9kZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uYWRkKHRoaXMudHJlZS5nZXROb2RlKGRlbGVnYXRlQ2hpbGRyZW5baV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFNpdGVOb2RlW10pIHRoaXMuY2hpbGRyZW4udG9BcnJheShuZXcgU2l0ZU5vZGVbdGhpcy5jaGlsZHJlbi5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZGUuZ2V0SHJlZigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMYW5ndWFnZXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZGUuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmsgZ2V0TGluayhTdHJpbmcgbGFuZ3VhZ2UpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5nZXRMaW5rKHRoaXMubm9kZS5nZXRMaW5rKGxhbmd1YWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZU5vZGUgZ2V0UGFyZW50KCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy50cmVlLmdldE5vZGUodGhpcy5ub2RlLmdldFBhcmVudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZGUuZ2V0UGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlU3RydWN0dXJlIGdldFN0cnVjdHVyZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHJlZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5nZXRTdWZmaXgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFV1aWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZGUuZ2V0VXVpZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0xpbmsoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5vZGUuaGFzTGluayhsYW5ndWFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTGluaygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5oYXNMaW5rKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUb3BMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5pc1RvcExldmVsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmlzVmlzaWJsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlSW5OYXYpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlIGFkZENoaWxkKFN0cmluZyBuYW1lLCBib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlIGFkZENoaWxkKFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGZvbGxvd2luZ05vZGVOYW1lLCBib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVUcmVlSW1wbCBnZXRUcmVlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlRG93bihTdHJpbmcgbmFtZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlVXAoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlW10gcHJlT3JkZXIoKSB7Ci0gICAgICAgIGlmICh0aGlzLnByZU9yZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIFNpdGVOb2RlW10gZGVsZWdhdGVzID0gKChUcmVlTm9kZSkgdGhpcy5ub2RlKS5wcmVPcmRlcigpOwotICAgICAgICAgICAgdGhpcy5wcmVPcmRlciA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcmVPcmRlci5hZGQodGhpcy50cmVlLmdldE5vZGUoZGVsZWdhdGVzW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTaXRlTm9kZVtdKSB0aGlzLnByZU9yZGVyLnRvQXJyYXkobmV3IFNpdGVOb2RlW3RoaXMucHJlT3JkZXIuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVUcmVlTm9kZVtdIGdldE5leHRTaWJsaW5ncygpIHsKLSAgICAgICAgU2l0ZU5vZGVbXSBkZWxlZ2F0ZXMgPSAoKFRyZWVOb2RlKSB0aGlzLm5vZGUpLmdldE5leHRTaWJsaW5ncygpOwotICAgICAgICBTaXRlVHJlZU5vZGVbXSBub2RlcyA9IG5ldyBTaXRlVHJlZU5vZGVbZGVsZWdhdGVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBub2Rlc1tpXSA9IHRoaXMudHJlZS5nZXROb2RlKGRlbGVnYXRlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlVHJlZU5vZGVbXSBnZXRQcmVjZWRpbmdTaWJsaW5ncygpIHsKLSAgICAgICAgU2l0ZU5vZGVbXSBkZWxlZ2F0ZXMgPSAoKFRyZWVOb2RlKSB0aGlzLm5vZGUpLmdldFByZWNlZGluZ1NpYmxpbmdzKCk7Ci0gICAgICAgIFNpdGVUcmVlTm9kZVtdIG5vZGVzID0gbmV3IFNpdGVUcmVlTm9kZVtkZWxlZ2F0ZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG5vZGVzW2ldID0gdGhpcy50cmVlLmdldE5vZGUoZGVsZWdhdGVzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL0RlbGVnYXRpbmdTaXRlVHJlZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlMi9EZWxlZ2F0aW5nU2l0ZVRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY2ZWVlMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL0RlbGVnYXRpbmdTaXRlVHJlZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5BcmVhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWU7Ci0KLS8qKgotICogU2l0ZSB0cmVlIGltcGxlbWVudGF0aW9uIHdoaWNoIGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBhIHNoYXJlZCBzaXRlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nU2l0ZVRyZWUgaW1wbGVtZW50cyBTaXRlU3RydWN0dXJlLCBTaXRlVHJlZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBTaXRlVHJlZUltcGwgdHJlZTsKLSAgICBwcml2YXRlIEFyZWEgYXJlYTsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBNYXAgbGlua3MgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIG5vZGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIExpc3Qgbm9kZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0IHRvcExldmVsTm9kZXM7Ci0gICAgcHJpdmF0ZSBMaXN0IHByZU9yZGVyOwotICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZVVyaTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEgd2hpY2ggdGhpcyB0cmVlIGJlbG9uZ3MgdG8uCi0gICAgICogQHBhcmFtIHRyZWUgVGhlIHRyZWUgdG8gZGVsZWdhdGUgdG8uCi0gICAgICovCi0gICAgcHVibGljIERlbGVnYXRpbmdTaXRlVHJlZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBBcmVhIGFyZWEsIFNpdGVUcmVlSW1wbCB0cmVlKSB7Ci0gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7Ci0gICAgICAgIHRoaXMuYXJlYSA9IGFyZWE7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmsgYWRkKFN0cmluZyBwYXRoLCBEb2N1bWVudCBkb2MpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlIGFkZChTdHJpbmcgcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZU5vZGUgYWRkKFN0cmluZyBwYXRoLCBTdHJpbmcgZm9sbG93aW5nU2libGluZ1BhdGgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5jb250YWlucyhwYXRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcGF0aCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRyZWUuY29udGFpbnMocGF0aCwgbGFuZ3VhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQnlVdWlkKFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5jb250YWluc0J5VXVpZCh1dWlkLCBsYW5ndWFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbkFueUxhbmd1YWdlKFN0cmluZyB1dWlkKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRyZWUuY29udGFpbnNJbkFueUxhbmd1YWdlKHV1aWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJlYSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJlYS5nZXROYW1lKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaW5rIGdldEJ5VXVpZChTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpbmsgZGVsZWdhdGUgPSB0aGlzLnRyZWUuZ2V0QnlVdWlkKHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgcmV0dXJuIGdldExpbmsoZGVsZWdhdGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaW5rIGdldExpbmsoTGluayBkZWxlZ2F0ZSkgewotICAgICAgICBMaW5rIGxpbmsgPSAoTGluaykgdGhpcy5saW5rcy5nZXQoZGVsZWdhdGUpOwotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rID0gbmV3IERlbGVnYXRpbmdMaW5rKHRoaXMuYXJlYS5nZXRQdWJsaWNhdGlvbigpLmdldEZhY3RvcnkoKSwgZ2V0Tm9kZShkZWxlZ2F0ZS5nZXROb2RlKCkpLAotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5nZXRMYWJlbCgpLCBkZWxlZ2F0ZS5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGluazsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIERlbGVnYXRpbmdOb2RlIGdldE5vZGUoU2l0ZU5vZGUgZGVsZWdhdGUpIHsKLSAgICAgICAgRGVsZWdhdGluZ05vZGUgbm9kZSA9IChEZWxlZ2F0aW5nTm9kZSkgdGhpcy5ub2Rlcy5nZXQoZGVsZWdhdGUpOwotICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBub2RlID0gbmV3IERlbGVnYXRpbmdOb2RlKHRoaXMsIGRlbGVnYXRlKTsKLSAgICAgICAgICAgIHRoaXMubm9kZXMucHV0KGRlbGVnYXRlLCBub2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZU5vZGUgZ2V0Tm9kZShTdHJpbmcgcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0Tm9kZSh0aGlzLnRyZWUuZ2V0Tm9kZShwYXRoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlW10gZ2V0Tm9kZXMoKSB7Ci0gICAgICAgIGlmICh0aGlzLm5vZGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFNpdGVOb2RlW10gZGVsZWdhdGVzID0gdGhpcy50cmVlLmdldE5vZGVzKCk7Ci0gICAgICAgICAgICB0aGlzLm5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLm5vZGVMaXN0LmFkZChnZXROb2RlKGRlbGVnYXRlc1tpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU2l0ZU5vZGVbXSkgdGhpcy5ub2RlTGlzdC50b0FycmF5KG5ldyBTaXRlTm9kZVt0aGlzLm5vZGVMaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBQdWJsaWNhdGlvbiBnZXRQdWJsaWNhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJlYS5nZXRQdWJsaWNhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZVtdIGdldFRvcExldmVsTm9kZXMoKSB7Ci0gICAgICAgIGlmICh0aGlzLnRvcExldmVsTm9kZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgU2l0ZU5vZGVbXSBkZWxlZ2F0ZXMgPSB0aGlzLnRyZWUuZ2V0VG9wTGV2ZWxOb2RlcygpOwotICAgICAgICAgICAgdGhpcy50b3BMZXZlbE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRvcExldmVsTm9kZXMuYWRkKGdldE5vZGUoZGVsZWdhdGVzW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTaXRlTm9kZVtdKSB0aGlzLnRvcExldmVsTm9kZXMudG9BcnJheShuZXcgU2l0ZU5vZGVbdGhpcy50b3BMZXZlbE5vZGVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFyZWEuZ2V0UHVibGljYXRpb24oKS5nZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBOb2RlRmFjdG9yeSBub2RlRmFjdG9yeTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgTm9kZUZhY3RvcnkgZ2V0Tm9kZUZhY3RvcnkoKSB7Ci0gICAgICAgIGlmICh0aGlzLm5vZGVGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5ub2RlRmFjdG9yeSA9IChOb2RlRmFjdG9yeSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChOb2RlRmFjdG9yeS5ST0xFKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDcmVhdGluZyByZXBvc2l0b3J5IG5vZGUgZmFpbGVkOiAiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5ub2RlRmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXRSZXBvc2l0b3J5Tm9kZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoTm9kZSkgZ2V0U2Vzc2lvbigpLmdldFJlcG9zaXRvcnlJdGVtKGdldE5vZGVGYWN0b3J5KCksIGdldFNvdXJjZVVyaSgpKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ3JlYXRpbmcgcmVwb3NpdG9yeSBub2RlIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZVVyaSgpIHsKLSAgICAgICAgaWYgKHRoaXMuc291cmNlVXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBiYXNlVXJpID0gdGhpcy5hcmVhLmdldFB1YmxpY2F0aW9uKCkuZ2V0Q29udGVudFVSSSh0aGlzLmFyZWEuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHRoaXMuc291cmNlVXJpID0gYmFzZVVyaSArICIvc2l0ZXRyZWUueG1sIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VVcmk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZURvd24oU3RyaW5nIHBhdGgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZVVwKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZVtdIHByZU9yZGVyKCkgewotICAgICAgICBpZiAodGhpcy5wcmVPcmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTaXRlTm9kZVtdIGRlbGVnYXRlcyA9IHRoaXMudHJlZS5wcmVPcmRlcigpOwotICAgICAgICAgICAgdGhpcy5wcmVPcmRlciA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcmVPcmRlci5hZGQoZ2V0Tm9kZShkZWxlZ2F0ZXNbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFNpdGVOb2RlW10pIHRoaXMucHJlT3JkZXIudG9BcnJheShuZXcgU2l0ZU5vZGVbdGhpcy5wcmVPcmRlci5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvUm9vdE5vZGUuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvUm9vdE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4NDVjMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL1Jvb3ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlMjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci0KLS8qKgotICogUm9vdCBub2RlLgotICovCi1wdWJsaWMgY2xhc3MgUm9vdE5vZGUgZXh0ZW5kcyBUcmVlTm9kZUltcGwgewotICAgIAotICAgIHByaXZhdGUgU2l0ZVRyZWVJbXBsIHRyZWU7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHJlZSBUaGUgdHJlZS4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIFJvb3ROb2RlKFNpdGVUcmVlSW1wbCB0cmVlLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIHN1cGVyKG51bGwsICIiLCBmYWxzZSwgbG9nZ2VyKTsKLSAgICAgICAgdGhpcy50cmVlID0gdHJlZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZVRyZWVJbXBsIGdldFRyZWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRyZWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlW10gcHJlT3JkZXIoKSB7Ci0gICAgICAgIExpc3QgcHJlT3JkZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNpdGVOb2RlW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUcmVlTm9kZSBjaGlsZCA9IChUcmVlTm9kZSkgY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBwcmVPcmRlci5hZGRBbGwoQXJyYXlzLmFzTGlzdChjaGlsZC5wcmVPcmRlcigpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTaXRlTm9kZVtdKSBwcmVPcmRlci50b0FycmF5KG5ldyBTaXRlTm9kZVtwcmVPcmRlci5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVJZkVtcHR5KCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlMi9TaXRlVHJlZUZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvU2l0ZVRyZWVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZTc5YWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlMi9TaXRlVHJlZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkFyZWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5SZXBvc2l0b3J5SXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TaGFyZWRJdGVtU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIHNpdGV0cmVlIG9iamVjdHMuCi0gKiAKLSAqIEB2ZXJzaW9uICRJZDogU2l0ZVRyZWVGYWN0b3J5LmphdmEgMTc5NTY4IDIwMDUtMDYtMDIgMDk6Mjc6MjZaIGp3a2FsdHogJAotICovCi1wdWJsaWMgY2xhc3MgU2l0ZVRyZWVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgUmVwb3NpdG9yeUl0ZW1GYWN0b3J5IHsKLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2l0ZVRyZWVGYWN0b3J5KFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKHRoaXMsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlJdGVtIGJ1aWxkSXRlbShTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBrZXkpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc25pcHBldHMgPSBrZXkuc3BsaXQoIjoiKTsKLSAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uSWQgPSBzbmlwcGV0c1swXTsKLSAgICAgICAgU3RyaW5nIGFyZWFOYW1lID0gc25pcHBldHNbMV07Ci0gICAgICAgIFNpdGVUcmVlIHRyZWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50VXRpbC5jcmVhdGVEb2N1bWVudEZhY3RvcnkodGhpcy5tYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihwdWJsaWNhdGlvbklkKTsKLSAgICAgICAgICAgIEFyZWEgIGFyZWEgPSBwdWJsaWNhdGlvbi5nZXRBcmVhKGFyZWFOYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNlc3Npb24uaXNNb2RpZmlhYmxlKCkgfHwgc2Vzc2lvbiBpbnN0YW5jZW9mIFNoYXJlZEl0ZW1TdG9yZSkgewotICAgICAgICAgICAgICAgIHRyZWUgPSBuZXcgU2l0ZVRyZWVJbXBsKHRoaXMubWFuYWdlciwgYXJlYSwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgU2hhcmVkSXRlbVN0b3JlIHN0b3JlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IChTaGFyZWRJdGVtU3RvcmUpIHRoaXMubWFuYWdlci5sb29rdXAoU2hhcmVkSXRlbVN0b3JlLlJPTEUpOwotICAgICAgICAgICAgICAgICAgICBTaXRlVHJlZUltcGwgc2hhcmVkVHJlZSA9IChTaXRlVHJlZUltcGwpIHN0b3JlLmdldFJlcG9zaXRvcnlJdGVtKHRoaXMsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyZWUgPSBuZXcgRGVsZWdhdGluZ1NpdGVUcmVlKHRoaXMubWFuYWdlciwgYXJlYSwgc2hhcmVkVHJlZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc3RvcmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRyZWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJdGVtVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNpdGVUcmVlLklERU5USUZJQUJMRV9UWVBFOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvU2l0ZVRyZWVJbXBsLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL1NpdGVUcmVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ3NDZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvU2l0ZVRyZWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlBlcnNpc3RhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBTaW1wbGUgc2l0ZSB0cmVlIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZVRyZWVJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgU2l0ZVN0cnVjdHVyZSwgU2l0ZVRyZWUsIFBlcnNpc3RhYmxlIHsKLQotICAgIHByaXZhdGUgQXJlYSBhcmVhOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgUm9vdE5vZGUgcm9vdDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBTaXRlVHJlZUltcGwoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgQXJlYSBhcmVhLCBMb2dnZXIgbG9nZ2VyKSB7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgICAgICB0aGlzLmFyZWEgPSBhcmVhOwotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICBpbml0Um9vdCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSb290KCkgewotICAgICAgICB0aGlzLnJvb3QgPSBuZXcgUm9vdE5vZGUodGhpcywgZ2V0TG9nZ2VyKCkpOwotICAgICAgICBub2RlQWRkZWQocm9vdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlVXJpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VVcmkoKSB7Ci0gICAgICAgIGlmICh0aGlzLnNvdXJjZVVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZVVyaSA9IHRoaXMuYXJlYS5nZXRQdWJsaWNhdGlvbigpLmdldENvbnRlbnRVUkkodGhpcy5hcmVhLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB0aGlzLnNvdXJjZVVyaSA9IGJhc2VVcmkgKyAiL3NpdGV0cmVlLnhtbCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlVXJpOwotICAgIH0KLQotICAgIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQgPSAtMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbG9hZGluZyA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9zaXRldHJlZS8xLjAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX1ZJU0lCSUxJVFkgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGxvYWQoKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMubG9hZGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlIHJlcG9Ob2RlID0gZ2V0UmVwb3NpdG9yeU5vZGUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVwb05vZGUuc2V0UGVyc2lzdGFibGUodGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGxhc3RNb2RpZmllZCBjaGVjayBpcyBuZWNlc3NhcnkgZm9yIGNsdXN0ZXJpbmcsIGJ1dCBjYW4gY2F1c2UgNDA0cwotICAgICAgICAgICAgLy8gYmVjYXVzZSBvZiB0aGUgMXMgZmlsZSBzeXN0ZW0gbGFzdCBtb2RpZmljYXRpb24gZ3JhbnVsYXJpdHkKLSAgICAgICAgICAgIGlmIChyZXBvTm9kZS5leGlzdHMoKSAvKiAmJiByZXBvTm9kZS5nZXRMYXN0TW9kaWZpZWQoKSA+IHRoaXMubGFzdE1vZGlmaWVkICovKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSByZXBvTm9kZS5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCB4bWwgPSBEb2N1bWVudEhlbHBlci5yZWFkRG9jdW1lbnQocmVwb05vZGUuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihOQU1FU1BBQ0UsICIiLCB4bWwpOwotICAgICAgICAgICAgICAgIEFzc2VydC5pc1RydWUoImRvY3VtZW50IGVsZW1lbnQgaXMgc2l0ZSIsIHhtbC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscygic2l0ZSIpKTsKLSAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgbG9hZE5vZGVzKHRoaXMucm9vdCwgaGVscGVyLCB4bWwuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJlcG9Ob2RlLmV4aXN0cygpICYmIHRoaXMubGFzdE1vZGlmaWVkID4gLTEpIHsKLSAgICAgICAgICAgICAgICByZXNldCgpOwotICAgICAgICAgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tJbnZhcmlhbnRzKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIHRoaXMucGF0aDJub2RlLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMudXVpZExhbmd1YWdlMmxpbmsuY2xlYXIoKTsKLSAgICAgICAgaW5pdFJvb3QoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUm9vdE5vZGUgZ2V0Um9vdCgpIHsKLSAgICAgICAgbG9hZCgpOwotICAgICAgICByZXR1cm4gdGhpcy5yb290OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxvYWROb2RlcyhUcmVlTm9kZSBwYXJlbnQsIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBFbGVtZW50W10gbm9kZUVsZW1lbnRzID0gaGVscGVyLmdldENoaWxkcmVuKGVsZW1lbnQsICJub2RlIik7Ci0gICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbm9kZUVsZW1lbnRzLmxlbmd0aDsgbisrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5vZGVFbGVtZW50c1tuXS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSBERUZBVUxUX1ZJU0lCSUxJVFk7Ci0gICAgICAgICAgICBpZiAobm9kZUVsZW1lbnRzW25dLmhhc0F0dHJpYnV0ZSgidmlzaWJsZWlubmF2IikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmlzaWJsZVN0cmluZyA9IG5vZGVFbGVtZW50c1tuXS5nZXRBdHRyaWJ1dGUoInZpc2libGVpbm5hdiIpOwotICAgICAgICAgICAgICAgIHZpc2libGUgPSBCb29sZWFuLnZhbHVlT2YodmlzaWJsZVN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmVlTm9kZUltcGwgbm9kZSA9IChUcmVlTm9kZUltcGwpIHBhcmVudC5hZGRDaGlsZChuYW1lLCB2aXNpYmxlKTsKLSAgICAgICAgICAgIGlmIChub2RlRWxlbWVudHNbbl0uaGFzQXR0cmlidXRlKCJ1dWlkIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXVpZCA9IG5vZGVFbGVtZW50c1tuXS5nZXRBdHRyaWJ1dGUoInV1aWQiKTsKLSAgICAgICAgICAgICAgICBub2RlLnNldFV1aWQodXVpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2FkTGlua3Mobm9kZSwgaGVscGVyLCBub2RlRWxlbWVudHNbbl0pOwotICAgICAgICAgICAgbG9hZE5vZGVzKG5vZGUsIGhlbHBlciwgbm9kZUVsZW1lbnRzW25dKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxvYWRMaW5rcyhUcmVlTm9kZUltcGwgbm9kZSwgTmFtZXNwYWNlSGVscGVyIGhlbHBlciwgRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIEVsZW1lbnRbXSBsaW5rRWxlbWVudHMgPSBoZWxwZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCwgImxhYmVsIik7Ci0gICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbGlua0VsZW1lbnRzLmxlbmd0aDsgbCsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFuZyA9IGxpbmtFbGVtZW50c1tsXS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIik7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBEb2N1bWVudEhlbHBlci5nZXRTaW1wbGVFbGVtZW50VGV4dChsaW5rRWxlbWVudHNbbF0pOwotICAgICAgICAgICAgbm9kZS5hZGRMaW5rKGxhbmcsIGxhYmVsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBpZiAobG9hZGluZyB8fCAhY2hhbmdlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBOb2RlIHJlcG9Ob2RlID0gZ2V0UmVwb3NpdG9yeU5vZGUoKTsKLSAgICAgICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKE5BTUVTUEFDRSwgIiIsICJzaXRlIik7Ci0KLSAgICAgICAgICAgIGludCByZXZpc2lvbiA9IGdldFJldmlzaW9uKHJlcG9Ob2RlKSArIDE7Ci0gICAgICAgICAgICBoZWxwZXIuZ2V0RG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoInJldmlzaW9uIiwKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhyZXZpc2lvbikpOwotCi0gICAgICAgICAgICBzYXZlTm9kZXMoZ2V0Um9vdCgpLCBoZWxwZXIsIGhlbHBlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgICAgIGhlbHBlci5zYXZlKHJlcG9Ob2RlLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gcmVwb05vZGUuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldFJldmlzaW9uKE5vZGUgcmVwb05vZGUpIHsKLSAgICAgICAgaW50IHJldmlzaW9uID0gMDsKLSAgICAgICAgaWYgKHJlcG9Ob2RlLmdldEhpc3RvcnkoKS5nZXRSZXZpc2lvbk51bWJlcnMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICByZXZpc2lvbiA9IHJlcG9Ob2RlLmdldEhpc3RvcnkoKS5nZXRMYXRlc3RSZXZpc2lvbigpLmdldE51bWJlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXZpc2lvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlTm9kZXMoVHJlZU5vZGUgcGFyZW50LCBOYW1lc3BhY2VIZWxwZXIgaGVscGVyLCBFbGVtZW50IHBhcmVudEVsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpdGVOb2RlW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRWxlbWVudCBub2RlRWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KCJub2RlIik7Ci0gICAgICAgICAgICBub2RlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImlkIiwgY2hpbGRyZW5baV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyB1dWlkID0gY2hpbGRyZW5baV0uZ2V0VXVpZCgpOwotICAgICAgICAgICAgaWYgKHV1aWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5vZGVFbGVtZW50LnNldEF0dHJpYnV0ZSgidXVpZCIsIHV1aWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2aXNpYmxlaW5uYXYiLCBCb29sZWFuLnRvU3RyaW5nKGNoaWxkcmVuW2ldLmlzVmlzaWJsZSgpKSk7Ci0gICAgICAgICAgICBzYXZlTGlua3MoY2hpbGRyZW5baV0sIGhlbHBlciwgbm9kZUVsZW1lbnQpOwotICAgICAgICAgICAgc2F2ZU5vZGVzKChUcmVlTm9kZSkgY2hpbGRyZW5baV0sIGhlbHBlciwgbm9kZUVsZW1lbnQpOwotICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChub2RlRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlTGlua3MoU2l0ZU5vZGUgbm9kZSwgTmFtZXNwYWNlSGVscGVyIGhlbHBlciwgRWxlbWVudCBub2RlRWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gbm9kZS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ndWFnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIExpbmsgbGluayA9IG5vZGUuZ2V0TGluayhsYW5ndWFnZXNbaV0pOwotICAgICAgICAgICAgRWxlbWVudCBsaW5rRWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KCJsYWJlbCIsIGxpbmsuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgICBsaW5rRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbDpsYW5nIiwgbGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgIG5vZGVFbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaW5rIGFkZChTdHJpbmcgcGF0aCwgRG9jdW1lbnQgZG9jKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5zQnlVdWlkKGRvYy5nZXRVVUlEKCksIGRvYy5nZXRMYW5ndWFnZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oIlRoZSBkb2N1bWVudCBbIiArIGRvYyArICJdIGlzIGFscmVhZHkgY29udGFpbmVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHJlZU5vZGVJbXBsIG5vZGU7Ci0gICAgICAgIGlmIChjb250YWlucyhwYXRoKSkgewotICAgICAgICAgICAgbm9kZSA9IGdldFRyZWVOb2RlKHBhdGgpOwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0VXVpZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBub2RlLnNldFV1aWQoZG9jLmdldFVVSUQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFub2RlLmdldFV1aWQoKS5lcXVhbHMoZG9jLmdldFVVSUQoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiVGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBkaWZmZXJlbnQgVVVJRCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vZGUgPSAoVHJlZU5vZGVJbXBsKSBhZGQocGF0aCk7Ci0gICAgICAgICAgICBub2RlLnNldFV1aWQoZG9jLmdldFVVSUQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGUuYWRkTGluayhkb2MuZ2V0TGFuZ3VhZ2UoKSwgIiIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBUcmVlTm9kZUltcGwgZ2V0VHJlZU5vZGUoU3RyaW5nIHBhdGgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChUcmVlTm9kZUltcGwpIGdldE5vZGUocGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlIGFkZChTdHJpbmcgcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcGFyZW50UGF0aCA9IGdldFBhcmVudFBhdGgocGF0aCk7Ci0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhcmVudFBhdGgubGVuZ3RoKCkgKyAxKTsKLSAgICAgICAgaWYgKCFjb250YWlucyhwYXJlbnRQYXRoKSkgewotICAgICAgICAgICAgYWRkKHBhcmVudFBhdGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRUcmVlTm9kZShwYXJlbnRQYXRoKS5hZGRDaGlsZChub2RlTmFtZSwgREVGQVVMVF9WSVNJQklMSVRZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZU5vZGUgYWRkKFN0cmluZyBwYXRoLCBTdHJpbmcgZm9sbG93aW5nU2libGluZ1BhdGgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBhcmVudFBhdGggPSBnZXRQYXJlbnRQYXRoKHBhdGgpOwotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXJlbnRQYXRoLmxlbmd0aCgpICsgMSk7Ci0KLSAgICAgICAgaWYgKCFmb2xsb3dpbmdTaWJsaW5nUGF0aC5zdGFydHNXaXRoKHBhcmVudFBhdGggKyAiLyIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiSW52YWxpZCBmb2xsb3dpbmcgc2libGluZyBwYXRoIFsiICsgZm9sbG93aW5nU2libGluZ1BhdGggKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZvbGxvd2luZ05vZGVOYW1lID0gZm9sbG93aW5nU2libGluZ1BhdGguc3Vic3RyaW5nKHBhcmVudFBhdGgubGVuZ3RoKCkgKyAxKTsKLQotICAgICAgICBpZiAoIWNvbnRhaW5zKHBhcmVudFBhdGgpKSB7Ci0gICAgICAgICAgICBhZGQocGFyZW50UGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFRyZWVOb2RlKHBhcmVudFBhdGgpLmFkZENoaWxkKG5vZGVOYW1lLCBmb2xsb3dpbmdOb2RlTmFtZSwgREVGQVVMVF9WSVNJQklMSVRZKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcmVudFBhdGgoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgaW50IGxhc3RJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgU3RyaW5nIHBhcmVudFBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpOwotICAgICAgICByZXR1cm4gcGFyZW50UGF0aDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCBwYXRoMm5vZGUgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIHV1aWRMYW5ndWFnZTJsaW5rID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChTaXRlTm9kZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gbm9kZS5nZXRQYXRoKCk7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJwYXRoIiwgcGF0aCk7Ci0gICAgICAgIGlmIChub2RlICE9IHRoaXMucm9vdCkgewotICAgICAgICAgICAgQXNzZXJ0LmlzVHJ1ZSgicGF0aCBub3QgZW1wdHkiLCBwYXRoLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wYXRoMm5vZGUucHV0KHBhdGgsIG5vZGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpbmtBZGRlZChMaW5rIGxpbmspIHsKLSAgICAgICAgaWYgKGxpbmsuZ2V0Tm9kZSgpLmdldFV1aWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnV1aWRMYW5ndWFnZTJsaW5rLnB1dChnZXRLZXkobGluayksIGxpbmspOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoTGluayBsaW5rKSB7Ci0gICAgICAgIFN0cmluZyB1dWlkID0gbGluay5nZXREb2N1bWVudCgpLmdldFVVSUQoKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInV1aWQiLCB1dWlkKTsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbGluay5nZXRMYW5ndWFnZSgpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgibGFuZ3VhZ2UiLCBsYW5ndWFnZSk7Ci0gICAgICAgIHJldHVybiBnZXRLZXkodXVpZCwgbGFuZ3VhZ2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInV1aWQiLCB1dWlkKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImxhbmd1YWdlIiwgbGFuZ3VhZ2UpOwotICAgICAgICByZXR1cm4gdXVpZCArICI6IiArIGxhbmd1YWdlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG5vZGVSZW1vdmVkKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJwYXRoIiwgcGF0aCk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoInBhdGggWyIgKyBwYXRoICsgIl0gY29udGFpbmVkIiwgdGhpcy5wYXRoMm5vZGUuY29udGFpbnNLZXkocGF0aCkpOwotICAgICAgICB0aGlzLnBhdGgybm9kZS5yZW1vdmUocGF0aCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRVdWlkTGFuZ3VhZ2UyTGluaygpIHsKLSAgICAgICAgbG9hZCgpOwotICAgICAgICByZXR1cm4gdGhpcy51dWlkTGFuZ3VhZ2UybGluazsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldFBhdGgyTm9kZSgpIHsKLSAgICAgICAgbG9hZCgpOwotICAgICAgICByZXR1cm4gdGhpcy5wYXRoMm5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgbG9hZCgpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgicGF0aCIsIHBhdGgpOwotICAgICAgICByZXR1cm4gdGhpcy5wYXRoMm5vZGUuY29udGFpbnNLZXkocGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNCeVV1aWQoU3RyaW5nIHV1aWQsIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBBc3NlcnQubm90TnVsbCgidXVpZCIsIHV1aWQpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgibGFuZ3VhZ2UiLCBsYW5ndWFnZSk7Ci0gICAgICAgIHJldHVybiBnZXRVdWlkTGFuZ3VhZ2UyTGluaygpLmNvbnRhaW5zS2V5KGdldEtleSh1dWlkLCBsYW5ndWFnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5BbnlMYW5ndWFnZShTdHJpbmcgdXVpZCkgewotICAgICAgICBBc3NlcnQubm90TnVsbCgidXVpZCIsIHV1aWQpOwotICAgICAgICBTZXQgc2V0ID0gZ2V0VXVpZExhbmd1YWdlMkxpbmsoKS5rZXlTZXQoKTsKLSAgICAgICAgU3RyaW5nW10ga2V5cyA9IChTdHJpbmdbXSkgc2V0LnRvQXJyYXkobmV3IFN0cmluZ1tzZXQuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGtleXNbaV0uc3RhcnRzV2l0aCh1dWlkICsgIjoiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFyZWEoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFyZWEuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5rIGdldEJ5VXVpZChTdHJpbmcgdXVpZCwgU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJ1dWlkIiwgdXVpZCk7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJsYW5ndWFnZSIsIGxhbmd1YWdlKTsKLSAgICAgICAgU3RyaW5nIGtleSA9IGdldEtleSh1dWlkLCBsYW5ndWFnZSk7Ci0gICAgICAgIGlmICghZ2V0VXVpZExhbmd1YWdlMkxpbmsoKS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiTm8gbGluayBmb3IgWyIgKyBrZXkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTGluaykgZ2V0VXVpZExhbmd1YWdlMkxpbmsoKS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0ludmFyaWFudHMoKSB7Ci0gICAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBwYXRocyA9IHRoaXMucGF0aDJub2RlLmtleVNldCgpLml0ZXJhdG9yKCk7IHBhdGhzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKFN0cmluZykgcGF0aHMubmV4dCgpOwotICAgICAgICAgICAgU2l0ZU5vZGUgbm9kZSA9IChTaXRlTm9kZSkgdGhpcy5wYXRoMm5vZGUuZ2V0KHBhdGgpOwotICAgICAgICAgICAgU3RyaW5nIHV1aWQgPSBub2RlLmdldFV1aWQoKTsKLSAgICAgICAgICAgIGlmICh1dWlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBsYW5ncyA9IG5vZGUuZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0S2V5KHV1aWQsIGxhbmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmlzVHJ1ZSgiY29udGFpbnMgbGluayBmb3IgWyIgKyBrZXkgKyAiXSIsIHRoaXMudXVpZExhbmd1YWdlMmxpbmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkoa2V5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3Iga2V5cyA9IHRoaXMudXVpZExhbmd1YWdlMmxpbmsua2V5U2V0KCkuaXRlcmF0b3IoKTsga2V5cy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBMaW5rIGxpbmsgPSAoTGluaykgdGhpcy51dWlkTGFuZ3VhZ2UybGluay5nZXQoa2V5KTsKLSAgICAgICAgICAgIEFzc2VydC5pc1RydWUoImNvbnRhaW5zIHBhdGggZm9yIFsiICsga2V5ICsgIl0iLCB0aGlzLnBhdGgybm9kZS5jb250YWluc0tleShsaW5rCi0gICAgICAgICAgICAgICAgICAgIC5nZXROb2RlKCkuZ2V0UGF0aCgpKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZSBnZXROb2RlKFN0cmluZyBwYXRoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJwYXRoIiwgcGF0aCk7Ci0gICAgICAgIGlmICghZ2V0UGF0aDJOb2RlKCkuY29udGFpbnNLZXkocGF0aCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJObyBub2RlIGZvciBwYXRoIFsiICsgcGF0aCArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTaXRlTm9kZSkgdGhpcy5wYXRoMm5vZGUuZ2V0KHBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZVtdIGdldE5vZGVzKCkgewotICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLnByZU9yZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hcmVhLmdldFB1YmxpY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJlYS5nZXRQdWJsaWNhdGlvbigpLmdldEZhY3RvcnkoKS5nZXRTZXNzaW9uKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTm9kZUZhY3Rvcnkgbm9kZUZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgTm9kZUZhY3RvcnkgZ2V0Tm9kZUZhY3RvcnkoKSB7Ci0gICAgICAgIGlmICh0aGlzLm5vZGVGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5ub2RlRmFjdG9yeSA9IChOb2RlRmFjdG9yeSkgbWFuYWdlci5sb29rdXAoTm9kZUZhY3RvcnkuUk9MRSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ3JlYXRpbmcgcmVwb3NpdG9yeSBub2RlIGZhaWxlZDogIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMubm9kZUZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0UmVwb3NpdG9yeU5vZGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKE5vZGUpIGdldFNlc3Npb24oKS5nZXRSZXBvc2l0b3J5SXRlbShnZXROb2RlRmFjdG9yeSgpLCBnZXRTb3VyY2VVcmkoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNyZWF0aW5nIHJlcG9zaXRvcnkgbm9kZSBmYWlsZWQ6ICIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVOb2RlW10gZ2V0VG9wTGV2ZWxOb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5nZXRDaGlsZHJlbigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpbmtSZW1vdmVkKFN0cmluZyB1dWlkLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInV1aWQiLCB1dWlkKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImxhbmd1YWdlIiwgbGFuZ3VhZ2UpOwotICAgICAgICBTdHJpbmcga2V5ID0gZ2V0S2V5KHV1aWQsIGxhbmd1YWdlKTsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZSgiY29udGFpbmVkIiwgdGhpcy51dWlkTGFuZ3VhZ2UybGluay5jb250YWluc0tleShrZXkpKTsKLSAgICAgICAgdGhpcy51dWlkTGFuZ3VhZ2UybGluay5yZW1vdmUoa2V5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBub2RlcyBpbiBwcmUtb3JkZXIgZW51bWVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFNpdGVOb2RlW10gcHJlT3JkZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRSb290KCkucHJlT3JkZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlRG93bihTdHJpbmcgcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBUcmVlTm9kZSBub2RlID0gZ2V0VHJlZU5vZGUocGF0aCk7Ci0gICAgICAgIFRyZWVOb2RlIHBhcmVudCA9IGdldFBhcmVudChub2RlKTsKLSAgICAgICAgcGFyZW50Lm1vdmVEb3duKG5vZGUuZ2V0TmFtZSgpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmVVcChTdHJpbmcgcGF0aCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBUcmVlTm9kZSBub2RlID0gZ2V0VHJlZU5vZGUocGF0aCk7Ci0gICAgICAgIFRyZWVOb2RlIHBhcmVudCA9IGdldFBhcmVudChub2RlKTsKLSAgICAgICAgcGFyZW50Lm1vdmVVcChub2RlLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5vZGUgQSBub2RlLgotICAgICAqIEByZXR1cm4gVGhlIHBhcmVudCBvZiB0aGUgbm9kZSwgd2hpY2ggaXMgdGhlIHJvb3Qgbm9kZSBmb3IgdG9wIGxldmVsIG5vZGVzLgotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRyZWVOb2RlIGdldFBhcmVudChUcmVlTm9kZSBub2RlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFRyZWVOb2RlIHBhcmVudDsKLSAgICAgICAgaWYgKG5vZGUuaXNUb3BMZXZlbCgpKSB7Ci0gICAgICAgICAgICBwYXJlbnQgPSBnZXRSb290KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJlbnQgPSAoVHJlZU5vZGUpIG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcGF0aCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIGlmIChjb250YWlucyhwYXRoKSkgewotICAgICAgICAgICAgU2l0ZU5vZGUgbm9kZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm9kZSA9IGdldE5vZGUocGF0aCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBub2RlLmhhc0xpbmsobGFuZ3VhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VkKCkgewotICAgICAgICBpZiAoIXRoaXMubG9hZGluZykgewotICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlMi9TaXRlVHJlZUxpbmsuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvU2l0ZVRyZWVMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDVkNjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlMi9TaXRlVHJlZUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuQWJzdHJhY3RMaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci0KLS8qKgotICogU2l0ZVRyZWUgbGluay4KLSAqLwotcHVibGljIGNsYXNzIFNpdGVUcmVlTGluayBleHRlbmRzIEFic3RyYWN0TGluayB7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFNpdGVUcmVlTGluayhEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgU2l0ZU5vZGUgbm9kZSwKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHN1cGVyKGZhY3RvcnksIG5vZGUsIGxhYmVsLCBsYW5ndWFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKCkgewotICAgICAgICBUcmVlTm9kZUltcGwgbm9kZSA9IChUcmVlTm9kZUltcGwpIGdldE5vZGUoKTsKLSAgICAgICAgbm9kZS5yZW1vdmVMaW5rKGdldExhbmd1YWdlKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgewotICAgICAgICBUcmVlTm9kZUltcGwgbm9kZSA9IChUcmVlTm9kZUltcGwpIGdldE5vZGUoKTsKLSAgICAgICAgbm9kZS5jaGFuZ2VkKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL1RyZWVOb2RlLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL1RyZWVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTNiNDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlMi9UcmVlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGU7Ci0KLS8qKgotICogQSBwYXJlbnQgZm9yIG5vZGVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVOb2RlIGV4dGVuZHMgU2l0ZU5vZGUsIFNpdGVUcmVlTm9kZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBTaXRlTm9kZVtdIGdldENoaWxkcmVuKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBQcmVvcmRlciBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBTaXRlTm9kZVtdIHByZU9yZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmlzaWJsZSBUaGUgbmF2aWdhdGlvbiB2aXNpYmlsaXR5LgotICAgICAqIEByZXR1cm4gQSBzaXRlIG5vZGUuCi0gICAgICovCi0gICAgU2l0ZU5vZGUgYWRkQ2hpbGQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmlzaWJsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbm9kZU5hbWUKLSAgICAgKiBAcGFyYW0gZm9sbG93aW5nTm9kZU5hbWUKLSAgICAgKiBAcGFyYW0gdmlzaWJsZSBUaGUgbmF2aWdhdGlvbiB2aXNpYmlsaXR5LgotICAgICAqIEByZXR1cm4gQSBzaXRlIG5vZGUuCi0gICAgICovCi0gICAgU2l0ZU5vZGUgYWRkQ2hpbGQoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgZm9sbG93aW5nTm9kZU5hbWUsIGJvb2xlYW4gdmlzaWJsZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgdHJlZS4KLSAgICAgKi8KLSAgICBTaXRlVHJlZUltcGwgZ2V0VHJlZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgcGF0aC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UGF0aCgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUuCi0gICAgICovCi0gICAgdm9pZCBtb3ZlRG93bihTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZS4KLSAgICAgKi8KLSAgICB2b2lkIG1vdmVVcChTdHJpbmcgbmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvVHJlZU5vZGVJbXBsLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL1RyZWVOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVjY2VkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvVHJlZU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnV0aWwuU3RyaW5nVXRpbDsKLQotLyoqCi0gKiBTaXRlIHRyZWUgbm9kZS4KLSAqLwotcHVibGljIGNsYXNzIFRyZWVOb2RlSW1wbCBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFRyZWVOb2RlIHsKLQotICAgIHByaXZhdGUgVHJlZU5vZGUgcGFyZW50OwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBBIHRvcCBsZXZlbCBub2RlLgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudC4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmlzaWJsZSBUaGUgbmF2aWdhdGlvbiB2aXNpYmlsaXR5LgotICAgICAqIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZU5vZGVJbXBsKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmlzaWJsZSwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcodGhpcywgbG9nZ2VyKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoIm5hbWUiLCBuYW1lKTsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdmlzaWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBVVUlELgotICAgICAqIEBwYXJhbSB1dWlkIFRoZSBVVUlELgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFV1aWQoU3RyaW5nIHV1aWQpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInV1aWQiLCB1dWlkKTsKLSAgICAgICAgaWYgKHRoaXMubGFuZ3VhZ2UybGluay5rZXlTZXQoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHRoZSBVVUlEIGlmIHRoZSBub2RlIGhhcyBsaW5rcy4iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXMudXVpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBsYW5ndWFnZXMgPSBnZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2V0VHJlZSgpLmxpbmtSZW1vdmVkKHRoaXMudXVpZCwgbGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy51dWlkID0gdXVpZDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IGdldExhbmd1YWdlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhbmd1YWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRUcmVlKCkubGlua0FkZGVkKGdldExpbmsobGFuZ3VhZ2VzW2ldKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLSAgICAgICAgZGVsZXRlSW50ZXJuYWwoKTsKLSAgICAgICAgY2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZUludGVybmFsKCkgewotICAgICAgICBTdHJpbmdbXSBsYW5ndWFnZXMgPSBnZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ndWFnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJlbW92ZUxpbmtJbnRlcm5hbChsYW5ndWFnZXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIFNpdGVOb2RlW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAoKFRyZWVOb2RlSW1wbCkgY2hpbGRyZW5baV0pLmRlbGV0ZUludGVybmFsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgKChUcmVlTm9kZUltcGwpIHRoaXMucGFyZW50KS5yZW1vdmVDaGlsZChnZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIGxhbmd1YWdlMmxpbmsgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgU3RyaW5nIHV1aWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZTsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMYW5ndWFnZXMoKSB7Ci0gICAgICAgIFNldCBsYW5ndWFnZXMgPSB0aGlzLmxhbmd1YWdlMmxpbmsua2V5U2V0KCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGxhbmd1YWdlcy50b0FycmF5KG5ldyBTdHJpbmdbbGFuZ3VhZ2VzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5rIGdldExpbmsoU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJsYW5ndWFnZSIsIGxhbmd1YWdlKTsKLSAgICAgICAgaWYgKCF0aGlzLmxhbmd1YWdlMmxpbmsuY29udGFpbnNLZXkobGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiTm8gbGluayBjb250YWluZWQgZm9yIGxhbmd1YWdlIFsiICsgbGFuZ3VhZ2UgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTGluaykgdGhpcy5sYW5ndWFnZTJsaW5rLmdldChsYW5ndWFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZSBnZXRQYXJlbnQoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1RvcExldmVsKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJUaGlzIGlzIGEgdG9wIGxldmVsIG5vZGUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTaXRlTm9kZSkgdGhpcy5wYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UGF0aCgpICsgIi8iICsgZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlU3RydWN0dXJlIGdldFN0cnVjdHVyZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRyZWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFV1aWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnV1aWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTGluayhTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImxhbmd1YWdlIiwgbGFuZ3VhZ2UpOwotICAgICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZTJsaW5rLmNvbnRhaW5zS2V5KGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcExldmVsKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBSb290Tm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlzVmlzaWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZUluTmF2KSB7Ci0gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdmlzaWJsZUluTmF2OwotICAgICAgICBjaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlZCgpIHsKLSAgICAgICAgZ2V0VHJlZSgpLmNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZVRyZWVOb2RlW10gZ2V0UHJlY2VkaW5nU2libGluZ3MoKSB7Ci0gICAgICAgIFNpdGVOb2RlW10gY2hpbGRyZW4gPSB0aGlzLnBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgICAgICBpbnQgcG9zID0gQXJyYXlzLmFzTGlzdChjaGlsZHJlbikuaW5kZXhPZih0aGlzKTsKLSAgICAgICAgTGlzdCBzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3MgOyBpKyspIHsKLSAgICAgICAgICAgIHNpYmxpbmdzLmFkZChjaGlsZHJlbltpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTaXRlVHJlZU5vZGVbXSkgc2libGluZ3MudG9BcnJheShuZXcgVHJlZU5vZGVJbXBsW3NpYmxpbmdzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlVHJlZU5vZGVbXSBnZXROZXh0U2libGluZ3MoKSB7Ci0gICAgICAgIFNpdGVOb2RlW10gY2hpbGRyZW4gPSB0aGlzLnBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgICAgICBpbnQgcG9zID0gQXJyYXlzLmFzTGlzdChjaGlsZHJlbikuaW5kZXhPZih0aGlzKTsKLSAgICAgICAgTGlzdCBzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IHBvcyArIDE7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc2libGluZ3MuYWRkKGNoaWxkcmVuW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFNpdGVUcmVlTm9kZVtdKSBzaWJsaW5ncy50b0FycmF5KG5ldyBUcmVlTm9kZUltcGxbc2libGluZ3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpdGVUcmVlSW1wbCBnZXRUcmVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0VHJlZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaW5rIGFkZExpbmsoU3RyaW5nIGxhbmcsIFN0cmluZyBsYWJlbCkgewotICAgICAgICBBc3NlcnQubm90TnVsbCgibGFuZ3VhZ2UiLCBsYW5nKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImxhYmVsIiwgbGFiZWwpOwotICAgICAgICBMaW5rIGxpbmsgPSBhZGRMaW5rSW50ZXJuYWwobGFuZywgbGFiZWwpOwotICAgICAgICBjaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiBsaW5rOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaW5rIGFkZExpbmtJbnRlcm5hbChTdHJpbmcgbGFuZywgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJsYW5ndWFnZSIsIGxhbmcpOwotICAgICAgICBBc3NlcnQubm90TnVsbCgibGFiZWwiLCBsYWJlbCk7Ci0gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlMmxpbmsuY29udGFpbnNLZXkobGFuZykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgbGFuZ3VhZ2UgWyIgKyBsYW5nICsgIl0gaXMgYWxyZWFkeSBjb250YWluZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBnZXRUcmVlKCkuZ2V0UHVibGljYXRpb24oKS5nZXRGYWN0b3J5KCk7Ci0gICAgICAgIExpbmsgbGluayA9IG5ldyBTaXRlVHJlZUxpbmsoZmFjdG9yeSwgdGhpcywgbGFiZWwsIGxhbmcpOwotICAgICAgICB0aGlzLmxhbmd1YWdlMmxpbmsucHV0KGxhbmcsIGxpbmspOwotICAgICAgICBnZXRUcmVlKCkubGlua0FkZGVkKGxpbmspOwotICAgICAgICByZXR1cm4gbGluazsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaW5rKFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICByZW1vdmVMaW5rSW50ZXJuYWwobGFuZ3VhZ2UpOwotICAgICAgICBkZWxldGVJZkVtcHR5KCk7Ci0gICAgICAgIGNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaW5rSW50ZXJuYWwoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJsYW5ndWFnZSIsIGxhbmd1YWdlKTsKLSAgICAgICAgdGhpcy5sYW5ndWFnZTJsaW5rLnJlbW92ZShsYW5ndWFnZSk7Ci0gICAgICAgIGdldFRyZWUoKS5saW5rUmVtb3ZlZChnZXRVdWlkKCksIGxhbmd1YWdlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVJZkVtcHR5KCkgewotICAgICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBkZWxldGVJbnRlcm5hbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2UybGluay5pc0VtcHR5KCkgJiYgdGhpcy5uYW1lMmNoaWxkLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0UGF0aCgpICsgIlsiICsgU3RyaW5nVXRpbC5qb2luKGdldExhbmd1YWdlcygpLCAiLCIpICsgIl0iOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBTaXRlTm9kZVtdIGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gKFNpdGVOb2RlW10pIHRoaXMuY2hpbGRyZW4udG9BcnJheShuZXcgU2l0ZU5vZGVbdGhpcy5jaGlsZHJlbi5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZU5vZGVbXSBwcmVPcmRlcigpIHsKLSAgICAgICAgTGlzdCBwcmVPcmRlciA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJlT3JkZXIuYWRkKHRoaXMpOwotICAgICAgICBTaXRlTm9kZVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVHJlZU5vZGUgY2hpbGQgPSAoVHJlZU5vZGUpIGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgcHJlT3JkZXIuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2hpbGQucHJlT3JkZXIoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU2l0ZU5vZGVbXSkgcHJlT3JkZXIudG9BcnJheShuZXcgU2l0ZU5vZGVbcHJlT3JkZXIuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoIm5hbWUiLCBuYW1lKTsKLSAgICAgICAgaWYgKCF0aGlzLm5hbWUyY2hpbGQuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgbm9kZSBbIiArIG5hbWUgKyAiXSBpcyBub3QgY29udGFpbmVkISIpOwotICAgICAgICB9Ci0gICAgICAgIFNpdGVOb2RlIG5vZGUgPSAoU2l0ZU5vZGUpIHRoaXMubmFtZTJjaGlsZC5nZXQobmFtZSk7Ci0gICAgICAgIHRoaXMubmFtZTJjaGlsZC5yZW1vdmUobm9kZS5nZXROYW1lKCkpOwotICAgICAgICB0aGlzLmNoaWxkcmVuLnJlbW92ZShub2RlKTsKLSAgICAgICAgZ2V0VHJlZSgpLm5vZGVSZW1vdmVkKGdldFBhdGgoKSArICIvIiArIG5hbWUpOwotICAgICAgICBkZWxldGVJZkVtcHR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgbmFtZTJjaGlsZCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgU2l0ZU5vZGUgYWRkQ2hpbGQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBBc3NlcnQubm90TnVsbCgibmFtZSIsIG5hbWUpOwotICAgICAgICByZXR1cm4gYWRkQ2hpbGQobmFtZSwgdGhpcy5jaGlsZHJlbi5zaXplKCksIHZpc2libGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZSBhZGRDaGlsZChTdHJpbmcgbmFtZSwgU3RyaW5nIGZvbGxvd2luZ05vZGVOYW1lLCBib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoIm5hbWUiLCBuYW1lKTsKLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoImZvbGxvd2luZyBub2RlIG5hbWUiLCBmb2xsb3dpbmdOb2RlTmFtZSk7Ci0gICAgICAgIFNpdGVOb2RlIGZvbGxvd2luZ1NpYmxpbmcgPSBnZXRDaGlsZChmb2xsb3dpbmdOb2RlTmFtZSk7Ci0gICAgICAgIGludCBwb3MgPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoZm9sbG93aW5nU2libGluZyk7Ci0gICAgICAgIHJldHVybiBhZGRDaGlsZChuYW1lLCBwb3MsIHZpc2libGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTaXRlTm9kZSBhZGRDaGlsZChTdHJpbmcgbmFtZSwgaW50IHBvcywgYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJuYW1lIiwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKHRoaXMubmFtZTJjaGlsZC5jb250YWluc0tleShuYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBjaGlsZCBbIiArIG5hbWUgKyAiXSBpcyBhbHJlYWR5IGNvbnRhaW5lZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNpdGVOb2RlIG5vZGUgPSBuZXcgVHJlZU5vZGVJbXBsKHRoaXMsIG5hbWUsIHZpc2libGUsIGdldExvZ2dlcigpKTsKLSAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGQocG9zLCBub2RlKTsKLSAgICAgICAgdGhpcy5uYW1lMmNoaWxkLnB1dChuYW1lLCBub2RlKTsKLSAgICAgICAgZ2V0VHJlZSgpLm5vZGVBZGRlZChub2RlKTsKLSAgICAgICAgZ2V0VHJlZSgpLmNoYW5nZWQoKTsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNpdGVOb2RlIGdldENoaWxkKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJuYW1lIiwgbmFtZSk7Ci0gICAgICAgIGlmICh0aGlzLm5hbWUyY2hpbGQuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoU2l0ZU5vZGUpIHRoaXMubmFtZTJjaGlsZC5nZXQobmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gc3VjaCBjaGlsZCBbIiArIG5hbWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRQb3NpdGlvbihTaXRlTm9kZSBjaGlsZCkgewotICAgICAgICBBc3NlcnQubm90TnVsbCgiY2hpbGQiLCBjaGlsZCk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoImNvbnRhaW5zIiwgdGhpcy5jaGlsZHJlbi5jb250YWlucyhjaGlsZCkpOwotICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5pbmRleE9mKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlRG93bihTdHJpbmcgbmFtZSkgewotICAgICAgICBTaXRlTm9kZSBjaGlsZCA9IGdldENoaWxkKG5hbWUpOwotICAgICAgICBpbnQgcG9zID0gZ2V0UG9zaXRpb24oY2hpbGQpOwotICAgICAgICBBc3NlcnQuaXNUcnVlKCJub3QgbGFzdCIsIHBvcyA8IHRoaXMuY2hpbGRyZW4uc2l6ZSgpIC0gMSk7Ci0gICAgICAgIHRoaXMuY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLSAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGQocG9zICsgMSwgY2hpbGQpOwotICAgICAgICBjaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZVVwKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFNpdGVOb2RlIGNoaWxkID0gZ2V0Q2hpbGQobmFtZSk7Ci0gICAgICAgIGludCBwb3MgPSBnZXRQb3NpdGlvbihjaGlsZCk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoIm5vdCBmaXJzdCIsIHBvcyA+IDApOwotICAgICAgICB0aGlzLmNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0gICAgICAgIHRoaXMuY2hpbGRyZW4uYWRkKHBvcyAtIDEsIGNoaWxkKTsKLSAgICAgICAgY2hhbmdlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0xpbmsoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvVHJlZVNpdGVNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUyL1RyZWVTaXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTVlMWFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZTIvVHJlZVNpdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uQXJlYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUl0ZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuQWJzdHJhY3RTaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5Ob2RlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlTm9kZTsKLQotLyoqCi0gKiBUcmVlLWJhc2VkIHNpdGUgbWFuYWdlci4KLSAqLwotcHVibGljIGNsYXNzIFRyZWVTaXRlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0U2l0ZU1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2l0ZXRyZWUgZm9yIGEgc3BlY2lmaWMgYXJlYSBvZiB0aGlzIHB1YmxpY2F0aW9uLiBTaXRldHJlZXMgYXJlIGNyZWF0ZWQgb24gZGVtYW5kCi0gICAgICogYW5kIGFyZSBjYWNoZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZWEgVGhlIGFyZWEuCi0gICAgICogQHJldHVybiBBIHNpdGUgdHJlZS4KLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTaXRlVHJlZSBnZXRUcmVlKEFyZWEgYXJlYSkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRLZXkoYXJlYSk7Ci0gICAgICAgIFNpdGVUcmVlIHNpdGV0cmVlOwotICAgICAgICBSZXBvc2l0b3J5SXRlbUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaXRlVHJlZUZhY3RvcnkodGhpcy5tYW5hZ2VyLCBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzaXRldHJlZSA9IChTaXRlVHJlZSkgYXJlYS5nZXRQdWJsaWNhdGlvbigpLmdldEZhY3RvcnkoKS5nZXRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlcG9zaXRvcnlJdGVtKGZhY3RvcnksIGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzaXRldHJlZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXJlYSBUaGUgYXJlYS4KLSAgICAgKiBAcmV0dXJuIFRoZSBrZXkgdG8gc3RvcmUgc2l0ZXRyZWUgb2JqZWN0cyBpbiB0aGUgaWRlbnRpdHkgbWFwLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KEFyZWEgYXJlYSkgewotICAgICAgICByZXR1cm4gYXJlYS5nZXRQdWJsaWNhdGlvbigpLmdldElkKCkgKyAiOiIgKyBhcmVhLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIHBhdGgsIERvY3VtZW50IGRvYykgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBnZXRUcmVlKGRvYy5hcmVhKCkpLmFkZChwYXRoLCBkb2MpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKERvY3VtZW50IGRvYykgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0VHJlZShkb2MuYXJlYSgpKS5jb250YWluc0J5VXVpZChkb2MuZ2V0VVVJRCgpLCBkb2MuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbkFueUxhbmd1YWdlKERvY3VtZW50IGRvYykgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0VHJlZShkb2MuYXJlYSgpKS5jb250YWluc0luQW55TGFuZ3VhZ2UoZG9jLmdldFVVSUQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29weShEb2N1bWVudCBzcmNEb2MsIERvY3VtZW50IGRlc3REb2MpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU2l0ZVRyZWUgZGVzdGluYXRpb25UcmVlID0gZ2V0VHJlZShkZXN0RG9jLmFyZWEoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRyZWVOb2RlSW1wbCBzb3VyY2VOb2RlID0gKFRyZWVOb2RlSW1wbCkgc3JjRG9jLmdldExpbmsoKS5nZXROb2RlKCk7Ci0KLSAgICAgICAgICAgIFNpdGVUcmVlTm9kZVtdIHNpYmxpbmdzID0gc291cmNlTm9kZS5nZXROZXh0U2libGluZ3MoKTsKLSAgICAgICAgICAgIFNpdGVOb2RlIHBhcmVudCA9IHNvdXJjZU5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyZW50SWQgPSAiIjsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmVudElkID0gcGFyZW50LmdldFBhdGgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyZWVOb2RlSW1wbCBzaWJsaW5nID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBzaWJsaW5nUGF0aCA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIHNhbWUgVVVJRCAtPiBpbnNlcnQgYXQgdGhlIHNhbWUgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChzcmNEb2MuZ2V0VVVJRCgpLmVxdWFscyhkZXN0RG9jLmdldFVVSUQoKSkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcGFyZW50SWQgKyAiLyIgKyBzaWJsaW5nc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNpYmxpbmcgPSAoVHJlZU5vZGVJbXBsKSBkZXN0aW5hdGlvblRyZWUuZ2V0Tm9kZShwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ1BhdGggPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlTm9kZS5oYXNMaW5rKHNyY0RvYy5nZXRMYW5ndWFnZSgpKSkgewotICAgICAgICAgICAgICAgIC8vIHRoZSBub2RlIHRoYXQgd2UncmUgdHJ5aW5nIHRvIHB1Ymxpc2gKLSAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGhhdmUgdGhpcyBsYW5ndWFnZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKCJUaGUgbm9kZSAiICsgc3JjRG9jLmdldFBhdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgY29udGFpbiBhIGxhYmVsIGZvciBsYW5ndWFnZSAiICsgc3JjRG9jLmdldExhbmd1YWdlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgZGVzdFBhdGggPSBkZXN0RG9jLmdldFBhdGgoKTsKLQotICAgICAgICAgICAgTGluayBsaW5rID0gc291cmNlTm9kZS5nZXRMaW5rKHNyY0RvYy5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgIFNpdGVOb2RlIGRlc3ROb2RlID0gZGVzdGluYXRpb25UcmVlLmdldE5vZGUoZGVzdFBhdGgpOwotICAgICAgICAgICAgaWYgKGRlc3ROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2libGluZ1BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZm9yIHNpZGUgZWZmZWN0IG9mIGFkZCwgbm90IHJldHVybiByZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgZGVzdE5vZGUgPSBkZXN0aW5hdGlvblRyZWUuYWRkKGRlc3RQYXRoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZm9yIHNpZGUgZWZmZWN0IG9mIGFkZCwgbm90IHJldHVybiByZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgZGVzdE5vZGUgPSBkZXN0aW5hdGlvblRyZWUuYWRkKGRlc3RQYXRoLCBzaWJsaW5nUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVHJlZS5hZGQoZGVzdFBhdGgsIGRlc3REb2MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXN0RG9jLmdldExpbmsoKS5zZXRMYWJlbChsaW5rLmdldExhYmVsKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChEb2N1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudExvY2F0b3IgZ2V0QXZhaWxhYmxlTG9jYXRvcihEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgRG9jdW1lbnRMb2NhdG9yIGxvY2F0b3IpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBEb2N1bWVudExvY2F0b3IuZ2V0TG9jYXRvcihsb2NhdG9yLmdldFB1YmxpY2F0aW9uSWQoKSwgbG9jYXRvci5nZXRBcmVhKCksCi0gICAgICAgICAgICAgICAgY29tcHV0ZVVuaXF1ZVBhdGgoZmFjdG9yeSwgbG9jYXRvciksIGxvY2F0b3IuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29tcHV0ZSBhbiB1bmlxdWUgZG9jdW1lbnQgaWQKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeS4KLSAgICAgKiBAcGFyYW0gbG9jYXRvciBUaGUgbG9jYXRvci4KLSAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgZG9jdW1lbnRpZAotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlVW5pcXVlUGF0aChEb2N1bWVudEZhY3RvcnkgZmFjdG9yeSwgRG9jdW1lbnRMb2NhdG9yIGxvY2F0b3IpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gbG9jYXRvci5nZXRQYXRoKCk7Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHViOwotICAgICAgICBTaXRlVHJlZSB0cmVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHViID0gZmFjdG9yeS5nZXRQdWJsaWNhdGlvbihsb2NhdG9yLmdldFB1YmxpY2F0aW9uSWQoKSk7Ci0gICAgICAgICAgICB0cmVlID0gZ2V0VHJlZShwdWIuZ2V0QXJlYShsb2NhdG9yLmdldEFyZWEoKSkpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzdWZmaXggPSBudWxsOwotICAgICAgICBpbnQgdmVyc2lvbiA9IDA7Ci0gICAgICAgIFN0cmluZyBpZHdpdGhvdXRzdWZmaXggPSBudWxsOwotCi0gICAgICAgIGlmICh0cmVlLmNvbnRhaW5zKHBhdGgpKSB7Ci0gICAgICAgICAgICBpbnQgbiA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0VG9rZW4gPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyBzdWJzdHJpbmcgPSBwYXRoOwotICAgICAgICAgICAgbGFzdFRva2VuID0gcGF0aC5zdWJzdHJpbmcobik7Ci0gICAgICAgICAgICBzdWJzdHJpbmcgPSBwYXRoLnN1YnN0cmluZygwLCBuKTsKLQotICAgICAgICAgICAgaW50IGwgPSBsYXN0VG9rZW4ubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBsYXN0VG9rZW4ubGFzdEluZGV4T2YoIi0iKTsKLSAgICAgICAgICAgIGlmICgwIDwgaW5kZXggJiYgaW5kZXggPCBsICYmIGxhc3RUb2tlbi5zdWJzdHJpbmcoaW5kZXggKyAxKS5tYXRjaGVzKCJbXFxkXSoiKSkgewotICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGxhc3RUb2tlbi5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICBpZHdpdGhvdXRzdWZmaXggPSBzdWJzdHJpbmcgKyBsYXN0VG9rZW4uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChzdWZmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZHdpdGhvdXRzdWZmaXggPSBzdWJzdHJpbmcgKyBsYXN0VG9rZW47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlICh0cmVlLmNvbnRhaW5zKHBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyAxOwotICAgICAgICAgICAgICAgIHBhdGggPSBpZHdpdGhvdXRzdWZmaXggKyAiLSIgKyB2ZXJzaW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50W10gZ2V0RG9jdW1lbnRzKERvY3VtZW50RmFjdG9yeSBmYWN0b3J5LCBQdWJsaWNhdGlvbiBwdWIsIFN0cmluZyBhcmVhKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBBcmVhIGFyZWFPYmo7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhcmVhT2JqID0gcHViLmdldEFyZWEoYXJlYSk7Ci0gICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIFNpdGVUcmVlIHRyZWUgPSBnZXRUcmVlKGFyZWFPYmopOwotICAgICAgICBTaXRlTm9kZVtdIHByZU9yZGVyID0gdHJlZS5wcmVPcmRlcigpOwotICAgICAgICBMaXN0IGRvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlT3JkZXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGxhbmdzID0gcHJlT3JkZXJbaV0uZ2V0TGFuZ3VhZ2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGxhbmdzLmxlbmd0aDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgZG9jcy5hZGQocHJlT3JkZXJbaV0uZ2V0TGluayhsYW5nc1tsXSkuZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChEb2N1bWVudFtdKSBkb2NzLnRvQXJyYXkobmV3IERvY3VtZW50W2RvY3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50TG9jYXRvcltdIGdldFJlcXVpcmVkUmVzb3VyY2VzKERvY3VtZW50RmFjdG9yeSBtYXAsIERvY3VtZW50TG9jYXRvciBsb2MpCi0gICAgICAgICAgICB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgYW5jZXN0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBEb2N1bWVudExvY2F0b3IgbG9jYXRvciA9IGxvYzsKLSAgICAgICAgd2hpbGUgKGxvY2F0b3IuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgRG9jdW1lbnRMb2NhdG9yIHBhcmVudCA9IGxvY2F0b3IuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBhbmNlc3RvcnMuYWRkKHBhcmVudCk7Ci0gICAgICAgICAgICBsb2NhdG9yID0gcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRG9jdW1lbnRMb2NhdG9yW10pIGFuY2VzdG9ycy50b0FycmF5KG5ldyBEb2N1bWVudExvY2F0b3JbYW5jZXN0b3JzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTaXRlTm9kZVtdIGdldFJlcXVpcmluZ1Jlc291cmNlcyhEb2N1bWVudEZhY3RvcnkgbWFwLCBTaXRlTm9kZSByZXNvdXJjZSkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgTm9kZVNldCBub2RlcyA9IG5ldyBOb2RlU2V0KHRoaXMubWFuYWdlcik7Ci0gICAgICAgIFNpdGVUcmVlIHRyZWUgPSAoU2l0ZVRyZWUpIHJlc291cmNlLmdldFN0cnVjdHVyZSgpOwotCi0gICAgICAgIFRyZWVOb2RlIG5vZGUgPSAoVHJlZU5vZGUpIHRyZWUuZ2V0Tm9kZShyZXNvdXJjZS5nZXRQYXRoKCkpOwotICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTaXRlTm9kZVtdIHByZU9yZGVyID0gbm9kZS5wcmVPcmRlcigpOwotCi0gICAgICAgICAgICAvLyBleGNsdWRlIG9yaWdpbmFsIHJlc291cmNlIChkb2VzIG5vdCByZXF1aXJlIGl0c2VsZikKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcHJlT3JkZXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUcmVlTm9kZSBkZXNjZW5kYW50ID0gKFRyZWVOb2RlKSBwcmVPcmRlcltpXTsKLSAgICAgICAgICAgICAgICBub2Rlcy5hZGQoZGVzY2VuZGFudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbm9kZXMuZ2V0Tm9kZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2l0ZVN0cnVjdHVyZSBnZXRTaXRlU3RydWN0dXJlKERvY3VtZW50RmFjdG9yeSBtYXAsIFB1YmxpY2F0aW9uIHB1YmxpY2F0aW9uLCBTdHJpbmcgYXJlYSkKLSAgICAgICAgICAgIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUcmVlKHB1YmxpY2F0aW9uLmdldEFyZWEoYXJlYSkpOwotICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZUluTmF2KERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0TGluaygpLmdldE5vZGUoKS5pc1Zpc2libGUoKTsKLSAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlcyhEb2N1bWVudEZhY3RvcnkgbWFwLCBTaXRlTm9kZSBkZXBlbmRpbmcsIFNpdGVOb2RlIHJlcXVpcmVkKQotICAgICAgICAgICAgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGVwZW5kaW5nLmdldFBhdGgoKS5zdGFydHNXaXRoKHJlcXVpcmVkLmdldFBhdGgoKSArICIvIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBwYXRoLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICBpZiAoY29udGFpbnMoZG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2l0ZUV4Y2VwdGlvbigiVGhlIGRvY3VtZW50IFsiICsgZG9jdW1lbnQgKyAiXSBpcyBhbHJlYWR5IGNvbnRhaW5lZCEiKTsKLSAgICAgICAgfQotICAgICAgICBTaXRlVHJlZUltcGwgdHJlZSA9IChTaXRlVHJlZUltcGwpIGdldFRyZWUoZG9jdW1lbnQuYXJlYSgpKTsKLSAgICAgICAgVHJlZU5vZGVJbXBsIG5vZGUgPSAoVHJlZU5vZGVJbXBsKSB0cmVlLmdldE5vZGUocGF0aCk7Ci0gICAgICAgIG5vZGUuc2V0VXVpZChkb2N1bWVudC5nZXRVVUlEKCkpOwotICAgICAgICB0cmVlLmNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlSW5OYXYoRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gdmlzaWJsZUluTmF2KSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2N1bWVudC5nZXRMaW5rKCkuZ2V0Tm9kZSgpLnNldFZpc2libGUodmlzaWJsZUluTmF2KTsKLSAgICAgICAgfSBjYXRjaCAoRG9jdW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvTnVkZ2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdXNlY2FzZXMvTnVkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3OWZiNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL051ZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5TaXRlVHJlZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuRG9jdW1lbnRVc2VjYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuVXNlY2FzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBOdWRnZSBhIGRvY3VtZW50IG9uZSBwb3NpdGlvbiB1cCBvciBkb3duLgotICogCi0gKiBAdmVyc2lvbiAkSWQ6IE51ZGdlLmphdmEgMTc5NTY4IDIwMDUtMDYtMDIgMDk6Mjc6MjZaIGp3a2FsdHogJAotICovCi1wdWJsaWMgY2xhc3MgTnVkZ2UgZXh0ZW5kcyBEb2N1bWVudFVzZWNhc2UgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9BUkVBID0gIm51ZGdlLWVycm9yLWFyZWEiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRElSRUNUSU9OID0gIm51ZGdlLWVycm9yLWRpcmVjdGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9ESVJFQ1RJT05fVU5LTk9XTiA9ICJudWRnZS1lcnJvci1kaXJlY3Rpb24tdW5rbm93biI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9JU0xJVkUgPSAibnVkZ2UtZXJyb3ItaXNsaXZlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJT04gPSAiZGlyZWN0aW9uIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUCA9ICJ1cCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTiA9ICJkb3duIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0KLSAgICAgICAgaWYgKGhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRTb3VyY2VEb2N1bWVudCgpOwotICAgICAgICBTaXRlU3RydWN0dXJlIGxpdmVTaXRlID0gZG9jLmdldFB1YmxpY2F0aW9uKCkuZ2V0QXJlYShQdWJsaWNhdGlvbi5MSVZFX0FSRUEpLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKGxpdmVTaXRlLmNvbnRhaW5zKGRvYy5nZXRQYXRoKCkpKSB7Ci0gICAgICAgICAgICBhZGRFcnJvck1lc3NhZ2UoTUVTU0FHRV9JU0xJVkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHVibGljYXRpb24gcHVibGljYXRpb24gPSBkb2MuZ2V0UHVibGljYXRpb24oKTsKLQotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBTaXRlTWFuYWdlciBzaXRlTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlci5sb29rdXAoU2l0ZU1hbmFnZXIuUk9MRSArICJTZWxlY3RvciIpOwotICAgICAgICAgICAgc2l0ZU1hbmFnZXIgPSAoU2l0ZU1hbmFnZXIpIHNlbGVjdG9yLnNlbGVjdChwdWJsaWNhdGlvbi5nZXRTaXRlTWFuYWdlckhpbnQoKSk7Ci0gICAgICAgICAgICBTaXRlU3RydWN0dXJlIHN0cnVjdHVyZSA9IHNpdGVNYW5hZ2VyLmdldFNpdGVTdHJ1Y3R1cmUoZG9jLmdldEZhY3RvcnkoKSwgcHVibGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGRvYy5nZXRBcmVhKCkpOwotICAgICAgICAgICAgaWYgKHN0cnVjdHVyZSBpbnN0YW5jZW9mIFNpdGVUcmVlKSB7Ci0KLSAgICAgICAgICAgICAgICBTaXRlVHJlZU5vZGUgbm9kZSA9IChTaXRlVHJlZU5vZGUpIGRvYy5nZXRMaW5rKCkuZ2V0Tm9kZSgpOwotICAgICAgICAgICAgICAgIFNpdGVUcmVlTm9kZVtdIHNpYmxpbmdzID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBkaXJlY3Rpb24gPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhESVJFQ1RJT04pOwotICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24uZXF1YWxzKFVQKSkgewotICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncyA9IG5vZGUuZ2V0UHJlY2VkaW5nU2libGluZ3MoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbi5lcXVhbHMoRE9XTikpIHsKLSAgICAgICAgICAgICAgICAgICAgc2libGluZ3MgPSBub2RlLmdldE5leHRTaWJsaW5ncygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZShNRVNTQUdFX0RJUkVDVElPTl9VTktOT1dOLCBuZXcgU3RyaW5nW10geyBkaXJlY3Rpb24gfSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHNpYmxpbmdzICE9IG51bGwgJiYgc2libGluZ3MubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKE1FU1NBR0VfRElSRUNUSU9OKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZShNRVNTQUdFX0FSRUEpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzaXRlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2Uoc2l0ZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICBOb2RlW10gbm9kZXMgPSBuZXcgTm9kZVswXTsKLSAgICAgICAgaWYoZ2V0U291cmNlRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBnZXRTb3VyY2VEb2N1bWVudCgpLmFyZWEoKS5nZXRTaXRlKCkuZ2V0UmVwb3NpdG9yeU5vZGUoKTsKLSAgICAgICAgICAgIG5vZGVzID0gbmV3IE5vZGVbXSB7IG5vZGUgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLQotICAgICAgICBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbiA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UHVibGljYXRpb24oKTsKLSAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgU2l0ZU1hbmFnZXIgc2l0ZU1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzZWxlY3Rvci5zZWxlY3QocHVibGljYXRpb24uZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotICAgICAgICAgICAgU2l0ZVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSBzaXRlTWFuYWdlci5nZXRTaXRlU3RydWN0dXJlKAotICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VEb2N1bWVudCgpLmdldEZhY3RvcnkoKSwgcHVibGljYXRpb24sIGdldFNvdXJjZURvY3VtZW50KCkuZ2V0QXJlYSgpKTsKLSAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUgaW5zdGFuY2VvZiBTaXRlVHJlZSkgewotCi0gICAgICAgICAgICAgICAgU2l0ZVRyZWUgdHJlZSA9IChTaXRlVHJlZSkgc3RydWN0dXJlOwotICAgICAgICAgICAgICAgIFN0cmluZyBkaXJlY3Rpb24gPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhESVJFQ1RJT04pOwotICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24uZXF1YWxzKFVQKSkgewotICAgICAgICAgICAgICAgICAgICB0cmVlLm1vdmVVcChnZXRTb3VyY2VEb2N1bWVudCgpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24uZXF1YWxzKERPV04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyZWUubW92ZURvd24oZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkaXJlY3Rpb24gWyIgKyBkaXJlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG9wZXJhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igc2l0ZSB0cmVlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5yZWxlYXNlKHNpdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL0NvbmN1cnJlbnRNb2RpZmljYXRpb25UZXN0LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL0NvbmN1cnJlbnRNb2RpZmljYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGYzNjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9Db25jdXJyZW50TW9kaWZpY2F0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuaW1wbC5BYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotCi0vKioKLSAqIFRlc3QgZm9yIGJ1ZyA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQyNjAyIj40MjYwMjwvYT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jdXJyZW50TW9kaWZpY2F0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3QgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50TW9kaWZpY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcHViSWQgPSAidGVzdCI7Ci0gICAgICAgIFN0cmluZyBhcmVhID0gImF1dGhvcmluZyI7Ci0gICAgICAgIAotICAgICAgICBTZXNzaW9uIGxlbnlhU2Vzc2lvbiA9IGxvZ2luKCJsZW55YSIpOwotICAgICAgICBEb2N1bWVudEZhY3RvcnkgbGVueWFGYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeShnZXRNYW5hZ2VyKCksIGxlbnlhU2Vzc2lvbik7Ci0gICAgICAgIFB1YmxpY2F0aW9uIGxlbnlhUHViID0gbGVueWFGYWN0b3J5LmdldFB1YmxpY2F0aW9uKHB1YklkKTsKLSAgICAgICAgCi0gICAgICAgIFNpdGVTdHJ1Y3R1cmUgbGVueWFTaXRlID0gbGVueWFQdWIuZ2V0QXJlYShhcmVhKS5nZXRTaXRlKCk7Ci0gICAgICAgIGxlbnlhU2l0ZS5nZXRSZXBvc2l0b3J5Tm9kZSgpLmxvY2soKTsKLSAgICAgICAgCi0gICAgICAgIFNlc3Npb24gYWxpY2VTZXNzaW9uID0gbG9naW4oImFsaWNlIik7Ci0gICAgICAgIERvY3VtZW50RmFjdG9yeSBhbGljZUZhY3RvcnkgPSBEb2N1bWVudFV0aWwuY3JlYXRlRG9jdW1lbnRGYWN0b3J5KGdldE1hbmFnZXIoKSwgYWxpY2VTZXNzaW9uKTsKLSAgICAgICAgUHVibGljYXRpb24gYWxpY2VQdWIgPSBhbGljZUZhY3RvcnkuZ2V0UHVibGljYXRpb24ocHViSWQpOwotICAgICAgICAKLSAgICAgICAgU2l0ZVN0cnVjdHVyZSBhbGljZVNpdGUgPSBhbGljZVB1Yi5nZXRBcmVhKGFyZWEpLmdldFNpdGUoKTsKLSAgICAgICAgYWxpY2VTaXRlLmdldFJlcG9zaXRvcnlOb2RlKCkubG9jaygpOwotICAgICAgICAKLSAgICAgICAgU2l0ZU5vZGUgbGVueWFOb2RlID0gbGVueWFTaXRlLmdldE5vZGVzKClbMV07Ci0gICAgICAgIGxlbnlhTm9kZS5zZXRWaXNpYmxlKCFsZW55YU5vZGUuaXNWaXNpYmxlKCkpOwotICAgICAgICBsZW55YVNlc3Npb24uY29tbWl0KCk7Ci0gICAgICAgIAotICAgICAgICBTaXRlTm9kZSBhbGljZU5vZGUgPSBhbGljZVNpdGUuZ2V0Tm9kZXMoKVsyXTsKLSAgICAgICAgYWxpY2VOb2RlLnNldFZpc2libGUoIWFsaWNlTm9kZS5pc1Zpc2libGUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhbGljZVNlc3Npb24uY29tbWl0KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBleGNlcHRpb24gcmFpc2VkIiwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS90cmVlL0RlZmF1bHRTaXRlVHJlZVRlc3QuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvRGVmYXVsdFNpdGVUcmVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDlmODU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvRGVmYXVsdFNpdGVUcmVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb250YWluZXIuQ29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLmltcGwuQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5EZWZhdWx0U2l0ZVRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS50cmVlLlNpdGVUcmVlTm9kZTsKLQotLyoqCi0gKiBUZXN0IGNsYXNzIGZvciB0aGUgZGVmYXVsdCBzaXRlIHRyZWUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTaXRlVHJlZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc0NvbnRyb2xUZXN0IHsKLQotICAgIHByaXZhdGUgRGVmYXVsdFNpdGVUcmVlIHNpdGVUcmVlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGdldFB1YmxpY2F0aW9uKCJ0ZXN0Iik7Ci0gICAgICAgIHRoaXMuc2l0ZVRyZWUgPSBuZXcgRGVmYXVsdFNpdGVUcmVlKGdldEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBwdWIsCi0gICAgICAgICAgICAgICAgInRlc3QiLAotICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSk7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLnNpdGVUcmVlLCBnZXRMb2dnZXIoKSk7Ci0KLSAgICAgICAgdGhpcy5zaXRlVHJlZS5nZXRSZXBvc2l0b3J5Tm9kZSgpLmxvY2soKTsKLQotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZE5vZGUoIi9mb28iLCAiZm9vLXV1aWQiLCB0cnVlLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2l0ZVRyZWUuYWRkTm9kZSgiL2luZGV4IiwgImluZGV4LXV1aWQiLCB0cnVlLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2l0ZVRyZWUuYWRkTm9kZSgiL2Zvby9iYXIiLCAiZm9vLWJhci11dWlkIiwgdHJ1ZSwgImh0dHA6Ly9leGFjdC5iaXoiLCAic3VmZml4IiwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2l0ZVRyZWUuYWRkTm9kZSgiL2Zvby9sYWxhIiwgImZvby1sYWxhLXV1aWQiLCB0cnVlLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgdGhpcy5zaXRlVHJlZS5nZXRSZXBvc2l0b3J5Tm9kZSgpLnVubG9jaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHZvaWQgRGVmYXVsdFNpdGVUcmVlKFN0cmluZykKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFNpdGVUcmVlU3RyaW5nKCkgewotICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBEZWZhdWx0U2l0ZVRyZWUoKS4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciB2b2lkIERlZmF1bHRTaXRlVHJlZShGaWxlKQotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2l0ZVRyZWVGaWxlKCkgewotICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBEZWZhdWx0U2l0ZVRyZWUoKS4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciB2b2lkIGFkZE5vZGUoU3RyaW5nLCBTdHJpbmcsIExhYmVsW10pCi0gICAgICogCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RBZGROb2RlU3RyaW5nU3RyaW5nTGFiZWxBcnJheSgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHV1aWQgPSAiMTIzNDUiOwotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZE5vZGUoIi9mb28iLCAidHV0b3JpYWwiLCB1dWlkLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zaXRlVHJlZS5hZGRMYWJlbCgiL2ZvbyIsICJlbiIsICJUdXRvcmlhbCIpOwotICAgICAgICBTaXRlTm9kZSBub2RlID0gdGhpcy5zaXRlVHJlZS5nZXROb2RlKCIvZm9vL3R1dG9yaWFsIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobm9kZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhub2RlLmdldE5hbWUoKSwgInR1dG9yaWFsIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhub2RlLmdldFV1aWQoKSwgdXVpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3Igdm9pZCBhZGROb2RlKFNpdGVUcmVlTm9kZSkKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0QWRkTm9kZVNpdGVUcmVlTm9kZSgpIHsKLSAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgYWRkTm9kZSgpLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHZvaWQgYWRkTm9kZShTdHJpbmcsIExhYmVsW10sIFN0cmluZywgU3RyaW5nLCBib29sZWFuKQotICAgICAqIAotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0QWRkTm9kZVN0cmluZ0xhYmVsQXJyYXlTdHJpbmdTdHJpbmdib29sZWFuKCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZE5vZGUoIi9mb28vZGluZyIsICJmb28tZGluZy11dWlkIiwgdHJ1ZSwgbnVsbCwgbnVsbCwgZmFsc2UpOwotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZExhYmVsKCIvZm9vL2RpbmciLCAiZW4iLCAiRG9oIik7Ci0gICAgICAgIHRoaXMuc2l0ZVRyZWUuYWRkTGFiZWwoIi9mb28vZGluZyIsICJkZSIsICJEaW5nIik7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLnNpdGVUcmVlLmdldE5vZGUoIi9mb28vZGluZyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRoaXMuc2l0ZVRyZWUuZ2V0Tm9kZSgiL2Zvby9kaW5nIikuZ2V0TmFtZSgpLCAiZGluZyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHZvaWQgYWRkTm9kZShTdHJpbmcsIFN0cmluZywgTGFiZWxbXSwgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RBZGROb2RlU3RyaW5nU3RyaW5nTGFiZWxBcnJheVN0cmluZ1N0cmluZ2Jvb2xlYW4oKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHV1aWQgPSAiMTIzIjsKLQotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZE5vZGUoIi9mb28iLCAiYmF6IiwgdXVpZCwgdHJ1ZSwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwodGhpcy5zaXRlVHJlZS5nZXROb2RlKCIvZm9vL2JheiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRoaXMuc2l0ZVRyZWUuZ2V0Tm9kZSgiL2Zvby9iYXoiKS5nZXROYW1lKCksICJiYXoiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGFkZExhYmVsCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEFkZExhYmVsKCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZExhYmVsKCIvZm9vL2JhciIsICJlbiIsICJUdXRvcmlhbCIpOwotICAgICAgICBTdHJpbmdbXSBsYWJlbHMgPSAoKFNpdGVUcmVlTm9kZSkgdGhpcy5zaXRlVHJlZS5nZXROb2RlKCIvZm9vL2JhciIpKS5nZXRMYW5ndWFnZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxhYmVscy5sZW5ndGgsIDEpOwotICAgICAgICBMaW5rIGxhYmVsID0gKChTaXRlVHJlZU5vZGUpIHRoaXMuc2l0ZVRyZWUuZ2V0Tm9kZSgiL2Zvby9iYXIiKSkuZ2V0TGluaygiZW4iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChsYWJlbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRMYWJlbCgpLCAiVHV0b3JpYWwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHJlbW92ZUxhYmVsCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdFJlbW92ZUxhYmVsKCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZExhYmVsKCIvZm9vL2JhciIsICJkZSIsICJIZWxsbyIpOwotICAgICAgICBpZiAoIXRoaXMuc2l0ZVRyZWUuZ2V0Tm9kZSgiL2Zvby9iYXIiKS5oYXNMaW5rKCJlbiIpKSB7Ci0gICAgICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZExhYmVsKCIvZm9vL2JhciIsICJlbiIsICJXb3JsZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygoKFNpdGVUcmVlTm9kZSkgdGhpcy5zaXRlVHJlZS5nZXROb2RlKCIvZm9vL2JhciIpKS5nZXRMYW5ndWFnZXMoKS5sZW5ndGgsIDIpOwotCi0gICAgICAgIHRoaXMuc2l0ZVRyZWUucmVtb3ZlTGFiZWwoIi9mb28vYmFyIiwgImRlIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygoKFNpdGVUcmVlTm9kZSkgdGhpcy5zaXRlVHJlZS5nZXROb2RlKCIvZm9vL2JhciIpKS5nZXRMYW5ndWFnZXMoKS5sZW5ndGgsIDEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygoKFNpdGVUcmVlTm9kZSkgdGhpcy5zaXRlVHJlZS5nZXROb2RlKCIvZm9vL2JhciIpKS5nZXRMYW5ndWFnZXMoKVswXSwKLSAgICAgICAgICAgICAgICAiZW4iKTsKLQotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZExhYmVsKCIvZm9vL2JhciIsICJkZSIsICJGb28iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgoU2l0ZVRyZWVOb2RlKSB0aGlzLnNpdGVUcmVlLmdldE5vZGUoIi9mb28vYmFyIikpLmdldExhbmd1YWdlcygpLmxlbmd0aCwgMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCByZW1vdmVOb2RlCi0gICAgICogCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlKCkgdGhyb3dzIFNpdGVFeGNlcHRpb24gewotCi0gICAgICAgIHRoaXMuc2l0ZVRyZWUuYWRkTm9kZSgiL2hpIiwgImhpLXV1aWQiLCB0cnVlLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0KLQotICAgICAgICB0aGlzLnNpdGVUcmVlLmFkZE5vZGUoIi9oaS9obyIsICJoaS1oby11dWlkIiwgdHJ1ZSwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwodGhpcy5zaXRlVHJlZS5nZXROb2RlKCIvaGkvaG8iKSk7Ci0KLSAgICAgICAgdGhpcy5zaXRlVHJlZS5yZW1vdmVOb2RlKCIvaGkiKTsKLQotICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLnNpdGVUcmVlLmNvbnRhaW5zKCIvaGkvaG8iKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHRoaXMuc2l0ZVRyZWUuY29udGFpbnMoIi9oaSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGdldE5vZGUKLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24KLSAgICAgKiAKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9kZSgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLnNpdGVUcmVlLmdldE5vZGUoIi9mb28vYmFyIikpOwotICAgICAgICBhc3NlcnRGYWxzZSh0aGlzLnNpdGVUcmVlLmNvbnRhaW5zKCIvZm9vL2Jhci9iYXoiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBzYXZlCi0gICAgICogCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdFNhdmUoKSB7Ci0gICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHNhdmUoKS4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG1vdmluZyBhIG5vZGUgdXAKLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdE1vdmVVcCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zaXRlVHJlZS5tb3ZlVXAoIi9mb28vbGFsYSIpOwotICAgICAgICB0aGlzLnNpdGVUcmVlLnNhdmUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLnNpdGVUcmVlLmdldE5vZGUoIi9mb28vbGFsYSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG1vdmluZyBhIG5vZGUgZG93bgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0TW92ZURvd24oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc2l0ZVRyZWUubW92ZURvd24oIi9mb28iKTsKLSAgICAgICAgdGhpcy5zaXRlVHJlZS5zYXZlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGhpcy5zaXRlVHJlZS5nZXROb2RlKCIvZm9vIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGltcG9ydCBvZiBhIHN1YnRyZWUKLSAgICAgKiBAdGhyb3dzIFB1YmxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEltcG9ydFN1YnRyZWUoKSB0aHJvd3MgUHVibGljYXRpb25FeGNlcHRpb24sIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBQdWJsaWNhdGlvbiBwdWIgPSBnZXRQdWJsaWNhdGlvbigidGVzdCIpOwotICAgICAgICBEZWZhdWx0U2l0ZVRyZWUgbmV3U2l0ZVRyZWUgPSBuZXcgRGVmYXVsdFNpdGVUcmVlKGdldEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBwdWIsCi0gICAgICAgICAgICAgICAgInRlc3QxIiwKLSAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCksCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkpOwotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcobmV3U2l0ZVRyZWUsIGdldExvZ2dlcigpKTsKLQotICAgICAgICBuZXdTaXRlVHJlZS5nZXRSZXBvc2l0b3J5Tm9kZSgpLmxvY2soKTsKLQotICAgICAgICBuZXdTaXRlVHJlZS5hZGROb2RlKCIvcm9vdCIsICJyb290LXV1aWQiLCB0cnVlLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgIG5ld1NpdGVUcmVlLmFkZExhYmVsKCIvcm9vdCIsICJlbiIsICJyb290Iik7Ci0gICAgICAgIG5ld1NpdGVUcmVlLmFkZE5vZGUoIi9yb290L2ZvbyIsICJyb290LWZvby11dWlkIiwgdHJ1ZSwgbnVsbCwgbnVsbCwgZmFsc2UpOwotICAgICAgICBuZXdTaXRlVHJlZS5hZGRMYWJlbCgiL3Jvb3QvZm9vIiwgImVuIiwgImZvbyIpOwotICAgICAgICBuZXdTaXRlVHJlZS5hZGROb2RlKCIvcm9vdC9zdWJ0cmVlIiwKLSAgICAgICAgICAgICAgICAicm9vdC1zdWJ0cmVlLXV1aWQiLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9leGFjdC5iaXoiLAotICAgICAgICAgICAgICAgICJzdWZmaXgiLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICBuZXdTaXRlVHJlZS5hZGRMYWJlbCgiL3Jvb3Qvc3VidHJlZSIsICJlbiIsICJzdWJ0cmVlIik7Ci0gICAgICAgIG5ld1NpdGVUcmVlLmFkZE5vZGUoIi9yb290L3N1YnRyZWUvY2hpbGQiLAotICAgICAgICAgICAgICAgICJyb290LXN1YnRyZWUtY2hpbGQtdXVpZCIsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBuZXdTaXRlVHJlZS5hZGRMYWJlbCgiL3Jvb3Qvc3VidHJlZS9jaGlsZCIsICJlbiIsICJjaGlsZCIpOwotICAgICAgICBTaXRlVHJlZU5vZGUgbm9kZSA9IChTaXRlVHJlZU5vZGUpIG5ld1NpdGVUcmVlLmdldE5vZGUoIi9yb290L3N1YnRyZWUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChub2RlKTsKLSAgICAgICAgU2l0ZVRyZWVOb2RlIHBhcmVudE5vZGUgPSAoU2l0ZVRyZWVOb2RlKSB0aGlzLnNpdGVUcmVlLmdldE5vZGUoIi9mb28vbGFsYSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudE5vZGUpOwotCi0gICAgICAgIG5ld1NpdGVUcmVlLmdldFJlcG9zaXRvcnlOb2RlKCkudW5sb2NrKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZU5vZGVJbXBsVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvamF2YS90ZXN0L29yZy9hcGFjaGUvbGVueWEvY21zL3NpdGUvdHJlZS9TaXRlVHJlZU5vZGVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGM5ZWZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL2phdmEvdGVzdC9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3RyZWUvU2l0ZVRyZWVOb2RlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5hYy5pbXBsLkFic3RyYWN0QWNjZXNzQ29udHJvbFRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuRGVmYXVsdFNpdGVUcmVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSBzaXRlIHRyZWUKLSAqLwotcHVibGljIGNsYXNzIFNpdGVUcmVlTm9kZUltcGxUZXN0IGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NDb250cm9sVGVzdCB7Ci0KLSAgICBwcml2YXRlIFNpdGVUcmVlTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBEZWZhdWx0U2l0ZVRyZWUgc2l0ZVRyZWUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgUHVibGljYXRpb24gcHViID0gZ2V0UHVibGljYXRpb24oInRlc3QiKTsKLSAgICAgICAgdGhpcy5zaXRlVHJlZSA9IG5ldyBEZWZhdWx0U2l0ZVRyZWUoZ2V0RmFjdG9yeSgpLCBwdWIsICJ0ZXN0QXJlYSIsIGdldE1hbmFnZXIoKSwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICBDb250YWluZXJVdGlsLmVuYWJsZUxvZ2dpbmcoc2l0ZVRyZWUsIGdldExvZ2dlcigpKTsKLSAgICAgICAgCi0gICAgICAgIHNpdGVUcmVlLmdldFJlcG9zaXRvcnlOb2RlKCkubG9jaygpOwotICAgICAgICAKLSAgICAgICAgaWYgKHNpdGVUcmVlLmNvbnRhaW5zKCIvZm9vIikpIHsKLSAgICAgICAgICAgIHNpdGVUcmVlLnJlbW92ZU5vZGUoIi9mb28iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2l0ZVRyZWUuYWRkTm9kZSgiL2ZvbyIsICJmb28tdXVpZCIsIHRydWUsIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgc2l0ZVRyZWUuYWRkTGFiZWwoIi9mb28iLCAiZW4iLCAiRm9vIik7Ci0gICAgICAgIAotICAgICAgICBzaXRlVHJlZS5hZGROb2RlKCIvZm9vL2JhciIsICJmb28tYmFyLXV1aWQiLCB0cnVlLCAiaHR0cDovL2V4YWN0LmJpeiIsICJzdWZmaXgiLCB0cnVlKTsKLSAgICAgICAgc2l0ZVRyZWUuYWRkTGFiZWwoIi9mb28vYmFyIiwgImVuIiwgIkJhciIpOwotICAgICAgICBzaXRlVHJlZS5hZGRMYWJlbCgiL2Zvby9iYXIiLCAiZGUiLCAiU3RhYiIpOwotCi0gICAgICAgIHRoaXMubm9kZSA9IChTaXRlVHJlZU5vZGVJbXBsKSBzaXRlVHJlZS5nZXROb2RlKCIvZm9vL2JhciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIHRoaXMuc2l0ZVRyZWUuZ2V0UmVwb3NpdG9yeU5vZGUoKS51bmxvY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGdldEFic29sdXRlSWQKLSAgICAgKiAKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJzb2x1dGVJZCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRoaXMubm9kZS5nZXRQYXRoKCksICIvZm9vL2JhciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZ2V0SWQKLSAgICAgKiAKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0R2V0SWQoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0aGlzLm5vZGUuZ2V0TmFtZSgpLCAiYmFyIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBnZXRMYWJlbHMKLSAgICAgKiBAdGhyb3dzIFNpdGVFeGNlcHRpb24gCi0gICAgICogCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHZvaWQgdGVzdEdldExhYmVscygpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gdGhpcy5ub2RlLmdldExhbmd1YWdlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGFuZ3VhZ2VzLmxlbmd0aCwgMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBnZXRMYWJlbAotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiAKLSAgICAgKiAKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0R2V0TGFiZWwoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpbmsgbGFiZWwgPSB0aGlzLm5vZGUuZ2V0TGluaygiZW4iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChsYWJlbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRMYWJlbCgpLCAiQmFyIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBhZGRMYWJlbAotICAgICAqIEB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiAKLSAgICAgKiAKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0QWRkTGFiZWwoKSB0aHJvd3MgU2l0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubm9kZS5hZGRMYWJlbCgiaXQiLCAiQmFyb2xvIik7Ci0gICAgICAgIExpbmsgbGFiZWwgPSB0aGlzLm5vZGUuZ2V0TGluaygiaXQiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChsYWJlbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRMYWJlbCgpLCAiQmFyb2xvIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKHRoaXMubm9kZS5oYXNMaW5rKCJjaCIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHJlbW92ZUxhYmVsCi0gICAgICogQHRocm93cyBTaXRlRXhjZXB0aW9uIAotICAgICAqIAotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYWJlbCgpIHRocm93cyBTaXRlRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGlzLm5vZGUuZ2V0TGluaygiZW4iKSk7Ci0gICAgICAgIHRoaXMubm9kZS5yZW1vdmVMYWJlbCgiZW4iKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UodGhpcy5ub2RlLmhhc0xpbmsoImVuIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZ2V0SHJlZgotICAgICAqIAotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RHZXRIcmVmKCkgewotICAgICAgICBhc3NlcnRFcXVhbHModGhpcy5ub2RlLmdldEhyZWYoKSwgImh0dHA6Ly9leGFjdC5iaXoiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGdldFN1ZmZpeAotICAgICAqIAotICAgICAqIAotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHRlc3RHZXRTdWZmaXgoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0aGlzLm5vZGUuZ2V0U3VmZml4KCksICJzdWZmaXgiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGhhc0xpbmsKLSAgICAgKiAKLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB0ZXN0SGFzTGluaygpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0aGlzLm5vZGUuaGFzTGluaygpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmZjdkYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDwhLS0gTnVkZ2UgZG9jdW1lbnQgLS0+DQotICA8bWVzc2FnZSBrZXk9Im51ZGdlLWVycm9yLWRpcmVjdGlvbi11bmtub3duIj5UaGUgZGlyZWN0aW9uIHswfSBpcyBub3Qgc3VwcG9ydGVkITwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0ibnVkZ2UtZXJyb3ItZGlyZWN0aW9uIj5DYW5ub3QgbW92ZSB0aGUgbm9kZSBpbiB0aGlzIGRpcmVjdGlvbi48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Im51ZGdlLWVycm9yLWFyZWEiPlRoaXMgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIGludm9rZWQgb24gc2l0ZSB0cmVlcy48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Im51ZGdlLWVycm9yLWlzbGl2ZSI+Q2Fubm90IG1vdmUgdGhlIG5vZGUgd2hlbiBhIGxhbmd1YWdlIHZlcnNpb24gaXMgcHVibGlzaGVkLjwvbWVzc2FnZT4NCi0gIA0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxMmYzYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDwhLS0gTnVkZ2UgZG9jdW1lbnQgLS0+DQotICA8bWVzc2FnZSBrZXk9Im51ZGdlLWVycm9yLWRpcmVjdGlvbi11bmtub3duIj5EaWUgUmljaHR1bmcgezB9IHdpcmQgbmljaHQgdW50ZXJzdMO8dHp0ITwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0ibnVkZ2UtZXJyb3ItZGlyZWN0aW9uIj5EZXIgS25vdGVuIGthbm4gbmljaHQgaW4gZGllc2UgUmljaHR1bmcgdmVyc2Nob2JlbiB3ZXJkZW4uPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJudWRnZS1lcnJvci1hcmVhIj5EaWUgT3BlcmF0aW9uIGthbm4gbnVyIGF1ZiBTaXRldHJlZXMgYW5nZXdhbmR0IHdlcmRlbi48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Im51ZGdlLWVycm9yLWlzbGl2ZSI+RGVyIEtub3RlbiBrYW5uIG5pY2h0IHZlcnNjaG9iZW4gd2VyZGVuLCB3ZW5uIGVpbmUgU3ByYWNodmVyc2lvbiBwdWJsaXppZXJ0IGlzdC48L21lc3NhZ2U+DQotICANCi08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9lcy54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTJjZGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2kxOG4vY21zdWlfZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotICAkSWQ6IGNtc3VpX2VzLnhtbCA0MTA2MjAgMjAwNi0wNS0zMSAxODoxMDo1NFogdGhvcnN0ZW4gJA0KLQ0KLSAgQHRyYW5zbGF0b3JzDQotCVNhbHZhZG9yIENvYnJlcm8gPHNhbHZhZG9yX2NvYnJlcm9famltZW5leiBhdCBkbXItY29uc3VsdGluZyBkb3QgY29tPg0KLQlEYXZpZCBQaW5lbG8gPGRhdmlkIGRvdCBwaW5lbG8gYXQganVudGFkZWFuZGFsdWNpYSBkb3QgZXM+DQotCVRob3JzdGVuIFNjaGVybGVyIDx0aG9yc3RlbiBhdCBhcGFjaGUgZG90IG9yZz4NCi0gIEouIENheWV0YW5vIERlbGdhZG8gPGpjZGVsZ2FkbyBhdCBpbmdlbmlhIGRvdCBlcz4NCi0NCi0tLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJlcyIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPCEtLSBOdWRnZSBkb2N1bWVudCAtLT4NCi0gIDxtZXNzYWdlIGtleT0ibnVkZ2UtZXJyb3ItZGlyZWN0aW9uLXVua25vd24iPkxhIGRpcmVjY2nDs24gezB9IG5vIGVzdMOhIHNvcG9ydGFkYSE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Im51ZGdlLWVycm9yLWRpcmVjdGlvbiI+Tm8gcHVlZG8gbW92ZXIgZWwgbm9kbyBlbiBlc3RhIGRpcmVjY2nDs24uPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJudWRnZS1lcnJvci1hcmVhIj5Fc3RhIG9wZXJhY2nDs24gc29sbyBwdWVkZSBzZXIgbGxhbWFkYSBlbiBsb3Mgw6FyYm9sZXMgZGVsIHNpdGlvLjwvbWVzc2FnZT4NCi0NCi08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9mci54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9mci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwN2YwZmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2kxOG4vY21zdWlfZnIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSANCi0JJElkOiBjbXN1aV9mci54bWwgMzcwMTA2IDIwMDYtMDEtMTggMTA6MTc6MzZaIGVkaXRoICQgDQotCUB0cmFuc2xhdG9ycyBPbGl2aWVyIExhbmdlIDx3aXJlIGF0IHBldGl0LWF0ZWxpZXIgZG90IGNoPg0KLQktLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJmciIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPCEtLSBOdWRnZSBkb2N1bWVudCAtLT4NCi0gIDxtZXNzYWdlIGtleT0ibnVkZ2UtZXJyb3ItZGlyZWN0aW9uLXVua25vd24iPkxhIGRpcmVjdGlvbiB7MH0gbidlc3QgcGFzIHNvdXRlbnVlITwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0ibnVkZ2UtZXJyb3ItZGlyZWN0aW9uIj5MZSBub3V5YXUgbmUgcGV1dCBwYXMgJiMyMzQ7dHJlIGTDqXBsYWPDqSBkYW5zIGNldHRlIGRpcmVjdGlvbi48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Im51ZGdlLWVycm9yLWFyZWEiPkNldHRlIG9ww6lyYXRpb24gbmUgcGV1dCAmIzIzNDt0cmUgaW52b3F1w6llIHF1ZSBzdXIgdW5lIGFyYm9yZXNjZW5jZSBkdSBzaXRlIChTaXRlIHRyZWUpLjwvbWVzc2FnZT4NCi0NCi08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaWNvbnMvZGVmYXVsdC5naWYgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaWNvbnMvZGVmYXVsdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMmYxZjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2ljb25zL2RlZmF1bHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2ljb25zL2ZvbGRlci1jbG9zZWQuZ2lmIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2ljb25zL2ZvbGRlci1jbG9zZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JhNGIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9pY29ucy9mb2xkZXItY2xvc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9pY29ucy9mb2xkZXIuZ2lmIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2ljb25zL2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTQzYjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2ljb25zL2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvamF2YXNjcmlwdC9sZW55YXRyZWUuanMgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvamF2YXNjcmlwdC9sZW55YXRyZWUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGRjZmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2phdmFzY3JpcHQvbGVueWF0cmVlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi0vKgotICBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtdXN0IGJlIHNldDoKLSAgV0VCQVBQX0JBU0VfUEFUSCAtIHBhdGggdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiByb290LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIHNsYXNoCi0gIEFSRUFfQkFTRV9QQVRIIC0gcGF0aCB0byB0aGUgYXJlYSByb290LCB3aXRob3V0IHRoZSB0cmFpbGluZyBzbGFzaAotICBQVUJMSUNBVElPTl9JRAotICBQSVBFTElORV9QQVRICi0gIElNQUdFX1BBVEgKLSAgU0hPV19MT0FESU5HX0hJTlQgKG9wdGlvbmFsKQotICBTSE9XX0lDT05TIChvcHRpb25hbCkKLSovCi0gIAotdmFyIHhtbGh0dHA7Ci12YXIgU0hPV19MT0FESU5HX0hJTlQgPSBmYWxzZTsKLXZhciBTSE9XX0lDT05TID0gdHJ1ZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIExlbnlhTm9kZSAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWZ1bmN0aW9uIExlbnlhTm9kZShpZCwgcGFyZW50KSB7Ci0gICAgdGhpcy5pZCA9IGlkOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIHRoaXMuaXRlbXMgPSB7fTsKLSAgICB0aGlzLmlzZm9sZGVyID0gZmFsc2U7Ci0gICAgdGhpcy5sYWJlbCA9ICcnOwotfTsKLQotTGVueWFOb2RlLnByb3RvdHlwZSA9IG5ldyBOb2RlOwotCi1MZW55YU5vZGUucHJvdG90eXBlLmFkZEl0ZW1zID0gZnVuY3Rpb24oaXRlbXMpIHsKLSAgICB0aGlzLml0ZW1zID0ge307Ci0gICAgdGhpcy5pdGVtaWRzID0gW107Ci0gICAgZm9yICh2YXIgaSA9IGl0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgIHRoaXMuaXRlbXNbaXRlbS5pZF0gPSBpdGVtOwotICAgICAgICB0aGlzLml0ZW1pZHMudW5zaGlmdChpdGVtLmlkKTsKLSAgICB9OwotfTsKLQotTGVueWFOb2RlLnByb3RvdHlwZS5pc0NvbGxlY3Rpb24gPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5pc2ZvbGRlcjsKLX07Ci0KLUxlbnlhTm9kZS5wcm90b3R5cGUuZ2V0U3R5bGUgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy50cmVlLnJvb3QgPT0gdGhpcykgewotICAgICAgICByZXR1cm4gJ2xlbnlhLWluZm8tcm9vdCc7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICd0cmVlbm9kZV9sYWJlbCc7Ci0gICAgfQotfQotCi1MZW55YU5vZGUucHJvdG90eXBlLmxvYWRTdWJUcmVlID0gZnVuY3Rpb24oaGFuZGxlcikgewotICAgIC8vIGRpc3BsYXkgYSAnbG9hZGluZycgdGhhdCB0aGUgdHJlZSBpcyBiZWluZyBsb2FkZWQKLSAgICBpZiAoU0hPV19MT0FESU5HX0hJTlQpIHsKLSAgICAgICAgdmFyIGRpdiA9IHRoaXMudHJlZS5kb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gICAgICAgIHZhciB0ZXh0ID0gdGhpcy50cmVlLmRvYy5jcmVhdGVUZXh0Tm9kZSgnbG9hZGluZy4uLicpOwotICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGV4dCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5sYXN0Q2hpbGQuYXBwZW5kQ2hpbGQoZGl2KTsKLSAgICB9Ci0gICAgdmFyIHVybCA9IHRoaXMuZ2V0TG9hZFN1YlRyZWVVUkwoKTsKLSAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoeG1sLCBpdGVtKSB7Ci0gICAgICAgIGl0ZW0uc3ViVHJlZUxvYWRlZCh4bWwpOwotICAgIH0KLSAgICBsb2FkQXN5bmNYTUwodXJsLCBjYWxsYmFjaywgdGhpcyk7Ci19Ci0KLUxlbnlhTm9kZS5wcm90b3R5cGUuZ2V0TG9hZFN1YlRyZWVVUkwgPSBmdW5jdGlvbigpIHsKLSAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aCgpOwotICAgIHJldHVybiBlbmNvZGVVUkkoQVJFQV9CQVNFX1BBVEggKyBQSVBFTElORV9QQVRIICsgJz9wYXRoPScrcGF0aCsnJmxlbnlhLm1vZHVsZT1zaXRldHJlZScpOwotfQotCi0KLUxlbnlhTm9kZS5wcm90b3R5cGUuc3ViVHJlZUxvYWRlZCA9IGZ1bmN0aW9uKHhtbCkgewotICAgIC8vIHJlbW92ZSB0aGUgJ2xvYWRpbmcnIGhpbnQKLSAgICBpZiAoU0hPV19MT0FESU5HX0hJTlQpIHsKLSAgICAgICAgdmFyIHRkID0gdGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmxhc3RDaGlsZDsKLSAgICAgICAgdGQucmVtb3ZlQ2hpbGQodGQubGFzdENoaWxkKTsKLSAgICB9Ci0gICAgCi0gICAgdmFyIHJvb3QgPSB4bWwuZG9jdW1lbnRFbGVtZW50OwotCi0gICAgdmFyIGNoaWxkcmVuID0gcm9vdC5jaGlsZE5vZGVzOwotICAgIHZhciBpdGVtcz1bXTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmICh0aGlzLmNhbkFjY2VwdE5vZGUoY2hpbGRyZW5baV0pKSB7Ci0gICAgICAgICAgICBpdGVtcy5wdXNoKHRoaXMuY3JlYXRlTmV3Tm9kZShjaGlsZHJlbltpXSkpOwotICAgICAgICB9IAotICAgIH0KLSAgICAvL2hhbmRsZXIoaXRlbXMpOwotICAgIHRoaXMuX2NvbnRpbnVlT3BlbihpdGVtcyk7Ci19Ci0KLUxlbnlhTm9kZS5wcm90b3R5cGUuY2FuQWNjZXB0Tm9kZSA9IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICBpZiAoZ2V0VGFnTmFtZShpdGVtKSA9PSAibmF2Om5vZGUiKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUxlbnlhTm9kZS5wcm90b3R5cGUuYWRkTm9kZXNSZWMgPSBmdW5jdGlvbihwYXJlbnROb2RlKSB7Ci0gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzOwotICAgIHZhciBpdGVtcyA9IFtdOwotICAgIHZhciBub2RlcyA9IFtdOwotICAgIHZhciBpdGVtOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICBpZiAodGhpcy5jYW5BY2NlcHROb2RlKGNoaWxkcmVuW2ldKSkgewotICAgICAgICAgIHRoaXMucmVvcGVuID0gdHJ1ZTsgLy8gdGhpcyBjYXVzZXMgdGhlIHBhcmVudCB0byB1bmZvbGQKLSAgICAgICAgICBpdGVtID0gdGhpcy5jcmVhdGVOZXdOb2RlKGNoaWxkcmVuW2ldKTsKLSAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pOwotICAgICAgICAgIGl0ZW0uYWRkTm9kZXNSZWMoY2hpbGRyZW5baV0pOyAKLSAgICAgICB9IAotICAgIH0KLSAgICB0aGlzLmFkZEl0ZW1zKGl0ZW1zKTsKLX0KLQotTGVueWFOb2RlLnByb3RvdHlwZS5jcmVhdGVOZXdOb2RlID0gZnVuY3Rpb24obm9kZSkgewotICAgIHZhciBuZXdJdGVtID0gbmV3IExlbnlhTm9kZShub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSwgdGhpcyk7Ci0gICAgbmV3SXRlbS5pbml0KCk7Ci0gICAgdmFyIGlzZm9sZGVyID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2ZvbGRlcicpID09J3RydWUnID8gdHJ1ZSA6IGZhbHNlOwotICAgIG5ld0l0ZW0uaXNmb2xkZXIgPSBpc2ZvbGRlcjsKLSAgICByZXR1cm4gbmV3SXRlbTsKLX0KLQotLy93b3JrYXJvdW5kIGZvciBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1MjI3Ci1mdW5jdGlvbiBnZXRUYWdOYW1lKGVsZW1lbnQpIHsKLSAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZTsKLSAgICB2YXIgcHJlZml4ID0gZWxlbWVudC5wcmVmaXg7Ci0KLSAgICBpZih0YWdOYW1lLmluZGV4T2YocHJlZml4ICsgJzonKSA9PSAtMSkgewotICAgICAgICB0YWdOYW1lID0gcHJlZml4ICsgJzonICsgdGFnTmFtZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRhZ05hbWU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIExlbnlhVHJlZSAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi1mdW5jdGlvbiBMZW55YVRyZWUoZG9jLCB0cmVlRWxlbWVudCkgewotICAgIHRoaXMuZG9jID0gZG9jOwotICAgIHRoaXMudHJlZUVsZW1lbnQgPSB0cmVlRWxlbWVudDsKLSAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDsKLX07Ci0KLUxlbnlhVHJlZS5wcm90b3R5cGUgPSBuZXcgVHJlZTsKLQotTGVueWFUcmVlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oaWQpIHsKLSAgICB0aGlzLnJvb3QgPSBuZXcgTGVueWFOb2RlKGlkKTsKLSAgICB0aGlzLnJvb3QudHJlZSA9IHRoaXM7Ci0gICAgdGhpcy5yb290LmRlcHRoID0gMDsKLSAgICB0aGlzLnJvb3QucmVvcGVuID0gZmFsc2U7Ci0gICAgdGhpcy5yb290LmlzZm9sZGVyID0gdHJ1ZTsKLSAgICB0aGlzLl9jdXJyZW50SWQgPSAwOwotfTsKLQotTGVueWFUcmVlLnByb3RvdHlwZS5nZXRJdGVtcyA9IGZ1bmN0aW9uKGl0ZW0sIGhhbmRsZXIsIGFsbG93X2NhY2hlKSB7Ci0gICAgaWYgKGl0ZW0udHJlZS5yb290ID09IGl0ZW0pIHsKLSAgICAgICAgYWxlcnQoJ2dldFR0ZW1zKCkgb2Ygcm9vdCBjYWxsZWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGxvYWRJbml0aWFsVHJlZSBzaG91bGQgYmUgY2FsbGVkIGZpcnN0LicpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZW0ubG9hZFN1YlRyZWUoaGFuZGxlcik7Ci0gICAgfQotfTsKLQotTGVueWFUcmVlLnByb3RvdHlwZS5sb2FkSW5pdGlhbFRyZWUgPSBmdW5jdGlvbihwYXRoKSB7Ci0gICAgdmFyIHVybCA9IHRoaXMuZ2V0TG9hZEluaXRpYWxUcmVlVVJMKHBhdGgpOwotICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oZnJhZ21lbnQsIHBhcmFtKSB7Ci0gICAgICAgIHZhciB0cmVlID0gcGFyYW1bMF07Ci0gICAgICAgIHZhciBwYXRoID0gcGFyYW1bMV07Ci0gICAgICAgIHRyZWUuaW5pdGlhbFRyZWVMb2FkZWQoZnJhZ21lbnQpOwotICAgICAgICB2YXIgc2VsZWN0ZWRJdGVtID0gdHJlZS5nZXRJdGVtQnlQYXRoKHBhdGgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtICE9IGZhbHNlKSB7Ci0gICAgICAgICAgICB0cmVlLnNlbGVjdChzZWxlY3RlZEl0ZW0pOwotICAgICAgICB9Ci0gICAgfQotICAgIHZhciBwYXJhbSA9IG5ldyBBcnJheSh0aGlzLCBwYXRoKTsKLSAgICBsb2FkQXN5bmNYTUwodXJsLCBjYWxsYmFjaywgcGFyYW0pOwotfTsKLQotTGVueWFUcmVlLnByb3RvdHlwZS5nZXRMb2FkSW5pdGlhbFRyZWVVUkwgPSBmdW5jdGlvbihwYXRoKSB7Ci0gICAgcmV0dXJuIGVuY29kZVVSSShBUkVBX0JBU0VfUEFUSCArIFBJUEVMSU5FX1BBVEggKyAnP3BhdGg9JytwYXRoKycmbGVueWEubW9kdWxlPXNpdGV0cmVlJyk7Ci19Ci0KLUxlbnlhVHJlZS5wcm90b3R5cGUuaW5pdGlhbFRyZWVMb2FkZWQgPSBmdW5jdGlvbih4bWwpIHsKLSAgICB2YXIgcm9vdCA9IHhtbC5kb2N1bWVudEVsZW1lbnQ7Ci0gICAgdmFyIGNoaWxkcmVuID0gcm9vdC5jaGlsZE5vZGVzOwotICAgIHZhciBpdGVtcz1bXTsKLSAgICB2YXIgaXRlbTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmICh0aGlzLmNhbkFjY2VwdE5vZGUoY2hpbGRyZW5baV0pKSB7Ci0gICAgICAgICAgICBpdGVtID0gdGhpcy5jcmVhdGVOZXdOb2RlKGNoaWxkcmVuW2ldKTsKLSAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7Ci0gICAgICAgICAgICAvL2l0ZW0uYWRkTm9kZXNSZWMoY2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIHRoaXMucm9vdC5hZGRJdGVtcyhpdGVtcyk7Ci0gICAgdGhpcy5yb290Lm9wZW4oKTsKLX0KLQotTGVueWFUcmVlLnByb3RvdHlwZS5jYW5BY2NlcHROb2RlID0gZnVuY3Rpb24oaXRlbSkgewotICAgIGlmIChnZXRUYWdOYW1lKGl0ZW0pID09ICJuYXY6c2l0ZSIpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotTGVueWFUcmVlLnByb3RvdHlwZS5jcmVhdGVOZXdOb2RlID0gZnVuY3Rpb24obm9kZSkgewotICAgIHZhciBuZXdJdGVtID0gbmV3IExlbnlhTm9kZShub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSwgdGhpcy5yb290KTsKLSAgICBuZXdJdGVtLmluaXQoKTsKLSAgICByZXR1cm4gbmV3SXRlbTsKLX0KLQotLyogTGVueWFUcmVlLnByb3RvdHlwZS5nZXRJY29uID0gZnVuY3Rpb24oaXRlbSkgewotICAgIC8vIGRvbid0IHVzZSBhbiBpY29uIGZvciByb290IGFuZCBhcmVhIG5vZGVzCi0gICAgaWYgKGl0ZW0uZGVwdGg8MikgcmV0dXJuIHRoaXMuZG9jLmNyZWF0ZVRleHROb2RlKCcnKTsKLQotICAgIHZhciBpbWcgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLSAgICBpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBJTUFHRV9QQVRIICsgJ2RvY3VtZW50LmdpZicpOwotICAgIHJldHVybiBpbWc7Ci19OyAqLwotCi0vKiByZXR1cm4gYW4gaW1nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGZpbGUgdHlwZSAqLwotTGVueWFUcmVlLnByb3RvdHlwZS5nZXRJY29uID0gZnVuY3Rpb24oaXRlbSkgewotCi0gICAgaWYgKFNIT1dfSUNPTlMpIHsKLSAgICAgICAgdmFyIHN0ZXBzID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIHN0ZXBzID0gaXRlbS5nZXRQYXRoKCkuc3BsaXQoJy8nKTsKLSAgICAgICAgaWYgKHN0ZXBzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZSgnJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB2YXIgaHJlZjsKLSAgICAgICAgICAgIGlmIChzdGVwcy5sZW5ndGggPCA0KSB7Ci0gICAgICAgICAgICAgICAgaHJlZiA9IEFSRUFfQkFTRV9QQVRIICsgIi9mb2xkZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihpdGVtLmhyZWYgPT0gIiIpIHsKLSAgICAgICAgICAgICAgICBocmVmID0gQVJFQV9CQVNFX1BBVEggKyAiL2RlZmF1bHQiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaHJlZiA9IGl0ZW0uaHJlZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBpbWcgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLSAgICAgICAgICAgIHZhciBsYW5ndWFnZSA9IENIT1NFTl9MQU5HVUFHRTsKLSAgICAgICAgICAgIGltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGhyZWYgKyAnLmdpZj9sZW55YS5tb2R1bGU9c2l0ZXRyZWUnKTsKLSAgICAgICAgICAgIGltZy5zZXRBdHRyaWJ1dGUoJ2FsdCcsICcnKTsKLSAgICAgICAgICAgIHJldHVybiBpbWc7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUoJycpOwotICAgIH0KLX07Ci0KLS8qIGNyZWF0ZXMgdGhlIGl0ZW0gbmFtZSBhbmQgYW55IGljb25zIGFuZCBzdWNoICovCi1MZW55YVRyZWUucHJvdG90eXBlLmNyZWF0ZUl0ZW1MaW5lID0gZnVuY3Rpb24oaXRlbSkgewotICAgIHZhciBkaXYgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgICB2YXIgc3BhbiA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLSAgICB2YXIgaWNvbiA9IHRoaXMuZ2V0SWNvbihpdGVtKTsKLSAgICBpZiAoaWNvbi5ub2RlVHlwZSA9PSAxKSB7Ci0gICAgICAgIGljb24uY2xhc3NOYW1lID0gJ3RyZWVub2RlX2ljb24nOwotICAgIH07Ci0gICAgZGl2LmFwcGVuZENoaWxkKGljb24pOwotICAgIAotICAgIHZhciB0ZXh0ID0gdGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUoaXRlbS5sYWJlbCA/IGl0ZW0ubGFiZWwgOiBpdGVtLmlkKTsKLSAgICAKLSAgICBzcGFuLmNsYXNzTmFtZSA9IGl0ZW0uZ2V0U3R5bGUoKTsKLSAgICAKLSAgICBzcGFuLmFwcGVuZENoaWxkKHRleHQpOwotICAgIGRpdi5hcHBlbmRDaGlsZChzcGFuKTsKLSAgICAKLSAgICByZXR1cm4gZGl2OwotfTsKLQotTGVueWFUcmVlLnByb3RvdHlwZS5jcmVhdGVJdGVtSHRtbCA9IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICB2YXIgZGl2ID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gICAgZGl2LmNsYXNzTmFtZSA9ICd0cmVlbm9kZSc7Ci0KLSAgICAvLyBwbGFjZSBhIHJlZmVyZW5jZSB0byB0aGUgaXRlbSBvbiB0aGUgZGl2Ci0gICAgZGl2LnRyZWVpdGVtID0gaXRlbTsKLSAgICAKLSAgICB2YXIgdGFibGUgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCd0YWJsZScpOwotICAgIGRpdi5hcHBlbmRDaGlsZCh0YWJsZSk7Ci0gICAgdmFyIHRib2R5ID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgndGJvZHknKTsKLSAgICB0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7Ci0gICAgdmFyIHRyID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgndHInKTsKLSAgICB0Ym9keS5hcHBlbmRDaGlsZCh0cik7Ci0KLSAgICAvLyBhZGQgdGhlIGxpbmVzOgotICAgIHRoaXMuYWRkTGluZXMoaXRlbSwgdHIpOwotCi0gICAgLy8gYWRkIHRoZSBvcGVuc2lnbgotICAgIHZhciB0ZDEgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCd0ZCcpOwotICAgIHRyLmFwcGVuZENoaWxkKHRkMSk7Ci0gICAgaXRlbS5vcGVuc2lnbiA9IHRoaXMuZ2V0Q2xvc2VTaWduKGl0ZW0pOwotICAgIGl0ZW0ub3BlbnNpZ24uY2xhc3NOYW1lID0gJ3RyZWVub2RlX3NpZ24nOwotCi0gICAgaWYgKHRoaXMuZ2V0U2lnblR5cGUoaXRlbSkgPT0gJ1QnKSB7Ci0gICAgICAgIC8vIGlmIHRoZSBsYWJlbCBvZiB0aGlzIGl0ZW0gaXMgdG9vIGxvbmcgdGhlIGxpbmUgd2lsbCB3cmFwCi0gICAgICAgIC8vIGJ5IHNldHRpbmcgdGhlIGJhY2tncm91bmQgaW1hZ2Ugd2UgZ2V0IGEgY29udGludW9zIGxpbmUKLSAgICAgICAgdGQxLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoJytJTUFHRV9QQVRIKyd2ZXJ0aWNhbC1saW5lLmdpZiknOwotICAgIH0KLQotICAgIHRkMS5hcHBlbmRDaGlsZChpdGVtLm9wZW5zaWduKTsKLQotICAgIC8vIGFkZCB0aGUgbGFiZWwKLSAgICB2YXIgdGQyID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgndGQnKTsKLSAgICB0ci5hcHBlbmRDaGlsZCh0ZDIpOwotICAgIHRkMi5jbGFzc05hbWUgPSAnbGVueWEtaW5mby1sYWJlbC10ZCc7Ci0gICAgdmFyIGxpbmUgPSB0aGlzLmNyZWF0ZUl0ZW1MaW5lKGl0ZW0pOwotICAgIHRkMi5hcHBlbmRDaGlsZChsaW5lKTsKLQotICAgIGFkZEV2ZW50SGFuZGxlcihsaW5lLCAnY2xpY2snLCB0aGlzLmhhbmRsZUl0ZW1DbGljaywgdGhpcywgaXRlbSk7Ci0gICAgYWRkRXZlbnRIYW5kbGVyKGl0ZW0ub3BlbnNpZ24sICdjbGljaycsIHRoaXMuaGFuZGxlSXRlbVNpZ25DbGljaywgCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIGl0ZW0pOwotICAgIGlmICh0aGlzLnNlbGVjdGVkID09IGl0ZW0uZ2V0UGF0aCgpKSB7Ci0gICAgICAgIHRoaXMudW5zZWxlY3QoKTsKLSAgICAgICAgdGhpcy5zZWxlY3QoaXRlbSk7Ci0gICAgICAgIGRpdi5jbGFzc05hbWUgPSAnc2VsZWN0ZWRfbm9kZSc7Ci0gICAgfTsKLQotICAgIHJldHVybiBkaXY7Ci19OwotCi0vKiBkZWNpZGUgaWYgdGhlIFsrXSBvciBbLV0gc2lnbiBpcyAnTCcgb3IgJ3wtJyB0eXBlICovCi1MZW55YVRyZWUucHJvdG90eXBlLmdldFNpZ25UeXBlID0gZnVuY3Rpb24oaXRlbSkgewotICAgIGlmIChpdGVtLnRyZWUucm9vdCAhPSBpdGVtKSB7Ci0gICAgICAgIGlmIChpc0xhc3RDaGlsZChpdGVtLnBhcmVudCwgaXRlbSkpIHsKLSAgICAgICAgICAgIHJldHVybiAnTCc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gJ1QnOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAnWCc7ICAvLyBpbnZhbGlkIHR5cGUKLX07Ci0KLS8qIGdldCB0aGUgWytdIHNpZ24gZm9yIGEgY29sbGVjdGlvbiBvciByZXNvdXJjZSAqLwotTGVueWFUcmVlLnByb3RvdHlwZS5nZXRDbG9zZVNpZ24gPSBmdW5jdGlvbihpdGVtKSB7Ci0gICAgdmFyIG9wZW5zaWduID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0gICAgb3BlbnNpZ24uY2xhc3NOYW1lID0gJ3RyZWVub2RlX3NpZ24nOwotICAgIAotICAgIGlmIChpdGVtLnRyZWUucm9vdCA9PSBpdGVtKSB7Ci0gICAgICAgIC8vIHRoZSByb290IG5lZWRzIG5vIG9wZW5zaWduCi0gICAgICAgIG9wZW5zaWduLnNldEF0dHJpYnV0ZSgnc3JjJywgSU1BR0VfUEFUSCsnZW1wdHkuZ2lmJyk7Ci0gICAgICAgIG9wZW5zaWduLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMCcpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhciBzdWZmaXggPSB0aGlzLmdldFNpZ25UeXBlKGl0ZW0pOwotICAgICAgICBpZiAoaXRlbS5pc0NvbGxlY3Rpb24oKSkgewotICAgICAgICAgICAgb3BlbnNpZ24uc2V0QXR0cmlidXRlKCdzcmMnLCBJTUFHRV9QQVRIKydjbG9zZWQtY29sbGVjdGlvbi0nK3N1ZmZpeCsnLmdpZicpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BlbnNpZ24uc2V0QXR0cmlidXRlKCdzcmMnLCBJTUFHRV9QQVRIKydub24tY29sbGVjdGlvbi0nK3N1ZmZpeCsnLmdpZicpOwotICAgICAgICB9OwotICAgIH0KLSAgICByZXR1cm4gb3BlbnNpZ247Ci19OwotCi0vKiBnZXQgdGhlIFstXSBzaWduIGZvciBhIGNvbGxlY3Rpb24gKi8KLUxlbnlhVHJlZS5wcm90b3R5cGUuZ2V0T3BlblNpZ24gPSBmdW5jdGlvbihpdGVtKSB7Ci0gICAgdmFyIG9wZW5zaWduID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0gICAgb3BlbnNpZ24uY2xhc3NOYW1lID0gJ3RyZWVub2RlX3NpZ24nOwotCi0gICAgaWYgKGl0ZW0udHJlZS5yb290ID09IGl0ZW0pIHsKLSAgICAgICAgLy8gdGhlIHJvb3QgbmVlZHMgbm8gb3BlbnNpZ24KLSAgICAgICAgb3BlbnNpZ24uc2V0QXR0cmlidXRlKCdzcmMnLCBJTUFHRV9QQVRIKydlbXB0eS5naWYnKTsKLSAgICAgICAgb3BlbnNpZ24uc2V0QXR0cmlidXRlKCd3aWR0aCcsICcwJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFyIHN1ZmZpeCA9IHRoaXMuZ2V0U2lnblR5cGUoaXRlbSk7Ci0gICAgICAgIG9wZW5zaWduLnNldEF0dHJpYnV0ZSgnc3JjJywgSU1BR0VfUEFUSCsnb3BlbmVkLWNvbGxlY3Rpb24tJytzdWZmaXgrJy5naWYnKTsKLSAgICB9Ci0gICAgcmV0dXJuIG9wZW5zaWduOwotfTsKLQotLyogYWRkIHRoZSBsaW5lcyBvZiBhbiBpdGVtICh0aGUgZWRnZXMgb2YgdGhlIHRyZWUpICovCi1MZW55YVRyZWUucHJvdG90eXBlLmFkZExpbmVzID0gZnVuY3Rpb24oaXRlbSwgcGFyZW50RWxlbWVudCkgewotICAgIHZhciBsaW5lc1N0ciA9IHRoaXMuY29tcHV0ZUxpbmVzU3RyaW5nKGl0ZW0pOwotICAgIC8vIGxpbmVzU3RyIGlzIGluIHRoZSByZXZlcnNlIG9yZGVyCi0gICAgZm9yICh2YXIgaT1saW5lc1N0ci5sZW5ndGgtMTsgaT4wOyBpLS0pIHsKLSAgICAgICAgdmFyIHRkID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgndGQnKTsKLSAgICAgICAgdmFyIGltZyA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotICAgICAgICAKLSAgICAgICAgdmFyIGltYWdlTmFtZSA9ICcnOwotICAgICAgICBpZiAobGluZXNTdHIuY2hhckF0KGkpPT0nSScpIHsKLSAgICAgICAgICAgIGltYWdlTmFtZSA9ICd2ZXJ0aWNhbC1saW5lLmdpZic7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgbGFiZWwgb2YgdGhpcyBpdGVtIGlzIHRvbyBsb25nIHRoZSBsaW5lIHdpbGwgd3JhcAotICAgICAgICAgICAgLy8gYnkgc2V0dGluZyB0aGUgYmFja2dyb3VuZCBpbWFnZSB3ZSBnZXQgYSBjb250aW51b3MgbGluZQotICAgICAgICAgICAgdGQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3VybCgnK0lNQUdFX1BBVEgrJ3ZlcnRpY2FsLWxpbmUuZ2lmKSc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbWFnZU5hbWUgPSAnZW1wdHkuZ2lmJzsKLSAgICAgICAgfQotICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBJTUFHRV9QQVRIK2ltYWdlTmFtZSk7Ci0gICAgICAgIGltZy5jbGFzc05hbWUgPSAndHJlZW5vZGVfc2lnbic7Ci0KLSAgICAgICAgdGQuYXBwZW5kQ2hpbGQoaW1nKTsKLSAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0ZCk7Ci0gICAgfQotfQotCi0vKiBjb21wdXRlcyB0aGUgbGluZXMgb2YgYW4gaXRlbSBhcyBhIHN0cmluZyAodGhlIGVkZ2VzIG9mIHRoZSB0cmVlKQotICAgICBFOiAnICcgZW1wdHkKLSAgICAgSTogJ3wnIHZlcnRpY2FsIGxpbmUKLSAgICAgTDogJ0wnIAotICAgICBUOiAnfC0nCi0qLwotTGVueWFUcmVlLnByb3RvdHlwZS5jb21wdXRlTGluZXNTdHJpbmcgPSBmdW5jdGlvbihpdGVtKSB7Ci0gICAgdmFyIGxpbmVzID0gJycKLSAgICAKLSAgICBpZiAoaXRlbS50cmVlLnJvb3QgPT0gaXRlbSkgcmV0dXJuIGxpbmVzOwotICAgIAotICAgIC8vIGZpcnN0IGxldmVsLCBkZWNpZGUgVCBvciBMCi0gICAgaWYgKGlzTGFzdENoaWxkKGl0ZW0ucGFyZW50LCBpdGVtKSkgewotICAgICAgICBsaW5lcyArPSAnTCc7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbGluZXMgKz0gJ1QnOwotICAgIH0KLSAgICBpdGVtID0gaXRlbS5wYXJlbnQ7Ci0KLSAgICAvLyBzdWJzZXF1ZW50IGxldmVscywgZGVjaWRlIEkgb3IgRQotICAgIHdoaWxlIChpdGVtLnRyZWUucm9vdCAhPSBpdGVtKSB7Ci0gICAgICAgIGlmIChpc0xhc3RDaGlsZChpdGVtLnBhcmVudCwgaXRlbSkpIHsKLSAgICAgICAgICAgIGxpbmVzICs9ICdFJzsgLy8gZW1wdHkKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmVzICs9ICdJJzsgLy8gdmVydGljYWwgbGluZQotICAgICAgICB9Ci0gICAgICAgIGl0ZW0gPSBpdGVtLnBhcmVudDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGxpbmVzOwotfQotCi1MZW55YVRyZWUucHJvdG90eXBlLmhhbmRsZUl0ZW1DbGljayA9IGZ1bmN0aW9uKGl0ZW0sIGV2ZW50KSB7Ci0gICAgYWxlcnQoJ3lvdSBjbGlja2VkIG9uICcraXRlbS5pZCk7Ci0gICAgLy8gZG8gc29tZXRoaW5nIHVzZWZ1bCBoZXJlCi19OwotCi0vLyBoZWxwZXIgZnVuY3Rpb24KLWZ1bmN0aW9uIGlzTGFzdENoaWxkKHBhcmVudCwgY2hpbGQpIHsKLSAgICAvLyB0aGlzIHNob3VsZCBiZSBhIG1ldGhvZCBvZiBOb2RlCi0gICAgZm9yICh2YXIgaT0wOyBpPHBhcmVudC5pdGVtaWRzLmxlbmd0aC0xOyBpKyspIHsKLSAgICAgICAgaWYgKHBhcmVudC5pdGVtaWRzW2ldID09IGNoaWxkLmlkKSByZXR1cm4gZmFsc2U7Ci0gICAgfTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRHluYW1pYyBsb2FkaW5nIGZ1bmN0aW9ucyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWZ1bmN0aW9uIGxvYWRTeW5jWE1MKHVybCkgewotICAgIGlmICh4bWxodHRwPT1udWxsKSBjcmVhdGVYTUxIdHRwKCk7Ci0gICAgCi0gICAgLy9hbGVydCgnbG9hZGluZyAnK3VybCk7Ci0gICAgLy8gZG8gc3luY2hyb25vdXMgbG9hZGluZyAKLSAgICB4bWxodHRwLm9wZW4oIkdFVCIsdXJsLGZhbHNlKTsgIAotICAgIHhtbGh0dHAuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywndGV4dC94bWwnKTsKLSAgICAKLSAgICB4bWxodHRwLnNlbmQobnVsbCk7Ci0gICAgCi0gICAgLy9hbGVydCgncmVzdWx0OiAnK3htbGh0dHAucmVzcG9uc2VUZXh0KTsKLSAgICAKLSAgICB2YXIgeG1sID0geG1saHR0cC5yZXNwb25zZVhNTDsKLSAgICBpZiAoeG1sID09IG51bGwgfHwgeG1sLmRvY3VtZW50RWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgIGFsZXJ0KCdFcnJvcjogY291bGQgbm90IGxvYWQgcmVzcG9uc2UgeG1sIGZvciB1cmw6ICcrdXJsKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHJldHVybiB4bWw7Ci19Ci0KLWZ1bmN0aW9uIGxvYWRBc3luY1hNTCh1cmwsIGNhbGxiYWNrRnVuY3Rpb24sIGNhbGxiYWNrUGFyYW0pIHsKLSAgICBpZiAoeG1saHR0cD09bnVsbCkgY3JlYXRlWE1MSHR0cCgpOwotICAgIAotICAgIC8vYWxlcnQoJ2xvYWRpbmcgJyt1cmwpOwotICAgIC8vIGRvIGFzeW5jaHJvbm91cyBsb2FkaW5nIAotICAgIHhtbGh0dHAub3BlbigiR0VUIix1cmwsdHJ1ZSk7ICAKLSAgICB4bWxodHRwLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsJ3RleHQveG1sJyk7Ci0gICAgCi0gICAgeG1saHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIGlmICh4bWxodHRwLnJlYWR5U3RhdGUgPT0gNCkgewotICAgICAgICAgICAgdmFyIHhtbCA9IHhtbGh0dHAucmVzcG9uc2VYTUw7Ci0gICAgICAgICAgICBpZiAoeG1sID09IG51bGwgfHwgeG1sLmRvY3VtZW50RWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWxlcnQoJ0Vycm9yOiBjb3VsZCBub3QgbG9hZCByZXNwb25zZSB4bWwgZm9yIHVybDogJyt1cmwpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FsbGJhY2tGdW5jdGlvbih4bWwsIGNhbGxiYWNrUGFyYW0pOwotICAgICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICB4bWxodHRwLnNlbmQobnVsbCk7Ci19Ci0KLWZ1bmN0aW9uIGxvYWRBc3luY1RleHQodXJsLCBjYWxsYmFja0Z1bmN0aW9uLCBjYWxsYmFja1BhcmFtKSB7Ci0gICAgaWYgKHhtbGh0dHA9PW51bGwpIGNyZWF0ZVhNTEh0dHAoKTsKLSAgICAKLSAgICAvL2FsZXJ0KCdsb2FkaW5nICcrdXJsKTsKLSAgICAvLyBkbyBhc3luY2hyb25vdXMgbG9hZGluZyAKLSAgICB4bWxodHRwLm9wZW4oIkdFVCIsdXJsLHRydWUpOyAgCi0gICAgCi0gICAgeG1saHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIGlmICh4bWxodHRwLnJlYWR5U3RhdGUgPT0gNCkgewotICAgICAgICAgICAgdmFyIHRleHQgPSB4bWxodHRwLnJlc3BvbnNlVGV4dDsKLSAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbGVydCgnRXJyb3I6IGNvdWxkIG5vdCBsb2FkIHJlc3BvbnNlIHRleHQgZm9yIHVybDogJyt1cmwpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FsbGJhY2tGdW5jdGlvbih0ZXh0LCBjYWxsYmFja1BhcmFtKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgeG1saHR0cC5zZW5kKG51bGwpOwotfQotCi1mdW5jdGlvbiB1cGRhdGVFbGVtZW50KHBsYWNlaG9sZGVyLCB1cmwpIHsKLSAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoZnJhZ21lbnQpIHsKLSAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsYWNlaG9sZGVyKTsKLSAgICAgICAgZGl2LmlubmVySFRNTCA9IGZyYWdtZW50OwotICAgIH0KLSAgICBsb2FkQXN5bmNUZXh0KHVybCwgY2FsbGJhY2spOwotfQotCi0vLyBjcmVhdGUgdGhlIHhtbGh0dHAgb2JqZWN0Ci1mdW5jdGlvbiBjcmVhdGVYTUxIdHRwKCkgewotICAgIC8qQGNjX29uIEAqLwotICAgIC8qQGlmIChAX2pzY3JpcHRfdmVyc2lvbiA+PSA1KQotICAgIC8vIEpTY3JpcHQgZ2l2ZXMgdXMgQ29uZGl0aW9uYWwgY29tcGlsYXRpb24sIHdlIGNhbiBjb3BlIHdpdGggb2xkIElFIHZlcnNpb25zLgotICAgIC8vIGFuZCBzZWN1cml0eSBibG9ja2VkIGNyZWF0aW9uIG9mIHRoZSBvYmplY3RzLgotICAgICB0cnkgewotICAgICAgeG1saHR0cCA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNc3htbDIuWE1MSFRUUCIpOwotICAgICB9IGNhdGNoIChlKSB7Ci0gICAgICB0cnkgewotICAgICAgIHhtbGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsKLSAgICAgIH0gY2F0Y2ggKEUpIHsKLSAgICAgICB4bWxodHRwID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgIH0KLSAgICBAZW5kIEAqLwotICAgIGlmICgheG1saHR0cCAmJiB0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSd1bmRlZmluZWQnKSB7Ci0gICAgICB4bWxodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWlzYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWZ1bmN0aW9uIHN0cmlwUHJlZml4KHMpIHsKLSAgICBpZiAocy5pbmRleE9mKCc6Jyk9PS0xKSByZXR1cm4gczsgCi0gICAgcmV0dXJuIHMuc3BsaXQoJzonKVsxXTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9qYXZhc2NyaXB0L25hdnRyZWUuanMgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvamF2YXNjcmlwdC9uYXZ0cmVlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTU4NDBlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9qYXZhc2NyaXB0L25hdnRyZWUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vKgotUmVxdWlyZWQgdmFyaWFibGVzOiBzZWUgbGVueWF0cmVlLmpzCi0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmF2Tm9kZSAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWZ1bmN0aW9uIE5hdk5vZGUoaWQsIHBhcmVudCkgewotICAgIHRoaXMuaWQgPSBpZDsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLml0ZW1zID0ge307Ci0gICAgdGhpcy5pc2ZvbGRlciA9IGZhbHNlOwotICAgIHRoaXMudXVpZCA9ICcnOwotICAgIHRoaXMuaHJlZiA9ICcnOwotICAgIHRoaXMubGFiZWwgPSAnJzsKLSAgICB0aGlzLmFyZWEgPSAnJzsKLSAgICB0aGlzLnBhdGggPSAnJzsKLSAgICB0aGlzLmlzcHJvdGVjdGVkID0gdHJ1ZTsKLSAgICB0aGlzLmV4aXN0c0Nob3Nlbkxhbmd1YWdlID0gdHJ1ZTsKLSAgICB0aGlzLmxhbmdTdWZmaXggPSAnJzsKLX07Ci0KLU5hdk5vZGUucHJvdG90eXBlID0gbmV3IExlbnlhTm9kZTsKLQotTmF2Tm9kZS5wcm90b3R5cGUuY3JlYXRlTmV3Tm9kZSA9IGZ1bmN0aW9uKG5vZGUpCi17Ci0gICAgdmFyIG5ld0l0ZW0gPSBuZXcgTmF2Tm9kZShub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSwgdGhpcyk7Ci0gICAgbmV3SXRlbS5pbml0KCk7Ci0gIAotICAgIG5ld0l0ZW0uaXNmb2xkZXIgPSBpc05vZGVGb2xkZXIobm9kZSk7Ci0gICAgbmV3SXRlbS5hcmVhID0gdGhpcy5hcmVhOwotICAgIG5ld0l0ZW0ucGF0aCA9IG5vZGUuZ2V0QXR0cmlidXRlKCdwYXRoJyk7Ci0gICAgbmV3SXRlbS51dWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3V1aWQnKTsKLSAgICBuZXdJdGVtLmlzcHJvdGVjdGVkID0gaXNOb2RlUHJvdGVjdGVkKG5vZGUpOwotICAgIG5ld0l0ZW0uaHJlZiA9IG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJyk7Ci0gICAgbmV3SXRlbS5sYWJlbCA9IGdldExhYmVsKG5vZGUpOwotICAgIG5ld0l0ZW0uZXhpc3RzQ2hvc2VuTGFuZ3VhZ2UgPSBleGlzdHNDaG9zZW5MYW5ndWFnZShub2RlKTsKLSAgICBuZXdJdGVtLmxhbmdTdWZmaXggPSBub2RlLmdldEF0dHJpYnV0ZSgnbGFuZ3VhZ2Utc3VmZml4Jyk7Ci0gIAotICAgIHJldHVybiBuZXdJdGVtOwotfQotCi1OYXZOb2RlLnByb3RvdHlwZS5nZXRCYXNlUGF0aCA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBwYXRoID0gdGhpcy5wYXRoICE9ICcvJyA/IHRoaXMucGF0aCA6ICcnIDsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotTmF2Tm9kZS5wcm90b3R5cGUuZ2V0TG9hZFN1YlRyZWVVUkwgPSBmdW5jdGlvbigpIHsKLSAgICBhcmVhID0gdGhpcy5hcmVhOwotICAgIHZhciBwYXRoID0gdGhpcy5nZXRCYXNlUGF0aCgpOwotICAgIHJldHVybiBlbmNvZGVVUkkoQVJFQV9CQVNFX1BBVEggKyBQSVBFTElORV9QQVRIICsgJz9hcmVhPScrYXJlYSsnJnBhdGg9JytwYXRoKycmbGFuZ3VhZ2U9JytDSE9TRU5fTEFOR1VBR0UrJyZhcmVhcz0nK0FMTF9BUkVBUysnJmxlbnlhLm1vZHVsZT1zaXRldHJlZScpOwotfQotCi1OYXZOb2RlLnByb3RvdHlwZS5nZXRTdHlsZSA9IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLnRyZWUucm9vdCA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybiAnbGVueWEtaW5mby1yb290JzsKLSAgICB9IGVsc2UgaWYgKHRoaXMucGFyZW50ID09IHRoaXMudHJlZS5yb290KSB7Ci0gICAgICAgIHJldHVybiAnbGVueWEtaW5mby1hcmVhJzsKLSAgICB9IGVsc2UgaWYgKHRoaXMuaXNwcm90ZWN0ZWQpIHsKLSAgICAgICAgcmV0dXJuICdsZW55YS1pbmZvLXByb3RlY3RlZCc7Ci0gICAgfSBlbHNlIGlmICh0aGlzLnBhdGggPT0gQ1VUX0RPQ1VNRU5UX0lEKSB7Ci0gICAgICAgIHJldHVybiAnbGVueWEtaW5mby1jdXQnOwotICAgIH0gZWxzZSBpZiAoIXRoaXMuZXhpc3RzQ2hvc2VuTGFuZ3VhZ2UpIHsKLSAgICAgICAgcmV0dXJuICdsZW55YS1pbmZvLW5vbGFuZ3VhZ2UnOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAndHJlZW5vZGVfbGFiZWwnOwotICAgIH0KLX0KLQotZnVuY3Rpb24gZ2V0TGFiZWwobm9kZSkgewotICAgIHZhciBjcyA9IG5vZGUuY2hpbGROb2RlczsKLSAgICB2YXIgbCA9IGNzLmxlbmd0aDsKLSAgICAvLyBsZW55YSBnZW5lcmF0ZXMgdGhlIHhtbCBhbmQgaXMgcmVzcG9uc2libGUgdG8gaW5zZXJ0IHRoZSBsYWJlbAotICAgIC8vIG9mIHRoZSBjb3JyZWN0IGxhbmd1YWdlCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICBpZiAoZ2V0VGFnTmFtZShjc1tpXSkgPT0nbmF2OmxhYmVsJykgewotICAgICAgICAgIGlmIChjc1tpXS5oYXNDaGlsZE5vZGVzKCkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGNzW2ldLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgcmV0dXJuICJbbm8gdGl0bGVdIjsKLSAgICAgICAgICB9Ci0gICAgICAgfSAKLSAgICB9Ci0gICAgcmV0dXJuICcnOwotfQotCi1mdW5jdGlvbiBpc05vZGVQcm90ZWN0ZWQobm9kZSkgewotICAgIHZhciBwcm90ID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3Byb3RlY3RlZCcpOwotICAgIGlmIChwcm90ID09ICd0cnVlJykgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBpc05vZGVGb2xkZXIobm9kZSkgewotICAgIHZhciBpc2ZvbGRlciA9IG5vZGUuZ2V0QXR0cmlidXRlKCdmb2xkZXInKTsKLSAgICBpZiAoaXNmb2xkZXIgPT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIGNoZWNrIGlmIHRoZSBub2RlIGhhcyBhIGxhYmVsIG9mIHRoZSBjaG9zZW4gbGFuZ3VhZ2UKLWZ1bmN0aW9uIGV4aXN0c0Nob3Nlbkxhbmd1YWdlKG5vZGUpIHsKLSAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgIHZhciBsYW5nID0gY2hpbGRyZW5baV0uZ2V0QXR0cmlidXRlKCd4bWw6bGFuZycpOwotICAgICAgIGlmICghbGFuZykgewotICAgICAgICAgICB2YXIgbGFuZyA9IGNoaWxkcmVuW2ldLmdldEF0dHJpYnV0ZSgnbGFuZycpOwotICAgICAgIH0KLSAgICAgICBpZiAoZ2V0VGFnTmFtZShjaGlsZHJlbltpXSkgPT0gJ25hdjpsYWJlbCcgJiYgbGFuZyA9PSBDSE9TRU5fTEFOR1VBR0UpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICB9IAotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBOYXZUcmVlIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLWZ1bmN0aW9uIE5hdlRyZWUoZG9jLCB0cmVlRWxlbWVudCkgewotICAgIHRoaXMuZG9jID0gZG9jOwotICAgIHRoaXMudHJlZUVsZW1lbnQgPSB0cmVlRWxlbWVudDsKLSAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDsKLX07Ci0KLU5hdlRyZWUucHJvdG90eXBlID0gbmV3IExlbnlhVHJlZTsKLQotTmF2VHJlZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGlkLCBsYWJlbCkgewotICAgIHRoaXMucm9vdCA9IG5ldyBOYXZOb2RlKGlkKTsKLSAgICB0aGlzLnJvb3QudHJlZSA9IHRoaXM7Ci0gICAgdGhpcy5yb290LmRlcHRoID0gMDsKLSAgICB0aGlzLnJvb3QucmVvcGVuID0gZmFsc2U7Ci0gICAgdGhpcy5yb290LmlzcHJvdGVjdGVkID0gZmFsc2U7Ci0gICAgdGhpcy5yb290LmlzZm9sZGVyID0gdHJ1ZTsKLSAgICB0aGlzLnJvb3QubGFiZWwgPSBsYWJlbDsKLSAgICB0aGlzLl9jdXJyZW50SWQgPSAwOwotfTsKLQotTmF2VHJlZS5wcm90b3R5cGUubG9hZEluaXRpYWxUcmVlID0gZnVuY3Rpb24oYXJlYSwgcGF0aCkgewotICAgIHZhciB1cmwgPSBlbmNvZGVVUkkoQVJFQV9CQVNFX1BBVEggKyBQSVBFTElORV9QQVRIICsgJz9hcmVhPScrYXJlYSsnJnBhdGg9JytwYXRoKycmbGFuZ3VhZ2U9JytDSE9TRU5fTEFOR1VBR0UrJyZpbml0aWFsPXRydWUmYXJlYXM9JytBTExfQVJFQVMrJyZsZW55YS5tb2R1bGU9c2l0ZXRyZWUnKTsKLSAgICAKLSAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKGZyYWdtZW50LCBwYXJhbSkgewotICAgICAgICB2YXIgdHJlZSA9IHBhcmFtWzBdOwotICAgICAgICB2YXIgYXJlYSA9IHBhcmFtWzFdOwotICAgICAgICB2YXIgcGF0aCA9IHBhcmFtWzJdOwotICAgICAgICB0cmVlLmluaXRpYWxUcmVlTG9hZGVkKGZyYWdtZW50KTsKLSAgICAgICAgdmFyIHNlbGVjdGVkSXRlbSA9IHRyZWUuZ2V0SXRlbUJ5UGF0aChQVUJMSUNBVElPTl9JRCsnLycrYXJlYStwYXRoKQotICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtICE9IGZhbHNlKSB7Ci0gICAgICAgICAgICB0cmVlLnNlbGVjdChzZWxlY3RlZEl0ZW0pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZhciBwYXJhbSA9IG5ldyBBcnJheSh0aGlzLCBhcmVhLCBwYXRoKTsKLSAgICBsb2FkQXN5bmNYTUwodXJsLCBjYWxsYmFjaywgcGFyYW0pOwotfTsKLQotTmF2VHJlZS5wcm90b3R5cGUuaW5pdGlhbFRyZWVMb2FkZWQgPSBmdW5jdGlvbih4bWwpCi17Ci0gIHZhciByb290ID0geG1sLmRvY3VtZW50RWxlbWVudDsKLSAgdmFyIGNoaWxkcmVuID0gcm9vdC5jaGlsZE5vZGVzOwotICB2YXIgaXRlbXM9W107Ci0gIHZhciBpdGVtOwotICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgIGlmIChnZXRUYWdOYW1lKGNoaWxkcmVuW2ldKSA9PSAibmF2OnNpdGUiKSB7Ci0gICAgICAgIGl0ZW0gPSB0aGlzLmFkZExvYWRlZFNpdGUoY2hpbGRyZW5baV0pOwotICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pOwotICAgICAgICBpdGVtLmFkZE5vZGVzUmVjKGNoaWxkcmVuW2ldKTsKLSAgICAgfQotICB9Ci0gIHRoaXMucm9vdC5hZGRJdGVtcyhpdGVtcyk7Ci0gIHRoaXMucm9vdC5vcGVuKCk7Ci19Ci0KLU5hdlRyZWUucHJvdG90eXBlLmFkZExvYWRlZFNpdGUgPSBmdW5jdGlvbihzaXRlKQotewotICB2YXIgbGFuZ1N1ZmZpeCA9ICcnOwotICBpZiAoQ0hPU0VOX0xBTkdVQUdFIT1ERUZBVUxUX0xBTkdVQUdFKSBsYW5nU3VmZml4ID0gJ18nK0NIT1NFTl9MQU5HVUFHRTsKLQotICB2YXIgc2l0ZUFyZWEgPSBzaXRlLmdldEF0dHJpYnV0ZSgnYXJlYScpOwotICB2YXIgbmV3U2l0ZSA9IG5ldyBOYXZOb2RlKHNpdGVBcmVhLCB0aGlzLnJvb3QpOwotICBuZXdTaXRlLmluaXQoKTsKLSAgCi0gIG5ld1NpdGUuaXNmb2xkZXIgPSBpc05vZGVGb2xkZXIoc2l0ZSk7Ci0gIG5ld1NpdGUuYXJlYSA9IHNpdGVBcmVhOwotICBuZXdTaXRlLnBhdGggPSAnLyc7Ci0gIG5ld1NpdGUuaXNwcm90ZWN0ZWQgPSBpc05vZGVQcm90ZWN0ZWQoc2l0ZSk7Ci0gIG5ld1NpdGUuaHJlZiA9IHNpdGUuZ2V0QXR0cmlidXRlKCdocmVmJykgKyAiLyIgKyBsYW5nU3VmZml4OwotICBuZXdTaXRlLmxhbmdTdWZmaXggPSBsYW5nU3VmZml4OwotICBuZXdTaXRlLmxhYmVsID0gc2l0ZS5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7Ci0gIAotICByZXR1cm4gbmV3U2l0ZTsKLX0KLQotTmF2VHJlZS5wcm90b3R5cGUuaGFuZGxlSXRlbUNsaWNrID0gZnVuY3Rpb24oaXRlbSwgZXZlbnQpIHsKLSAgICBpZiAoIWl0ZW0uaXNwcm90ZWN0ZWQpIHsgLy8gJiYgaXRlbS5yb290IT1pdGVtKSB7Ci0gICAgICAgIGhyZWYgPSBlbmNvZGVVUkkoaXRlbS5ocmVmICsgIj9sZW55YS51c2VjYXNlPXRhYi5vdmVydmlldyIpOyAKLSAgICAgICAgd2luZG93LmxvY2F0aW9uID0gaHJlZjsKLSAgICB9Ci19OwotCi0vKgotICBvdmVycmlkaW5nIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSBvZiBhIGJ1ZyBpbiBsZW55YToKLSAgdGhlIGFyZWEgY2Fubm90IGJlIGNsaWNrYWJsZSBiZWNhdXNlIGxlbnlhIGV4cGVjdHMKLSAgYSBkb2N1bWVudCBmb3IgdGhlIGFyZWEuCi0qLwotTmF2VHJlZS5wcm90b3R5cGUuY3JlYXRlSXRlbUh0bWwgPSBmdW5jdGlvbihpdGVtKSB7Ci0gICAgdmFyIGRpdiA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotICAgIGRpdi5jbGFzc05hbWUgPSAndHJlZW5vZGUnOwotCi0gICAgLy8gcGxhY2UgYSByZWZlcmVuY2UgdG8gdGhlIGl0ZW0gb24gdGhlIGRpdgotICAgIGRpdi50cmVlaXRlbSA9IGl0ZW07Ci0gICAgCi0gICAgdmFyIHRhYmxlID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgndGFibGUnKTsKLSAgICBkaXYuYXBwZW5kQ2hpbGQodGFibGUpOwotICAgIHZhciB0Ym9keSA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7Ci0gICAgdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpOwotICAgIHZhciB0ciA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ3RyJyk7Ci0gICAgdGJvZHkuYXBwZW5kQ2hpbGQodHIpOwotCi0gICAgLy8gYWRkIHRoZSBsaW5lczoKLSAgICB0aGlzLmFkZExpbmVzKGl0ZW0sIHRyKTsKLQotICAgIC8vIGFkZCB0aGUgb3BlbnNpZ24KLSAgICB2YXIgdGQxID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgndGQnKTsKLSAgICB0ci5hcHBlbmRDaGlsZCh0ZDEpOwotICAgIGl0ZW0ub3BlbnNpZ24gPSB0aGlzLmdldENsb3NlU2lnbihpdGVtKTsKLSAgICBpdGVtLm9wZW5zaWduLmNsYXNzTmFtZSA9ICd0cmVlbm9kZV9zaWduJzsKLQotICAgIGlmICh0aGlzLmdldFNpZ25UeXBlKGl0ZW0pID09ICdUJykgewotICAgICAgICAvLyBpZiB0aGUgbGFiZWwgb2YgdGhpcyBpdGVtIGlzIHRvbyBsb25nIHRoZSBsaW5lIHdpbGwgd3JhcAotICAgICAgICAvLyBieSBzZXR0aW5nIHRoZSBiYWNrZ3JvdW5kIGltYWdlIHdlIGdldCBhIGNvbnRpbnVvcyBsaW5lCi0gICAgICAgIHRkMS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCcrSU1BR0VfUEFUSCsndmVydGljYWwtbGluZS5naWYpJzsKLSAgICB9Ci0KLSAgICB0ZDEuYXBwZW5kQ2hpbGQoaXRlbS5vcGVuc2lnbik7Ci0gICAgCi0gICAgLy8gYWRkIHRoZSBsYWJlbAotICAgIHZhciB0ZDIgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCd0ZCcpOwotICAgIHRyLmFwcGVuZENoaWxkKHRkMik7Ci0gICAgdGQyLmNsYXNzTmFtZSA9ICdsZW55YS1pbmZvLWxhYmVsLXRkJzsKLSAgICB2YXIgbGluZSA9IHRoaXMuY3JlYXRlSXRlbUxpbmUoaXRlbSk7Ci0gICAgdGQyLmFwcGVuZENoaWxkKGxpbmUpOwotICAgIAotICAgIC8vIG1ha2Ugcm9vdCBub2RlIG5vdCBjbGlja2FibGUKLSAgICBpZiAoaXRlbS5kZXB0aCA+IDApIHsKLSAgICAgIGFkZEV2ZW50SGFuZGxlcihsaW5lLCAnY2xpY2snLCB0aGlzLmhhbmRsZUl0ZW1DbGljaywgdGhpcywgaXRlbSk7Ci0gICAgfQotICAgIGFkZEV2ZW50SGFuZGxlcihpdGVtLm9wZW5zaWduLCAnY2xpY2snLCB0aGlzLmhhbmRsZUl0ZW1TaWduQ2xpY2ssIAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBpdGVtKTsKLQotICAgIGlmICh0aGlzLnNlbGVjdGVkID09IGl0ZW0uZ2V0UGF0aCgpKSB7Ci0gICAgICAgIHRoaXMudW5zZWxlY3QoKTsKLSAgICAgICAgdGhpcy5zZWxlY3QoaXRlbSk7Ci0gICAgICAgIGRpdi5jbGFzc05hbWUgPSAnc2VsZWN0ZWRfbm9kZSc7Ci0gICAgfTsKLQotICAgIHJldHVybiBkaXY7Ci19OwotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvamF2YXNjcmlwdC90cmVlLmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvcmVzb3VyY2VzL2phdmFzY3JpcHQvdHJlZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5MTFlZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvamF2YXNjcmlwdC90cmVlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBHdWlkbyBXZXNkb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB0cmVlLmpzCi0gKiBMaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgZm9yIGxpY2Vuc2UgdGV4dC4KLSAqCi0gKiAgRS1tYWlsOiBqb2hubnlAZGVicmlzLmRlbW9uLm5sCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotQ29weXJpZ2h0IChjKSAyMDA0LCBHdWlkbyBXZXNkb3JwCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLQotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdHJlZS5qcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5Ci0gICAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICAgICAgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1PV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0qLwotCi1mdW5jdGlvbiBOb2RlKGlkLCBwYXJlbnQpIHsKLSAgICB0aGlzLmlkID0gaWQ7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgLy8gdGhpcyBpcyBqdXN0IGhlcmUgZm9yIHNob3csIHdpbGwgYmUgb3ZlcndyaXR0ZW4gaW4gaW5pdCgpCi0gICAgdGhpcy5pdGVtcyA9IHt9OwotfTsKLQotTm9kZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZGVwdGggPSB0aGlzLnBhcmVudC5kZXB0aCArIDE7Ci0gICAgdGhpcy50cmVlID0gdGhpcy5wYXJlbnQudHJlZTsKLSAgICB0aGlzLnJlb3BlbiA9IGZhbHNlOwotICAgIHRoaXMuaXRlbXMgPSB7fTsKLX07Ci0KLU5vZGUucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbihyZWxvYWQsIGVuZGhhbmRsZXIpIHsKLSAgICBpZiAoIXRoaXMuaXNDb2xsZWN0aW9uKCkpIHsKLSAgICAgICAgaWYgKHJlbG9hZCkgewotICAgICAgICAgICAgdGhpcy5yZWxvYWRTaW5nbGUoKTsKLSAgICAgICAgfTsKLSAgICAgICAgcmV0dXJuOwotICAgIH07Ci0gICAgaWYgKCFyZWxvYWQgJiYgdGhpcy5vcGVuZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH07Ci0gICAgdGhpcy5vcGVuZWQgPSB0cnVlOwotICAgIHZhciBuZXdvcGVuc2lnbiA9IHRoaXMudHJlZS5nZXRPcGVuU2lnbih0aGlzKTsKLSAgICB0aGlzLm9wZW5zaWduLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld29wZW5zaWduLCB0aGlzLm9wZW5zaWduKTsKLSAgICB0aGlzLm9wZW5zaWduID0gbmV3b3BlbnNpZ247Ci0gICAgYWRkRXZlbnRIYW5kbGVyKHRoaXMub3BlbnNpZ24sICdjbGljaycsIHRoaXMudHJlZS5oYW5kbGVJdGVtU2lnbkNsaWNrLCAKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlLCB0aGlzKTsKLSAgICBpZiAoIXRoaXMuaXRlbWlkcyB8fCB0aGlzLml0ZW1pZHMubGVuZ3RoPT0wKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgaXRlbXMsIGdldEl0ZW1zKCkgc2hvdWxkIGJlIGRlZmluZWQgb24gdGhlIHN1YmNsYXNzCi0gICAgICAgIHRoaXMudHJlZS5kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5zdHlsZS5jdXJzb3IgPSAnd2FpdCc7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lOwotICAgICAgICB0aGlzLnRyZWUuZ2V0SXRlbXModGhpcywgdGhpcy5fY29udGludWVPcGVuLCAhcmVsb2FkLCBlbmRoYW5kbGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgCi0gICAgICAgIGZvciAodmFyIGl0ZW1pZCBpbiB0aGlzLml0ZW1zKSB7Ci0gICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaXRlbWlkXTsKLSAgICAgICAgICAgIGl0ZW0ucmVuZGVyKCk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5yZW9wZW4pIHsKLSAgICAgICAgICAgICAgICBpdGVtLm9wZW4oKTsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH07Ci0gICAgICAgIGlmIChlbmRoYW5kbGVyKSB7Ci0gICAgICAgICAgICBlbmRoYW5kbGVyKCk7Ci0gICAgICAgIH07Ci0gICAgfTsKLX07Ci0KLU5vZGUucHJvdG90eXBlLl9jb250aW51ZU9wZW4gPSBmdW5jdGlvbihpdGVtcywgZW5kaGFuZGxlcikgewotICAgIHRoaXMuaXRlbXMgPSB7fTsKLSAgICB0aGlzLml0ZW1pZHMgPSBbXTsKLSAgICBmb3IgKHZhciBpID0gaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgdGhpcy5pdGVtc1tpdGVtLmlkXSA9IGl0ZW07Ci0gICAgICAgIHRoaXMuaXRlbWlkcy51bnNoaWZ0KGl0ZW0uaWQpOwotICAgICAgICBpdGVtLnJlbmRlcigpOwotICAgICAgICBpZiAoaXRlbS5yZW9wZW4pIHsKLSAgICAgICAgICAgIGl0ZW0ub3BlbigpOwotICAgICAgICB9OwotICAgIH07Ci0KLSAgICB0aGlzLnRyZWUuZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnOwotICAgIGlmIChlbmRoYW5kbGVyKSB7Ci0gICAgICAgIGVuZGhhbmRsZXIoKTsKLSAgICB9OwotfTsKLQotTm9kZS5wcm90b3R5cGUucmVsb2FkU2luZ2xlID0gZnVuY3Rpb24oKSB7Ci0gICAgLyogY2FsbGVkIG9uIG9wZW5pbmcgYSBub24tY29sbGVjdGlvbiBpdGVtIHdpdGggYSByZWxvYWQgYXJnCi0KLSAgICAgICAgY2FuIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcwotICAgICovCi19OwotCi1Ob2RlLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKHJlb3Blbl93aGVuX29wZW5pbmdfcGFyZW50KSB7Ci0gICAgaWYgKCF0aGlzLm9wZW5lZCB8fCAhdGhpcy5pc0NvbGxlY3Rpb24oKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfTsKLSAgICB0aGlzLnJlb3BlbiA9IHJlb3Blbl93aGVuX29wZW5pbmdfcGFyZW50OwotICAgIHZhciBuZXdvcGVuc2lnbiA9IHRoaXMudHJlZS5nZXRDbG9zZVNpZ24odGhpcyk7Ci0gICAgdGhpcy5vcGVuc2lnbi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdvcGVuc2lnbiwgdGhpcy5vcGVuc2lnbik7Ci0gICAgdGhpcy5vcGVuc2lnbiA9IG5ld29wZW5zaWduOwotICAgIHRoaXMub3BlbmVkID0gZmFsc2U7Ci0gICAgYWRkRXZlbnRIYW5kbGVyKHRoaXMub3BlbnNpZ24sICdjbGljaycsIHRoaXMudHJlZS5oYW5kbGVJdGVtU2lnbkNsaWNrLCAKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlLCB0aGlzKTsKLSAgICBmb3IgKHZhciBpdGVtaWQgaW4gdGhpcy5pdGVtcykgewotICAgICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaXRlbWlkXTsKLSAgICAgICAgaXRlbS5jbG9zZSh0cnVlKTsKLSAgICAgICAgdGhpcy50cmVlLnVucmVuZGVySXRlbShpdGVtKTsKLSAgICB9OwotfTsKLQotTm9kZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5pdGVtaWRzID0gbnVsbDsKLSAgICB2YXIgY3VycmVsID0gdGhpcy5lbGVtZW50OwotICAgIHRoaXMuZWxlbWVudCA9IHRoaXMudHJlZS5jcmVhdGVJdGVtSHRtbCh0aGlzKTsKLSAgICBjdXJyZWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5lbGVtZW50LCBjdXJyZWwpOwotICAgIGlmICh0aGlzLm9wZW5lZCkgewotICAgICAgICB0aGlzLmNsb3NlKCk7Ci0gICAgICAgIHRoaXMub3Blbih0cnVlKTsKLSAgICB9OwotfTsKLQotTm9kZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy50cmVlLnJlbmRlckl0ZW0odGhpcyk7Ci19OwotCi1Ob2RlLnByb3RvdHlwZS5pc0NvbGxlY3Rpb24gPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLX07Ci0KLU5vZGUucHJvdG90eXBlLmdldFBhdGggPSBmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFyZW50cGF0aDsKLSAgICBpZiAodGhpcy5wYXJlbnQpIHsKLSAgICAgICAgcGFyZW50cGF0aCA9IHRoaXMucGFyZW50LmdldFBhdGgoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwYXJlbnRwYXRoID0gICcnOwotICAgIH0KLSAgICByZXR1cm4gcGFyZW50cGF0aCArICcvJyArIHRoaXMuaWQ7Ci19OwotCi1Ob2RlLnByb3RvdHlwZS5zZXRTZWxlY3RDbGFzcyA9IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICdzZWxlY3RlZF9ub2RlJzsKLSAgICB9OwotfTsKLQotTm9kZS5wcm90b3R5cGUudW5zZXRTZWxlY3RDbGFzcyA9IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICd1bnNlbGVjdGVkX25vZGUnOwotICAgIH07Ci19OwotCi1Ob2RlLnByb3RvdHlwZS5nZXRJdGVtQnlQYXRoID0gZnVuY3Rpb24ocGF0aCkgewotICAgIC8qIHJldHVybiBhbiBpdGVtIGJ5IGl0cyBwYXRoIAotICAgIAotICAgICAgICBwYXRoIHNob3VsZCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBjdXJyZW50IGl0ZW0sIGV4Y2x1ZGluZyAKLSAgICAgICAgdGhlIGN1cnJlbnQgaXRlbSdzIGlkCi0gICAgKi8KLSAgICB2YXIgaXRlbSA9IG51bGw7Ci0gICAgZm9yICh2YXIgaXRlbWlkIGluIHRoaXMuaXRlbXMpIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIHRoZSBuZXh0IGl0ZW0gaWQKLSAgICAgICAgaWYgKHBhdGguaW5kZXhPZihpdGVtaWQgKyAnLycpID09IDAgfHwgcGF0aCA9PSBpdGVtaWQpIHsKLSAgICAgICAgICAgIGl0ZW0gPSB0aGlzLml0ZW1zW2l0ZW1pZF07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfTsKLSAgICB9OwotICAgIGlmICghaXRlbSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfTsKLSAgICBpZiAocGF0aCA9PSBpdGVtLmlkKSB7Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBpdGVtLmdldEl0ZW1CeVBhdGgocGF0aC5zdWJzdHIoaXRlbS5pZC5sZW5ndGgrMSkpOwotICAgIH07Ci0gICAgcmV0dXJuIGZhbHNlOwotfTsKLQotZnVuY3Rpb24gVHJlZShkb2MsIHRyZWVFbGVtZW50KSB7Ci0gICAgdGhpcy5kb2MgPSBkb2M7Ci0gICAgdGhpcy50cmVlRWxlbWVudCA9IHRyZWVFbGVtZW50OwotICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsOwotfTsKLQotVHJlZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGlkKSB7Ci0gICAgdGhpcy5yb290ID0gbmV3IE5vZGUoaWQpOwotICAgIHRoaXMucm9vdC50cmVlID0gdGhpczsKLSAgICB0aGlzLnJvb3QuZGVwdGggPSAwOwotICAgIHRoaXMucm9vdC5yZW9wZW4gPSBmYWxzZTsKLSAgICB0aGlzLl9jdXJyZW50SWQgPSAwOwotICAgIC8vIGFkZEV2ZW50SGFuZGxlcih0aGlzLmRvYywgJ2NvbnRleHRtZW51JywgCi0gICAgLy8gICAgICAgIHRoaXMuY3JlYXRlQ29udGV4dE1lbnUsIHRoaXMpOwotICAgIC8vYWRkRXZlbnRIYW5kbGVyKHRoaXMuZG9jLCAnbW91c2V1cCcsIHRoaXMucmVtb3ZlQ29udGV4dE1lbnUsIHRoaXMpOwotfTsKLQotVHJlZS5wcm90b3R5cGUuZ2V0SXRlbXMgPSBmdW5jdGlvbihpdGVtLCBoYW5kbGVyLCByZWxvYWQsIGVuZGhhbmRsZXIpIHsKLSAgICAvKiB0aGlzIHNob3VsZCBiZSBvdmVycmlkZGVuIGluIHN1YmNsYXNzZXMgKi8KLSAgICB2YXIgaXRlbXMgPSBbXTsKLSAgICB2YXIgaWRzID0gWydmb28nLCAnYmFyJywgJ2JheiddOwotICAgIGZvciAodmFyIGk9MDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICB2YXIgY2hpbGQgPSBuZXcgTm9kZShpZHNbaV0sIGl0ZW0pOwotICAgICAgICBjaGlsZC5pbml0KCk7Ci0gICAgICAgIGl0ZW1zLnB1c2goY2hpbGQpOwotICAgIH07Ci0gICAgaGFuZGxlci5jYWxsKGl0ZW0sIGl0ZW1zLCBlbmRoYW5kbGVyKTsKLX07Ci0KLVRyZWUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBlbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSHRtbCh0aGlzLnJvb3QpOwotICAgIHRoaXMucm9vdC5lbGVtZW50ID0gZWxlbWVudDsKLSAgICBlbGVtZW50LnRyZWVfaXRlbSA9IHRoaXMucm9vdDsKLSAgICB0aGlzLmRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JzsKLSAgICB0aGlzLnRyZWVFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotfTsKLQotVHJlZS5wcm90b3R5cGUucmVuZGVySXRlbSA9IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICB2YXIgZWxlbWVudCA9IHRoaXMuY3JlYXRlSXRlbUh0bWwoaXRlbSk7Ci0gICAgdGhpcy5kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7Ci0gICAgaXRlbS5lbGVtZW50ID0gZWxlbWVudDsKLSAgICBlbGVtZW50LnRyZWVfaXRlbSA9IGl0ZW07Ci0gICAgaWYgKGl0ZW0ucGFyZW50LmVsZW1lbnQubmV4dFNpYmxpbmcpIHsKLSAgICAgICAgaXRlbS5wYXJlbnQuZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpdGVtLmVsZW1lbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnQuZWxlbWVudC5uZXh0U2libGluZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaXRlbS5wYXJlbnQuZWxlbWVudC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGl0ZW0uZWxlbWVudCk7Ci0gICAgfTsKLX07Ci0KLVRyZWUucHJvdG90eXBlLmNyZWF0ZUl0ZW1IdG1sID0gZnVuY3Rpb24oaXRlbSkgewotICAgIC8qIHlvdSBtYXkgd2FudCB0byBvdmVycmlkZSB0aGlzICovCi0gICAgdmFyIGRpdiA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotICAgIGRpdi5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7Ci0gICAgZGl2LmNsYXNzTmFtZSA9ICd0cmVlbm9kZSc7Ci0gICAgCi0gICAgLy8gcGxhY2UgYSByZWZlcmVuY2UgdG8gdGhlIGl0ZW0gb24gdGhlIGRpdgotICAgIGRpdi50cmVlaXRlbSA9IGl0ZW07Ci0KLSAgICB2YXIgc3BhY2UgPSAnJzsKLSAgICBmb3IgKHZhciBpPTA7IGkgPCBpdGVtLmRlcHRoOyBpKyspIHsKLSAgICAgICAgc3BhY2UgKz0gJ1x4YTBceGEwXHhhMCc7Ci0gICAgfTsKLSAgICB2YXIgdGV4dCA9IHRoaXMuZG9jLmNyZWF0ZVRleHROb2RlKHNwYWNlKTsKLSAgICBkaXYuYXBwZW5kQ2hpbGQodGV4dCk7Ci0gICAgCi0gICAgaXRlbS5vcGVuc2lnbiA9IHRoaXMuZ2V0Q2xvc2VTaWduKGl0ZW0pOwotICAgIGl0ZW0ub3BlbnNpZ24uY2xhc3NOYW1lID0gJ3RyZWVub2RlX29wZW5zaWduJzsKLSAgICBkaXYuYXBwZW5kQ2hpbGQoaXRlbS5vcGVuc2lnbik7Ci0KLSAgICAvLyB0aGUgYWN0dWFsIGljb24gYW5kIG5hbWUgYXJlIGdlbmVyYXRlZCBmcm9tIGFub3RoZXIgbWV0aG9kCi0gICAgLy8gdG8gaW1wcm92ZSBleHRlbmRpbmcKLSAgICB2YXIgbGluZSA9IHRoaXMuY3JlYXRlSXRlbUxpbmUoaXRlbSk7Ci0gICAgZGl2LmFwcGVuZENoaWxkKGxpbmUpOwotICAgIAotICAgIGFkZEV2ZW50SGFuZGxlcihsaW5lLCAnY2xpY2snLCB0aGlzLmhhbmRsZUl0ZW1DbGljaywgdGhpcywgaXRlbSk7Ci0gICAgYWRkRXZlbnRIYW5kbGVyKGl0ZW0ub3BlbnNpZ24sICdjbGljaycsIHRoaXMuaGFuZGxlSXRlbVNpZ25DbGljaywgCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIGl0ZW0pOwotCi0gICAgaWYgKHRoaXMuc2VsZWN0ZWQgPT0gaXRlbS5nZXRQYXRoKCkpIHsKLSAgICAgICAgdGhpcy51bnNlbGVjdCgpOwotICAgICAgICB0aGlzLnNlbGVjdChpdGVtKTsKLSAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdzZWxlY3RlZF9ub2RlJzsKLSAgICB9OwotCi0gICAgcmV0dXJuIGRpdjsKLX07Ci0KLVRyZWUucHJvdG90eXBlLmNyZWF0ZUl0ZW1MaW5lID0gZnVuY3Rpb24oaXRlbSkgewotICAgIHZhciBkaXYgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgICAvKiBjcmVhdGVzIHRoZSBpdGVtIG5hbWUgYW5kIGFueSBpY29ucyBhbmQgc3VjaCAqLwotICAgIHZhciBzcGFuID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotICAgIHZhciBpY29uID0gdGhpcy5nZXRJY29uKGl0ZW0pOwotICAgIGlmIChpY29uLm5vZGVUeXBlID09IDEpIHsKLSAgICAgICAgaWNvbi5jbGFzc05hbWUgPSAndHJlZW5vZGVfaWNvbic7Ci0gICAgfTsKLSAgICBkaXYuYXBwZW5kQ2hpbGQoaWNvbik7Ci0gICAgCi0gICAgdmFyIHRleHQgPSB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShpdGVtLm5hbWUgPyBpdGVtLm5hbWUgOiBpdGVtLmlkKTsKLSAgICBzcGFuLmNsYXNzTmFtZSA9ICd0cmVlbm9kZV9sYWJlbCc7Ci0gICAgc3Bhbi5hcHBlbmRDaGlsZCh0ZXh0KTsKLSAgICBkaXYuYXBwZW5kQ2hpbGQoc3Bhbik7Ci0gICAgCi0gICAgcmV0dXJuIGRpdjsKLX07Ci0KLVRyZWUucHJvdG90eXBlLnVucmVuZGVySXRlbSA9IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICBpZiAoaXRlbS5lbGVtZW50KSB7Ci0gICAgICAgIGl0ZW0uZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGl0ZW0uZWxlbWVudCk7Ci0gICAgICAgIGRlbGV0ZSBpdGVtLmVsZW1lbnQ7Ci0gICAgfTsKLX07Ci0KLVRyZWUucHJvdG90eXBlLmhhbmRsZUl0ZW1DbGljayA9IGZ1bmN0aW9uKGl0ZW0sIGV2ZW50KSB7Ci0gICAgaWYgKGl0ZW0uc2tpcF9uZXh0X2NsaWNrKSB7Ci0gICAgICAgIGl0ZW0uc2tpcF9uZXh0X2NsaWNrID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9OwotICAgIHRoaXMuc2VsZWN0KGl0ZW0pOwotICAgIGlmICghaXRlbS5vcGVuZWQpIHsKLSAgICAgICAgaXRlbS5vcGVuKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaXRlbS5jbG9zZSgpOwotICAgIH07Ci0gICAgaWYgKGl0ZW0uZWxlbWVudCAmJiBpdGVtLmVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcpIHsKLSAgICAgICAgaXRlbS5lbGVtZW50LnNjcm9sbEludG9WaWV3KCk7Ci0gICAgfTsKLX07Ci0KLVRyZWUucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICB0aGlzLnVuc2VsZWN0KCk7Ci0gICAgdGhpcy5zZWxlY3RlZCA9IGl0ZW0uZ2V0UGF0aCgpOwotICAgIGl0ZW0uc2V0U2VsZWN0Q2xhc3MoKTsKLX07Ci0KLVRyZWUucHJvdG90eXBlLnVuc2VsZWN0ID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHR5cGVvZih0aGlzLnNlbGVjdGVkKSA9PSAnc3RyaW5nJykgewotICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5UGF0aCh0aGlzLnNlbGVjdGVkKTsKLSAgICAgICAgaXRlbS51bnNldFNlbGVjdENsYXNzKCk7Ci0gICAgfTsKLX07Ci0KLVRyZWUucHJvdG90eXBlLmhhbmRsZUl0ZW1TaWduQ2xpY2sgPSBmdW5jdGlvbihpdGVtLCBldmVudCkgewotICAgIGlmICghaXRlbS5vcGVuZWQpIHsKLSAgICAgICAgaXRlbS5vcGVuKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaXRlbS5jbG9zZSgpOwotICAgIH07Ci0gICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7Ci0gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLSAgICB9OwotfTsKLQotVHJlZS5wcm90b3R5cGUuY3JlYXRlVW5pcXVlSWQgPSBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9jdXJyZW50SWQrKzsKLSAgICByZXR1cm4gdGhpcy5fY3VycmVudElkLnRvU3RyaW5nKCk7Ci19OwotCi1UcmVlLnByb3RvdHlwZS5jcmVhdGVDb250ZXh0TWVudSA9IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgdmFyIGNsaWNrZWwgPSBldmVudC50YXJnZXQ7Ci0gICAgdmFyIGl0ZW0gPSBjbGlja2VsLnRyZWVfaXRlbTsKLSAgICBpZiAoIWl0ZW0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH07Ci0gICAgaWYgKCF0aGlzLmNvbnRleHRtZW51KSB7Ci0gICAgICAgIHZhciBjb250ZXh0ZWxzID0gdGhpcy5nZXRDb250ZXh0TWVudUVsZW1lbnRzKCk7Ci0gICAgICAgIHRoaXMucmVuZGVyQ29udGV4dE1lbnUoaXRlbSwgY29udGV4dGVscywgZXZlbnQpOwotICAgIH07Ci0gICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7Ci0gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLSAgICB9OwotICAgIHJldHVybiBmYWxzZTsKLX07Ci0KLVRyZWUucHJvdG90eXBlLmdldENvbnRleHRNZW51RWxlbWVudHMgPSBmdW5jdGlvbigpIHsKLSAgICAvKiB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIG92ZXJyaWRlIHRoaXMKLQotICAgICAgICB0aGlzIHNob3VsZCByZXR1cm4gYSBtYXBwaW5nIChvYmplY3QpIGZyb20gY29udGV4dCBtZW51Ci0gICAgICAgIGVudHJ5IChzdHJpbmcpIHRvIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBOb2RlIG9iamVjdAotICAgICAgICAoYWxzbyBhIHN0cmluZyksIHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudAotICAgICAgICBpcyBjbGlja2VkCi0gICAgKi8KLSAgICByZXR1cm4geydvcGVuJzogJ29wZW4nLAotICAgICAgICAgICAgJ2Nsb3NlJzogJ2Nsb3NlJ307Ci19OwotCi1UcmVlLnByb3RvdHlwZS5yZW5kZXJDb250ZXh0TWVudSA9IGZ1bmN0aW9uKGl0ZW0sIGVsZW1lbnRzLCBldmVudCkgewotICAgIC8qIHlvdSBtYXkgd2FudCB0byBvdmVycmlkZSB0aGlzIAotICAgICAgICAKLSAgICAgICAgaXRlbSBpcyB0aGUgaXRlbSBjbGlja2VkIG9uCi0gICAgICAgIGVsZW1lbnRzIHNob3VsZCBiZSBhIG1hcHBpbmcgZnJvbSBtZW51IGVsZW1lbnQgKHN0cmluZykgdG8gCi0gICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGxvY2F0ZWQgb24gdGhlIGNsaWNrZWQgTm9kZQotICAgIAotICAgICovCi0gICAgdmFyIG1lbnUgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgICBtZW51LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKLSAgICBtZW51LmNsYXNzTmFtZSA9ICdjb250ZXh0bWVudSc7Ci0gICAgYWRkRXZlbnRIYW5kbGVyKG1lbnUsICdjbGljaycsIHRoaXMucmVtb3ZlQ29udGV4dE1lbnUsIHRoaXMpOwotICAgIGZvciAodmFyIGVsIGluIGVsZW1lbnRzKSB7Ci0gICAgICAgIHZhciBkaXYgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgICAgICAgdmFyIHRleHQgPSB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShlbCk7Ci0gICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0KTsKLSAgICAgICAgYWRkRXZlbnRIYW5kbGVyKGRpdiwgJ2NsaWNrJywgaXRlbVtlbGVtZW50c1tlbF1dLCBpdGVtKTsKLSAgICAgICAgbWVudS5hcHBlbmRDaGlsZChkaXYpOwotICAgIH07Ci0gICAgdGhpcy5fcG9zaXRpb25NZW51KGV2ZW50LCBtZW51KTsKLSAgICB0aGlzLmRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKG1lbnUpOwotICAgIHRoaXMuY29udGV4dG1lbnUgPSBtZW51OwotfTsKLQotVHJlZS5wcm90b3R5cGUucmVtb3ZlQ29udGV4dE1lbnUgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuY29udGV4dG1lbnUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH07Ci0gICAgdGhpcy5jb250ZXh0bWVudS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY29udGV4dG1lbnUpOwotICAgIGRlbGV0ZSB0aGlzLmNvbnRleHRtZW51OwotfTsKLQotVHJlZS5wcm90b3R5cGUuZ2V0Q2xvc2VTaWduID0gZnVuY3Rpb24oaXRlbSkgewotICAgIC8qIGdldCB0aGUgb3BlbiBzaWduIGZvciBhIGNvbGxlY3Rpb24gb3IgcmVzb3VyY2UgKi8KLSAgICB2YXIgb3BlbnNpZ24gPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLSAgICBpZiAoaXRlbS5pc0NvbGxlY3Rpb24oKSkgewotICAgICAgICBvcGVuc2lnbi5zZXRBdHRyaWJ1dGUoJ3NyYycsICdpbWFnZXMvY2xvc2VkLWNvbGxlY3Rpb24ucG5nJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb3BlbnNpZ24uc2V0QXR0cmlidXRlKCdzcmMnLCAnaW1hZ2VzL25vbi1jb2xsZWN0aW9uLnBuZycpOwotICAgIH07Ci0gICAgcmV0dXJuIG9wZW5zaWduOwotfTsKLQotVHJlZS5wcm90b3R5cGUuZ2V0T3BlblNpZ24gPSBmdW5jdGlvbihpdGVtKSB7Ci0gICAgLyogZ2V0IHRoZSBjbG9zZSBzaWduIGZvciBhIGNvbGxlY3Rpb24gKi8KLSAgICB2YXIgb3BlbnNpZ24gPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLSAgICBvcGVuc2lnbi5zZXRBdHRyaWJ1dGUoJ3NyYycsICdpbWFnZXMvb3BlbmVkLWNvbGxlY3Rpb24ucG5nJyk7Ci0gICAgcmV0dXJuIG9wZW5zaWduOwotfTsKLQotVHJlZS5wcm90b3R5cGUuZ2V0SWNvbiA9IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAvKiByZXR1cm4gYW4gaW1nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGZpbGUgdHlwZSAqLwotICAgIHJldHVybiB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZSgnXHhhMCcpOwotfTsKLQotLy9Sb290LnByb3RvdHlwZS5nZXRQYXRoID0gZnVuY3Rpb24oKSB7Ci0vLyAgICByZXR1cm4gJy8nICsgdGhpcy5pZDsgIC8vIEZJWE1FCi0vL307Ci0KLVRyZWUucHJvdG90eXBlLl9wb3NpdGlvbk1lbnUgPSBmdW5jdGlvbihldmVudCwgbWVudSkgewotICAgIHZhciBsZWZ0ID0gZXZlbnQubGF5ZXJYOwotICAgIHZhciB0b3AgPSBldmVudC5sYXllclk7Ci0gICAgbWVudS5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7Ci0gICAgbWVudS5zdHlsZS50b3AgPSB0b3AgKyAncHgnOwotfTsKLQotVHJlZS5wcm90b3R5cGUuZ2V0SXRlbUJ5UGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICAvKiByZXR1cm4gYW4gaXRlbSBieSBpdHMgcGF0aCAKLSAgICAKLSAgICAgICAgcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgZnJvbSB0aGUgY3VycmVudCBpdGVtLCBleGNsdWRpbmcgCi0gICAgICAgIHRoZSBjdXJyZW50IGl0ZW0ncyBpZAotICAgICovCi0gICAgLy8gaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYSBzbGFzaCwgcmVtb3ZlIGl0Ci0gICAgaWYgKHBhdGguY2hhckF0KDApID09ICcvJykgewotICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMSk7Ci0gICAgfTsKLSAgICBpZiAocGF0aCA9PSB0aGlzLnJvb3QuaWQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucm9vdDsKLSAgICB9Ci0gICAgaWYgKHBhdGguaW5kZXhPZih0aGlzLnJvb3QuaWQpID09IDApIHsKLSAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKHRoaXMucm9vdC5pZC5sZW5ndGgrMSk7Ci0gICAgICAgIHJldHVybiB0aGlzLnJvb3QuZ2V0SXRlbUJ5UGF0aChwYXRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfTsKLQotLy8gQ29waWVkIGZyb20gaGVscGVycy5qcyB0byBub3QgaGF2ZSBhIGRlcGVuZGVuY3kKLWZ1bmN0aW9uIENvbnRleHRGaXhlcihmdW5jLCBjb250ZXh0KSB7Ci0gICAgLyogTWFrZSBzdXJlICd0aGlzJyBpbnNpZGUgYSBtZXRob2QgcG9pbnRzIHRvIGl0cyBjbGFzcyAqLwotICAgIHRoaXMuZnVuYyA9IGZ1bmM7Ci0gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB0aGlzLmFyZ3MgPSBhcmd1bWVudHM7Ci0gICAgdmFyIHNlbGYgPSB0aGlzOwotICAgIAotICAgIHRoaXMuZXhlY3V0ZSA9IGZ1bmN0aW9uKCkgewotICAgICAgICAvKiBleGVjdXRlIHRoZSBtZXRob2QgKi8KLSAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgLy8gdGhlIGZpcnN0IGFyZ3VtZW50cyB3aWxsIGJlIHRoZSBleHRyYSBvbmVzIG9mIHRoZSBjbGFzcwotICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCBzZWxmLmFyZ3MubGVuZ3RoIC0gMjsgaSsrKSB7Ci0gICAgICAgICAgICBhcmdzLnB1c2goc2VsZi5hcmdzW2kgKyAyXSk7Ci0gICAgICAgIH07Ci0gICAgICAgIC8vIHRoZSBsYXN0IGFyZSB0aGUgb25lcyBwYXNzZWQgb24gdG8gdGhlIGV4ZWN1dGUgbWV0aG9kCi0gICAgICAgIGZvciAodmFyIGk9MDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7Ci0gICAgICAgIH07Ci0gICAgICAgIHJldHVybiBzZWxmLmZ1bmMuYXBwbHkoc2VsZi5jb250ZXh0LCBhcmdzKTsKLSAgICB9OwotfTsKLQotLy8gdGhpcyBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCByZWdpc3RlcmVkIGV2ZW50IGhhbmRsZXJzIGdldCBhIHVuaXF1ZQotLy8gaWQsIHRoaXMgaWQgd2lsbCBiZSByZXR1cm5lZCBieSBhZGRFdmVudEhhbmRsZXIgYW5kIGNhbiBiZSB1c2VkIHRvIHJlbW92ZQotLy8gdGhlIGV2ZW50IGhhbmRsZXIgbGF0ZXIgb24KLS8vIG9mIGNvdXJzZSB5b3UgKm11c3QgbmV2ZXIqIGNoYW5nZSB0aGlzIGlkIQotTEFTVF9IQU5ETEVSX0lEID0gMDsKLQotLy8gYSBtYXBwaW5nIGZyb20gaWQgdG8gaGFuZGxlciAocmVxdWlyZWQgYmVjYXVzZSB0aGUgaGFuZGxlcnMgYXJlIHdyYXBwZWQKLS8vIGJlZm9yZSB0aGV5J3JlIHJlZ2lzdGVyZWQsIGFuZCB0aGUgbWFwcGVkIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUKLS8vIGNsaWVudCwgd2hpbGUgaXQgaXMgcmVxdWlyZWQgZm9yIGRlLXJlZ2lzdGVyaW5nIHRoZSBldmVudCBsYXRlciBvbgotLy8gbmVlZGxlc3MgdG8gc2F5IHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRvdWNoZWQuLi4KLUlEX1RPX0hBTkRMRVIgPSB7fTsKLQotZnVuY3Rpb24gYWRkRXZlbnRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBtZXRob2QsIGNvbnRleHQpIHsKLSAgICAvKiBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGJvdGggSUUgYW5kIE1vemlsbGEgKi8KLSAgICB2YXIgd3JhcHBlZG1ldGhvZCA9IG5ldyBDb250ZXh0Rml4ZXIobWV0aG9kLCBjb250ZXh0KTsKLSAgICAKLSAgICAvLyBzdG9yZSBpdCwgcmV0dXJuIHRoZSBpZCwgdGhhdCBjYW4gYmUgdXNlZCB0byBkZS1yZWdpc3RlciB0aGUKLSAgICAvLyBoYW5kbGVyIGxhdGVyIG9uCi0gICAgdmFyIGlkID0gTEFTVF9IQU5ETEVSX0lEKys7Ci0gICAgSURfVE9fSEFORExFUltpZF0gPSB3cmFwcGVkbWV0aG9kOwotICAgIAotICAgIHZhciBhcmdzID0gbmV3IEFycmF5KG51bGwsIG51bGwpOwotICAgIGZvciAodmFyIGk9NDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKLSAgICB9OwotICAgIHdyYXBwZWRtZXRob2QuYXJncyA9IGFyZ3M7Ci0gICAgdHJ5IHsKLSAgICAgICAgaWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewotICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCB3cmFwcGVkbWV0aG9kLmV4ZWN1dGUsIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmF0dGFjaEV2ZW50KSB7Ci0gICAgICAgICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIgKyBldmVudCwgd3JhcHBlZG1ldGhvZC5leGVjdXRlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93ICJVbnN1cHBvcnRlZCBicm93c2VyISI7Ci0gICAgICAgIH07Ci0gICAgfSBjYXRjaChlKSB7Ci0gICAgICAgIGFsZXJ0KCdleGNlcHRpb24gJyArIGUubWVzc2FnZSArICcgd2hpbGUgcmVnaXN0ZXJpbmcgYW4gZXZlbnQgaGFuZGxlciBmb3IgZWxlbWVudCAnICsgZWxlbWVudCArICcsIGV2ZW50ICcgKyBldmVudCArICcsIG1ldGhvZCAnICsgbWV0aG9kKTsKLSAgICB9OwotCi0gICAgcmV0dXJuIGlkOwotfTsKLQotZnVuY3Rpb24gcmVtb3ZlRXZlbnRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBpZCkgewotICAgIC8qIG1ldGhvZCB0byByZW1vdmUgYW4gZXZlbnQgaGFuZGxlciBmb3IgYm90aCBJRSBhbmQgTW96aWxsYSAqLwotICAgIHZhciBtZXRob2QgPSBJRF9UT19IQU5ETEVSW2lkXS5leGVjdXRlOwotICAgIGlmIChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHsKLSAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBtZXRob2QsIGZhbHNlKTsKLSAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZGV0YWNoRXZlbnQpIHsKLSAgICAgICAgZWxlbWVudC5kZXRhY2hFdmVudCgib24iICsgZXZlbnQsIG1ldGhvZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgIlVuc3VwcG9ydGVkIGJyb3dzZXIhIjsKLSAgICB9OwotfTsKLQotU3RyaW5nLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBzdHJpcHNwYWNlID0gL15ccyooW1xzXFNdKj8pXHMqJC87Ci0gICAgcmV0dXJuIHN0cmlwc3BhY2UuZXhlYyh0aGlzKVsxXTsKLX07Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9zY2hlbWFzL3NpdGV0cmVlLnhzZCBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9zY2hlbWFzL3NpdGV0cmVlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4MzcyNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvc2NoZW1hcy9zaXRldHJlZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogc2l0ZXRyZWUueHNkIDQyNzAzIDIwMDQtMDMtMTMgMTI6NTc6NTNaIGdyZWdvciAkIC0tPgotCi08IURPQ1RZUEUgc2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLmR0ZCI+Ci08eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3NpdGV0cmVlLzEuMCIgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9zaXRldHJlZS8xLjAiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzaXRlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ibm9kZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ibm9kZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImxhYmVsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJub2RlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsaW5rIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ibGFiZWwiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2ltcGxlQ29udGVudD4KLQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCTx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotCQkJCTwveHM6ZXh0ZW5zaW9uPgotCQkJPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDI0MGI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbmF2aWdhdGlvbi54bWFwIDIwODY4MCAyMDA1LTA2LTMwIDIwOjI4OjU5WiBjaGVzdG51dCAkIC0tPgotCi08IS0tCi1UaGlzIHNpdGVtYXAgY3JlYXRlcyBkZWZhdWx0IG5hdmlnYXRpb24gY29tcG9uZW50cy4KLS0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gIDxtYXA6Y29tcG9uZW50cz4KLSAgICA8bWFwOm1hdGNoZXJzIGRlZmF1bHQ9IndpbGRjYXJkIj4KLSAgICAgIDxtYXA6bWF0Y2hlciBuYW1lPSJsYW5ndWFnZSIgbG9nZ2VyPSJzaXRlbWFwLm1hdGNoZXIud2lsZGNhcmRyZXF1ZXN0cGFyYW1ldGVyIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLm1hdGNoaW5nLldpbGRjYXJkUmVxdWVzdFBhcmFtZXRlck1hdGNoZXIiPgotICAgICAgICA8cGFyYW1ldGVyLW5hbWU+bGVueWEubGFuZ3VhZ2U8L3BhcmFtZXRlci1uYW1lPgotICAgICAgPC9tYXA6bWF0Y2hlcj4KLSAgICAgIDxtYXA6bWF0Y2hlciBuYW1lPSJ0YWIiIGxvZ2dlcj0ic2l0ZW1hcC5tYXRjaGVyLndpbGRjYXJkcmVxdWVzdHBhcmFtZXRlciIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5tYXRjaGluZy5XaWxkY2FyZFJlcXVlc3RQYXJhbWV0ZXJNYXRjaGVyIj4KLSAgICAgICAgPHBhcmFtZXRlci1uYW1lPmxlbnlhLmluZm8tdGFiPC9wYXJhbWV0ZXItbmFtZT4KLSAgICAgIDwvbWFwOm1hdGNoZXI+Ci0gICAgPC9tYXA6bWF0Y2hlcnM+Ci0gICAgPG1hcDp0cmFuc2Zvcm1lcnMgZGVmYXVsdD0ieHNsdCI+Ci0gICAgICA8bWFwOnRyYW5zZm9ybWVyIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC50cmFuc2Zvcm1lci51dWlkMnVybCIgbmFtZT0idXVpZDJ1cmwtc2l0ZXRyZWUiCi0gICAgICAgIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uLlV1aWRUb1VybFRyYW5zZm9ybWVyIj4KLSAgICAgICAgPHVybHMgdHlwZT0icmVsYXRpdmUiLz4KLSAgICAgICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9uYXZpZ2F0aW9uLzEuMCIgZWxlbWVudD0ibm9kZSIgYXR0cmlidXRlPSJocmVmIi8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm1lcj4KLSAgICAgIDxtYXA6dHJhbnNmb3JtZXIgbG9nZ2VyPSJsZW55YS5zaXRlbWFwLnRyYW5zZm9ybWVyLnByb3h5IiBuYW1lPSJwcm94eS1zaXRldHJlZSIKLSAgICAgICAgICBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5Qcm94eVRyYW5zZm9ybWVyIj4KLSAgICAgICAgPHRyYW5zZm9ybSBuYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9uYXZpZ2F0aW9uLzEuMCIgZWxlbWVudD0ic2l0ZSIgYXR0cmlidXRlPSJocmVmIi8+Ci0gICAgICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbmF2aWdhdGlvbi8xLjAiIGVsZW1lbnQ9Im5vZGUiIGF0dHJpYnV0ZT0iaHJlZiIvPgotICAgICAgPC9tYXA6dHJhbnNmb3JtZXI+Ci0gICAgPC9tYXA6dHJhbnNmb3JtZXJzPgotICA8L21hcDpjb21wb25lbnRzPgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGlwZWxpbmVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAKLSAgPG1hcDpyZXNvdXJjZXM+Ci0gICAgCi0gICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJpMThuIj4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPiAgICAgIAotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgPC9tYXA6cmVzb3VyY2U+Ci0gIAotICA8L21hcDpyZXNvdXJjZXM+Ci0gIAotICA8bWFwOnBpcGVsaW5lcz4KLSAgCi0gICAgPG1hcDpwaXBlbGluZSB0eXBlPSJjYWNoaW5nIj4KLSAgICAgIAotICAgICAgPCEtLSBzaXRldHJlZSAtLT4KLSAgICAgIDwhLS0gcGF0dGVybjogc2l0ZXRyZWUvezE6cHViLWlkfS97MjphcmVhfS97MzpkZWZhdWx0LWxhbmd1YWdlfS97NDpsYW5ndWFnZX0vezU6cGF0aH0ueG1sIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJzaXRldHJlZS8qLyovKi8qLyoqLnhtbCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJsZW55YTovL2xlbnlhL3B1YnMvezF9L2NvbnRlbnQvezJ9L3NpdGV0cmVlLnhtbCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vc2l0ZXRyZWUybmF2LnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY3VycmVudFBhdGgiIHZhbHVlPSIvezV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9InsyfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNob3Nlbmxhbmd1YWdlIiB2YWx1ZT0iezR9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZGVmYXVsdGxhbmd1YWdlIiB2YWx1ZT0iezN9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4gICAgICAgCi0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgCi0gICAgICA8IS0tIG5hdmlnYXRpb24gZWxlbWVudCAtLT4gIAotICAgICAgPCEtLSBwYXR0ZXJuOiB7MTpuYXYtZWxlbWVudH0vezI6cHViLWlkfS97MzphcmVhfS97NDpkZWZhdWx0LWxhbmd1YWdlfS97NTpsYW5ndWFnZX0vezY6cGF0aH0ueG1sIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovKi8qLyovKioueG1sIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvY29vbjovc2l0ZXRyZWUvezJ9L3szfS97NH0vezV9L3s2fS54bWwiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvc2l0ZXRyZWUveHNsdC9uYXZpZ2F0aW9uL3sxfS54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJ7M30iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJyb290IiB2YWx1ZT0iL3syfS97M30vIi8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY2hvc2VubGFuZ3VhZ2UiIHZhbHVlPSJ7NX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkZWZhdWx0bGFuZ3VhZ2UiIHZhbHVlPSJ7NH0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPiAgICAgICAKLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgCi0gICAgPCEtLSB1c2VjYXNlcyAtLT4KLSAgICA8IS0tIFNpdGV0cmVlIEphdmFzY3JpcHQgYXJyYXkgLS0+Ci0gICAgPG1hcDpwaXBlbGluZSB0eXBlPSJub25jYWNoaW5nIj4KLSAgICAgIAotICAgICAgPCEtLSB7cHVibGljYXRpb24taWR9L3thcmVhfS9zaXRldHJlZS54bWwgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKi9zaXRldHJlZS54bWwiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0ibGVueWE6Ly9sZW55YS9wdWJzL3sxfS9jb250ZW50L3syfS9zaXRldHJlZS54bWwiLz4KLSAgICAgICAgPG1hcDpjYWxsIHJlc291cmNlPSJpMThuIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImFjY2Vzcy1jb250cm9sLXNpdGV0cmVlIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbi1pZCIgdmFsdWU9InsxfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJ7Mn0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRldHJlZS94c2x0L2luZm8vc2l0ZXRyZWUyYXJlYXRyZWUueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhcmVhIiB2YWx1ZT0iezJ9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSB7cHVibGljYXRpb24taWR9L3thcmVhfS9pbmZvLXNpdGV0cmVlIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovc2l0ZXRyZWUtZnJhZ21lbnQueG1sIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJzaXRldHJlZS1mcmFnbWVudCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYXMiIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTphcmVhc30iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhcmVhIiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06YXJlYX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYXRoIiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06cGF0aH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJpbml0aWFsIiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06aW5pdGlhbH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJtaW1ldHlwZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOm1pbWV0eXBlfSIvPgotICAgICAgICA8L21hcDpnZW5lcmF0ZT4KLSAgICAgICAgPCEtLSA8bWFwOmNhbGwgcmVzb3VyY2U9ImkxOG4iLz4gLS0+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImFjY2Vzcy1jb250cm9sLXNpdGV0cmVlIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbi1pZCIgdmFsdWU9InsxfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJ7Mn0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOmFjdCB0eXBlPSJzZXQtaGVhZGVyIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJDYWNoZS1Db250cm9sIiB2YWx1ZT0icHJlLWNoZWNrPTAiIC8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iRXhwaXJlcyIgdmFsdWU9Ii0xIiAvPgotICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9zaXRldHJlZTJuYXYueHNsIiBsYWJlbD0ibmF2dHJlZSI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY2hvc2VubGFuZ3VhZ2UiIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpsYW5ndWFnZX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkZWZhdWx0bGFuZ3VhZ2UiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkZWZhdWx0LWxhbmd1YWdlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImV4dGVuc2lvbiIgdmFsdWU9Imh0bWwiLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0idXVpZDJ1cmwtc2l0ZXRyZWUiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icHJveHktc2l0ZXRyZWUiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgICA8IS0tIFNpdGV0cmVlIEphdmFzY3JpcHQgICAtLT4KLSAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovKi5qcyI+Ci0gICAgICAgIDxtYXA6cmVhZCBzcmM9InJlc291cmNlcy9qYXZhc2NyaXB0L3szfS5qcyIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ0ZXh0Ii8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgICA8IS0tIFJlc291cmNlIHR5cGUgaWNvbnMgLS0+Ci0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovZm9sZGVyLmdpZiI+Ci0gICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9zaXRldHJlZS9yZXNvdXJjZXMvaWNvbnMvZm9sZGVyLmdpZiIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qL2RlZmF1bHQuZ2lmIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9pY29ucy9kZWZhdWx0LmdpZiIvPgotICAgICAgPC9tYXA6bWF0Y2g+IAotIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovKiouZ2lmIj4KLSAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icGFyYW1ldGVyIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXItc2VsZWN0b3ItdGVzdCIKLSAgICAgICAgICAgIHZhbHVlPSJ7cmVzb3VyY2UtdHlwZTp7ZG9jLWluZm86ezF9OnsyfTp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfTp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX06cmVzb3VyY2VUeXBlfTpzdXBwb3J0c0Zvcm1hdDppY29ufSIvPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImxlbnlhLWRvY3VtZW50OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9LGxhbmc9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9LGFyZWE9ezJ9LHB1Yj17MX0/Zm9ybWF0PWljb24iLz4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICAgIDxtYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3NpdGV0cmVlL3Jlc291cmNlcy9pY29ucy9kZWZhdWx0LmdpZiIvPgotICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLQotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3RhcmdldHMvdGVzdC1idWlsZC54bWwgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS90YXJnZXRzL3Rlc3QtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODZhNzQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3RhcmdldHMvdGVzdC1idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdGVzdC1idWlsZC54bWwgMjA5MjkzIDIwMDUtMDctMDUgMTY6MTk6MThaIGFuZHJlYXMgJCAtLT4KLQotPHByb2plY3QgbmFtZT0ibW9kdWxlLXNpdGV0cmVlLXRlc3QiPgotICAKLSAgPHRhcmdldCBuYW1lPSJ0ZXN0Ij4KLSAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIHNob3dvdXRwdXQ9InRydWUiIGhhbHRvbmVycm9yPSJvbiIgaGFsdG9uZmFpbHVyZT0ib24iPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9saWIiIGluY2x1ZGVzPSIqLmphciwgZW5kb3JzZWQvKi5qYXIiLz4KLSAgICAgICAgPHBhdGggbG9jYXRpb249IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2NsYXNzZXMiLz4KLSAgICAgICAgPHBhdGggbG9jYXRpb249IiR7YnVpbGQudGVzdH0iLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiIC8+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIgLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Imp1bml0LnRlc3QubG9nbGV2ZWwiIHZhbHVlPSIke2p1bml0LnRlc3QubG9nbGV2ZWx9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJjb250ZXh0Um9vdCIgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQvbGVueWEvd2ViYXBwIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ0ZW1wRGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9idWlsZC9sZW55YS90ZW1wIi8+Ci0gICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnRyZWUuU2l0ZVRyZWVOb2RlSW1wbFRlc3QiIHRvZGlyPSIke2p1bml0LmRpcn0iLz4KLSAgICAgIDx0ZXN0IG5hbWU9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudHJlZS5EZWZhdWx0U2l0ZVRyZWVUZXN0IiB0b2Rpcj0iJHtqdW5pdC5kaXJ9Ii8+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgotICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS90ZXN0L2Nhbm9vL3Rlc3QueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUvdGVzdC9jYW5vby90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2ZmRhMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS90ZXN0L2Nhbm9vL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCFET0NUWVBFIHByb2plY3QgU1lTVEVNICIuLi8uLi8uLi8uLi9tb2R1bGVzL2RldmVsb3BtZW50L3Rlc3QvY2Fub28vbGVueWFfd2VidGVzdC5kdGQiPgotCi08cHJvamVjdCBuYW1lPSJzaXRldHJlZSIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+Ci0gIAotICA8aW1wb3J0IGZpbGU9Ii4uLy4uLy4uLy4uL21vZHVsZXMvZGV2ZWxvcG1lbnQvdGVzdC9jYW5vby9tYWNyb3MueG1sIi8+Ci0gICAgCi0gIDx0YXJnZXQgbmFtZT0ibWFpbiI+Ci0gICAgPHdlYnRlc3QgbmFtZT0ic2l0ZXRyZWUubnVkZ2UiPgotICAgICAgJmRvQ29uZmlnOwotICAgICAgPHN0ZXBzPgotICAgICAgICA8ZG9Mb2dpbiB1c2VybmFtZT0ibGVueWEiIHBhc3N3b3JkPSJsZXZpIi8+Ci0gICAgICAgIAotICAgICAgICA8dmVyaWZ5WFBhdGggeHBhdGg9Ii8vZGl2W0BjbGFzcyA9ICdtZW51YmxvY2stMScgYW5kIC4vZGl2L2FbQGhyZWY9Jy9kZWZhdWx0L2F1dGhvcmluZy9saW5rcy5odG1sJ10gYW5kIGZvbGxvd2luZy1zaWJsaW5nOjpkaXZbQGNsYXNzPSdtZW51YmxvY2stMScgYW5kIC4vZGl2L2FbQGhyZWY9Jy9kZWZhdWx0L2F1dGhvcmluZy9mZWF0dXJlcy5odG1sJ11dXSIvPgotICAgICAgICAKLSAgICAgICAgPGludm9rZSB1cmw9ImxpbmtzLmh0bWw/bGVueWEudXNlY2FzZT1zaXRldHJlZS5udWRnZSZhbXA7ZGlyZWN0aW9uPWRvd24iLz4KLSAgICAgICAgPGludm9rZSB1cmw9ImluZGV4Lmh0bWwiLz4KLSAgICAgICAgPHZlcmlmeVhQYXRoIHhwYXRoPSIvL2RpdltAY2xhc3MgPSAnbWVudWJsb2NrLTEnIGFuZCAuL2Rpdi9hW0BocmVmPScvZGVmYXVsdC9hdXRob3JpbmcvZmVhdHVyZXMuaHRtbCddIGFuZCBmb2xsb3dpbmctc2libGluZzo6ZGl2W0BjbGFzcz0nbWVudWJsb2NrLTEnIGFuZCAuL2Rpdi9hW0BocmVmPScvZGVmYXVsdC9hdXRob3JpbmcvbGlua3MuaHRtbCddXV0iLz4KLQotICAgICAgICA8aW52b2tlIHVybD0ibGlua3MuaHRtbD9sZW55YS51c2VjYXNlPXNpdGV0cmVlLm51ZGdlJmFtcDtkaXJlY3Rpb249dXAiLz4KLSAgICAgICAgPGludm9rZSB1cmw9ImluZGV4Lmh0bWwiLz4KLSAgICAgICAgPHZlcmlmeVhQYXRoIHhwYXRoPSIvL2RpdltAY2xhc3MgPSAnbWVudWJsb2NrLTEnIGFuZCAuL2Rpdi9hW0BocmVmPScvZGVmYXVsdC9hdXRob3JpbmcvbGlua3MuaHRtbCddIGFuZCBmb2xsb3dpbmctc2libGluZzo6ZGl2W0BjbGFzcz0nbWVudWJsb2NrLTEnIGFuZCAuL2Rpdi9hW0BocmVmPScvZGVmYXVsdC9hdXRob3JpbmcvZmVhdHVyZXMuaHRtbCddXV0iLz4KLSAgICAgICAgCi0gICAgICAgIDxkb0xvZ291dC8+Ci0gICAgICA8L3N0ZXBzPgotICAgIDwvd2VidGVzdD4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS94c2x0L2luZm8vc2l0ZXRyZWUyYXJlYXRyZWUueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUveHNsdC9pbmZvL3NpdGV0cmVlMmFyZWF0cmVlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlOGNmYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS94c2x0L2luZm8vc2l0ZXRyZWUyYXJlYXRyZWUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBzaXRldHJlZTJhcmVhdHJlZS54c2wgNDI3MDMgMjAwNC0wMy0xMyAxMjo1Nzo1M1ogZ3JlZ29yICQgLS0+Ci0KLTwhLS0KLSAgICAgICAgQWRkcyBhbiBhcmVhIGF0dHJpYnV0ZSB0byBhIHNpdGV0cmVlIHJvb3QgZWxlbWVudC4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zOnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9zaXRldHJlZS8xLjAiCi0gICAgPgotCi08eHNsOnBhcmFtIG5hbWU9ImFyZWEiLz4KLSAgIAotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iczpzaXRlIj4KLQk8czpzaXRlIGFyZWE9InskYXJlYX0iPgotCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSJAKiIvPgotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0JPC9zOnNpdGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQkKLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLQk8eHNsOmNvcHk+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz48L3hzbDpjb3B5PgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUveHNsdC9uYXZpZ2F0aW9uL2JyZWFkY3J1bWIueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUveHNsdC9uYXZpZ2F0aW9uL2JyZWFkY3J1bWIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmZjMTU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9icmVhZGNydW1iLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogYnJlYWRjcnVtYi54c2wgNDI3MDMgMjAwNC0wMy0xMyAxMjo1Nzo1M1ogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczpuYXY9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9uYXZpZ2F0aW9uLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJuYXYiCi0gID4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5hdjpzaXRlIj4KLSAgICA8ZGl2IGlkPSJicmVhZGNydW1iIj4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibmF2Om5vZGUiLz4KLSAgICA8L2Rpdj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmF2Om5vZGUiPgotICAgIDx4c2w6aWYgdGVzdD0iZGVzY2VuZGFudC1vci1zZWxmOjpuYXY6bm9kZVtAY3VycmVudCA9ICd0cnVlJ10iPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcGFyYXRvciIvPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0ZXAiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibmF2Om5vZGUiLz4KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdGVwIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAY3VycmVudCA9ICd0cnVlJyI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibmF2OmxhYmVsIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgIDxhIGhyZWY9IntAaHJlZn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibmF2OmxhYmVsIi8+PC9hPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmF2OmxhYmVsIj4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9InNlcGFyYXRvciI+Ci0gICAgJiN4MDBCQjsKLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9tZW51LnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9tZW51LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4ZTRlZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vbWVudS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG1lbnUueHNsIDQyNzAzIDIwMDQtMDMtMTMgMTI6NTc6NTNaIGdyZWdvciAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zOm5hdj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL25hdmlnYXRpb24vMS4wIgotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJuYXYiCi0gICAgPgotICAgIAotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJuYXY6c2l0ZSI+Ci0gIDxkaXYgaWQ9Im1lbnUiPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibmF2Om5vZGUiLz4KLSAgPC9kaXY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmF2Om5vZGVbQHZpc2libGVpbm5hdiA9ICdmYWxzZSddIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5hdjpub2RlIj4KLSAgPHhzbDpjaG9vc2U+Ci0gICAgPHhzbDp3aGVuIHRlc3Q9ImRlc2NlbmRhbnQtb3Itc2VsZjo6bmF2Om5vZGVbQGN1cnJlbnQgPSAndHJ1ZSddIj4KLSAgICAgIDxkaXYgY2xhc3M9Im1lbnVibG9jay1zZWxlY3RlZC17Y291bnQoYW5jZXN0b3Itb3Itc2VsZjo6bmF2Om5vZGUpfSI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpdGVtIi8+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibmF2Om5vZGUiLz4KLSAgICAgIDwvZGl2PgotICAgIDwveHNsOndoZW4+Ci0gICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICA8ZGl2IGNsYXNzPSJtZW51YmxvY2ste2NvdW50KGFuY2VzdG9yLW9yLXNlbGY6Om5hdjpub2RlKX0iPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaXRlbSIvPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im5hdjpub2RlIi8+Ci0gICAgICA8L2Rpdj4KLSAgICA8L3hzbDpvdGhlcndpc2U+Ci0gIDwveHNsOmNob29zZT4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iaXRlbSI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGN1cnJlbnQgPSAndHJ1ZSciPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaXRlbS1zZWxlY3RlZCIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaXRlbS1kZWZhdWx0Ii8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpdGVtLWRlZmF1bHQiPgotICA8ZGl2IGNsYXNzPSJtZW51aXRlbS17Y291bnQoYW5jZXN0b3Itb3Itc2VsZjo6bmF2Om5vZGUpfSI+Ci0gICAgPGEgaHJlZj0ie0BocmVmfSI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJuYXY6bGFiZWwiLz48L2E+Ci0gIDwvZGl2PgotPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgCi08eHNsOnRlbXBsYXRlIG5hbWU9Iml0ZW0tc2VsZWN0ZWQiPgotICA8ZGl2IGNsYXNzPSJtZW51aXRlbS1zZWxlY3RlZC17Y291bnQoYW5jZXN0b3Itb3Itc2VsZjo6bmF2Om5vZGUpfSI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJuYXY6bGFiZWwiLz4KLSAgPC9kaXY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJuYXY6bGFiZWwiPgotICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICA8eHNsOmNvcHk+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgPC94c2w6Y29weT4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc2l0ZXRyZWUveHNsdC9uYXZpZ2F0aW9uL3NlYXJjaC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vc2VhcmNoLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkZGUxNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vc2VhcmNoLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogc2VhcmNoLnhzbCA3NjAxOSAyMDA0LTExLTE2IDIwOjEzOjMyWiBncmVnb3IgJCAtLT4KLQotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6bmF2PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbmF2aWdhdGlvbi8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ibmF2IgotICA+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJuYXY6c2l0ZSI+Ci0gICAgPGRpdiBpZD0ic2VhcmNoIj4KLSAgICAgIDxmb3JtIGFjdGlvbj0iPyIgaWQ9ImZvcm0tc2VhcmNoIj4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGlucHV0IGNsYXNzPSJzZWFyY2hmaWVsZCIgdHlwZT0idGV4dCIgbmFtZT0icXVlcnlTdHJpbmciIGFsdD0iU2VhcmNoIGZpZWxkIi8+Ci0gICAgICAgICAgPHNlbGVjdCBuYW1lPSJsZW55YS51c2VjYXNlIj4KLSAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQ9InRydWUiIHZhbHVlPSJsdWNlbmUuc2VhcmNoIj5JbnRlcm5hbDwvb3B0aW9uPgotICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibHVjZW5lLmV4dGVybmFsT3BlbnNlYXJjaCI+RXh0ZXJuYWw8L29wdGlvbj4KLSAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iMjAiIG5hbWU9InBhZ2VMZW5ndGgiLz4KLSAgICAgICAgICA8aW5wdXQgY2xhc3M9InNlYXJjaHN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIG5hbWU9ImlucHV0LWdvIi8+Ci0gICAgICAgIDwvcD4KLSAgICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vc2l0ZXRyZWUybmF2LnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9zaXRldHJlZTJuYXYueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2FhNzA4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9zaXRldHJlZTJuYXYueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogc2l0ZXRyZWUybmF2LnhzbCAxNTMwNDQgMjAwNS0wMi0wOSAwOTozMjo1OVogbWljaGkgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0Ci0gICAgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zOnRyZWU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9zaXRldHJlZS8xLjAiCi0gICAgeG1sbnM6bmF2PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbmF2aWdhdGlvbi8xLjAiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ0cmVlIj4KLQotICA8eHNsOnBhcmFtIG5hbWU9ImNob3Nlbmxhbmd1YWdlIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iZGVmYXVsdGxhbmd1YWdlIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY3VycmVudFBhdGgiLz4KLSAgCi0gIDwhLS0KLSAgICBGb3JjZSBhIHNwZWNpZmljIGV4dGVuc2lvbiBmb3Igbm9kZSBVUkxzLiBUaGlzIGJ5cGFzc2VzIHJlc29sdmluZyB0aGUgYWN0dWFsIGV4dGVuc2lvbi4KLSAgICBXZSdyZSBzZXR0aW5nIHRoaXMgdG8gJ2h0bWwnIGJ5IGRlZmF1bHQgYmVjYXVzZSByZXNvbHZpbmcgdGhlIGFjdHVhbCBleHRlbnNpb24gaXMgcXVpdGUgZXhwZW5zaXZlLgotICAtLT4KLSAgPHhzbDpwYXJhbSBuYW1lPSJleHRlbnNpb24iPmh0bWw8L3hzbDpwYXJhbT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRyZWU6ZnJhZ21lbnQiPgotICAgIDxuYXY6ZnJhZ21lbnQ+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAKiIvPgotICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYmFzZSI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50UGF0aCIgc2VsZWN0PSJAYmFzZSIvPgotICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC9uYXY6ZnJhZ21lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idHJlZTpzaXRlIj4KLSAgICA8bmF2OnNpdGUgaHJlZj0iL3svdHJlZTpmcmFnbWVudC9AcHVibGljYXRpb259L3tAYXJlYX0iIGxhYmVsPSJ7QGFyZWF9LWFyZWEiIGkxOG46YXR0cj0ibGFiZWwiPgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCpbbG9jYWwtbmFtZSgpICE9ICdsYWJlbCddIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9uYXY6c2l0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotUmVzb2x2ZXMgdGhlIGV4aXN0aW5nIGxhbmd1YWdlIG9mIGEgbm9kZSwgcHJlZmVycmFibHkKLXRoZSBkZWZhdWx0IGxhbmd1YWdlLgotLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0icmVzb2x2ZS1leGlzdGluZy1sYW5ndWFnZSI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0idHJlZTpsYWJlbFtsYW5nKCRjaG9zZW5sYW5ndWFnZSldIj4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaG9zZW5sYW5ndWFnZSIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJ0cmVlOmxhYmVsW2xhbmcoJGRlZmF1bHRsYW5ndWFnZSldIj4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZWZhdWx0bGFuZ3VhZ2UiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyZWU6bGFiZWwvQHhtbDpsYW5nIi8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tCi1BcHBseSBub2RlcyByZWN1cnNpdmVseQotLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRyZWU6bm9kZVtub3QoQHZpc2libGUgPSAnZmFsc2UnKV0iPgotCi0gICAgPCEtLSBiYXNlIHBhdGggb2YgcGFyZW50IG5vZGUgLS0+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnRQYXRoIiBzZWxlY3Q9IicnIi8+Ci0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImV4aXN0aW5nbGFuZ3VhZ2UiPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlc29sdmUtZXhpc3RpbmctbGFuZ3VhZ2UiLz4KLSAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgIDxuYXY6bm9kZT4KLQotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIi8+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAdmlzaWJsZWlubmF2Ii8+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAcHJvdGVjdGVkIi8+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAZm9sZGVyIi8+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAdXVpZCIvPgotICAgICAgCi0gICAgICA8IS0tIGJhc2UgcGF0aCAtIGZvciBhbGwgbm9kZXMgLS0+Ci0KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGF0aCIgc2VsZWN0PSJjb25jYXQoJHBhcmVudFBhdGgsICcvJywgQGlkKSIvPgotICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXRoIi8+PC94c2w6YXR0cmlidXRlPgotCi0gICAgICA8IS0tIHN1ZmZpeCAtIG9ubHkgd2hlbiBAaHJlZiBpcyBub3QgcHJlc2VudCAtLT4KLQotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlbnNpb25QYXJhbSI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXh0ZW5zaW9uIj4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4/dXVpZDJ1cmwuZXh0ZW5zaW9uPTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbnNpb24iLz4KLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAc3VmZml4Ij4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4/dXVpZDJ1cmwuZXh0ZW5zaW9uPTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdWZmaXgiLz4KLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgIAotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhcmVhIiBzZWxlY3Q9ImFuY2VzdG9yOjp0cmVlOmZyYWdtZW50L0BhcmVhIi8+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFyZWFQYXJhbSI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGFyZWEiPgotICAgICAgICAgIDx4c2w6dGV4dD4sYXJlYT08L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXJlYSIvPgotICAgICAgICA8L3hzbDppZj4KLSAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICA8eHNsOmlmIHRlc3Q9IiRjdXJyZW50UGF0aCA9ICRwYXRoIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY3VycmVudCI+dHJ1ZTwveHNsOmF0dHJpYnV0ZT4KLSAgICAgIDwveHNsOmlmPgotCi0gICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBocmVmIj4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiIvPgotICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB1dWlkIj4KLSAgICAgICAgICAgIDx4c2w6dGV4dD5sZW55YS1kb2N1bWVudDo8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1dWlkIi8+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+LGxhbmc9PC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4aXN0aW5nbGFuZ3VhZ2UiLz4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXJlYVBhcmFtIi8+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuc2lvblBhcmFtIi8+Ci0gICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgPC94c2w6YXR0cmlidXRlPgotCi0gICAgICA8eHNsOmlmIHRlc3Q9IkBtaW1ldHlwZSI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1pbWV0eXBlIj4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1pbWV0eXBlIi8+Ci0gICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgIDwveHNsOmlmPgotCi0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InRyZWU6bGFiZWxbbGFuZygkZXhpc3RpbmdsYW5ndWFnZSldIj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRyZWU6bGFiZWxbbGFuZygkZXhpc3RpbmdsYW5ndWFnZSldIi8+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idHJlZTpsYWJlbFsxXSIvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idHJlZTpub2RlIj4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudFBhdGgiIHNlbGVjdD0iJHBhdGgiLz4KLSAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLQotICAgIDwvbmF2Om5vZGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idHJlZTpsYWJlbCI+Ci0gICAgPG5hdjpsYWJlbD4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IkAqIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9uYXY6bGFiZWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIiBwcmlvcml0eT0iLTEiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi90YWJzLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi90YWJzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMWM3Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vdGFicy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB0YWJzLnhzbCAxODk4ODAgMjAwNS0wNi0xMCAwMjozNjowOVogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM6bmF2PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbmF2aWdhdGlvbi8xLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9Im5hdiIKLSAgICA+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmF2OnNpdGUiPgotCi0gIDxkaXYgaWQ9InRhYnMiPgotCi0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByZS1zZXBhcmF0b3IiLz4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibmF2Om5vZGUiPgotICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICZndDsgMSBhbmQgQHZpc2libGVpbm5hdiA9ICd0cnVlJyI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZXBhcmF0b3IiLz4KLSAgICAgIDwveHNsOmlmPgotICAgICAgCi0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB2aXNpYmxlaW5uYXYgPSAnZmFsc2UnIi8+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJkZXNjZW5kYW50LW9yLXNlbGY6Om5hdjpub2RlW0BjdXJyZW50ID0gJ3RydWUnXSI+Ci0gICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYi1zZWxlY3RlZCIvPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiIi8+Ci0gICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgCi0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBvc3Qtc2VwYXJhdG9yIi8+Ci0gIDwvZGl2PgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWIiPgotICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibGFiZWwiLz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbmFtZT0idGFiLXNlbGVjdGVkIj4KLSAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImxhYmVsIj4KLSAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VmZml4Ij4tc2VsZWN0ZWQ8L3hzbDp3aXRoLXBhcmFtPgotICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJsYWJlbCI+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ic3VmZml4Ii8+Ci0gIDxhIGNsYXNzPSJ0YWJ7JHN1ZmZpeH0iPgotICAgIDx4c2w6aWYgdGVzdD0ibm90KEBjdXJyZW50ID0gJ3RydWUnKSI+Ci0gICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiLz48L3hzbDphdHRyaWJ1dGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHNwYW4+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJuYXY6bGFiZWwiLz48L3NwYW4+Ci0gIDwvYT4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5hdjpsYWJlbCI+Ci0gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InByZS1zZXBhcmF0b3IiPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzZXBhcmF0b3IiPgotICAgPHhzbDp0ZXh0PiYjMTYwOzwveHNsOnRleHQ+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBvc3Qtc2VwYXJhdG9yIj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gIDx4c2w6Y29weT4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICA8L3hzbDpjb3B5PgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlbm9kZWZhY3RvcnkueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlbm9kZWZhY3RvcnkueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgwMmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZW5vZGVmYWN0b3J5Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0BjbGFzcyA9ICdvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LlNvdXJjZU5vZGVGYWN0b3J5J10iPgotICA8Y29tcG9uZW50Ci0gICAgbG9nZ2VyPSJsZW55YS5ub2RlZmFjdG9yeS5zb3VyY2UiCi0gICAgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlRmFjdG9yeSIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Tb3VyY2VOb2RlRmFjdG9yeSIvPgotPC94Y29uZj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyNzlmYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuc291cmNlcmVwb3NpdG9yeTwvaWQ+Ci0gIDxleHBvcnQgcGFja2FnZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeSIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5hYyIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy51c2VjYXNlIi8+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPG5hbWU+UmVwb3NpdG9yeSBNb2R1bGU8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPkxlbnlhIFJlcG9zaXRvcnkgQVBJIChEcmFmdCk8L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvQ29udGVudFNvdXJjZVdyYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Db250ZW50U291cmNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2M5MDYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Db250ZW50U291cmNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLQotLyoqCi0gKiBDb250ZW50IHNvdXJjZSB3cmFwcGVyLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFNvdXJjZVdyYXBwZXIgZXh0ZW5kcyBTb3VyY2VXcmFwcGVyIHsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiBAcGFyYW0gc291cmNlVVJJCi0gICAgICogQHBhcmFtIG1hbmFnZXIKLSAgICAgKiBAcGFyYW0gbG9nZ2VyCi0gICAgICovCi0gICAgcHVibGljIENvbnRlbnRTb3VyY2VXcmFwcGVyKFNvdXJjZU5vZGUgbm9kZSwgU3RyaW5nIHNvdXJjZVVSSSwgU2VydmljZU1hbmFnZXIgbWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBzdXBlcihub2RlLCBzb3VyY2VVUkksIG1hbmFnZXIsIGxvZ2dlcik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvTWV0YVNvdXJjZVdyYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9NZXRhU291cmNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNhYThhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9NZXRhU291cmNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YU93bmVyOwotCi0vKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byBhIG1ldGEgZGF0YSBzb3VyY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhU291cmNlV3JhcHBlciBleHRlbmRzIFNvdXJjZVdyYXBwZXIgaW1wbGVtZW50cyBNZXRhRGF0YU93bmVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFTllBX01FVEFfU1VGRklYID0gIm1ldGEiOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEBwYXJhbSBzb3VyY2VVUkkKLSAgICAgKiBAcGFyYW0gbWFuYWdlcgotICAgICAqIEBwYXJhbSBsb2dnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YVNvdXJjZVdyYXBwZXIoU291cmNlTm9kZSBub2RlLCBTdHJpbmcgc291cmNlVVJJLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLAotICAgICAgICAgICAgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBzdXBlcihub2RlLCBzb3VyY2VVUkkgKyAiLiIgKyBMRU5ZQV9NRVRBX1NVRkZJWCwgbWFuYWdlciwgbG9nZ2VyKTsKLSAgICAgICAgdGhpcy5oYW5kbGVyID0gbmV3IE1vZGlmaWFibGVNZXRhRGF0YUhhbmRsZXIobWFuYWdlciwgdGhpcyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTW9kaWZpYWJsZU1ldGFEYXRhSGFuZGxlciBoYW5kbGVyOwotCi0gICAgcHVibGljIE1ldGFEYXRhIGdldE1ldGFEYXRhKFN0cmluZyBuYW1lc3BhY2VVcmkpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuZ2V0TWV0YURhdGEobmFtZXNwYWNlVXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWV0YURhdGFOYW1lc3BhY2VVcmlzKCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5nZXRNZXRhRGF0YU5hbWVzcGFjZVVyaXMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Nb2RpZmlhYmxlTWV0YURhdGFIYW5kbGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvTW9kaWZpYWJsZU1ldGFEYXRhSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmJlMTQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Nb2RpZmlhYmxlTWV0YURhdGFIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLk5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIE1vZGlmaWFibGUgbWV0YSBkYXRhIGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZmlhYmxlTWV0YURhdGFIYW5kbGVyIGV4dGVuZHMgU291cmNlTm9kZU1ldGFEYXRhSGFuZGxlciBpbXBsZW1lbnRzIFBlcnNpc3RhYmxlIHsKLSAgICAKLSAgICBwcml2YXRlIE1ldGFTb3VyY2VXcmFwcGVyIHNvdXJjZVdyYXBwZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBzb3VyY2VXcmFwcGVyIFRoZSBzb3VyY2Ugd3JhcHBlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTW9kaWZpYWJsZU1ldGFEYXRhSGFuZGxlcihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBNZXRhU291cmNlV3JhcHBlciBzb3VyY2VXcmFwcGVyKSB7Ci0gICAgICAgIHN1cGVyKG1hbmFnZXIsIHNvdXJjZVdyYXBwZXIuZ2V0UmVhbFNvdXJjZVVyaSgpKTsKLSAgICAgICAgdGhpcy5zb3VyY2VXcmFwcGVyID0gc291cmNlV3JhcHBlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuc291cmNlV3JhcHBlci5nZXROb2RlKCkuc2V0UGVyc2lzdGFibGUodGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNoYW5nZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTmFtZXNwYWNlSGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoTUVUQV9EQVRBX05BTUVTUEFDRSwgIiIsIEVMRU1FTlRfTUVUQURBVEEpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiBuYW1lc3BhY2VzID0gdGhpcy5uYW1lc3BhY2UybWV0YW1hcC5rZXlTZXQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBzZXRFbGVtZW50ID0gaGVscGVyLmNyZWF0ZUVsZW1lbnQoRUxFTUVOVF9TRVQpOwotICAgICAgICAgICAgICAgIHNldEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9OQU1FU1BBQ0UsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaGVscGVyLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoc2V0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBNYXAgbWFwID0gZ2V0TWV0YURhdGFNYXAobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGtleXMgPSBtYXAua2V5U2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBrZXlJdGVyYXRvciA9IGtleXMuaXRlcmF0b3IoKTsga2V5SXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5SXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudEVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudChFTEVNRU5UX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICBlbGVtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0tFWSwga2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBMaXN0IHZhbHVlcyA9IChMaXN0KSBtYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgdmFsdWVJdGVyYXRvciA9IHZhbHVlcy5pdGVyYXRvcigpOyB2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHZhbHVlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB2YWx1ZUVsZW1lbnQgPSBoZWxwZXIuY3JlYXRlRWxlbWVudChFTEVNRU5UX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWVFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvU3RyZWFtID0gdGhpcy5zb3VyY2VXcmFwcGVyLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgRG9jdW1lbnRIZWxwZXIud3JpdGVEb2N1bWVudChoZWxwZXIuZ2V0RG9jdW1lbnQoKSwgb1N0cmVhbSk7Ci0gICAgICAgICAgICBpZiAob1N0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb1N0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9TdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIG1ldGEgWE1MOiAiLCB0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFN0cmluZyBuYW1lc3BhY2VVcmksIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCB2YWx1ZXMgPSBnZXRWYWx1ZUxpc3QobmFtZXNwYWNlVXJpLCBrZXkpOwotICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKLSAgICAgICAgY2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbFZhbHVlcyhTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcga2V5KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBMaXN0IHZhbHVlcyA9IGdldFZhbHVlTGlzdChuYW1lc3BhY2VVcmksIGtleSk7Ci0gICAgICAgIHZhbHVlcy5jbGVhcigpOwotICAgICAgICBjaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWVzcGFjZVVyaSwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBMaXN0IHZhbHVlcyA9IGdldFZhbHVlTGlzdChuYW1lc3BhY2VVcmksIGtleSk7Ci0gICAgICAgIHZhbHVlcy5jbGVhcigpOwotICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKLSAgICAgICAgY2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VkKCkgewotICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU291cmNlTm9kZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NvdXJjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2Y2E1Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU291cmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5UcmF2ZXJzYWJsZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmFjLklkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuYWMuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm9ic2VydmF0aW9uLlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5vYnNlcnZhdGlvbi5SZXBvc2l0b3J5RXZlbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJjLkNoZWNrSW5FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5SQ01MOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJjLlJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLkxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWJsZTsKLQotLyoqCi0gKiBBIHJlcG9zaXRvcnkgbm9kZS4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlTm9kZSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIE5vZGUsIFRyYW5zYWN0aW9uYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHByaXZhdGUgQ29udGVudFNvdXJjZVdyYXBwZXIgY29udGVudFNvdXJjZTsKLSAgICBwcml2YXRlIE1ldGFTb3VyY2VXcmFwcGVyIG1ldGFTb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXNzaW9uCi0gICAgICogQHBhcmFtIHNvdXJjZVVyaQotICAgICAqIEBwYXJhbSBtYW5hZ2VyCi0gICAgICogQHBhcmFtIGxvZ2dlcgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2VOb2RlKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHNvdXJjZVVyaSwgU2VydmljZU1hbmFnZXIgbWFuYWdlciwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICBlbmFibGVMb2dnaW5nKGxvZ2dlcik7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0KLSAgICAgICAgdGhpcy5jb250ZW50U291cmNlID0gbmV3IENvbnRlbnRTb3VyY2VXcmFwcGVyKHRoaXMsIHNvdXJjZVVyaSwgbWFuYWdlciwgbG9nZ2VyKTsKLSAgICAgICAgdGhpcy5tZXRhU291cmNlID0gbmV3IE1ldGFTb3VyY2VXcmFwcGVyKHRoaXMsIHNvdXJjZVVyaSwgbWFuYWdlciwgbG9nZ2VyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udGVudFNvdXJjZVdyYXBwZXIgZ2V0Q29udGVudFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFNvdXJjZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0YVNvdXJjZVdyYXBwZXIgZ2V0TWV0YVNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YVNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hYmxlI2RlbGV0ZVRyYW5zYWN0aW9uYWJsZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlVHJhbnNhY3Rpb25hYmxlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbnRlbnRTb3VyY2UuZGVsZXRlVHJhbnNhY3Rpb25hYmxlKCk7Ci0gICAgICAgIHRoaXMubWV0YVNvdXJjZS5kZWxldGVUcmFuc2FjdGlvbmFibGUoKTsKLSAgICAgICAgZ2V0UmNtbCgpLmRlbGV0ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlcklkKCkgewotICAgICAgICBTdHJpbmcgdXNlcklkID0gbnVsbDsKLSAgICAgICAgSWRlbnRpdHkgaWRlbnRpdHkgPSBnZXRTZXNzaW9uKCkuZ2V0SWRlbnRpdHkoKTsKLSAgICAgICAgaWYgKGlkZW50aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFVzZXIgdXNlciA9IGlkZW50aXR5LmdldFVzZXIoKTsKLSAgICAgICAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VySWQgPSB1c2VyLmdldElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVzZXJJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hYmxlI2NoZWNraW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoZWNraW4oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIFJDTUwgcmNtbCA9IGdldFJjbWwoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChyY21sKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghcmNtbC5pc0NoZWNrZWRPdXRCeVNlc3Npb24oZ2V0U2Vzc2lvbigpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiQ2Fubm90IGNoZWNrIGluIG5vZGUgWyIgKyBnZXRTb3VyY2VVUkkoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06IG5vdCBjaGVja2VkIG91dCBieSB0aGlzIHNlc3Npb24hIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJjbWwuY2hlY2tJbih0aGlzLCBleGlzdHMoKSwgZ2V0U2Vzc2lvbigpLmlzRGlydHkodGhpcykpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZvcmNlQ2hlY2tJbigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgUkNNTCByY21sID0gZ2V0UmNtbCgpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHJjbWwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFyY21sLmlzQ2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJDYW5ub3QgY2hlY2sgaW4gbm9kZSBbIiArIGdldFNvdXJjZVVSSSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXTogbm90IGNoZWNrZWQgb3V0ISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByY21sLmNoZWNrSW4odGhpcywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hYmxlI2lzQ2hlY2tlZE91dCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkT3V0KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJjbWwoKS5pc0NoZWNrZWRPdXQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkT3V0QnlTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJjbWwoKS5pc0NoZWNrZWRPdXRCeVNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoZWNrb3V0KGJvb2xlYW4gcmVzdHJpY3RlZFRvU2Vzc2lvbikgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlNvdXJjZU5vZGU6OmNoZWNrb3V0KCkgY2FsbGVkLCBzb3VyY2VVUkkgWyIgKyBnZXRTb3VyY2VVUkkoKSArICJdIik7Ci0KLSAgICAgICAgUkNNTCByY21sID0gZ2V0UmNtbCgpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHJjbWwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJjbWwuaXNDaGVja2VkT3V0KCkgJiYgIXJjbWwuaXNDaGVja2VkT3V0QnlTZXNzaW9uKGdldFNlc3Npb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlRoZSBub2RlIFsiICsgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gaXMgYWxyZWFkeSBjaGVja2VkIG91dCBieSBhbm90aGVyIHNlc3Npb24hIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcmNtbC5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgICAgICAgICByY21sLmNoZWNrT3V0KHRoaXMsIHJlc3RyaWN0ZWRUb1Nlc3Npb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja291dCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tvdXQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMb2NrIGxvY2s7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hYmxlI2hhc0NoYW5nZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoYW5nZWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFZlcnNpb24gPSBnZXRDdXJyZW50UmV2aXNpb25OdW1iZXIoKTsKLSAgICAgICAgICAgIGludCBsb2NrVmVyc2lvbiA9IGdldExvY2soKS5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudFZlcnNpb24gPiBsb2NrVmVyc2lvbjsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRDdXJyZW50UmV2aXNpb25OdW1iZXIoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIENoZWNrSW5FbnRyeSBlbnRyeTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVudHJ5ID0gZ2V0UmNtbCgpLmdldExhdGVzdENoZWNrSW5FbnRyeSgpOwotICAgICAgICB9IGNhdGNoIChSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZlcnNpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGRvY3VtZW50IG5vZGUsIGlmIHRoaXMgaXMgYSBtZXRhIGRhdGEgbm9kZSwgb3IgdGhlIG5vZGUgaXRzZWxmIG90aGVyd2lzZS4KLSAgICAgKiBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZSBnZXREb2N1bWVudE5vZGUoKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiwgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIE5vZGUgbm9kZTsKLSAgICAgICAgU3RyaW5nIHNvdXJjZVVyaSA9IGdldFNvdXJjZVVSSSgpOwotICAgICAgICBpZiAoc291cmNlVXJpLmVuZHNXaXRoKCIubWV0YSIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZG9jdW1lbnRTb3VyY2VVcmkgPSBzb3VyY2VVcmkKLSAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBzb3VyY2VVcmkubGVuZ3RoKCkgLSAiLm1ldGEiLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIE5vZGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gKE5vZGVGYWN0b3J5KSB0aGlzLm1hbmFnZXIubG9va3VwKE5vZGVGYWN0b3J5LlJPTEUpOwotICAgICAgICAgICAgICAgIG5vZGUgPSAoTm9kZSkgZmFjdG9yeS5idWlsZEl0ZW0oZ2V0U2Vzc2lvbigpLCBkb2N1bWVudFNvdXJjZVVyaSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm9kZSA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWJsZSNjcmVhdGVUcmFuc2FjdGlvbmFibGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRyYW5zYWN0aW9uYWJsZSgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hYmxlI2xvY2soKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2NrKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkxvY2tpbmcgWyIgKyB0aGlzICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGN1cnJlbnRSZXYgPSBnZXRDdXJyZW50UmV2aXNpb25OdW1iZXIoKTsKLSAgICAgICAgICAgIGludCBjb250ZW50TG9hZFJldiA9IGdldENvbnRlbnRTb3VyY2UoKS5nZXRMb2FkUmV2aXNpb24oKTsKLSAgICAgICAgICAgIGludCBjb250ZW50UmV2ID0gY29udGVudExvYWRSZXYgPT0gLTEgPyBjdXJyZW50UmV2IDogY29udGVudExvYWRSZXY7Ci0KLSAgICAgICAgICAgIGludCBtZXRhTG9hZFJldiA9IGdldE1ldGFTb3VyY2UoKS5nZXRMb2FkUmV2aXNpb24oKTsKLSAgICAgICAgICAgIGludCBtZXRhUmV2ID0gbWV0YUxvYWRSZXYgPT0gLTEgPyBjdXJyZW50UmV2IDogbWV0YUxvYWRSZXY7Ci0KLSAgICAgICAgICAgIGludCBsb2NrUmV2ID0gTWF0aC5taW4oY29udGVudFJldiwgbWV0YVJldik7Ci0gICAgICAgICAgICB0aGlzLmxvY2sgPSBnZXRTZXNzaW9uKCkuY3JlYXRlTG9jayh0aGlzLCBsb2NrUmV2KTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNhY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFibGUjZ2V0TG9jaygpCi0gICAgICovCi0gICAgcHVibGljIExvY2sgZ2V0TG9jaygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9jazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hYmxlI3VubG9jaygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdW5sb2NrKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0aGlzLmxvY2sgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLnJlbW92ZUxvY2sodGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFRyYW5zYWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWJsZSNpc0xvY2tlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxvY2sgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAibm9kZSAiICsgZ2V0U291cmNlVVJJKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgVHJhdmVyc2FibGVTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gKFRyYXZlcnNhYmxlU291cmNlKSByZXNvbHZlci5yZXNvbHZlVVJJKHRoaXMuY29udGVudFNvdXJjZS5nZXRSZWFsU291cmNlVXJpKCkpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHNvdXJjZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgbmV3Q2hpbGRyZW4gPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFRyYXZlcnNhYmxlU291cmNlIGNoaWxkID0gKFRyYXZlcnNhYmxlU291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4uYWRkKG5ldyBTb3VyY2VOb2RlKGdldFNlc3Npb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZVVSSSgpICsgIi8iICsgY2hpbGQuZ2V0TmFtZSgpLCB0aGlzLm1hbmFnZXIsIGdldExvZ2dlcigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGRyZW47Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGlvbigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBUcmF2ZXJzYWJsZVNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSAoVHJhdmVyc2FibGVTb3VyY2UpIHJlc29sdmVyLnJlc29sdmVVUkkodGhpcy5jb250ZW50U291cmNlLmdldFJlYWxTb3VyY2VVcmkoKSk7Ci0gICAgICAgICAgICByZXR1cm4gc291cmNlLmlzQ29sbGVjdGlvbigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZSNnZXRTb3VyY2VVUkkoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVVJJKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U291cmNlLmdldFNvdXJjZVVyaSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGUjZ2V0U2Vzc2lvbigpCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRpcnR5KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFnZXRTZXNzaW9uKCkuaXNEaXJ0eSh0aGlzKSkgewotICAgICAgICAgICAgICAgIGdldFNlc3Npb24oKS5yZWdpc3RlckRpcnR5KHRoaXMpOwotICAgICAgICAgICAgICAgIGVucXVldWVFdmVudChEb2N1bWVudEV2ZW50LkNIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUcmFuc2FjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGVucXVldWVFdmVudChPYmplY3QgZGVzY3JpcHRvcikgewotICAgICAgICBSZXBvc2l0b3J5RXZlbnQgZXZlbnQgPSBSZXBvc2l0b3J5RXZlbnRGYWN0b3J5LmNyZWF0ZUV2ZW50KHRoaXMubWFuYWdlciwgdGhpcywgZ2V0TG9nZ2VyKCksCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRvcik7Ci0gICAgICAgIGdldFNlc3Npb24oKS5lbnF1ZXVlRXZlbnQoZXZlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVtb3ZlZCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFNlc3Npb24oKS5yZWdpc3RlclJlbW92ZWQodGhpcyk7Ci0gICAgICAgICAgICBlbnF1ZXVlRXZlbnQoRG9jdW1lbnRFdmVudC5SRU1PVkVEKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSQ01MIHJjbWw7Ci0gICAgcHJpdmF0ZSBQZXJzaXN0YWJsZSBwZXJzaXN0YWJsZTsKLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUkNNTCBnZXRSY21sKCkgewotICAgICAgICBpZiAodGhpcy5yY21sID09IG51bGwpIHsKLSAgICAgICAgICAgIFNvdXJjZU5vZGVSY21sRmFjdG9yeSBmYWN0b3J5ID0gU291cmNlTm9kZVJjbWxGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICB0aGlzLnJjbWwgPSBmYWN0b3J5LmdldFJjbWwodGhpcywgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yY21sOwotICAgIH0KLQotICAgIHB1YmxpYyBIaXN0b3J5IGdldEhpc3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU291cmNlTm9kZUhpc3RvcnkodGhpcywgdGhpcy5tYW5hZ2VyLCBnZXRMb2dnZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhIGdldE1ldGFEYXRhKFN0cmluZyBuYW1lc3BhY2VVcmkpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1ldGFTb3VyY2UuZ2V0TWV0YURhdGEobmFtZXNwYWNlVXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTb3VyY2UuZXhpc3RzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTb3VyY2UuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFNvdXJjZS5nZXRDb250ZW50TGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotCi0gICAgICAgIGlmICghZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJUaGUgbm9kZSBbIiArIHRoaXMgKyAiXSBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgY29udGVudExhc3RNb2RpZmllZCA9IHRoaXMuY29udGVudFNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgbG9uZyBtZXRhTGFzdE1vZGlmaWVkID0gMDsKLSAgICAgICAgaWYgKHRoaXMubWV0YVNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgbWV0YUxhc3RNb2RpZmllZCA9IHRoaXMubWV0YVNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNYXRoLm1heChjb250ZW50TGFzdE1vZGlmaWVkLCBtZXRhTGFzdE1vZGlmaWVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U291cmNlLmdldE1pbWVUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1ldGFEYXRhTmFtZXNwYWNlVXJpcygpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1ldGFTb3VyY2UuZ2V0TWV0YURhdGFOYW1lc3BhY2VVcmlzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNhdmVUcmFuc2FjdGlvbmFibGUoKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzQ2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiQ2Fubm90IHNhdmUgbm9kZSBbIiArIGdldFNvdXJjZVVSSSgpCi0gICAgICAgICAgICAgICAgICAgICsgIl06IG5vdCBjaGVja2VkIG91dCEiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNvbnRlbnRTb3VyY2Uuc2F2ZVRyYW5zYWN0aW9uYWJsZSgpOwotICAgICAgICB0aGlzLm1ldGFTb3VyY2Uuc2F2ZVRyYW5zYWN0aW9uYWJsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb250ZW50U291cmNlLmRlbGV0ZSgpOwotICAgICAgICB0aGlzLm1ldGFTb3VyY2UuZGVsZXRlKCk7Ci0gICAgICAgIHJlZ2lzdGVyUmVtb3ZlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlY2tvdXRVc2VySWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIFJDTUwgcmNtbCA9IGdldFJjbWwoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChyY21sKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghcmNtbC5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiVGhlIG5vZGUgWyIgKyB0aGlzICsgIl0gaXMgbm90IGNoZWNrZWQgb3V0ISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmNtbC5nZXRMYXRlc3RFbnRyeSgpLmdldElkZW50aXR5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29weVJldmlzaW9uc0Zyb20oTm9kZSBzb3VyY2UpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gd2FzTG9ja2VkID0gaXNMb2NrZWQoKTsKLSAgICAgICAgICAgIGlmICh3YXNMb2NrZWQpIHsKLSAgICAgICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFJjbWwoKS5jb3B5RnJvbSh0aGlzLCBzb3VyY2UpOwotICAgICAgICAgICAgaWYgKHdhc0xvY2tlZCkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBoYWNrOiB1cGRhdGUgdGhlIGxvY2sgcmV2aXNpb24gdG8gdGhlIGxhdGVzdCBjb3BpZWQgcmV2aXNpb24gdG8gYXZvaWQKLSAgICAgICAgICAgICAgICAvLyB0aGUgIm5vZGUgaGFzIGNoYW5nZWQiIGVycm9yCi0gICAgICAgICAgICAgICAgdGhpcy5sb2NrID0gZ2V0U2Vzc2lvbigpLmNyZWF0ZUxvY2sodGhpcywgZ2V0Q3VycmVudFJldmlzaW9uTnVtYmVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRyYW5zYWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soaW50IHJldmlzaW9uTnVtYmVyKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb25nIHRpbWUgPSBnZXRIaXN0b3J5KCkuZ2V0UmV2aXNpb24ocmV2aXNpb25OdW1iZXIpLmdldFRpbWUoKTsKLSAgICAgICAgICAgIGdldFJjbWwoKS5yZXN0b3JlQmFja3VwKHRoaXMsIHRpbWUpOwotICAgICAgICB9IGNhdGNoIChSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWRPdXRCeVNlc3Npb24oKSB0aHJvd3MgVHJhbnNhY3Rpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gaXNDaGVja2VkT3V0QnlTZXNzaW9uKGdldFNlc3Npb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGFibGUoUGVyc2lzdGFibGUgaXRlbSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0aGlzLnBlcnNpc3RhYmxlID0gaXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc2lzdGFibGUgZ2V0UGVyc2lzdGFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RhYmxlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NvdXJjZU5vZGVGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU291cmNlTm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2ZmM3ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU291cmNlTm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci0KLS8qKgotICogRmFjdG9yeSB0byBjcmVhdGUgc291cmNlIG5vZGVzLgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VOb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIE5vZGVGYWN0b3J5LCBTZXJ2aWNlYWJsZSwKLSAgICAgICAgVGhyZWFkU2FmZSB7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2VOb2RlRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUl0ZW0gYnVpbGRJdGVtKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIGtleSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBOb2RlIG5vZGUgPSBuZXcgU291cmNlTm9kZShzZXNzaW9uLCBrZXksIHRoaXMubWFuYWdlciwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEl0ZW1UeXBlKCkgewotICAgICAgICByZXR1cm4gTm9kZS5JREVOVElGSUFCTEVfVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlI3NlcnZpY2Uob3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU291cmNlTm9kZUhpc3RvcnkuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlSGlzdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZThjMDc0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlSGlzdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lci5Db250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5sb2dnZXIuTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJjLkNoZWNrSW5FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5SQ01MOwotCi0vKioKLSAqIFJldmlzaW9uIGhpc3RvcnkgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VOb2RlSGlzdG9yeSBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIEhpc3RvcnkgewotCi0gICAgcHJpdmF0ZSBTb3VyY2VOb2RlIG5vZGU7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB3aGljaCB0aGUgaGlzdG9yeSBiZWxvbmdzIHRvLgotICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2VOb2RlSGlzdG9yeShTb3VyY2VOb2RlIG5vZGUsIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgQ29udGFpbmVyVXRpbC5lbmFibGVMb2dnaW5nKHRoaXMsIGxvZ2dlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFJldmlzaW9uIGdldExhdGVzdFJldmlzaW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50W10gbnVtYmVycyA9IGdldFJldmlzaW9uTnVtYmVycygpOwotICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZXZpc2lvbihudW1iZXJzWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKCJUaGVyZSBpcyBubyByZXZpc2lvbiBmb3Igbm9kZSBbIiArIHRoaXMubm9kZSArICJdIHlldC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJldmlzaW9uIGdldFJldmlzaW9uKGludCBudW1iZXIpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlUmV2aXNpb24odGhpcy5ub2RlLCBudW1iZXIsIHRoaXMubWFuYWdlciwgZ2V0TG9nZ2VyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSBnZXRSZXZpc2lvbk51bWJlcnMoKSB7Ci0gICAgICAgIFJDTUwgcmNtbCA9IHRoaXMubm9kZS5nZXRSY21sKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWZWN0b3IgZW50cmllcyA9IHJjbWwuZ2V0QmFja3VwRW50cmllcygpOwotICAgICAgICAgICAgaW50W10gbnVtYmVycyA9IG5ldyBpbnRbZW50cmllcy5zaXplKCldOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tJbkVudHJ5IGVudHJ5ID0gKENoZWNrSW5FbnRyeSkgZW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbnVtYmVyc1tpXSA9IGVudHJ5LmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudW1iZXJzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlTWV0YURhdGEuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmZTEzMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU291cmNlTm9kZU1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLkVsZW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFSZWdpc3RyeTsKLQotLyoqCi0gKiBTb3VyY2Utbm9kZS1iYXNlZCBtZXRhIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VOb2RlTWV0YURhdGEgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgaW1wbGVtZW50cyBNZXRhRGF0YSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVcmk7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotICAgIHByaXZhdGUgU291cmNlTm9kZU1ldGFEYXRhSGFuZGxlciBoYW5kbGVyOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgVVJJLgotICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBtZXRhIGRhdGEgaGFuZGxlci4KLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2VOb2RlTWV0YURhdGEoU3RyaW5nIG5hbWVzcGFjZVVyaSwgU291cmNlTm9kZU1ldGFEYXRhSGFuZGxlciBoYW5kbGVyLAotICAgICAgICAgICAgU2VydmljZU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICB0aGlzLm5hbWVzcGFjZVVyaSA9IG5hbWVzcGFjZVVyaTsKLSAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlVXJpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTb3VyY2VOb2RlTWV0YURhdGFIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFbGVtZW50U2V0IGVsZW1lbnRTZXQ7Ci0KLSAgICBwdWJsaWMgRWxlbWVudFNldCBnZXRFbGVtZW50U2V0KCkgewotICAgICAgICBpZiAodGhpcy5lbGVtZW50U2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTWV0YURhdGFSZWdpc3RyeSByZWdpc3RyeSA9IChNZXRhRGF0YVJlZ2lzdHJ5KSB0aGlzLm1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5sb29rdXAoTWV0YURhdGFSZWdpc3RyeS5ST0xFKTsKLSAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRTZXQgPSByZWdpc3RyeS5nZXRFbGVtZW50U2V0KHRoaXMubmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50U2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoU3RyaW5nIGtleSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gZ2V0SGFuZGxlcigpLmdldFZhbHVlcyh0aGlzLm5hbWVzcGFjZVVyaSwga2V5KTsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgY2hlY2tLZXkoa2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RWYWx1ZShTdHJpbmcga2V5KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBnZXRWYWx1ZXMoa2V5KTsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgY2hlY2tLZXkoa2V5KTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1swXTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWNoZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLgotICAgICAqLwotICAgIHByaXZhdGUgU2V0IGF2YWlsYWJsZUtleXM7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFNldCBhdmFpbGFibGVLZXlzKCkgewotICAgICAgICBpZiAodGhpcy5hdmFpbGFibGVLZXlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlS2V5cyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoZ2V0QXZhaWxhYmxlS2V5cygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlS2V5czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXZhaWxhYmxlS2V5cygpIHsKLSAgICAgICAgRWxlbWVudFtdIGVsZW1lbnRzOwotICAgICAgICBlbGVtZW50cyA9IGdldEVsZW1lbnRTZXQoKS5nZXRFbGVtZW50cygpOwotICAgICAgICBTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1tlbGVtZW50cy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBrZXlzW2ldID0gZWxlbWVudHNbaV0uZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBrZXlzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrS2V5KFN0cmluZyBrZXkpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZShrZXkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oIlRoZSBtZXRhIGRhdGEgZWxlbWVudCBzZXQgWyIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRFbGVtZW50U2V0KCkuZ2V0TmFtZXNwYWNlVXJpKCkgKyAiXSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBrZXkgWyIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgKyAiXSEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tLZXkoa2V5KTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbigiVGhlIHZhbHVlIGZvciBrZXkgWyIgKyBrZXkgKyAiXSBtdXN0IG5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0gICAgICAgIGdldEhhbmRsZXIoKS5zZXRWYWx1ZSh0aGlzLm5hbWVzcGFjZVVyaSwga2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBjaGVja0tleShrZXkpOwotICAgICAgICBpZiAoIWdldEVsZW1lbnRTZXQoKS5nZXRFbGVtZW50KGtleSkuaXNNdWx0aXBsZSgpICYmIGdldFZhbHVlcyhrZXkpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbigiVGhlIGVsZW1lbnQgWyIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgKyAiXSBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgdmFsdWVzISIpOwotICAgICAgICB9Ci0gICAgICAgIGdldEhhbmRsZXIoKS5hZGRWYWx1ZSh0aGlzLm5hbWVzcGFjZVVyaSwga2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZUJ5KE1ldGFEYXRhIG90aGVyKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBFbGVtZW50W10gZWxlbWVudHMgPSBnZXRFbGVtZW50U2V0KCkuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmdldEFjdGlvbk9uQ29weSgpID09IEVsZW1lbnQuT05DT1BZX0NPUFkpIHsKLSAgICAgICAgICAgICAgICByZXBsYWNlQnkob3RoZXIsIGVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbaV0uZ2V0QWN0aW9uT25Db3B5KCkgPT0gRWxlbWVudC5PTkNPUFlfREVMRVRFKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVsZW1lbnRzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICByZW1vdmVBbGxWYWx1ZXMoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlcGxhY2VCeShNZXRhRGF0YSBvdGhlciwgRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcga2V5ID0gZWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgIHJlbW92ZUFsbFZhbHVlcyhrZXkpOwotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBvdGhlci5nZXRWYWx1ZXMoa2V5KTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIGFkZFZhbHVlKGtleSwgdmFsdWVzW2pdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZvcmNlZFJlcGxhY2VCeShNZXRhRGF0YSBvdGhlcikgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgRWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudFNldCgpLmdldEVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJlcGxhY2VCeShvdGhlciwgZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBvc3NpYmxlS2V5cygpIHsKLSAgICAgICAgcmV0dXJuIGdldEF2YWlsYWJsZUtleXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkQXR0cmlidXRlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGF2YWlsYWJsZUtleXMoKS5jb250YWlucyhrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SGFuZGxlcigpLmdldExhc3RNb2RpZmllZCgpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFZhbHVlcyhTdHJpbmcga2V5KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBjaGVja0tleShrZXkpOwotICAgICAgICBnZXRIYW5kbGVyKCkucmVtb3ZlQWxsVmFsdWVzKHRoaXMubmFtZXNwYWNlVXJpLCBrZXkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NvdXJjZU5vZGVNZXRhRGF0YUhhbmRsZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlTWV0YURhdGFIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNTRhMDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NvdXJjZU5vZGVNZXRhRGF0YUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLkVsZW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFPd25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLmR1YmxpbmNvcmUuRHVibGluQ29yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QYWdlRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogSGFuZGxlcyB0aGUgbWV0YSBkYXRhIG9mIHNvdXJjZSBub2Rlcy4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZU5vZGVNZXRhRGF0YUhhbmRsZXIgaW1wbGVtZW50cyBNZXRhRGF0YU93bmVyIHsKLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLSAgICBwcml2YXRlIFN0cmluZyBzb3VyY2VVcmk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgc2VydmljZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkgVGhlIHNvdXJlIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlTm9kZU1ldGFEYXRhSGFuZGxlcihTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgc291cmNlVXJpKSB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIHRoaXMuc291cmNlVXJpID0gc291cmNlVXJpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIG5hbWVzcGFjZTJtZXRhZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgTWV0YURhdGEgZ2V0TWV0YURhdGEoU3RyaW5nIG5hbWVzcGFjZVVyaSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLQotICAgICAgICBNZXRhRGF0YSBtZXRhID0gKE1ldGFEYXRhKSB0aGlzLm5hbWVzcGFjZTJtZXRhZGF0YS5nZXQobmFtZXNwYWNlVXJpKTsKLSAgICAgICAgaWYgKG1ldGEgPT0gbnVsbCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBNZXRhRGF0YVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVnaXN0cnkgPSAoTWV0YURhdGFSZWdpc3RyeSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChNZXRhRGF0YVJlZ2lzdHJ5LlJPTEUpOwotICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cnkuaXNSZWdpc3RlcmVkKG5hbWVzcGFjZVVyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKCJUaGUgbmFtZXNwYWNlIFsiICsgbmFtZXNwYWNlVXJpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBpcyBub3QgcmVnaXN0ZXJlZCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlZ2lzdHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1ldGEgPSBuZXcgU291cmNlTm9kZU1ldGFEYXRhKG5hbWVzcGFjZVVyaSwgdGhpcywgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWVzcGFjZTJtZXRhZGF0YS5wdXQobmFtZXNwYWNlVXJpLCBtZXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0YTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIG5hbWVzcGFjZTJtZXRhbWFwID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgTWFwIGdldE1ldGFEYXRhTWFwKFN0cmluZyBuYW1lc3BhY2VVcmkpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZTJtZXRhbWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvYWRNZXRhRGF0YSgpOwotICAgICAgICB9Ci0gICAgICAgIE1hcCBtYXAgPSAoTWFwKSB0aGlzLm5hbWVzcGFjZTJtZXRhbWFwLmdldChuYW1lc3BhY2VVcmkpOwotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB0aGlzLm5hbWVzcGFjZTJtZXRhbWFwLnB1dChuYW1lc3BhY2VVcmksIG1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0RBVEFfTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhLzEuMCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NRVRBREFUQSA9ICJtZXRhZGF0YSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TRVQgPSAiZWxlbWVudC1zZXQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRUxFTUVOVCA9ICJlbGVtZW50IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1ZBTFVFID0gInZhbHVlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0tFWSA9ICJrZXkiOwotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGxvYWRNZXRhRGF0YSgpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHRoaXMubmFtZXNwYWNlMm1ldGFtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIG1ldGEgZGF0YSBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UybWV0YW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBpZiAoU291cmNlVXRpbC5leGlzdHModGhpcy5zb3VyY2VVcmksIHRoaXMubWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCB4bWwgPSBTb3VyY2VVdGlsLnJlYWRET00odGhpcy5zb3VyY2VVcmksIHRoaXMubWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgaWYgKCF4bWwuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKE1FVEFfREFUQV9OQU1FU1BBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRMZWdhY3lNZXRhRGF0YSh4bWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKE1FVEFfREFUQV9OQU1FU1BBQ0UsICIiLCB4bWwpOwotICAgICAgICAgICAgICAgICAgICBFbGVtZW50W10gc2V0RWxlbWVudHMgPSBoZWxwZXIuZ2V0Q2hpbGRyZW4oeG1sLmdldERvY3VtZW50RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU0VUKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgc2V0SW5kZXggPSAwOyBzZXRJbmRleCA8IHNldEVsZW1lbnRzLmxlbmd0aDsgc2V0SW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHNldEVsZW1lbnRzW3NldEluZGV4XS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50W10gZWxlbWVudEVsZW1lbnRzID0gaGVscGVyLmdldENoaWxkcmVuKHNldEVsZW1lbnRzW3NldEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBlbGVtZW50MnZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBlbGVtSW5kZXggPSAwOyBlbGVtSW5kZXggPCBlbGVtZW50RWxlbWVudHMubGVuZ3RoOyBlbGVtSW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBlbGVtZW50RWxlbWVudHNbZWxlbUluZGV4XS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFtdIHZhbHVlRWxlbWVudHMgPSBoZWxwZXIuZ2V0Q2hpbGRyZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RWxlbWVudHNbZWxlbUluZGV4XSwgRUxFTUVOVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgdmFsdWVJbmRleCA9IDA7IHZhbHVlSW5kZXggPCB2YWx1ZUVsZW1lbnRzLmxlbmd0aDsgdmFsdWVJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IERvY3VtZW50SGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNpbXBsZUVsZW1lbnRUZXh0KHZhbHVlRWxlbWVudHNbdmFsdWVJbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDJ2YWx1ZXMucHV0KGtleSwgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlMm1ldGFtYXAucHV0KG5hbWVzcGFjZSwgZWxlbWVudDJ2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9hZExlZ2FjeU1ldGFEYXRhKERvY3VtZW50IHhtbCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgTmFtZXNwYWNlSGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoUGFnZUVudmVsb3BlLk5BTUVTUEFDRSwgIiIsIHhtbCk7Ci0KLSAgICAgICAgRWxlbWVudCBtZXRhRWxlbWVudCA9IGhlbHBlci5nZXRGaXJzdENoaWxkKHhtbC5nZXREb2N1bWVudEVsZW1lbnQoKSwgIm1ldGEiKTsKLQotICAgICAgICBFbGVtZW50IGludGVybmFsRWxlbWVudCA9IGhlbHBlci5nZXRGaXJzdENoaWxkKG1ldGFFbGVtZW50LCAiaW50ZXJuYWwiKTsKLQotICAgICAgICBFbGVtZW50W10gaW50ZXJuYWxFbGVtZW50cyA9IGhlbHBlci5nZXRDaGlsZHJlbihpbnRlcm5hbEVsZW1lbnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVybmFsRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IERvY3VtZW50SGVscGVyLmdldFNpbXBsZUVsZW1lbnRUZXh0KGludGVybmFsRWxlbWVudHNbaV0pOwotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGludGVybmFsRWxlbWVudHNbaV0uZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJ3b3JrZmxvd1ZlcnNpb24iKSkgewotICAgICAgICAgICAgICAgIExpc3QgdmFsdWVzID0gZ2V0VmFsdWVMaXN0KCJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhZGF0YS93b3JrZmxvdy8xLjAiLCBrZXkpOwotICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMaXN0IHZhbHVlcyA9IGdldFZhbHVlTGlzdCgiaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvZG9jdW1lbnQvMS4wIiwga2V5KTsKLSAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE5hbWVzcGFjZUhlbHBlciBkY0hlbHBlciA9IG5ldyBOYW1lc3BhY2VIZWxwZXIoRHVibGluQ29yZS5EQ19OQU1FU1BBQ0UsICIiLCB4bWwpOwotICAgICAgICBFbGVtZW50IGRjRWxlbWVudCA9IGhlbHBlci5nZXRGaXJzdENoaWxkKG1ldGFFbGVtZW50LCAiZGMiKTsKLQotICAgICAgICBpZiAoZGNFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1ldGFEYXRhUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWdpc3RyeSA9IChNZXRhRGF0YVJlZ2lzdHJ5KSB0aGlzLm1hbmFnZXIubG9va3VwKE1ldGFEYXRhUmVnaXN0cnkuUk9MRSk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudFNldCBkY0VsZW1lbnRTZXQgPSByZWdpc3RyeS5nZXRFbGVtZW50U2V0KER1YmxpbkNvcmUuRENfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50U2V0IGRjVGVybVNldCA9IHJlZ2lzdHJ5LmdldEVsZW1lbnRTZXQoRHVibGluQ29yZS5EQ1RFUk1TX05BTUVTUEFDRSk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50W10gZGNFbGVtZW50cyA9IGRjSGVscGVyLmdldENoaWxkcmVuKGRjRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkY0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IERvY3VtZW50SGVscGVyLmdldFNpbXBsZUVsZW1lbnRUZXh0KGRjRWxlbWVudHNbaV0pOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBkY0VsZW1lbnRzW2ldLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkY0VsZW1lbnRTZXQuY29udGFpbnNFbGVtZW50KGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgdmFsdWVzID0gZ2V0VmFsdWVMaXN0KER1YmxpbkNvcmUuRENfTkFNRVNQQUNFLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGNUZXJtU2V0LmNvbnRhaW5zRWxlbWVudChrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHZhbHVlcyA9IGdldFZhbHVlTGlzdChEdWJsaW5Db3JlLkRDVEVSTVNfTkFNRVNQQUNFLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbigiVGhlIGR1YmxpbiBjb3JlIGtleSBbIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChNZXRhRGF0YUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZWdpc3RyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsdWVzKFN0cmluZyBuYW1lc3BhY2VVcmksIFN0cmluZyBrZXksIGludCByZXZpc2lvbk51bWJlcikKLSAgICAgICAgICAgIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgdmFsdWVzID0gZ2V0VmFsdWVMaXN0KG5hbWVzcGFjZVVyaSwga2V5KTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgdmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbHVlcyhTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcga2V5KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBMaXN0IHZhbHVlcyA9IGdldFZhbHVlTGlzdChuYW1lc3BhY2VVcmksIGtleSk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbdmFsdWVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldFZhbHVlTGlzdChTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcga2V5KSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICBNYXAgbWFwID0gZ2V0TWV0YURhdGFNYXAobmFtZXNwYWNlVXJpKTsKLSAgICAgICAgTGlzdCB2YWx1ZXMgPSAoTGlzdCkgbWFwLmdldChrZXkpOwotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KGtleSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFN0cmluZyBuYW1lc3BhY2VVcmksIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxWYWx1ZXMoU3RyaW5nIG5hbWVzcGFjZVVyaSwgU3RyaW5nIGtleSkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1ldGFEYXRhTmFtZXNwYWNlVXJpcygpIHRocm93cyBNZXRhRGF0YUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGFEYXRhUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVnaXN0cnkgPSAoTWV0YURhdGFSZWdpc3RyeSkgdGhpcy5tYW5hZ2VyLmxvb2t1cChNZXRhRGF0YVJlZ2lzdHJ5LlJPTEUpOwotICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmdldE5hbWVzcGFjZVVyaXMoKTsKLSAgICAgICAgfSBjYXRjaCAoU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBsb25nIGdldExhc3RNb2RpZmllZCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBTb3VyY2VVdGlsLmdldExhc3RNb2RpZmllZCh0aGlzLnNvdXJjZVVyaSwgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU291cmNlTm9kZVJDTUwuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlUkNNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg2ZTFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlUkNNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQ6IFJDTUwuamF2YSA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5DaGVja0luRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucmMuQ2hlY2tPdXRFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5SQ01MOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJjLlJDTUxFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5SZXZpc2lvbkNvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBIYW5kbGUgd2l0aCB0aGUgUkNNTCBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VOb2RlUkNNTCBpbXBsZW1lbnRzIFJDTUwgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIiI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlydHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtYXhpbWFsTnVtYmVyT2ZFbnRyaWVzID0gNTsKLSAgICBwcml2YXRlIFZlY3RvciBlbnRyaWVzOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFNvdXJjZVVyaTsKLSAgICBwcml2YXRlIFN0cmluZyBtZXRhU291cmNlVXJpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIEVMRU1FTlRTID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NIRUNLSU4gPSAiQ2hlY2tJbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DSEVDS09VVCA9ICJDaGVja091dCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9CQUNLVVAgPSAiQmFja3VwIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RJTUUgPSAiVGltZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9WRVJTSU9OID0gIlZlcnNpb24iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSURFTlRJVFkgPSAiSWRlbnRpdHkiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfWFBTUkVWSVNJT05DT05UUk9MID0gIlhQU1JldmlzaW9uQ29udHJvbCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TRVNTSU9OID0gInNlc3Npb24iOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQUNLVVAgPSAiYmFja3VwIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RJTUUgPSAidGltZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJTSU9OID0gInZlcnNpb24iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSURFTlRJVFkgPSAiaWRlbnRpdHkiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU0VTU0lPTiA9ICJzZXNzaW9uIjsKLQotICAgIHsKLSAgICAgICAgRUxFTUVOVFMucHV0KG5ldyBTaG9ydChjaSksIEVMRU1FTlRfQ0hFQ0tJTik7Ci0gICAgICAgIEVMRU1FTlRTLnB1dChuZXcgU2hvcnQoY28pLCBFTEVNRU5UX0NIRUNLT1VUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGVudFNvdXJjZVVyaSBUaGUgY29udGVudCBzb3VyY2UgVVJJLgotICAgICAqIEBwYXJhbSBtZXRhU291cmNlVXJpIFRoZSBtZXRhIHNvdXJjZSBVUkkuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlTm9kZVJDTUwoU3RyaW5nIGNvbnRlbnRTb3VyY2VVcmksIFN0cmluZyBtZXRhU291cmNlVXJpLCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubWF4aW1hbE51bWJlck9mRW50cmllcyA9IDIwMDsKLSAgICAgICAgdGhpcy5tYXhpbWFsTnVtYmVyT2ZFbnRyaWVzID0gKDIgKiB0aGlzLm1heGltYWxOdW1iZXJPZkVudHJpZXMpICsgMTsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgdGhpcy5jb250ZW50U291cmNlVXJpID0gY29udGVudFNvdXJjZVVyaTsKLSAgICAgICAgdGhpcy5tZXRhU291cmNlVXJpID0gbWV0YVNvdXJjZVVyaTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSQ01MX0VYVEVOU0lPTiA9ICIucmNtbCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX1NFU1NJT05TID0gInVucmVzdHJpY3RlZCI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJjbWxTb3VyY2VVcmkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTb3VyY2VVcmkgKyBSQ01MX0VYVEVOU0lPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoZSBtZXRob2Qgd3JpdGUsIGlmIHRoZSBkb2N1bWVudCBpcyBkaXJ0eQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSkgewotICAgICAgICAgICAgd3JpdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBYTUwgUkNNTC1kb2N1bWVudCBpbiB0aGUgUkNNTC1maWxlLgotICAgICAqIEB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gc2F2ZVRvWG1sKCk7Ci0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJYTUwgZG9jdW1lbnQiLCBoZWxwZXIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU291cmNlVXRpbC53cml0ZURPTShoZWxwZXIuZ2V0RG9jdW1lbnQoKSwgZ2V0UmNtbFNvdXJjZVVyaSgpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjbGVhckRpcnR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYSBuZXcgZW50cnkgZm9yIGEgY2hlY2sgb3V0IG9yIGEgY2hlY2sgaW4gdGhlIFJDTUwtRmlsZSBtYWRlIGJ5IHRoZSB1c2VyIHdpdGggaWRlbnRpdHkKLSAgICAgKiBhdCB0aW1lCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUuCi0gICAgICogQHBhcmFtIHR5cGUgY28gZm9yIGEgY2hlY2sgb3V0LCBjaSBmb3IgYSBjaGVjayBpbgotICAgICAqIEBwYXJhbSB0aW1lCi0gICAgICogQHBhcmFtIGJhY2t1cCBDcmVhdGUgYmFja3VwIGVsZW1lbnQgKG9ubHkgY29uc2lkZXJlZCBmb3IgY2hlY2staW4gZW50cmllcykuCi0gICAgICogQHBhcmFtIG5ld1ZlcnNpb24gSWYgdGhlIHJldmlzaW9uIG51bWJlciBzaGFsbCBiZSBpbmNyZWFzZWQgKG9ubHkgY29uc2lkZXJlZCBmb3IgY2hlY2staW4KLSAgICAgKiAgICAgICAgZW50cmllcykuCi0gICAgICogQHBhcmFtIHJlc3RyaWN0ZWRUb1Nlc3Npb24gSWYgdGhlIGNoZWNrLW91dCBpcyByZXN0cmljdGVkIHRvIHRoZSBzZXNzaW9uIChvbmx5IGNvbnNpZGVyZWQgZm9yCi0gICAgICogICAgICAgIGNoZWNrLW91dCBlbnRyaWVzKS4KLSAgICAgKiBAdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2hlY2tPdXRJbihOb2RlIG5vZGUsIHNob3J0IHR5cGUsIGxvbmcgdGltZSwgYm9vbGVhbiBiYWNrdXAsCi0gICAgICAgICAgICBib29sZWFuIG5ld1ZlcnNpb24sIGJvb2xlYW4gcmVzdHJpY3RlZFRvU2Vzc2lvbikgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gbm9kZS5nZXRTZXNzaW9uKCkuZ2V0SWRlbnRpdHkoKS5nZXRVc2VyKCkuZ2V0SWQoKTsKLQotICAgICAgICBWZWN0b3IgZW50cmllcyA9IGdldEVudHJpZXMoKTsKLSAgICAgICAgaWYgKGVudHJpZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIGlmICh0eXBlID09IGNpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hlY2sgaW4gLSBub3QgY2hlY2tlZCBvdXQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSQ01MRW50cnkgbGF0ZXN0RW50cnkgPSBnZXRMYXRlc3RFbnRyeSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gbGF0ZXN0RW50cnkuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gKFN0cmluZykgRUxFTUVOVFMuZ2V0KG5ldyBTaG9ydCh0eXBlKSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUkNNTCBlbnRyeSB0eXBlIDwiICsgZWxlbWVudE5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIj4gbm90IGFsbG93ZWQgdHdpY2UgaW4gYSByb3cuIEJlZm9yZTogWyIgKyBsYXRlc3RFbnRyeS5nZXRJZGVudGl0eSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdLCBub3c6IFsiICsgaWRlbnRpdHkgKyAiXSwgbm9kZTogWyIgKyB0aGlzLmNvbnRlbnRTb3VyY2VVcmkgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNlc3Npb25JZDsKLSAgICAgICAgaWYgKHR5cGUgPT0gUkNNTC5jbyAmJiAhcmVzdHJpY3RlZFRvU2Vzc2lvbikgewotICAgICAgICAgICAgc2Vzc2lvbklkID0gQUxMX1NFU1NJT05TOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2Vzc2lvbklkID0gbm9kZS5nZXRTZXNzaW9uKCkuZ2V0SWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJDTUxFbnRyeSBlbnRyeTsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgUkNNTC5jaToKLSAgICAgICAgICAgIGludCB2ZXJzaW9uID0gMDsKLSAgICAgICAgICAgIENoZWNrSW5FbnRyeSBsYXRlc3RFbnRyeSA9IGdldExhdGVzdENoZWNrSW5FbnRyeSgpOwotICAgICAgICAgICAgaWYgKGxhdGVzdEVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gbGF0ZXN0RW50cnkuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5ld1ZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IG5ldyBDaGVja0luRW50cnkoc2Vzc2lvbklkLCBpZGVudGl0eSwgdGltZSwgdmVyc2lvbiwgYmFja3VwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJDTUwuY286Ci0gICAgICAgICAgICBlbnRyeSA9IG5ldyBDaGVja091dEVudHJ5KHNlc3Npb25JZCwgaWRlbnRpdHksIHRpbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBzdWNoIHR5cGU6IFsiICsgdHlwZSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnRyaWVzLmFkZCgwLCBlbnRyeSk7Ci0gICAgICAgIHNldERpcnR5KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgc2F2ZVRvWG1sKE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIFJDTUxFbnRyeSBlbnRyeSkKLSAgICAgICAgICAgIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSAoU3RyaW5nKSBFTEVNRU5UUy5nZXQobmV3IFNob3J0KGVudHJ5LmdldFR5cGUoKSkpOwotICAgICAgICBFbGVtZW50IGVudHJ5RWxlbWVudCA9IGhlbHBlci5jcmVhdGVFbGVtZW50KGVsZW1lbnROYW1lKTsKLQotICAgICAgICBlbnRyeUVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfSURFTlRJVFksIGVudHJ5LmdldElkZW50aXR5KCkpOwotICAgICAgICBlbnRyeUVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfU0VTU0lPTiwgZW50cnkuZ2V0U2Vzc2lvbklkKCkpOwotICAgICAgICBlbnRyeUVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfVElNRSwgTG9uZy50b1N0cmluZyhlbnRyeS5nZXRUaW1lKCkpKTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0VHlwZSgpID09IGNpKSB7Ci0gICAgICAgICAgICBDaGVja0luRW50cnkgY2hlY2tJbkVudHJ5ID0gKENoZWNrSW5FbnRyeSkgZW50cnk7Ci0gICAgICAgICAgICBlbnRyeUVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfVkVSU0lPTiwgSW50ZWdlci50b1N0cmluZyhjaGVja0luRW50cnkuZ2V0VmVyc2lvbigpKSk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tJbkVudHJ5Lmhhc0JhY2t1cCgpKSB7Ci0gICAgICAgICAgICAgICAgZW50cnlFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0JBQ0tVUCwgInRydWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbnRyeUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE5hbWVzcGFjZUhlbHBlciBzYXZlVG9YbWwoKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE5hbWVzcGFjZUhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSGVscGVyKE5BTUVTUEFDRSwgIiIsIEVMRU1FTlRfWFBTUkVWSVNJT05DT05UUk9MKTsKLSAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGhlbHBlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgVmVjdG9yIGVudHJpZXMgPSBnZXRFbnRyaWVzKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbnRyaWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFJDTUxFbnRyeSBlbnRyeSA9IChSQ01MRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHNhdmVUb1htbChoZWxwZXIsIGVudHJ5KTsKLSAgICAgICAgICAgICAgICByb290LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24oIkNvdWxkIGNyZWF0ZSByZXZpc2lvbiBjb250cm9sIFhNTCBbIgotICAgICAgICAgICAgICAgICAgICArIGdldFJjbWxTb3VyY2VVcmkoKSArICJdIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRMYXRlc3RFbGVtZW50KE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIFN0cmluZyB0eXBlKQotICAgICAgICAgICAgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVsZW1lbnQgcGFyZW50ID0gaGVscGVyLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0Rmlyc3RDaGlsZChwYXJlbnQsIHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgbGF0ZXN0IGNoZWNrIG91dAotICAgICAqIEByZXR1cm4gQ2hlY2tPdXRFbnRyeSBUaGUgZW50cnkgb2YgdGhlIGNoZWNrIG91dAotICAgICAqIEB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBDaGVja091dEVudHJ5IGdldExhdGVzdENoZWNrT3V0RW50cnkoKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChDaGVja091dEVudHJ5KSBnZXRMYXRlc3RFbnRyeShSQ01MLmNvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIGxhdGVzdCBjaGVjayBpbgotICAgICAqIEByZXR1cm4gQ2hlY2tJbkVudHJ5IFRoZSBlbnRyeSBvZiB0aGUgY2hlY2sgaW4KLSAgICAgKiBAdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tJbkVudHJ5IGdldExhdGVzdENoZWNrSW5FbnRyeSgpIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKENoZWNrSW5FbnRyeSkgZ2V0TGF0ZXN0RW50cnkoUkNNTC5jaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBsYXRlc3QgZW50cnkgKGEgY2hlY2sgb3V0IG9yIGNoZWNrIGluKQotICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlLgotICAgICAqIEByZXR1cm4gUkNNTEVudHJ5IFRoZSBlbnRyeSBvZiB0aGUgY2hlY2sgb3V0L2luCi0gICAgICogQHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFJDTUxFbnRyeSBnZXRMYXRlc3RFbnRyeShzaG9ydCB0eXBlKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgVmVjdG9yIGVudHJpZXMgPSBnZXRFbnRyaWVzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVudHJpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSQ01MRW50cnkgZW50cnkgPSAoUkNNTEVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRUeXBlKCkgPT0gdHlwZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUkNNTEVudHJ5IGdldExhdGVzdEVudHJ5KCkgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFZlY3RvciBlbnRyaWVzID0gZ2V0RW50cmllcygpOwotICAgICAgICBpZiAoZW50cmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChSQ01MRW50cnkpIGVudHJpZXMuZmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUkNNTEVudHJ5IGdldEVudHJ5KE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoQVRUUl9JREVOVElUWSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1NFU1NJT04pOwotICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9JREVOVElUWSk7Ci0gICAgICAgICAgICBTdHJpbmcgdGltZVN0cmluZyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfVElNRSk7Ci0gICAgICAgICAgICBsb25nIHRpbWUgPSBuZXcgTG9uZyh0aW1lU3RyaW5nKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscyhFTEVNRU5UX0NIRUNLSU4pKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uID0gbmV3IEludGVnZXIodmVyc2lvblN0cmluZykuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGJhY2t1cCA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKEFUVFJfQkFDS1VQKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrSW5FbnRyeShzZXNzaW9uSWQsIGlkZW50aXR5LCB0aW1lLCB2ZXJzaW9uLCBiYWNrdXApOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhFTEVNRU5UX0NIRUNLT1VUKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hlY2tPdXRFbnRyeShzZXNzaW9uSWQsIGlkZW50aXR5LCB0aW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIFJDTUwgZW50cnkgdHlwZTogWyIgKyB0eXBlICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMZWdhY3lFbnRyeShoZWxwZXIsIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJDTUxFbnRyeSBnZXRMZWdhY3lFbnRyeShOYW1lc3BhY2VIZWxwZXIgaGVscGVyLCBFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gZ2V0Q2hpbGRWYWx1ZShoZWxwZXIsIGVsZW1lbnQsIEVMRU1FTlRfU0VTU0lPTiwgIiIpOwotICAgICAgICBTdHJpbmcgaWRlbnRpdHkgPSBnZXRDaGlsZFZhbHVlKGhlbHBlciwgZWxlbWVudCwgRUxFTUVOVF9JREVOVElUWSk7Ci0gICAgICAgIFN0cmluZyB0aW1lU3RyaW5nID0gZ2V0Q2hpbGRWYWx1ZShoZWxwZXIsIGVsZW1lbnQsIEVMRU1FTlRfVElNRSk7Ci0gICAgICAgIGxvbmcgdGltZSA9IG5ldyBMb25nKHRpbWVTdHJpbmcpLmxvbmdWYWx1ZSgpOwotICAgICAgICBpZiAodHlwZS5lcXVhbHMoRUxFTUVOVF9DSEVDS0lOKSkgewotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBnZXRDaGlsZFZhbHVlKGhlbHBlciwgZWxlbWVudCwgRUxFTUVOVF9WRVJTSU9OKTsKLSAgICAgICAgICAgIGludCB2ZXJzaW9uID0gbmV3IEludGVnZXIodmVyc2lvblN0cmluZykuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYmFja3VwID0gaGVscGVyLmdldENoaWxkcmVuKGVsZW1lbnQsIEVMRU1FTlRfQkFDS1VQKS5sZW5ndGggPiAwOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGVja0luRW50cnkoc2Vzc2lvbklkLCBpZGVudGl0eSwgdGltZSwgdmVyc2lvbiwgYmFja3VwKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhFTEVNRU5UX0NIRUNLT1VUKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGVja091dEVudHJ5KHNlc3Npb25JZCwgaWRlbnRpdHksIHRpbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIFJDTUwgZW50cnkgdHlwZTogWyIgKyB0eXBlICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2hpbGRWYWx1ZShOYW1lc3BhY2VIZWxwZXIgaGVscGVyLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBjaGlsZE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSBEb2N1bWVudEhlbHBlci5nZXRGaXJzdENoaWxkKGVsZW1lbnQsIE5BTUVTUEFDRSwgY2hpbGROYW1lKTsKLSAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuZ2V0U2ltcGxlRWxlbWVudFRleHQoY2hpbGQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDaGlsZFZhbHVlKE5hbWVzcGFjZUhlbHBlciBoZWxwZXIsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGNoaWxkTmFtZSkgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gaGVscGVyLmdldEZpcnN0Q2hpbGQoZWxlbWVudCwgY2hpbGROYW1lKTsKLSAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgZWxlbWVudCA8IiArIGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICI+IGhhcyBubyBjaGlsZCBlbGVtZW50IDwiICsgY2hpbGROYW1lICsgIj4uIFNvdXJjZSBVUkk6IFsiCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0UmNtbFNvdXJjZVVyaSgpICsgIlsiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuZ2V0U2ltcGxlRWxlbWVudFRleHQoY2hpbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhbGwgY2hlY2sgaW4gYW5kIGNoZWNrIG91dAotICAgICAqIEByZXR1cm4gVmVjdG9yIG9mIGFsbCBjaGVjayBvdXQgYW5kIGNoZWNrIGluIGVudHJpZXMgaW4gdGhpcyBSQ01MLWZpbGUKLSAgICAgKiBAdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFZlY3RvciBnZXRFbnRyaWVzKCkgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVudHJpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldFJjbWxTb3VyY2VVcmkoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNvdXJjZVV0aWwuZXhpc3RzKHVyaSwgdGhpcy5tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCB4bWwgPSBTb3VyY2VVdGlsLnJlYWRET00odXJpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihOQU1FU1BBQ0UsICIiLCB4bWwpOwotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHBhcmVudCA9IHhtbC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudFtdIGVsZW1lbnRzID0gaGVscGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJDTUxFbnRyeSBlbnRyeSA9IGdldEVudHJ5KGhlbHBlciwgZWxlbWVudHNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcy5hZGQoZW50cnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IGFsbCBiYWNrdXAgZW50cmllcwotICAgICAqIEByZXR1cm4gVmVjdG9yIG9mIGFsbCBlbnRyaWVzIGluIHRoaXMgUkNNTC1maWxlIHdpdGggYSBiYWNrdXAKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFZlY3RvciBnZXRCYWNrdXBFbnRyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFZlY3RvciBlbnRyaWVzID0gZ2V0RW50cmllcygpOwotICAgICAgICBWZWN0b3IgYmFja3VwRW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZW50cmllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJDTUxFbnRyeSBlbnRyeSA9IChSQ01MRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFR5cGUoKSA9PSBSQ01MLmNpICYmICgoQ2hlY2tJbkVudHJ5KSBlbnRyeSkuaGFzQmFja3VwKCkpIHsKLSAgICAgICAgICAgICAgICBiYWNrdXBFbnRyaWVzLmFkZChlbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhY2t1cEVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1ha2VCYWNrdXAobG9uZyB0aW1lKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgbWFrZUJhY2t1cCh0aGlzLmNvbnRlbnRTb3VyY2VVcmksIHRpbWUpOwotICAgICAgICBtYWtlQmFja3VwKHRoaXMubWV0YVNvdXJjZVVyaSwgdGltZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG1ha2VCYWNrdXAoU3RyaW5nIHNvdXJjZVVyaSwgbG9uZyB0aW1lKQotICAgICAgICAgICAgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBiYWNrdXBTb3VyY2VVcmkgPSBnZXRCYWNrdXBTb3VyY2VVcmkoc291cmNlVXJpLCB0aW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChTb3VyY2VVdGlsLmV4aXN0cyhzb3VyY2VVcmksIG1hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgU291cmNlVXRpbC5jb3B5KHRoaXMubWFuYWdlciwgc291cmNlVXJpLCBiYWNrdXBTb3VyY2VVcmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXN0b3JlQmFja3VwKE5vZGUgbm9kZSwgbG9uZyB0aW1lKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlTm9kZSBzb3VyY2VOb2RlID0gKFNvdXJjZU5vZGUpIG5vZGU7Ci0gICAgICAgIHJlc3RvcmVCYWNrdXAoc291cmNlTm9kZS5nZXRDb250ZW50U291cmNlKCksIHRpbWUpOwotICAgICAgICByZXN0b3JlQmFja3VwKHNvdXJjZU5vZGUuZ2V0TWV0YVNvdXJjZSgpLCB0aW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVzdG9yZUJhY2t1cChTb3VyY2VXcmFwcGVyIHdyYXBwZXIsIGxvbmcgdGltZSkKLSAgICAgICAgICAgIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYmFja3VwU291cmNlVXJpID0gZ2V0QmFja3VwU291cmNlVXJpKHdyYXBwZXIsIHRpbWUpOwotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgIFNvdXJjZVV0aWwuY29weShyZXNvbHZlciwgYmFja3VwU291cmNlVXJpLCB3cmFwcGVyLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFja3VwU291cmNlVXJpKFNvdXJjZVdyYXBwZXIgd3JhcHBlciwgbG9uZyB0aW1lKSB7Ci0gICAgICAgIFN0cmluZyB1cmkgPSB3cmFwcGVyLmdldFJlYWxTb3VyY2VVcmkoKTsKLSAgICAgICAgcmV0dXJuIGdldEJhY2t1cFNvdXJjZVVyaSh1cmksIHRpbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFja3VwU291cmNlVXJpKFN0cmluZyB1cmksIGxvbmcgdGltZSkgewotICAgICAgICByZXR1cm4gdXJpICsgIi4iICsgdGltZSArICIuYmFrIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcnVuZSB0aGUgbGlzdCBvZiBlbnRyaWVzIGFuZCBkZWxldGUgdGhlIGNvcnJlc3BvbmRpbmcgYmFja3Vwcy4gTGltaXQgdGhlIG51bWJlciBvZiBlbnRyaWVzCi0gICAgICogdG8gdGhlIHZhbHVlIG1heGltYWxOdW1iZXJPZkVudHJpZXMgKDJtYXhOdW1iZXJPZlJvbGxiYWNrcyhjb25maWd1cmVkKSsxKQotICAgICAqIEB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcnVuZUVudHJpZXMoKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgVmVjdG9yIGVudHJpZXMgPSBnZXRFbnRyaWVzKCk7Ci0gICAgICAgIFJDTUxFbnRyeVtdIGFycmF5ID0gKFJDTUxFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IFJDTUxFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCi0gICAgICAgIGZvciAoaW50IGkgPSB0aGlzLm1heGltYWxOdW1iZXJPZkVudHJpZXM7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGJhY2t1cCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudHJ5Ci0gICAgICAgICAgICBSQ01MRW50cnkgZW50cnkgPSBhcnJheVtpXTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRUeXBlKCkgPT0gY2kgJiYgKChDaGVja0luRW50cnkpIGVudHJ5KS5oYXNCYWNrdXAoKSkgewotICAgICAgICAgICAgICAgIGxvbmcgdGltZSA9IGVudHJ5LmdldFRpbWUoKTsKLSAgICAgICAgICAgICAgICBkZWxldGVCYWNrdXAodGhpcy5jb250ZW50U291cmNlVXJpLCB0aW1lKTsKLSAgICAgICAgICAgICAgICBkZWxldGVCYWNrdXAodGhpcy5tZXRhU291cmNlVXJpLCB0aW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuZW50cmllcy5yZW1vdmUoZW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIHNldERpcnR5KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRlbGV0ZUJhY2t1cChTdHJpbmcgc291cmNlVXJpLCBsb25nIHRpbWUpCi0gICAgICAgICAgICB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHVyaSA9IGdldEJhY2t1cFNvdXJjZVVyaShzb3VyY2VVcmksIHRpbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU291cmNlVXRpbC5kZWxldGUodXJpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICAgICAgU291cmNlVXRpbC5kZWxldGVFbXB0eUNvbGxlY3Rpb25zKHVyaSwgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgZG9jdW1lbnQgaXMgZGlydHkKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZGlydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5kaXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIGRpcnR5IHRvIHRydWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREaXJ0eSgpIHsKLSAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBkaXJ0eSB0byBmYWxzZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyRGlydHkoKSB7Ci0gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIHRpbWUncyB2YWx1ZSBvZiB0aGUgYmFja3VwcwotICAgICAqIEByZXR1cm4gU3RyaW5nW10gdGhlIHRpbWVzCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEJhY2t1cHNUaW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgVmVjdG9yIGVudHJpZXMgPSBnZXRFbnRyaWVzKCk7Ci0gICAgICAgIExpc3QgdGltZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVudHJpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSQ01MRW50cnkgZW50cnkgPSAoUkNNTEVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRUeXBlKCkgPT0gY2kgJiYgKChDaGVja0luRW50cnkpIGVudHJ5KS5oYXNCYWNrdXAoKSkgewotICAgICAgICAgICAgICAgIHRpbWVzLmFkZChMb25nLnRvU3RyaW5nKGVudHJ5LmdldFRpbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHRpbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0aW1lcy5zaXplKCldKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZSB0aGUgcmV2aXNpb25zLCB0aGUgUkNNTCBzb3VyY2UgYW5kIHRoZSBjb2xsZWN0aW9uIGlmIHRoZSBsYXR0ZXIgaXMgZW1wdHkuCi0gICAgICogQHJldHVybiBib29sZWFuIHRydWUsIGlmIHRoZSBmaWxlIHdhcyBkZWxldGVkCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRlbGV0ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlbGV0ZVJldmlzaW9ucygpOwotICAgICAgICAgICAgU291cmNlVXRpbC5kZWxldGUoZ2V0UmNtbFNvdXJjZVVyaSgpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICAgICAgU291cmNlVXRpbC5kZWxldGVFbXB0eUNvbGxlY3Rpb25zKGdldFJjbWxTb3VyY2VVcmkoKSwgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRlbGV0ZSB0aGUgcmV2aXNpb25zCi0gICAgICogQHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gd2hlbiBzb210aGluZyB3ZW50IHdyb25nCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlbGV0ZVJldmlzaW9ucygpIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gdGltZXMgPSBnZXRCYWNrdXBzVGltZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGxvbmcgdGltZSA9IG5ldyBMb25nKHRpbWVzW2ldKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBkZWxldGVCYWNrdXAodGhpcy5jb250ZW50U291cmNlVXJpLCB0aW1lKTsKLSAgICAgICAgICAgICAgICBkZWxldGVCYWNrdXAodGhpcy5tZXRhU291cmNlVXJpLCB0aW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuZW50cmllcy5jbGVhcigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb3B5RnJvbShOb2RlIG5vZGUsIE5vZGUgb3RoZXJOb2RlKSB0aHJvd3MgUmV2aXNpb25Db250cm9sRXhjZXB0aW9uIHsKLQotICAgICAgICBTb3VyY2VOb2RlIG90aGVyU291cmNlTm9kZSA9IChTb3VyY2VOb2RlKSBvdGhlck5vZGU7Ci0gICAgICAgIFNvdXJjZU5vZGUgc291cmNlTm9kZSA9IChTb3VyY2VOb2RlKSBub2RlOwotICAgICAgICBTb3VyY2VOb2RlUkNNTCBvdGhlclJjbWwgPSAoU291cmNlTm9kZVJDTUwpICgoU291cmNlTm9kZSkgb3RoZXJOb2RlKS5nZXRSY21sKCk7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgVmVjdG9yIGJhY2t1cEVudHJpZXMgPSBvdGhlclJjbWwuZ2V0QmFja3VwRW50cmllcygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYmFja3VwRW50cmllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBSQ01MRW50cnkgZW50cnkgPSAoUkNNTEVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBlbnRyeS5nZXRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG90aGVyQ29udGVudFVyaSA9IG90aGVyUmNtbC5nZXRCYWNrdXBTb3VyY2VVcmkob3RoZXJTb3VyY2VOb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGVudFNvdXJjZSgpLCB0aW1lKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGhpc0NvbnRlbnRVcmkgPSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QmFja3VwU291cmNlVXJpKHNvdXJjZU5vZGUuZ2V0Q29udGVudFNvdXJjZSgpLCB0aW1lKTsKLSAgICAgICAgICAgICAgICBTb3VyY2VVdGlsLmNvcHkodGhpcy5tYW5hZ2VyLCBvdGhlckNvbnRlbnRVcmksIHRoaXNDb250ZW50VXJpKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBvdGhlck1ldGFVcmkgPSBvdGhlclJjbWwuZ2V0QmFja3VwU291cmNlVXJpKG90aGVyU291cmNlTm9kZS5nZXRNZXRhU291cmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGhpc01ldGFVcmkgPSB0aGlzLmdldEJhY2t1cFNvdXJjZVVyaShzb3VyY2VOb2RlLmdldE1ldGFTb3VyY2UoKSwgdGltZSk7Ci0gICAgICAgICAgICAgICAgU291cmNlVXRpbC5jb3B5KHRoaXMubWFuYWdlciwgb3RoZXJNZXRhVXJpLCB0aGlzTWV0YVVyaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIFZlY3RvciBvdGhlckVudHJpZXMgPSBvdGhlclJjbWwuZ2V0RW50cmllcygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJFbnRyaWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFJDTUxFbnRyeSBlbnRyeSA9IChSQ01MRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFJDTUxFbnRyeSBuZXdFbnRyeSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChlbnRyeS5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIGNvOgotICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeSA9IG5ldyBDaGVja091dEVudHJ5KGVudHJ5LmdldFNlc3Npb25JZCgpLCBlbnRyeS5nZXRJZGVudGl0eSgpLCBlbnRyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUaW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGNpOgotICAgICAgICAgICAgICAgICAgICBDaGVja0luRW50cnkgY2lFbnRyeSA9IChDaGVja0luRW50cnkpIGVudHJ5OwotICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeSA9IG5ldyBDaGVja0luRW50cnkoY2lFbnRyeS5nZXRTZXNzaW9uSWQoKSwgY2lFbnRyeS5nZXRJZGVudGl0eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpRW50cnkuZ2V0VGltZSgpLCBjaUVudHJ5LmdldFZlcnNpb24oKSwgY2lFbnRyeS5oYXNCYWNrdXAoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuYWRkKG5ld0VudHJ5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGUoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDaGVja2VkT3V0KCkgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJDTUxFbnRyeSBlbnRyeSA9IGdldExhdGVzdEVudHJ5KCk7Ci0gICAgICAgIHJldHVybiBlbnRyeSAhPSBudWxsICYmIGVudHJ5LmdldFR5cGUoKSA9PSBSQ01MLmNvOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjaGVja0luKE5vZGUgbm9kZSwgYm9vbGVhbiBiYWNrdXAsIGJvb2xlYW4gbmV3VmVyc2lvbikKLSAgICAgICAgICAgIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBsb25nIHRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLQotICAgICAgICBpZiAoYmFja3VwKSB7Ci0gICAgICAgICAgICBtYWtlQmFja3VwKHRpbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hlY2tPdXRJbihub2RlLCBSQ01MLmNpLCB0aW1lLCBiYWNrdXAsIG5ld1ZlcnNpb24sIGZhbHNlKTsKLSAgICAgICAgcHJ1bmVFbnRyaWVzKCk7Ci0gICAgICAgIHdyaXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrT3V0KE5vZGUgbm9kZSkgdGhyb3dzIFJldmlzaW9uQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrT3V0KG5vZGUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjaGVja091dChOb2RlIG5vZGUsIGJvb2xlYW4gcmVzdHJpY3RlZFRvU2Vzc2lvbikKLSAgICAgICAgICAgIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBjaGVja091dEluKG5vZGUsIFJDTUwuY28sIG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBmYWxzZSwgZmFsc2UsIHJlc3RyaWN0ZWRUb1Nlc3Npb24pOwotICAgICAgICB3cml0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZE91dEJ5U2Vzc2lvbihTZXNzaW9uIHNlc3Npb24pIHRocm93cyBSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gewotICAgICAgICBWZWN0b3IgZW50cmllcyA9IGdldEVudHJpZXMoKTsKLSAgICAgICAgaWYgKGVudHJpZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgUkNNTEVudHJ5IGVudHJ5ID0gKFJDTUxFbnRyeSkgZW50cmllcy5nZXQoMCk7Ci0gICAgICAgICAgICBTdHJpbmcgb3RoZXJTZXNzaW9uSWQgPSBlbnRyeS5nZXRTZXNzaW9uSWQoKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRUeXBlKCkgPT0gY28pIHsKLSAgICAgICAgICAgICAgICAvLyBub3QgcmVzdHJpY3RlZCB0byBzZXNzaW9uCi0gICAgICAgICAgICAgICAgaWYgKG90aGVyU2Vzc2lvbklkLmVxdWFscyhBTExfU0VTU0lPTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvdGhlclVzZXJJZCA9IGVudHJ5LmdldElkZW50aXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VySWQgPSBzZXNzaW9uLmdldElkZW50aXR5KCkuZ2V0VXNlcigpLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VySWQuZXF1YWxzKG90aGVyVXNlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gcmVzdHJpY3RlZCB0byBzZXNzaW9uCi0gICAgICAgICAgICAgICAgaWYgKG90aGVyU2Vzc2lvbklkLmVxdWFscyhzZXNzaW9uLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NvdXJjZU5vZGVSY21sRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NvdXJjZU5vZGVSY21sRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjM5M2NmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlUmNtbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5SQ01MOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIHNvdXJjZSBub2RlIFJDTUwgb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZU5vZGVSY21sRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTb3VyY2VOb2RlUmNtbEZhY3RvcnkgaW5zdGFuY2UgPSBuZXcgU291cmNlTm9kZVJjbWxGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3VyY2VOb2RlUmNtbEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcCB1cmkycmNtbCA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBTb3VyY2VOb2RlUmNtbEZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIEFuIFJDTUwgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUkNNTCBnZXRSY21sKFNvdXJjZU5vZGUgbm9kZSwgU2VydmljZU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBTdHJpbmcgdXJpID0gbm9kZS5nZXRTb3VyY2VVUkkoKTsKLSAgICAgICAgUkNNTCByY21sID0gKFJDTUwpIHRoaXMudXJpMnJjbWwuZ2V0KHVyaSk7Ci0gICAgICAgIGlmIChyY21sID09IG51bGwpIHsKLSAgICAgICAgICAgIHJjbWwgPSBuZXcgU291cmNlTm9kZVJDTUwobm9kZS5nZXRDb250ZW50U291cmNlKCkuZ2V0UmVhbFNvdXJjZVVyaSgpLCBub2RlCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXRhU291cmNlKCkuZ2V0UmVhbFNvdXJjZVVyaSgpLCBtYW5hZ2VyKTsKLSAgICAgICAgICAgIHRoaXMudXJpMnJjbWwucHV0KHVyaSwgcmNtbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJjbWw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NvdXJjZU5vZGVSZXZpc2lvbi5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvc291cmNlcmVwb3NpdG9yeS9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9yZXBvc2l0b3J5L1NvdXJjZU5vZGVSZXZpc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ZjYmQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VOb2RlUmV2aXNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGFpbmVyLkNvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJjLkNoZWNrSW5FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5SQ01MOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJjLlJDTUxFbnRyeTsKLQotLyoqCi0gKiBSZXZpc2lvbiBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZU5vZGVSZXZpc2lvbiBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZCBpbXBsZW1lbnRzIFJldmlzaW9uIHsKLQotICAgIHByaXZhdGUgU291cmNlTm9kZSBub2RlOwotICAgIHByaXZhdGUgaW50IG51bWJlcjsKLSAgICBwcml2YXRlIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBsb25nIHRpbWUgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyB1c2VySWQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZS4KLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSByZXZpc2lvbiBudW1iZXIuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIFRoZSBsb2dnZXIuCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZU5vZGVSZXZpc2lvbihTb3VyY2VOb2RlIG5vZGUsIGludCBudW1iZXIsIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLSAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIENvbnRhaW5lclV0aWwuZW5hYmxlTG9nZ2luZyh0aGlzLCBsb2dnZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFRpbWUoKSB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMudGltZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRoaXMudGltZSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFNvdXJjZU5vZGVSQ01MIHJjbWwgPSAoU291cmNlTm9kZVJDTUwpIHRoaXMubm9kZS5nZXRSY21sKCk7Ci0gICAgICAgICAgICAgICAgVmVjdG9yIGVudHJpZXMgPSByY21sLmdldEVudHJpZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbnRyaWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBSQ01MRW50cnkgZW50cnkgPSAoUkNNTEVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFR5cGUoKSA9PSBSQ01MLmNpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChDaGVja0luRW50cnkpIGVudHJ5KS5nZXRWZXJzaW9uKCkgPT0gdGhpcy5udW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZSA9IGVudHJ5LmdldFRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcklkID0gZW50cnkuZ2V0SWRlbnRpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLnRpbWUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gZW50cnkgZm91bmQgZm9yIFsiICsgdGhpcy5ub2RlLmdldFNvdXJjZVVSSSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdLCByZXZpc2lvbiBbIiArIHRoaXMubnVtYmVyICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgewotICAgICAgICBTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZVVyaSA9IGdldFNvdXJjZVVSSSgpOwotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHNvdXJjZVVyaSk7Ci0gICAgICAgICAgICBpZiAoc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gY2hlY2staW4gZW50cnkgZm91bmQgZm9yIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMubm9kZS5nZXRTb3VyY2VVUkkoKSArICJdLCByZXZpc2lvbiBbIiArIHRoaXMubnVtYmVyICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVVJJKCkgewotICAgICAgICBTb3VyY2VOb2RlUkNNTCByY21sID0gKFNvdXJjZU5vZGVSQ01MKSB0aGlzLm5vZGUuZ2V0UmNtbCgpOwotICAgICAgICBTdHJpbmcgc291cmNlVXJpID0gcmNtbC5nZXRCYWNrdXBTb3VyY2VVcmkodGhpcy5ub2RlLmdldENvbnRlbnRTb3VyY2UoKSwgZ2V0VGltZSgpKTsKLSAgICAgICAgcmV0dXJuIHNvdXJjZVVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YSBnZXRNZXRhRGF0YShTdHJpbmcgbmFtZXNwYWNlVXJpKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGFIYW5kbGVyKCkuZ2V0TWV0YURhdGEobmFtZXNwYWNlVXJpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNvdXJjZU5vZGVNZXRhRGF0YUhhbmRsZXIgbWV0YURhdGFIYW5kbGVyID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBTb3VyY2VOb2RlTWV0YURhdGFIYW5kbGVyIGdldE1ldGFEYXRhSGFuZGxlcigpIHsKLSAgICAgICAgaWYgKHRoaXMubWV0YURhdGFIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMubWV0YURhdGFIYW5kbGVyID0gbmV3IFNvdXJjZU5vZGVNZXRhRGF0YUhhbmRsZXIodGhpcy5tYW5hZ2VyLCBnZXRNZXRhU291cmNlVXJpKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhSGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFTb3VyY2VVcmkoKSB7Ci0gICAgICAgIFN0cmluZyByZWFsU291cmNlVXJpID0gU291cmNlV3JhcHBlci5jb21wdXRlUmVhbFNvdXJjZVVyaSh0aGlzLm1hbmFnZXIsIHRoaXMubm9kZS5nZXRTZXNzaW9uKCksIAotICAgICAgICAgICAgICAgIHRoaXMubm9kZS5nZXRTb3VyY2VVUkkoKSwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICByZXR1cm4gcmVhbFNvdXJjZVVyaSArICIubWV0YS4iICsgZ2V0VGltZSgpICsgIi5iYWsiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNZXRhRGF0YU5hbWVzcGFjZVVyaXMoKSB0aHJvd3MgTWV0YURhdGFFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGFIYW5kbGVyKCkuZ2V0TWV0YURhdGFOYW1lc3BhY2VVcmlzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFNvdXJjZVV0aWwuZXhpc3RzKGdldFNvdXJjZVVSSSgpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFNvdXJjZVV0aWwuZ2V0Q29udGVudExlbmd0aChnZXRTb3VyY2VVUkkoKSwgdGhpcy5tYW5hZ2VyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFNvdXJjZVV0aWwuZ2V0TGFzdE1vZGlmaWVkKGdldFNvdXJjZVVSSSgpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFNvdXJjZVV0aWwuZ2V0TWltZVR5cGUoZ2V0U291cmNlVVJJKCksIHRoaXMubWFuYWdlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcklkKCkgewotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLnVzZXJJZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VXcmFwcGVyLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy9zb3VyY2VyZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3JlcG9zaXRvcnkvU291cmNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk2YmMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3NvdXJjZXJlcG9zaXRvcnkvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvcmVwb3NpdG9yeS9Tb3VyY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmxvZ2dlci5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuTW9kaWZpYWJsZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlRyYXZlcnNhYmxlU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJjLkNoZWNrSW5FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yYy5SZXZpc2lvbkNvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBQcm92aWRlIGFjY2VzcyB0byBhIHNvdXJjZS4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVdyYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQgewotCi0gICAgcHJpdmF0ZSBTb3VyY2VOb2RlIG5vZGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlVXJpOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEBwYXJhbSBzb3VyY2VVcmkKLSAgICAgKiBAcGFyYW0gbWFuYWdlcgotICAgICAqIEBwYXJhbSBsb2dnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlV3JhcHBlcihTb3VyY2VOb2RlIG5vZGUsIFN0cmluZyBzb3VyY2VVcmksIFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIsIExvZ2dlciBsb2dnZXIpIHsKLQotICAgICAgICBBc3NlcnQubm90TnVsbCgibm9kZSIsIG5vZGUpOwotICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwotCi0gICAgICAgIEFzc2VydC5ub3ROdWxsKCJzb3VyY2UgVVJJIiwgc291cmNlVXJpKTsKLSAgICAgICAgdGhpcy5zb3VyY2VVcmkgPSBzb3VyY2VVcmk7Ci0KLSAgICAgICAgQXNzZXJ0Lm5vdE51bGwoInNlcnZpY2UgbWFuYWdlciIsIG1hbmFnZXIpOwotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCi0gICAgICAgIGVuYWJsZUxvZ2dpbmcobG9nZ2VyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWCA9ICJmaWxlOi8iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUFJFRklYID0gImNvbnRleHQ6Ly8iOwotCi0gICAgcHJvdGVjdGVkIFNvdXJjZU5vZGUgZ2V0Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubm9kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWFsU291cmNlVXJpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBhY3R1YWwgc291cmNlIHdoaWNoIGlzIHVzZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlYWxTb3VyY2VVcmkoKSB7Ci0gICAgICAgIGlmICh0aGlzLnJlYWxTb3VyY2VVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5yZWFsU291cmNlVXJpID0gY29tcHV0ZVJlYWxTb3VyY2VVcmkodGhpcy5tYW5hZ2VyLCBnZXROb2RlKCkuZ2V0U2Vzc2lvbigpLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZVVyaSwgZ2V0TG9nZ2VyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWxTb3VyY2VVcmk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29tcHV0ZVJlYWxTb3VyY2VVcmkoU2VydmljZU1hbmFnZXIgbWFuYWdlciwgU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZVVyaSwgTG9nZ2VyIGxvZ2dlcikgewotICAgICAgICBTdHJpbmcgY29udGVudERpciA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBwdWJsaWNhdGlvbklkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwdWJCYXNlID0gTm9kZS5MRU5ZQV9QUk9UT0NPTCArIFB1YmxpY2F0aW9uLlBVQkxJQ0FUSU9OX1BSRUZJWF9VUkkgKyAiLyI7Ci0gICAgICAgICAgICBTdHJpbmcgcHVibGljYXRpb25zUGF0aCA9IHNvdXJjZVVyaS5zdWJzdHJpbmcocHViQmFzZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBpbnQgZmlyc3RTbGFzaEluZGV4ID0gcHVibGljYXRpb25zUGF0aC5pbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBwdWJsaWNhdGlvbklkID0gcHVibGljYXRpb25zUGF0aC5zdWJzdHJpbmcoMCwgZmlyc3RTbGFzaEluZGV4KTsKLSAgICAgICAgICAgIERvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRVdGlsLmNyZWF0ZURvY3VtZW50RmFjdG9yeShtYW5hZ2VyLCBzZXNzaW9uKTsKLSAgICAgICAgICAgIFB1YmxpY2F0aW9uIHB1YiA9IGZhY3RvcnkuZ2V0UHVibGljYXRpb24ocHVibGljYXRpb25JZCk7Ci0gICAgICAgICAgICBjb250ZW50RGlyID0gcHViLmdldENvbnRlbnREaXIoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRCYXNlVXJpID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybElEID0gc291cmNlVXJpLnN1YnN0cmluZyhOb2RlLkxFTllBX1BST1RPQ09MLmxlbmd0aCgpKTsKLQotICAgICAgICAvLyBTdWJzdGl0dXRlIGUuZy4gImxlbnlhOi8vbGVueWEvcHVicy9QVUJfSUQvY29udGVudCIgYnkgImNvbnRlbnREaXIiCi0gICAgICAgIFN0cmluZyBmaWxlUHJlZml4ID0gdXJsSUQuc3Vic3RyaW5nKDAsIHVybElELmluZGV4T2YocHVibGljYXRpb25JZCkpICsgcHVibGljYXRpb25JZDsKLSAgICAgICAgU3RyaW5nIHRlbXBTdHJpbmcgPSB1cmxJRC5zdWJzdHJpbmcoZmlsZVByZWZpeC5sZW5ndGgoKSArIDEpOwotICAgICAgICBTdHJpbmcgZmlsZU1pZGRsZSA9IHRlbXBTdHJpbmcuc3Vic3RyaW5nKDAsIHRlbXBTdHJpbmcuaW5kZXhPZigiLyIpKTsKLSAgICAgICAgU3RyaW5nIGZpbGVTdWZmaXggPSB0ZW1wU3RyaW5nLnN1YnN0cmluZyhmaWxlTWlkZGxlLmxlbmd0aCgpICsgMSwgdGVtcFN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgIFN0cmluZyB1cmlTdWZmaXg7Ci0gICAgICAgIGlmIChuZXcgRmlsZShjb250ZW50RGlyKS5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgIC8vIEFic29sdXRlCi0gICAgICAgICAgICBjb250ZW50QmFzZVVyaSA9IEZJTEVfUFJFRklYICsgY29udGVudERpcjsKLSAgICAgICAgICAgIHVyaVN1ZmZpeCA9IEZpbGUuc2VwYXJhdG9yICsgZmlsZVN1ZmZpeDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFJlbGF0aXZlCi0gICAgICAgICAgICBjb250ZW50QmFzZVVyaSA9IENPTlRFWFRfUFJFRklYICsgY29udGVudERpcjsKLSAgICAgICAgICAgIHVyaVN1ZmZpeCA9ICIvIiArIGZpbGVTdWZmaXg7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVhbFNvdXJjZVVyaSA9IGNvbnRlbnRCYXNlVXJpICsgdXJpU3VmZml4OwotCi0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIVNvdXJjZVV0aWwuZXhpc3RzKGNvbnRlbnRCYXNlVXJpLCBtYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlRoZSBjb250ZW50IGRpcmVjdG9yeSBbIiArIGNvbnRlbnRCYXNlVXJpICsgIl0gZG9lcyBub3QgZXhpc3QuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJJdCB3aWxsIGJlIGNyZWF0ZWQgYXMgc29vbiBhcyBkb2N1bWVudHMgYXJlIGFkZGVkLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiUmVhbCBTb3VyY2UgVVJJOiAiICsgcmVhbFNvdXJjZVVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVhbFNvdXJjZVVyaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFibGUjZGVsZXRlVHJhbnNhY3Rpb25hYmxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVUcmFuc2FjdGlvbmFibGUoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIWdldE5vZGUoKS5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgZGVsZXRlIHNvdXJjZSBbIiArIGdldFNvdXJjZVVyaSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdOiBub3QgY2hlY2tlZCBvdXQhIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU291cmNlVXRpbC5kZWxldGUoZ2V0UmVhbFNvdXJjZVVyaSgpLCB0aGlzLm1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBieXRlW10gZGF0YSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEFuIGlucHV0IHN0cmVhbS4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlI2dldElucHV0U3RyZWFtKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBsb2FkRGF0YSgpOwotICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRoaXMgKyAiIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGhpcy5kYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlI2V4aXN0cygpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5kZWxldGVkID09IHRydWUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBTb3VyY2VVdGlsLmV4aXN0cyhnZXRSZWFsU291cmNlVXJpKCksIHRoaXMubWFuYWdlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbG9hZFJldmlzaW9uID0gLTE7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGUoKSB7Ci0gICAgICAgIHRoaXMuZGVsZXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGRhdGEgZnJvbSB0aGUgcmVhbCBzb3VyY2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9hZERhdGEoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCB8fCB0aGlzLmRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBUcmF2ZXJzYWJsZVNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgICAgICBzb3VyY2UgPSAoVHJhdmVyc2FibGVTb3VyY2UpIHJlc29sdmVyLnJlc29sdmVVUkkoZ2V0UmVhbFNvdXJjZVVyaSgpKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5leGlzdHMoKSAmJiAhc291cmNlLmlzQ29sbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpbiA9IHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGludCByZWFkID0gaW4ucmVhZChidWYpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKHJlYWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIHJlYWQpOwotICAgICAgICAgICAgICAgICAgICByZWFkID0gaW4ucmVhZChidWYpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgIHRoaXMubWltZVR5cGUgPSBzb3VyY2UuZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5sb2FkUmV2aXNpb24gPSB0aGlzLm5vZGUuZ2V0Q3VycmVudFJldmlzaW9uTnVtYmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIHNvdXJjZSBVUkxzIHdoaWNoIGFyZSBjdXJyZW50bHkgd3JpdHRlbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgbG9ja2VkVXJpcyA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hYmxlI3NhdmVUcmFuc2FjdGlvbmFibGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlVHJhbnNhY3Rpb25hYmxlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlNhdmluZyBbIiArIHRoaXMgKyAiXSB0byBzb3VyY2UgWyIgKyBnZXRSZWFsU291cmNlVXJpKCkgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZWFsU291cmNlVXJpID0gZ2V0UmVhbFNvdXJjZVVyaSgpOwotICAgICAgICAgICAgT2JqZWN0IGxvY2sgPSBsb2NrZWRVcmlzLmdldChyZWFsU291cmNlVXJpKTsKLSAgICAgICAgICAgIGlmIChsb2NrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2NrID0gbmV3IE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGxvY2tlZFVyaXMucHV0KHJlYWxTb3VyY2VVcmksIGxvY2spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgICAgICBzYXZlVHJhbnNhY3Rpb25hYmxlKHJlYWxTb3VyY2VVcmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2F2ZVRyYW5zYWN0aW9uYWJsZShTdHJpbmcgcmVhbFNvdXJjZVVyaSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBTb3VyY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIE1vZGlmaWFibGVTb3VyY2Ugc291cmNlID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIG1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotICAgICAgICAgICAgc291cmNlID0gKE1vZGlmaWFibGVTb3VyY2UpIHJlc29sdmVyLnJlc29sdmVVUkkocmVhbFNvdXJjZVVyaSk7Ci0KLSAgICAgICAgICAgIG91dCA9IHNvdXJjZS5nZXRPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotICAgICAgICAgICAgaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGhpcy5kYXRhKTsKLSAgICAgICAgICAgIGludCByZWFkID0gaW4ucmVhZChidWYpOwotCi0gICAgICAgICAgICB3aGlsZSAocmVhZCA+IDApIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICByZWFkID0gaW4ucmVhZChidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY2xvc2Ugc3RyZWFtczogIiwgdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5yZWxlYXNlKHJlc29sdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE91dHB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBOb2RlT3V0cHV0U3RyZWFtIGV4dGVuZHMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jY2xvc2UoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFNvdXJjZVdyYXBwZXIudGhpcy5kYXRhID0gc3VwZXIudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIFNvdXJjZVdyYXBwZXIudGhpcy5sYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU291cmNlV3JhcHBlci50aGlzLmdldE5vZGUoKS5yZWdpc3RlckRpcnR5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGxlbmd0aC4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlI2dldENvbnRlbnRMZW5ndGgoKQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvYWREYXRhKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoOwotICAgIH0KLQotICAgIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZSNnZXRMYXN0TW9kaWZpZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENoZWNrSW5FbnRyeSBlbnRyeSA9IHRoaXMubm9kZS5nZXRSY21sKCkuZ2V0TGF0ZXN0Q2hlY2tJbkVudHJ5KCk7Ci0gICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gZW50cnkuZ2V0VGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXZpc2lvbkNvbnRyb2xFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMubGFzdE1vZGlmaWVkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG1pbWVUeXBlOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIHN0cmluZy4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlI2dldE1pbWVUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBsb2FkRGF0YSgpOwotICAgICAgICByZXR1cm4gdGhpcy5taW1lVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzb3VyY2UgVVJJLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVXJpKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VVcmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBbiBvdXRwdXQgc3RyZWFtLgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGUjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkdldCBPdXRwdXRTdHJlYW0gZm9yICIgKyBnZXRTb3VyY2VVcmkoKSk7Ci0gICAgICAgIGxvYWREYXRhKCk7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZU91dHB1dFN0cmVhbSgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgaW50IGdldExvYWRSZXZpc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9hZFJldmlzaW9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL2NvbmZpZy9jb2Nvb24teGNvbmYvcHJvdG9jb2wtaGFuZGxlcnMueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy9zdmcvY29uZmlnL2NvY29vbi14Y29uZi9wcm90b2NvbC1oYW5kbGVycy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5NGEzZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zdmcvY29uZmlnL2NvY29vbi14Y29uZi9wcm90b2NvbC1oYW5kbGVycy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uIiB1bmxlc3M9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUubGVueWEubW9kdWxlcy5zdmcuU2l0ZVByb3RvY29sSGFuZGxlciddIj4KLQotICA8Y29tcG9uZW50IGxvZ2dlcj0ibGVueWEubW9kdWxlcy5zdmciCi0gICAgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnN2Zy5TaXRlUHJvdG9jb2xIYW5kbGVyIgotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuc3ZnLlByb3RvY29sSGFuZGxlciI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwcm90b2NvbCIgdmFsdWU9InNpdGUiLz4KLSAgPC9jb21wb25lbnQ+Ci0KLSAgPGNvbXBvbmVudCBsb2dnZXI9ImxlbnlhLm1vZHVsZXMuc3ZnIgotICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5zdmcuTGVueWFEb2N1bWVudFByb3RvY29sSGFuZGxlciIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnN2Zy5Qcm90b2NvbEhhbmRsZXIiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icHJvdG9jb2wiIHZhbHVlPSJsZW55YS1kb2N1bWVudCIvPgotICA8L2NvbXBvbmVudD4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjJlYTlmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnN2ZzwvaWQ+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC4xLWRldjwvdmVyc2lvbj4KLSAgPG5hbWU+U1ZHIGltYWdlIHJlbmRlcmluZzwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+VGhlIFNWRyBtb2R1bGUgZ2VuZXJhdGVzIHRoZSByb3VuZGVkIGNvcm5lcnMgZm9yCi0gIHRoZSBMZW55YSBkaWFsb2dzLCBhbmQgcmUtc2NhbGVzIHBpeGVsLWJhc2VkIEdJRiwgSlBHIGFuZCBQTkcgaW1hZ2VzIG9uIHRoZQotICBmbHksIGRlcGVuZGluZyBvbiBoZWlnaHQgYW5kIHdpZHRoIHF1ZXJ5IHBhcmFtZXRlcnMuIEl0IHVzZXMgQmF0aWsuPC9kZXNjcmlwdGlvbj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL2R1bW15LnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy9kdW1teS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Y2JmZjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL2R1bW15LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzdmcgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+Ci0gIFRoaXMgaXMgYSBkdW1teSBmaWxlCi08L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zdmcvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9tb2R1bGVzL3N2Zy9Qcm90b2NvbEhhbmRsZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL21vZHVsZXMvc3ZnL1Byb3RvY29sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWQzMWRiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL21vZHVsZXMvc3ZnL1Byb3RvY29sSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5zdmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmFjdGl2aXR5LlN0YXJ0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29tcG9uZW50LkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsucGFyYW1ldGVycy5QYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5wYXJhbWV0ZXJzLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsudGhyZWFkLlRocmVhZFNhZmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5iYXRpay51dGlsLlBhcnNlZFVSTDsKLWltcG9ydCBvcmcuYXBhY2hlLmJhdGlrLnV0aWwuUGFyc2VkVVJMRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmJhdGlrLnV0aWwuUGFyc2VkVVJMUHJvdG9jb2xIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLkNhc2NhZGluZ0lPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotCi0vKioKLSAqIEJhdGlrIFVSTCBwcm90b2NvbCBoYW5kbGVyIGZvciBwcm90b2NvbHMgd2hpY2ggYXJlIGhhbmRsZWQgYnkgdGhlIFNvdXJjZVJlc29sdmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJvdG9jb2xIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMgUGFyc2VkVVJMUHJvdG9jb2xIYW5kbGVyLAotICAgICAgICBUaHJlYWRTYWZlLCBTdGFydGFibGUsIENvbXBvbmVudCwgU2VydmljZWFibGUsIFBhcmFtZXRlcml6YWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QUk9UT0NPTCA9ICJwcm90b2NvbCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFID0gUHJvdG9jb2xIYW5kbGVyLmNsYXNzLmdldE5hbWUoKTsKLSAgICAKLSAgICBwcml2YXRlIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyOwotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb3RvY29sOwotCi0gICAgcHVibGljIFBhcnNlZFVSTERhdGEgcGFyc2VVUkwoU3RyaW5nIHVybFN0cikgewotICAgICAgICBpZiAodGhpcy5yZXNvbHZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQbGVhc2UgY2FsbCBzZXRSZXNvbHZlcigpIGZpcnN0ISIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUGFyc2VkVXJsRGF0YShnZXRQcm90b2NvbEhhbmRsZWQoKSwgdGhpcy5yZXNvbHZlciwgdXJsU3RyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyc2VkVVJMRGF0YSBwYXJzZVVSTChQYXJzZWRVUkwgYmFzZXB1cmwsIFN0cmluZyB1cmxTdHIpIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlVVJMKHVybFN0cik7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFBhcnNlZFVybERhdGEgZXh0ZW5kcyBQYXJzZWRVUkxEYXRhIHsKLQotICAgICAgICBwcml2YXRlIFNvdXJjZSBzb3VyY2U7Ci0gICAgICAgIHByaXZhdGUgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHVybDsKLQotICAgICAgICBwdWJsaWMgUGFyc2VkVXJsRGF0YShTdHJpbmcgcHJvdG9jb2wsIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgdXJsKSB7Ci0gICAgICAgICAgICB0aGlzLnVybCA9IHVybDsKLSAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKHVybCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IHRoaXMuc291cmNlLmdldE1pbWVUeXBlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE9wZW4gYSBzdHJlYW0gZm9yIHRoZSBkYXRhLiBJZiB0aGUgdGhyZWFkLWxvY2FsCi0gICAgICAgICAqIDxjb2RlPlNvdXJjZVJlc29sdmVyPC9jb2RlPiBleGlzdHMsIHRoZW4gdXNlIGl0LCBvdGhlcndpc2UgZmFsbAotICAgICAgICAgKiBiYWNrIHRvIDxjb2RlPlNvdXJjZUhhbmRsZXI8L2NvZGU+LgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIG9wZW5TdHJlYW1JbnRlcm5hbChTdHJpbmcgdXNlckFnZW50LCBJdGVyYXRvciBtaW1lVHlwZXMsCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZW5jb2RpbmdUeXBlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYXNjYWRpbmdJT0V4Y2VwdGlvbigiQ2Fubm90IG9wZW4gVVJMICIgKyB0aGlzLnVybCwgZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIucmVsZWFzZSh0aGlzLnNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0gICAgICAgIFBhcnNlZFVSTC5yZWdpc3RlckhhbmRsZXIodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmljZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2xIYW5kbGVkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJhbWV0ZXJpemUoUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBQYXJhbWV0ZXJFeGNlcHRpb24gewotICAgICAgICB0aGlzLnByb3RvY29sID0gcGFyYW1zLmdldFBhcmFtZXRlcihQQVJBTV9QUk9UT0NPTCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zdmcvc2hhcGUvY29ybmVyLmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL3NoYXBlL2Nvcm5lci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkYzBkNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zdmcvc2hhcGUvY29ybmVyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotCi1mdW5jdGlvbiBjb3JuZXIoKSB7Ci0KLSAgICB2YXIgd2hlcmUgPSBjb2Nvb24ucGFyYW1ldGVyc1sid2hlcmUiXTsKLSAgICB2YXIgciA9IGNvY29vbi5wYXJhbWV0ZXJzWyJyYWRpdXMiXTsKLSAgICB2YXIgeDsKLSAgICB2YXIgeTsKLSAgICB2YXIgd2lkdGg7Ci0gICAgdmFyIGhlaWdodDsKLSAgICAKLSAgICBpZiAod2hlcmUgPT0gInRvcExlZnQiKSB7Ci0gICAgICAgIHggPSByOwotICAgICAgICB5ID0gcjsKLSAgICAgICAgd2lkdGggPSByOwotICAgICAgICBoZWlnaHQgPSByOwotICAgIH0KLSAgICBlbHNlIGlmICh3aGVyZSA9PSAidG9wUmlnaHQiKSB7Ci0gICAgICAgIHggPSAwOwotICAgICAgICB5ID0gcjsKLSAgICAgICAgd2lkdGggPSByOwotICAgICAgICBoZWlnaHQgPSByOwotICAgIH0KLSAgICBlbHNlIGlmICh3aGVyZSA9PSAiYm90dG9tTGVmdCIpIHsKLSAgICAgICAgeCA9IHI7Ci0gICAgICAgIHkgPSAwOwotICAgICAgICB3aWR0aCA9IHI7Ci0gICAgICAgIGhlaWdodCA9IHI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHdoZXJlID09ICJib3R0b21SaWdodCIpIHsKLSAgICAgICAgeCA9IDA7Ci0gICAgICAgIHkgPSAwOwotICAgICAgICB3aWR0aCA9IHI7Ci0gICAgICAgIGhlaWdodCA9IHI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHdoZXJlID09ICJ0b3AiKSB7Ci0gICAgICAgIHggPSByOwotICAgICAgICB5ID0gMDsKLSAgICAgICAgd2lkdGggPSAxOwotICAgICAgICBoZWlnaHQgPSByOwotICAgIH0KLSAgICBlbHNlIGlmICh3aGVyZSA9PSAicmlnaHQiKSB7Ci0gICAgICAgIHggPSAwOwotICAgICAgICB5ID0gcjsKLSAgICAgICAgd2lkdGggPSByOwotICAgICAgICBoZWlnaHQgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmICh3aGVyZSA9PSAibGVmdCIpIHsKLSAgICAgICAgeCA9IHI7Ci0gICAgICAgIHkgPSAwOwotICAgICAgICB3aWR0aCA9IHI7Ci0gICAgICAgIGhlaWdodCA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKHdoZXJlID09ICJib3R0b20iKSB7Ci0gICAgICAgIHggPSAwOwotICAgICAgICB5ID0gMDsKLSAgICAgICAgd2lkdGggPSAxOwotICAgICAgICBoZWlnaHQgPSByOwotICAgIH0KLQotICAgIGNvY29vbi5zZW5kUGFnZSgidmlldy9jb3JuZXIiLCB7Ci0gICAgICAgICJiYWNrZ3JvdW5kQ29sb3IiIDogY29jb29uLnBhcmFtZXRlcnNbImJhY2tncm91bmRDb2xvciJdLAotICAgICAgICAibGluZUNvbG9yIiA6IGNvY29vbi5wYXJhbWV0ZXJzWyJsaW5lQ29sb3IiXSwKLSAgICAgICAgIngiIDogeCwKLSAgICAgICAgInkiIDogeSwKLSAgICAgICAgInIiIDogciwKLSAgICAgICAgIndpZHRoIiA6IHdpZHRoLAotICAgICAgICAiaGVpZ2h0IiA6IGhlaWdodAotICAgIH0pOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL3NoYXBlL2Nvcm5lci5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy9zaGFwZS9jb3JuZXIuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYmVhYjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL3NoYXBlL2Nvcm5lci5qeAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c3ZnCi0gIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgd2lkdGg9IiR7d2lkdGh9IiBoZWlnaHQ9IiR7aGVpZ2h0fSI+Ci0gIAotICA8c3ZnOmNpcmNsZQotICAgIGN4PSIke3h9IiBjeT0iJHt5fSIgcj0iJHtyfSIKLSAgICBzdHJva2U9IiR7bGluZUNvbG9yfSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSIke2JhY2tncm91bmRDb2xvcn0iLz4KLSAgCi0gIDxqeDppZiB0ZXN0PSIke3JlY3RhbmdsZX0iPgotICAgIDxzdmc6cmVjdCB4PSIwIiB5PSIiIHdpZHRoPSIiIGhlaWdodD0iIgotICAgICAgZmlsbD0iIiBzdHJva2Utd2lkdGg9IjAiLz4KLSAgPC9qeDppZj4KLSAgCi08L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zdmcvc2hhcGUvdGFiLmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL3NoYXBlL3RhYi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2YTM1NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zdmcvc2hhcGUvdGFiLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCi1mdW5jdGlvbiB0YWIoKSB7Ci0KLSAgICB2YXIgd2hlcmUgPSBjb2Nvb24ucGFyYW1ldGVyc1sid2hlcmUiXTsKLSAgICB2YXIgciA9IGNvY29vbi5wYXJhbWV0ZXJzWyJyYWRpdXMiXTsKLSAgICB2YXIgeDsKLSAgICB2YXIgeTsKLSAgICB2YXIgd2lkdGg7Ci0gICAgdmFyIGhlaWdodCA9IDUwOwotICAgIHZhciBtYXhXaWR0aCA9IDE1MDA7Ci0gICAgCi0gICAgaWYgKHdoZXJlID09ICJ0b3BMZWZ0IikgewotICAgICAgICB4ID0gcjsKLSAgICAgICAgeSA9IHI7Ci0gICAgICAgIHdpZHRoID0gbWF4V2lkdGg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHdoZXJlID09ICJ0b3BSaWdodCIpIHsKLSAgICAgICAgeCA9IC0xOwotICAgICAgICB5ID0gcjsKLSAgICAgICAgd2lkdGggPSByOwotICAgIH0KLSAgICBlbHNlIGlmICh3aGVyZSA9PSAiYm90dG9tTGVmdCIpIHsKLSAgICAgICAgeCA9IHI7Ci0gICAgICAgIHkgPSBoZWlnaHQgLSByIC0gMTsKLSAgICAgICAgd2lkdGggPSBtYXhXaWR0aDsKLSAgICB9Ci0gICAgZWxzZSBpZiAod2hlcmUgPT0gImJvdHRvbVJpZ2h0IikgewotICAgICAgICB4ID0gLTE7Ci0gICAgICAgIHkgPSBoZWlnaHQgLSByIC0gMTsKLSAgICAgICAgd2lkdGggPSByOwotICAgIH0KLQotICAgIGNvY29vbi5zZW5kUGFnZSgidmlldy90YWIiLCB7Ci0gICAgICAgICJiYWNrZ3JvdW5kQ29sb3IiIDogY29jb29uLnBhcmFtZXRlcnNbImJhY2tncm91bmRDb2xvciJdLAotICAgICAgICAibGluZUNvbG9yIiA6IGNvY29vbi5wYXJhbWV0ZXJzWyJsaW5lQ29sb3IiXSwKLSAgICAgICAgIndoZXJlIiA6IHdoZXJlLAotICAgICAgICAieCIgOiB4LAotICAgICAgICAieSIgOiB5LAotICAgICAgICAiciIgOiByLAotICAgICAgICAid2lkdGgiIDogd2lkdGgsCi0gICAgICAgICJoZWlnaHQiIDogaGVpZ2h0Ci0gICAgfSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy9zdmcvc2hhcGUvdGFiLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL3NoYXBlL3RhYi5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0MmE1Yy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy9zdmcvc2hhcGUvdGFiLmp4CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzdmcKLSAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgotICB3aWR0aD0iJHt3aWR0aH0iIGhlaWdodD0iJHtoZWlnaHR9Ij4KLSAgCi0gIDxkZWZzPgotICAgIDxjbGlwUGF0aCBpZD0iY2lyY2xlUGF0aCI+Ci0gICAgICA8ang6Y2hvb3NlPgotICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3kgPT0gcn0iPgotICAgICAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIke3J9IiBoZWlnaHQ9IiR7cn0iLz4KLSAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgIDxyZWN0IHg9IjAiIHk9IiR7eSArIDF9IiB3aWR0aD0iJHtyfSIgaGVpZ2h0PSIke3J9Ii8+Ci0gICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgPC9jbGlwUGF0aD4KLSAgPC9kZWZzPgotCi0gIDwhLS0gZGlzYWJsZWQsIHdvcmtzIHdpdGggTWFjIE9TIFgKLSAgPHN2ZzpyZWN0IHg9IiR7eCAtIHJ9IiB5PSIwIiB3aWR0aD0iJHt3aWR0aCArIHIgKyAxfSIgaGVpZ2h0PSIke2hlaWdodCAtIDF9IgotICAgIGZpbGw9IiR7YmFja2dyb3VuZENvbG9yfSIgc3Ryb2tlPSIke2xpbmVDb2xvcn0iIHN0cm9rZS13aWR0aD0iMiIvPgotICAtLT4KLSAgCi0gIDxzdmc6cmVjdCB4PSIke3ggLSByfSIgeT0iMCIgd2lkdGg9IiR7d2lkdGggKyByfSIgaGVpZ2h0PSIke2hlaWdodCAtIDF9IgotICAgIGZpbGw9IiR7YmFja2dyb3VuZENvbG9yfSIgc3Ryb2tlPSIke2xpbmVDb2xvcn0iIHN0cm9rZS13aWR0aD0iMSIvPgotICAgIAotICA8ang6Y2hvb3NlPgotICAgIDxqeDp3aGVuIHRlc3Q9IiR7eSA9PSByfSI+Ci0gICAgICA8c3ZnOnJlY3QgeD0iMCIgeT0iJHt5IC0gcn0iIHdpZHRoPSIke3J9IiBoZWlnaHQ9IiR7cn0iIGZpbGw9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMCIvPgotICAgIDwvang6d2hlbj4KLSAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgPHN2ZzpyZWN0IHg9IjAiIHk9IiR7eSArIDF9IiB3aWR0aD0iJHtyfSIgaGVpZ2h0PSIke3J9IiBmaWxsPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjAiLz4KLSAgICA8L2p4Om90aGVyd2lzZT4KLSAgPC9qeDpjaG9vc2U+Ci0gIAotICA8ZyBjbGlwLXBhdGg9InVybCgjY2lyY2xlUGF0aCkiPgotICAgIDxzdmc6Y2lyY2xlCi0gICAgICBjeD0iJHt4fSIgY3k9IiR7eX0iIHI9IiR7cn0iCi0gICAgICBzdHJva2U9IiR7bGluZUNvbG9yfSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSIke2JhY2tncm91bmRDb2xvcn0iLz4KLSAgPC9nPgotICAKLTwvc3ZnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy9zaXRlbWFwLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy9zdmcvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTE2Y2M0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy9zaXRlbWFwLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4NCi0gIA0KLSAgPG1hcDpmbG93IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4NCi0gICAgPG1hcDpzY3JpcHQgc3JjPSJzaGFwZS9jb3JuZXIuanMiLz4NCi0gICAgPG1hcDpzY3JpcHQgc3JjPSJzaGFwZS90YWIuanMiLz4NCi0gIDwvbWFwOmZsb3c+DQotICANCi0gIDxtYXA6cGlwZWxpbmVzPg0KLSAgICANCi0gICAgPG1hcDpwaXBlbGluZT4NCi0gICAgICA8IS0tIGVuYWJsZSBjbGllbnQgc2lkZSBjYWNoaW5nIG9mIHJlc291cmNlcyAtLT4NCi0gICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJleHBpcmVzIiB2YWx1ZT0ie2dsb2JhbDpwaXBlbGluZS1leHBpcmF0aW9ufSIvPgotICAgICAgDQotICAgICAgPCEtLQ0KLSAgICAgICAgVmlld3MgZm9yIHNoYXBlIGZsb3dzY3JpcHRzLg0KLSAgICAgIC0tPg0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0idmlldy8qIj4NCi0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0iangiIHNyYz0ic2hhcGUvezF9Lmp4Ii8+DQotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4NCi0gICAgICA8L21hcDptYXRjaD4NCi0gICAgICANCi0gICAgICA8IS0tDQotICAgICAgICBJbnRlcm5hbCBwaXBlbGluZSB0byBnZW5lcmF0ZSBzaGFwZSBTVkdzLg0KLSAgICAgICAgc2hhcGUve3R5cGV9LXt3aGVyZX0te3JhZGl1c30te2JhY2tncm91bmRDb2xvcn0te2xpbmVDb2xvcn0NCi0gICAgICAgIGV4YW1wbGU6IHNoYXBlL2Nvcm5lci10b3BMZWZ0LTUtRkYwMDAwLTAwMDAwMA0KLSAgICAgIC0tPg0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ic2hhcGUvKi0qLSotKi0qLnN2ZyI+DQotICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249InsxfSI+DQotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IndoZXJlIiB2YWx1ZT0iezJ9Ii8+DQotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJhZGl1cyIgdmFsdWU9InszfSIvPg0KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJiYWNrZ3JvdW5kQ29sb3IiIHZhbHVlPSIjezR9Ii8+DQotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImxpbmVDb2xvciIgdmFsdWU9IiN7NX0iLz4NCi0gICAgICAgIDwvbWFwOmNhbGw+DQotICAgICAgPC9tYXA6bWF0Y2g+DQotICAgICAgDQotICAgICAgPCEtLQ0KLSAgICAgICAgVGhpcyBtYXRjaGVzIGEgc2hhcGUgVVJMLg0KLSAgICAgICAge3R5cGV9LXt3aGVyZX0te3JhZGl1c30te2JhY2tncm91bmRDb2xvcn0te2xpbmVDb2xvcn0NCi0gICAgICAgIGV4YW1wbGU6IGNvcm5lci10b3BMZWZ0LTUtRkYwMDAwLTAwMDAwMA0KLSAgICAgIC0tPg0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi0qLSotKi0qLnBuZyI+DQotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi9zaGFwZS97MX0tezJ9LXszfS17NH0tezV9LnN2ZyIvPg0KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ic3ZnMnBuZyIvPg0KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gICAgPG1hcDpwaXBlbGluZSB0eXBlPSJub25jYWNoaW5nIj4KLSAgICAgIA0KLSAgICAgIDwhLS0NCi0gICAgICAgIGltYWdlIHJlc2l6aW5nIHBpcGVsaW5lcw0KLSAgICAgIC0tPg0KLSAgICAgIDwhLS0ge3B1YklkfS97YXJlYX0ve3BhdGh9LntleHRlbnNpb259IC0tPg0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qLyoqLioiPg0KLSAgICAgICAgDQotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKGdpZnxHSUZ8R2lmKSQiPiANCi0gICAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzLWVuaGFuY2VkIj4NCi0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIvPg0KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InR5cGUiIHZhbHVlPSJmaWxlIi8+DQotICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvey4uLy4uLzJ9L3suLi8uLi8zfS57Li4vLi4vNH0iIG1pbWUtdHlwZT0iaW1hZ2UvZ2lmIiAvPg0KLSAgICAgICAgICA8L21hcDphY3Q+DQotICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc291cmNlLWV4aXN0cy1lbmhhbmNlZCI+DQotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJsIiB2YWx1ZT0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvc2hhcmVkL3suLi8zfS57Li4vNH0iLz4NCi0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ0eXBlIiB2YWx1ZT0iZmlsZSIvPg0KLSAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vLi4vM30uey4uLy4uLzR9IiBtaW1lLXR5cGU9ImltYWdlL2dpZiIgLz4NCi0gICAgICAgICAgPC9tYXA6YWN0Pg0KLSAgICAgICAgICA8bWFwOmFjdCB0eXBlPSJsYW5ndWFnZS1leGlzdHMiPg0KLSAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImxlbnlhLWRvY3VtZW50OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9LGxhbmc9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9IiBtaW1lLXR5cGU9ImltYWdlL2dpZiIvPg0KLSAgICAgICAgICA8L21hcDphY3Q+ICANCi0gICAgICAgIDwvbWFwOm1hdGNoPg0KLSAgICAgICAgDQotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iZHVtbXkueG1sIi8+DQotICAgICAgICA8bWFwOmFjdCB0eXBlPSJyZXNvdXJjZS1leGlzdHMiPg0KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJsZW55YS1kb2N1bWVudDp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSxsYW5nPXtwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSxwdWI9ezF9LGFyZWE9ezJ9Ii8+DQotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0ieHNsdC9zY2FsZS54c2wiPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJsIiB2YWx1ZT0ibGVueWEtZG9jdW1lbnQ6e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0sbGFuZz17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX0scHViPXsuLi8xfSxhcmVhPXsuLi8yfXtsaW5rOnJldn0iLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06d2lkdGh9Ii8+DQotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06aGVpZ2h0fSIvPg0KLSAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+DQotICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc291cmNlLWV4aXN0cy1lbmhhbmNlZCI+DQotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVybCIgdmFsdWU9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97M30uezR9Ii8+DQotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InR5cGUiIHZhbHVlPSJmaWxlIi8+DQotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0ieHNsdC9zY2FsZS54c2wiPg0KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVybCIgdmFsdWU9IntmYWxsYmFjazpyZXNvdXJjZXMvc2hhcmVkL3suLi8zfS57Li4vNH19Ii8+DQotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmV2aXNpb24iIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpsZW55YS5yZXZpc2lvbn0iLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06d2lkdGh9Ii8+DQotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB2YWx1ZT0ie3JlcXVlc3QtcGFyYW06aGVpZ2h0fSIvPg0KLSAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+DQotICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoanBnfEpQR3xKcGd8anBlZ3xKcGVnfEpQRUcpJCI+Ci0gICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ic3ZnMmpwZWciLz4NCi0gICAgICAgIDwvbWFwOm1hdGNoPg0KLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShwbmd8UE5HfFBuZykkIj4gDQotICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InN2ZzJwbmciLz4NCi0gICAgICAgIDwvbWFwOm1hdGNoPg0KLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKSh0aWZ8VElGfFRpZikkIj4gDQotICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InN2ZzJ0aWZmIi8+DQotICAgICAgICA8L21hcDptYXRjaD4gDQotICAgICAgPC9tYXA6bWF0Y2g+DQotICAgICAgDQotICAgIDwvbWFwOnBpcGVsaW5lPg0KLSAgICANCi0gIDwvbWFwOnBpcGVsaW5lcz4NCi08L21hcDpzaXRlbWFwPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy94c2x0L2ltYWdlMnN2Zy54c2wgYi90cnVuay9zcmMvbW9kdWxlcy9zdmcveHNsdC9pbWFnZTJzdmcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWY3NjU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy94c2x0L2ltYWdlMnN2Zy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDppbWdbQGhlaWdodCBhbmQgQHdpZHRoXS9Ac3JjIj4KLSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmMiPgotICAgICAgPCEtLSBpZiB0aGUgc3JjIGF0dHJpYnV0ZSBhbHJlYWR5IGNvbnRhaW5zIGEgcXVlcnlzdHJpbmcsIGN1dCBpdCBvZmYuIG90aGVyd2lzZSwgbXVsdGlwbGUKLSAgICAgICAgICAgcXVlcnlzdHJpbmdzIGNhbiBhY2N1bXVsYXRlISAKLSAgICAgICAgICAgTkI6IHN1YnN0cmluZy1iZWZvcmUgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSBuZWVkbGUgaXMgbm90IGZvdW5kLgotICAgICAgLS0+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKC4sJz8nKSI+Ci0gICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKC4sJz8nKSIvPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgPHhzbDp0ZXh0Pj88L3hzbDp0ZXh0PgotICAgICAgPHhzbDp0ZXh0PmxlbnlhLm1vZHVsZT1zdmcmYW1wOzwveHNsOnRleHQ+Ci0gICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZyguLi9AaGVpZ2h0KSI+Ci0gICAgICAgIDx4c2w6dGV4dD5oZWlnaHQ9PC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQGhlaWdodCIvPjx4c2w6dGV4dD4mYW1wOzwveHNsOnRleHQ+Ci0gICAgICA8L3hzbDppZj4KLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nKC4uL0B3aWR0aCkiPgotICAgICAgICA8eHNsOnRleHQ+d2lkdGg9PC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHdpZHRoIi8+Ci0gICAgICA8L3hzbDppZj4gICAgICAgICAKLSAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL3hzbHQvc2NhbGUueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvc3ZnL3hzbHQvc2NhbGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhiODhjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3N2Zy94c2x0L3NjYWxlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0idXJsIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iaGVpZ2h0Ii8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0id2lkdGgiLz4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDxzdmcgd2lkdGg9Inskd2lkdGh9IiBoZWlnaHQ9InskaGVpZ2h0fSIgdmVyc2lvbj0iMS4xIj4KLSAgICAgIDxpbWFnZSB4PSIwIiB5PSIwIiB3aWR0aD0ieyR3aWR0aH0iIGhlaWdodD0ieyRoZWlnaHR9IiB4bGluazpocmVmPSJ7JHVybH0iIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiLz4gICAgICAgIAotICAgIDwvc3ZnPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvVE9ETyBiL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjNzljMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1UaW55TUNFIGludGVncmF0aW9uOiBUT0RPCi0KLSogbWFrZSBqYXZhIHVzZWNhc2UgaGFuZGxlciBnZW5lcmljIGFuZCBzaGFyZSB3aXRoIG90aGVyIGVkaXRvcnMKLSogd2hlbiBkb25lLCBtb3ZlIHRoZXNlIGdlbmVyaWMgdXNlY2FzZXMgaW50byB0aGUgZWRpdG9ycyBtb2R1bGUKLSogZml4IHd5c2l3eWc6IHNvbWUgb2YgdGhlIGNzcyBzdHlsZXMgYXJlIG5vdCBwcm9wZXJseSBwYXNzZWQgdG8gdGhlIGVkaXRvcgotY29udGVudCAoZm9udC1zaXplIGFuZCBmb250LWZhbWlseSkKLSogYWRkIG9udW5sb2FkIGhhbmRsZXIgdG8gYXZvaWQgZGF0YSBsb3NzIGlmIHRoZSB1c2VyIGFjY2lkZW50YWxseSBjbGlja3MKLW9uIGEgbGluayBvciBjbG9zZXMgdGhlIHdpbmRvdyAoY29uZmlybWF0aW9uIGRpYWxvZyBsaWtlIGJ4ZSkgLSBkb25lIGJ5Ci1qcmFnYWxsZXIgKHBhdGNoIGluIGJ1Z3ppbGxhKSwgbmVlZHMgdG8gYmUgbWFkZSBnZW5lcmljCi0qIGFsbG93IG11bHRpcGxlIHJlc291cmNlIHR5cGVzIHRvIGJlIGVkaXRlZCB3aXRoIGRpZmZlcmVudCB2YWxpZF9lbGVtZW50cwotc2V0dGluZ3MuCi0qIGFsbG93IG11bHRpcGxlIGVkaXRhYmxlIGFyZWFzLgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS10aW55bWNlLWVkaXQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZS10aW55bWNlLWVkaXQueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjgzNjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtdGlueW1jZS1lZGl0Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd0aW55bWNlLmVkaXQnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ0aW55bWNlLmVkaXQiIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmVkaXRvcnMudGlueW1jZS5UaW55TWNlIj4KLSAgICA8dHJhbnNhY3Rpb24gcG9saWN5PSJwZXNzaW1pc3RpYyIvPgotICAgIDx2aWV3IHVyaT0iL21vZHVsZXMvdGlueW1jZS90aW55bWNlLmVkaXQiIG1lbnU9ImZhbHNlIi8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotICAgIAotPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvY29uZmlnL21lbnUueHNwIGIvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9jb25maWcvbWVudS54c3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTFmZmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9jb25maWcvbWVudS54c3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhzcDpwYWdlIAotICAgIGxhbmd1YWdlPSJqYXZhIiAKLSAgICB4bWxuczp4c3A9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcCIKLSAgICB4bWxuczp4c3AtcmVxdWVzdD0iaHR0cDovL2FwYWNoZS5vcmcveHNwL3JlcXVlc3QvMi4wIgotICAgIHhtbG5zOmlucHV0PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24veHNwL2lucHV0LzEuMCIKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICAgIHhtbG5zOndmPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvd29ya2Zsb3cvMS4wIgotICAgIHhtbG5zOnVjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLT4KLQotICA8bWVudT4KLSAgICA8bWVudXM+Ci0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkVkaXQiPgotICAgICAgICAgIDx4c3A6bG9naWM+Ci0gICAgICAgICAgICBTdHJpbmcgZG9jdHlwZSA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9InN0cmluZyIgbmFtZT0iZG9jdW1lbnQtdHlwZSIvPjsKLSAgICAgICAgICAgIGlmICgieGh0bWwiLmVxdWFscyhkb2N0eXBlKSB8fCAiaG9tZXBhZ2UiLmVxdWFscyhkb2N0eXBlKSkgewotICAgICAgICAgICAgICAgIDxibG9jayBpbmZvPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICA8aXRlbSB3ZjpldmVudD0iZWRpdCIgdWM6dXNlY2FzZT0idGlueW1jZS5lZGl0IiBocmVmPSI/Ij48aTE4bjp0ZXh0PldpdGggVGlueU1DRTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICAgICAgICA8L2Jsb2NrPgotICAgICAgICAgICAgfQotICAgICAgICAgIDwveHNwOmxvZ2ljPgotICAgICAgPC9tZW51PgotICAgICAgCi0gICAgPC9tZW51cz4KLSAgICAKLSAgPC9tZW51PgotPC94c3A6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjU2YTRiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvY29uZmlnL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bW9kdWxlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIj4KLSAgPGlkPm9yZy5hcGFjaGUubGVueWEubW9kdWxlcy50aW55bWNlPC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5yZXNvdXJjZSIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5lZGl0b3JzIi8+Ci0gIDxwYWNrYWdlPm9yZy5hcGFjaGUubGVueWEubW9kdWxlczwvcGFja2FnZT4KLSAgPHZlcnNpb24+MC41LjE8L3ZlcnNpb24+Ci0gIDxuYW1lPlRpbnlNQ0UgTW9kdWxlPC9uYW1lPgotICA8bGVueWEtdmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L2xlbnlhLXZlcnNpb24+Ci0gIDxkZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIHRoZSBUaW55TUNFIFdZU0lXWUcgWEhUTUwgZWRpdG9yLiBXb3JrIGluCi0gIHByb2dyZXNzLjwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy90aW55bWNlL1RpbnlNY2UuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvZWRpdG9ycy90aW55bWNlL1RpbnlNY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0MGYxMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2VkaXRvcnMvdGlueW1jZS9UaW55TWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoKLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuZWRpdG9ycy50aW55bWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5Db250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkRvY3VtZW50VXNlY2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS54bWwuVXNlY2FzZUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuVXNlY2FzZVdvcmtmbG93SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5WYWxpZGF0aW9uVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVGlueU1jZSBVc2VjYXNlCi0gKiAKLSAqIHNpbmNlIHRoZXJlIGlzIG5vIHJlYWxseSB0aW55bWNlLXNwZWNpZmljIGNvZGUgaW4gaGVyZSwgbW9zdCBtZXRob2RzIHNob3VsZAotICogZXZlbnR1YWxseSBiZSBtb3ZlZCBpbnRvIERvY3VtZW50VXNlY2FzZSBhbmQgc2hhcmVkIGFjcm9zcyBhbGwgZWRpdG9yIHVzZWNhc2VzLgotICovCi0KLXB1YmxpYyBjbGFzcyBUaW55TWNlIGV4dGVuZHMgRG9jdW1lbnRVc2VjYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZ2V0Tm9kZXNUb0xvY2soKQotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5Lk5vZGVbXSBnZXROb2Rlc1RvTG9jaygpIHRocm93cyBVc2VjYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5Ob2RlW10gb2JqZWN0cyA9IHsgZ2V0U291cmNlRG9jdW1lbnQoKS5nZXRSZXBvc2l0b3J5Tm9kZSgpIH07Ci0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IENvbnRleHRIZWxwZXIuZ2V0UmVxdWVzdCh0aGlzLmNvbnRleHQpOwotICAgICAgICBzZXRQYXJhbWV0ZXIoImhvc3QiLCAiaHR0cDovLyIgKyByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSArICI6IiArIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKCJyZXF1ZXN0dXJpIiwgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9DaGVja1ByZWNvbmRpdGlvbnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tQcmVjb25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmRvQ2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIFVzZWNhc2VXb3JrZmxvd0hlbHBlci5jaGVja1dvcmtmbG93KHRoaXMubWFuYWdlciwgdGhpcywgZ2V0RXZlbnQoKSwgZ2V0U291cmNlRG9jdW1lbnQoKSwKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLQotICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldFhtbFN0cmluZyhnZXRFbmNvZGluZygpKTsKLQotICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoY29udGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYXZlRG9jdW1lbnQoZ2V0RW5jb2RpbmcoKSwgY29udGVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gQ29udGV4dEhlbHBlci5nZXRSZXF1ZXN0KHRoaXMuY29udGV4dCk7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0WG1sU3RyaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICAvLyBHZXQgbmFtZXNwYWNlcwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlcyA9IHJlbW92ZVJlZHVuZGFudE5hbWVzcGFjZXMoZ2V0UGFyYW1ldGVyQXNTdHJpbmcoInRpbnltY2UubmFtZXNwYWNlcyIpKTsKLSAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKG5hbWVzcGFjZXMpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFnZ3JlZ2F0ZSBjb250ZW50Ci0gICAgICAgIFN0cmluZyBjb250ZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBlbmNvZGluZyArICJcIj8+XG4iCi0gICAgICAgICAgICAgICAgKyAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIgIiArIG5hbWVzcGFjZXMgKyAiPlxuIgotICAgICAgICAgICAgICAgICsgIiAgPGhlYWQ+PHRpdGxlPjwvdGl0bGU+PC9oZWFkPlxuIiArICIgIDxib2R5PlxuIgotICAgICAgICAgICAgICAgICsgZ2V0UGFyYW1ldGVyQXNTdHJpbmcoInRpbnltY2UuY29udGVudCIpICsgIiAgPC9ib2R5PlxuIiArICI8L2h0bWw+XG4iOwotICAgICAgICByZXR1cm4gY29udGVudDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGFkdmFuY2UoKSB0aHJvd3MgVXNlY2FzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsZWFyRXJyb3JNZXNzYWdlcygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnQgeG1sID0gZ2V0WG1sKCk7Ci0gICAgICAgICAgICBpZiAoeG1sICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZSh4bWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgIFNvdXJjZVV0aWwud3JpdGVET00oeG1sLCBnZXRTb3VyY2VEb2N1bWVudCgpLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBkZWxldGVQYXJhbWV0ZXIoImNvbnRlbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVc2VjYXNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKGhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudCB4bWwgPSBnZXRYbWwoKTsKLSAgICAgICAgaWYgKHhtbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSh4bWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoRG9jdW1lbnQgeG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGdldFNvdXJjZURvY3VtZW50KCkuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0gICAgICAgIFNjaGVtYSBzY2hlbWEgPSByZXNvdXJjZVR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIFZhbGlkYXRpb25VdGlsLnZhbGlkYXRlKHRoaXMubWFuYWdlciwgeG1sLCBzY2hlbWEsIG5ldyBVc2VjYXNlRXJyb3JIYW5kbGVyKHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0WG1sKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgU3RyaW5nIHhtbFN0cmluZyA9IGdldFhtbFN0cmluZyhlbmNvZGluZyk7Ci0KLSAgICAgICAgRG9jdW1lbnQgeG1sID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHhtbCA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudCh4bWxTdHJpbmcsIGVuY29kaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiZXJyb3ItZG9jdW1lbnQtZm9ybSIsIG5ldyBTdHJpbmdbXSB7IGUuZ2V0TWVzc2FnZSgpIH0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWw7Ci0gICAgfQotCi0gICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50IHRvIHRoZSBkb2N1bWVudCBzb3VyY2UuIEFmdGVyIHNhdmluZywgdGhlIFhNTCBpcwotICAgICAqIHZhbGlkYXRlZC4gSWYgdmFsaWRhdGlvbiBlcnJvcnMgb2NjdXIsIHRoZSB1c2VjYXNlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZAotICAgICAqIGJhY2ssIHNvIHRoZSBjaGFuZ2VzIGFyZSBub3QgcGVyc2lzdGVudC4gSWYgdGhlIHZhbGlkYXRpb24gc3VjY2VlZGVkLCB0aGUKLSAgICAgKiB3b3JrZmxvdyBldmVudCBpcyBpbnZva2VkLgotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2RpbmcgdG8gdXNlLgotICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHNhdmUuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVEb2N1bWVudChTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2F2ZVhNTEZpbGUoZW5jb2RpbmcsIGNvbnRlbnQsIGdldFNvdXJjZURvY3VtZW50KCkpOwotCi0gICAgICAgIFdvcmtmbG93VXRpbC5pbnZva2UodGhpcy5tYW5hZ2VyLCBnZXRTZXNzaW9uKCksIGdldExvZ2dlcigpLCBnZXRTb3VyY2VEb2N1bWVudCgpLAotICAgICAgICAgICAgICAgIGdldEV2ZW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIFhNTCBmaWxlCi0gICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZwotICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBzb3VyY2UKLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSB3YXMgbm90IGZvdW5kCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIHRoZSBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZVhNTEZpbGUoU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgY29udGVudCwKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50IGRvY3VtZW50KQotICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihkb2N1bWVudC5nZXRPdXRwdXRTdHJlYW0oKSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNvbnRlbnQsIDAsIGNvbnRlbnQubGVuZ3RoKCkpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoIkZpbGUgbm90IGZvdW5kICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmVycm9yKCJFbmNvZGluZyBub3Qgc3VwcG9ydGVkICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiSU8gZXJyb3IgIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBjbG9zZSBhbGwgc3RyZWFtcwotICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHJlZHVuZGFudCBuYW1lc3BhY2VzCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIG5hbWVzcGFjZXMgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiBUaGUgbmFtZXNwYWNlIHN0cmluZyB3aXRob3V0IHRoZSByZW1vdmVkIG5hbWVzcGFjZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZW1vdmVSZWR1bmRhbnROYW1lc3BhY2VzKFN0cmluZyBuYW1lc3BhY2VzKSB7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuc3BsaXQoIiAiKTsKLQotICAgICAgICBTdHJpbmcgbnMgPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChucy5pbmRleE9mKG5hbWVzcGFjZVtpXSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbnMgPSBucyArICIgIiArIG5hbWVzcGFjZVtpXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIlJlZHVuZGFudCBuYW1lc3BhY2U6ICIgKyBuYW1lc3BhY2VbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIG5hbWVzcGFjZXMKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbmFtZXNwYWNlcyB0byBhZGQKLSAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byBhZGQgdGhlbSB0bwotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgd2l0aCB0aGUgYWRkZWQgbmFtZXNwYWNlcwotICAgICAqLwotLyogICAgcHJpdmF0ZSBTdHJpbmcgYWRkTmFtZXNwYWNlcyhTdHJpbmcgbmFtZXNwYWNlcywgU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgaW50IGkgPSBjb250ZW50LmluZGV4T2YoIj4iKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQuc3Vic3RyaW5nKDAsIGkpICsgIiAiICsgbmFtZXNwYWNlcyArIGNvbnRlbnQuc3Vic3RyaW5nKGkpOwotICAgIH0KLSovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gImVkaXQiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9tZW51cy54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9tZW51cy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmUxZDA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvbWVudXMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAJCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioqIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJzZXJ2ZXJwYWdlcyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdGlueW1jZS9jb25maWcvbWVudS54c3AiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvUkVBRE1FIGIvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA0N2ZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhlIGRpcmVjdG9yeSBsYXlvdXQgdW5kZXIgcmVzb3VyY2VzLyBtYXkgbG9vayBhIGxpdHRsZSBzdHJhbmdlLCAKLWJ1dCBpdCdzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbGF5b3V0IGluIHRoZSBieGUgYW5kIGZja2VkaXRvciBtb2R1bGVzLgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvVU5QQUNLX1RJTllNQ0VfQVJDSElWRV9IRVJFIGIvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvVU5QQUNLX1RJTllNQ0VfQVJDSElWRV9IRVJFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL1VOUEFDS19USU5ZTUNFX0FSQ0hJVkVfSEVSRQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9VTlBBQ0tfVElOWU1DRV9MQU5HVUFHRVBBQ0tTX0hFUkUgYi90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9VTlBBQ0tfVElOWU1DRV9MQU5HVUFHRVBBQ0tTX0hFUkUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvVU5QQUNLX1RJTllNQ0VfTEFOR1VBR0VQQUNLU19IRVJFCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL2Nzcy9lZGl0b3JfY29udGVudC5jc3MgYi90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9jc3MvZWRpdG9yX2NvbnRlbnQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NiNzBmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL2Nzcy9lZGl0b3JfY29udGVudC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKgotICB1c2UgdGhpcyBmaWxlIHRvIGFkZCBhZGRpdGlvbmFsIHN0eWxpbmcgZm9yIHRoZSBlZGl0b3IgYXJlYSAKLSovCi0KLQotcDphZnRlciB7Ci0gIC8qIGFkZCBwaWxjcm93IHNpZ24gdG8gbWFrZSBwYXJhZ3JhcGhzIHZpc2libGUgKi8KLSAgY29udGVudDoiXDAwQjYiOwotfQotCi1icjpiZWZvcmUgewotICAvKiBhZGQgaG9va2VkIGxlZnQgYXJyb3cgdG8gbWFrZSBsaW5lIGJyZWFrcyB2aXNpYmxlLgotICAgICBsaW5lIGJyZWFrcyBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggQ1RSTC1FbnRlci4KLSAgICAgRmlyZWZveCBkb2VzIG5vdCByZW5kZXIgdGhpcywgSUUgbmVpdGhlci4gKi8KLSAgY29udGVudDoiXDIxQjUiOwotfQotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI2MTNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0gIDxtZXNzYWdlIGtleT0idGlueW1jZS5lZGl0Ij5FZGl0IHdpdGggVGlueU1DRTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXaXRoIFRpbnlNQ0UiPldpdGggVGlueU1DRTwvbWVzc2FnZT4NCi08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjEwNTIwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0gIDxtZXNzYWdlIGtleT0idGlueW1jZS5lZGl0Ij5NaXQgVGlueU1DRSBiZWFyYmVpdGVuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJXaXRoIFRpbnlNQ0UiPk1pdCBUaW55TUNFPC9tZXNzYWdlPgotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvamF2YXNjcmlwdC9pbnNlcnRBc3NldC5qcyBiL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL2phdmFzY3JpcHQvaW5zZXJ0QXNzZXQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWI3YTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvamF2YXNjcmlwdC9pbnNlcnRBc3NldC5qcworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotICAgZXh0ID0gJyc7IAotCi0gICBmdW5jdGlvbiBpbnNlcnRBc3NldChub2RlaWQpIHsKLSAgICAgIHZhciBzcmMgPSBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS5hc3NldE5hbWUudmFsdWU7Ci0gICAgICB2YXIgdGl0bGUgPSBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS5jYXB0aW9uLnZhbHVlOwotICAgICAgdmFyIHR5cGUgPSBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS50eXBlLnZhbHVlOwotICAgICAgdmFyIHNpemUgPSBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS5hc3NldFNpemUudmFsdWU7Ci0gICAgICB2YXIgd2luID0gd2luZG93LnRvcC5vcGVuZXIudGlueU1DRS5nZXRXaW5kb3dBcmcoIndpbmRvdyIpOwotICAgICAgd2luLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbHQnKS52YWx1ZSA9IHRpdGxlOwotICAgICAgd2luLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmMnKS52YWx1ZSA9IHNyYzsKLSAgICAgIHdpbmRvdy50b3AuY2xvc2UoKSA7Ci0gICAgfQotICAgCi0gICBmdW5jdGlvbiBpbnNlcnRJbWFnZShub2RlaWQpIHsgCi0gICAgICAvLyB2YXIgbGluayA9IGRvY3VtZW50LmZvcm1zWydpbWFnZSddLmxpbmsudmFsdWU7Ci0gICAgICB2YXIgbGluayA9ICcnOwotICAgICAgdmFyIHNyYyA9IGRvY3VtZW50LmZvcm1zWydpbWFnZSddLmFzc2V0TmFtZS52YWx1ZTsKLSAgICAgIHZhciB0aXRsZSA9IGRvY3VtZW50LmZvcm1zWydpbWFnZSddLmNhcHRpb24udmFsdWU7Ci0gICAgICB2YXIgdHlwZSA9IGRvY3VtZW50LmZvcm1zWydpbWFnZSddLnR5cGUudmFsdWU7Ci0gICAgICB2YXIgaGVpZ2h0ID0gZG9jdW1lbnQuZm9ybXNbJ2ltYWdlJ10uaGVpZ2h0LnZhbHVlOwotICAgICAgdmFyIHdpZHRoID0gZG9jdW1lbnQuZm9ybXNbJ2ltYWdlJ10ud2lkdGgudmFsdWU7Ci0gICAgICB2YXIgd2luID0gd2luZG93LnRvcC5vcGVuZXIudGlueU1DRS5nZXRXaW5kb3dBcmcoIndpbmRvdyIpOwotICAgICAgd2luLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbHQnKS52YWx1ZSA9IHRpdGxlOwotICAgICAgd2luLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcmMnKS52YWx1ZSA9IHNyYzsKLSAgICAgIGlmKGhlaWdodCA+IDAgJiYgd2lkdGggPiAwKSB7Ci0gICAgICAgICB3aW4uZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dpZHRoJykudmFsdWUgPSB3aWR0aDsKLSAgICAgICAgIHdpbi5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVpZ2h0JykudmFsdWUgPSBoZWlnaHQ7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIHdpbi5nZXRJbWFnZURhdGEoKTsKLSAgICAgfQotICAgICB3aW5kb3cudG9wLmNsb3NlKCkgOwotICAgfQotCi0gICBmdW5jdGlvbiBpbnNlcnRDYXB0aW9uKG5hbWUsIGNhcHRpb24sIHR5cGUsIHNpemUpIHsgCi0gICAgIGRvY3VtZW50LmZvcm1zWydpbWFnZSddLmFzc2V0TmFtZS52YWx1ZSA9IG5hbWU7Ci0gICAgIGRvY3VtZW50LmZvcm1zWydpbWFnZSddLmNhcHRpb24udmFsdWUgPSBjYXB0aW9uOwotICAgICBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS50eXBlLnZhbHVlID0gdHlwZTsKLSAgICAgZG9jdW1lbnQuZm9ybXNbJ2ltYWdlJ10uYXNzZXRTaXplLnZhbHVlID0gc2l6ZTsKLSAgICAgZm9jdXMoKTsgCi0gICB9IAotCi0gICBmdW5jdGlvbiBpbnNlcnREYXRhKG5hbWUsIGNhcHRpb24sIHR5cGUsIHNpemUsIGhlaWdodCwgd2lkdGgpIHsgCi0gICAgIHZhciByYXRpbyA9IDE7Ci0gICAgIGlmICh3aWR0aCAhPSAwKSB7Ci0gICAgICAgcmF0aW8gPSBoZWlnaHQgLyB3aWR0aDsKLSAgICAgfQotICAgICBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS5hc3NldE5hbWUudmFsdWUgPSBuYW1lOwotICAgICBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS5jYXB0aW9uLnZhbHVlID0gY2FwdGlvbjsKLSAgICAgZG9jdW1lbnQuZm9ybXNbJ2ltYWdlJ10udHlwZS52YWx1ZSA9IHR5cGU7Ci0gICAgIGRvY3VtZW50LmZvcm1zWydpbWFnZSddLmFzc2V0U2l6ZS52YWx1ZSA9IHNpemU7Ci0gICAgIGRvY3VtZW50LmZvcm1zWydpbWFnZSddLmhlaWdodC52YWx1ZSA9IGhlaWdodDsKLSAgICAgZG9jdW1lbnQuZm9ybXNbJ2ltYWdlJ10ud2lkdGgudmFsdWUgPSB3aWR0aDsKLSAgICAgZG9jdW1lbnQuZm9ybXNbJ2ltYWdlJ10ucmF0aW8udmFsdWUgPSByYXRpbzsKLSAgICAgZm9jdXMoKTsgCi0gICB9IAotCi0gICBmdW5jdGlvbiBzY2FsZUhlaWdodCh3aWR0aCkgewotICAgICB2YXIgcmF0aW8gPSBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS5yYXRpby52YWx1ZTsKLSAgICAgZG9jdW1lbnQuZm9ybXNbJ2ltYWdlJ10uaGVpZ2h0LnZhbHVlID0gd2lkdGggKiByYXRpbzsKLSAgICAgZm9jdXMoKTsgCi0gICB9IAotICAKLSAgIGZ1bmN0aW9uIHNjYWxlV2lkdGgoaGVpZ2h0KSB7Ci0gICAgIHZhciByYXRpbyA9IGRvY3VtZW50LmZvcm1zWydpbWFnZSddLnJhdGlvLnZhbHVlOwotICAgICBkb2N1bWVudC5mb3Jtc1snaW1hZ2UnXS53aWR0aC52YWx1ZSA9IGhlaWdodCAqIHJhdGlvOwotICAgICBmb2N1cygpOyAKLSAgIH0gCi0gIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvamF2YXNjcmlwdC90aW55X2NvbmZpZy5qcyBiL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL2phdmFzY3JpcHQvdGlueV9jb25maWcuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDk4ZGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvamF2YXNjcmlwdC90aW55X2NvbmZpZy5qcworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0gIC8qCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLyogCi10aGVzZSBhcmUgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIFRpbnlNQ0UuIGEgY29tcGxldGUgbGlzdCAKLW9mIG9wdGlvbnMgY2FuIGJlIGZvdW5kIGluIHRoZSBleGNlbGxlbnQgbWFudWFsIGF0Ci1odHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL3RpbnltY2UvZG9jcy9yZWZlcmVuY2VfY29uZmlndXJhdGlvbi5odG1sCi0qLwotCi0KLWN1cnJlbnRVUkwgPSBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1w/LiokLywiIik7Ci0KLWNvbmZpZyA9IHsKLQotICAgIC8qIGVuYWJsZSBjdXN0b21pemFibGUgdGhlbWUgKi8KLSAgICB0aGVtZSA6ICJhZHZhbmNlZCIsCi0gICAgCi0gICAgLyogb25seSB0aGUgZWxlbWVudCB3aG9zZSBJRCBpcyBsaXN0ZWQgdW5kZXIgImVsZW1lbnRzIiB3aWxsIGJlIGVkaXRhYmxlICovCi0gICAgbW9kZSA6ICJleGFjdCIsCi0gICAgZWxlbWVudHMgOiAidGlueW1jZS5jb250ZW50IiwKLSAgICAKLSAgICAvKiBlbmFibGUgcGx1Z2lucyBmb3IgY3VzdG9tIHNhdmUgZnVuY3Rpb24sIGZ1bGxzY3JlZW4gZWRpdGluZwotICAgICAgIGFuZCBzZWFyY2gtYW5kLXJlcGxhY2UuICovCi0gICAgLy9wbHVnaW5zIDogInNhdmUsZnVsbHNjcmVlbixzZWFyY2hyZXBsYWNlLHRhYmxlLGNvbnRleHRtZW51LHNpbXBsZWJyb3dzZXIseGh0bWx4dHJhcyIsCi0gICAgcGx1Z2lucyA6ICJzZWFyY2hyZXBsYWNlLHRhYmxlLGNvbnRleHRtZW51LHNpbXBsZWJyb3dzZXIiLAotICAgICAgICAKLSAgICAvKiBncmV5IG91dCB0aGUgInNhdmUiIGJ1dHRvbiB1bmxlc3MgdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlczogKi8KLSAgICAvL3NhdmVfZW5hYmxld2hlbmRpcnR5IDogZmFsc2UsCi0gICAgCi0gICAgLyogc29tZSBzcGVjaWFsIHNldHRpbmdzIGZvciBmdWxsc2NyZWVuIG1vZGUgKHRoZXkgb3ZlcnJpZGUgdGhlIAotICAgICAgIHNldHRpbmdzIGZ1cnRoZXIgZG93bikgKi8KLS8qCi0gICAgZnVsbHNjcmVlbl9uZXdfd2luZG93IDogdHJ1ZSwKLQotICAgIGZ1bGxzY3JlZW5fc2V0dGluZ3MgOiB7Ci0gICAgICAgIGF1dG9fcmVzaXplIDogZmFsc2UsCi0gICAgICAgIHRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfbG9jYXRpb24gOiAidG9wIiwKLSAgICAgICAgdGhlbWVfYWR2YW5jZWRfc3RhdHVzYmFyX2xvY2F0aW9uIDogImJvdHRvbSIKLSAgICB9LAotKi8gICAgCi0gICAgLyogYXV0by1yZXNpemUgdGhlIGVkaXRpbmcgYXJlYS4gZG9jcyBzYXkgdGhpcyBpcyAiZXhwZXJpbWVudGFsIiEgKi8KLSAgICBhdXRvX3Jlc2l6ZSA6IHRydWUsCi0gICAgCi0gICAgLyogY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZSByZXBsYWNlZCBieSBuYW1lZCBYSFRNTCBlbnRpdGllcy4KLSAgICAgICBjb2Nvb24gZG9lcyBub3QgZGVmaW5lIGVudGl0aWVzIGJ5IGRlZmF1bHQsIHNvIHdlIHVzZSBub25lLiAqLwotICAgIGVudGl0aWVzIDogIiIsCi0gICAgCi0gICAgLyogZG8gbm90IG1ha2UgdW5pY29kZSByZWZlcmVuY2VzLCBvdXRwdXQgYWxsIHNwZWNpYWwgY2hhcmFjdGVycyB1bmNoYW5nZWQuICovCi0gICAgZW50aXR5X2VuY29kaW5nIDogInJhdyIsCi0gICAgCi0gICAgLyoga2VlcCBsaW5lYnJlYWtzLCBkb24ndCBwdXQgZXZlcnl0aGluZyBvbiBvbmUgbGluZS4gdGhpcyBpcyAKLSAgICAgICBpbXBvcnRhbnQgZm9yIGFkdmFuY2VkIHVzZXJzIHdobyB3YW50IHRvIHVzZSB0aGUgc291cmNlIGVkaXRvci4gKi8KLSAgICByZW1vdmVfbGluZWJyZWFrcyA6IGZhbHNlLAotICAgIAotICAgIC8qIHByZXR0eXByaW50IHNvdXJjZWNvZGUgb24gc2F2aW5nIEZJWE1FOiB0ZXN0LiBkb2VzIHRoaXMgZG8gYW55dGhpbmc/ICovCi0gICAgYXBwbHlfc291cmNlX2Zvcm1hdHRpbmcgOiB0cnVlLAotICAgIAotICAgIC8qIGlmIHRoZSB1c2VyIGluc2VydHMgYSB0YWJsZSBpbnRvIGEgcCwgc3BsaXQgcCB0byBjcmVhdGUgY29ycmVjdCBjb2RlLgotICAgICAgIGZvciBuZXN0ZWQgbGlzdHMsIHRoZSBpbm5lciBsaXN0IGlzIGNvcnJlY3RseSBwbGFjZWQgaW4gYSAmbHQ7bGkvJmd0OyAqLwotICAgIGZpeF9saXN0X2VsZW1lbnRzOiB0cnVlLAotICAgIGZpeF90YWJsZV9lbGVtZW50czogdHJ1ZSwKLSAgICAKLSAgICAvKiBmb3JjZSBhbGwgc3RyYXkgdGV4dCBub2RlcyBpbnRvIGEgPHAvPiBlbGVtZW50LiAqLwotICAgIGZvcmNlZF9yb290X2Jsb2NrOiAicCIsCi0gICAgCi0gICAgLyogbGV0IHRpbnltY2UgZG8gdGhlIGxheW91dCBieSBpdHNlbGYgKi8KLSAgICB0aGVtZV9hZHZhbmNlZF9sYXlvdXRfbWFuYWdlciA6ICJTaW1wbGVMYXlvdXQiLAotICAgIAotICAgIC8qIHRoZSB0b29sYmFyIGlzIHBsYWNlZCBhdCB0aGUgdG9wIG9mIHRoZSBlZGl0YWJsZSBhcmVhLiAqLwotICAgIHRoZW1lX2FkdmFuY2VkX3Rvb2xiYXJfbG9jYXRpb24gOiAidG9wIiwKLSAgICAKLSAgICAvKiB0aGUgc3RhdHVzYmFyIGlzIHBsYWNlZCBhdCB0aGUgYm90dG9tLiBpdCBkaXNwbGF5cyB0aGUgZWxlbWVudCBwYXRoLiAqLwotICAgIHRoZW1lX2FkdmFuY2VkX3N0YXR1c2Jhcl9sb2NhdGlvbiA6ICJib3R0b20iLAotICAgIAotICAgIC8qIHRoZSBmb2xsb3dpbmcgaXRlbXMgZGVmaW5lIHRoZSBmdW5jdGlvbiBidXR0b25zIHlvdXIgdXNlcnMgZ2V0IHRvIHNlZS4KLSAgICAgICBmb3IgYSBjb21wbGV0ZSBsaXN0LCBzZWUKLSAgICAgICBodHRwOi8vd2lraS5tb3hpZWNvZGUuY29tL2luZGV4LnBocC9UaW55TUNFOkNvbnRyb2xfcmVmZXJlbmNlICovCi0gICAgCi0gICAgdGhlbWVfYWR2YW5jZWRfYnV0dG9uczEgOgotICAgICAgICAgICAgInNhdmUsdW5kbyxyZWRvLHNlYXJjaCxyZXBsYWNlLHNlcGFyYXRvciwiICsgCi0gICAgICAgICAgICAiY2xlYW51cCxjb2RlLGNoYXJtYXAsdmlzdWFsYWlkLGZ1bGxzY3JlZW4sc2VwYXJhdG9yLCIgKyAKLSAgICAgICAgICAgICJmb3JtYXRzZWxlY3Qsc3R5bGVzZWxlY3QiLAotICAgIAotICAgIHRoZW1lX2FkdmFuY2VkX2J1dHRvbnMyIDogCi0gICAgICAgICAgICAiYm9sZCxpdGFsaWMsdW5kZXJsaW5lLHN0cmlrZXRocm91Z2gsc3ViLHN1cCxyZW1vdmVmb3JtYXQsc2VwYXJhdG9yLCIgKwotICAgICAgICAgICAgImJ1bGxpc3QsbnVtbGlzdCx0YWJsZSxzZXBhcmF0b3IsIiArIAotICAgICAgICAgICAgImluZGVudCxvdXRkZW50LHNlcGFyYXRvciwiICsgCi0gICAgICAgICAgICAiYW5jaG9yLGxpbmssdW5saW5rLGltYWdlLHNlcGFyYXRvciwiICsKLSAgICAgICAgICAgICJoZWxwIiwKLSAgICAKLSAgICAvKiB0aHJlZSBidXR0b24gcm93cyBhcmUgYWN0aXZlIGJ5IGRlZmF1bHQuIG92ZXJyaWRlLiAqLwotICAgIHRoZW1lX2FkdmFuY2VkX2J1dHRvbnMzIDogIiIsCi0vKgotICAgIC8vZm9yIHhodG1seHRyYXMsIHVzZSB0aGlzOgotICAgIHRoZW1lX2FkdmFuY2VkX2J1dHRvbnMzIDogImNpdGUsaW5zLGRlbCxhYmJyLGFjcm9ueW0sYXR0cmlicyIsCi0qLyAgICAKLSAgICAvKiB0aGUgZm9sbG93aW5nIGl0ZW1zIGRlZmluZSB0aGUgZWxlbWVudHMgcHJlc2VudGVkIGluIHRoZSAiRm9ybWF0IiBkcm9wZG93bi4gCi0gICAgICAgdGhlIGRlZmF1bHQgc2V0dGluZyBpcyB2ZXJ5IHJlc3RyaWN0aXZlIHRvIGVuZm9yY2UgYSBjb3Jwb3JhdGUgZGVzaWduIGFuZCBjbGVhbgotICAgICAgIGNvZGUgYXQgdGhlIGV4cGVuc2Ugb2YgZmxleGliaWxpdHkuICovCi0gICAgdGhlbWVfYWR2YW5jZWRfYmxvY2tmb3JtYXRzIDogInAsaDEsaDIsaDMsaDQsaDUsaDYiLAotICAgIAotICAgIAotICAgIC8qICAgIExlbnlhL1RpbnlNQ0UgZ2x1ZSBjb2RlICAgICovCi0KLSAgICAvKiB0aGUgc2ltcGxlYnJvd3NlciBwbHVnaW4gaXMgdXNlZCB0byB3aXJlIHRoZSBnZW5lcmljIGVkaXRvcnMuaW5zZXJ0Rk9PIHVzZWNhc2VzIGludG8gVGlueU1DRSAqLwotICAgIHBsdWdpbl9zaW1wbGVicm93c2VyX2Jyb3dzZWxpbmt1cmwgOiBjdXJyZW50VVJMICsgJz9sZW55YS51c2VjYXNlPWVkaXRvcnMuaW5zZXJ0TGluaycsCi0gICAgcGx1Z2luX3NpbXBsZWJyb3dzZXJfYnJvd3NlaW1hZ2V1cmwgOiBjdXJyZW50VVJMICsgJz9sZW55YS51c2VjYXNlPWVkaXRvcnMuaW5zZXJ0SW1hZ2UnLAotICAgIHBsdWdpbl9zaW1wbGVicm93c2VyX2Jyb3dzZWZsYXNodXJsIDogJycsCi0gICAgCi0gICAgLyogdGhpcyBjYWxsYmFjayBjYW4gb3ZlcnJpZGUgYXJiaXRyYXJ5IHRpbnltY2UgY29tbWFuZHMuIG5lYXRvIQotICAgICAgIGN1cnJlbnRseSB1c2VkIGhvb2tzIGFyZSAiaW5zZXJ0IGltYWdlIiwgImluc2VydCBsaW5rIiBhbmQgInNhdmUiLiAKLSAgICAgICB0aGUgaGFuZGxlciBzaXRzIGluIHRpbnlfbGVueWFfZ2x1ZS5qcy4gKi8KLSAgICBleGVjY29tbWFuZF9jYWxsYmFjayA6ICJMZW55YUV4ZWNDb21tYW5kSGFuZGxlciIsCi0gICAgCi0gICAgLyogaW5zZXJ0IGN1c3RvbSBzYXZlIGhhbmRsZXIgdG8gZG8gc29tZSBleHRyYSBjbGVhbi11cC4gKi8KLSAgICBzYXZlX2NhbGxiYWNrIDogIkxlbnlhU2F2ZUNvbnRlbnQiCi19OwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvamF2YXNjcmlwdC90aW55X2xlbnlhX2dsdWUuanMgYi90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9qYXZhc2NyaXB0L3RpbnlfbGVueWFfZ2x1ZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExMGYzZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9qYXZhc2NyaXB0L3RpbnlfbGVueWFfZ2x1ZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi1mdW5jdGlvbiBMZW55YUV4ZWNDb21tYW5kSGFuZGxlcihlZGl0b3JfaWQsIGVsbSwgY29tbWFuZCwgdXNlcl9pbnRlcmZhY2UsIHZhbHVlKSB7Ci12YXIgbGlua0VsbSwgaW1hZ2VFbG0sIGluc3Q7Ci0KLS8qCi0gIHN3aXRjaCAoY29tbWFuZCkgewotCi0gICAgY2FzZSAibWNlU2F2ZSI6Ci0gICAgICAKLSAgICAgIGFsZXJ0KCJtY2VTYXZlIGNhbGxiYWNrIGludm9rZWQuIFRoaXMgZG9lcyBub3QgeWV0IGRvIGFueXRoaW5nLiIpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAKLSAgfQotKi8KLSAgcmV0dXJuIGZhbHNlOyAvLyBQYXNzIHRvIG5leHQgaGFuZGxlciBpbiBjaGFpbgotfQotCi0KLQotZnVuY3Rpb24gTGVueWFTYXZlQ29udGVudChlbGVtZW50X2lkLCBodG1sLCBib2R5KSB7Ci0gIC8vIERvIHNvbWUgY3VzdG9tIEhUTUwgY2xlYW51cAotICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSB0aW55bWNlIGluc2VydHMgJm5ic3A7IGVudGl0aWVzIGludG8KLSAgLy8gZW1wdHkgPHA+cyBhbmQgPHRkPnMgcmVnYXJkbGVzcyBvZiB0aGUgImVudGl0eV9lbmNvZGluZyIgc2V0dGluZywKLSAgLy8gYW5kIHRoZXNlIHdpbGwgYnJlYWsgTGVueWEgYXMgdGhleSBhcmUgbm90IGRlZmluZWQgYnkgZGVmYXVsdC4KLSAgaHRtbCA9IGh0bWwucmVwbGFjZSgvJm5ic3A7L2csICImIzE2MDsiKTsKLSAgcmV0dXJuIGh0bWw7Ci19Ci0KLQotLyogaW50ZXJmYWNlIHRvIGdlbmVyaWMgZWRpdG9yIHVzZWNhc2VzICovCi0KLW9yZy5hcGFjaGUubGVueWEuZWRpdG9ycy5zZXRPYmplY3REYXRhID0gZnVuY3Rpb24ob2JqZWN0RGF0YSkgewotICBUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4uYnJvd3NlckNhbGxiYWNrKG9iamVjdERhdGEpOwotfQotCi1vcmcuYXBhY2hlLmxlbnlhLmVkaXRvcnMuZ2V0T2JqZWN0RGF0YSA9IGZ1bmN0aW9uKCkgewotICB2YXIgY3VycmVudFVSTCA9IFRpbnlNQ0VfU2ltcGxlQnJvd3NlclBsdWdpbi5vcHRpb25zWydjdXJsJ107Ci0gIHJldHVybiBuZXcgb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLk9iamVjdERhdGEoewotICAgIHVybCA6IGN1cnJlbnRVUkwgPyBjdXJyZW50VVJMIDogIiIKLSAgfSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9qYXZhc2NyaXB0L3RpbnlfdmFsaWRfZWxlbWVudHMuanMgYi90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9qYXZhc2NyaXB0L3RpbnlfdmFsaWRfZWxlbWVudHMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODkxNmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvamF2YXNjcmlwdC90aW55X3ZhbGlkX2VsZW1lbnRzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLyoKLSAgIHRoaXMgaGFzIGJlZW4gcHV0IGluIGEgc2VwYXJhdGUgZmlsZSBzbyB0aGF0IHVzZXJzIGNhbiBvdmVycmlkZSBpdAotICAgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50IHR5cGUuIHRoaXMgZG9lcyBub3QgeWV0IHdvcmssIHNpbmNlCi0gICB0aGlzIGZpbGUgaXMgcmVmZXJlbmNlZCBzdGF0aWNhbGx5IGluIHhzbHQvcGFnZTJlZGl0LnhzbC4KLSAgIGEgc29sdXRpb24gbWlnaHQgYmUgdG8gcHV0IGl0IGluIHNvbWUgcGxhY2UgdGhhdCBpcyBub3QgY2F1Z2h0IGJ5Ci0gICB0aGUgZ2xvYmFsIG1vZHVsZSByZXNvdXJjZXMgcGlwZWxpbmUgYW5kIGhhbmRsZSB0aGUgb3ZlcnJpZGluZwotICAgaW4gdGhlIHRpbnltY2UgbW9kdWxlIHNpdGVtYXAuCi0qLwotCi1sZW55YV92YWxpZF9lbGVtZW50cyA9ICIiCi0rImFbYWNjZXNza2V5fGNoYXJzZXR8Y2xhc3N8Y29vcmRzfGRpcjxsdHI/cnRsfGhyZWZ8aHJlZmxhbmd8aWR8bGFuZ3xuYW1lIgotICArInxvbmJsdXJ8b25jbGlja3xvbmRibGNsaWNrfG9uZm9jdXN8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cCIKLSAgKyJ8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8cmVsfHJldiIKLSAgKyJ8c2hhcGU8Y2lyY2xlP2RlZmF1bHQ/cG9seT9yZWN0fHN0eWxlfHRhYmluZGV4fHRpdGxlfHRhcmdldHx0eXBlXSwiCi0rImFiYnJbY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlXSwiCi0rImFjcm9ueW1bY2xhc3N8ZGlyPGx0cj9ydGx8aWR8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlXSwiCi0rImFkZHJlc3NbY2xhc3N8YWxpZ258ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3duIgotICArInxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3ZlciIKLSAgKyJ8b25tb3VzZXVwfHN0eWxlfHRpdGxlXSwiCi0rImFwcGxldFthbGlnbjxib3R0b20/bGVmdD9taWRkbGU/cmlnaHQ/dG9wfGFsdHxhcmNoaXZlfGNsYXNzfGNvZGV8Y29kZWJhc2UiCi0gICsifGhlaWdodHxoc3BhY2V8aWR8bmFtZXxvYmplY3R8c3R5bGV8dGl0bGV8dnNwYWNlfHdpZHRoXSwiCi0rImFyZWFbYWNjZXNza2V5fGFsdHxjbGFzc3xjb29yZHN8ZGlyPGx0cj9ydGx8aHJlZnxpZHxsYW5nfG5vaHJlZjxub2hyZWYiCi0gICsifG9uYmx1cnxvbmNsaWNrfG9uZGJsY2xpY2t8b25mb2N1c3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwIgotICArInxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cCIKLSAgKyJ8c2hhcGU8Y2lyY2xlP2RlZmF1bHQ/cG9seT9yZWN0fHN0eWxlfHRhYmluZGV4fHRpdGxlfHRhcmdldF0sIgotKyJiYXNlW2hyZWZ8dGFyZ2V0XSwiCi0rImJhc2Vmb250W2NvbG9yfGZhY2V8aWR8c2l6ZV0sIgotKyJiZG9bY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xzdHlsZXx0aXRsZV0sIgotKyJiaWdbY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlXSwiCi0rImJsb2NrcXVvdGVbZGlyfHN0eWxlfGNpdGV8Y2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2siCi0gICsifG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dCIKLSAgKyJ8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlfHRpdGxlXSwiCi0rImJvZHlbYWxpbmt8YmFja2dyb3VuZHxiZ2NvbG9yfGNsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8bGlua3xvbmNsaWNrIgotICArInxvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXB8b25sb2FkfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlIgotICArInxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxvbnVubG9hZHxzdHlsZXx0aXRsZXx0ZXh0fHZsaW5rXSwiCi0rImJyW2NsYXNzfGNsZWFyPGFsbD9sZWZ0P25vbmU/cmlnaHR8aWR8c3R5bGV8dGl0bGVdLCIKLSsiYnV0dG9uW2FjY2Vzc2tleXxjbGFzc3xkaXI8bHRyP3J0bHxkaXNhYmxlZDxkaXNhYmxlZHxpZHxsYW5nfG5hbWV8b25ibHVyIgotICArInxvbmNsaWNrfG9uZGJsY2xpY2t8b25mb2N1c3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3duIgotICArInxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZXx0YWJpbmRleHx0aXRsZXx0eXBlIgotICArInx2YWx1ZV0sIgotKyJjYXB0aW9uW2FsaWduPGJvdHRvbT9sZWZ0P3JpZ2h0P3RvcHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiY2VudGVyW2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJjaXRlW2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJjb2RlW2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJjb2xbYWxpZ248Y2VudGVyP2NoYXI/anVzdGlmeT9sZWZ0P3JpZ2h0fGNoYXJ8Y2hhcm9mZnxjbGFzc3xkaXI8bHRyP3J0bHxpZCIKLSAgKyJ8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93biIKLSAgKyJ8b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3BhbnxzdHlsZXx0aXRsZSIKLSAgKyJ8dmFsaWduPGJhc2VsaW5lP2JvdHRvbT9taWRkbGU/dG9wfHdpZHRoXSwiCi0rImNvbGdyb3VwW2FsaWduPGNlbnRlcj9jaGFyP2p1c3RpZnk/bGVmdD9yaWdodHxjaGFyfGNoYXJvZmZ8Y2xhc3N8ZGlyPGx0cj9ydGwiCi0gICsifGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd24iCi0gICsifG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHNwYW58c3R5bGV8dGl0bGUiCi0gICsifHZhbGlnbjxiYXNlbGluZT9ib3R0b20/bWlkZGxlP3RvcHx3aWR0aF0sIgotKyJkZFtjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwIgotICArInxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZXx0aXRsZV0sIgotKyJkZWxbY2l0ZXxjbGFzc3xkYXRldGltZXxkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd24iCi0gICsifG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyIgotICArInxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiZGZuW2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJkaXJbY2xhc3N8Y29tcGFjdDxjb21wYWN0fGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93biIKLSAgKyJ8b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXIiCi0gICsifG9ubW91c2V1cHxzdHlsZXx0aXRsZV0sIgotKyJkaXZbYWxpZ248Y2VudGVyP2p1c3RpZnk/bGVmdD9yaWdodHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiZGxbY2xhc3N8Y29tcGFjdDxjb21wYWN0fGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93biIKLSAgKyJ8b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXIiCi0gICsifG9ubW91c2V1cHxzdHlsZXx0aXRsZV0sIgotKyJkdFtjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwIgotICArInxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZXx0aXRsZV0sIgotKyJlbS9pW2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJmaWVsZHNldFtjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzcyIKLSAgKyJ8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZSIKLSAgKyJ8dGl0bGVdLCIKLSsiZm9udFtjbGFzc3xjb2xvcnxkaXI8bHRyP3J0bHxmYWNlfGlkfGxhbmd8c2l6ZXxzdHlsZXx0aXRsZV0sIgotKyJmb3JtW2FjY2VwdHxhY2NlcHQtY2hhcnNldHxhY3Rpb258Y2xhc3N8ZGlyPGx0cj9ydGx8ZW5jdHlwZXxpZHxsYW5nIgotICArInxtZXRob2Q8Z2V0P3Bvc3R8bmFtZXxvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cCIKLSAgKyJ8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8b25yZXNldHxvbnN1Ym1pdCIKLSAgKyJ8c3R5bGV8dGl0bGV8dGFyZ2V0XSwiCi0rImZyYW1lW2NsYXNzfGZyYW1lYm9yZGVyfGlkfGxvbmdkZXNjfG1hcmdpbmhlaWdodHxtYXJnaW53aWR0aHxuYW1lIgotICArInxub3Jlc2l6ZTxub3Jlc2l6ZXxzY3JvbGxpbmc8YXV0bz9ubz95ZXN8c3JjfHN0eWxlfHRpdGxlXSwiCi0rImZyYW1lc2V0W2NsYXNzfGNvbHN8aWR8b25sb2FkfG9udW5sb2FkfHJvd3N8c3R5bGV8dGl0bGVdLCIKLSsiaDFbYWxpZ248Y2VudGVyP2p1c3RpZnk/bGVmdD9yaWdodHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiaDJbYWxpZ248Y2VudGVyP2p1c3RpZnk/bGVmdD9yaWdodHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiaDNbYWxpZ248Y2VudGVyP2p1c3RpZnk/bGVmdD9yaWdodHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiaDRbYWxpZ248Y2VudGVyP2p1c3RpZnk/bGVmdD9yaWdodHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiaDVbYWxpZ248Y2VudGVyP2p1c3RpZnk/bGVmdD9yaWdodHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiaDZbYWxpZ248Y2VudGVyP2p1c3RpZnk/bGVmdD9yaWdodHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiaGVhZFtkaXI8bHRyP3J0bHxsYW5nfHByb2ZpbGVdLCIKLSsiaHJbYWxpZ248Y2VudGVyP2xlZnQ/cmlnaHR8Y2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xub3NoYWRlPG5vc2hhZGV8b25jbGljayIKLSAgKyJ8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlIgotICArInxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzaXplfHN0eWxlfHRpdGxlfHdpZHRoXSwiCi0rImh0bWxbZGlyPGx0cj9ydGx8bGFuZ3x2ZXJzaW9uXSwiCi0rImlmcmFtZVthbGlnbjxib3R0b20/bGVmdD9taWRkbGU/cmlnaHQ/dG9wfGNsYXNzfGZyYW1lYm9yZGVyfGhlaWdodHxpZCIKLSAgKyJ8bG9uZ2Rlc2N8bWFyZ2luaGVpZ2h0fG1hcmdpbndpZHRofG5hbWV8c2Nyb2xsaW5nPGF1dG8/bm8/eWVzfHNyY3xzdHlsZSIKLSAgKyJ8dGl0bGV8d2lkdGhdLCIKLSsiaW1nW2FsaWduPGJvdHRvbT9sZWZ0P21pZGRsZT9yaWdodD90b3B8YWx0fGJvcmRlcnxjbGFzc3xkaXI8bHRyP3J0bHxoZWlnaHQiCi0gICsifGhzcGFjZXxpZHxpc21hcDxpc21hcHxsYW5nfGxvbmdkZXNjfG5hbWV8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93biIKLSAgKyJ8b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXIiCi0gICsifG9ubW91c2V1cHxzcmN8c3R5bGV8dGl0bGV8dXNlbWFwfHZzcGFjZXx3aWR0aF0sIgotKyJpbnB1dFthY2NlcHR8YWNjZXNza2V5fGFsaWduPGJvdHRvbT9sZWZ0P21pZGRsZT9yaWdodD90b3B8YWx0IgotICArInxjaGVja2VkPGNoZWNrZWR8Y2xhc3N8ZGlyPGx0cj9ydGx8ZGlzYWJsZWQ8ZGlzYWJsZWR8aWR8aXNtYXA8aXNtYXB8bGFuZyIKLSAgKyJ8bWF4bGVuZ3RofG5hbWV8b25ibHVyfG9uY2xpY2t8b25kYmxjbGlja3xvbmZvY3VzfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfG9uc2VsZWN0IgotICArInxyZWFkb25seTxyZWFkb25seXxzaXplfHNyY3xzdHlsZXx0YWJpbmRleHx0aXRsZSIKLSAgKyJ8dHlwZTxidXR0b24/Y2hlY2tib3g/ZmlsZT9oaWRkZW4/aW1hZ2U/cGFzc3dvcmQ/cmFkaW8/cmVzZXQ/c3VibWl0P3RleHQiCi0gICsifHVzZW1hcHx2YWx1ZV0sIgotKyJpbnNbY2l0ZXxjbGFzc3xkYXRldGltZXxkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd24iCi0gICsifG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyIgotICArInxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsiaXNpbmRleFtjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfHByb21wdHxzdHlsZXx0aXRsZV0sIgotKyJrYmRbY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlXSwiCi0rImxhYmVsW2FjY2Vzc2tleXxjbGFzc3xkaXI8bHRyP3J0bHxmb3J8aWR8bGFuZ3xvbmJsdXJ8b25jbGlja3xvbmRibGNsaWNrIgotICArInxvbmZvY3VzfG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dCIKLSAgKyJ8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlfHRpdGxlXSwiCi0rImxlZ2VuZFthbGlnbjxib3R0b20/bGVmdD9yaWdodD90b3B8YWNjZXNza2V5fGNsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmciCi0gICsifG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlIgotICArInxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZXx0aXRsZV0sIgotKyJsaVtjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwIgotICArInxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZXx0aXRsZXx0eXBlIgotICArInx2YWx1ZV0sIgotKyJsaW5rW2NoYXJzZXR8Y2xhc3N8ZGlyPGx0cj9ydGx8aHJlZnxocmVmbGFuZ3xpZHxsYW5nfG1lZGlhfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8cmVsfHJldnxzdHlsZXx0aXRsZXx0YXJnZXR8dHlwZV0sIgotKyJtYXBbY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xuYW1lfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzcyIKLSAgKyJ8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZSIKLSAgKyJ8dGl0bGVdLCIKLSsibWVudVtjbGFzc3xjb21wYWN0PGNvbXBhY3R8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3duIgotICArInxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3ZlciIKLSAgKyJ8b25tb3VzZXVwfHN0eWxlfHRpdGxlXSwiCi0rIm1ldGFbY29udGVudHxkaXI8bHRyP3J0bHxodHRwLWVxdWl2fGxhbmd8bmFtZXxzY2hlbWVdLCIKLSsibm9mcmFtZXNbY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlXSwiCi0rIm5vc2NyaXB0W2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJvYmplY3RbYWxpZ248Ym90dG9tP2xlZnQ/bWlkZGxlP3JpZ2h0P3RvcHxhcmNoaXZlfGJvcmRlcnxjbGFzc3xjbGFzc2lkIgotICArInxjb2RlYmFzZXxjb2RldHlwZXxkYXRhfGRlY2xhcmV8ZGlyPGx0cj9ydGx8aGVpZ2h0fGhzcGFjZXxpZHxsYW5nfG5hbWUiCi0gICsifG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlIgotICArInxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdGFuZGJ5fHN0eWxlfHRhYmluZGV4fHRpdGxlfHR5cGV8dXNlbWFwIgotICArInx2c3BhY2V8d2lkdGhdLCIKLSsib2xbY2xhc3N8Y29tcGFjdDxjb21wYWN0fGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93biIKLSAgKyJ8b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXIiCi0gICsifG9ubW91c2V1cHxzdGFydHxzdHlsZXx0aXRsZXx0eXBlXSwiCi0rIm9wdGdyb3VwW2NsYXNzfGRpcjxsdHI/cnRsfGRpc2FibGVkPGRpc2FibGVkfGlkfGxhYmVsfGxhbmd8b25jbGljayIKLSAgKyJ8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlIgotICArInxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZXx0aXRsZV0sIgotKyJvcHRpb25bY2xhc3N8ZGlyPGx0cj9ydGx8ZGlzYWJsZWQ8ZGlzYWJsZWR8aWR8bGFiZWx8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2siCi0gICsifG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dCIKLSAgKyJ8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHNlbGVjdGVkPHNlbGVjdGVkfHN0eWxlfHRpdGxlfHZhbHVlXSwiCi0rInBbYWxpZ248Y2VudGVyP2p1c3RpZnk/bGVmdD9yaWdodHxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2siCi0gICsifG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZSIKLSAgKyJ8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGVdLCIKLSsicGFyYW1baWR8bmFtZXx0eXBlfHZhbHVlfHZhbHVldHlwZTxEQVRBP09CSkVDVD9SRUZdLCIKLSsicHJlL2xpc3RpbmcvcGxhaW50ZXh0L3htcFthbGlnbnxjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGljayIKLSAgKyJ8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0IgotICArInxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGV8d2lkdGhdLCIKLSsicVtjaXRlfGNsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJzW2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXAiCi0gICsifG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlfHRpdGxlXSwiCi0rInNhbXBbY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlXSwiCi0rInNjcmlwdFtjaGFyc2V0fGRlZmVyfGxhbmd1YWdlfHNyY3x0eXBlXSwiCi0rInNlbGVjdFtjbGFzc3xkaXI8bHRyP3J0bHxkaXNhYmxlZDxkaXNhYmxlZHxpZHxsYW5nfG11bHRpcGxlPG11bHRpcGxlfG5hbWUiCi0gICsifG9uYmx1cnxvbmNsaWNrfG9uZGJsY2xpY2t8b25mb2N1c3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwIgotICArInxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzaXplfHN0eWxlIgotICArInx0YWJpbmRleHx0aXRsZV0sIgotKyJzbWFsbFtjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzcyIKLSAgKyJ8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZSIKLSAgKyJ8dGl0bGVdLCIKLSsic3BhblthbGlnbjxjZW50ZXI/anVzdGlmeT9sZWZ0P3JpZ2h0fGNsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93biIKLSAgKyJ8b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXIiCi0gICsifG9ubW91c2V1cHxzdHlsZXx0aXRsZV0sIgotKyJzdHJpa2VbY2xhc3N8Y2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3duIgotICArInxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3ZlciIKLSAgKyJ8b25tb3VzZXVwfHN0eWxlfHRpdGxlXSwiCi0rInN0cm9uZy9iW2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJzdHlsZVtkaXI8bHRyP3J0bHxsYW5nfG1lZGlhfHRpdGxlfHR5cGVdLCIKLSsic3ViW2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzIgotICArInxvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlIgotICArInx0aXRsZV0sIgotKyJzdXBbY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlXSwiCi0rInRhYmxlW2FsaWduPGNlbnRlcj9sZWZ0P3JpZ2h0fGJnY29sb3J8Ym9yZGVyfGNlbGxwYWRkaW5nfGNlbGxzcGFjaW5nfGNsYXNzIgotICArInxkaXI8bHRyP3J0bHxmcmFtZXxoZWlnaHR8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8cnVsZXMiCi0gICsifHN0eWxlfHN1bW1hcnl8dGl0bGV8d2lkdGhdLCIKLSsidGJvZHlbYWxpZ248Y2VudGVyP2NoYXI/anVzdGlmeT9sZWZ0P3JpZ2h0fGNoYXJ8Y2xhc3N8Y2hhcm9mZnxkaXI8bHRyP3J0bHxpZCIKLSAgKyJ8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93biIKLSAgKyJ8b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGV8dGl0bGUiCi0gICsifHZhbGlnbjxiYXNlbGluZT9ib3R0b20/bWlkZGxlP3RvcF0sIgotKyJ0ZFthYmJyfGFsaWduPGNlbnRlcj9jaGFyP2p1c3RpZnk/bGVmdD9yaWdodHxheGlzfGJnY29sb3J8Y2hhcnxjaGFyb2ZmfGNsYXNzIgotICArInxjb2xzcGFufGRpcjxsdHI/cnRsfGhlYWRlcnN8aGVpZ2h0fGlkfGxhbmd8bm93cmFwPG5vd3JhcHxvbmNsaWNrIgotICArInxvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmUiCi0gICsifG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHJvd3NwYW58c2NvcGU8Y29sP2NvbGdyb3VwP3Jvdz9yb3dncm91cCIKLSAgKyJ8c3R5bGV8dGl0bGV8dmFsaWduPGJhc2VsaW5lP2JvdHRvbT9taWRkbGU/dG9wfHdpZHRoXSwiCi0rInRleHRhcmVhW2FjY2Vzc2tleXxjbGFzc3xjb2xzfGRpcjxsdHI/cnRsfGRpc2FibGVkPGRpc2FibGVkfGlkfGxhbmd8bmFtZSIKLSAgKyJ8b25ibHVyfG9uY2xpY2t8b25kYmxjbGlja3xvbmZvY3VzfG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXAiCi0gICsifG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfG9uc2VsZWN0IgotICArInxyZWFkb25seTxyZWFkb25seXxyb3dzfHN0eWxlfHRhYmluZGV4fHRpdGxlXSwiCi0rInRmb290W2FsaWduPGNlbnRlcj9jaGFyP2p1c3RpZnk/bGVmdD9yaWdodHxjaGFyfGNoYXJvZmZ8Y2xhc3N8ZGlyPGx0cj9ydGx8aWQiCi0gICsifGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXB8b25tb3VzZWRvd24iCi0gICsifG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlfHRpdGxlIgotICArInx2YWxpZ248YmFzZWxpbmU/Ym90dG9tP21pZGRsZT90b3BdLCIKLSsidGhbYWJicnxhbGlnbjxjZW50ZXI/Y2hhcj9qdXN0aWZ5P2xlZnQ/cmlnaHR8YXhpc3xiZ2NvbG9yfGNoYXJ8Y2hhcm9mZnxjbGFzcyIKLSAgKyJ8Y29sc3BhbnxkaXI8bHRyP3J0bHxoZWFkZXJzfGhlaWdodHxpZHxsYW5nfG5vd3JhcDxub3dyYXB8b25jbGljayIKLSAgKyJ8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlIgotICArInxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxyb3dzcGFufHNjb3BlPGNvbD9jb2xncm91cD9yb3c/cm93Z3JvdXAiCi0gICsifHN0eWxlfHRpdGxlfHZhbGlnbjxiYXNlbGluZT9ib3R0b20/bWlkZGxlP3RvcHx3aWR0aF0sIgotKyJ0aGVhZFthbGlnbjxjZW50ZXI/Y2hhcj9qdXN0aWZ5P2xlZnQ/cmlnaHR8Y2hhcnxjaGFyb2ZmfGNsYXNzfGRpcjxsdHI/cnRsfGlkIgotICArInxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwfG9ubW91c2Vkb3duIgotICArInxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZXx0aXRsZSIKLSAgKyJ8dmFsaWduPGJhc2VsaW5lP2JvdHRvbT9taWRkbGU/dG9wXSwiCi0rInRpdGxlW2RpcjxsdHI/cnRsfGxhbmddLCIKLSsidHJbYWJicnxhbGlnbjxjZW50ZXI/Y2hhcj9qdXN0aWZ5P2xlZnQ/cmlnaHR8Ymdjb2xvcnxjaGFyfGNoYXJvZmZ8Y2xhc3MiCi0gICsifHJvd3NwYW58ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlfHZhbGlnbjxiYXNlbGluZT9ib3R0b20/bWlkZGxlP3RvcF0sIgotKyJ0dFtjbGFzc3xkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd258b25rZXlwcmVzc3xvbmtleXVwIgotICArInxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyfG9ubW91c2V1cHxzdHlsZXx0aXRsZV0sIgotKyJ1W2NsYXNzfGRpcjxsdHI/cnRsfGlkfGxhbmd8b25jbGlja3xvbmRibGNsaWNrfG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXAiCi0gICsifG9ubW91c2Vkb3dufG9ubW91c2Vtb3ZlfG9ubW91c2VvdXR8b25tb3VzZW92ZXJ8b25tb3VzZXVwfHN0eWxlfHRpdGxlXSwiCi0rInVsW2NsYXNzfGNvbXBhY3Q8Y29tcGFjdHxkaXI8bHRyP3J0bHxpZHxsYW5nfG9uY2xpY2t8b25kYmxjbGlja3xvbmtleWRvd24iCi0gICsifG9ua2V5cHJlc3N8b25rZXl1cHxvbm1vdXNlZG93bnxvbm1vdXNlbW92ZXxvbm1vdXNlb3V0fG9ubW91c2VvdmVyIgotICArInxvbm1vdXNldXB8c3R5bGV8dGl0bGV8dHlwZV0sIgotKyJ2YXJbY2xhc3N8ZGlyPGx0cj9ydGx8aWR8bGFuZ3xvbmNsaWNrfG9uZGJsY2xpY2t8b25rZXlkb3dufG9ua2V5cHJlc3MiCi0gICsifG9ua2V5dXB8b25tb3VzZWRvd258b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8c3R5bGUiCi0gICsifHRpdGxlXSIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9taXNjL2Rvd25sb2FkLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL21pc2MvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDFlMWEyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL21pc2MvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwYWdlOnBhZ2UKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0+Ci08cGFnZTpoZWFkLz4KLTxwYWdlOnRpdGxlPlRpbnlNQ0Ugbm90IGZvdW5kPC9wYWdlOnRpdGxlPgotPHBhZ2U6Ym9keT4KLSAgPGgxPk5vIFRpbnlNQ0UgaW5zdGFsbGF0aW9uIHdhcyBmb3VuZCBvbiB5b3VyIHN5c3RlbS48L2gxPgotICA8cD4KLSAgICBEdWUgdG8gbGljZW5zZSBpbmNvbXBhdGliaWxpdGVzLCBUaW55TUNFIChyZWxlYXNlZCB1bmRlciB0aGUgR1BMKSBjYW5ub3QKLSAgICBiZSBkaXN0cmlidXRlZCB3aXRoIExlbnlhIChyZWxlYXNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4wKSwgYWx0aG91Z2gKLSAgICBpdCBpcyBwZXJmZWN0bHkgbGVnYWwgZm9yIHlvdSB0byB1c2UgdGhlbSB0b2dldGhlci4KLSAgPC9wPgotICA8cD4KLSAgICBQbGVhc2UgPGEgaHJlZj0iaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS9kb3dubG9hZC5waHAiPmRvd25sb2FkIHRoZSAKLSAgICBUaW55TUNFIGVkaXRvciBmcm9tIG1veGllY29kZS5jb208L2E+LjxiciAvPgotICAgIFVucGFjayB0aGUgemlwIGFyY2hpdmUgb3IgdGFyYmFsbCBpbiB5b3VyIExlbnlhIHNvdXJjZSB0cmVlIHVuZGVyCi0gICAgPGNvZGU+JExFTllBLVNSQy9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlczwvY29kZT4uIEFsdGVybmF0aXZlbHksIHlvdSBjYW4KLSAgICBpbnN0YWxsIGl0IHRvIDxjb2RlPiRQVUJfSE9NRS9sZW55YS9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzPC9jb2RlPiAKLSAgICAoaWYgeW91IHByZWZlciBub3QgdG8gaGF2ZSBleHRlcm5hbCBjb2RlIGluIHlvdXIgTGVueWEgc291cmNlIHRyZWUpLCAKLSAgICBzaW5jZSBhbGwgY2FsbHMgdG8gdGhpcyBjb2RlIGFyZSBmYWxsYmFjay1lbmFibGVkLgotICA8L3A+Ci0gIDxwPgotICAgIEJ5IGRlZmF1bHQsIFRpbnlNQ0UgY29tZXMgd2l0aCBhbiBFbmdsaXNoIGxvY2FsaXphdGlvbiBvbmx5LiBJZiB5b3UgcHJlZmVyCi0gICAgYW5vdGhlciBsYW5ndWFnZSwgeW91IGNhbiAKLSAgICA8YSBocmVmPSJodHRwOi8vdGlueW1jZS5tb3hpZWNvZGUuY29tL2xhbmd1YWdlLnBocCI+ZG93bmxvYWQgYWRkaXRpb25hbAotICAgIGxhbmd1YWdlIGNhdGFsb2d1ZXM8L2E+LiBVbnBhY2sgdGhlbSBpbiB0aGUgc2FtZSBsb2NhdGlvbi4KLSAgPC9wPgotICA8cD4KLSAgICBEZXBlbmRpbmcgb24gdGhlIHNldHRpbmcgb2YgdGhlICJtb2R1bGVzLmNvcHkiIG9wdGlvbiBpbiAKLSAgICA8Y29kZT5sb2NhbC5idWlsZC5wcm9wZXJ0aWVzPC9jb2RlPiB5b3Ugd2lsbCBoYXZlIHRvIHJlYnVpbGQgTGVueWEgYmVmb3JlCi0gICAgeW91IGNhbiB1c2UgVGlueU1DRS4KLSAgPC9wPgotICA8cD4KLSAgICBObyBmdXJ0aGVyIHNldHVwIGlzIHJlcXVpcmVkLCBidXQgaWYgeW91IHdhbnQgdG8gZmluZS10dW5lIFRpbnlNQ0UsIGVkaXQgCi0gICAgPGNvZGU+bW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9qYXZhc2NyaXB0L3RpbnlfY29uZmlnLmpzPC9jb2RlPi48YnIvPgotICAgIFJlZmVyIHRvIHRoZSBleGNlbGxlbnQgCi0gICAgPGEgaHJlZj0iaHR0cDovL3RpbnltY2UubW94aWVjb2RlLmNvbS90aW55bWNlL2RvY3MvaW5kZXguaHRtbCI+VGlueU1DRQotICAgIGRvY3VtZW50YXRpb248L2E+IGZvciBkZXRhaWxzLgotICA8L3A+Ci0gIDxwPgotICAgIFRoYW5rcyB0byB0aGUgY3JldyBhdCBtb3hpZWNvZGUgZm9yIGEgY2FwYWJsZSwgZXhjZXB0aW9uYWxseSBjbGVhbiwKLSAgICB3ZWxsLXBhY2thZ2VkIGFuZCBleHRlbnNpdmVseSBkb2N1bWVudGVkIG9wZW4tc291cmNlIGVkaXRvciEgRW5qb3kuCi0gIDwvcD4KLTwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy90aW55bWNlL2pzY3JpcHRzL3RpbnlfbWNlL3BsdWdpbnMvc2ltcGxlYnJvd3Nlci9lZGl0b3JfcGx1Z2luLmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvdGlueW1jZS9qc2NyaXB0cy90aW55X21jZS9wbHVnaW5zL3NpbXBsZWJyb3dzZXIvZWRpdG9yX3BsdWdpbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmZDAxOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy90aW55bWNlL2pzY3JpcHRzL3RpbnlfbWNlL3BsdWdpbnMvc2ltcGxlYnJvd3Nlci9lZGl0b3JfcGx1Z2luLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotdGlueU1DRS5pbXBvcnRQbHVnaW5MYW5ndWFnZVBhY2soJ3NpbXBsZWJyb3dzZXInLCAnZW4nKTsKLQotdmFyIFRpbnlNQ0VfU2ltcGxlQnJvd3NlclBsdWdpbiA9IHsKLQlvcHRpb25zIDoge30sCi0JZ2V0SW5mbyA6IGZ1bmN0aW9uKCkgewotCQlyZXR1cm4gewotCQkJbG9uZ25hbWUgOiAnJywKLQkJCWF1dGhvciA6ICcnLAotCQkJYXV0aG9ydXJsIDogJycsCi0JCQlpbmZvdXJsIDogJycsCi0JCQl2ZXJzaW9uIDogIiIKLQkJfTsKLQl9LAotCi0JaW5pdEluc3RhbmNlIDogZnVuY3Rpb24oaW5zdCkgewotCQkvLyBZb3UgY2FuIHRha2Ugb3V0IHBsdWdpbiBzcGVjaWZpYyBwYXJhbWV0ZXJzCi0JCS8vYWxlcnQoIkluaXRpYWxpemF0aW9uIHBhcmFtZXRlcjoiICsgdGlueU1DRS5nZXRQYXJhbSgidGVtcGxhdGVfc29tZXBhcmFtIiwgZmFsc2UpKTsKLQkJdGlueU1DRS5zZXR0aW5nc1snZmlsZV9icm93c2VyX2NhbGxiYWNrJ10gPSAiVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luX2Jyb3dzZSI7Ci0JCVRpbnlNQ0VfU2ltcGxlQnJvd3NlclBsdWdpbi5vcHRpb25zID0gewotCQkJd2lkdGggOiB0aW55TUNFLmdldFBhcmFtKCJwbHVnaW5fc2ltcGxlYnJvd3Nlcl93aWR0aCIsICc4MDAnKSwKLQkJCWhlaWdodCA6IHRpbnlNQ0UuZ2V0UGFyYW0oInBsdWdpbl9zaW1wbGVicm93c2VyX2hlaWdodCIsICc2MDAnKSwKLQkJCWJyb3dzZWltYWdldXJsIDogdGlueU1DRS5nZXRQYXJhbSgicGx1Z2luX3NpbXBsZWJyb3dzZXJfYnJvd3NlaW1hZ2V1cmwiLCBmYWxzZSksCi0JCQlicm93c2VsaW5rdXJsIDogdGlueU1DRS5nZXRQYXJhbSgicGx1Z2luX3NpbXBsZWJyb3dzZXJfYnJvd3NlbGlua3VybCIsIGZhbHNlKSwKLQkJCWJyb3dzZWZsYXNodXJsIDogdGlueU1DRS5nZXRQYXJhbSgicGx1Z2luX3NpbXBsZWJyb3dzZXJfYnJvd3NlZmxhc2h1cmwiLCBmYWxzZSkKLQkJfQotCX0sCi0KLQlicm93c2UgOiBmdW5jdGlvbihmaWVsZF9uYW1lLCBjdXJyZW50X3VybCwgdHlwZSwgd2luKSB7Ci0JCXN3aXRjaCh0eXBlLnRvTG93ZXJDYXNlKCkpIHsKLQkJCWNhc2UgJ2ltYWdlJzoKLQkJCQlpZihUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4ub3B0aW9uc1snYnJvd3NlaW1hZ2V1cmwnXSkgewotCQkJCQlUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4ub3BlblNlcnZlckJyb3dzZXIoZmllbGRfbmFtZSwgY3VycmVudF91cmwsIHR5cGUsIHdpbiwgVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ2Jyb3dzZWltYWdldXJsJ10pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFsZXJ0KCJJbWFnZSBicm93c2VyIFVSTCBub3Qgc2V0LiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgJ2ZsYXNoJzoKLQkJCQlpZihUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4ub3B0aW9uc1snYnJvd3NlZmxhc2h1cmwnXSkgewotCQkJCQlUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4ub3BlblNlcnZlckJyb3dzZXIoZmllbGRfbmFtZSwgY3VycmVudF91cmwsIHR5cGUsIHdpbiwgVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ2Jyb3dzZWZsYXNodXJsJ10pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFsZXJ0KCJGbGFzaCBicm93c2VyIFVSTCBub3Qgc2V0LiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYoVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ2Jyb3dzZWxpbmt1cmwnXSkgewotCQkJCQlUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4ub3BlblNlcnZlckJyb3dzZXIoZmllbGRfbmFtZSwgY3VycmVudF91cmwsIHR5cGUsIHdpbiwgVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ2Jyb3dzZWxpbmt1cmwnXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWxlcnQoIkxpbmsgYnJvd3NlciBVUkwgbm90IHNldC4iKTsKLQkJCQl9Ci0JCX0KLQl9LAotCi0Jb3BlblNlcnZlckJyb3dzZXIgOiBmdW5jdGlvbihmaWVsZF9uYW1lLCBjdXJyZW50X3VybCwgbGlua190eXBlLCB3aW4sIGJyb3dzZV91cmwpCi0JewotCQkJVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ2ZpZWxkJ10gPSBmaWVsZF9uYW1lOwotCQkJVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ2N1cmwnXSA9IGN1cnJlbnRfdXJsOwotCQkJVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ3R5cGUnXSA9IGxpbmtfdHlwZTsKLQkJCVRpbnlNQ0VfU2ltcGxlQnJvd3NlclBsdWdpbi5vcHRpb25zWyd0YXJnZXQnXSA9IHdpbjsKLQotCQl2YXIgc09wdGlvbnMgPSAidG9vbGJhcj1ubyxzY3JvbGxiYXJzPXllcyxzdGF0dXM9bm8scmVzaXphYmxlPXllcyxkZXBlbmRlbnQ9eWVzIjsKLQkJc09wdGlvbnMgKz0gIix3aWR0aD0iICsgVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ3dpZHRoJ107Ci0JCXNPcHRpb25zICs9ICIsaGVpZ2h0PSIgKyBUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4ub3B0aW9uc1snaGVpZ2h0J107Ci0JCWlmICh0aW55TUNFLmlzTVNJRSkJewotCQkJLy8gVGhlIGZvbGxvd2luZyBjaGFuZ2UgaGFzIGJlZW4gbWFkZSBvdGhlcndpc2UgSUUgd2lsbCBvcGVuIHRoZSBmaWxlIAotCQkJLy8gYnJvd3NlciBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgc2Vzc2lvbiAob24gc29tZSBjYXNlcyk6Ci0JCQkvLyBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzOzgzMTY3OAotCQkJLy8gYnkgU2ltb25lIENoaWFyZXR0YS4KLQkJCXZhciBvV2luZG93ID0gd2luZG93Lm9wZW4oYnJvd3NlX3VybCwgIlRpbnlNQ0VTaW1wbGVCcm93c2VyV2luZG93Iiwgc09wdGlvbnMgKSA7Ci0JCQlvV2luZG93Lm9wZW5lciA9IHdpbmRvdzsKLQkJfSBlbHNlIHsKLQkJCXdpbmRvdy5vcGVuKGJyb3dzZV91cmwsICJUaW55TUNFU2ltcGxlQnJvd3NlcldpbmRvdyIsIHNPcHRpb25zICk7Ci0JCX0KLQl9LAotCi0JYnJvd3NlckNhbGxiYWNrIDogZnVuY3Rpb24ocmV0dXJuVmFsdWUpIHsKLQkJaWYoIXJldHVyblZhbHVlKSByZXR1cm47Ci0JCVRpbnlNQ0VfU2ltcGxlQnJvd3NlclBsdWdpbi5vcHRpb25zWyd0YXJnZXQnXS5kb2N1bWVudC5mb3Jtc1swXS5lbGVtZW50c1tUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4ub3B0aW9uc1snZmllbGQnXV0udmFsdWUgPSByZXR1cm5WYWx1ZS51cmw7Ci0JCQotCQkvLyB0aGUgZm9sbG93aW5nIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhpcyBzY3JpcHQgaXMgdXNlZAotCQkvLyBmb3IgaW1hZ2UgaW5zZXJ0aW9uIEFORCBsaW5rIGluc2VydGlvbiAod2hlcmUgdGhlIHJldHVyblZhbHVlLndpZHRoIChoZWlnaHQgYW5kIHRpdGxlKSAgYXJlIG51bGwpCi0JCWlmIChyZXR1cm5WYWx1ZS53aWR0aCAhPSBudWxsKSB7Ci0JCSAgICBUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4ub3B0aW9uc1sndGFyZ2V0J10uZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHMud2lkdGgudmFsdWUgPSByZXR1cm5WYWx1ZS53aWR0aDsKLQkJfQotCQlpZiAocmV0dXJuVmFsdWUuaGVpZ2h0ICE9IG51bGwpIHsKLQkJICAgIFRpbnlNQ0VfU2ltcGxlQnJvd3NlclBsdWdpbi5vcHRpb25zWyd0YXJnZXQnXS5kb2N1bWVudC5mb3Jtc1swXS5lbGVtZW50cy5oZWlnaHQudmFsdWUgPSByZXR1cm5WYWx1ZS5oZWlnaHQ7Ci0JCX0KLQkJaWYgKChyZXR1cm5WYWx1ZS50aXRsZSAhPSBudWxsKSAmJiAoVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ3RhcmdldCddLmRvY3VtZW50LmZvcm1zWzBdLmVsZW1lbnRzLmFsdCAhPSBudWxsKSkgeyAgICAJCQotICAgIAkJVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLm9wdGlvbnNbJ3RhcmdldCddLmRvY3VtZW50LmZvcm1zWzBdLmVsZW1lbnRzLmFsdC52YWx1ZSA9IHJldHVyblZhbHVlLnRpdGxlOwotCQl9Ci0JfQotfTsKLQotZnVuY3Rpb24gVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luX2Jyb3dzZShmaWVsZF9uYW1lLCBjdXJyZW50X3VybCwgdHlwZSwgd2luKSB7Ci0JVGlueU1DRV9TaW1wbGVCcm93c2VyUGx1Z2luLmJyb3dzZShmaWVsZF9uYW1lLCBjdXJyZW50X3VybCwgdHlwZSwgd2luKQotfTsKLQotdGlueU1DRS5hZGRQbHVnaW4oInNpbXBsZWJyb3dzZXIiLCBUaW55TUNFX1NpbXBsZUJyb3dzZXJQbHVnaW4pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL3RpbnltY2UvanNjcmlwdHMvdGlueV9tY2UvcGx1Z2lucy9zaW1wbGVicm93c2VyL2xhbmdzL2VuLmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvdGlueW1jZS9qc2NyaXB0cy90aW55X21jZS9wbHVnaW5zL3NpbXBsZWJyb3dzZXIvbGFuZ3MvZW4uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNzE1MzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS9yZXNvdXJjZXMvdGlueW1jZS9qc2NyaXB0cy90aW55X21jZS9wbHVnaW5zL3NpbXBsZWJyb3dzZXIvbGFuZ3MvZW4uanMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXRpbnlNQ0UuYWRkVG9MYW5nKCdzaW1wbGVicm93c2VyJyx7fSk7CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy90aW55bWNlL3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2Uvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRkZmQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2Uvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPCEtLSBUaW55TUNFIGludGVncmF0aW9uIG1vZHVsZSBzaXRlbWFwIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotCi0gICAgPG1hcDpwaXBlbGluZSBpbnRlcm5hbC1vbmx5PSJ5ZXMiPgotCi0gICAgICA8IS0tIHdoZW4gZWRpdGluZywgdGhlIHBhZ2Ugc2hvdWxkIGxvb2sgZXhhY3RseSBsaWtlIHRoZSBvcmlnaW5hbCwgYW5kIHNpbmNlCi0gICAgICAgICAgIHdlIGNhbm5vdCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBwaXBlbGluZXMgdXNlZCBmb3IgcmVuZGVyaW5nLCB3ZSBtdXN0Ci0gICAgICAgICAgIGRlbGVnYXRlIHRoZSBqb2IgdG8gdGhlIHB1YmxpY2F0aW9uJ3Mgb3duIHNpdGVtYXAuIC0tPgotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InRpbnltY2UuZGVsZWdhdGVUb1B1YlNpdGVtYXAvKioiPgotICAgICAgICA8bWFwOm1vdW50IHNyYz0ie2ZhbGxiYWNrOntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfTpzaXRlbWFwLnhtYXB9IiB1cmktcHJlZml4PSJ0aW55bWNlLmRlbGVnYXRlVG9QdWJTaXRlbWFwIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgICAgPCEtLSB0aGUgdXNlY2FzZSBmcmFtZXdvcmsgcHJvdmlkZXMgZXJyb3IgYW5kIGluZm8gbWVzc2FnZXMuIHNpbmNlIHdlIGJ5cGFzcwotICAgICAgICAgICB0aGUganh0ZW1wbGF0ZSB2aWV3IG1lY2hhbmlzbSwgd2UgbXVzdCBpbmNsdWRlIHRoZW0gYnkgaGFuZC4gLS0+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0idGlueW1jZS5nZXRVc2VjYXNlTWVzc2FnZXMiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9Imp4IiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy91c2VjYXNlL3RlbXBsYXRlcy9tZXNzYWdlcy5qeCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4KLSAgICAgICAgICA8bWFwOnBhcmFtIG5hbWU9ImxvY2FsZSIgdmFsdWU9IltyZXF1ZXN0OmxvY2FsZX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvbnRleHQ6Ly9sZW55YS94c2x0L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2wiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLQotICAgICAgPCEtLSB0aGlzIGlzIHRoZSB2aWV3IG9mIHRoZSB1c2VjYXNlIChzZWUgY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLXRpbnltY2UtZWRpdC54Y29uZikgLS0+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0idGlueW1jZS5lZGl0Ij4KLSAgICAgICAgPCEtLSBjaGVjayBpZiBUaW55TUNFIGlzIGluc3RhbGxlZCAtLT4KLSAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIj4KLSAgICAgICAgICA8IS0tIHJlbmRlciBwYWdlIHdpdGggdGlueW1jZSBpbnNlcnRlZCAtLT4KLSAgICAgICAgICA8bWFwOndoZW4gdGVzdD0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3RpbnltY2UvcmVzb3VyY2VzL3RpbnltY2UvanNjcmlwdHMvdGlueV9tY2UvdGlueV9tY2UuanMiPgotICAgICAgICAgICAgPG1hcDphZ2dyZWdhdGUgZWxlbWVudD0idGlueW1jZVdyYXBwZXIiPgotICAgICAgICAgICAgICA8bWFwOnBhcnQgc3JjPSJjb2Nvb246L3RpbnltY2UuZGVsZWdhdGVUb1B1YlNpdGVtYXAvYXV0aG9yaW5ne3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXJsfSIvPgotICAgICAgICAgICAgICA8bWFwOnBhcnQgc3JjPSJjb2Nvb246L3RpbnltY2UuZ2V0VXNlY2FzZU1lc3NhZ2VzIi8+Ci0gICAgICAgICAgICA8L21hcDphZ2dyZWdhdGU+Ci0gICAgICAgICAgICA8IS0tIENoZWNrIGZvciBsYW5ndWFnZSBwYWNrIHRvIHJlbmRlciBUaW55TUNFIGFjY29yZGluZyB0byB0aGUgCi0gICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBsb2NhbGUuIElmIGl0IGRvZXMgbm90IGV4aXN0LCBmYWxsIGJhY2sgdG8gRW5nbGlzaC4gLS0+IAotICAgICAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIj4KLSAgICAgICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy90aW55bWNlL2pzY3JpcHRzL3RpbnlfbWNlL2xhbmdzL3tyZXF1ZXN0OmxvY2FsZX0uanMiPgotICAgICAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3RpbnltY2UveHNsdC9wYWdlMmVkaXQueHNsIj4KLSAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIHByb3h5IHBhdGggaXMgc2V0IG1hbnVhbGx5LCBzaW5jZSB0aGUgZG9jdW1lbnQgaGFzIGFscmVhZHkgYmVlbgotICAgICAgICAgICAgICAgICAgICAgICB0aG91Z2ggdGhlIHByb3h5IHRyYW5zZm9ybWVyIGluIHRoZSBwdWJsaWNhdGlvbiBzaXRlbWFwLCBhbmQgd2UgY2FuJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlIGl0IGFnYWluLCBhcyB0aGF0IHdvdWxkIHlpZWxkIGR1cGxpY2F0ZSBwcm94eSBwYXRocy4gLS0+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwcm94eVBhdGgiIHZhbHVlPSJ7cHJveHk6fSIvPgotICAgICAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY29udGludWF0aW9uSWQiIHZhbHVlPSJ7Zmxvdy1jb250aW51YXRpb246aWR9Ii8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1c2VjYXNlTmFtZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOmxlbnlhLnVzZWNhc2V9Ii8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbklkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9Ii8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICAgICAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy90aW55bWNlL3hzbHQvcGFnZTJlZGl0LnhzbCI+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwcm94eVBhdGgiIHZhbHVlPSJ7cHJveHk6fSIvPgotICAgICAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY29udGludWF0aW9uSWQiIHZhbHVlPSJ7Zmxvdy1jb250aW51YXRpb246aWR9Ii8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1c2VjYXNlTmFtZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOmxlbnlhLnVzZWNhc2V9Ii8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbklkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9Ii8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJlbiIvPgotICAgICAgICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgPCEtLSBUaW55TUNFIGlzIG5vdCBpbnN0YWxsZWQgLSBnZW5lcmF0ZSBpbmZvIHBhZ2UgZm9yIHRoZSB1c2VyIC0tPgotICAgICAgICAgIDxtYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy90aW55bWNlL3Jlc291cmNlcy9taXNjL2Rvd25sb2FkLnhtbCIvPgotICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4gICAgICAKLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJjb250ZXh0Oi8vbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhodG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gIDwvbWFwOnBpcGVsaW5lcz4KLQotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3RpbnltY2UveHNsdC9wYWdlMmVkaXQueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS94c2x0L3BhZ2UyZWRpdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzMxZDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdGlueW1jZS94c2x0L3BhZ2UyZWRpdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iI2RlZmF1bHQgaTE4biIKLT4KLQotPCEtLQotICB0aGlzIHN0eWxlc2hlZXQgaW5zZXJ0cyB0aGUgdGlueW1jZSBqYXZhc2NyaXB0IGNvZGUgaW50byB0aGUKLSAgcmVuZGVyZWQgcGFnZSBhZnRlciB0aGUgbGFzdCBoZWFkZXIgdGFnLCBhbmQgcHV0cyBhIGZvcm0gYW5kIAotICB0ZXh0YXJlYSBpbnRvIHRoZSBkaXYjYm9keSB0YWcuCi0tLT4KLQotPHhzbDpwYXJhbSBuYW1lPSJwcm94eVBhdGgiIHNlbGVjdD0iJ3RpbnltY2UuRVJST1InIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImNvbnRpbnVhdGlvbklkIiBzZWxlY3Q9Iid0aW55bWNlLkVSUk9SJyIvPgotPHhzbDpwYXJhbSBuYW1lPSJ1c2VjYXNlTmFtZSIgc2VsZWN0PSIndGlueW1jZS5FUlJPUiciLz4KLTx4c2w6cGFyYW0gbmFtZT0icHVibGljYXRpb25JZCIgc2VsZWN0PSIndGlueW1jZS5FUlJPUiciIC8+Ci08eHNsOnBhcmFtIG5hbWU9ImxvY2FsZSIgc2VsZWN0PSIndGlueW1jZS5FUlJPUiciLz4KLQotCi08IS0tCi0gIGNoZWNrIHNpdGVtYXAgcGFyYW1ldGVycy4KLSAgdGhlIDx0aW55bWNlV3JhcHBlci8+IGlzIHRoZSBkb2N1bWVudCBlbGVtZW50IHNldCBieSB0aGUgYWdncmVnYXRvci4KLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGlueW1jZVdyYXBwZXIiPgotICA8eHNsOmlmIHRlc3Q9IiRwcm94eVBhdGg9J3RpbnltY2UuRVJST1InIj4KLSAgICA8eHNsOm1lc3NhZ2UgdGVybWluYXRlPSJ5ZXMiPgotICAgICAgPGkxOG46dGV4dD5NaXNzaW5nIHByb3h5UGF0aCBwYXJhbWV0ZXIhPC9pMThuOnRleHQ+Ci0gICAgICA8aTE4bjp0ZXh0PkNoZWNrIHlvdXIgdGlueW1jZSBzaXRlbWFwLjwvaTE4bjp0ZXh0PgotICAgIDwveHNsOm1lc3NhZ2U+Ci0gIDwveHNsOmlmPgotICA8eHNsOmlmIHRlc3Q9IiRjb250aW51YXRpb25JZD0ndGlueW1jZS5FUlJPUiciPgotICAgIDx4c2w6bWVzc2FnZSB0ZXJtaW5hdGU9InllcyI+Ci0gICAgICA8aTE4bjp0ZXh0Pk1pc3NpbmcgY29udGludWF0aW9uSWQgcGFyYW1ldGVyITwvaTE4bjp0ZXh0PgotICAgICAgPGkxOG46dGV4dD5DaGVjayB5b3VyIHRpbnltY2Ugc2l0ZW1hcC48L2kxOG46dGV4dD4KLSAgICA8L3hzbDptZXNzYWdlPgotICA8L3hzbDppZj4KLSAgPHhzbDppZiB0ZXN0PSIkdXNlY2FzZU5hbWU9J3RpbnltY2UuRVJST1InIj4KLSAgICA8eHNsOm1lc3NhZ2UgdGVybWluYXRlPSJ5ZXMiPgotICAgICAgPGkxOG46dGV4dD5NaXNzaW5nIHVzZWNhc2VOYW1lIHBhcmFtZXRlciE8L2kxOG46dGV4dD4KLSAgICAgIDxpMThuOnRleHQ+Q2hlY2sgeW91ciB0aW55bWNlIHNpdGVtYXAuPC9pMThuOnRleHQ+Ci0gICAgPC94c2w6bWVzc2FnZT4KLSAgPC94c2w6aWY+Ci0gIDx4c2w6aWYgdGVzdD0iJHB1YmxpY2F0aW9uSWQ9J3RpbnltY2UuRVJST1InIj4KLSAgICA8eHNsOm1lc3NhZ2UgdGVybWluYXRlPSJ5ZXMiPgotICAgICAgPGkxOG46dGV4dD5NaXNzaW5nIHB1YmxpY2F0aW9uSWQgcGFyYW1ldGVyITwvaTE4bjp0ZXh0PgotICAgICAgPGkxOG46dGV4dD5DaGVjayB5b3VyIHRpbnltY2Ugc2l0ZW1hcC48L2kxOG46dGV4dD4KLSAgICA8L3hzbDptZXNzYWdlPgotICA8L3hzbDppZj4KLSAgPHhzbDppZiB0ZXN0PSIkbG9jYWxlPSd0aW55bWNlLkVSUk9SJyI+Ci0gICAgPHhzbDptZXNzYWdlIHRlcm1pbmF0ZT0ieWVzIj4KLSAgICAgIDxpMThuOnRleHQ+TWlzc2luZyBsb2NhbGUgcGFyYW1ldGVyITwvaTE4bjp0ZXh0PgotICAgICAgPGkxOG46dGV4dD5DaGVjayB5b3VyIHRpbnltY2Ugc2l0ZW1hcC48L2kxOG46dGV4dD4KLSAgICA8L3hzbDptZXNzYWdlPgotICA8L3hzbDppZj4KLQotICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmh0bWwiLz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gCi0gIGFkZCB0aW55bWNlIGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGhlYWRlci4KLSAgRklYTUU6IGNhbiB3ZSBnZXQgcHJvcGVyIHdoaXRlc3BhY2UgaW4gdGhlIG91dHB1dAotICB3aXRob3V0IG1ha2luZyB0aGUgdGVtcGxhdGUgc28gdmVyYm9zZT8KLSAgRklYTUU6IG1vZHVsYXJpemUgY29uZmlnIHNvbWUgbW9yZSBzbyB1c2VycyBjYW4gZmFsbGJhY2stb3ZlcnJpZGUgbW9yZSBlYXNpbHkuCi0gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpodG1sL3hodG1sOmhlYWQveGh0bWw6KltsYXN0KCldIj4KLSAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImlkZW50aXR5Ii8+Ci0gIDx4c2w6dGV4dD4KLSAgPC94c2w6dGV4dD4KLSAgPHhzbDpjb21tZW50PnNwZWNpYWwgY29kZSBmb3IgdGlueW1jZS5lZGl0IHVzZWNhc2UgdmlldzwveHNsOmNvbW1lbnQ+Ci0gIDx4c2w6dGV4dD4KLSAgPC94c2w6dGV4dD4KLSAgPHhzbDpjb21tZW50PndpdGhvdXQgdGhlIHNwYWNlIGJldHdlZW4gb3BlbmluZyBhbmQgY2xvc2luZyBzY3JpcHQgdGFnLCBGaXJlZm94IHRlbmRzIHRvIGludGVycHJldCB0aGUgd2hvbGUgcGFnZSBhcyBhIGNvbW1lbnQgb3Igc29tZXRoaW5nIDooPC94c2w6Y29tbWVudD4KLSAgPHhzbDp0ZXh0PgotICA8L3hzbDp0ZXh0PgotICA8eHNsOmNvbW1lbnQ+dGhlIHRpbnltY2UgY29kZTo8L3hzbDpjb21tZW50PgotICA8eHNsOnRleHQ+Ci0gIDwveHNsOnRleHQ+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIAotICAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgCi0gICAgICAgICAgc3JjPSJ7JHByb3h5UGF0aH0veyRwdWJsaWNhdGlvbklkfS9tb2R1bGVzL3RpbnltY2UvdGlueW1jZS9qc2NyaXB0cy90aW55X21jZS90aW55X21jZS5qcyIKLSAgPiYjMTYwOzwvc2NyaXB0PgotICA8eHNsOnRleHQ+Ci0gIDwveHNsOnRleHQ+Ci0gIDx4c2w6Y29tbWVudD5jdXN0b20gZXZlbnQgaGFuZGxlcnMgZm9yIGxlbnlhOjwveHNsOmNvbW1lbnQ+Ci0gIDx4c2w6dGV4dD4KLSAgPC94c2w6dGV4dD4KLSAgPHhzbDpjb21tZW50PnRoZSBtYWluIGNvbmZpZ3VyYXRpb24gb2YgdGlueW1jZTo8L3hzbDpjb21tZW50PgotICA8eHNsOnRleHQ+Ci0gIDwveHNsOnRleHQ+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIAotICAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIKLSAgICAgICAgICBzcmM9InskcHJveHlQYXRofS97JHB1YmxpY2F0aW9uSWR9L21vZHVsZXMvdGlueW1jZS9qYXZhc2NyaXB0L3RpbnlfY29uZmlnLmpzIgotICA+JiMxNjA7PC9zY3JpcHQ+Ci0gIDx4c2w6dGV4dD4KLSAgPC94c2w6dGV4dD4KLSAgPHhzbDpjb21tZW50PmFsbG93ZWQgWEhUTUwgZWxlbWVudHMgaW4gdGlueW1jZTo8L3hzbDpjb21tZW50PgotICA8eHNsOnRleHQ+Ci0gIDwveHNsOnRleHQ+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIAotICAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIKLSAgICAgICAgICBzcmM9InskcHJveHlQYXRofS97JHB1YmxpY2F0aW9uSWR9L21vZHVsZXMvdGlueW1jZS9qYXZhc2NyaXB0L3RpbnlfdmFsaWRfZWxlbWVudHMuanMiCi0gID4mIzE2MDs8L3NjcmlwdD4KLSAgPHhzbDp0ZXh0PgotICA8L3hzbDp0ZXh0PgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiAKLSAgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIAotICAgICAgICAgIHNyYz0ieyRwcm94eVBhdGh9L3skcHVibGljYXRpb25JZH0vbW9kdWxlcy9lZGl0b3JzL2phdmFzY3JpcHQvb3JnLmFwYWNoZS5sZW55YS5lZGl0b3JzLmpzIgotICA+JiMxNjA7PC9zY3JpcHQ+Ci0gIDx4c2w6dGV4dD4KLSAgPC94c2w6dGV4dD4KLSAgPHhzbDpjb21tZW50PmNhdGNoIGJhY2tzcGFjZSBrZXkgLSBpdCBtYXBzIHRvICJiYWNrIGluIGhpc3RvcnkiIGluIHNvbWUgcG9wdWxhciAKLSAgYnJvd3NlcnMgdW5kZXIgd2luZG93cywgd2hpY2ggY2FuIGNvbmZ1c2UgdXNlcnMgYW5kIGxlYWQgdG8gZGF0YSBsb3NzPC94c2w6Y29tbWVudD4KLSAgPHhzbDp0ZXh0PgotICA8L3hzbDp0ZXh0PgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiAKLSAgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIAotICAgICAgICAgIHNyYz0ieyRwcm94eVBhdGh9L3skcHVibGljYXRpb25JZH0vbW9kdWxlcy9lZGl0b3JzL2phdmFzY3JpcHQvZGlzYWJsZWJhY2tzcGFjZS5qcyIKLSAgPiYjMTYwOzwvc2NyaXB0PgotICA8eHNsOnRleHQ+Ci0gIDwveHNsOnRleHQ+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIAotICAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgCi0gICAgICAgICAgc3JjPSJ7JHByb3h5UGF0aH0veyRwdWJsaWNhdGlvbklkfS9tb2R1bGVzL3RpbnltY2UvamF2YXNjcmlwdC90aW55X2xlbnlhX2dsdWUuanMiCi0gID4mIzE2MDs8L3NjcmlwdD4KLSAgPHhzbDp0ZXh0PgotICA8L3hzbDp0ZXh0PgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8eHNsOnRleHQ+Ci0KLS8qIAotICAgaW5jbHVkZSB2YWxpZCBlbGVtZW50cyBmcm9tIHRpbnlfdmFsaWRfZWxlbWVudHMuanMgKGV4dHJhIGZpbGUgc28gdGhhdCB5b3UgY2FuIG92ZXJyaWRlIGl0IHBlci1kb2N0eXBlKQotICAgRklYTUU6IG5vdCB5ZXQgZG9uZSwgdGhpcyBuZWVkcyB0byBiZSByZXNvbHZlZCB2aWEgYSBzcGVjaWFsIHBpcGVsaW5lIQotCi0gKi8KLQotICAgY29uZmlnWyd2YWxpZF9lbGVtZW50cyddID0gbGVueWFfdmFsaWRfZWxlbWVudHM7Ci0KLQotLyogc29tZSBkeW5hbWljIGNvbmZpZ3VyYXRpb24gdGhhdCBkZXBlbmRzIG9uIHBpcGVsaW5lIGluZm9ybWF0aW9uICovCi0KLSAgICAvKiBwYXNzIHRoZSBsb2NhbGUgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdCB0byBUaW55TUNFLCBzbyB0aGF0IGl0IGlzIHByb3Blcmx5IGxvY2FsaXplZCAqLwotCi0gICAgY29uZmlnWydsYW5ndWFnZSddID0gIjwveHNsOnRleHQ+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb2NhbGUiLz4KLSAgICA8eHNsOnRleHQ+IjsKLQotICAgIC8qIHBhc3MgYWxsIHRoZSBzdHlsZXNoZWV0cyBvZiB0aGUgY3VycmVudCBwYWdlIChleGNlcHQgZm9yIHRob3NlIHNwZWNpZmljCi0gICAgICAgdG8gdGhlIExlbnlhIGF1dGhvcmluZyBHVUkpIHRvIFRpbnlNQ0UgZm9yIHRydWUgV1lTSVdZRyBlZGl0aW5nICovCi0KLSAgICBjb25maWdbJ2NvbnRlbnRfY3NzJ10gPSAiPC94c2w6dGV4dD4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3h5UGF0aCIvPgotICAgIDx4c2w6dGV4dD4vbW9kdWxlcy90aW55bWNlL2Nzcy9lZGl0b3JfY29udGVudC5jc3M8L3hzbDp0ZXh0PgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi94aHRtbDpsaW5rW0ByZWw9J3N0eWxlc2hlZXQnIGFuZCBub3QoY29udGFpbnMoQGhyZWYsICcvbGVueWEvY3NzLycpKV0iPgotICAgICAgICA8eHNsOnRleHQ+LDwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiIvPgotICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgPHhzbDp0ZXh0PiI7Ci0KLSAgICB0aW55TUNFLmluaXQoY29uZmlnKTsKLQotICAgIDwveHNsOnRleHQ+Ci0KLSAgICA8L3NjcmlwdD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tCi0gIGluc2VydCBsZW55YSBjbXMgZGVmYXVsdC5jc3MgYmVmb3JlIHRoZSBmaXJzdCBoZWFkZXIgZWxlbWVudCwgc28gdGhhdCAKLSAgcHVibGljYXRpb24tc3BlY2lmaWMgc3R5bGVzIHdpbGwgb3ZlcnJpZGUgaXQuICh1c2VkIHRvIGZvcm1hdCB0aGUgdXNlY2FzZQotIG1lc3NhZ2VzLikKLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aHRtbC94aHRtbDpoZWFkL3hodG1sOipbMV0iPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvbGVueWEvY3NzL2RlZmF1bHQuY3NzIi8+Ci0gIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpZGVudGl0eSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gCi0gIGEgdGV4dGFyZWEgaXMgaW5zZXJ0ZWQgaW50byB0aGUgPGRpdiBpZD0iYm9keSIvPiBlbGVtZW50LiAKLSAgaXQgd2lsbCBiZWNvbWUgdGhlIGVkaXRvciBpbnN0YW5jZS4gdGhlIGNvbnRlbnRzIG9mIDxkaXYgaWQ9ImJvZHkiLz4KLSAgYXJlIHRoZW4gY29waWVkIGludG8gdGhlIHRleHRhcmVhLgotICBiZWZvcmUgdGhlIHRleHRhcmVhLCB3ZSBpbnNlcnQgYW55IHVzZWNhc2UgaW5mbyBhbmQgZXJyb3IgbWVzc2FnZXMuCi0tLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmh0bWwveGh0bWw6Ym9keS8veGh0bWw6ZGl2W0BpZD0nYm9keSddIj4KLTwhLS0gY29weSB0aGUgZGl2I2JvZHkgYW5kIGFsbCBhdHRyaWJ1dGVzIHRoYXQgbWlnaHQgYmUgaW4gaXQgLS0+Ci08eHNsOmNvcHk+Ci0gIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJAKiI+Ci0gICAgPHhzbDpjb3B5Lz4KLSAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPCEtLSBpbnNlcnQgdXNlY2FzZSBtZXNzYWdlcywgaWYgYW55IC0tPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iL3RpbnltY2VXcmFwcGVyL3hodG1sOmRpdltAY2xhc3M9J2xlbnlhLWVycm9yJ10iLz4KLSAgPHhzbDppZiB0ZXN0PSJub3QoL3RpbnltY2VXcmFwcGVyL3hodG1sOmRpdltAY2xhc3MgPSAnbGVueWEtZXJyb3InXS8qKSI+Ci0gICAgPCEtLSBpbnNlcnQgdGlueW1jZSBmb3JtIGhvb2sgLS0+Ci0gICAgICA8eHNsOmNvbW1lbnQ+c3BlY2lhbCBjb2RlIGZvciB0aGUgdGlueW1jZS5lZGl0IHVzZWNhc2UgdmlldzwveHNsOmNvbW1lbnQ+Ci0gICAgICA8eHNsOnRleHQ+Ci0gICAgICA8L3hzbDp0ZXh0PgotICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KLSAgICAgICAgICA8eHNsOnRleHQ+Ci0gICAgICAgICAgPC94c2w6dGV4dD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS5jb250aW51YXRpb24iIHZhbHVlPSJ7JGNvbnRpbnVhdGlvbklkfSIvPgotICAgICAgICAgIDx4c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDp0ZXh0PgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSJ7JHVzZWNhc2VOYW1lfSIvPgkJCi0gICAgICAgICAgPHhzbDp0ZXh0PgotICAgICAgICAgIDwveHNsOnRleHQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idGlueW1jZS5uYW1lc3BhY2VzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgPHhzbDp0ZXh0PgotICAgICAgICAgIDwveHNsOnRleHQ+Ci0gICAgICAgICAgPHRleHRhcmVhIGlkPSJ0aW55bWNlLmNvbnRlbnQiIG5hbWU9InRpbnltY2UuY29udGVudCIgc3R5bGU9IndpZHRoOjEwMCUiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwhLS0gZmlyZWZveCBidWcgd29ya2Fyb3VuZDogcHJldmVudCA8dGV4dGFyZWEvPiBmcm9tIGNvbGxhcHNpbmcgaWYgZW1wdHkgLS0+Ci0gICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIuLy8qIj4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4mIzE2MDs8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgPC90ZXh0YXJlYT4KLSAgICAgICAgICA8eHNsOnRleHQ+Ci0gICAgICAgICAgPC94c2w6dGV4dD4KLSAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTYXZlIi8+CQkKLSAgICAgICAgICA8eHNsOnRleHQ+Ci0gICAgICAgICAgPC94c2w6dGV4dD4KLSAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSJDYW5jZWwiLz4JCQotICAgICAgICAgIDx4c2w6dGV4dD4KLSAgICAgIDwveHNsOnRleHQ+Ci0gICAgICA8L2Zvcm0+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDp0ZXh0PgotICAgIDwveHNsOnRleHQ+Ci08L3hzbDpjb3B5PgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii90aW55bWNlV3JhcHBlci94aHRtbDpkaXZbQGNsYXNzPSdsZW55YS1lcnJvciddIj4KLSAgPHhzbDpjb3B5PgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJAKiI+Ci0gICAgICA8eHNsOmNvcHkvPgotICAgIDwveHNsOmZvci1lYWNoPgotICAgIDxkaXY+Ci0gICAgICAgPHA+PHN0cm9uZz5Vc2VjYXNlIG1lc3NhZ2VzIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2VjYXNlTmFtZSIvPiI6PC9zdHJvbmc+PC9wPgotICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L2Rpdj4KLSAgPC94c2w6Y29weT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiIG5hbWU9ImlkZW50aXR5Ij4KLSAgPHhzbDpjb3B5PgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gIDwveHNsOmNvcHk+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvbW9kdWxlcy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9jb25maWcvY29jb29uLXhjb25mL21vZHVsZXMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmVkNjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvbW9kdWxlcy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL2lucHV0LW1vZHVsZXMiIHVubGVzcz0iL2NvY29vbi9pbnB1dC1tb2R1bGVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd1c2VjYXNlLWRvY3VtZW50J10iPgotCi0gIDxjb21wb25lbnQtaW5zdGFuY2UgbG9nZ2VyPSJjb3JlLm1vZHVsZXMuaW5wdXQudXNlY2FzZS1kb2N1bWVudCIgbmFtZT0idXNlY2FzZS1kb2N1bWVudCIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5Vc2VjYXNlRG9jdW1lbnRNb2R1bGUiLz4KLSAgCi08L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2UtdHlwZS11c2VjYXNlLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2UtdHlwZS11c2VjYXNlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmYzZjI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9jb25maWcvY29jb29uLXhjb25mL3Jlc291cmNlLXR5cGUtdXNlY2FzZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueGNvbmYgMTY0NjM1IDIwMDUtMDQtMjUgMjA6MDE6NDNaIHRzY2hsYWJhY2ggJCAtLT4KLQotPHhjb25mIHhwYXRoPSIvY29jb29uL3Jlc291cmNlLXR5cGVzIiB1bmxlc3M9Ii9jb2Nvb24vcmVzb3VyY2UtdHlwZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3VzZWNhc2UnXSI+Ci0gIAotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InVzZWNhc2UiCi0gICAgbG9nZ2VyPSJsZW55YS5yZXNvdXJjZXR5cGVzLnVzZWNhc2UiCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZUltcGwiPgotICAgIDxzY2hlbWEgCi0gICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMC45IgotICAgICAgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3Jlc291cmNlcy9zY2hlbWFzL3VzZWNhc2Uucm5nIgotICAgIC8+Ci0gICAgPHNhbXBsZSAKLSAgICAgIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veG1sIgotICAgICAgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3NhbXBsZXMvdXNlY2FzZS54bWwiCi0gICAgLz4KLSAgICA8Zm9ybWF0IG5hbWU9InhodG1sIiB1cmk9ImNvY29vbjovL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3VzZWNhc2UueG1sIi8+Ci0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotICAKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy91c2VjYXNlZG9jdW1lbnQvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlLWNyZWF0ZVVzZWNhc2VEb2N1bWVudC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY3JlYXRlVXNlY2FzZURvY3VtZW50Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDA1MGVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2UtY3JlYXRlVXNlY2FzZURvY3VtZW50Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3VzZWNhc2Vkb2N1bWVudC5jcmVhdGUnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0idXNlY2FzZWRvY3VtZW50LmNyZWF0ZSIgbG9nZ2VyPSJsZW55YS5zaXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DcmVhdGVVc2VjYXNlRG9jdW1lbnQiPg0KLSAgICAgIDx2aWV3IHVyaT0ibW9kdWxlcy91c2VjYXNlZG9jdW1lbnQvdXNlY2FzZXMvY3JlYXRlVXNlY2FzZURvY3VtZW50Lmp4Ii8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy91c2VjYXNlZG9jdW1lbnQvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy91c2VjYXNlZG9jdW1lbnQvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OWUzZDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZWRvY3VtZW50PC9pZD4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5zaXRlbWFuYWdlbWVudCIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPlVzZWNhc2UgUmVzb3VyY2UgVHlwZTwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+UmVzb3VyY2UgdHlwZSB3aGljaCBhbGxvd3MgdG8gZXhlY3V0ZSB1c2VjYXNlcyBpbiB0aGUgY29udGV4dCBvZiBhIGRvY3VtZW50LjwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9jb2Nvb24vY29tcG9uZW50cy9tb2R1bGVzL2lucHV0L1VzZWNhc2VEb2N1bWVudE1vZHVsZS5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvVXNlY2FzZURvY3VtZW50TW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTY1ODMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2NvY29vbi9jb21wb25lbnRzL21vZHVsZXMvaW5wdXQvVXNlY2FzZURvY3VtZW50TW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuQWJzdHJhY3RJbnB1dE1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5PYmplY3RNb2RlbEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5lbnZpcm9ubWVudC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLkNyZWF0ZVVzZWNhc2VEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5Eb2N1bWVudEhlbHBlcjsKLQotLyoqCi0gKiBNb2R1bGUgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSBhIHVzZWNhc2UgcmVzb3VyY2UgdHlwZSBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFVzZWNhc2VEb2N1bWVudE1vZHVsZSBleHRlbmRzIEFic3RyYWN0SW5wdXRNb2R1bGUgaW1wbGVtZW50cyBTZXJ2aWNlYWJsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VDQVNFID0gInVzZWNhc2UiOwotCi0gICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIENvbmZpZ3VyYXRpb24gbW9kZUNvbmYsIE1hcCBvYmplY3RNb2RlbCkKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFVTRUNBU0UpKSB7Ci0gICAgICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gT2JqZWN0TW9kZWxIZWxwZXIuZ2V0UmVxdWVzdChvYmplY3RNb2RlbCk7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gRG9jdW1lbnRVdGlsLmdldEN1cnJlbnREb2N1bWVudCh0aGlzLm1hbmFnZXIsIHJlcXVlc3QpOwotICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IHhtbERvYyA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudChkb2MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVzZWNhc2VOYW1lID0geG1sRG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEF0dHJpYnV0ZShDcmVhdGVVc2VjYXNlRG9jdW1lbnQuQVRUUklCVVRFX05BTUUpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gdXNlY2FzZU5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IG9idGFpbiB2YWx1ZTogIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy91c2VjYXNlZG9jdW1lbnQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvc2l0ZS91c2VjYXNlcy9DcmVhdGVVc2VjYXNlRG9jdW1lbnQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZVVzZWNhc2VEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZkYmQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9zaXRlL3VzZWNhc2VzL0NyZWF0ZVVzZWNhc2VEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBDcmVhdGUgYSB1c2VjYXNlIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgY29udGVudCBsb29rcyBsaWtlIHRoaXM6Ci0gKiA8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiAgICZsdDt1c2VjYXNlIG5hbWU9JnF1b3Q7Li4uJnF1b3Q7LyZndDsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlVXNlY2FzZURvY3VtZW50IGV4dGVuZHMgQ3JlYXRlRG9jdW1lbnQgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFQ0FTRSA9ICJ1c2VjYXNlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9UWVBFX1VTRUNBU0UgPSAidXNlY2FzZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZXNwYWNlIGZvciB1c2VjYXNlIGRvY3VtZW50IGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL3VzZWNhc2UvMS4wIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSB1c2VjYXNlIFhNTCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVVNFQ0FTRSA9ICJ1c2VjYXNlIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBuYW1lIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJuYW1lIjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UGFyYW1ldGVycygpIHsKLSAgICAgICAgc3VwZXIuaW5pdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgc2V0UGFyYW1ldGVyKERPQ1VNRU5UX1RZUEUsIFJFU09VUkNFX1RZUEVfVVNFQ0FTRSk7Ci0gICAgICAgIHNldFBhcmFtZXRlcihSRVNPVVJDRV9UWVBFUywgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nWzBdKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZG9DaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLQotICAgICAgICBTdHJpbmcgdXNlY2FzZU5hbWUgPSBnZXRQYXJhbWV0ZXJBc1N0cmluZyhVU0VDQVNFKTsKLSAgICAgICAgaWYgKHVzZWNhc2VOYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiUGxlYXNlIGVudGVyIGEgdXNlY2FzZSBuYW1lLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVXNlY2FzZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIgPSAoVXNlY2FzZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFVzZWNhc2VSZXNvbHZlci5ST0xFKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVyLmlzUmVnaXN0ZXJlZChnZXRTb3VyY2VVUkwoKSwgdXNlY2FzZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiVGhlIHVzZWNhc2UgJyIgKyB1c2VjYXNlTmFtZSArICInIGlzIG5vdCByZWdpc3RlcmVkLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5kb0V4ZWN1dGUoKTsKLQotICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihOQU1FU1BBQ0UsICIiLCBFTEVNRU5UX1VTRUNBU0UpOwotICAgICAgICBFbGVtZW50IHVzZWNhc2VFbGVtZW50ID0gaGVscGVyLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIHVzZWNhc2VFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgZ2V0UGFyYW1ldGVyQXNTdHJpbmcoVVNFQ0FTRSkpOwotICAgICAgICBEb2N1bWVudEhlbHBlci53cml0ZURvY3VtZW50KGhlbHBlci5nZXREb2N1bWVudCgpLCBnZXROZXdEb2N1bWVudCgpLmdldE91dHB1dFN0cmVhbSgpKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzA2MjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aS54bWwgNDQ2NTQyIDIwMDYtMDktMTUgMDg6MTQ6MzlaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJlbiIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUtdXNlY2FzZSI+VXNlY2FzZTwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTk5NDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aV9kZS54bWwgNDQ2NTQyIDIwMDYtMDktMTUgMDg6MTQ6MzlaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJkZSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUtdXNlY2FzZSI+VXNlY2FzZTwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQotDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3Jlc291cmNlcy9zY2hlbWFzL3VzZWNhc2Uucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3Jlc291cmNlcy9zY2hlbWFzL3VzZWNhc2Uucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTVmMjg3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9yZXNvdXJjZXMvc2NoZW1hcy91c2VjYXNlLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08ZWxlbWVudCBuYW1lPSJ1c2VjYXNlIiBucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvdXNlY2FzZS8xLjAiIHhtbG5zPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCI+Ci0KLSAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4KLSAgICA8dGV4dC8+Ci0gIDwvYXR0cmlidXRlPgotCi08L2VsZW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy91c2VjYXNlZG9jdW1lbnQvc2FtcGxlcy91c2VjYXNlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9zYW1wbGVzL3VzZWNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTExMzk1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9zYW1wbGVzL3VzZWNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVzZWNhc2UgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL3VzZWNhc2UvMS4wIiBuYW1lPSJjb250YWN0Zm9ybS5zZW5kTWVzc2FnZSIvPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3NpdGVtYXAueG1hcCBiL3RydW5rL3NyYy9tb2R1bGVzL3VzZWNhc2Vkb2N1bWVudC9zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDk2ZDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHVzZWNhc2UueG1hcCA0MDc0NTIgMjAwNi0wNS0xOCAwNDoxNDoxNlogY2hlc3RudXQgJCAtLT4KLTwhLS0KLSAgICBUaGlzIHNpdGVtYXAgaGFuZGxlcyBjYWxscyB0byB1c2VjYXNlcyB3aGljaCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUKLSAgICB1c2VjYXNlIGZyYW1ld29yay4KLS0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gIDxtYXA6Y29tcG9uZW50cz4NCi0gICAgPG1hcDp0cmFuc2Zvcm1lcnMgZGVmYXVsdD0ieHNsdCI+ICAgIA0KLSAgICAgIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0iYnJvd3Nlci11cGRhdGUiIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uYWpheC5Ccm93c2VyVXBkYXRlVHJhbnNmb3JtZXIiLz4NCi0gICAgPC9tYXA6dHJhbnNmb3JtZXJzPg0KLSAgICA8bWFwOnNlbGVjdG9ycz4NCi0gICAgICA8bWFwOnNlbGVjdG9yIG5hbWU9ImFqYXgtcmVxdWVzdCIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5hamF4LkFqYXhSZXF1ZXN0U2VsZWN0b3IiLz4NCi0gICAgPC9tYXA6c2VsZWN0b3JzPgotICA8L21hcDpjb21wb25lbnRzPgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmxvd1NjcmlwdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDxtYXA6ZmxvdyBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgPG1hcDpzY3JpcHQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS91c2VjYXNlcy5qcyIvPgotICA8L21hcDpmbG93PgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGlwZWxpbmVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0ibm9uY2FjaGluZyI+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InJlZGlyZWN0Ij4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRleHQ6Ly9sZW55YS9jb250ZW50L2FkbWluL2NvbW1vbi9yZWRpcmVjdC54c3AiIHR5cGU9InNlcnZlcnBhZ2VzIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iY29udGV4dDovL2xlbnlhL3hzbHQvYWRtaW4vY29tbW9uL3JlZGlyZWN0LnhzbCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZS8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSAKLSAgICAgICAgVGhpcyBpbnRlcm5hbCBzaXRlbWFwIGZyYWdtZW50IHJlbmRlcnMgdGhlIHVzZWNhc2UsIG9uY2UgdGhlCi0gICAgICAgIGV4ZWN1dGVVc2VjYXNlKCkgZmxvd3NjcmlwdCBoYXMgY29tcGxldGVkIGFuZCBpc3N1ZWQgYSByZWRpcmVjdCwKLSAgICAgICAgd2hpY2ggaXMgbWF0Y2hlZCBoZXJlLgotICAgICAgICAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0idXNlY2FzZXMtdmlldy8qLyoqIiBpbnRlcm5hbC1vbmx5PSJ0cnVlIj4KLSAgICAgICAgCi0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0iangiIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS97Mn0iLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iYnJvd3Nlci11cGRhdGUiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iY2luY2x1ZGUiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iZm9ybXMiIC8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIAotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvY29vbjovL2xlbnlhLXNjcmVlbi54c2wiLz4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gU3RyaXAgeGh0bWwgbmFtZXNwYWNlIGZyb20gPGhlYWQ+IGFuZCA8Ym9keT4gZWxlbWVudCAtLT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvY2Zvcm1zL3N0cmlwLXhodG1sLW5hbWVzcGFjZS54c2wiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvY2Zvcm1zL2Zvcm1zLXNhbXBsZXMtc3R5bGluZy54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJlc291cmNlcy11cmkiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpjb250ZXh0LXByZWZpeH0vY2Zvcm1zIi8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvY2Zvcm1zL2FkZC14aHRtbC1uYW1lc3BhY2UueHNsIi8+Ci0gICAgICAgIAotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC94c2x0L3hodG1sMnhodG1sLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVuZGVydHlwZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOnJlbmRlcnR5cGV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibm9kZWlkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbmFtZX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIAotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLQotICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVxdWVzdC1wYXJhbWV0ZXIiIHBhdHRlcm49ImxlbnlhLmNvbnRpbnVhdGlvbiI+Ci0gICAgICAgIDxtYXA6Y2FsbCBjb250aW51YXRpb249InsxfSIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InVzZWNhc2UueG1sIj4KLSAgICAgICAgPG1hcDpjYWxsIGZ1bmN0aW9uPSJleGVjdXRlVXNlY2FzZSI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlY2FzZU5hbWUiIHZhbHVlPSJ7dXNlY2FzZS1kb2N1bWVudDp1c2VjYXNlfSIvPgotICAgICAgICA8L21hcDpjYWxsPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLQkKLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy91c2VjYXNlZG9jdW1lbnQvdXNlY2FzZXMvY3JlYXRlVXNlY2FzZURvY3VtZW50Lmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvdXNlY2FzZWRvY3VtZW50L3VzZWNhc2VzL2NyZWF0ZVVzZWNhc2VEb2N1bWVudC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkYTMxMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy91c2VjYXNlZG9jdW1lbnQvdXNlY2FzZXMvY3JlYXRlVXNlY2FzZURvY3VtZW50Lmp4CisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogY3JlYXRlLmp4IDM3NjYzMCAyMDA2LTAyLTEwIDEwOjU4OjIzWiB0aG9yc3RlbiAkIC0tPgotCi08cGFnZTpwYWdlIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIgCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiIAotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgPgotICAKLSAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5OZXcgVXNlY2FzZSBEb2N1bWVudDwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj4KLSAgICAgICAgPGkxOG46dGV4dD5OZXcgVXNlY2FzZSBEb2N1bWVudDwvaTE4bjp0ZXh0PgotICAgICAgPC9kaXY+Ci0gICAgICAKLSAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgIAotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICA8Zm9ybSBpZD0iZm9ybS1jcmVhdGUiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLmNvbnRpbnVhdGlvbiIgdmFsdWU9IiR7Y29udGludWF0aW9uLmlkfSIvPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxlbnlhLnVzZWNhc2UiIHZhbHVlPSIke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCdsZW55YS51c2VjYXNlJyl9Ii8+Ci0gICAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgICA8ang6aWYgdGVzdD0iJHshdXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50SWRQcm92aWRlZCcpfSI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD5QYXJlbnQgUGF0aDwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3BhcmVudFBhdGgnKX0iLz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJub2RlTmFtZSI+PGkxOG46dGV4dD5Ob2RlIE5hbWU8L2kxOG46dGV4dD4qOiA8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRJZFByb3ZpZGVkJyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRJZCcpfSIvPgotICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9Im5vZGVOYW1lIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbm9kZU5hbWUnKX0iLz4KLSAgICAgICAgICAgICAgICAgICAgPGJyLz4gKDxpMThuOnRleHQ+Tm8gd2hpdGVzcGFjZSwgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzPC9pMThuOnRleHQ+KQotICAgICAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InRpdGxlIj48aTE4bjp0ZXh0Pk5hdmlnYXRpb24gVGl0bGU8L2kxOG46dGV4dD4qOiA8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIgbmFtZT0iZHVibGluY29yZS50aXRsZSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2R1YmxpbmNvcmUudGl0bGUnKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idmlzaWJsZWlubmF2Ij48aTE4bjp0ZXh0PkRvY3VtZW50IHZpc2libGUgaW4gTmF2aWdhdGlvbjwvaTE4bjp0ZXh0Pio6IDwvbGFiZWw+PC90ZD4KLSAgICAgICAgICAgICAgPGp4OnNldCB2YXI9InZpc2libGUiIHZhbHVlPSJ5ZXMiLz4KLSAgICAgICAgICAgICAgPGp4OmlmIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3Zpc2libGVJbk5hdicpLmVxdWFscygnZmFsc2UnKX0iPgotICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJ2aXNpYmxlIiB2YWx1ZT0ibm8iLz4KLSAgICAgICAgICAgICAgPC9qeDppZj4gCi0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIG5hbWU9InZpc2libGVJbk5hdiI+Ci0gICAgICAgICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3Zpc2libGUuZXF1YWxzKCd5ZXMnKX0iPgotICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InRydWUiIHNlbGVjdGVkPSJzZWxlY3RlZCI+PGkxOG46dGV4dD55ZXM8L2kxOG46dGV4dD48L29wdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJmYWxzZSI+PGkxOG46dGV4dD5ubzwvaTE4bjp0ZXh0Pjwvb3B0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idHJ1ZSI+PGkxOG46dGV4dD55ZXM8L2kxOG46dGV4dD48L29wdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJmYWxzZSIgc2VsZWN0ZWQ9InNlbGVjdGVkIj48aTE4bjp0ZXh0Pm5vPC9pMThuOnRleHQ+PC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InVzZWNhc2UiPjxpMThuOnRleHQ+VXNlY2FzZTwvaTE4bjp0ZXh0Pio6IDwvbGFiZWw+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VjYXNlIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigndXNlY2FzZScpfSIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIkeyF1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRJZFByb3ZpZGVkJyl9Ij4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJyZWxhdGlvbiI+PGkxOG46dGV4dD5SZWxhdGlvbjwvaTE4bjp0ZXh0Pio6IDwvbGFiZWw+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICA8ang6Zm9yRWFjaCB2YXI9InJlbGF0aW9uIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncmVsYXRpb25zJyl9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke3JlbGF0aW9uLmVxdWFscyh1c2VjYXNlLmdldFBhcmFtZXRlcigncmVsYXRpb24nKSl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVsYXRpb24iIHZhbHVlPSIke3JlbGF0aW9ufSIgY2hlY2tlZD0iY2hlY2tlZCIvPjxpMThuOnRleHQ+JHtyZWxhdGlvbn08L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVsYXRpb24iIHZhbHVlPSIke3JlbGF0aW9ufSIvPjxpMThuOnRleHQ+JHtyZWxhdGlvbn08L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8L2p4OmZvckVhY2g+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICA8ang6c2V0IHZhcj0ibGFuZ3VhZ2VzIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbGFuZ3VhZ2VzJyl9Ii8+Ci0gICAgICAgICAgICA8ang6Y2hvb3NlPgotICAgICAgICAgICAgICA8ang6d2hlbiB0ZXN0PSIke2xhbmd1YWdlcy5zaXplKCkgJmd0OyAxfSI+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibGFuZ3VhZ2UiPjxpMThuOnRleHQ+TGFuZ3VhZ2U8L2kxOG46dGV4dD4qOiA8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgbmFtZT0ibGFuZ3VhZ2UiPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpmb3JFYWNoIHZhcj0ibGFuZ3VhZ2UiIGl0ZW1zPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdsYW5ndWFnZXMnKX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHtsYW5ndWFnZX0iPiR7bGFuZ3VhZ2V9PC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwvang6Zm9yRWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgPGp4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpzZXQgdmFyPSJsYW5ndWFnZSIgdmFsdWU9IiR7bGFuZ3VhZ2VzWzBdfSIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9IiR7bGFuZ3VhZ2V9Ii8+Ci0gICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDwvang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC9qeDpjaG9vc2U+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY3JlYXRvciI+PGkxOG46dGV4dD5DcmVhdG9yPC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJjcmVhdG9yIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignY3JlYXRvcicpfSIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzdWJqZWN0Ij48aTE4bjp0ZXh0PlN1YmplY3Q8L2kxOG46dGV4dD46PC9sYWJlbD48L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9InN1YmplY3QiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzdWJqZWN0Jyl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPgotICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InB1Ymxpc2hlciI+PGkxOG46dGV4dD5QdWJsaXNoZXI8L2kxOG46dGV4dD46PC9sYWJlbD48L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHR5cGU9InRleHQiIG5hbWU9InB1Ymxpc2hlciIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3B1Ymxpc2hlcicpfSIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PkRhdGU8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RhdGUnKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0icmlnaHRzIj48aTE4bjp0ZXh0PlJpZ2h0czwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIgbmFtZT0icmlnaHRzIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncmlnaHRzJyl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9Im15TWV0YSI+PGkxOG46dGV4dD5NeQotICAgICAgICAgICAgICAgIGN1c3RvbSBtZXRhZGF0YTwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Im15TWV0YSIgbmFtZT0ibWV0YS5jdXN0b20ubXlNZXRhIgotICAgICAgICAgICAgICAgICAgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdtZXRhLmN1c3RvbS5teU1ldGEnKX0iLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8ang6c2V0IHZhcj0icmVzb3VyY2VUeXBlcyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3Jlc291cmNlVHlwZXMnKX0iLz4KLSAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke3Jlc291cmNlVHlwZXMuc2l6ZSgpICAmZ3Q7IDB9Ij4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzYW1wbGUiPjxpMThuOnRleHQ+UmVzb3VyY2UgVHlwZTwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJkb2N0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJpdGVtIiBpdGVtcz0iJHtyZXNvdXJjZVR5cGVzfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqeDp3aGVuIHRlc3Q9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3R5cGUnKS5lcXVhbHMoaXRlbSl9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHtpdGVtfSIgc2VsZWN0ZWQ9InNlbGVjdGVkIj4ke2l0ZW19PC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2p4OndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIke2l0ZW19Ij4ke2l0ZW19PC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2p4Om90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L2p4OmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgICA8ang6c2V0IHZhcj0ic2FtcGxlcyIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3NhbXBsZXMnKX0iLz4KLSAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke3NhbXBsZXMuc2l6ZSgpICZndDsgMH0iPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InNhbXBsZSI+PGkxOG46dGV4dD5QYWdlIExheW91dDwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPGp4OmZvckVhY2ggdmFyPSJpdGVtIiBpdGVtcz0iJHtzYW1wbGVzfSI+Ci0gICAgICAgICAgICAgICAgICAgIDxqeDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPGp4OndoZW4gdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc2FtcGxlJykuZXF1YWxzKGl0ZW0pfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNhbXBsZSIgdmFsdWU9IiR7aXRlbX0iIGNoZWNrZWQ9ImNoZWNrZWQiLz4ke2l0ZW19PGJyIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgPC9qeDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgIDxqeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNhbXBsZSIgdmFsdWU9IiR7aXRlbX0iLz4ke2l0ZW19PGJyIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPC9qeDpmb3JFYWNoPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L2p4OmlmPiAgCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+KiA8aTE4bjp0ZXh0PnJlcXVpcmVkIGZpZWxkczwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkLz4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkNyZWF0ZSIvPgotICAgICAgICAgICAgICAgICYjMTYwOwotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImNhbmNlbCIgdmFsdWU9IkNhbmNlbCIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdlYmRhdi1kZWxldGUueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13ZWJkYXYtZGVsZXRlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzEwYzgwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdlYmRhdi1kZWxldGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnd2ViZGF2LmRlbGV0ZSddIj4KLQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0id2ViZGF2LmRlbGV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEudXNlY2FzZXMuZGVsZXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuRGVsZXRlIj4KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4KLQotICA8L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd2ViZGF2LWZpbGVQcm9wZmluZC54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdlYmRhdi1maWxlUHJvcGZpbmQueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjRlMzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd2ViZGF2LWZpbGVQcm9wZmluZC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd3ZWJkYXYuZmlsZVByb3BmaW5kJ10iPgotCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ3ZWJkYXYuZmlsZVByb3BmaW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPSJsZW55YS5wdWJsaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlcy53ZWJkYXYuRmlsZVByb3BmaW5kIj4KLSAgICAgIDx2aWV3IHVyaT0idXNlY2FzZXMvd2ViZGF2L2ZpbGVQcm9wZmluZCIvPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotCi0gIDwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13ZWJkYXYtbWtjb2wueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13ZWJkYXYtbWtjb2wueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YmEwMWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd2ViZGF2LW1rY29sLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIgotICAgIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnd2ViZGF2Lm1rY29sJ10iPgotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0id2ViZGF2Lm1rY29sIiBsb2dnZXI9ImxlbnlhLnB1YmxpY2F0aW9uIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2VzLndlYmRhdi5Na2NvbCI+Ci0gICAgICA8IS0tIFlvdSBjYW4gY29uZmlndXJlIHdoaWNoIHJlc291cmNlIHR5cGUgYW5kIGV4dGVuc2lvbiB0aGUgCi0gICAgICAgIGNyZWF0aW9uIG9mIGEgd2ViZGF2IGNvbGxlY3Rpb24gd2lsbCB0cmlnZ2VyIGluIGxlbnlhLiAtLT4KLSAgICAgIDxleHRlbnNpb24gcmVzb3VyY2UtdHlwZT0ieGh0bWwiPnhtbDwvZXh0ZW5zaW9uPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotICAgIAotICA8L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd2ViZGF2LXByb3BmaW5kLnhjb25mIGIvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMtd2ViZGF2LXByb3BmaW5kLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTA4OWRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdlYmRhdi1wcm9wZmluZC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi91c2VjYXNlcyIgdW5sZXNzPSIvY29jb29uL3VzZWNhc2VzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd3ZWJkYXYucHJvcGZpbmQnXSI+Ci0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9IndlYmRhdi5wcm9wZmluZCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZXMud2ViZGF2LlByb3BmaW5kIj4KLSAgICAgIDx2aWV3IHVyaT0idXNlY2FzZXMvd2ViZGF2L3Byb3BmaW5kIi8+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0KLSAgPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdlYmRhdi1wdXQueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy13ZWJkYXYtcHV0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFmY2FjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9jb25maWcvY29jb29uLXhjb25mL3VzZWNhc2VzLXdlYmRhdi1wdXQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdXNlY2FzZXMiIHVubGVzcz0iL2NvY29vbi91c2VjYXNlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnd2ViZGF2LnB1dCddIj4KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9IndlYmRhdi5wdXQiIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZXMud2ViZGF2LlB1dCI+Ci0gICAgICA8IS0tIFlvdSBjYW4gY29uZmlndXJlIHdoaWNoIHJlc291cmNlIHR5cGUgYW5kIGV4dGVuc2lvbiBhcmUgY29ubmVjdGVkLgotICAgICAgICBUaGUgaWRlYSBpcyBzaW1pbGFyIHRvIHRoZSBmaWxlIHN5c3RlbSBicm93c2VyIGRpYWxvZyB0aGF0IGFuIG9wZXJhdGlvbiBzeXN0ZW0KLSAgICAgICAgb2ZmZXJzIChvcGVuIHdpdGgpIHdoZXJlIHlvdSBjYW4gcmVnaXN0ZXIgYXBwbGljYXRpb25zIHRvIG9wZW4gY2VydGFpbiBmaWxlIGV4dGVuc2lvbnMtLT4KLSAgICAgIDxleHRlbnNpb25zPgotICAgICAgICA8ZXh0ZW5zaW9uIHJlc291cmNlLXR5cGU9InhodG1sIj54bWw8L2V4dGVuc2lvbj4KLSAgICAgICAgPGV4dGVuc2lvbiByZXNvdXJjZS10eXBlPSJvcGVuZG9jdW1lbnQiPm9kdDwvZXh0ZW5zaW9uPgotICAgICAgICA8ZXh0ZW5zaW9uIHJlc291cmNlLXR5cGU9InhodG1sIj5odG1sPC9leHRlbnNpb24+Ci0gICAgICAgIDxleHRlbnNpb24gcmVzb3VyY2UtdHlwZT0ieGh0bWwiPnhodG1sPC9leHRlbnNpb24+Ci0gICAgICAgIDwhLS1OZXh0IGV4dGVuc2lvbiBpcyBhIHdpbGRjYXJkIChhbGwgb3RoZXJzKS0tPgotICAgICAgICA8ZXh0ZW5zaW9uIHJlc291cmNlLXR5cGU9InhodG1sIj4qPC9leHRlbnNpb24+Ci0gICAgICA8L2V4dGVuc2lvbnM+Ci0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0gIDwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvY29uZmlnL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYmRiN2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2NvbmZpZy9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHB1YmxpY2F0aW9uLnhtbCAzNzQ2ODcgMjAwNi0wMi0wMyAxNToyNDo1NVogbWljaGkgJCAtLT4KLQotPG1vZHVsZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCI+Ci0gIDxpZD5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMud2ViZGF2PC9pZD4NCi0gIDxkZXBlbmRzIG1vZHVsZT0ib3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnVzZWNhc2UiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMuc2l0ZW1hbmFnZW1lbnQiLz4KLSAgPGRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMubGlua2luZyIvPgotICA8cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L3BhY2thZ2U+Ci0gIDx2ZXJzaW9uPjAuMS1kZXY8L3ZlcnNpb24+Ci0gIDxuYW1lPldlYkRBViBNb2R1bGU8L25hbWU+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGRlc2NyaXB0aW9uPlRoZSBXZWJEQVYgbW9kdWxlIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBXZWJEQVYgY2xpZW50cyB0byBlZGl0IHlvdXIgY29udGVudCBpbiBMZW55YTwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9yZWFkaW5nL1JlcXVlc3RSZWFkZXIuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9qYXZhL3NyYy9vcmcvYXBhY2hlL2NvY29vbi9yZWFkaW5nL1JlcXVlc3RSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNmU5Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvamF2YS9zcmMvb3JnL2FwYWNoZS9jb2Nvb24vcmVhZGluZy9SZXF1ZXN0UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvY29vbi5yZWFkaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuT2JqZWN0TW9kZWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuU291cmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uZW52aXJvbm1lbnQuaHR0cC5IdHRwRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogVGhlIDxjb2RlPlJlcXVlc3RSZWFkZXI8L2NvZGU+IGNvbXBvbmVudCBpcyB1c2VkIHRvIHNlcnZlIGJpbmFyeSBkYXRhCi0gKiBmcm9tIHRoZSBIdHRwIHJlcXVlc3QKLSAqLyAKLXB1YmxpYyBjbGFzcyBSZXF1ZXN0UmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWFkZXIgewotCi0gIHByb3RlY3RlZCBpbnQgYnVmZmVyU2l6ZSA9IDUxMjsKLQotICBwcm90ZWN0ZWQgUmVzcG9uc2UgcmVzcG9uc2U7Ci0KLSAgcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwUmVxdWVzdDsKLQotICAvKioKLSAgICogU2V0dXAgdGhlIHJlYWRlciBUaGUgcmVzb3VyY2UgaXMgb3BlbmVkIHRvIGdldCBhbgotICAgKiA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXR1cChTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgTWFwIG9iamVjdE1vZGVsLCBTdHJpbmcgc3JjLAotICAgICAgUGFyYW1ldGVycyBwYXIpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICBzdXBlci5zZXR1cChyZXNvbHZlciwgb2JqZWN0TW9kZWwsIHNyYywgcGFyKTsKLQotICAgIHRoaXMucmVzcG9uc2UgPSBPYmplY3RNb2RlbEhlbHBlci5nZXRSZXNwb25zZShvYmplY3RNb2RlbCk7Ci0KLSAgICB0aGlzLmh0dHBSZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgb2JqZWN0TW9kZWwKLSAgICAgICAgLmdldChIdHRwRW52aXJvbm1lbnQuSFRUUF9SRVFVRVNUX09CSkVDVCk7Ci0KLSAgICBpZiAoaHR0cFJlcXVlc3QgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgIlRoaXMgZmVhdHVyZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBhbiBodHRwIGVudmlyb25tZW50LiIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWN5Y2xhYmxlCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgewotICAgIHRoaXMuaHR0cFJlcXVlc3QgPSBudWxsOwotICAgIHN1cGVyLnJlY3ljbGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgIFByb2Nlc3NpbmdFeGNlcHRpb24gewotCi0gICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemVdOwotICAgIGludCBsZW5ndGggPSAtMTsKLQotICAgIGxvbmcgY29udGVudExlbmd0aCA9IGh0dHBSZXF1ZXN0LmdldENvbnRlbnRMZW5ndGgoKTsKLQotICAgIGlmIChjb250ZW50TGVuZ3RoICE9IC0xKSB7Ci0gICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgTG9uZy50b1N0cmluZyhjb250ZW50TGVuZ3RoKSk7Ci0gICAgfQotCi0gICAgd2hpbGUgKChsZW5ndGggPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpID4gLTEpIHsKLSAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7Ci0gICAgfQotICAgIG91dC5mbHVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0aGUgcmVxdWVzdGVkIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGh0dHBSZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHByb2Nlc3NTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBnZXRMb2dnZXIoKQotICAgICAgICAgIC5kZWJ1ZygKLSAgICAgICAgICAgICAgIlJlY2VpdmVkIGFuIElPRXhjZXB0aW9uLCBhc3N1bWluZyBjbGllbnQgc2V2ZXJlZCBjb25uZWN0aW9uIG9uIHB1cnBvc2UiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWltZS10eXBlIG9mIHRoZSByZXNvdXJjZSBpbiBwcm9jZXNzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICBDb250ZXh0IGN0eCA9IE9iamVjdE1vZGVsSGVscGVyLmdldENvbnRleHQob2JqZWN0TW9kZWwpOwotICAgIGlmIChjdHggIT0gbnVsbCkgewotICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gY3R4LmdldE1pbWVUeXBlKHNvdXJjZSk7Ci0gICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gbWltZVR5cGU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZXMvd2ViZGF2L0ZpbGVQcm9wZmluZC5qYXZhIGIvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2VzL3dlYmRhdi9GaWxlUHJvcGZpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkYzJjMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZXMvd2ViZGF2L0ZpbGVQcm9wZmluZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlcy53ZWJkYXY7Ci0KLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlVSTEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLnVzZWNhc2VzLlNpdGVVc2VjYXNlOwotCi0vKioKLSAqIFVzZWNhc2UgdG8gZGlzcGxheSB0aGUgb3ZlcnZpZXcgdGFiIGluIHRoZSBzaXRlIGFyZWEgZm9yIGEgZG9jdW1lbnQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVQcm9wZmluZCBleHRlbmRzIFNpdGVVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UID0gImRvY3VtZW50IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVFMgPSAiZG9jdW1lbnRzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VVUkwgPSAic291cmNlVVJMIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFRk9STUFUID0gImRhdGVGb3JtYXQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJDID0gInJjIjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIFZlY3RvciBkb2NzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBWZWN0b3IgY2hlY2tlZE91dCA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IGdldFNvdXJjZVVSTCgpOwotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGdldFRhcmdldERvY3VtZW50KGZhbHNlKTsKLSAgICAgICAgICAgIGRvY3MuYWRkKGRvYyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGRvYy5nZXRSZXBvc2l0b3J5Tm9kZSgpOwotICAgICAgICAgICAgaWYgKG5vZGUuaXNDaGVja2VkT3V0KCkpIHsKLSAgICAgICAgICAgICAgICBjaGVja2VkT3V0LmFkZChub2RlLmdldENoZWNrb3V0VXNlcklkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tlZE91dC5hZGQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihET0NVTUVOVFMsIGRvY3MpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFJDLCBjaGVja2VkT3V0KTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihTT1VSQ0VVUkwsIHJlcXVlc3QpOwotICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFLCBkIE1NTSB5eXl5IEhIOm1tOnNzIHp6eiIpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKERBVEVGT1JNQVQsIGZvcm1hdCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgYXJlYSB3aXRob3V0IHRoZSAiaW5mby0iIHByZWZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFyZWEoKSB7Ci0gICAgICAgIFVSTEluZm9ybWF0aW9uIGluZm8gPSBuZXcgVVJMSW5mb3JtYXRpb24oZ2V0U291cmNlVVJMKCkpOwotICAgICAgICByZXR1cm4gaW5mby5nZXRBcmVhKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgdG8gYmUgcmVkaXJlY3RlZCB0byBhZnRlciB0aGUgdXNlY2FzZSBoYXMgYmVlbiBjb21wbGV0ZWQuIElmIHRoZQotICAgICAqIHBhcmFtZXRlciA8Y29kZT5zdWNjZXNzPC9jb2RlPiBpcyBmYWxzZSwgdGhlIHNvdXJjZSBkb2N1bWVudCBpcyByZXR1cm5lZCAob3ZlcnJpZGUgdGhpcwotICAgICAqIG1ldGhvZCB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvdXIpLgotICAgICAqIEBwYXJhbSBzdWNjZXNzIElmIHRoZSB1c2VjYXNlIHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0VGFyZ2V0RG9jdW1lbnQoYm9vbGVhbiBzdWNjZXNzKSB7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KSBnZXRQYXJhbWV0ZXIoVEFSR0VUX0RPQ1VNRU5UKTsKLSAgICAgICAgaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFjY2VzcyB0byB0aGUgY3VycmVudCBwdWJsaWNhdGlvbi4gVXNlIHRoaXMgd2hlbiB0aGUgcHVibGljYXRpb24gaXMgbm90IHlldCBrbm93biBpbiB0aGUKLSAgICAgKiB1c2VjYXNlOiBlLmcuIHdoZW4gY3JlYXRpbmcgYSBnbG9iYWwgYXNzZXQuIFdoZW4gYWRkaW5nIGEgcmVzb3VyY2Ugb3IgYSBjaGlsZCB0byBhIGRvY3VtZW50LAotICAgICAqIGFjY2VzcyB0aGUgcHVibGljYXRpb24gdmlhIHRoYXQgZG9jdW1lbnQncyBpbnRlcmZhY2UgaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWNhdGlvbiBpbiB3aGljaCB0aGUgdXNlLWNhc2UgaXMgYmVpbmcgZXhlY3V0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24oKSB7Ci0gICAgICAgIGlmICh0aGlzLnB1YmxpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnRGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VVUkwoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQdWJsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucHVibGljYXRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZXMvd2ViZGF2L01rY29sLmphdmEgYi90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZXMvd2ViZGF2L01rY29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjcyZmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2VzL3dlYmRhdi9Na2NvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlcy53ZWJkYXY7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5kdWJsaW5jb3JlLkR1YmxpbkNvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5SZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DcmVhdGU7Ci0KLS8qKgotICogU3VwcG9ydHMgV2ViREFWIFBVVC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWtjb2wgZXh0ZW5kcyBDcmVhdGUgewotICAgIC8vIGRlZmF1bHQgaXMgeGh0bWwgYW5kIHhtbCBidXQgeW91IGNhbiBvdmVycmlkZSBpdCB3aXRoIHRoZSBjb25maWcKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIFRZUEUgPSAieGh0bWwiOwotICAgIHByb3RlY3RlZCBTdHJpbmcgRVhURU5TSU9OID0gInhtbCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEUgPSAicmVzb3VyY2UtdHlwZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9FWFRFTlNJT04gPSAiZXh0ZW5zaW9uIjsKLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBzdXBlci5jb25maWd1cmUoY29uZmlnKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbiB0eXBlQ29uZmlnID0gY29uZmlnLmdldENoaWxkKEVMRU1FTlRfRVhURU5TSU9OLCBmYWxzZSk7Ci0gICAgICAgIGlmICh0eXBlQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuRVhURU5TSU9OID0gdHlwZUNvbmZpZy5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgdGhpcy5UWVBFID0gdHlwZUNvbmZpZy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1RZUEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLkFic3RyYWN0VXNlY2FzZSNkb0V4ZWN1dGUoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBzdXBlci5kb0V4ZWN1dGUoKTsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZXIgPSAoU291cmNlUmVzb2x2ZXIpIHRoaXMubWFuYWdlci5sb29rdXAoU291cmNlUmVzb2x2ZXIuUk9MRSk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgICAgICAvLyBzYW5pdHkgY2hlY2sKLSAgICAgICAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIHVzYWdlLCBzb3VyY2UgZG9jdW1lbnQgbWF5IG5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgICAgIGlmICghZG9jLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb29rdXAoUmVzb3VyY2VUeXBlLlJPTEUgKyAiU2VsZWN0b3IiKTsKLQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLQotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZG9jLmdldFBhdGgoKTsKLQotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVR5cGUgPSAoUmVzb3VyY2VUeXBlKSBzZWxlY3Rvci5zZWxlY3QoVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZS5TYW1wbGUgc2FtcGxlID0gcmVzb3VyY2VUeXBlLmdldFNhbXBsZShyZXNvdXJjZVR5cGUuZ2V0U2FtcGxlTmFtZXMoKVswXSk7Ci0gICAgICAgICAgICAgICAgICAgIGRvYyA9IGRvY3VtZW50TWFuYWdlci5hZGQobWFwLCByZXNvdXJjZVR5cGUsIHNhbXBsZS5nZXRVcmkoKSwgZ2V0UHVibGljYXRpb24oKSwgZG9jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFyZWEoKSwgcGF0aCwgZG9jLmdldExhbmd1YWdlKCksIEVYVEVOU0lPTiwgZG9jLmdldE5hbWUoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRvYy5zZXRNaW1lVHlwZShzYW1wbGUuZ2V0TWltZVR5cGUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2V0TWV0YURhdGEoZG9jKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKGRvY3VtZW50TWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnJlbGVhc2UocmVzb3VyY2VUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZXRhIGRhdGEgb2YgdGhlIGNyZWF0ZWQgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRNZXRhRGF0YShEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtZXRlciBkb2N1bWVudCBtYXkgbm90IGJlIG51bGwiKTsKLQotICAgICAgICBNZXRhRGF0YSBkY01ldGFEYXRhID0gZG9jdW1lbnQuZ2V0TWV0YURhdGEoRHVibGluQ29yZS5EQ19OQU1FU1BBQ0UpOwotICAgICAgICBkY01ldGFEYXRhLnNldFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9USVRMRSwgZG9jdW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGNNZXRhRGF0YS5zZXRWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfQ1JFQVRPUiwgIiIpOwotICAgICAgICBkY01ldGFEYXRhLnNldFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9QVUJMSVNIRVIsICIiKTsKLSAgICAgICAgZGNNZXRhRGF0YS5zZXRWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfU1VCSkVDVCwgIiIpOwotICAgICAgICBkY01ldGFEYXRhLnNldFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9EQVRFLCAiIik7Ci0gICAgICAgIGRjTWV0YURhdGEuc2V0VmFsdWUoRHVibGluQ29yZS5FTEVNRU5UX1JJR0hUUywgIiIpOwotICAgICAgICBkY01ldGFEYXRhLnNldFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9MQU5HVUFHRSwgZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdEb2N1bWVudE5hbWUoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdEb2N1bWVudFBhdGgoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREb2N1bWVudFR5cGVOYW1lKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlRXh0ZW5zaW9uKCkgewotICAgICAgICByZXR1cm4gRVhURU5TSU9OOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlcy93ZWJkYXYvUHJvcGZpbmQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlcy93ZWJkYXYvUHJvcGZpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwMDEzNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvdXNlY2FzZXMvd2ViZGF2L1Byb3BmaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2VzLndlYmRhdjsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUHVibGljYXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUudXNlY2FzZXMuU2l0ZVVzZWNhc2U7Ci0KLS8qKgotICogVXNlY2FzZSB0byBwcm92aWRlIFdlYkRBViBwcm9wZmluZCBzdXBwb3J0IGZvciBhIGRvY3VtZW50LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZmluZCBleHRlbmRzIFNpdGVVc2VjYXNlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UID0gImRvY3VtZW50IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVFMgPSAiZG9jdW1lbnRzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VVUkwgPSAic291cmNlVVJMIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFRk9STUFUID0gImRhdGVGb3JtYXQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJDID0gInJjIjsKLQotICAgIC8qKgotICAgICAqIEN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFByb3BmaW5kKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjaW5pdFBhcmFtZXRlcnMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBzdXBlci5pbml0UGFyYW1ldGVycygpOwotCi0gICAgICAgIFB1YmxpY2F0aW9uIF9wdWJsaWNhdGlvbiA9IHRoaXMuZ2V0UHVibGljYXRpb24oKTsKLQotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2l0ZU1hbmFnZXJTZWxlY3RvciA9IG51bGw7Ci0gICAgICAgIFNpdGVNYW5hZ2VyIHNpdGVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgVmVjdG9yIGRvY3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFZlY3RvciBjaGVja2VkT3V0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gZ2V0U291cmNlVVJMKCk7Ci0gICAgICAgIGlmIChyZXF1ZXN0LmVuZHNXaXRoKCIuaHRtbCIpKQotICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3Quc3Vic3RyaW5nKDAsIHJlcXVlc3QuaW5kZXhPZigiLmh0bWwiKSk7Ci0gICAgICAgIGlmICghcmVxdWVzdC5lbmRzV2l0aCgiLyIpKQotICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3QgKyAiLyI7Ci0gICAgICAgIGlmIChyZXF1ZXN0LmluZGV4T2YoIndlYmRhdiIpID4gLTEpIHsKLSAgICAgICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LnJlcGxhY2VGaXJzdCgid2ViZGF2IiwgImF1dGhvcmluZyIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyU2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKFNpdGVNYW5hZ2VyLlJPTEUKLSAgICAgICAgICAgICAgICAgICAgKyAiU2VsZWN0b3IiKTsKLSAgICAgICAgICAgIHNpdGVNYW5hZ2VyID0gKFNpdGVNYW5hZ2VyKSBzaXRlTWFuYWdlclNlbGVjdG9yLnNlbGVjdChfcHVibGljYXRpb24uZ2V0U2l0ZU1hbmFnZXJIaW50KCkpOwotICAgICAgICAgICAgRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBzaXRlTWFuYWdlci5nZXREb2N1bWVudHMoZ2V0RG9jdW1lbnRGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgIF9wdWJsaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgUHVibGljYXRpb24uQVVUSE9SSU5HX0FSRUEpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0ID0gZG9jdW1lbnRzW2ldLmdldENhbm9uaWNhbFdlYmFwcFVSTCgpLnJlcGxhY2VGaXJzdCgiL1teL10qLmh0bWwiLCAiIik7Ci0gICAgICAgICAgICAgICAgaWYgKCF0ZXN0LmVuZHNXaXRoKCIvIikpCi0gICAgICAgICAgICAgICAgICAgIHRlc3QgPSB0ZXN0ICsgIi8iOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0LmVxdWFscyhyZXF1ZXN0KSkgewotICAgICAgICAgICAgICAgICAgICBkb2NzLmFkZChkb2N1bWVudHNbaV0pOwotCi0gICAgICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IGRvY3VtZW50c1tpXS5nZXRSZXBvc2l0b3J5Tm9kZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZE91dC5hZGQobm9kZS5nZXRDaGVja291dFVzZXJJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRPdXQuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoRE9DVU1FTlRTLCBkb2NzKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihSQywgY2hlY2tlZE91dCk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoU09VUkNFVVJMLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkVFRSwgZCBNTU0geXl5eSBISDptbTpzcyB6enoiKTsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlcihEQVRFRk9STUFULCBmb3JtYXQpOwotICAgICAgICAgICAgRGF0ZSByb290TW9kRGF0ZSA9IG5ldyBEYXRlKCk7Ci0gICAgICAgICAgICBzZXRQYXJhbWV0ZXIoInJvb3RNb2REYXRlIiwgcm9vdE1vZERhdGUpOwotICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRMYW5nID0gX3B1YmxpY2F0aW9uLmdldERlZmF1bHRMYW5ndWFnZSgpOwotICAgICAgICAgICAgc2V0UGFyYW1ldGVyKCJkZWZhdWx0TGFuZyIsIGRlZmF1bHRMYW5nKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2l0ZU1hbmFnZXJTZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpdGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2l0ZU1hbmFnZXJTZWxlY3Rvci5yZWxlYXNlKHNpdGVNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2l0ZU1hbmFnZXJTZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhcmVhIHdpdGhvdXQgdGhlICJpbmZvLSIgcHJlZml4LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJlYSgpIHsKLSAgICAgICAgcmV0dXJuIFB1YmxpY2F0aW9uLkFVVEhPUklOR19BUkVBOwotICAgIH0KLQotICAgIHByaXZhdGUgUHVibGljYXRpb24gcHVibGljYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBY2Nlc3MgdG8gdGhlIGN1cnJlbnQgcHVibGljYXRpb24uIFVzZSB0aGlzIHdoZW4gdGhlIHB1YmxpY2F0aW9uIGlzIG5vdCB5ZXQga25vd24gaW4gdGhlCi0gICAgICogdXNlY2FzZTogZS5nLiB3aGVuIGNyZWF0aW5nIGEgZ2xvYmFsIGFzc2V0LiBXaGVuIGFkZGluZyBhIHJlc291cmNlIG9yIGEgY2hpbGQgdG8gYSBkb2N1bWVudCwKLSAgICAgKiBhY2Nlc3MgdGhlIHB1YmxpY2F0aW9uIHZpYSB0aGF0IGRvY3VtZW50J3MgaW50ZXJmYWNlIGluc3RlYWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHVibGljYXRpb24gaW4gd2hpY2ggdGhlIHVzZS1jYXNlIGlzIGJlaW5nIGV4ZWN1dGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFB1YmxpY2F0aW9uIGdldFB1YmxpY2F0aW9uKCkgewotICAgICAgICBpZiAodGhpcy5wdWJsaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMucHVibGljYXRpb24gPSBQdWJsaWNhdGlvblV0aWwuZ2V0UHVibGljYXRpb25Gcm9tVXJsKHRoaXMubWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50RmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlVVJMKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUHVibGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnB1YmxpY2F0aW9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2VzL3dlYmRhdi9QdXQuamF2YSBiL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi9qYXZhL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy91c2VjYXNlcy93ZWJkYXYvUHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODhiODUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL3VzZWNhc2VzL3dlYmRhdi9QdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKiAKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2VzLndlYmRhdjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuU291cmNlVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5kdWJsaW5jb3JlLkR1YmxpbkNvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5zaXRlLk5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS5TaXRlU3RydWN0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnNpdGUuU2l0ZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5DcmVhdGVEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS54bWwuVXNlY2FzZUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Xb3JrZmxvd1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cudXNlY2FzZXMuVXNlY2FzZVdvcmtmbG93SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLkRvY3VtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEueG1sLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLnhtbC5WYWxpZGF0aW9uVXRpbDsKLQotLyoqCi0gKiBTdXBwb3J0cyBXZWJEQVYgUFVULgotICogQHZlcnNpb24gJElkOiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBQdXQgZXh0ZW5kcyBDcmVhdGVEb2N1bWVudCB7Ci0gICAgCi0gICAgLy8gcmVnaXN0ZXJlZEV4dGVuc2lvbnMgY29udGFpbiBhbGwga25vd24gZXh0ZW5zaW9uIG1hdGNoaW5nIHRvIGEgY2VydGFpbiByZXNvdXJjZS10eXBlLgotICAgIHByaXZhdGUgSGFzaE1hcCByZWdpc3RlcmVkRXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgLy8gZGVmYXVsdCBpcyB4aHRtbCBhbmQgeG1sIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGggdGhlIGNvbmZpZwotICAgIHByb3RlY3RlZCBTdHJpbmcgVFlQRSA9ICJ4aHRtbCI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBFWFRFTlNJT04gPSAiKiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEUgPSAicmVzb3VyY2UtdHlwZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9ST09UID0gImV4dGVuc2lvbnMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRVhURU5TSU9OID0gImV4dGVuc2lvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlQgPSAibGVueWEuZXZlbnQiOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBmYWxsYmFjayA9IGZhbHNlOwotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZShjb25maWcpOwotICAgICAgICBDb25maWd1cmF0aW9uIGV4dGVuc2lvbnNDb25maWcgPSBjb25maWcuZ2V0Q2hpbGQoRUxFTUVOVF9ST09ULCBmYWxzZSk7Ci0gICAgICAgIGlmIChleHRlbnNpb25zQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uc0NvbmZpZy5nZXRDaGlsZHJlbihFTEVNRU5UX0VYVEVOU0lPTik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGV4dGVuc2lvbiB0byByZWdpc3RlciAoa2V5OiBleHRlbnNpb24sdmFsdWU6IHJlc291cmNlLXR5cGUpCi0gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkRXh0ZW5zaW9ucy5wdXQoZXh0ZW5zaW9uLmdldFZhbHVlKCksIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1RZUEUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyZWRFeHRlbnNpb25zLnB1dCh0aGlzLkVYVEVOU0lPTiwgdGhpcy5UWVBFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tFeGVjdXRpb25Db25kaXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBldmVudCA9IGdldFBhcmFtZXRlckFzU3RyaW5nKEVWRU5UKTsKLSAgICAgICAgaWYgKGV2ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGdldFNvdXJjZURvY3VtZW50KCk7Ci0gICAgICAgICAgICBVc2VjYXNlV29ya2Zsb3dIZWxwZXIuY2hlY2tXb3JrZmxvdyh0aGlzLm1hbmFnZXIsIHRoaXMsIGV2ZW50LCBkb2MsCi0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5BYnN0cmFjdFVzZWNhc2UjZG9FeGVjdXRlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlciA9IChTb3VyY2VSZXNvbHZlcikgdGhpcy5tYW5hZ2VyLmxvb2t1cChTb3VyY2VSZXNvbHZlci5ST0xFKTsKLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBnZXRTb3VyY2VFeHRlbnNpb24oKTsKLSAgICAgICAgICAgIC8vIHNhbml0eSBjaGVjawotICAgICAgICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgdXNhZ2UsIHNvdXJjZSBkb2N1bWVudCBtYXkgbm90IGJlIG51bGwiKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBkb2MgZnJvbSBQVVQgaW5wdXQKLSAgICAgICAgICAgIGlmICghZG9jLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU2VydmljZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IChTZXJ2aWNlU2VsZWN0b3IpIHRoaXMubWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb29rdXAoUmVzb3VyY2VUeXBlLlJPTEUgKyAiU2VsZWN0b3IiKTsKLQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudE1hbmFnZXIgPSAoRG9jdW1lbnRNYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKERvY3VtZW50TWFuYWdlci5ST0xFKTsKLQotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudEZhY3RvcnkgbWFwID0gZ2V0RG9jdW1lbnRGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZG9jLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va3VwUmVzb3VyY2VUeXBlKGV4dGVuc2lvbikKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VUeXBlID0gbG9va1VwRXh0ZW5zaW9uKGV4dGVuc2lvbiwgc2VsZWN0b3IpOwotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUuU2FtcGxlIHNhbXBsZSA9IHJlc291cmNlVHlwZS5nZXRTYW1wbGUocmVzb3VyY2VUeXBlLmdldFNhbXBsZU5hbWVzKClbMF0pOwotICAgICAgICAgICAgICAgICAgICBkb2MgPSBkb2N1bWVudE1hbmFnZXIuYWRkKG1hcCwgcmVzb3VyY2VUeXBlLCBzYW1wbGUuZ2V0VXJpKCksIGdldFB1YmxpY2F0aW9uKCksIGRvYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBcmVhKCksIHBhdGgsIGRvYy5nZXRMYW5ndWFnZSgpLCBleHRlbnNpb24sIGRvYy5nZXROYW1lKCksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBkb2Muc2V0TWltZVR5cGUoc2FtcGxlLmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRNZXRhRGF0YShkb2MpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UoZG9jdW1lbnRNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucmVsZWFzZShyZXNvdXJjZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2Uoc2VsZWN0b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc291cmNlVXJpID0gImNvY29vbjovcmVxdWVzdC9QVVQvIiArIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IHhtbERvYyA9IFNvdXJjZVV0aWwucmVhZERPTShzb3VyY2VVcmksIG1hbmFnZXIpOwotCi0gICAgICAgICAgICAvLyB2YWxpZGF0ZSBpZiBhIHNjaGVtYSBpcyBwcm92aWRlZCBhbmQgd2UgYXJlIG5vdCB1c2luZyBhbnkgZmFsbGJhY2sKLSAgICAgICAgICAgIGlmIChkb2MuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0U2NoZW1hKCkgIT0gbnVsbCAmIGZhbGxiYWNrID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVEb2MocmVzb2x2ZXIsIHhtbERvYywgZG9jKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFoYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50SGVscGVyLndyaXRlRG9jdW1lbnQoeG1sRG9jLCBkb2MuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEVycm9yTWVzc2FnZSgiaW52YWxpZCBzb3VyY2UgeG1sLiBGdWxsIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGV2ZW50ID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoRVZFTlQpOwotICAgICAgICAgICAgaWYgKGV2ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBXb3JrZmxvd1V0aWwuaW52b2tlKHRoaXMubWFuYWdlciwgZ2V0U2Vzc2lvbigpLCBnZXRMb2dnZXIoKSwgZG9jLCBldmVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZVR5cGUgbG9va1VwRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24sIFNlcnZpY2VTZWxlY3RvciBzZWxlY3RvcikKLSAgICAgICAgICAgIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZTsKLSAgICAgICAgU3RyaW5nIHJlc291cmNlVHlwZU5hbWUgPSAoU3RyaW5nKSByZWdpc3RlcmVkRXh0ZW5zaW9ucy5nZXQoZXh0ZW5zaW9uKTsKLSAgICAgICAgaWYgKHJlc291cmNlVHlwZU5hbWUgPT0gbnVsbCB8fCByZXNvdXJjZVR5cGVOYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU5hbWUgPSAoU3RyaW5nKSByZWdpc3RlcmVkRXh0ZW5zaW9ucy5nZXQodGhpcy5FWFRFTlNJT04pOwotICAgICAgICAgICAgdGhpcy5mYWxsYmFjayA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdG9yLmlzU2VsZWN0YWJsZShyZXNvdXJjZVR5cGVOYW1lKSkgewotICAgICAgICAgICAgcmVzb3VyY2VUeXBlID0gKFJlc291cmNlVHlwZSkgc2VsZWN0b3Iuc2VsZWN0KHJlc291cmNlVHlwZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdXNpbmcgYSBmYWxsYmFjayByZXNvdXJjZSB0eXBlCi0gICAgICAgICAgICAvLyBGSVhNRSB0aGlzIHJlc291cmNlIHR5ZSBzaG91bGQgYmUgYSBtb3JlIGdlbmVyaWMgb25lIGxpa2UgIm1lZGlhLWFzc2V0cyIgb3IgImJpbiIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZSA9IChSZXNvdXJjZVR5cGUpIHNlbGVjdG9yLnNlbGVjdCh0aGlzLlRZUEUpOwotICAgICAgICAgICAgdGhpcy5mYWxsYmFjayA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc291cmNlVHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVEb2MoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIG9yZy53M2MuZG9tLkRvY3VtZW50IHhtbERvYywgRG9jdW1lbnQgZG9jKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBkb2MuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0gICAgICAgIFNjaGVtYSBzY2hlbWEgPSByZXNvdXJjZVR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIFZhbGlkYXRpb25VdGlsLnZhbGlkYXRlKHRoaXMubWFuYWdlciwgeG1sRG9jLCBzY2hlbWEsIG5ldyBVc2VjYXNlRXJyb3JIYW5kbGVyKHRoaXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubGVueWEuY21zLnVzZWNhc2UuQWJzdHJhY3RVc2VjYXNlI2dldE5vZGVzVG9Mb2NrKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZVtdIGdldE5vZGVzVG9Mb2NrKCkgdGhyb3dzIFVzZWNhc2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIExpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIE5vZGVTZXQgc2V0ID0gU2l0ZVV0aWwuZ2V0U3ViU2l0ZSh0aGlzLm1hbmFnZXIsIGRvYy5nZXRMaW5rKCkuZ2V0Tm9kZSgpKTsKLSAgICAgICAgICAgIERvY3VtZW50W10gZG9jdW1lbnRzID0gc2V0LmdldERvY3VtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBub2Rlcy5hZGQoZG9jdW1lbnRzW2ldLmdldFJlcG9zaXRvcnlOb2RlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTaXRlU3RydWN0dXJlIHN0cnVjdHVyZSA9IGdldFNvdXJjZURvY3VtZW50KCkuYXJlYSgpLmdldFNpdGUoKTsKLSAgICAgICAgICAgIG5vZGVzLmFkZChzdHJ1Y3R1cmUuZ2V0UmVwb3NpdG9yeU5vZGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gKE5vZGVbXSkgbm9kZXMudG9BcnJheShuZXcgTm9kZVtub2Rlcy5zaXplKCldKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVzZWNhc2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZXRhIGRhdGEgb2YgdGhlIGNyZWF0ZWQgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRNZXRhRGF0YShEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIE1ldGFEYXRhRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtZXRlciBkb2N1bWVudCBtYXkgbm90IGJlIG51bGwiKTsKLQotICAgICAgICBNZXRhRGF0YSBkY01ldGFEYXRhID0gZG9jdW1lbnQuZ2V0TWV0YURhdGEoRHVibGluQ29yZS5EQ19OQU1FU1BBQ0UpOwotICAgICAgICBkY01ldGFEYXRhLnNldFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9USVRMRSwgZG9jdW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGNNZXRhRGF0YS5zZXRWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfQ1JFQVRPUiwgIiIpOwotICAgICAgICBkY01ldGFEYXRhLnNldFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9QVUJMSVNIRVIsICIiKTsKLSAgICAgICAgZGNNZXRhRGF0YS5zZXRWYWx1ZShEdWJsaW5Db3JlLkVMRU1FTlRfU1VCSkVDVCwgIiIpOwotICAgICAgICBkY01ldGFEYXRhLnNldFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9EQVRFLCAiIik7Ci0gICAgICAgIGRjTWV0YURhdGEuc2V0VmFsdWUoRHVibGluQ29yZS5FTEVNRU5UX1JJR0hUUywgIiIpOwotICAgICAgICBkY01ldGFEYXRhLnNldFZhbHVlKER1YmxpbkNvcmUuRUxFTUVOVF9MQU5HVUFHRSwgZG9jdW1lbnQuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQdWJsaWNhdGlvbiBwdWJsaWNhdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFjY2VzcyB0byB0aGUgY3VycmVudCBwdWJsaWNhdGlvbi4gVXNlIHRoaXMgd2hlbiB0aGUgcHVibGljYXRpb24gaXMgbm90IHlldCBrbm93biBpbiB0aGUKLSAgICAgKiB1c2VjYXNlOiBlLmcuIHdoZW4gY3JlYXRpbmcgYSBnbG9iYWwgYXNzZXQuIFdoZW4gYWRkaW5nIGEgcmVzb3VyY2Ugb3IgYSBjaGlsZCB0byBhIGRvY3VtZW50LAotICAgICAqIGFjY2VzcyB0aGUgcHVibGljYXRpb24gdmlhIHRoYXQgZG9jdW1lbnQncyBpbnRlcmZhY2UgaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWNhdGlvbiBpbiB3aGljaCB0aGUgdXNlLWNhc2UgaXMgYmVpbmcgZXhlY3V0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHVibGljYXRpb24gZ2V0UHVibGljYXRpb24oKSB7Ci0gICAgICAgIGlmICh0aGlzLnB1YmxpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wdWJsaWNhdGlvbiA9IFB1YmxpY2F0aW9uVXRpbC5nZXRQdWJsaWNhdGlvbkZyb21VcmwodGhpcy5tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnRGYWN0b3J5KCksIGdldFNvdXJjZVVSTCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFB1YmxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5wdWJsaWNhdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUV4dGVuc2lvbigpIHsKLSAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uVXJpID0gZ2V0UGFyYW1ldGVyQXNTdHJpbmcoU09VUkNFX1VSTCk7Ci0gICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBudWxsOwotICAgICAgICBpZiAoZGVzdGluYXRpb25VcmkuaW5kZXhPZigiLiIpID4gMCkgewotICAgICAgICAgICAgZXh0ZW5zaW9uID0gZGVzdGluYXRpb25Vcmkuc3Vic3RyaW5nKGRlc3RpbmF0aW9uVXJpLmxhc3RJbmRleE9mKCIuIikgKyAxLAotICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblVyaS5sZW5ndGgoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleHRlbnNpb24gPSBFWFRFTlNJT047Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld0RvY3VtZW50TmFtZSgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld0RvY3VtZW50UGF0aCgpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0U291cmNlRG9jdW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIGRvYy5nZXRVVUlEKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VmlzaWJsZUluTmF2KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERvY3VtZW50VHlwZU5hbWUoKSB7Ci0gICAgICAgIFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBudWxsOwotICAgICAgICBTZXJ2aWNlU2VsZWN0b3Igc2VsZWN0b3IgPSBudWxsOwotICAgICAgICBTdHJpbmcgZG9jVHlwZSA9ICIiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSAoU2VydmljZVNlbGVjdG9yKSB0aGlzLm1hbmFnZXIubG9va3VwKFJlc291cmNlVHlwZS5ST0xFICsgIlNlbGVjdG9yIik7Ci0gICAgICAgICAgICByZXNvdXJjZVR5cGUgPSBsb29rVXBFeHRlbnNpb24oZ2V0U291cmNlRXh0ZW5zaW9uKCksIHNlbGVjdG9yKTsKLSAgICAgICAgICAgIGRvY1R5cGUgPSByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpOwotICAgICAgICB9IGNhdGNoIChTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvY1R5cGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3NpdGVtYXAueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2NzA3ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8bWFwOmNvbXBvbmVudHM+Ci0gICAgPG1hcDptYXRjaGVycyBkZWZhdWx0PSJ3aWxkY2FyZCI+Ci0gICAgICA8bWFwOm1hdGNoZXIgbmFtZT0iZGVzdGluYXRpb24iIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24ubWF0Y2hpbmcuV2lsZGNhcmRIZWFkZXJNYXRjaGVyIj4KLSAgICAgICAgPGhlYWRlci1uYW1lPkRlc3RpbmF0aW9uPC9oZWFkZXItbmFtZT4KLSAgICAgIDwvbWFwOm1hdGNoZXI+Ci0gICAgPC9tYXA6bWF0Y2hlcnM+Ci0KLSAgICA8bWFwOnJlYWRlcnMgZGVmYXVsdD0icmVzb3VyY2UiPgotICAgICAgIDxtYXA6cmVhZGVyIGxvZ2dlcj0ic2l0ZW1hcC5yZWFkZXIucmVxdWVzdHJlYWRlciIgbmFtZT0icmVxdWVzdCIgcG9vbC1tYXg9IjE2IiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnJlYWRpbmcuUmVxdWVzdFJlYWRlciIvPgotICAgIDwvbWFwOnJlYWRlcnM+Ci0gIAotICAgIDxtYXA6c2VyaWFsaXplcnMgZGVmYXVsdD0ieGh0bWwiPiAKLSAgICAgIDxtYXA6c2VyaWFsaXplciBuYW1lPSJ4bWwtZ2V0IiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uWE1MU2VyaWFsaXplciIgbWltZS10eXBlPSJ0ZXh0L3htbCI+Ci0gICAgICAgIDxlbmNvZGluZz51dGYtODwvZW5jb2Rpbmc+Ci0gICAgICAgIDxvbWl0LXhtbC1kZWNsYXJhdGlvbj55ZXM8L29taXQteG1sLWRlY2xhcmF0aW9uPgotICAgICAgPC9tYXA6c2VyaWFsaXplcj4KLSAgICA8L21hcDpzZXJpYWxpemVycz4KLSAKLSAgPC9tYXA6Y29tcG9uZW50cz4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSBGbG93c2NyaXB0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8bWFwOmZsb3cgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIDxtYXA6c2NyaXB0IHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3dlYmRhdi93ZWJkYXYuanMiLz4KLSAgPC9tYXA6Zmxvdz4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmlld3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8bWFwOnZpZXdzPiAgICAKLSAgICA8bWFwOnZpZXcgbmFtZT0iY29udGVudCIgZnJvbS1sYWJlbD0iY29udGVudCI+Ci0gICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiIC8+Ci0gICAgPC9tYXA6dmlldz4KLSAgPC9tYXA6dmlld3M+Ci0KLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgCi0gICAgPG1hcDpwaXBlbGluZSB0eXBlPSJub25jYWNoaW5nIj4KLQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJsaW1pdFJlc3BvbnNlLnhzbCI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0iZmlsZSIgc3JjPSJjb2Nvb246L3JlcXVlc3QvZ2VuZXJhdGUiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvd2ViZGF2L3hzbHQvbGltaXRSZXNwb25zZS54c2wiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIiBzdGF0dXMtY29kZT0iMjAwIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSAKLSAgICAgICAgVGhpcyBpbnRlcm5hbCBzaXRlbWFwIGZyYWdtZW50IHJlbmRlcnMgdGhlIHVzZWNhc2UsIG9uY2UgdGhlCi0gICAgICAgIGV4ZWN1dGVVc2VjYXNlKCkgZmxvd3NjcmlwdCBoYXMgY29tcGxldGVkIGFuZCBpc3N1ZWQgYSByZWRpcmVjdCwKLSAgICAgICAgd2hpY2ggaXMgbWF0Y2hlZCBoZXJlLgotICAgICAgICAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0idmlldy8qLyoqIiBpbnRlcm5hbC1vbmx5PSJ0cnVlIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJqeCIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvd2ViZGF2L3syfS5qeCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0ieHNsdCIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvd2ViZGF2L3hzbHQvTlNjbGVhbi54c2wiLz4KLSAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icmVxdWVzdC1tZXRob2QiPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJQUk9QRklORCI+Ci0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvY29vbjovbGltaXRSZXNwb25zZS54c2wiIC8+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiIHN0YXR1cy1jb2RlPSIyMDciLz4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICAgIDxtYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIiBzdGF0dXMtY29kZT0iMjAwIi8+Ci0gICAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPgotICAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09IFByaXZhdGUgUmVzb3VyY2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0ibm9uY2FjaGluZyIgaW50ZXJuYWwtb25seT0idHJ1ZSI+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0icmVxdWVzdC9nZW5lcmF0ZSI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic3RyZWFtIiAvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpbmNvbWluZy1wcm94eSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJ1cmwydXVpZCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiIC8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSsgCi0gICAgICAgICAgfCBJZiB5b3UgbmVlZCB0byBjaGVjayBvciBjaGFuZ2UgdGhlIFhNTCB0aGF0IGlzIGJlaW5nIFBVVAotICAgICAgICAgIHwgeW91IGNhbiBkbyB0aGF0IGhlcmUuIFRoaXMgaXMgdGhlIHBpcGVsaW5lIHRoYXQgd2lsbAotICAgICAgICAgIHwgZ2VuZXJhdGUgdGhlIGlucHV0IGZvciB0aGUgUFVUIG1ldGhvZC4KLSAgICAgICAgICArIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJyZXF1ZXN0L1BVVC8qIj4gICAgCi0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic3RyZWFtIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkZWZhdWx0Q29udGVudFR5cGUiIHZhbHVlPSJ0ZXh0L3htbCIgLz4KLSAgICAgICAgPC9tYXA6Z2VuZXJhdGU+Ci0gICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdHlwZX0veHNsdC9jbGVhbi17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC10eXBlfS54c2wiPgotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3twYWdlLWVudmVsb3BlOmRvY3VtZW50LXR5cGV9L3hzbHQvY2xlYW4te3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdHlwZX0ueHNsIi8+ICAgICAgICAKLSAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsIi8+Ci0gICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaW5jb21pbmctcHJveHkiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0idXJsMnV1aWQiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09IFB1YmxpYyBSZXNvdXJjZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0iY2FjaGluZyI+Ci0gICAgCi0gICAgICA8IS0tIERpc2FibGUgY2FjaGluZyBmb3Igd2ViZGF2L2F1dGhvcmluZyBhcmVhIC0tPgotICAgICAgPG1hcDphY3QgdHlwZT0ic2V0LWhlYWRlciI+Ci0gICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IkNhY2hlLUNvbnRyb2wiIHZhbHVlPSJuby1jYWNoZSIgLz4KLSAgICAgIDwvbWFwOmFjdD4gICAgCi0gCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IndlYmRhdiI+Ci0gICAgICAgIDxtYXA6Y2FsbCBmdW5jdGlvbj0ic2VsZWN0TWV0aG9kIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYWdlIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFVSSSIgdmFsdWU9IntyZXF1ZXN0OnJlcXVlc3RVUkl9IiAvPgotICAgICAgICA8L21hcDpjYWxsPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IndlYmRhdi8qKiI+Ci0gICAgICAgIDxtYXA6Y2FsbCBmdW5jdGlvbj0ic2VsZWN0TWV0aG9kIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYWdlIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFVSSSIgdmFsdWU9IntyZXF1ZXN0OnJlcXVlc3RVUkl9IiAvPgotICAgICAgICA8L21hcDpjYWxsPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImF1dGhvcmluZy8qKiI+Ci0gICAgICAgIDxtYXA6Y2FsbCBmdW5jdGlvbj0ic2VsZWN0TWV0aG9kIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYWdlIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFVSSSIgdmFsdWU9IntyZXF1ZXN0OnJlcXVlc3RVUkl9IiAvPgotICAgICAgICA8L21hcDpjYWxsPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovYXV0aG9yaW5nLyoqIj4KLSAgICAgICAgPG1hcDpjYWxsIGZ1bmN0aW9uPSJzZWxlY3RNZXRob2QiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InBhZ2UiIHZhbHVlPSJ7MX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VVJJIiB2YWx1ZT0ie3JlcXVlc3Q6cmVxdWVzdFVSSX0iIC8+Ci0gICAgICAgIDwvbWFwOmNhbGw+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfSI+Ci0gICAgICAgIDxtYXA6Y2FsbCBmdW5jdGlvbj0ic2VsZWN0TWV0aG9kIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYWdlIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFVSSSIgdmFsdWU9IntyZXF1ZXN0OnJlcXVlc3RVUkl9IiAvPgotICAgICAgICA8L21hcDpjYWxsPgotICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJ7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0vIj4KLSAgICAgICAgPG1hcDpjYWxsIGZ1bmN0aW9uPSJzZWxlY3RNZXRob2QiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InBhZ2UiIHZhbHVlPSIiLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VVJJIiB2YWx1ZT0ie3JlcXVlc3Q6cmVxdWVzdFVSSX0iIC8+Ci0gICAgICAgIDwvbWFwOmNhbGw+Ci0gICAgICA8L21hcDptYXRjaD4gICAgICAgIAotICAgICAgCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IkdFVC8qKiI+Ci0gICAgICAgIDxtYXA6Y2FsbCBmdW5jdGlvbj0iZ2V0Ij4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJmb3J3YXJkIiB2YWx1ZT0ie3Jlc291cmNlLXR5cGU6Zm9ybWF0LXdlYmRhdkdFVH0iLz4KLSAgICAgICAgPC9tYXA6Y2FsbD4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IlBST1BGSU5ELyoqLioiPgotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IlBST1BGSU5ELyoqXyouaHRtbCI+Ci0gICAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIiBzcmM9ImNvbnRleHQ6Ly9sZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L2F1dGhvcmluZy97MX0vaW5kZXhfe3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9LnhtbCI+Ci0gICAgICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249ImZpbGVQcm9wZmluZCIgPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYXN0LW1vZGlmaWVkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFzdG1vZGlmaWVkfSIvPgotICAgICAgICAgICAgPC9tYXA6Y2FsbD4KLSAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IlBST1BGSU5ELyoqXyouKiI+Ci0gICAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIiBzcmM9ImNvbnRleHQ6Ly9sZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L2F1dGhvcmluZy97MX0vaW5kZXhfe3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9LnszfSI+Ci0gICAgICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249ImZpbGVQcm9wZmluZCIgPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYXN0LW1vZGlmaWVkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFzdG1vZGlmaWVkfSIvPgotICAgICAgICAgICAgPC9tYXA6Y2FsbD4KLSAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8IS0tIGRvZXMgbm90IGV4aXN0IC0tPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29udGV4dDovL2xlbnlhL2NvbnRlbnQvdXRpbC9lbXB0eS54bWwiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgc3RhdHVzLWNvZGU9IjQwNCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IlBST1BGSU5ELyoqIj4gICAgICAgIAotICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249InByb3BmaW5kIiAvPiAKLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Ik9QVElPTlMvKioiPgotICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249Im9wdGlvbnMiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVyaSIgdmFsdWU9IntyZXF1ZXN0OnJlcXVlc3RVUkl9IiAvPgotICAgICAgICA8L21hcDpjYWxsPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iSEVBRC8qKi4qIj4KLSAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJIRUFELyoqXyouaHRtbCI+Ci0gICAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIiBzcmM9ImNvbnRleHQ6Ly9sZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L2F1dGhvcmluZy97MX0vaW5kZXhfe3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9LnhtbCI+Ci0gICAgICAgICAgICA8bWFwOmFjdCB0eXBlPSJzZXQtaGVhZGVyIj4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iTGFzdC1Nb2RpZmllZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhc3Rtb2RpZmllZH0iIC8+Ci0gICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSBzdGF0dXMtY29kZT0iMjAwIi8+Ci0gICAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICA8L21hcDptYXRjaD4gICAgICAKLSAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJIRUFELyoqXyouKiI+Ci0gICAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIiBzcmM9ImNvbnRleHQ6Ly9sZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L2F1dGhvcmluZy97MX0vaW5kZXhfe3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9LnszfSI+Ci0gICAgICAgICAgICA8bWFwOmFjdCB0eXBlPSJzZXQtaGVhZGVyIj4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iTGFzdC1Nb2RpZmllZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhc3Rtb2RpZmllZH0iIC8+Ci0gICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSBzdGF0dXMtY29kZT0iMjAwIi8+Ci0gICAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgPCEtLSBkb2Vzbid0IGV4aXN0IC0tPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29udGV4dDovL2xlbnlhL2NvbnRlbnQvdXRpbC9lbXB0eS54bWwiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgc3RhdHVzLWNvZGU9IjQwNCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iSEVBRC8qKiI+Ci0gICAgICAgIDxtYXA6Y2FsbCBmdW5jdGlvbj0icHJvcGZpbmQiIC8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0ibm9uY2FjaGluZyI+Ci0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iY2hlY2tpbiI+Ci0gICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc2VydmVkLWNoZWNraW4iPgotICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIgc3RhdHVzLWNvZGU9IjQyMyIvPgotICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiIHN0YXR1cy1jb2RlPSIyMDEiIC8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJQVVQvKioiPgotICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249InB1dCIgLz4gIAotICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgCi0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iTUtDT0wvKioiPgotICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249Im1rY29sIiAvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iREVMRVRFLyoqIj4KLSAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJERUxFVEUvKipfKi5odG1sIj4KLSAgICAgICAgICA8bWFwOmFjdCB0eXBlPSJyZXNvdXJjZS1leGlzdHMiIHNyYz0iY29udGV4dDovL2xlbnlhL3B1YnMve3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L2NvbnRlbnQvYXV0aG9yaW5nL3sxfS9pbmRleF97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX0ueG1sIj4KLSAgICAgICAgICAgIDxtYXA6Y2FsbCBmdW5jdGlvbj0icmVtb3ZlIiAvPgotICAgICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iREVMRVRFLyoqXyouKiI+Ci0gICAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIiBzcmM9ImNvbnRleHQ6Ly9sZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L2F1dGhvcmluZy97MX0vaW5kZXhfe3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9LnszfSI+Ci0gICAgICAgICAgICA8bWFwOmNhbGwgZnVuY3Rpb249InJlbW92ZSIgLz4KLSAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IkRFTEVURS8qKiI+Ci0gICAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIiBzcmM9ImNvbnRleHQ6Ly9sZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L2F1dGhvcmluZy97MX0iPgotICAgICAgICAgICAgPG1hcDpjYWxsIGZ1bmN0aW9uPSJyZW1vdmUiIC8+Ci0gICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgPCEtLSBkb2VzIG5vdCBleGlzdCAtLT4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRleHQ6Ly9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHN0YXR1cy1jb2RlPSIyMDAiLz4KLSAgICAgIDwvbWFwOm1hdGNoPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJMT0NLLyoqIj4KLSAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwcmVmaXgiIHZhbHVlPSJsZW55YTovLyIvPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJsZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L2F1dGhvcmluZy97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofSI+Ci0gICAgICAgICAgICA8bWFwOmFjdCB0eXBlPSJyZXNlcnZlZC1jaGVja291dCI+Ci0gICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiICBzdGF0dXMtY29kZT0iNDIzIi8+Ci0gICAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9ImZpbGUiIHNyYz0iY29jb29uOi9yZXF1ZXN0L2dlbmVyYXRlIi8+Ci0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJ4c2x0IiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy93ZWJkYXYveHNsdC9sb2NrLnhzbCI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVzZXJpZCIgdmFsdWU9InthY2Nlc3MtY29udHJvbDp1c2VyLWlkfSIvPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2NpZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9Ii8+Ci0gICAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiIHN0YXR1cy1jb2RlPSIyMDAiIC8+Ci0gICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIiBzdGF0dXMtY29kZT0iNDEyIi8+Ci0gICAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPgotICAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJVTkxPQ0svKioiPgotICAgICAgICA8bWFwOmFjdCB0eXBlPSJyZXNlcnZlZC1jaGVja2luIj4KLSAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29udGV4dDovL2xlbnlhL2NvbnRlbnQvdXRpbC9lbXB0eS54bWwiLz4KLSAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiICBzdGF0dXMtY29kZT0iNDI0Ii8+Ci0gICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRleHQ6Ly9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIgc3RhdHVzLWNvZGU9IjIwNCIgLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0KLSAgPC9tYXA6cGlwZWxpbmVzPgotCi08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3VzZWNhc2VzL3dlYmRhdi9maWxlUHJvcGZpbmQuanggYi90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvdXNlY2FzZXMvd2ViZGF2L2ZpbGVQcm9wZmluZC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0NWE5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvdXNlY2FzZXMvd2ViZGF2L2ZpbGVQcm9wZmluZC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPEQ6bXVsdGlzdGF0dXMgeG1sbnM6RD0iREFWOiIgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIgotICB4bWxuczpjb2xsZWN0aW9uPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vY29sbGVjdGlvbi8xLjAiPgotICA8ang6c2V0IHZhcj0ic291cmNlVVJMIiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc291cmNlVVJMJyl9Ii8+Ci0gIDxqeDpzZXQgdmFyPSJkYXRlRm9ybWF0IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZGF0ZUZvcm1hdCcpfSIvPgotICA8ang6c2V0IHZhcj0iY2hlY2tlZE91dCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3JjJyl9Ii8+Ci0gIDxqeDpmb3JFYWNoIHZhcj0iZG9jIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRzJyl9IgotICAgIHZhclN0YXR1cz0ic3RhdHVzIj4KLSAgICA8ang6aWYgdGVzdD0iJHtkb2MuZ2V0SWQoKX0iPgotICAgIDxqeDpzZXQgdmFyPSJmaWxlRXh0ZW5zaW9uIiB2YWx1ZT0iJHtkb2MuZ2V0U291cmNlRXh0ZW5zaW9uKCl9Ii8+Ci0gICAgPGp4OmlmIHRlc3Q9IiR7ZG9jLmdldFNvdXJjZUV4dGVuc2lvbigpLmVxdWFscygneG1sJyl9Ij4KLSAgICAgICAgPGp4OnNldCB2YXI9ImZpbGVFeHRlbnNpb24iIHZhbHVlPSJodG1sIi8+Ci0gICAgPC9qeDppZj4KLSAgICAgIDxEOnJlc3BvbnNlPgotICAgICAgICA8RDpocmVmPiR7cmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpfS8ke2RvYy5nZXRQdWJsaWNhdGlvbigpLmdldElkKCl9L3dlYmRhdiR7ZG9jLmdldFBhdGgoKX1fJHtkb2MuZ2V0TGFuZ3VhZ2UoKX0uJHtmaWxlRXh0ZW5zaW9ufTwvRDpocmVmPgotICAgICAgICA8RDpwcm9wc3RhdD4KLSAgICAgICAgICA8RDpwcm9wPgotICAgICAgICAgICAgPEQ6ZGlzcGxheW5hbWU+JHtkb2MuZ2V0TmFtZSgpfV8ke2RvYy5nZXRMYW5ndWFnZSgpfS4ke2ZpbGVFeHRlbnNpb259PC9EOmRpc3BsYXluYW1lPgotICAgICAgICAgICAgPEQ6Z2V0bGFzdG1vZGlmaWVkPiR7ZGF0ZUZvcm1hdC5mb3JtYXQoZG9jLmdldExhc3RNb2RpZmllZCgpKX08L0Q6Z2V0bGFzdG1vZGlmaWVkPgotICAgICAgICAgICAgPEQ6Y3JlYXRpb25kYXRlLz4KLSAgICAgICAgICAgIDxEOmdldGNvbnRlbnR0eXBlPmFwcGxpY2F0aW9uL3htbDwvRDpnZXRjb250ZW50dHlwZT4KLSAgICAgICAgICAgIDxEOmdldGNvbnRlbnRsZW5ndGg+JHtkb2MuZ2V0RmlsZSgpLmxlbmd0aCgpfTwvRDpnZXRjb250ZW50bGVuZ3RoPgotICAgICAgICAgICAgPEQ6cmVzb3VyY2V0eXBlLz4KLSAgICAgICAgICAgIDxEOmxvY2tkaXNjb3Zlcnk+Ci0gICAgICAgICAgICAgIDxqeDppZiB0ZXN0PSIke2NoZWNrZWRPdXRbc3RhdHVzLmluZGV4XSAhPSBudWxsfSI+Ci0gICAgICAgICAgICAgICAgPEQ6YWN0aXZlbG9jaz4KLSAgICAgICAgICAgICAgICAgIDxEOmxvY2t0eXBlPjxEOndyaXRlLz48L0Q6bG9ja3R5cGU+Ci0gICAgICAgICAgICAgICAgICA8RDpsb2Nrc2NvcGU+PEQ6ZXhjbHVzaXZlLz48L0Q6bG9ja3Njb3BlPgotICAgICAgICAgICAgICAgICAgPEQ6ZGVwdGg+MDwvRDpkZXB0aD4KLSAgICAgICAgICAgICAgICAgIDxEOm93bmVyPjxEOmhyZWY+JHtjaGVja2VkT3V0W3N0YXR1cy5pbmRleF0uZ2V0SWRlbnRpdHkoKX08L0Q6aHJlZj48L0Q6b3duZXI+Ci0gICAgICAgICAgICAgICAgICA8RDp0aW1lb3V0PkluZmluaXRlPC9EOnRpbWVvdXQ+Ci0gICAgICAgICAgICAgICAgICA8RDpsb2NrdG9rZW4+Ci0gICAgICAgICAgICAgICAgICAgIDxEOmhyZWY+JHt1c2VjYXNlLmdldFBhcmFtZXRlcignc291cmNlVVJMJyl9PC9EOmhyZWY+Ci0gICAgICAgICAgICAgICAgICA8L0Q6bG9ja3Rva2VuPgotICAgICAgICAgICAgICAgIDwvRDphY3RpdmVsb2NrPgotICAgICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgPC9EOmxvY2tkaXNjb3Zlcnk+Ci0gICAgICAgICAgPC9EOnByb3A+Ci0gICAgICAgICAgPEQ6c3RhdHVzPkhUVFAvMS4xIDIwMCBPSzwvRDpzdGF0dXM+Ci0gICAgICAgIDwvRDpwcm9wc3RhdD4KLSAgICAgIDwvRDpyZXNwb25zZT4KLSAgICA8L2p4OmlmPgotICA8L2p4OmZvckVhY2g+Ci08L0Q6bXVsdGlzdGF0dXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3VzZWNhc2VzL3dlYmRhdi9wcm9wZmluZC5qeCBiL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi91c2VjYXNlcy93ZWJkYXYvcHJvcGZpbmQuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDVjMzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3VzZWNhc2VzL3dlYmRhdi9wcm9wZmluZC5qeAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxEOm11bHRpc3RhdHVzIHhtbG5zOkQ9IkRBVjoiIHhtbG5zOmp4PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vdGVtcGxhdGVzL2p4LzEuMCIKLSAgeG1sbnM6Y29sbGVjdGlvbj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2NvbGxlY3Rpb24vMS4wIj4KLSAgPGp4OnNldCB2YXI9InNvdXJjZVVSTCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3NvdXJjZVVSTCcpfSIvPgotICA8ang6c2V0IHZhcj0iZGF0ZUZvcm1hdCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RhdGVGb3JtYXQnKX0iLz4KLSAgPGp4OnNldCB2YXI9Im1vZGRhdGUiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdyb290TW9kRGF0ZScpfSIvPgotICA8ang6c2V0IHZhcj0iZGVmYXVsdExhbmciIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdkZWZhdWx0TGFuZycpfSIvPgotIDwhLS0gcmV0dXJucyByb290IHdlYmRhdiBkaXJlY3RvcnkgLS0+Ci0gIDxEOnJlc3BvbnNlPgotICAgIDxEOmhyZWY+JHtyZXF1ZXN0LmdldENvbnRleHRQYXRoKCl9JHtzb3VyY2VVUkwucmVwbGFjZUZpcnN0KCJhdXRob3JpbmciLCJ3ZWJkYXYiKX08L0Q6aHJlZj4KLSAgICA8RDpwcm9wc3RhdD4KLSAgICAgIDxEOnByb3A+Ci0gICAgICAgIDxEOmRpc3BsYXluYW1lPndlYmRhdjwvRDpkaXNwbGF5bmFtZT4KLSAgICAgICAgPEQ6Z2V0bGFzdG1vZGlmaWVkPiR7ZGF0ZUZvcm1hdC5mb3JtYXQobW9kZGF0ZSl9PC9EOmdldGxhc3Rtb2RpZmllZD4KLSAgICAgICAgPEQ6Y3JlYXRpb25kYXRlPjwvRDpjcmVhdGlvbmRhdGU+Ci0gICAgICAgIDxEOnJlc291cmNldHlwZT4KLSAgICAgICAgICA8RDpjb2xsZWN0aW9uLz4KLSAgICAgICAgPC9EOnJlc291cmNldHlwZT4KLSAgICAgICAgPEQ6Z2V0Y29udGVudHR5cGU+aHR0cGQvdW5peC1kaXJlY3Rvcnk8L0Q6Z2V0Y29udGVudHR5cGU+Ci0gICAgICAgIDxEOmdldGNvbnRlbnRsZW5ndGg+MDwvRDpnZXRjb250ZW50bGVuZ3RoPgotICAgICAgICA8RDpsb2NrZGlzY292ZXJ5Lz4KLSAgICAgIDwvRDpwcm9wPgotICAgICAgPEQ6c3RhdHVzPkhUVFAvMS4xIDIwMCBPSzwvRDpzdGF0dXM+Ci0gICAgPC9EOnByb3BzdGF0PgotICA8L0Q6cmVzcG9uc2U+Ci0gIDxqeDppZiB0ZXN0PSIke3JlcXVlc3QuZ2V0SGVhZGVyKCdkZXB0aCcpICZndDsgMH0iPgotICAgIDxqeDpmb3JFYWNoIHZhcj0iZG9jIiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnRzJyl9Ij4KLSAgICAgIDwhLS0gRklYTUU6IHNob3VsZG4ndCB0aGlzIGNvbmRpdGlvbmFsIGJlIGRvYy5leGlzdHMoKT8gLS0+Ci0gICAgICA8ang6aWYgdGVzdD0iJHtkb2MuZ2V0SWQoKX0iPgotICAgICAgICA8ang6aWYgdGVzdD0iJHtkb2MuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMoZGVmYXVsdExhbmcpfSI+Ci0gICAgICAgICA8IS0tIGNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgZWFjaCBkb2N1bWVudDsKLSAgICAgICAgICB0aGUgbGFuZ3VhZ2UgY2hlY2sgaXMgdG8gcHJldmVudCBtdWx0aXBsZSBmb2xkZXJzIGFwcGVhcmluZyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICAgICAgICBzaW5jZSBjb25jZXB0c19lbiBhbmQgY29uY2VwdHNfZGUgd291bGQgYm90aCBwcm9kdWNlIGEgZm9sZGVyIGNhbGxlZCBjb25jZXB0cyAtLT4KLSAgICAgICAgICA8RDpyZXNwb25zZT4KLSAgICAgICAgICAgIDxEOmhyZWY+JHtyZXF1ZXN0LmdldENvbnRleHRQYXRoKCl9LyR7ZG9jLmdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKX0vd2ViZGF2JHtkb2MuZ2V0UGF0aCgpfTwvRDpocmVmPgotICAgICAgICAgICAgPEQ6cHJvcHN0YXQ+Ci0gICAgICAgICAgICAgIDxEOnByb3A+Ci0gICAgICAgICAgICAgICAgPEQ6ZGlzcGxheW5hbWU+JHtkb2MuZ2V0TmFtZSgpfTwvRDpkaXNwbGF5bmFtZT4KLSAgICAgICAgICAgICAgICA8RDpnZXRsYXN0bW9kaWZpZWQ+JHtkYXRlRm9ybWF0LmZvcm1hdChkb2MuZ2V0TGFzdE1vZGlmaWVkKCkpfTwvRDpnZXRsYXN0bW9kaWZpZWQ+Ci0gICAgICAgICAgICAgICAgPEQ6Y3JlYXRpb25kYXRlPjwvRDpjcmVhdGlvbmRhdGU+Ci0gICAgICAgICAgICAgICAgPEQ6cmVzb3VyY2V0eXBlPgotICAgICAgICAgICAgICAgICAgPEQ6Y29sbGVjdGlvbi8+Ci0gICAgICAgICAgICAgICAgPC9EOnJlc291cmNldHlwZT4KLSAgICAgICAgICAgICAgICA8RDpnZXRjb250ZW50dHlwZT5odHRwZC91bml4LWRpcmVjdG9yeTwvRDpnZXRjb250ZW50dHlwZT4KLSAgICAgICAgICAgICAgICA8RDpnZXRjb250ZW50bGVuZ3RoPjA8L0Q6Z2V0Y29udGVudGxlbmd0aD4KLSAgICAgICAgICAgICAgICA8RDpsb2NrZGlzY292ZXJ5Lz4KLSAgICAgICAgICAgICAgPC9EOnByb3A+Ci0gICAgICAgICAgICAgIDxEOnN0YXR1cz5IVFRQLzEuMSAyMDAgT0s8L0Q6c3RhdHVzPgotICAgICAgICAgICAgPC9EOnByb3BzdGF0PgotICAgICAgICAgIDwvRDpyZXNwb25zZT4KLSAgICAgICAgPC9qeDppZj4KLSAgICAgIDwvang6aWY+Ci0gICAgPC9qeDpmb3JFYWNoPgotICAgIDxqeDpzZXQgdmFyPSJjaGVja2VkT3V0IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcigncmMnKX0iLz4KLSAgICA8ang6Zm9yRWFjaCB2YXI9ImRvYyIgaXRlbXM9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ2RvY3VtZW50cycpfSIKLSAgICAgIHZhclN0YXR1cz0ic3RhdHVzIj4KLSAgICAgIDxqeDppZiB0ZXN0PSIke2RvYy5nZXRJZCgpfSI+Ci0gICAgICA8ang6c2V0IHZhcj0iZmlsZUV4dGVuc2lvbiIgdmFsdWU9IiR7ZG9jLmdldFNvdXJjZUV4dGVuc2lvbigpfSIvPgotICAgICAgPGp4OmlmIHRlc3Q9IiR7ZG9jLmdldFNvdXJjZUV4dGVuc2lvbigpLmVxdWFscygneG1sJyl9Ij4KLSAgICAgICAgICA8ang6c2V0IHZhcj0iZmlsZUV4dGVuc2lvbiIgdmFsdWU9Imh0bWwiLz4KLSAgICAgIDwvang6aWY+Ci0gICAgICAgPCEtLSBjcmVhdGUgYSBmaWxlIGZvciBlYWNoIGRvY3VtZW50LCB0aGUgaHJlZiBpcyB0aGUgcGF0aCB0byB0aGUgZmlsZSBhbmQgdGhlIAotICAgICAgICBkaXNwbGF5IG5hbWUgaXMgd2hhdCB3aWxsIGFwcGVhciBpbiB0aGUgd2ViZGF2IGZvbGRlciAtLT4KLSAgICAgICAgPEQ6cmVzcG9uc2U+Ci0gICAgICAgICAgPEQ6aHJlZj4ke3JlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKX0vJHtkb2MuZ2V0UHVibGljYXRpb24oKS5nZXRJZCgpfS93ZWJkYXYke2RvYy5nZXRQYXRoKCl9XyR7ZG9jLmdldExhbmd1YWdlKCl9LiR7ZmlsZUV4dGVuc2lvbn08L0Q6aHJlZj4KLSAgICAgICAgICA8RDpwcm9wc3RhdD4KLSAgICAgICAgICAgIDxEOnByb3A+Ci0gICAgICAgICAgICAgIDxEOmRpc3BsYXluYW1lPiR7ZG9jLmdldE5hbWUoKX1fJHtkb2MuZ2V0TGFuZ3VhZ2UoKX0uJHtmaWxlRXh0ZW5zaW9ufTwvRDpkaXNwbGF5bmFtZT4KLSAgICAgICAgICAgICAgPEQ6Z2V0bGFzdG1vZGlmaWVkPiR7ZGF0ZUZvcm1hdC5mb3JtYXQoZG9jLmdldExhc3RNb2RpZmllZCgpKX08L0Q6Z2V0bGFzdG1vZGlmaWVkPgotICAgICAgICAgICAgICA8RDpjcmVhdGlvbmRhdGUvPgotICAgICAgICAgICAgICA8RDpnZXRjb250ZW50dHlwZT5hcHBsaWNhdGlvbi94bWw8L0Q6Z2V0Y29udGVudHR5cGU+Ci0gICAgICAgICAgICAgIDxEOmdldGNvbnRlbnRsZW5ndGg+JHtkb2MuZ2V0RmlsZSgpLmxlbmd0aCgpfTwvRDpnZXRjb250ZW50bGVuZ3RoPgotICAgICAgICAgICAgICA8RDpyZXNvdXJjZXR5cGUvPgotICAgICAgICAgICAgICA8RDpsb2NrZGlzY292ZXJ5PgotICAgICAgICAgICAgICA8ang6aWYgdGVzdD0iJHtjaGVja2VkT3V0W3N0YXR1cy5pbmRleF0gIT0gbnVsbH0iPgotICAgICAgICAgICAgICAgIDxEOmFjdGl2ZWxvY2s+Ci0gICAgICAgICAgICAgICAgICA8RDpsb2NrdHlwZT48RDp3cml0ZS8+PC9EOmxvY2t0eXBlPgotICAgICAgICAgICAgICAgICAgPEQ6bG9ja3Njb3BlPjxEOmV4Y2x1c2l2ZS8+PC9EOmxvY2tzY29wZT4KLSAgICAgICAgICAgICAgICAgIDxEOmRlcHRoPjA8L0Q6ZGVwdGg+Ci0gICAgICAgICAgICAgICAgICA8RDpvd25lcj48RDpocmVmPiR7Y2hlY2tlZE91dFtzdGF0dXMuaW5kZXhdLmdldElkZW50aXR5KCl9PC9EOmhyZWY+PC9EOm93bmVyPgotICAgICAgICAgICAgICAgICAgPEQ6dGltZW91dD5JbmZpbml0ZTwvRDp0aW1lb3V0PgotICAgICAgICAgICAgICAgICAgPEQ6bG9ja3Rva2VuPgotICAgICAgICAgICAgICAgICAgICA8RDpocmVmPiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3NvdXJjZVVSTCcpfTwvRDpocmVmPgotICAgICAgICAgICAgICAgICAgPC9EOmxvY2t0b2tlbj4KLSAgICAgICAgICAgICAgICA8L0Q6YWN0aXZlbG9jaz4KLSAgICAgICAgICAgICAgICA8L2p4OmlmPgotICAgICAgICAgICAgICA8L0Q6bG9ja2Rpc2NvdmVyeT4KLSAgICAgICAgICAgIDwvRDpwcm9wPgotICAgICAgICAgICAgPEQ6c3RhdHVzPkhUVFAvMS4xIDIwMCBPSzwvRDpzdGF0dXM+Ci0gICAgICAgICAgPC9EOnByb3BzdGF0PgotICAgICAgICA8L0Q6cmVzcG9uc2U+Ci0gICAgICA8L2p4OmlmPgotICAgIDwvang6Zm9yRWFjaD4KLSAgICA8ang6Zm9yRWFjaCB2YXI9ImFzc2V0IiBpdGVtcz0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignYXNzZXRzJyl9Ij4KLSAgICAgPCEtLSBzaW1pbGFyIHRvIGRvY3VtZW50cywgYSBmaWxlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggYXNzZXQgd2l0aCBhbiBocmVmIGFuZCBkaXNwbGF5IG5hbWUgLS0+Ci0gICAgICA8RDpyZXNwb25zZT4KLSAgICAgICAgPEQ6aHJlZj4ke3JlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKX0vJHtzb3VyY2VVUkwucmVwbGFjZUZpcnN0KCJhdXRob3JpbmciLCJ3ZWJkYXYiKX0ke2Fzc2V0LmdldE5hbWUoKX08L0Q6aHJlZj4KLSAgICAgICAgPEQ6cHJvcHN0YXQ+Ci0gICAgICAgICAgPEQ6cHJvcD4KLSAgICAgICAgICAgIDxEOmRpc3BsYXluYW1lPiR7YXNzZXQuZ2V0TmFtZSgpfTwvRDpkaXNwbGF5bmFtZT4KLSAgICAgICAgICAgIDxEOmdldGxhc3Rtb2RpZmllZD4ke2RhdGVGb3JtYXQuZm9ybWF0KGFzc2V0LmdldExhc3RNb2RpZmllZCgpKX08L0Q6Z2V0bGFzdG1vZGlmaWVkPgotICAgICAgICAgICAgPEQ6Y3JlYXRpb25kYXRlLz4KLSAgICAgICAgICAgIDxEOmdldGNvbnRlbnR0eXBlPmFzc2V0LmdldE1pbWVUeXBlKCk8L0Q6Z2V0Y29udGVudHR5cGU+Ci0gICAgICAgICAgICA8RDpnZXRjb250ZW50bGVuZ3RoPiR7YXNzZXQuZ2V0Q29udGVudExlbmd0aCgpfTwvRDpnZXRjb250ZW50bGVuZ3RoPgotICAgICAgICAgICAgPEQ6cmVzb3VyY2V0eXBlLz4KLSAgICAgICAgICAgIDxEOmxvY2tkaXNjb3ZlcnkvPgotICAgICAgICAgIDwvRDpwcm9wPgotICAgICAgICAgIDxEOnN0YXR1cz5IVFRQLzEuMSAyMDAgT0s8L0Q6c3RhdHVzPgotICAgICAgICA8L0Q6cHJvcHN0YXQ+Ci0gICAgICA8L0Q6cmVzcG9uc2U+Ci0gICAgPC9qeDpmb3JFYWNoPgotICA8L2p4OmlmPgotPC9EOm11bHRpc3RhdHVzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi91c2VjYXNlcy93ZWJkYXYvc3RhdHVzLmp4IGIvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3VzZWNhc2VzL3dlYmRhdi9zdGF0dXMuangKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjcyN2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3VzZWNhc2VzL3dlYmRhdi9zdGF0dXMuangKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHJlc3BvbnNlPg0KLSAgPHN0YXR1cz4ke3BhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCJzdGF0dXMiKX08L3N0YXR1cz4NCi0gIDxtZXNzYWdlPiR7bWVzc2FnZX08L21lc3NhZ2U+DQotPC9yZXNwb25zZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvd2ViZGF2LmpzIGIvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3dlYmRhdi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkZjhiOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYvd2ViZGF2LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vKiBIZWxwZXIgbWV0aG9kIHRvIGFkZCBhbGwgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGEgdXNlY2FzZSAqLwotZnVuY3Rpb24gcGFzc1JlcXVlc3RQYXJhbWV0ZXJzKGZsb3dIZWxwZXIsIHVzZWNhc2UpIHsKLSAgICB2YXIgbmFtZXMgPSBjb2Nvb24ucmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgIHdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICB2YXIgbmFtZSA9IG5hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmICghbmFtZS5lcXVhbHMoImxlbnlhLnVzZWNhc2UiKQotICAgICAgICAgICAgJiYgIW5hbWUuZXF1YWxzKCJsZW55YS5jb250aW51YXRpb24iKQotICAgICAgICAgICAgJiYgIW5hbWUuZXF1YWxzKCJzdWJtaXQiKSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXIgdmFsdWUgPSBmbG93SGVscGVyLmdldFJlcXVlc3QoY29jb29uKS5nZXQobmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZhciBzdHJpbmcgPSBuZXcgUGFja2FnZXMuamF2YS5sYW5nLlN0cmluZygpOwotICAgICAgICAgICAgaWYgKHN0cmluZy5nZXRDbGFzcygpLmlzSW5zdGFuY2UodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZS5zZXRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZS5zZXRQYXJ0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBIZWxwZXIgbWV0aG9kIHRvIGFkZCBhbGwgcmVxdWVzdCBoZWFkZXJzIHRvIGEgdXNlY2FzZSAqLwotZnVuY3Rpb24gcGFzc1JlcXVlc3RIZWFkZXJzKGZsb3dIZWxwZXIsIHVzZWNhc2UpIHsKLSAgICB2YXIgbmFtZXMgPSBjb2Nvb24ucmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOwotICAgIHdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICB2YXIgbmFtZSA9IG5hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIHZhciB2YWx1ZSA9IGZsb3dIZWxwZXIuZ2V0UmVxdWVzdChjb2Nvb24pLmdldEhlYWRlcihuYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICB2YXIgc3RyaW5nID0gbmV3IFBhY2thZ2VzLmphdmEubGFuZy5TdHJpbmcoKTsKLSAgICAgICAgaWYgKHN0cmluZy5nZXRDbGFzcygpLmlzSW5zdGFuY2UodmFsdWUpKSB7Ci0gICAgICAgICAgICB1c2VjYXNlLnNldFBhcmFtZXRlcigiaGVhZGVyLSIrbmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdXNlY2FzZS5zZXRQYXJ0KCJoZWFkZXItIituYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIHNlbGVjdE1ldGhvZCgpIHsKLSAgdmFyIHBhZ2UgPSBjb2Nvb24ucGFyYW1ldGVyc1sicGFnZSJdOwotICB2YXIgcmVxdWVzdFVSSSA9IGNvY29vbi5wYXJhbWV0ZXJzWyJyZXF1ZXN0VVJJIl07Ci0gIHZhciBtZXRob2QgPSBjb2Nvb24ucmVxdWVzdC5nZXRNZXRob2QoKTsKLSAgY29jb29uLnNlbmRQYWdlKG1ldGhvZCsiLyIrcGFnZSwgeyJyZXF1ZXN0VVJJIjpyZXF1ZXN0VVJJfSk7Ci19Ci0KLWZ1bmN0aW9uIHNlbmRTdGF0dXMoc2MpIHsKLSAgY29jb29uLnNlbmRTdGF0dXMoc2MpOwotfQotIAotZnVuY3Rpb24gbWtjb2woKSB7Ci0gIHZhciBzdGF0dXMgPSBleGVjdXRlVXNlY2FzZSgid2ViZGF2Lm1rY29sIik7Ci0gIGlmKHN0YXR1cykKLSAgICBzZW5kU3RhdHVzKDIwMSk7Ci0gIGVsc2UKLSAgICBzZW5kU3RhdHVzKDQwMyk7Ci19Ci0gCi1mdW5jdGlvbiBwdXQoKSB7Ci0gIHZhciBzdGF0dXMgPSBleGVjdXRlVXNlY2FzZSgid2ViZGF2LnB1dCIpOwotICBpZihzdGF0dXMpCi0gICAgc2VuZFN0YXR1cygyMDQpOwotICBlbHNlIHsKLSAgICBzZW5kU3RhdHVzKDQxNSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gcmVtb3ZlKCkgewotICB2YXIgc3RhdHVzID0gZXhlY3V0ZVVzZWNhc2UoIndlYmRhdi5kZWxldGUiKTsKLSAgc2VuZFN0YXR1cygyMDApOwotfQotCi1mdW5jdGlvbiBnZXQoKSB7Ci0gIHZhciB1cmkgPSBuZXcgamF2YS5sYW5nLlN0cmluZyhjb2Nvb24ucGFyYW1ldGVyc1siZm9yd2FyZCJdKTsKLSAgdmFyIHVyaSA9IHVyaS5zdWJzdHJpbmcoOCwgdXJpLmxlbmd0aCgpKTsKLSAgY29jb29uLnNlbmRQYWdlKHVyaSk7Ci19Ci0KLWZ1bmN0aW9uIGZpbGVQcm9wZmluZCgpIHsKLSAgdmFyIHN0YXR1cyA9IGV4ZWN1dGVVc2VjYXNlKCJ3ZWJkYXYuZmlsZVByb3BmaW5kIik7Ci0gIHNlbmRTdGF0dXMoNTAwKTsKLX0KLQotZnVuY3Rpb24gcHJvcGZpbmQoKSB7Ci0gIHZhciBzdGF0dXMgPSBleGVjdXRlVXNlY2FzZSgid2ViZGF2LnByb3BmaW5kIik7Ci0gIHNlbmRTdGF0dXMoNTAwKTsKLX0KLQotZnVuY3Rpb24gb3B0aW9ucyh0eXBlKSB7Ci0gIGNvY29vbi5yZXNwb25zZS5zZXRIZWFkZXIoIkRBViIsIjEiKTsKLSAgdmFyIG9wdGlvbnMgPSAiIjsKLSAgaWYgKHR5cGUgPT0gImZpbGUiKSB7Ci0gICAgb3B0aW9ucyA9ICJPUFRJT05TLEdFVCxIRUFELFBPU1QsREVMRVRFLFRSQUNFLFBST1BGSU5ELFBST1BQQVRDSCxDT1BZLE1PVkUsUFVULExPQ0ssVU5MT0NLIjsKLSAgfSBlbHNlIHsKLSAgICBvcHRpb25zID0gIk9QVElPTlMsR0VULEhFQUQsUE9TVCxERUxFVEUsVFJBQ0UsUFJPUEZJTkQsUFJPUFBBVENILENPUFksTU9WRSxMT0NLLFVOTE9DSyI7Ci0gIH0KLSAgY29jb29uLnJlc3BvbnNlLnNldEhlYWRlcigiQWxsb3ciLG9wdGlvbnMpOwotCi0gIC8vaW50ZXJvcGVyYWJpbGl0eSB3aXRoIFdpbmRvd3MgMjAwMAotICB2YXIgdzJrREFWRGlzY292ZXJBZ2VudCA9ICJNaWNyb3NvZnQgRGF0YSBBY2Nlc3MgSW50ZXJuZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBQdWJsaXNoaW5nIFByb3ZpZGVyIFByb3RvY29sIERpc2NvdmVyeSI7Ci0gIGlmIChjb2Nvb24ucmVxdWVzdC5nZXRIZWFkZXIoIlVzZXItQWdlbnQiKSA9PSB3MmtEQVZEaXNjb3ZlckFnZW50KSB7Ci0gICAgICBjb2Nvb24ucmVzcG9uc2Uuc2V0SGVhZGVyKCJNUy1BdXRob3ItVmlhIiwiREFWIik7Ci0gIH0KLQotICBzZW5kU3RhdHVzKDIwMCk7Ci19Ci0KLS8qCi0gKiBwYXJzZSB0aGUgZGVwdGggaGVhZGVyIHRvIGZpbmQgb3V0IGlmIHJlY3Vyc2lvbgotICogdGFrZSBwbGFjZS4gKHVzZWQgYnkgTU9WRSBhbmQgQ09QWSkKLSAqLwotZnVuY3Rpb24gaXNSZWN1cnNlKGRlcHRoKSB7Ci0gIHZhciByZWN1cnNlOwotICBpZiAoZGVwdGggPT0gbnVsbCB8fCBkZXB0aCA9PSAnJykgewotICAgIHJlY3Vyc2UgPSB0cnVlOwotICB9Ci0gIGVsc2UgaWYgKGRlcHRoID09ICdJbmZpbml0eScpIHsKLSAgICByZWN1cnNlID0gdHJ1ZTsKLSAgfQotICBlbHNlIHsKLSAgICByZWN1cnNlID0gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHJlY3Vyc2U7Ci19Ci0KLS8qCi0gKiBjb252ZXJ0IHRoZSBvdmVyd3JpdGUgaGVhZGVyIGludG8gYSBib29sZWFuIHR5cGUKLSAqLwotZnVuY3Rpb24gaXNPdmVyd3JpdGUoaGVhZGVyKSB7Ci0gIHZhciBvdmVyd3JpdGUgPSB0cnVlOwotICBpZiAoaGVhZGVyID09ICdGJykgewotICAgIG92ZXJ3cml0ZSA9IGZhbHNlOwotICB9Ci0gIHJldHVybiBvdmVyd3JpdGU7Ci19Ci0KLWZ1bmN0aW9uIGV4ZWN1dGVVc2VjYXNlKHVzZWNhc2VOYW1lKSB7Ci0gICAgdmFyIHZpZXc7Ci0gICAgdmFyIHByb3h5OwotICAgIHZhciBtZW51ID0gIm5vbWVudSI7Ci0gICAgCi0gICAgdmFyIHVzZWNhc2VSZXNvbHZlcjsKLSAgICB2YXIgdXNlY2FzZTsKLSAgICB2YXIgc291cmNlVXJsOwotICAgIAotICAgIHZhciBwcmVjb25kaXRpb25zT2s7Ci0gICAgCi0gICAgaWYgKGNvY29vbi5sb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICBjb2Nvb24ubG9nLmRlYnVnKCJ1c2VjYXNlcy5qczo6ZXhlY3V0ZVVzZWNhc2UoKSBjYWxsZWQsIHBhcmFtZXRlciBsZW55YS51c2VjYXNlID0gWyIgKyB1c2VjYXNlTmFtZSArICJdIik7Ci0gICAgCi0gICAgdHJ5IHsKLQotICAgICAgICB2YXIgZmxvd0hlbHBlciA9IGNvY29vbi5nZXRDb21wb25lbnQoIm9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5mbG93LkZsb3dIZWxwZXIiKTsKLSAgICAgICAgdmFyIHJlcXVlc3QgPSBmbG93SGVscGVyLmdldFJlcXVlc3QoY29jb29uKTsKLSAgICAgICAgc291cmNlVXJsID0gUGFja2FnZXMub3JnLmFwYWNoZS5sZW55YS51dGlsLlNlcnZsZXRIZWxwZXIuZ2V0V2ViYXBwVVJJKHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgdXNlY2FzZVJlc29sdmVyID0gY29jb29uLmdldENvbXBvbmVudCgib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXIiKTsKLSAgICAgICAgdXNlY2FzZSA9IHVzZWNhc2VSZXNvbHZlci5yZXNvbHZlKHNvdXJjZVVybCwgdXNlY2FzZU5hbWUpOwotICAgICAgICB1c2VjYXNlLnNldFNvdXJjZVVSTChzb3VyY2VVcmwpOwotICAgICAgICB1c2VjYXNlLnNldE5hbWUodXNlY2FzZU5hbWUpOwotICAgICAgICB2aWV3ID0gdXNlY2FzZS5nZXRWaWV3KCk7Ci0KLSAgICAgICAgcGFzc1JlcXVlc3RQYXJhbWV0ZXJzKGZsb3dIZWxwZXIsIHVzZWNhc2UpOwotICAgICAgICBwYXNzUmVxdWVzdEhlYWRlcnMoZmxvd0hlbHBlciwgdXNlY2FzZSk7Ci0gICAgICAgIHVzZWNhc2UuY2hlY2tQcmVjb25kaXRpb25zKCk7Ci0gICAgICAgIHByZWNvbmRpdGlvbnNPayA9ICF1c2VjYXNlLmhhc0Vycm9ycygpOwotICAgICAgICBpZiAocHJlY29uZGl0aW9uc09rKSB7Ci0gICAgICAgICAgICB1c2VjYXNlLmxvY2tJbnZvbHZlZE9iamVjdHMoKTsKLSAgICAgICAgfQotICAgICAgICBwcm94eSA9IG5ldyBQYWNrYWdlcy5vcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLmltcGwuVXNlY2FzZVByb3h5KHVzZWNhc2UpOwotICAgIH0KLSAgICBmaW5hbGx5IHsKLSAgICAgICAgLyogZG9uZSB3aXRoIHVzZWNhc2UgY29tcG9uZW50LCB0ZWxsIHVzZWNhc2VSZXNvbHZlciB0byByZWxlYXNlIGl0ICovCi0gICAgICAgIGlmICh1c2VjYXNlUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHVzZWNhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVzZWNhc2VSZXNvbHZlci5yZWxlYXNlKHVzZWNhc2UpOwotICAgICAgICAgICAgICAgIHVzZWNhc2UgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb2Nvb24ucmVsZWFzZUNvbXBvbmVudCh1c2VjYXNlUmVzb2x2ZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZhciBzdWNjZXNzID0gZmFsc2U7Ci0gICAgLy92YXIgdGFyZ2V0VXJsOwotICAgIHZhciBmb3JtOwotICAgIHZhciBzY3JpcHRTdHJpbmc7Ci0gICAgdmFyIGV2YWxGdW5jOwotICAgIHZhciBnZW5lcmljOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgdXNlY2FzZSBoYXMgYSB2aWV3LCB0aGlzIG1lYW5zIHdlIHdhbnQgdG8gZGlzcGxheSBzb21ldGhpbmcgCi0gICAgICogdG8gdGhlIHVzZXIgYmVmb3JlIHByb2NlZWRpbmcuIFRoaXMgYWxzbyBtZWFucyB0aGUgdXNlY2FzZSBjb25zaXN0cwotICAgICAqIHNldmVyYWwgc3RlcHM7IHJlcGVhdGVkIHVudGlsIHRoZSB1c2VyIGNob29zZXMgdG8gc3VibWl0IG9yIGNhbmNlbC4KLSAgICAgKgotICAgICAqIElmIHRoZSB1c2VjYXNlIGRvZXMgbm90IGhhdmUgYSB2aWV3LCBpdCBpcyBzaW1wbHkgZXhlY3V0ZWQuCi0gICAgICovCi0KLSAgICBpZiAodmlldykgewotICAgICAgICB2YXIgcmVhZHkgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKCFyZWFkeSkgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZVVyaSA9IHZpZXcuZ2V0VGVtcGxhdGVVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVVcmkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdVcmkgPSAidmlldy8iICsgbWVudSArICIvIiArIHZpZXcuZ2V0VGVtcGxhdGVVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvY29vbi5sb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvY29vbi5sb2cuZGVidWcoInVzZWNhc2VzLmpzOjpleGVjdXRlVXNlY2FzZSgpIGluIHVzZWNhc2UgIiArIHVzZWNhc2VOYW1lICsgIiwgY3JlYXRpbmcgdmlldywgY2FsbGluZyBDb2Nvb24gd2l0aCB2aWV3VXJpID0gWyIgKyB2aWV3VXJpICsgIl0iKTsKLQotICAgICAgICAgICAgICAgICAgICBjb2Nvb24uc2VuZFBhZ2VBbmRXYWl0KHZpZXdVcmksIHsidXNlY2FzZSIgOiBwcm94eX0pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3VXJpID0gdmlldy5nZXRWaWV3VVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvY29vbi5zZW5kUGFnZSh2aWV3VXJpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93biBieSB0aGUgdmlldywgYWxsb3cgdGhlIHVzZWNhc2UgdG8gcm9sbGJhY2sgdGhlIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlUmVzb2x2ZXIgPSBjb2Nvb24uZ2V0Q29tcG9uZW50KCJvcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VSZXNvbHZlciIpOwotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlID0gdXNlY2FzZVJlc29sdmVyLnJlc29sdmUoc291cmNlVXJsLCB1c2VjYXNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3h5LnNldHVwKHVzZWNhc2UpOwotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLmNhbmNlbCgpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAodXNlY2FzZVJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VjYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VjYXNlUmVzb2x2ZXIucmVsZWFzZSh1c2VjYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VjYXNlID0gdW5kZWZpbmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29jb29uLnJlbGVhc2VDb21wb25lbnQodXNlY2FzZVJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNvY29vbi5sb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBjb2Nvb24ubG9nLmRlYnVnKCJ1c2VjYXNlcy5qczo6ZXhlY3V0ZVVzZWNhc2UoKSBpbiB1c2VjYXNlICIgKyB1c2VjYXNlTmFtZSArICIsIGFmdGVyIHZpZXcsIG5vdyBhZHZhbmNpbmcgaW4gdXNlY2FzZSIpOwotICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZVJlc29sdmVyID0gY29jb29uLmdldENvbXBvbmVudCgib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXIiKTsKLSAgICAgICAgICAgICAgICB1c2VjYXNlID0gdXNlY2FzZVJlc29sdmVyLnJlc29sdmUoc291cmNlVXJsLCB1c2VjYXNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgcHJveHkuc2V0dXAodXNlY2FzZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYXNzUmVxdWVzdFBhcmFtZXRlcnMoZmxvd0hlbHBlciwgdXNlY2FzZSk7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZS5hZHZhbmNlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY29jb29uLnJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJtaXQiKSkgewotICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLmNoZWNrRXhlY3V0aW9uQ29uZGl0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBpZiAoISB1c2VjYXNlLmhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHVzZWNhc2UuaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VjYXNlLmNoZWNrUG9zdGNvbmRpdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISB1c2VjYXNlLmhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvY29vbi5yZXF1ZXN0LmdldFBhcmFtZXRlcigiY2FuY2VsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlY2FzZS5jYW5jZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcm94eSA9IG5ldyBQYWNrYWdlcy5vcmcuYXBhY2hlLmxlbnlhLmNtcy51c2VjYXNlLlVzZWNhc2VQcm94eSh1c2VjYXNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAvKiBhbGxvdyB1c2VjYXNlIHRvIHJvbGxiYWNrIHRoZSB0cmFuc2l0aW9uICovCi0gICAgICAgICAgICAgICAgdXNlY2FzZS5jYW5jZWwoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAodXNlY2FzZVJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZWNhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXNlY2FzZVJlc29sdmVyLnJlbGVhc2UodXNlY2FzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VjYXNlID0gdW5kZWZpbmVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvY29vbi5yZWxlYXNlQ29tcG9uZW50KHVzZWNhc2VSZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXNlY2FzZVJlc29sdmVyID0gY29jb29uLmdldENvbXBvbmVudCgib3JnLmFwYWNoZS5sZW55YS5jbXMudXNlY2FzZS5Vc2VjYXNlUmVzb2x2ZXIiKTsKLSAgICAgICAgICAgIHVzZWNhc2UgPSB1c2VjYXNlUmVzb2x2ZXIucmVzb2x2ZShzb3VyY2VVcmwsIHVzZWNhc2VOYW1lKTsKLSAgICAgICAgICAgIHByb3h5LnNldHVwKHVzZWNhc2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocHJlY29uZGl0aW9uc09rKSB7Ci0gICAgICAgICAgICAgICAgdXNlY2FzZS5jaGVja0V4ZWN1dGlvbkNvbmRpdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXVzZWNhc2UuaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlY2FzZS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghIHVzZWNhc2UuaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWNhc2UuY2hlY2tQb3N0Y29uZGl0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgdXNlY2FzZS5oYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChleGNlcHRpb24pIHsKLSAgICAgICAgICAgIC8qIGFsbG93IHVzZWNhc2UgdG8gcm9sbGJhY2sgdGhlIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHVzZWNhc2UuY2FuY2VsKCk7Ci0gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICB1c2VjYXNlUmVzb2x2ZXIucmVsZWFzZSh1c2VjYXNlKTsKLSAgICAgICAgICAgIHVzZWNhc2UgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAgICBjb2Nvb24ucmVsZWFzZUNvbXBvbmVudCh1c2VjYXNlUmVzb2x2ZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICByZXR1cm4gc3VjY2VzczsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi94c2x0L05TY2xlYW4ueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3hzbHQvTlNjbGVhbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODkwMTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3hzbHQvTlNjbGVhbi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIAotICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiAKLSAgICAgICB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiCi0gICAgICAgeG1sbnM6Y29sbGVjdGlvbj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2NvbGxlY3Rpb24vMS4wIgotICAgICAgIHhtbG5zOkQ9IkRBVjoiCi0gICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9Imp4Ij4KLQotPCEtLSBJZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiB0ZW1wbGF0ZSAtLT4JCQkKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8gfCBAKiB8ICogfCBjb21tZW50KCkgfCBwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkgfCB0ZXh0KCkiPiAKLQk8eHNsOmNvcHk+IAotCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIHwgKiB8IGNvbW1lbnQoKSB8IHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSB8IHRleHQoKSIvPiAKLQk8L3hzbDpjb3B5PiAKLTwveHNsOnRlbXBsYXRlPiAKLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iRDptdWx0aXN0YXR1cyI+Ci0gIDxtdWx0aXN0YXR1cyB4bWxucz0iREFWOiIgeG1sbnM6Y29sbGVjdGlvbj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2NvbGxlY3Rpb24vMS4wIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIHwgKiB8IHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSB8IHRleHQoKSIvPgotICA8L211bHRpc3RhdHVzPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkQ6KiI+Ci0gIDx4c2w6ZWxlbWVudCBuYW1lPSJ7bG9jYWwtbmFtZSgpfSIgbmFtZXNwYWNlPSJEQVY6Ij4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIHwgKiB8IHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSB8IHRleHQoKSIvPgotICA8L3hzbDplbGVtZW50PgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYveHNsdC9pbml0LnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi94c2x0L2luaXQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWYxZmY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi94c2x0L2luaXQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLSAgICA8eHNsOnBhcmFtIG5hbWU9InB1YmlkIiAvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iY29udGV4dCIgLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgICAgICA8RDptdWx0aXN0YXR1cyB4bWxuczpEPSJEQVY6IiB4bWxuczpjb2xsZWN0aW9uPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vY29sbGVjdGlvbi8xLjAiPgotICAgICAgICAgICA8RDpyZXNwb25zZT4KLSAgICAgICAgICAgICAgPEQ6aHJlZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRleHQiIC8+Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHViaWQiIC8+LzwvRDpocmVmPgotCi0gICAgICAgICAgICAgIDxEOnByb3BzdGF0PgotICAgICAgICAgICAgICAgICA8RDpwcm9wPgotICAgICAgICAgICAgICAgICAgICA8RDpkaXNwbGF5bmFtZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1YmlkIiAvPjwvRDpkaXNwbGF5bmFtZT4KLQotICAgICAgICAgICAgICAgICAgICA8RDpnZXRsYXN0bW9kaWZpZWQ+PC9EOmdldGxhc3Rtb2RpZmllZD4KLQotICAgICAgICAgICAgICAgICAgICA8RDpjcmVhdGlvbmRhdGUgLz4KLQotICAgICAgICAgICAgICAgICAgICA8RDpyZXNvdXJjZXR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxEOmNvbGxlY3Rpb24gLz4KLSAgICAgICAgICAgICAgICAgICAgPC9EOnJlc291cmNldHlwZT4KLQotICAgICAgICAgICAgICAgICAgICA8RDpnZXRjb250ZW50dHlwZT5odHRwZC91bml4LWRpcmVjdG9yeTwvRDpnZXRjb250ZW50dHlwZT4KLQotICAgICAgICAgICAgICAgICAgICA8RDpnZXRjb250ZW50bGVuZ3RoPjA8L0Q6Z2V0Y29udGVudGxlbmd0aD4KLSAgICAgICAgICAgICAgICAgPC9EOnByb3A+Ci0KLSAgICAgICAgICAgICAgICAgPEQ6c3RhdHVzPkhUVFAvMS4xIDIwMCBPSzwvRDpzdGF0dXM+Ci0gICAgICAgICAgICAgIDwvRDpwcm9wc3RhdD4KLSAgICAgICAgICAgPC9EOnJlc3BvbnNlPgotCi0gICAgICAgICAgIDxEOnJlc3BvbnNlPgotICAgICAgICAgICAgICA8RDpocmVmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGV4dCIgLz4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwdWJpZCIgLz4vd2ViZGF2PC9EOmhyZWY+Ci0KLSAgICAgICAgICAgICAgPEQ6cHJvcHN0YXQ+Ci0gICAgICAgICAgICAgICAgIDxEOnByb3A+Ci0gICAgICAgICAgICAgICAgICAgIDxEOmRpc3BsYXluYW1lPndlYmRhdjwvRDpkaXNwbGF5bmFtZT4KLQotICAgICAgICAgICAgICAgICAgICA8RDpnZXRsYXN0bW9kaWZpZWQ+PC9EOmdldGxhc3Rtb2RpZmllZD4KLQotICAgICAgICAgICAgICAgICAgICA8RDpjcmVhdGlvbmRhdGUgLz4KLQotICAgICAgICAgICAgICAgICAgICA8RDpyZXNvdXJjZXR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxEOmNvbGxlY3Rpb24gLz4KLSAgICAgICAgICAgICAgICAgICAgPC9EOnJlc291cmNldHlwZT4KLQotICAgICAgICAgICAgICAgICAgICA8RDpnZXRjb250ZW50dHlwZT5odHRwZC91bml4LWRpcmVjdG9yeTwvRDpnZXRjb250ZW50dHlwZT4KLQotICAgICAgICAgICAgICAgICAgICA8RDpnZXRjb250ZW50bGVuZ3RoPjA8L0Q6Z2V0Y29udGVudGxlbmd0aD4KLSAgICAgICAgICAgICAgICAgPC9EOnByb3A+Ci0KLSAgICAgICAgICAgICAgICAgPEQ6c3RhdHVzPkhUVFAvMS4xIDIwMCBPSzwvRDpzdGF0dXM+Ci0gICAgICAgICAgICAgIDwvRDpwcm9wc3RhdD4KLSAgICAgICAgICAgPC9EOnJlc3BvbnNlPgotCi0KLSAgICAgICAgPC9EOm11bHRpc3RhdHVzPgkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi94c2x0L2xpbWl0UmVzcG9uc2UueHNsIGIvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3hzbHQvbGltaXRSZXNwb25zZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTczZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMvd2ViZGF2L3hzbHQvbGltaXRSZXNwb25zZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6eHNvPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEveHNsdC8xLjAiCi0gIHhtbG5zOkQ9IkRBVjoiCi0gID4KLSAgCi08eHNsOm5hbWVzcGFjZS1hbGlhcyBzdHlsZXNoZWV0LXByZWZpeD0ieHNvIiByZXN1bHQtcHJlZml4PSJ4c2wiLz4KLSAgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgCi0gIDx4c286c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhodG1sIj4KLSAgICAKLSAgPHhzbzpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+Ci0gICAgCi0gIDx4c286dGVtcGxhdGUgbWF0Y2g9Im5vZGUoKXxAKiI+Ci0gICAgPHhzbzpjb3B5PgotICAgICAgPHhzbzphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCl8QCoiLz4KLSAgICA8L3hzbzpjb3B5PgotICA8L3hzbzp0ZW1wbGF0ZT4KLSAgCi0gIDx4c286dGVtcGxhdGUgbWF0Y2g9IkQ6ZGlzcGxheW5hbWUiPgotICAgIDx4c2w6aWYgdGVzdD0iLy9EOnByb3AvRDpkaXNwbGF5bmFtZSI+PHhzbzpjb3B5LW9mIHNlbGVjdD0iLiIvPjwveHNsOmlmPgotICA8L3hzbzp0ZW1wbGF0ZT4KLSAgCi0gIDx4c286dGVtcGxhdGUgbWF0Y2g9IkQ6Z2V0bGFzdG1vZGlmaWVkIj4KLSAgICA8eHNsOmlmIHRlc3Q9Ii8vRDpwcm9wL0Q6Z2V0bGFzdG1vZGlmaWVkIj48eHNvOmNvcHktb2Ygc2VsZWN0PSIuIi8+PC94c2w6aWY+Ci0gIDwveHNvOnRlbXBsYXRlPgotICAKLSAgPHhzbzp0ZW1wbGF0ZSBtYXRjaD0iRDpjcmVhdGlvbmRhdGUiPgotICAgIDx4c2w6aWYgdGVzdD0iLy9EOnByb3AvRDpjcmVhdGlvbmRhdGUiPjx4c286Y29weS1vZiBzZWxlY3Q9Ii4iLz48L3hzbDppZj4KLSAgPC94c286dGVtcGxhdGU+Ci0gIAotICA8eHNvOnRlbXBsYXRlIG1hdGNoPSJEOnJlc291cmNldHlwZSI+Ci0gICAgPHhzbDppZiB0ZXN0PSIvL0Q6cHJvcC9EOnJlc291cmNldHlwZSI+PHhzbzpjb3B5LW9mIHNlbGVjdD0iLiIvPjwveHNsOmlmPgotICA8L3hzbzp0ZW1wbGF0ZT4KLSAgCi0gIDx4c286dGVtcGxhdGUgbWF0Y2g9IkQ6Z2V0Y29udGVudHR5cGUiPgotICAgIDx4c2w6aWYgdGVzdD0iLy9EOnByb3AvRDpnZXRjb250ZW50dHlwZSI+PHhzbzpjb3B5LW9mIHNlbGVjdD0iLiIvPjwveHNsOmlmPgotICA8L3hzbzp0ZW1wbGF0ZT4KLSAgCi0gIDx4c286dGVtcGxhdGUgbWF0Y2g9IkQ6Z2V0Y29udGVudGxlbmd0aCI+Ci0gICAgPHhzbDppZiB0ZXN0PSIvL0Q6cHJvcC9EOmdldGNvbnRlbnRsZW5ndGgiPjx4c286Y29weS1vZiBzZWxlY3Q9Ii4iLz48L3hzbDppZj4KLSAgPC94c286dGVtcGxhdGU+Ci0gIAotICA8eHNvOnRlbXBsYXRlIG1hdGNoPSJEOmxvY2tkaXNjb3ZlcnkiPgotICAgIDx4c2w6aWYgdGVzdD0iLy9EOnByb3AvRDpsb2NrZGlzY292ZXJ5Ij48eHNvOmNvcHktb2Ygc2VsZWN0PSIuIi8+PC94c2w6aWY+Ci0gIDwveHNvOnRlbXBsYXRlPgotICAKLSAgPC94c286c3R5bGVzaGVldD4KLSAgCi0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy93ZWJkYXYveHNsdC9sb2NrLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi94c2x0L2xvY2sueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGYwYThjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3dlYmRhdi94c2x0L2xvY2sueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLSAgICA8eHNsOnBhcmFtIG5hbWU9InVzZXJpZCIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iZG9jaWQiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgICAgICA8RDpwcm9wIHhtbG5zOkQ9IkRBVjoiPgotICAgICAgICAgIDxEOmxvY2tkaXNjb3Zlcnk+Ci0gICAgICAgICAgICAgICA8RDphY3RpdmVsb2NrPgotICAgICAgICAgICAgICAgICAgICA8RDpsb2NrdHlwZT48RDp3cml0ZS8+PC9EOmxvY2t0eXBlPgotICAgICAgICAgICAgICAgICAgICA8RDpsb2Nrc2NvcGU+PEQ6ZXhjbHVzaXZlLz48L0Q6bG9ja3Njb3BlPgotICAgICAgICAgICAgICAgICAgICA8RDpkZXB0aD5JbmZpbml0eTwvRDpkZXB0aD4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIvLypbbG9jYWwtbmFtZSgpPSdvd25lciddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxEOm93bmVyPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvLypbbG9jYWwtbmFtZSgpPSdvd25lciddIi8+PC9EOm93bmVyPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgPEQ6dGltZW91dD5TZWNvbmQtNjA0ODAwPC9EOnRpbWVvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxEOmxvY2t0b2tlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8RDpocmVmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb2NpZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgIDwvRDpocmVmPgotICAgICAgICAgICAgICAgICAgICA8L0Q6bG9ja3Rva2VuPgotICAgICAgICAgICAgICAgPC9EOmFjdGl2ZWxvY2s+Ci0gICAgICAgICAgPC9EOmxvY2tkaXNjb3Zlcnk+Ci0gICAgICAgIDwvRDpwcm9wPgkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9jb25maWcvY29jb29uLXhjb25mL3Jlc291cmNlLXR5cGUteGh0bWwueGNvbmYgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9jb25maWcvY29jb29uLXhjb25mL3Jlc291cmNlLXR5cGUteGh0bWwueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNjI0YjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvY29uZmlnL2NvY29vbi14Y29uZi9yZXNvdXJjZS10eXBlLXhodG1sLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vcmVzb3VyY2UtdHlwZXMiIHVubGVzcz0iL2NvY29vbi9yZXNvdXJjZS10eXBlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAneGh0bWwnXSI+Ci0gIAotICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9InhodG1sIgotICAgIGxvZ2dlcj0ibGVueWEucmVzb3VyY2V0eXBlcy54aHRtbCIKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uUmVzb3VyY2VUeXBlSW1wbCI+Ci0gICAgPHNjaGVtYSAKLSAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8wLjkiCi0gICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC5ybmciLz4KLSAgICAKLSAgICA8IS0tIERlZmF1bHQgdGltZSBpbiBzZWNvbmRzIHVudGlsIHRoZSByZXNvdXJjZS10eXBlIGhhcyBleHBpcmVkIC0tPiAgCi0gICAgPGV4cGlyZXMgc2Vjb25kcz0iMzYwMCIgLz4KLSAgICAKLSAgICA8c2FtcGxlcyB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9zYW1wbGVzL3NhbXBsZXMueG1sIi8+Ci0gICAgCi0gICAgPGxpbmstYXR0cmlidXRlIHhwYXRoPSIvLypbbmFtZXNwYWNlLXVyaSgpID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnXS9AaHJlZiIvPgotICAgIDxsaW5rLWF0dHJpYnV0ZSB4cGF0aD0iLy8qW25hbWVzcGFjZS11cmkoKSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJ10vQGRhdGEiLz4KLSAgICA8bGluay1hdHRyaWJ1dGUgeHBhdGg9Ii8vKltuYW1lc3BhY2UtdXJpKCkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCddL0BzcmMiLz4KLSAgICA8Zm9ybWF0IG5hbWU9InhodG1sIiB1cmk9ImNvY29vbjovL21vZHVsZXMveGh0bWwveGh0bWwueG1sIi8+Ci0gICAgPGZvcm1hdCBuYW1lPSJ3ZWJkYXZHRVQiIHVyaT0iY29jb29uOi8vbW9kdWxlcy94aHRtbC9kYXZnZXQueG1sIi8+Ci0gICAgPGZvcm1hdCBuYW1lPSJsdWNlbmVJbmRleCIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL3hodG1sL2x1Y2VuZS1pbmRleCIvPgotICAgIDwhLS0gInhzbHQtY2xlYW4iIGZvcm1hdCBpcyB1c2VkIGJ5IHdlYkRBViAoYW5kIG90aGVyIGVkaXRvcnM/KSB0byAiY2xlYW4iIHhtbCBjb250ZW50IGJlZm9yZSBpdCBpcyB2YWxpZGF0ZWQvc2F2ZWQgLS0+IAotICAgIDxmb3JtYXQgbmFtZT0ieHNsdC1jbGVhbiIgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwveHNsdC9jbGVhbi14aHRtbC54c2wiLz4KLSAgICA8Zm9ybWF0IG5hbWU9Imljb24iIHVyaT0iY29jb29uOi8vbW9kdWxlcy94aHRtbC9pY29uIi8+Ci0gICAgCi0gIDwvY29tcG9uZW50LWluc3RhbmNlPgotICAKLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9jb25maWcvbWVudS54c3AgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9jb25maWcvbWVudS54c3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2Y3OTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvY29uZmlnL21lbnUueHNwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBnZW5lcmljLnhzcCAxNTU4MDYgMjAwNS0wMy0wMSAxNzo1NTo0MlogYW5kcmVhcyAkIC0tPgotCi08eHNwOnBhZ2UgCi0gICAgbGFuZ3VhZ2U9ImphdmEiIAotICAgIHhtbG5zOnhzcD0iaHR0cDovL2FwYWNoZS5vcmcveHNwIgotICAgIHhtbG5zOnhzcC1yZXF1ZXN0PSJodHRwOi8vYXBhY2hlLm9yZy94c3AvcmVxdWVzdC8yLjAiCi0gICAgeG1sbnM6aW5wdXQ9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi94c3AvaW5wdXQvMS4wIgotICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gICAgeG1sbnM6d2Y9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS93b3JrZmxvdy8xLjAiCi0gICAgeG1sbnM6dWM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91c2VjYXNlLzEuMCIKLSAgICB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21lbnViYXIvMS4wIgotPgotCi0gIDx4c3A6c3RydWN0dXJlPgotICAgIDx4c3A6aW5jbHVkZT5vcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDwveHNwOmluY2x1ZGU+Ci0gICAgPHhzcDppbmNsdWRlPm9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uPC94c3A6aW5jbHVkZT4KLSAgPC94c3A6c3RydWN0dXJlPgotICAKLSAgPG1lbnU+Ci0KLSAgICA8bWVudXM+Ci0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkZpbGUiPgotICAgICAgICA8YmxvY2sgYXJlYXM9InNpdGUgYXV0aG9yaW5nIiBpZD0iY3JlYXRlIj4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJzaXRlbWFuYWdlbWVudC5jcmVhdGUiIGhyZWY9Ij9kb2N0eXBlPXhodG1sIj48aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+TmV3IC4uLiBEb2N1bWVudDwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48aTE4bjp0ZXh0PnJlc291cmNlVHlwZS14aHRtbDwvaTE4bjp0ZXh0PjwvaTE4bjpwYXJhbT4KLSAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgPC9pdGVtPgotICAgICAgICA8L2Jsb2NrPgotICAgICAgPC9tZW51PgotICAgICAgCi0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkVkaXQiPgotICAgICAgICA8eHNwOmxvZ2ljPgotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIE9iamVjdCBkb2MgPSA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIGFzPSJvYmplY3QiIG5hbWU9ImRvY3VtZW50Ii8+OwotICAgICAgICAgICAgICBpZiAoZG9jIGluc3RhbmNlb2YgRG9jdW1lbnQgJmFtcDsmYW1wOyAoKERvY3VtZW50KSBkb2MpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgZG9jdHlwZSA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9InN0cmluZyIgbmFtZT0iZG9jdW1lbnQtdHlwZSIvPjsKLSAgICAgICAgICAgICAgICAgIGlmICgieGh0bWwiLmVxdWFscyhkb2N0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgIDxibG9jayBhcmVhcz0iYXV0aG9yaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9Imt1cHUuZWRpdCIgaHJlZj0iPyI+PGkxOG46dGV4dD5XaXRoIEt1cHU8L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJieGUuZWRpdCIgaHJlZj0iPyI+PGkxOG46dGV4dD5XaXRoIEJYRTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9ImVkaXRvcnMuZm9ybXMiPjx4c3A6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c3A6ZXhwcj4iP2Zvcm09IiArIGRvY3R5cGU8L3hzcDpleHByPjwveHNwOmF0dHJpYnV0ZT48aTE4bjp0ZXh0PldpdGggRm9ybXM8L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJlZGl0b3JzLm9uZWZvcm0iIGhyZWY9Ij8iPjxpMThuOnRleHQ+V2l0aCBvbmUgRm9ybTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICA8L2Jsb2NrPgotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIG1lbnUgZ2VuZXJhdGlvbjogIiwgZSk7Ci0gICAgICAgICAgfQotICAgICAgICA8L3hzcDpsb2dpYz4KLSAgICAgIDwvbWVudT4KLSAgICAgIAotICAgIDwvbWVudXM+Ci0gICAgCi0gIDwvbWVudT4KLTwveHNwOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9jb25maWcvbW9kdWxlLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTdlM2YwMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnhodG1sPC9pZD4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5YSFRNTDwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+WEhUTUwtYmFzZWQgcmVzb3VyY2UgdHlwZTwvZGVzY3JpcHRpb24+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL21lbnVzLnhtYXAgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9tZW51cy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDkyNzZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL21lbnVzLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG1lbnVzLnhtYXAgMTc4NzM4IDIwMDUtMDUtMjcgMDM6NDI6MDlaIGdyZWdvciAkIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAJCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioqIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJzZXJ2ZXJwYWdlcyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvY29uZmlnL21lbnUueHNwIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMGUxZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU2NCAyMDA2LTA5LTE1IDEwOjEzOjE2WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0icmVzb3VyY2VUeXBlLXhodG1sIj5YSFRNTDwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTFiODZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aS54bWwgNDQ2NTY0IDIwMDYtMDktMTUgMTA6MTM6MTZaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJkZSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUteGh0bWwiPlhIVE1MPC9tZXNzYWdlPg0KLSAgDQotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL2ljb25zL3hodG1sLmdpZiBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9pY29ucy94aHRtbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDkyZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL2ljb25zL3hodG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxOTlhMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogeGh0bWwucm5nIDE2ODA5NyAyMDA1LTA1LTA0IDA3OjQ5OjIyWiBqd2thbHR6ICQgLS0+Ci0KLTwhLS0rCi0gICAgfCBYSFRNTCBkb2N0eXBlCi0gICAgKy0tPgotCi08IS0tKwotICAgIHwgTmFtZXNwYWNlczoKLSAgICB8IGxlbnlhIG5hbWVzcGFjZSBpcyByZXF1aXJlZCBmb3IgZW1iZWRkaW5nIGFzc2V0cy4KLSAgICArLS0+Ci0KLTxncmFtbWFyIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIgotICAgICAgICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIgotICAgICAgICAgPgotCi0KLTwhLS0gaW5jbHVkZSBMZW55YSBzY2hlbWEsIGZvciBMZW55YSBhc3NldHMgd2l0aGluIHhodG1sIC0tPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9yZXNvdXJjZXMvc2NoZW1hcy9sZW55YS5ybmciLz4KLQotPCEtLSBpbmNsdWRlIG9yaWdpbmFsIFhIVE1MIGJhc2ljIHNjaGVtYSAtLT4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC94aHRtbC1iYXNpYy5ybmciPgotPCEtLSBjaGFuZ2UgdG8gdGhpcyB0byBpbmNsdWRlIFhIVE1MIHRyYW5zaXRpb25hbCBzY2hlbWEgCi08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwveGh0bWwucm5nIj4KLS0tPgotPCEtLSBjaGFuZ2UgdG8gdGhpcyB0byBpbmNsdWRlIFhIVE1MIHN0cmljdCBzY2hlbWEgCi08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwveGh0bWwtc3RyaWN0LnJuZyI+Ci0tLT4KLQotICA8ZGVmaW5lIG5hbWU9Imh0bWwiPgotICAgIDxlbGVtZW50IG5hbWU9Imh0bWwiPgotICAgICAgPHJlZiBuYW1lPSJodG1sLmF0dGxpc3QiLz4KLSAgICAgIDxyZWYgbmFtZT0iaGVhZCIvPgotICAgICAgPHJlZiBuYW1lPSJib2R5Ii8+Ci0gICAgPC9lbGVtZW50PgotICA8L2RlZmluZT4KLQotICA8ZGVmaW5lIG5hbWU9Imh0bWwuYXR0bGlzdCI+Ci0gICAgPHJlZiBuYW1lPSJYSFRNTC52ZXJzaW9uLmF0dHJpYiIvPgotICAgIDxyZWYgbmFtZT0iSTE4bi5hdHRyaWIiLz4KLSAgPC9kZWZpbmU+Ci0KLTwvaW5jbHVkZT4KLQotCi08IS0tIGFkZGl0aW9uYWwgYmxvY2sgZWxlbWVudHMgLS0+Ci08ZGVmaW5lIG5hbWU9IkJsb2NrLmNsYXNzIiBjb21iaW5lPSJjaG9pY2UiPgotICA8Y2hvaWNlPgotICAgIDxyZWYgbmFtZT0ibGVueWEuYXNzZXQiLz4KLSAgPC9jaG9pY2U+Ci08L2RlZmluZT4KLQotCi08L2dyYW1tYXI+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9leGNsdWRlL2Jhc2ljLXRhYmxlLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL2V4Y2x1ZGUvYmFzaWMtdGFibGUucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQzNDMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL2V4Y2x1ZGUvYmFzaWMtdGFibGUucm5nCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGJhc2ljLXRhYmxlLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLSAgICAKLTwhLS0KLSAgQ2hlY2tzIGV4Y2x1c2lvbnMgYXBwbHlpbmcgdG8gYmFzaWMtdGFibGUgbW9kdWxlLgotICBUaGlzIHNjaGVtYSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIHhodG1sLnJuZy4KLS0tPgotPGdyYW1tYXIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbG5zPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCI+Ci0gIDxzdGFydD4KLSAgICA8cmVmIG5hbWU9Im5vcm1hbEVsZW1lbnQiLz4KLSAgPC9zdGFydD4KLSAgPGRlZmluZSBuYW1lPSJub3JtYWxFbGVtZW50Ij4KLSAgICA8ZWxlbWVudD4KLSAgICAgIDxhbnlOYW1lPgotICAgICAgICA8ZXhjZXB0PgotICAgICAgICAgIDxuYW1lPnRhYmxlPC9uYW1lPgotICAgICAgICA8L2V4Y2VwdD4KLSAgICAgIDwvYW55TmFtZT4KLSAgICAgIDxyZWYgbmFtZT0ibm9ybWFsQ29udGVudCIvPgotICAgIDwvZWxlbWVudD4KLSAgPC9kZWZpbmU+Ci0gIDxkZWZpbmUgbmFtZT0ibm9ybWFsQ29udGVudCI+Ci0gICAgPHplcm9Pck1vcmU+Ci0gICAgICA8Y2hvaWNlPgotICAgICAgICA8cmVmIG5hbWU9Im5vcm1hbEVsZW1lbnQiLz4KLSAgICAgICAgPHJlZiBuYW1lPSJ0YWJsZUVsZW1lbnQiLz4KLSAgICAgICAgPHJlZiBuYW1lPSJhbnlBdHRyaWJ1dGUiLz4KLSAgICAgICAgPHRleHQvPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC96ZXJvT3JNb3JlPgotICA8L2RlZmluZT4KLSAgPGRlZmluZSBuYW1lPSJ0YWJsZUVsZW1lbnQiPgotICAgIDxlbGVtZW50IG5hbWU9InRhYmxlIj4KLSAgICAgIDxyZWYgbmFtZT0idGFibGVDb250ZW50Ii8+Ci0gICAgPC9lbGVtZW50PgotICA8L2RlZmluZT4KLSAgPGRlZmluZSBuYW1lPSJ0YWJsZUNvbnRlbnQiPgotICAgIDx6ZXJvT3JNb3JlPgotICAgICAgPGNob2ljZT4KLSAgICAgICAgPGVsZW1lbnQ+Ci0gICAgICAgICAgPGFueU5hbWU+Ci0gICAgICAgICAgICA8ZXhjZXB0PgotICAgICAgICAgICAgICA8bmFtZT50YWJsZTwvbmFtZT4KLSAgICAgICAgICAgIDwvZXhjZXB0PgotICAgICAgICAgIDwvYW55TmFtZT4KLSAgICAgICAgICA8cmVmIG5hbWU9InRhYmxlQ29udGVudCIvPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDxyZWYgbmFtZT0iYW55QXR0cmlidXRlIi8+Ci0gICAgICAgIDx0ZXh0Lz4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvemVyb09yTW9yZT4KLSAgPC9kZWZpbmU+Ci0gIDxkZWZpbmUgbmFtZT0iYW55QXR0cmlidXRlIj4KLSAgICA8YXR0cmlidXRlPgotICAgICAgPGFueU5hbWUvPgotICAgIDwvYXR0cmlidXRlPgotICA8L2RlZmluZT4KLTwvZ3JhbW1hcj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL2V4Y2x1ZGUvYmFzaWMucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvZXhjbHVkZS9iYXNpYy5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTUxNGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvZXhjbHVkZS9iYXNpYy5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGJhc2ljLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLSAgICAKLTwhLS0KLSAgQ2hlY2tzIGV4Y2x1c2lvbnMgYXBwbHlpbmcgdG8gImEiIGFuZCAicHJlIiBlbGVtZW50cy4KLSAgVGhpcyBzY2hlbWEgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byB4aHRtbC5ybmcuCi0tLT4KLTxncmFtbWFyIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotICA8c3RhcnQ+Ci0gICAgPHJlZiBuYW1lPSJub3JtYWxFbGVtZW50Ii8+Ci0gIDwvc3RhcnQ+Ci0gIDxkZWZpbmUgbmFtZT0ibm9ybWFsRWxlbWVudCI+Ci0gICAgPGVsZW1lbnQ+Ci0gICAgICA8YW55TmFtZT4KLSAgICAgICAgPGV4Y2VwdD4KLSAgICAgICAgICA8bmFtZT5hPC9uYW1lPgotICAgICAgICAgIDxuYW1lPnByZTwvbmFtZT4KLSAgICAgICAgPC9leGNlcHQ+Ci0gICAgICA8L2FueU5hbWU+Ci0gICAgICA8cmVmIG5hbWU9Im5vcm1hbENvbnRlbnQiLz4KLSAgICA8L2VsZW1lbnQ+Ci0gIDwvZGVmaW5lPgotICA8ZGVmaW5lIG5hbWU9Im5vcm1hbENvbnRlbnQiPgotICAgIDx6ZXJvT3JNb3JlPgotICAgICAgPGNob2ljZT4KLSAgICAgICAgPHJlZiBuYW1lPSJub3JtYWxFbGVtZW50Ii8+Ci0gICAgICAgIDxyZWYgbmFtZT0iYUVsZW1lbnQiLz4KLSAgICAgICAgPHJlZiBuYW1lPSJwcmVFbGVtZW50Ii8+Ci0gICAgICAgIDxyZWYgbmFtZT0iYW55QXR0cmlidXRlIi8+Ci0gICAgICAgIDx0ZXh0Lz4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvemVyb09yTW9yZT4KLSAgPC9kZWZpbmU+Ci0gIDxkZWZpbmUgbmFtZT0iYUVsZW1lbnQiPgotICAgIDxlbGVtZW50IG5hbWU9ImEiPgotICAgICAgPHJlZiBuYW1lPSJhQ29udGVudCIvPgotICAgIDwvZWxlbWVudD4KLSAgPC9kZWZpbmU+Ci0gIDxkZWZpbmUgbmFtZT0iYUNvbnRlbnQiPgotICAgIDx6ZXJvT3JNb3JlPgotICAgICAgPGNob2ljZT4KLSAgICAgICAgPGVsZW1lbnQ+Ci0gICAgICAgICAgPGFueU5hbWU+Ci0gICAgICAgICAgICA8ZXhjZXB0PgotICAgICAgICAgICAgICA8bmFtZT5hPC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT5wcmU8L25hbWU+Ci0gICAgICAgICAgICA8L2V4Y2VwdD4KLSAgICAgICAgICA8L2FueU5hbWU+Ci0gICAgICAgICAgPHJlZiBuYW1lPSJhQ29udGVudCIvPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDxyZWYgbmFtZT0iYW55QXR0cmlidXRlIi8+Ci0gICAgICAgIDx0ZXh0Lz4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvemVyb09yTW9yZT4KLSAgPC9kZWZpbmU+Ci0gIDxkZWZpbmUgbmFtZT0icHJlRWxlbWVudCI+Ci0gICAgPGVsZW1lbnQgbmFtZT0icHJlIj4KLSAgICAgIDxyZWYgbmFtZT0icHJlQ29udGVudCIvPgotICAgIDwvZWxlbWVudD4KLSAgPC9kZWZpbmU+Ci0gIDxkZWZpbmUgbmFtZT0icHJlQ29udGVudCI+Ci0gICAgPHplcm9Pck1vcmU+Ci0gICAgICA8Y2hvaWNlPgotICAgICAgICA8ZWxlbWVudD4KLSAgICAgICAgICA8YW55TmFtZT4KLSAgICAgICAgICAgIDxleGNlcHQ+Ci0gICAgICAgICAgICAgIDxuYW1lPmE8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPnByZTwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+aW1nPC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT5vYmplY3Q8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmFwcGxldDwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+YmlnPC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT5zbWFsbDwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+c3ViPC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT5zdXA8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmZvbnQ8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmJhc2Vmb250PC9uYW1lPgotICAgICAgICAgICAgPC9leGNlcHQ+Ci0gICAgICAgICAgPC9hbnlOYW1lPgotICAgICAgICAgIDxyZWYgbmFtZT0icHJlQ29udGVudCIvPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDxyZWYgbmFtZT0iYVByZUVsZW1lbnQiLz4KLSAgICAgICAgPHJlZiBuYW1lPSJhbnlBdHRyaWJ1dGUiLz4KLSAgICAgICAgPHRleHQvPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC96ZXJvT3JNb3JlPgotICA8L2RlZmluZT4KLSAgPGRlZmluZSBuYW1lPSJhUHJlRWxlbWVudCI+Ci0gICAgPGVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgICA8cmVmIG5hbWU9ImFQcmVDb250ZW50Ii8+Ci0gICAgPC9lbGVtZW50PgotICA8L2RlZmluZT4KLSAgPGRlZmluZSBuYW1lPSJhUHJlQ29udGVudCI+Ci0gICAgPHplcm9Pck1vcmU+Ci0gICAgICA8Y2hvaWNlPgotICAgICAgICA8ZWxlbWVudD4KLSAgICAgICAgICA8YW55TmFtZT4KLSAgICAgICAgICAgIDxleGNlcHQ+Ci0gICAgICAgICAgICAgIDxuYW1lPmE8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPnByZTwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+aW1nPC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT5vYmplY3Q8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmFwcGxldDwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+YmlnPC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT5zbWFsbDwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+c3ViPC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT5zdXA8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmZvbnQ8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmJhc2Vmb250PC9uYW1lPgotICAgICAgICAgICAgPC9leGNlcHQ+Ci0gICAgICAgICAgPC9hbnlOYW1lPgotICAgICAgICAgIDxyZWYgbmFtZT0iYVByZUNvbnRlbnQiLz4KLSAgICAgICAgPC9lbGVtZW50PgotICAgICAgICA8cmVmIG5hbWU9ImFueUF0dHJpYnV0ZSIvPgotICAgICAgICA8dGV4dC8+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L3plcm9Pck1vcmU+Ci0gIDwvZGVmaW5lPgotICA8ZGVmaW5lIG5hbWU9ImFueUF0dHJpYnV0ZSI+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgIDxhbnlOYW1lLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9kZWZpbmU+Ci08L2dyYW1tYXI+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9leGNsdWRlL2Zvcm0ucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvZXhjbHVkZS9mb3JtLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdlYzA4Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9leGNsdWRlL2Zvcm0ucm5nCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBmb3JtLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPCEtLQotICBDaGVja3MgZXhjbHVzaW9ucyBhcHBseWluZyB0byBmb3JtIGFuZCBiYXNpYy1mb3JtIG1vZHVsZXMuCi0gIFRoaXMgc2NoZW1hIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8geGh0bWwucm5nLgotLS0+Ci08Z3JhbW1hciBucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLSAgPHN0YXJ0PgotICAgIDxyZWYgbmFtZT0ibm9ybWFsRWxlbWVudCIvPgotICA8L3N0YXJ0PgotICA8ZGVmaW5lIG5hbWU9Im5vcm1hbEVsZW1lbnQiPgotICAgIDxlbGVtZW50PgotICAgICAgPGFueU5hbWU+Ci0gICAgICAgIDxleGNlcHQ+Ci0gICAgICAgICAgPG5hbWU+Zm9ybTwvbmFtZT4KLSAgICAgICAgICA8bmFtZT5sYWJlbDwvbmFtZT4KLSAgICAgICAgICA8bmFtZT5idXR0b248L25hbWU+Ci0gICAgICAgIDwvZXhjZXB0PgotICAgICAgPC9hbnlOYW1lPgotICAgICAgPHJlZiBuYW1lPSJub3JtYWxDb250ZW50Ii8+Ci0gICAgPC9lbGVtZW50PgotICA8L2RlZmluZT4KLSAgPGRlZmluZSBuYW1lPSJub3JtYWxDb250ZW50Ij4KLSAgICA8emVyb09yTW9yZT4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDxyZWYgbmFtZT0ibm9ybWFsRWxlbWVudCIvPgotICAgICAgICA8cmVmIG5hbWU9ImZvcm1FbGVtZW50Ii8+Ci0gICAgICAgIDxyZWYgbmFtZT0ibGFiZWxFbGVtZW50Ii8+Ci0gICAgICAgIDxyZWYgbmFtZT0iYnV0dG9uRWxlbWVudCIvPgotICAgICAgICA8cmVmIG5hbWU9ImFueUF0dHJpYnV0ZSIvPgotICAgICAgICA8dGV4dC8+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L3plcm9Pck1vcmU+Ci0gIDwvZGVmaW5lPgotICA8ZGVmaW5lIG5hbWU9ImZvcm1FbGVtZW50Ij4KLSAgICA8ZWxlbWVudCBuYW1lPSJmb3JtIj4KLSAgICAgIDxyZWYgbmFtZT0iZm9ybUNvbnRlbnQiLz4KLSAgICA8L2VsZW1lbnQ+Ci0gIDwvZGVmaW5lPgotICA8ZGVmaW5lIG5hbWU9ImZvcm1Db250ZW50Ij4KLSAgICA8emVyb09yTW9yZT4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDxlbGVtZW50PgotICAgICAgICAgIDxhbnlOYW1lPgotICAgICAgICAgICAgPGV4Y2VwdD4KLSAgICAgICAgICAgICAgPG5hbWU+Zm9ybTwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+bGFiZWw8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmJ1dHRvbjwvbmFtZT4KLSAgICAgICAgICAgIDwvZXhjZXB0PgotICAgICAgICAgIDwvYW55TmFtZT4KLSAgICAgICAgICA8cmVmIG5hbWU9ImZvcm1Db250ZW50Ii8+Ci0gICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgPHJlZiBuYW1lPSJsYWJlbEVsZW1lbnQiLz4KLSAgICAgICAgPHJlZiBuYW1lPSJidXR0b25FbGVtZW50Ii8+Ci0gICAgICAgIDxyZWYgbmFtZT0iYW55QXR0cmlidXRlIi8+Ci0gICAgICAgIDx0ZXh0Lz4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvemVyb09yTW9yZT4KLSAgPC9kZWZpbmU+Ci0gIDxkZWZpbmUgbmFtZT0ibGFiZWxFbGVtZW50Ij4KLSAgICA8ZWxlbWVudCBuYW1lPSJsYWJlbCI+Ci0gICAgICA8cmVmIG5hbWU9ImxhYmVsQ29udGVudCIvPgotICAgIDwvZWxlbWVudD4KLSAgPC9kZWZpbmU+Ci0gIDxkZWZpbmUgbmFtZT0ibGFiZWxDb250ZW50Ij4KLSAgICA8emVyb09yTW9yZT4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDxlbGVtZW50PgotICAgICAgICAgIDxhbnlOYW1lPgotICAgICAgICAgICAgPGV4Y2VwdD4KLSAgICAgICAgICAgICAgPG5hbWU+Zm9ybTwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+bGFiZWw8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmJ1dHRvbjwvbmFtZT4KLSAgICAgICAgICAgIDwvZXhjZXB0PgotICAgICAgICAgIDwvYW55TmFtZT4KLSAgICAgICAgICA8cmVmIG5hbWU9ImxhYmVsQ29udGVudCIvPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDxyZWYgbmFtZT0iYnV0dG9uRWxlbWVudCIvPgotICAgICAgICA8cmVmIG5hbWU9ImFueUF0dHJpYnV0ZSIvPgotICAgICAgICA8dGV4dC8+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L3plcm9Pck1vcmU+Ci0gIDwvZGVmaW5lPgotICA8ZGVmaW5lIG5hbWU9ImJ1dHRvbkVsZW1lbnQiPgotICAgIDxlbGVtZW50IG5hbWU9ImJ1dHRvbiI+Ci0gICAgICA8cmVmIG5hbWU9ImJ1dHRvbkNvbnRlbnQiLz4KLSAgICA8L2VsZW1lbnQ+Ci0gIDwvZGVmaW5lPgotICA8ZGVmaW5lIG5hbWU9ImJ1dHRvbkNvbnRlbnQiPgotICAgIDx6ZXJvT3JNb3JlPgotICAgICAgPGNob2ljZT4KLSAgICAgICAgPGVsZW1lbnQ+Ci0gICAgICAgICAgPGFueU5hbWU+Ci0gICAgICAgICAgICA8ZXhjZXB0PgotICAgICAgICAgICAgICA8bmFtZT5hPC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT5pbnB1dDwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+c2VsZWN0PC9uYW1lPgotICAgICAgICAgICAgICA8bmFtZT50ZXh0YXJlYTwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+bGFiZWw8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmJ1dHRvbjwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+Zm9ybTwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+aXNpbmRleDwvbmFtZT4KLSAgICAgICAgICAgICAgPG5hbWU+ZmllbGRzZXQ8L25hbWU+Ci0gICAgICAgICAgICAgIDxuYW1lPmlmcmFtZTwvbmFtZT4KLSAgICAgICAgICAgIDwvZXhjZXB0PgotICAgICAgICAgIDwvYW55TmFtZT4KLSAgICAgICAgICA8cmVmIG5hbWU9ImJ1dHRvbkNvbnRlbnQiLz4KLSAgICAgICAgPC9lbGVtZW50PgotICAgICAgICA8cmVmIG5hbWU9ImFueUF0dHJpYnV0ZSIvPgotICAgICAgICA8dGV4dC8+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L3plcm9Pck1vcmU+Ci0gIDwvZGVmaW5lPgotICA8ZGVmaW5lIG5hbWU9ImFueUF0dHJpYnV0ZSI+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgIDxhbnlOYW1lLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9kZWZpbmU+Ci08L2dyYW1tYXI+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9pbmRleC5odG1sIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5YWZhNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGluZGV4Lmh0bWwgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTxoZWFkPgotPHRpdGxlPk1vZHVsYXJpemF0aW9uIG9mIFhIVE1MIGluIFJFTEFYIE5HPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPk1vZHVsYXJpemF0aW9uIG9mIFhIVE1MIGluIFJFTEFYIE5HPC9oMT4KLQotPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYW4gaW1wbGVtZW50YXRhaW9uIGluIFJFTEFYIE5HIG9mIHRoZQotbW9kdWxhcml6YXRpb24gb2YgWEhUTUwgc3BlY2lmaWVkIGJ5IHRoZSA8YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteGh0bWwtbW9kdWxhcml6YXRpb24tMjAwMTA0MTAiCi0+TW9kdWxhcml6YXRpb24gb2YgWEhUTUwgUmVjb21tZW5kYXRpb248L2E+LjwvcD4KLQotPHA+VGhlIFJFTEFYIE5HIHNjaGVtYSBoYXMgbm90IGJlZW4gbWVjaGFuaWNhbGx5IGRlcml2ZWQgZnJvbSB0aGUgRFREcy4KLVJhdGhlciwgaXQgaGFzIGJlZW4gaGFuZC1jcmFmdGVkIHNvIGFzIHRvIHByb2R1Y2UgYSBnb29kIHF1YWxpdHkgUkVMQVggTkcKLXNjaGVtYS4gIEhvd2V2ZXIsIGl0IG1heSB3ZWxsIGNvbnRhaW4gYnVncy48L3A+Ci0KLTxwPlRoZSA8YSBocmVmPSJtb2R1bGVzIj48Y29kZT5tb2R1bGVzPC9jb2RlPjwvYT4gZGlyZWN0b3J5IGNvbnRhaW5zCi1hbGwgdGhlIG1vZHVsZXM7IDxhCi1ocmVmPSJ4aHRtbC1iYXNpYy5ybmciPjxjb2RlPnhodG1sLWJhc2ljLnJuZzwvY29kZT48L2E+IHVzZXMgdGhlCi1tb2R1bGVzIHRvIGltcGxlbWVudCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy8iPlhIVE1MCi1CYXNpYzwvYT47IDxhCi1ocmVmPSJ4aHRtbC1zdHJpY3Qucm5nIj48Y29kZT54aHRtbC1zdHJpY3Qucm5nPC9jb2RlPjwvYT4gdXNlcyB0aGUKLW1vZHVsZXMgdG8gaW1wbGVtZW50IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS8iPlhIVE1MCi0xLjA8L2E+IHN0cmljdDsgPGEgaHJlZj0ieGh0bWwucm5nIj48Y29kZT54aHRtbC5ybmc8L2NvZGU+PC9hPiB1c2VzCi10aGUgbW9kdWxlcyB0byBpbXBsZW1lbnQgdGhlIHVuaW9uIG9mIDxhCi1ocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvIj5YSFRNTCAxLjA8L2E+IHRyYW5zaXRpb25hbCBhbmQgPGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS8iPlhIVE1MIDEuMDwvYT4gZnJhbWVzZXQuICBZb3UgY2FuCi08YSBocmVmPSJodHRwOi8vd3d3LnRoYWlvcGVuc291cmNlLmNvbS9kb3dubG9hZCI+ZG93bmxvYWQ8L2E+Ci1ldmVyeXRoaW5nIGFzIHBhcnQgb2YgdGhlIG1haW4gSmluZyBkaXN0cmlidXRpb24uICBUbyBjcmVhdGUgYSBjdXN0b20KLXZlcnNpb24gb2YgWEhUTUwsIHNpbXBseSBjb3B5IDxjb2RlPnhodG1sLnJuZzwvY29kZT4gYW5kIGRlbGV0ZSB0aGUKLWluY2x1c2lvbnMgb2YgdGhlIG1vZHVsZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQuPC9wPgotCi08cD5UaGUgYmlnZ2VzdCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIFJFTEFYIE5HIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKLURURCBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHRoZSBSRUxBWCBORyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAotcmVxdWlyZSB5b3UgdG8gY3JlYXRlIGEgbW9kZWwgbW9kdWxlIHNwZWNpZmljIHRvIHRoZSBjb21iaW5hdGlvbiBvZgotWEhUTUwgbW9kdWxlcyB5b3UgYXJlIHVzaW5nLiBJbnN0ZWFkLCBzaW1wbHkgaW5jbHVkZSB0aGUgbW9kdWxlcyB5b3UKLXdhbnQuIFRoZSBtb2R1bGVzIHRha2UgY2FyZSBvZiByZWRlZmluaW5nIHRoZSBjb250ZW50IG1vZGVscwotYXBwcm9wcmlhdGVseS48L3A+Ci0KLTxwPk5vdGUgYWxzbyB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzOjwvcD4KLQotPHVsPgotCi08bGk+VGhlIGZyYW1lcyBtb2R1bGUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBzdHJ1Y3QgbW9kdWxlLCByYXRoZXIKLXRoYW4gaW4gYWRkaXRpb24gdG8gaXQuPC9saT4KLQotPGxpPkluIHRoZSBmcmFtZXMgbW9kdWxlLCB0aGUgPGNvZGU+ZnJhbWVzZXQ8L2NvZGU+IGVsZW1lbnQgZG9lcyBub3QKLXJlc3RyaWN0IHRoZSBvcHRpb25hbCA8Y29kZT5ub2ZyYW1lczwvY29kZT4gZWxlbWVudCB0byBmb2xsb3cgYWxsIHRoZQotb3RoZXIgY2hpbGQgZWxlbWVudHMuIFhIVE1MIE1vZHVsYXJpemF0aW9uIGlzIGluY29uc2lzdGVudCB3aXRoIGJvdGgKLUhUTUwgNC4wIGFuZCBYSFRNTCAxLjAgaGVyZS48L2xpPgotCi08bGk+SW4gdGhlIGJhc2ljIHRhYmxlcyBhYnN0cmFjdCBtb2R1bGUsIHRoZSA8Y29kZT50YWJsZTwvY29kZT4KLWVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIDxjb2RlPndpZHRoPC9jb2RlPiBhdHRyaWJ1dGUuICBUaGUgWEhUTUwgUmVjIGlzCi1hbWJpZ3VvdXMgaGVyZTogdGhlIGFic3RyYWN0IG1vZHVsZSBoYXMgdGhlIGF0dHJpYnV0ZSwgYnV0IHRoZSBEVEQKLWRvZXMgbm90LjwvbGk+Ci0KLTxsaT5UaGUgb2JqZWN0IGFuZCBhcHBsZXQgbW9kdWxlcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgUkVMQVggTkcncwotYWJzZW5jZSBvZiByZXN0cmljdGlvbnMgb24gbWl4ZWQgY29udGVudCB0byBlbmZvcmNlIHRoZSByZXF1aXJlbWVudAotdGhhdCA8Y29kZT5wYXJhbTwvY29kZT5zIHByZWNlZGUgb3RoZXIgY29udGVudC48L2xpPgotCi08bGk+VGhlIGZvcm1zIG1vZHVsZSB0YWtlcyBhZHZhbnRhZ2Ugb2YgUkVMQVggTkcncyBhYnNlbmNlIG9mCi1yZXN0cmljdGlvbnMgb24gbWl4ZWQgY29udGVudCB0byBlbmZvcmNlIHRoZSByZXF1aXJlbWVudCB0aGF0IGFueQotPGNvZGU+bGVnZW5kPC9jb2RlPiBwcmVjZWRlcyBvdGhlciBjb250ZW50LjwvbGk+Ci0KLTxsaT5UaGUgUkVMQVggTkcgc2NoZW1hIGRvZXMgbm90IGVuZm9yY2UgZXhjbHVzaW9ucy4gVGhlIEhUTUwgNCBEVEQKLXVzZXMgZXhjbHVzaW9ucyBpbiBzZXZlcmFsIHBsYWNlcywgZm9yIGV4YW1wbGUsIHRvIGRpc2FsbG93IGFuCi08Y29kZT5hPC9jb2RlPiBlbGVtZW50IGZyb20gaGF2aW5nIGFuIDxjb2RlPmE8L2NvZGU+IGVsZW1lbnQgYXMgYQotZGVzY2VuZGFudC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGlzIGNvbnN0cmFpbnQgaW4gWE1MCi1EVERzLiBYSFRNTCBNb2R1bGFyaXphdGlvbiB0YWtlcyB0aGUgYXBwcm9hY2ggb2YgcGFydGlhbGx5Ci1yZXByZXNlbnRpbmcgdGhpcyByZXN0cmljdGlvbiBieSwgZm9yIGV4YW1wbGUsIGRpc2FsbG93aW5nIGFuCi08Y29kZT5hPC9jb2RlPiBlbGVtZW50IGZyb20gaGF2aW5nIGFuIDxjb2RlPmE8L2NvZGU+IGVsZW1lbnQgYXMgYQotPGVtPmNoaWxkPC9lbT4sIHdpdGhvdXQgZGlzYWxsb3dpbmcgaXQgZnJvbSBoYXZpbmcgYW4gPGNvZGU+YTwvY29kZT4KLWVsZW1lbnQgYXMgYSBub24taW1tZWRpYXRlIGRlc2NlbmRhbnQuICBUaGlzIHBhcnRpYWwgcmVzdHJpY3Rpb24gaGFzIGEKLXN1YnN0YW50aWFsIGNvc3QgaW4gaW5jcmVhc2luZyB0aGUgY29tcGxleGl0eSBhbmQgcmVkdWNpbmcgdGhlCi1tb2R1bGFyaXR5IG9mIHRoZSBzY2hlbWFzLiBUaGlzIGltcGxlbWVudGF0aW9uIGFkb3B0cyBhIGRpZmZlcmVudAotYXBwcm9hY2guIFRoZSA8YSBocmVmPSJleGNsdWRlIj48Y29kZT5leGNsdWRlPC9jb2RlPjwvYT4gZGlyZWN0b3J5Ci1jb250YWlucyBzZXBhcmF0ZSwgaW5kZXBlbmRlbnQgUkVMQVggTkcgc2NoZW1hcyB0aGF0IGVuZm9yY2UKLWV4Y2x1c2lvbnMuICBUbyBjaGVjayB1c2Ugb2YgZXhjbHVzaW9ucywgYSBkb2N1bWVudCBzaG91bGQgYmUKLXZhbGlkYXRlZCBhZ2FpbnN0IGVhY2ggb2YgdGhlc2Ugc2NoZW1hcyB0aGF0IGlzIGFwcGxpY2FibGUgPHN0cm9uZz5pbgotYWRkaXRpb24gdG88L3N0cm9uZz4gYmVpbmcgdmFsaWRhdGVkIGFnYWluc3QgdGhlIFJFTEFYIE5HIFhIVE1MIHNjaGVtYQotcHJvcGVyLiBUaGUgYXZhaWxhYmxlIHNjaGVtYXMgYXJlIGFzIGZvbGxvd3M6Ci0KLTxkbD4KLQotPGR0PjxhIGhyZWY9ImV4Y2x1ZGUvYmFzaWMucm5nIj48Y29kZT5leGNsdWRlL2Jhc2ljLnJuZzwvY29kZT48L2E+PC9kdD4KLTxkZD5jaGVja3MgdGhlIGV4Y2x1c2lvbnMgcmVsYXRpbmcgdG8gPGNvZGU+YTwvY29kZT4gYW5kCi08Y29kZT5wcmU8L2NvZGU+IGVsZW1lbnRzPC9kZD4KLQotPGR0PjxhCi1ocmVmPSJleGNsdWRlL2Jhc2ljLXRhYmxlLnJuZyI+PGNvZGU+ZXhjbHVkZS9iYXNpYy10YWJsZS5ybmc8L2NvZGU+PC9hPjwvZHQ+Ci0KLTxkZD5jaGVja3MgdGhlIGV4Y2x1c2lvbnMgcmVsYXRpbmcgdG8gYmFzaWMgdGFibGVzIG1vZHVsZSAoaS5lLgotY2hlY2tzIHRoYXQgPGNvZGU+dGFibGU8L2NvZGU+IGVsZW1lbnRzIGFyZSBub3QgbmVzdGVkKTwvZGQ+Ci0KLTxkdD48YSBocmVmPSJleGNsdWRlL2Zvcm0ucm5nIj48Y29kZT5leGNsdWRlL2Zvcm0ucm5nPC9jb2RlPjwvYT48L2R0PgotCi08ZGQ+Y2hlY2tzIHRoZSBleGNsdXNpb25zIHJlbGF0aW5nIHRvIGZvcm1zIGFuZCBiYXNpYyBmb3JtcyBtb2R1bGVzPC9kZD4KLQotPC9kbD4KLQotPC9saT4KLQotPC91bD4KLQotPGFkZHJlc3M+PGEgaHJlZj0ibWFpbHRvOmpqY0BqY2xhcmsuY29tIj5KYW1lcyBDbGFyazwvYT48L2FkZHJlc3M+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYXBwbGV0LnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYXBwbGV0LnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwN2EwMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2FwcGxldC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBhcHBsZXQucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIEFwcGxldCBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImFwcGxldCI+Ci0gIDxlbGVtZW50IG5hbWU9ImFwcGxldCI+Ci0gICAgPHJlZiBuYW1lPSJhcHBsZXQuYXR0bGlzdCIvPgotICAgIDwhLS0gTm8gcmVzdHJpY3Rpb25zIG9uIG1peGVkIGNvbnRlbnQgaW4gVFJFWC4gLS0+Ci0gICAgPHplcm9Pck1vcmU+Ci0gICAgICA8cmVmIG5hbWU9InBhcmFtIi8+Ci0gICAgPC96ZXJvT3JNb3JlPgotICAgIDxyZWYgbmFtZT0iRmxvdy5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJhcHBsZXQuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29yZS5hdHRyaWIiLz4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJhbHQiPgotICAgIDxyZWYgbmFtZT0iVGV4dC5kYXRhdHlwZSIvPgotICA8L2F0dHJpYnV0ZT4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZSIvPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2RlIi8+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvZGViYXNlIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9iamVjdCIvPgotICA8L29wdGlvbmFsPgotICA8YXR0cmlidXRlIG5hbWU9ImhlaWdodCI+Ci0gICAgPHJlZiBuYW1lPSJMZW5ndGguZGF0YXR5cGUiLz4KLSAgPC9hdHRyaWJ1dGU+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0id2lkdGgiPgotICAgIDxyZWYgbmFtZT0iTGVuZ3RoLmRhdGF0eXBlIi8+Ci0gIDwvYXR0cmlidXRlPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iSW5saW5lLmNsYXNzIiBjb21iaW5lPSJjaG9pY2UiPgotICA8cmVmIG5hbWU9ImFwcGxldCIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2F0dHJpYnMucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9hdHRyaWJzLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4ZWNmNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2F0dHJpYnMucm5nCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogYXR0cmlicy5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08IS0tIENvbW1vbiBBdHRyaWJ1dGVzIE1vZHVsZSAtLT4KLTxncmFtbWFyIHhtbG5zPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCI+Ci0KLTxkZWZpbmUgbmFtZT0iaWQuYXR0cmliIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiPgotICAgICAgPHJlZiBuYW1lPSJJRC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iY2xhc3MuYXR0cmliIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgPHJlZiBuYW1lPSJOTVRPS0VOUy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0idGl0bGUuYXR0cmliIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGl0bGUiPgotICAgICAgPHJlZiBuYW1lPSJUZXh0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJDb3JlLmF0dHJpYiI+Ci0gIDxyZWYgbmFtZT0iaWQuYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0iY2xhc3MuYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0idGl0bGUuYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJsYW5nLmF0dHJpYiI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj4KLSAgICAgIDxyZWYgbmFtZT0iTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJJMThuLmF0dHJpYiI+Ci0gIDxyZWYgbmFtZT0ibGFuZy5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkNvbW1vbi5hdHRyaWIiPgotICA8cmVmIG5hbWU9IkNvcmUuYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0iSTE4bi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkNvbW1vbklkUmVxdWlyZWQuYXR0cmliIj4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJpZCI+Ci0gICAgPHJlZiBuYW1lPSJJRC5kYXRhdHlwZSIvPgotICA8L2F0dHJpYnV0ZT4KLSAgPHJlZiBuYW1lPSJjbGFzcy5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJ0aXRsZS5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJJMThuLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jhc2Uucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9iYXNlLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1ZDdhNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jhc2Uucm5nCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogYmFzZS5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTwhLS0gQmFzZSBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImJhc2UiPgotICA8ZWxlbWVudCBuYW1lPSJiYXNlIj4KLSAgICA8cmVmIG5hbWU9ImJhc2UuYXR0bGlzdCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJiYXNlLmF0dGxpc3QiPgotICA8YXR0cmlidXRlIG5hbWU9ImhyZWYiPgotICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gIDwvYXR0cmlidXRlPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iaGVhZC5jb250ZW50IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxyZWYgbmFtZT0iYmFzZSIvPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jhc2ljLWZvcm0ucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9iYXNpYy1mb3JtLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0NzViNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jhc2ljLWZvcm0ucm5nCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGJhc2ljLWZvcm0ucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi0gICAgCi08IS0tIFNpbXBsaWZpZWQgRm9ybXMgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJmb3JtIj4KLSAgPGVsZW1lbnQgbmFtZT0iZm9ybSI+Ci0gICAgPHJlZiBuYW1lPSJmb3JtLmF0dGxpc3QiLz4KLSAgICA8IS0tIERvbid0IHVzZSBCbG9jay5tb2RlbCwgYmVjYXVzZSB0aGlzIGdldHMgcmVkZWZpbmVkIGJ5IHRoZQotCSBsZWdhY3kgbW9kdWxlLiAtLT4KLSAgICA8b25lT3JNb3JlPgotICAgICAgPHJlZiBuYW1lPSJCbG9jay5jbGFzcyIvPgotICAgIDwvb25lT3JNb3JlPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJmb3JtLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iPgotICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gIDwvYXR0cmlidXRlPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiPgotICAgICAgPGNob2ljZT4KLQk8dmFsdWU+Z2V0PC92YWx1ZT4KLQk8dmFsdWU+cG9zdDwvdmFsdWU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jdHlwZSI+Ci0gICAgICA8cmVmIG5hbWU9IkNvbnRlbnRUeXBlLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJsYWJlbCI+Ci0gIDxlbGVtZW50IG5hbWU9ImxhYmVsIj4KLSAgICA8cmVmIG5hbWU9ImxhYmVsLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJsYWJlbC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImZvciI+Ci0gICAgICA8cmVmIG5hbWU9IklEUkVGLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFjY2Vzc2tleSI+Ci0gICAgICA8cmVmIG5hbWU9IkNoYXJhY3Rlci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iaW5wdXQiPgotICA8ZWxlbWVudCBuYW1lPSJpbnB1dCI+Ci0gICAgPHJlZiBuYW1lPSJpbnB1dC5hdHRsaXN0Ii8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImlucHV0LmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSI+Ci0gICAgICA8cmVmIG5hbWU9IklucHV0VHlwZS5jbGFzcyIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIi8+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNoZWNrZWQiPgotICAgICAgPHZhbHVlPmNoZWNrZWQ8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzaXplIi8+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im1heGxlbmd0aCI+Ci0gICAgICA8cmVmIG5hbWU9Ik51bWJlci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiPgotICAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFjY2Vzc2tleSI+Ci0gICAgICA8cmVmIG5hbWU9IkNoYXJhY3Rlci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iSW5wdXRUeXBlLmNsYXNzIj4KLSAgPGNob2ljZT4KLSAgICA8dmFsdWU+dGV4dDwvdmFsdWU+Ci0gICAgPHZhbHVlPnBhc3N3b3JkPC92YWx1ZT4KLSAgICA8dmFsdWU+Y2hlY2tib3g8L3ZhbHVlPgotICAgIDx2YWx1ZT5yYWRpbzwvdmFsdWU+Ci0gICAgPHZhbHVlPnN1Ym1pdDwvdmFsdWU+Ci0gICAgPHZhbHVlPnJlc2V0PC92YWx1ZT4KLSAgICA8dmFsdWU+aGlkZGVuPC92YWx1ZT4KLSAgPC9jaG9pY2U+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJzZWxlY3QiPgotICA8ZWxlbWVudCBuYW1lPSJzZWxlY3QiPgotICAgIDxyZWYgbmFtZT0ic2VsZWN0LmF0dGxpc3QiLz4KLSAgICA8b25lT3JNb3JlPgotICAgICAgPHJlZiBuYW1lPSJvcHRpb24iLz4KLSAgICA8L29uZU9yTW9yZT4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic2VsZWN0LmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzaXplIj4KLSAgICAgIDxyZWYgbmFtZT0iTnVtYmVyLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im11bHRpcGxlIj4KLSAgICAgIDx2YWx1ZT5tdWx0aXBsZTwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLSAgIAotPGRlZmluZSBuYW1lPSJvcHRpb24iPgotICA8ZWxlbWVudCBuYW1lPSJvcHRpb24iPgotICAgIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICAgIDxvcHRpb25hbD4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VsZWN0ZWQiPgotICAgICAgICA8dmFsdWU+c2VsZWN0ZWQ8L3ZhbHVlPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9vcHRpb25hbD4KLSAgICA8b3B0aW9uYWw+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIi8+Ci0gICAgPC9vcHRpb25hbD4KLSAgICA8dGV4dC8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InRleHRhcmVhIj4KLSAgPGVsZW1lbnQgbmFtZT0idGV4dGFyZWEiPgotICAgIDxyZWYgbmFtZT0idGV4dGFyZWEuYXR0bGlzdCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0ZXh0YXJlYS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgPC9vcHRpb25hbD4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJyb3dzIj4KLSAgICA8cmVmIG5hbWU9Ik51bWJlci5kYXRhdHlwZSIvPgotICA8L2F0dHJpYnV0ZT4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzIj4KLSAgICA8cmVmIG5hbWU9Ik51bWJlci5kYXRhdHlwZSIvPgotICA8L2F0dHJpYnV0ZT4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWNjZXNza2V5Ij4KLSAgICAgIDxyZWYgbmFtZT0iQ2hhcmFjdGVyLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDx0ZXh0Lz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkZvcm0uY2xhc3MiPgotICA8cmVmIG5hbWU9ImZvcm0iLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkZvcm1jdHJsLmNsYXNzIj4KLSAgPGNob2ljZT4KLSAgICA8cmVmIG5hbWU9ImlucHV0Ii8+Ci0gICAgPHJlZiBuYW1lPSJsYWJlbCIvPgotICAgIDxyZWYgbmFtZT0ic2VsZWN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJ0ZXh0YXJlYSIvPgotICA8L2Nob2ljZT4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkJsb2NrLmNsYXNzIiBjb21iaW5lPSJjaG9pY2UiPgotICA8cmVmIG5hbWU9IkZvcm0uY2xhc3MiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklubGluZS5jbGFzcyIgY29tYmluZT0iY2hvaWNlIj4KLSAgPHJlZiBuYW1lPSJGb3JtY3RybC5jbGFzcyIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jhc2ljLXRhYmxlLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYmFzaWMtdGFibGUucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjVlY2RmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYmFzaWMtdGFibGUucm5nCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGJhc2ljLXRhYmxlLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLSAgICAKLTwhLS0gQmFzaWMgVGFibGVzIE1vZHVsZSAtLT4KLTxncmFtbWFyIHhtbG5zPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCI+Ci0KLTxkZWZpbmUgbmFtZT0idGFibGUiPgotICA8ZWxlbWVudCBuYW1lPSJ0YWJsZSI+Ci0gICAgPHJlZiBuYW1lPSJ0YWJsZS5hdHRsaXN0Ii8+Ci0gICAgPG9wdGlvbmFsPgotICAgICAgPHJlZiBuYW1lPSJjYXB0aW9uIi8+Ci0gICAgPC9vcHRpb25hbD4KLSAgICA8b25lT3JNb3JlPgotICAgICAgPHJlZiBuYW1lPSJ0ciIvPgotICAgIDwvb25lT3JNb3JlPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0YWJsZS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InN1bW1hcnkiPgotICAgICAgPHJlZiBuYW1lPSJUZXh0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjYXB0aW9uIj4KLSAgPGVsZW1lbnQgbmFtZT0iY2FwdGlvbiI+Ci0gICAgPHJlZiBuYW1lPSJjYXB0aW9uLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjYXB0aW9uLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InRyIj4KLSAgPGVsZW1lbnQgbmFtZT0idHIiPgotICAgIDxyZWYgbmFtZT0idHIuYXR0bGlzdCIvPgotICAgIDxvbmVPck1vcmU+Ci0gICAgICA8Y2hvaWNlPgotICAgICAgICA8cmVmIG5hbWU9InRoIi8+Ci0gICAgICAgIDxyZWYgbmFtZT0idGQiLz4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvb25lT3JNb3JlPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0ci5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0iQ2VsbEhBbGlnbi5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJDZWxsVkFsaWduLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0idGgiPgotICA8ZWxlbWVudCBuYW1lPSJ0aCI+Ci0gICAgPHJlZiBuYW1lPSJ0aC5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJGbG93Lm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InRoLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNlbGwuYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0ZCI+Ci0gIDxlbGVtZW50IG5hbWU9InRkIj4KLSAgICA8cmVmIG5hbWU9InRkLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IkZsb3cubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0idGQuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ2VsbC5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkNlbGwuYXR0cmliIj4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFiYnIiPgotICAgICAgPHJlZiBuYW1lPSJUZXh0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImF4aXMiLz4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVhZGVycyI+Ci0gICAgICA8cmVmIG5hbWU9IklEUkVGUy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8cmVmIG5hbWU9InNjb3BlLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJyb3dzcGFuIj4KLSAgICAgIDxyZWYgbmFtZT0iTnVtYmVyLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHNwYW4iPgotICAgICAgPHJlZiBuYW1lPSJOdW1iZXIuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPHJlZiBuYW1lPSJDZWxsSEFsaWduLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9IkNlbGxWQWxpZ24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJDZWxsSEFsaWduLmF0dHJpYiI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFsaWduIj4KLSAgICAgIDxjaG9pY2U+Ci0JPHZhbHVlPmxlZnQ8L3ZhbHVlPgotCTx2YWx1ZT5jZW50ZXI8L3ZhbHVlPgotCTx2YWx1ZT5yaWdodDwvdmFsdWU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkNlbGxWQWxpZ24uYXR0cmliIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsaWduIj4KLSAgICAgIDxjaG9pY2U+Ci0JPHZhbHVlPnRvcDwvdmFsdWU+Ci0JPHZhbHVlPm1pZGRsZTwvdmFsdWU+Ci0JPHZhbHVlPmJvdHRvbTwvdmFsdWU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InNjb3BlLmF0dHJpYiI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InNjb3BlIj4KLSAgICAgIDxjaG9pY2U+Ci0JPHZhbHVlPnJvdzwvdmFsdWU+Ci0JPHZhbHVlPmNvbDwvdmFsdWU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkJsb2NrLmNsYXNzIiBjb21iaW5lPSJjaG9pY2UiPgotICA8cmVmIG5hbWU9InRhYmxlIi8+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYmRvLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYmRvLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxNWQ3Yy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jkby5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBiZG8ucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIEJpLWRpcmVjdGlvbmFsIE1vZHVsZSAtLT4KLTxncmFtbWFyIHhtbG5zPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCI+Ci0KLTxkZWZpbmUgbmFtZT0iYmRvIj4KLSAgPGVsZW1lbnQgbmFtZT0iYmRvIj4KLSAgICA8cmVmIG5hbWU9ImJkby5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYmRvLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvcmUuYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0ibGFuZy5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJkaXIuYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJkaXIuYXR0cmliIj4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiPgotICAgIDxjaG9pY2U+Ci0gICAgICA8dmFsdWU+bHRyPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5ydGw8L3ZhbHVlPgotICAgIDwvY2hvaWNlPgotICA8L2F0dHJpYnV0ZT4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkkxOG4uYXR0cmliIiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxyZWYgbmFtZT0iZGlyLmF0dHJpYiIvPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iSW5saW5lLmNsYXNzIiBjb21iaW5lPSJjaG9pY2UiPgotICA8cmVmIG5hbWU9ImJkbyIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2NzaXNtYXAucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9jc2lzbWFwLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1ZjJhYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2NzaXNtYXAucm5nCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGNzaXNtYXAucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIENsaWVudC1zaWRlIEltYWdlIE1hcCBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImFyZWEiPgotICA8ZWxlbWVudCBuYW1lPSJhcmVhIj4KLSAgICA8cmVmIG5hbWU9ImFyZWEuYXR0bGlzdCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJhcmVhLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICA8cmVmIG5hbWU9IlVSSS5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8cmVmIG5hbWU9InNoYXBlLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9ImNvb3Jkcy5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9ocmVmIj4KLSAgICAgIDx2YWx1ZT5ub2hyZWY8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8YXR0cmlidXRlIG5hbWU9ImFsdCI+Ci0gICAgPHJlZiBuYW1lPSJUZXh0LmRhdGF0eXBlIi8+Ci0gIDwvYXR0cmlidXRlPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YWJpbmRleCI+Ci0gICAgICA8cmVmIG5hbWU9Ik51bWJlci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3NrZXkiPgotICAgICAgPHJlZiBuYW1lPSJDaGFyYWN0ZXIuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Im1hcCI+Ci0gIDxlbGVtZW50IG5hbWU9Im1hcCI+Ci0gICAgPHJlZiBuYW1lPSJtYXAuYXR0bGlzdCIvPgotICAgIDxvbmVPck1vcmU+Ci0gICAgICA8Y2hvaWNlPgotICAgICAgICA8IS0tIFRoaXMgZG9lcyBub3QgdXNlIEJsb2NrLm1peAotICAgICAgICAgICAgIGJlY2F1c2UgbG9vc2UuZHRkIGRvZXNuJ3QgdXNlICVGbG93OyAtLT4KLSAgICAgICAgPHJlZiBuYW1lPSJCbG9jay5jbGFzcyIvPgotICAgICAgICA8cmVmIG5hbWU9ImFyZWEiLz4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvb25lT3JNb3JlPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJtYXAuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uSWRSZXF1aXJlZC5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImEuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxyZWYgbmFtZT0ic2hhcGUuYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0iY29vcmRzLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iaW1nLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8cmVmIG5hbWU9InVzZW1hcC5hdHRsaXN0Ii8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJvYmplY3QuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxyZWYgbmFtZT0idXNlbWFwLmF0dGxpc3QiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InVzZW1hcC5hdHRsaXN0Ij4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlbWFwIj4KLSAgICAgIDxyZWYgbmFtZT0iSURSRUYuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InNoYXBlLmF0dHJpYiI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InNoYXBlIj4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx2YWx1ZT5yZWN0PC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPmNpcmNsZTwvdmFsdWU+Ci0gICAgICAgIDx2YWx1ZT5wb2x5PC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPmRlZmF1bHQ8L3ZhbHVlPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjb29yZHMuYXR0cmliIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29vcmRzIi8+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJJbmxpbmUuY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxyZWYgbmFtZT0ibWFwIi8+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZGF0YXR5cGVzLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZGF0YXR5cGVzLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlMjQ5MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2RhdGF0eXBlcy5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZGF0YXR5cGVzLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPCEtLSBEYXRhdHlwZXMgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIgotICAgICAgICAgZGF0YXR5cGVMaWJyYXJ5PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1kYXRhdHlwZXMiPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08ZGVmaW5lIG5hbWU9Ikxlbmd0aC5kYXRhdHlwZSI+Ci0gIDx0ZXh0Lz4KLTwvZGVmaW5lPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08ZGVmaW5lIG5hbWU9IkxpbmtUeXBlcy5kYXRhdHlwZSI+Ci0gIDxyZWYgbmFtZT0iTk1UT0tFTlMuZGF0YXR5cGUiLz4KLTwvZGVmaW5lPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTxkZWZpbmUgbmFtZT0iTWVkaWFEZXNjLmRhdGF0eXBlIj4KLSAgPHRleHQvPgotPC9kZWZpbmU+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPGRlZmluZSBuYW1lPSJNdWx0aUxlbmd0aC5kYXRhdHlwZSI+Ci0gIDx0ZXh0Lz4KLTwvZGVmaW5lPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTxkZWZpbmUgbmFtZT0iTnVtYmVyLmRhdGF0eXBlIj4KLSAgPHRleHQvPgotPC9kZWZpbmU+Ci0KLTwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLTxkZWZpbmUgbmFtZT0iUGl4ZWxzLmRhdGF0eXBlIj4KLSAgPHRleHQvPgotPC9kZWZpbmU+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08ZGVmaW5lIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSI+Ci0gIDx0ZXh0Lz4KLTwvZGVmaW5lPgotCi08IS0tIHRleHR1YWwgY29udGVudCAtLT4KLTxkZWZpbmUgbmFtZT0iVGV4dC5kYXRhdHlwZSI+Ci0gIDx0ZXh0Lz4KLTwvZGVmaW5lPgotCi08IS0tIEltcG9ydGVkIERhdGF0eXBlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPGRlZmluZSBuYW1lPSJDaGFyYWN0ZXIuZGF0YXR5cGUiPgotICA8dGV4dC8+Ci08L2RlZmluZT4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTxkZWZpbmUgbmFtZT0iQ2hhcnNldC5kYXRhdHlwZSI+Ci0gIDx0ZXh0Lz4KLTwvZGVmaW5lPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTxkZWZpbmUgbmFtZT0iQ2hhcnNldHMuZGF0YXR5cGUiPgotICA8dGV4dC8+Ci08L2RlZmluZT4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPGRlZmluZSBuYW1lPSJDb250ZW50VHlwZS5kYXRhdHlwZSI+Ci0gIDx0ZXh0Lz4KLTwvZGVmaW5lPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPGRlZmluZSBuYW1lPSJDb250ZW50VHlwZXMuZGF0YXR5cGUiPgotICA8dGV4dC8+Ci08L2RlZmluZT4KLQotPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci08ZGVmaW5lIG5hbWU9IkRhdGV0aW1lLmRhdGF0eXBlIj4KLSAgPHRleHQvPgotPC9kZWZpbmU+Ci0KLTwhLS0gZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyLCBhcyBwZXIgW0lTTzg4NzldIC0tPgotPGRlZmluZSBuYW1lPSJGUEkuZGF0YXR5cGUiPgotICA8dGV4dC8+Ci08L2RlZmluZT4KLQotPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0gLS0+Ci08ZGVmaW5lIG5hbWU9Ikxhbmd1YWdlQ29kZS5kYXRhdHlwZSI+Ci0gIDxkYXRhIHR5cGU9Imxhbmd1YWdlIi8+Ci08L2RlZmluZT4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPGRlZmluZSBuYW1lPSJVUkkuZGF0YXR5cGUiPgotICA8ZGF0YSB0eXBlPSJhbnlVUkkiLz4KLTwvZGVmaW5lPgotCi08IS0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycywgc2VlIFtVUkldIC0tPgotPGRlZmluZSBuYW1lPSJVUklzLmRhdGF0eXBlIj4KLSAgPHRleHQvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iTk1UT0tFTi5kYXRhdHlwZSI+Ci0gIDxkYXRhIHR5cGU9Ik5NVE9LRU4iLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Ik5NVE9LRU5TLmRhdGF0eXBlIj4KLSAgPGRhdGEgdHlwZT0iTk1UT0tFTlMiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklELmRhdGF0eXBlIj4KLSAgPGRhdGEgdHlwZT0iSUQiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklEUkVGLmRhdGF0eXBlIj4KLSAgPGRhdGEgdHlwZT0iSURSRUYiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklEUkVGUy5kYXRhdHlwZSI+Ci0gIDxkYXRhIHR5cGU9IklEUkVGUyIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2VkaXQucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9lZGl0LnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMzQ2ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2VkaXQucm5nCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZWRpdC5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08IS0tIEVkaXQgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJkZWwiPgotICA8ZWxlbWVudCBuYW1lPSJkZWwiPgotICAgIDxyZWYgbmFtZT0iZGVsLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJkZWwuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iRWRpdC5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImlucyI+Ci0gIDxlbGVtZW50IG5hbWU9ImlucyI+Ci0gICAgPHJlZiBuYW1lPSJpbnMuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Imlucy5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJFZGl0LmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iRWRpdC5hdHRyaWIiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjaXRlIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImRhdGV0aW1lIj4KLSAgICAgIDxyZWYgbmFtZT0iRGF0ZXRpbWUuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkVkaXQuY2xhc3MiPgotICA8Y2hvaWNlPgotICAgIDxyZWYgbmFtZT0iZGVsIi8+Ci0gICAgPHJlZiBuYW1lPSJpbnMiLz4KLSAgPC9jaG9pY2U+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJJbmxpbmUuY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxyZWYgbmFtZT0iRWRpdC5jbGFzcyIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iQmxvY2suY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxyZWYgbmFtZT0iRWRpdC5jbGFzcyIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2V2ZW50cy5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2V2ZW50cy5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTUwZDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9ldmVudHMucm5nCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGV2ZW50cy5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08IS0tIEV2ZW50cyBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImEuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9uYmx1ciI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmZvY3VzIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJhcmVhLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmJsdXIiPgotICAgICAgPHJlZiBuYW1lPSJTY3JpcHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25mb2N1cyI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZm9ybS5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25yZXNldCI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbnN1Ym1pdCI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYm9keS5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9udW5sb2FkIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJsYWJlbC5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25ibHVyIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9uZm9jdXMiPgotICAgICAgPHJlZiBuYW1lPSJTY3JpcHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImlucHV0LmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmJsdXIiPgotICAgICAgPHJlZiBuYW1lPSJTY3JpcHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25jaGFuZ2UiPgotICAgICAgPHJlZiBuYW1lPSJTY3JpcHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25mb2N1cyI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbnNlbGVjdCI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic2VsZWN0LmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmJsdXIiPgotICAgICAgPHJlZiBuYW1lPSJTY3JpcHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25jaGFuZ2UiPgotICAgICAgPHJlZiBuYW1lPSJTY3JpcHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25mb2N1cyI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0idGV4dGFyZWEuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9uYmx1ciI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmNoYW5nZSI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmZvY3VzIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9uc2VsZWN0Ij4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJidXR0b24uYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9uYmx1ciI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmZvY3VzIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJFdmVudHMuYXR0cmliIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25jbGljayI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmRibGNsaWNrIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9ubW91c2Vkb3duIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9ubW91c2V1cCI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbm1vdXNlb3ZlciI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbm1vdXNlbW92ZSI+Ci0gICAgICA8cmVmIG5hbWU9IlNjcmlwdC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJvbm1vdXNlb3V0Ij4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9ua2V5cHJlc3MiPgotICAgICAgPHJlZiBuYW1lPSJTY3JpcHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25rZXlkb3duIj4KLSAgICAgIDxyZWYgbmFtZT0iU2NyaXB0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im9ua2V5dXAiPgotICAgICAgPHJlZiBuYW1lPSJTY3JpcHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkNvbW1vbi5hdHRyaWIiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8cmVmIG5hbWU9IkV2ZW50cy5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkNvbW1vbklkUmVxdWlyZWQuYXR0cmliIiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJFdmVudHMuYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZm9ybS5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Zvcm0ucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2ZiNGZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZm9ybS5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZm9ybS5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTwhLS0gRm9ybXMgTW9kdWxlIC0tPgotPCEtLSBVbmxpa2UgdGhlIERURCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBidWlsZHMgb24gdGhlIGJhc2ljLWZvcm0gbW9kdWxlIC0tPjxncmFtbWFyIHhtbG5zPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCI+Ci0KLTxpbmNsdWRlIGhyZWY9ImJhc2ljLWZvcm0ucm5nIj4KLQotICA8ZGVmaW5lIG5hbWU9InNlbGVjdCI+Ci0gICAgPGVsZW1lbnQgbmFtZT0ic2VsZWN0Ij4KLSAgICAgIDxyZWYgbmFtZT0ic2VsZWN0LmF0dGxpc3QiLz4KLSAgICAgIDxvbmVPck1vcmU+Ci0JPGNob2ljZT4KLQkgIDxyZWYgbmFtZT0ib3B0aW9uIi8+Ci0JICA8cmVmIG5hbWU9Im9wdGdyb3VwIi8+Ci0JPC9jaG9pY2U+Ci0gICAgICA8L29uZU9yTW9yZT4KLSAgICA8L2VsZW1lbnQ+Ci0gIDwvZGVmaW5lPgotCi08L2luY2x1ZGU+Ci0KLTxkZWZpbmUgbmFtZT0iZm9ybS5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWNjZXB0LWNoYXJzZXQiPgotICAgICAgPHJlZiBuYW1lPSJDaGFyc2V0cy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhY2NlcHQiPgotICAgICAgPHJlZiBuYW1lPSJDb250ZW50VHlwZXMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImlucHV0LmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlZCI+Ci0gICAgICA8dmFsdWU+ZGlzYWJsZWQ8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWFkb25seSI+Ci0gICAgICA8dmFsdWU+cmVhZG9ubHk8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhbHQiLz4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFiaW5kZXgiPgotICAgICAgPHJlZiBuYW1lPSJOdW1iZXIuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWNjZXB0Ij4KLSAgICAgIDxyZWYgbmFtZT0iQ29udGVudFR5cGVzLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJJbnB1dFR5cGUuY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxjaG9pY2U+Ci0gICAgPHZhbHVlPmltYWdlPC92YWx1ZT4KLSAgICA8dmFsdWU+YnV0dG9uPC92YWx1ZT4KLSAgPC9jaG9pY2U+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJzZWxlY3QuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImRpc2FibGVkIj4KLSAgICAgIDx2YWx1ZT5kaXNhYmxlZDwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InRhYmluZGV4Ij4KLSAgICAgIDxyZWYgbmFtZT0iTnVtYmVyLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJvcHRpb24uYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImRpc2FibGVkIj4KLSAgICAgIDx2YWx1ZT5kaXNhYmxlZDwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIj4KLSAgICAgIDxyZWYgbmFtZT0iVGV4dC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ib3B0Z3JvdXAiPgotICA8ZWxlbWVudCBuYW1lPSJvcHRncm91cCI+Ci0gICAgPHJlZiBuYW1lPSJvcHRncm91cC5hdHRsaXN0Ii8+Ci0gICAgPG9uZU9yTW9yZT4KLSAgICAgIDxyZWYgbmFtZT0ib3B0aW9uIi8+Ci0gICAgPC9vbmVPck1vcmU+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Im9wdGdyb3VwLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZWQiPgotICAgICAgPHZhbHVlPmRpc2FibGVkPC92YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCI+Ci0gICAgPHJlZiBuYW1lPSJUZXh0LmRhdGF0eXBlIi8+Ci0gIDwvYXR0cmlidXRlPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0idGV4dGFyZWEuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImRpc2FibGVkIj4KLSAgICAgIDx2YWx1ZT5kaXNhYmxlZDwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InJlYWRvbmx5Ij4KLSAgICAgIDx2YWx1ZT5yZWFkb25seTwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InRhYmluZGV4Ij4KLSAgICAgIDxyZWYgbmFtZT0iTnVtYmVyLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJmaWVsZHNldCI+Ci0gIDxlbGVtZW50IG5hbWU9ImZpZWxkc2V0Ij4KLSAgICA8cmVmIG5hbWU9ImZpZWxkc2V0LmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9ImxlZ2VuZCIvPgotICAgIDxyZWYgbmFtZT0iRmxvdy5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJmaWVsZHNldC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJidXR0b24iPgotICA8ZWxlbWVudCBuYW1lPSJidXR0b24iPgotICAgIDxyZWYgbmFtZT0iYnV0dG9uLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IkZsb3cubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYnV0dG9uLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIvPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx2YWx1ZT5idXR0b248L3ZhbHVlPgotICAgICAgICA8dmFsdWU+c3VibWl0PC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPnJlc2V0PC92YWx1ZT4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlZCI+Ci0gICAgICA8dmFsdWU+ZGlzYWJsZWQ8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YWJpbmRleCI+Ci0gICAgICA8cmVmIG5hbWU9Ik51bWJlci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3NrZXkiPgotICAgICAgPHJlZiBuYW1lPSJDaGFyYWN0ZXIuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImxlZ2VuZCI+Ci0gIDxlbGVtZW50IG5hbWU9ImxlZ2VuZCI+Ci0gICAgPHJlZiBuYW1lPSJsZWdlbmQuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImxlZ2VuZC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFjY2Vzc2tleSI+Ci0gICAgICA8cmVmIG5hbWU9IkNoYXJhY3Rlci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iRm9ybS5jbGFzcyIgY29tYmluZT0iY2hvaWNlIj4KLSAgPHJlZiBuYW1lPSJmaWVsZHNldCIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iRm9ybWN0cmwuY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxyZWYgbmFtZT0iYnV0dG9uIi8+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZnJhbWVzLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZnJhbWVzLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiNWU1MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2ZyYW1lcy5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZnJhbWVzLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPCEtLSBGcmFtZXMgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGluY2x1ZGUgaHJlZj0ic3RydWN0LnJuZyI+Ci0KLSAgPGRlZmluZSBuYW1lPSJodG1sIj4KLSAgICA8ZWxlbWVudCBuYW1lPSJodG1sIj4KLSAgICAgIDxyZWYgbmFtZT0iaHRtbC5hdHRsaXN0Ii8+Ci0gICAgICA8cmVmIG5hbWU9ImhlYWQiLz4KLSAgICAgIDxyZWYgbmFtZT0iZnJhbWVzZXQiLz4KLSAgICA8L2VsZW1lbnQ+Ci0gIDwvZGVmaW5lPgotCi08L2luY2x1ZGU+Ci0KLTxkZWZpbmUgbmFtZT0iZnJhbWVzZXQiPgotICA8ZWxlbWVudCBuYW1lPSJmcmFtZXNldCI+Ci0gICAgPHJlZiBuYW1lPSJmcmFtZXNldC5hdHRsaXN0Ii8+Ci0gICAgPGludGVybGVhdmU+Ci0gICAgICA8b25lT3JNb3JlPgotCTxjaG9pY2U+Ci0JICA8cmVmIG5hbWU9ImZyYW1lc2V0Ii8+Ci0JICA8cmVmIG5hbWU9ImZyYW1lIi8+Ci0JPC9jaG9pY2U+Ci0gICAgICA8L29uZU9yTW9yZT4KLSAgICAgIDxvcHRpb25hbD4KLQk8cmVmIG5hbWU9Im5vZnJhbWVzIi8+Ci0gICAgICA8L29wdGlvbmFsPgotICAgIDwvaW50ZXJsZWF2ZT4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZnJhbWVzZXQuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29yZS5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29scyI+Ci0gICAgICA8cmVmIG5hbWU9Ik11bHRpTGVuZ3RoLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InJvd3MiPgotICAgICAgPHJlZiBuYW1lPSJNdWx0aUxlbmd0aC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZnJhbWUiPgotICA8ZWxlbWVudCBuYW1lPSJmcmFtZSI+Ci0gICAgPHJlZiBuYW1lPSJmcmFtZS5hdHRsaXN0Ii8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImZyYW1lLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvcmUuYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImxvbmdkZXNjIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InNyYyI+Ci0gICAgICA8cmVmIG5hbWU9IlVSSS5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJmcmFtZWJvcmRlciI+Ci0gICAgICA8Y2hvaWNlPgotICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDx2YWx1ZT4wPC92YWx1ZT4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXJnaW53aWR0aCI+Ci0gICAgICA8cmVmIG5hbWU9IlBpeGVscy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXJnaW5oZWlnaHQiPgotICAgICAgPHJlZiBuYW1lPSJQaXhlbHMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9yZXNpemUiPgotICAgICAgPHZhbHVlPm5vcmVzaXplPC92YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2Nyb2xsaW5nIj4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx2YWx1ZT55ZXM8L3ZhbHVlPgotICAgICAgICA8dmFsdWU+bm88L3ZhbHVlPgotICAgICAgICA8dmFsdWU+YXV0bzwvdmFsdWU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Im5vZnJhbWVzIj4KLSAgPGVsZW1lbnQgbmFtZT0ibm9mcmFtZXMiPgotICAgIDxyZWYgbmFtZT0ibm9mcmFtZXMuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iYm9keSIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJub2ZyYW1lcy5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvaHlwZXJ0ZXh0LnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvaHlwZXJ0ZXh0LnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzYjdmNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2h5cGVydGV4dC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBoeXBlcnRleHQucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIEh5cGVydGV4dCBNb2R1bGUgLS0+Ci08IS0tIERlcGVuZHMgb24gdGV4dCBtb2R1bGUuIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJhIj4KLSAgPGVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgPHJlZiBuYW1lPSJhLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJhLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICA8cmVmIG5hbWU9IlVSSS5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFyc2V0Ij4KLSAgICAgIDxyZWYgbmFtZT0iQ2hhcnNldC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29udGVudFR5cGUuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHJlZmxhbmciPgotICAgICAgPHJlZiBuYW1lPSJMYW5ndWFnZUNvZGUuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVsIj4KLSAgICAgIDxyZWYgbmFtZT0iTGlua1R5cGVzLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InJldiI+Ci0gICAgICA8cmVmIG5hbWU9IkxpbmtUeXBlcy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3NrZXkiPgotICAgICAgPHJlZiBuYW1lPSJDaGFyYWN0ZXIuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFiaW5kZXgiPgotICAgICAgPHJlZiBuYW1lPSJOdW1iZXIuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklubGluZS5jbGFzcyIgY29tYmluZT0iY2hvaWNlIj4KLSAgPHJlZiBuYW1lPSJhIi8+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvaWZyYW1lLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvaWZyYW1lLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzZGRmNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2lmcmFtZS5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBpZnJhbWUucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIElmcmFtZSBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImlmcmFtZSI+Ci0gIDxlbGVtZW50IG5hbWU9ImlmcmFtZSI+Ci0gICAgPHJlZiBuYW1lPSJpZnJhbWUuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iRmxvdy5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJpZnJhbWUuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29yZS5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9uZ2Rlc2MiPgotICAgICAgPHJlZiBuYW1lPSJVUkkuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImZyYW1lYm9yZGVyIj4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPjA8L3ZhbHVlPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9IndpZHRoIj4KLSAgICAgIDxyZWYgbmFtZT0iTGVuZ3RoLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImhlaWdodCI+Ci0gICAgICA8cmVmIG5hbWU9Ikxlbmd0aC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXJnaW53aWR0aCI+Ci0gICAgICA8cmVmIG5hbWU9IlBpeGVscy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXJnaW5oZWlnaHQiPgotICAgICAgPHJlZiBuYW1lPSJQaXhlbHMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2Nyb2xsaW5nIj4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx2YWx1ZT55ZXM8L3ZhbHVlPgotICAgICAgICA8dmFsdWU+bm88L3ZhbHVlPgotICAgICAgICA8dmFsdWU+YXV0bzwvdmFsdWU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklubGluZS5jbGFzcyIgY29tYmluZT0iY2hvaWNlIj4KLSAgPHJlZiBuYW1lPSJpZnJhbWUiLz4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9pbWFnZS5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2ltYWdlLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2YmJlNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2ltYWdlLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGltYWdlLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPCEtLSBJbWFnZSBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImltZyI+Ci0gIDxlbGVtZW50IG5hbWU9ImltZyI+Ci0gICAgPHJlZiBuYW1lPSJpbWcuYXR0bGlzdCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJpbWcuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICA8YXR0cmlidXRlIG5hbWU9InNyYyI+Ci0gICAgPHJlZiBuYW1lPSJVUkkuZGF0YXR5cGUiLz4KLSAgPC9hdHRyaWJ1dGU+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0iYWx0Ij4KLSAgICA8cmVmIG5hbWU9IlRleHQuZGF0YXR5cGUiLz4KLSAgPC9hdHRyaWJ1dGU+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImxvbmdkZXNjIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImhlaWdodCI+Ci0gICAgICA8cmVmIG5hbWU9Ikxlbmd0aC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCI+Ci0gICAgICA8cmVmIG5hbWU9Ikxlbmd0aC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iSW5saW5lLmNsYXNzIiBjb21iaW5lPSJjaG9pY2UiPgotICA8cmVmIG5hbWU9ImltZyIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2lubHN0eWxlLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvaW5sc3R5bGUucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWU2YWFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvaW5sc3R5bGUucm5nCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogaW5sc3R5bGUucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIElubGluZSBTdHlsZSBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9IkNvcmUuYXR0cmliIiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiLz4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9sZWdhY3kucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9sZWdhY3kucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkzNzI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvbGVnYWN5LnJuZworKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBsZWdhY3kucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIExlZ2FjeSBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImxhbmcuYXR0cmliIiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFuZyI+Ci0gICAgICA8cmVmIG5hbWU9Ikxhbmd1YWdlQ29kZS5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYmFzZWZvbnQiPgotICA8ZWxlbWVudCBuYW1lPSJiYXNlZm9udCI+Ci0gICAgPHJlZiBuYW1lPSJiYXNlZm9udC5hdHRsaXN0Ii8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImJhc2Vmb250LmF0dGxpc3QiPgotICA8cmVmIG5hbWU9ImlkLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9IkZvbnQuYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjZW50ZXIiPgotICA8ZWxlbWVudCBuYW1lPSJjZW50ZXIiPgotICAgIDxyZWYgbmFtZT0iY2VudGVyLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IkZsb3cubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iY2VudGVyLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImZvbnQiPgotICA8ZWxlbWVudCBuYW1lPSJmb250Ij4KLSAgICA8cmVmIG5hbWU9ImZvbnQuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImZvbnQuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29yZS5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJJMThuLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9IkZvbnQuYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJGb250LmF0dHJpYiI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InNpemUiLz4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sb3IiPgotICAgICAgPHJlZiBuYW1lPSJDb2xvci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNlIi8+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJzIj4KLSAgPGVsZW1lbnQgbmFtZT0icyI+Ci0gICAgPHJlZiBuYW1lPSJzLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJzLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InN0cmlrZSI+Ci0gIDxlbGVtZW50IG5hbWU9InN0cmlrZSI+Ci0gICAgPHJlZiBuYW1lPSJzdHJpa2UuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InN0cmlrZS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ1Ij4KLSAgPGVsZW1lbnQgbmFtZT0idSI+Ci0gICAgPHJlZiBuYW1lPSJ1LmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ1LmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImRpciI+Ci0gIDxlbGVtZW50IG5hbWU9ImRpciI+Ci0gICAgPHJlZiBuYW1lPSJkaXIuYXR0bGlzdCIvPgotICAgIDxvbmVPck1vcmU+Ci0gICAgICA8cmVmIG5hbWU9ImxpLm5vYmxvY2siLz4KLSAgICA8L29uZU9yTW9yZT4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZGlyLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcGFjdCI+Ci0gICAgICA8dmFsdWU+Y29tcGFjdDwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJtZW51Ij4KLSAgPGVsZW1lbnQgbmFtZT0ibWVudSI+Ci0gICAgPHJlZiBuYW1lPSJtZW51LmF0dGxpc3QiLz4KLSAgICA8b25lT3JNb3JlPgotICAgICAgPHJlZiBuYW1lPSJsaS5ub2Jsb2NrIi8+Ci0gICAgPC9vbmVPck1vcmU+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Im1lbnUuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wYWN0Ij4KLSAgICAgIDx2YWx1ZT5jb21wYWN0PC92YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImxpLm5vYmxvY2siPgotICA8ZWxlbWVudCBuYW1lPSJsaSI+Ci0gICAgPHJlZiBuYW1lPSJsaS5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iaXNpbmRleCI+Ci0gIDxlbGVtZW50IG5hbWU9ImlzaW5kZXgiPgotICAgIDxyZWYgbmFtZT0iaXNpbmRleC5hdHRsaXN0Ii8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImlzaW5kZXguYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29yZS5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJJMThuLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9tcHQiPgotICAgICAgPHJlZiBuYW1lPSJUZXh0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJhcHBsZXQuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFsaWduIj4KLSAgICAgIDxjaG9pY2U+Ci0JPHZhbHVlPnRvcDwvdmFsdWU+Ci0JPHZhbHVlPm1pZGRsZTwvdmFsdWU+Ci0JPHZhbHVlPmJvdHRvbTwvdmFsdWU+Ci0JPHZhbHVlPmxlZnQ8L3ZhbHVlPgotCTx2YWx1ZT5yaWdodDwvdmFsdWU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHNwYWNlIj4KLSAgICAgIDxyZWYgbmFtZT0iUGl4ZWxzLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InZzcGFjZSI+Ci0gICAgICA8cmVmIG5hbWU9IlBpeGVscy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYm9keS5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmFja2dyb3VuZCI+Ci0gICAgICA8cmVmIG5hbWU9IlVSSS5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJiZ2NvbG9yIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29sb3IuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGV4dCI+Ci0gICAgICA8cmVmIG5hbWU9IkNvbG9yLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImxpbmsiPgotICAgICAgPHJlZiBuYW1lPSJDb2xvci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ2bGluayI+Ci0gICAgICA8cmVmIG5hbWU9IkNvbG9yLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFsaW5rIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29sb3IuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImJyLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGVhciI+Ci0gICAgICA8Y2hvaWNlPgotCTx2YWx1ZT5sZWZ0PC92YWx1ZT4KLQk8dmFsdWU+YWxsPC92YWx1ZT4KLQk8dmFsdWU+cmlnaHQ8L3ZhbHVlPgotCTx2YWx1ZT5ub25lPC92YWx1ZT4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iY2FwdGlvbi5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJhbGlnbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImRpdi5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJhbGlnbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08IS0tIE5vdCBpbiB0aGUgQ1IsIGJ1dCBzdXJlbHkgYW4gZXJyb3IuIC0tPgotCi08ZGVmaW5lIG5hbWU9ImRsLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wYWN0Ij4KLSAgICAgIDx2YWx1ZT5jb21wYWN0PC92YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkhlYWRpbmcuYXR0cmliIiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJhbGlnbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImhyLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGlnbiI+Ci0gICAgICA8Y2hvaWNlPgotCTx2YWx1ZT5sZWZ0PC92YWx1ZT4KLQk8dmFsdWU+Y2VudGVyPC92YWx1ZT4KLQk8dmFsdWU+cmlnaHQ8L3ZhbHVlPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5vc2hhZGUiPgotICAgICAgPHZhbHVlPm5vc2hhZGU8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzaXplIj4KLSAgICAgIDxyZWYgbmFtZT0iUGl4ZWxzLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9IndpZHRoIj4KLSAgICAgIDxyZWYgbmFtZT0iUGl4ZWxzLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJpbWcuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFsaWduIj4KLSAgICAgIDxjaG9pY2U+Ci0JPHZhbHVlPnRvcDwvdmFsdWU+Ci0JPHZhbHVlPm1pZGRsZTwvdmFsdWU+Ci0JPHZhbHVlPmJvdHRvbTwvdmFsdWU+Ci0JPHZhbHVlPmxlZnQ8L3ZhbHVlPgotCTx2YWx1ZT5yaWdodDwvdmFsdWU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iYm9yZGVyIj4KLSAgICAgIDxyZWYgbmFtZT0iUGl4ZWxzLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImhzcGFjZSI+Ci0gICAgICA8cmVmIG5hbWU9IlBpeGVscy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3BhY2UiPgotICAgICAgPHJlZiBuYW1lPSJQaXhlbHMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImlucHV0LmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8cmVmIG5hbWU9ImFsaWduLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ibGVnZW5kLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGlnbiI+Ci0gICAgICA8Y2hvaWNlPgotCTx2YWx1ZT50b3A8L3ZhbHVlPgotCTx2YWx1ZT5ib3R0b208L3ZhbHVlPgotCTx2YWx1ZT5sZWZ0PC92YWx1ZT4KLQk8dmFsdWU+cmlnaHQ8L3ZhbHVlPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJsaS5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIvPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ib2JqZWN0LmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGlnbiI+Ci0gICAgICA8Y2hvaWNlPgotCTx2YWx1ZT50b3A8L3ZhbHVlPgotCTx2YWx1ZT5taWRkbGU8L3ZhbHVlPgotCTx2YWx1ZT5ib3R0b208L3ZhbHVlPgotCTx2YWx1ZT5sZWZ0PC92YWx1ZT4KLQk8dmFsdWU+cmlnaHQ8L3ZhbHVlPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImJvcmRlciI+Ci0gICAgICA8cmVmIG5hbWU9IlBpeGVscy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJoc3BhY2UiPgotICAgICAgPHJlZiBuYW1lPSJQaXhlbHMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idnNwYWNlIj4KLSAgICAgIDxyZWYgbmFtZT0iUGl4ZWxzLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJvbC5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wYWN0Ij4KLSAgICAgIDx2YWx1ZT5jb21wYWN0PC92YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhcnQiLz4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InAuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxyZWYgbmFtZT0iYWxpZ24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJwcmUuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9IndpZHRoIj4KLSAgICAgIDxyZWYgbmFtZT0iTGVuZ3RoLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJzY3JpcHQuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Imxhbmd1YWdlIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29udGVudFR5cGUuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InRhYmxlLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8cmVmIG5hbWU9ImFsaWduLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJiZ2NvbG9yIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29sb3IuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InRyLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJiZ2NvbG9yIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29sb3IuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkNlbGwuYXR0cmliIiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm93cmFwIj4KLSAgICAgIDx2YWx1ZT5ub3dyYXA8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJiZ2NvbG9yIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29sb3IuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0id2lkdGgiPgotICAgICAgPHJlZiBuYW1lPSJQaXhlbHMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVpZ2h0Ij4KLSAgICAgIDxyZWYgbmFtZT0iUGl4ZWxzLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ1bC5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wYWN0Ij4KLSAgICAgIDx2YWx1ZT5jb21wYWN0PC92YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImFsaWduLmF0dHJpYiI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImFsaWduIj4KLSAgICAgIDxjaG9pY2U+Ci0JPHZhbHVlPmxlZnQ8L3ZhbHVlPgotCTx2YWx1ZT5hbGw8L3ZhbHVlPgotCTx2YWx1ZT5yaWdodDwvdmFsdWU+Ci0JPHZhbHVlPm5vbmU8L3ZhbHVlPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJDb2xvci5kYXRhdHlwZSI+Ci0gIDx0ZXh0Lz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklubGluZS5jbGFzcyIgY29tYmluZT0iY2hvaWNlIj4KLSAgPGNob2ljZT4KLSAgICA8cmVmIG5hbWU9ImZvbnQiLz4KLSAgICA8cmVmIG5hbWU9ImJhc2Vmb250Ii8+Ci0gICAgPHJlZiBuYW1lPSJzIi8+Ci0gICAgPHJlZiBuYW1lPSJzdHJpa2UiLz4KLSAgICA8cmVmIG5hbWU9InUiLz4KLSAgPC9jaG9pY2U+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJCbG9jay5jbGFzcyIgY29tYmluZT0iY2hvaWNlIj4KLSAgPGNob2ljZT4KLSAgICA8cmVmIG5hbWU9ImNlbnRlciIvPgotICAgIDxyZWYgbmFtZT0iaXNpbmRleCIvPgotICA8L2Nob2ljZT4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Ikxpc3QuY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxjaG9pY2U+Ci0gICAgPHJlZiBuYW1lPSJkaXIiLz4KLSAgICA8cmVmIG5hbWU9Im1lbnUiLz4KLSAgPC9jaG9pY2U+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJoZWFkLmNvbnRlbnQiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPHJlZiBuYW1lPSJpc2luZGV4Ii8+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJCbG9jay5taXgiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxjaG9pY2U+Ci0gICAgPHRleHQvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLmNsYXNzIi8+Ci0gIDwvY2hvaWNlPgotPC9kZWZpbmU+Ci0KLTwhLS0gV2l0aCB0aGUgbGVnYWN5IG1vZHVsZSBhbmQgdGhlIGZyYW1lcyBtb2R1bGVzLCB0aGUgaHRtbAotICAgICBlbGVtZW50IGNhbiBjb250YWluIGVpdGhlciBib2R5IG9yIGZyYW1lc2V0LiAtLT4KLTxkZWZpbmUgbmFtZT0iZnJhbWVzZXQiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxyZWYgbmFtZT0iYm9keSIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2xpbmsucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9saW5rLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjY2ViNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2xpbmsucm5nCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbGluay5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08IS0tIExpbmsgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJsaW5rIj4KLSAgPGVsZW1lbnQgbmFtZT0ibGluayI+Ci0gICAgPHJlZiBuYW1lPSJsaW5rLmF0dGxpc3QiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ibGluay5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNoYXJzZXQiPgotICAgICAgPHJlZiBuYW1lPSJDaGFyc2V0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImhyZWYiPgotICAgICAgPHJlZiBuYW1lPSJVUkkuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHJlZmxhbmciPgotICAgICAgPHJlZiBuYW1lPSJMYW5ndWFnZUNvZGUuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSI+Ci0gICAgICA8cmVmIG5hbWU9IkNvbnRlbnRUeXBlLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InJlbCI+Ci0gICAgICA8cmVmIG5hbWU9IkxpbmtUeXBlcy5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXYiPgotICAgICAgPHJlZiBuYW1lPSJMaW5rVHlwZXMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVkaWEiPgotICAgICAgPHJlZiBuYW1lPSJNZWRpYURlc2MuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImhlYWQuY29udGVudCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDx6ZXJvT3JNb3JlPgotICAgIDxyZWYgbmFtZT0ibGluayIvPgotICA8L3plcm9Pck1vcmU+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvbGlzdC5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2xpc3Qucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTBkNzA3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvbGlzdC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbGlzdC5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTwhLS0gTGlzdCBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImRsIj4KLSAgPGVsZW1lbnQgbmFtZT0iZGwiPgotICAgIDxyZWYgbmFtZT0iZGwuYXR0bGlzdCIvPgotICAgIDxvbmVPck1vcmU+Ci0gICAgICA8Y2hvaWNlPgotCTxyZWYgbmFtZT0iZHQiLz4KLQk8cmVmIG5hbWU9ImRkIi8+Ci0gICAgICA8L2Nob2ljZT4KLSAgICA8L29uZU9yTW9yZT4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZGwuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZHQiPgotICA8ZWxlbWVudCBuYW1lPSJkdCI+Ci0gICAgPHJlZiBuYW1lPSJkdC5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZHQuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZGQiPgotICA8ZWxlbWVudCBuYW1lPSJkZCI+Ci0gICAgPHJlZiBuYW1lPSJkZC5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJGbG93Lm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImRkLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Im9sIj4KLSAgPGVsZW1lbnQgbmFtZT0ib2wiPgotICAgIDxyZWYgbmFtZT0ib2wuYXR0bGlzdCIvPgotICAgIDxvbmVPck1vcmU+Ci0gICAgICA8cmVmIG5hbWU9ImxpIi8+Ci0gICAgPC9vbmVPck1vcmU+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Im9sLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InVsIj4KLSAgPGVsZW1lbnQgbmFtZT0idWwiPgotICAgIDxyZWYgbmFtZT0idWwuYXR0bGlzdCIvPgotICAgIDxvbmVPck1vcmU+Ci0gICAgICA8cmVmIG5hbWU9ImxpIi8+Ci0gICAgPC9vbmVPck1vcmU+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InVsLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImxpIj4KLSAgPGVsZW1lbnQgbmFtZT0ibGkiPgotICAgIDxyZWYgbmFtZT0ibGkuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iRmxvdy5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4gIAotCi08ZGVmaW5lIG5hbWU9ImxpLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Ikxpc3QuY2xhc3MiPgotICA8Y2hvaWNlPgotICAgIDxyZWYgbmFtZT0idWwiLz4KLSAgICA8cmVmIG5hbWU9Im9sIi8+Ci0gICAgPHJlZiBuYW1lPSJkbCIvPgotICA8L2Nob2ljZT4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkJsb2NrLmNsYXNzIiBjb21iaW5lPSJjaG9pY2UiPgotICA8cmVmIG5hbWU9Ikxpc3QuY2xhc3MiLz4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9tZXRhLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvbWV0YS5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjMxYzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9tZXRhLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG1ldGEucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIE1ldGEgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJtZXRhIj4KLSAgPGVsZW1lbnQgbmFtZT0ibWV0YSI+Ci0gICAgPHJlZiBuYW1lPSJtZXRhLmF0dGxpc3QiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ibWV0YS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJJMThuLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJodHRwLWVxdWl2Ij4KLSAgICAgIDxyZWYgbmFtZT0iTk1UT0tFTi5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4KLSAgICAgIDxyZWYgbmFtZT0iTk1UT0tFTi5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ii8+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InNjaGVtZSIvPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iaGVhZC5jb250ZW50IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHplcm9Pck1vcmU+Ci0gICAgPHJlZiBuYW1lPSJtZXRhIi8+Ci0gIDwvemVyb09yTW9yZT4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9uYW1laWRlbnQucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9uYW1laWRlbnQucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWEzNTAwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvbmFtZWlkZW50LnJuZworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG5hbWVpZGVudC5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTwhLS0gTmFtZSBJZGVudGlmaWNhdGlvbiBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9ImEuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxyZWYgbmFtZT0ibmFtZS5hdHRsaXN0Ii8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJhcHBsZXQuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxyZWYgbmFtZT0ibmFtZS5hdHRsaXN0Ii8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJmb3JtLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8cmVmIG5hbWU9Im5hbWUuYXR0bGlzdCIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZnJhbWUuYXR0cmliIiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJuYW1lLmF0dGxpc3QiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImlmcmFtZS5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJuYW1lLmF0dGxpc3QiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImltZy5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJuYW1lLmF0dGxpc3QiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Im1hcC5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJuYW1lLmF0dGxpc3QiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Im5hbWUuYXR0bGlzdCI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9vYmplY3Qucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9vYmplY3Qucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjFhZjk3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvb2JqZWN0LnJuZworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBvYmplY3Qucm5nIDU2MzQ0IDIwMDQtMTEtMDIgMDQ6Mjg6MzhaIGdyZWdvciAkIC0tPgotCi08IS0tIE9iamVjdCBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9Im9iamVjdCI+Ci0gIDxlbGVtZW50IG5hbWU9Im9iamVjdCI+Ci0gICAgPHJlZiBuYW1lPSJvYmplY3QuYXR0bGlzdCIvPgotICAgIDwhLS0gTm8gcmVzdHJpY3Rpb25zIG9uIG1peGVkIGNvbnRlbnQgaW4gVFJFWC4gLS0+Ci0gICAgPHplcm9Pck1vcmU+Ci0gICAgICA8cmVmIG5hbWU9InBhcmFtIi8+Ci0gICAgPC96ZXJvT3JNb3JlPgotICAgIDxyZWYgbmFtZT0iRmxvdy5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJvYmplY3QuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImRlY2xhcmUiPgotICAgICAgPHZhbHVlPmRlY2xhcmU8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc2lkIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvZGViYXNlIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImRhdGEiPgotICAgICAgPHJlZiBuYW1lPSJVUkkuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSI+Ci0gICAgICA8cmVmIG5hbWU9IkNvbnRlbnRUeXBlLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvZGV0eXBlIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29udGVudFR5cGUuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZSI+Ci0gICAgICA8cmVmIG5hbWU9IlVSSXMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhbmRieSI+Ci0gICAgICA8cmVmIG5hbWU9IlRleHQuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVpZ2h0Ij4KLSAgICAgIDxyZWYgbmFtZT0iTGVuZ3RoLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9IndpZHRoIj4KLSAgICAgIDxyZWYgbmFtZT0iTGVuZ3RoLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFiaW5kZXgiPgotICAgICAgPHJlZiBuYW1lPSJOdW1iZXIuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklubGluZS5jbGFzcyIgY29tYmluZT0iY2hvaWNlIj4KLSAgPHJlZiBuYW1lPSJvYmplY3QiLz4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9wYXJhbS5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3BhcmFtLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1ZGEzYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3BhcmFtLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHBhcmFtLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPCEtLSBQYXJhbSBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9InBhcmFtIj4KLSAgPGVsZW1lbnQgbmFtZT0icGFyYW0iPgotICAgIDxyZWYgbmFtZT0icGFyYW0uYXR0bGlzdCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJwYXJhbS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJpZC5hdHRyaWIiLz4KLSAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIi8+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVldHlwZSI+Ci0gICAgICA8Y2hvaWNlPgotCTx2YWx1ZT5kYXRhPC92YWx1ZT4KLQk8dmFsdWU+cmVmPC92YWx1ZT4KLQk8dmFsdWU+b2JqZWN0PC92YWx1ZT4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj4KLSAgICAgIDxyZWYgbmFtZT0iQ29udGVudFR5cGUuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9wcmVzLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvcHJlcy5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmNhNjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9wcmVzLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwcmVzLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJociI+Ci0gIDxlbGVtZW50IG5hbWU9ImhyIj4KLSAgICA8cmVmIG5hbWU9ImhyLmF0dGxpc3QiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iaHIuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iQmxvY2suY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxyZWYgbmFtZT0iaHIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImIiPgotICA8ZWxlbWVudCBuYW1lPSJiIj4KLSAgICA8cmVmIG5hbWU9ImIuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImIuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYmlnIj4KLSAgPGVsZW1lbnQgbmFtZT0iYmlnIj4KLSAgICA8cmVmIG5hbWU9ImJpZy5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYmlnLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImkiPgotICA8ZWxlbWVudCBuYW1lPSJpIj4KLSAgICA8cmVmIG5hbWU9ImkuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImkuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic21hbGwiPgotICA8ZWxlbWVudCBuYW1lPSJzbWFsbCI+Ci0gICAgPHJlZiBuYW1lPSJzbWFsbC5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic21hbGwuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic3ViIj4KLSAgPGVsZW1lbnQgbmFtZT0ic3ViIj4KLSAgICA8cmVmIG5hbWU9InN1Yi5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic3ViLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InN1cCI+Ci0gIDxlbGVtZW50IG5hbWU9InN1cCI+Ci0gICAgPHJlZiBuYW1lPSJzdXAuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InN1cC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0dCI+Ci0gIDxlbGVtZW50IG5hbWU9InR0Ij4KLSAgICA8cmVmIG5hbWU9InR0LmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0dC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJJbmxpbmUuY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxjaG9pY2U+Ci0gICAgPHJlZiBuYW1lPSJiIi8+Ci0gICAgPHJlZiBuYW1lPSJiaWciLz4KLSAgICA8cmVmIG5hbWU9ImkiLz4KLSAgICA8cmVmIG5hbWU9InNtYWxsIi8+Ci0gICAgPHJlZiBuYW1lPSJzdWIiLz4KLSAgICA8cmVmIG5hbWU9InN1cCIvPgotICAgIDxyZWYgbmFtZT0idHQiLz4KLSAgPC9jaG9pY2U+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvcnVieS5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3J1Ynkucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzE0YjM3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvcnVieS5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogcnVieS5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08ZGVmaW5lIG5hbWU9InJ1YnkiPgotICA8ZWxlbWVudCBuYW1lPSJydWJ5Ij4KLSAgICA8cmVmIG5hbWU9InJ1YnkuYXR0bGlzdCIvPgotICAgIDxjaG9pY2U+Ci0gICAgICA8Z3JvdXA+Ci0gICAgICAgIDxyZWYgbmFtZT0icmIiLz4KLSAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICA8cmVmIG5hbWU9InJ0Ii8+Ci0gICAgICAgICAgPGdyb3VwPgotICAgICAgICAgICAgPHJlZiBuYW1lPSJycCIvPgotICAgICAgICAgICAgPHJlZiBuYW1lPSJydCIvPgotICAgICAgICAgICAgPHJlZiBuYW1lPSJycCIvPgotICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgPC9ncm91cD4KLSAgICAgIDxncm91cD4KLSAgICAgICAgPHJlZiBuYW1lPSJyYmMiLz4KLSAgICAgICAgPHJlZiBuYW1lPSJydGMiLz4KLSAgICAgICAgPG9wdGlvbmFsPgotICAgICAgICAgIDxyZWYgbmFtZT0icnRjIi8+Ci0gICAgICAgIDwvb3B0aW9uYWw+Ci0gICAgICA8L2dyb3VwPgotICAgIDwvY2hvaWNlPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJydWJ5LmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InJiYyI+Ci0gIDxlbGVtZW50IG5hbWU9InJiYyI+Ci0gICAgPHJlZiBuYW1lPSJyYmMuYXR0bGlzdCIvPgotICAgIDxvbmVPck1vcmU+Ci0gICAgICA8cmVmIG5hbWU9InJiIi8+Ci0gICAgPC9vbmVPck1vcmU+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InJiYy5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJydGMiPgotICA8ZWxlbWVudCBuYW1lPSJydGMiPgotICAgIDxyZWYgbmFtZT0icnRjLmF0dGxpc3QiLz4KLSAgICA8b25lT3JNb3JlPgotICAgICAgPHJlZiBuYW1lPSJydCIvPgotICAgIDwvb25lT3JNb3JlPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJydGMuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0icmIiPgotICA8ZWxlbWVudCBuYW1lPSJyYiI+Ci0gICAgPHJlZiBuYW1lPSJyYi5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0icmIuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0icnQiPgotICA8ZWxlbWVudCBuYW1lPSJydCI+Ci0gICAgPHJlZiBuYW1lPSJydC5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0icnQuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJydCI+Ci0gICAgICA8cmVmIG5hbWU9Ik51bWJlci5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0icnAiPgotICA8ZWxlbWVudCBuYW1lPSJycCI+Ci0gICAgPHJlZiBuYW1lPSJycC5hdHRsaXN0Ii8+Ci0gICAgPHRleHQvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJycC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJJbmxpbmUuY2xhc3MiIGNvbWJpbmU9ImNob2ljZSI+Ci0gIDxyZWYgbmFtZT0icnVieSIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3NjcmlwdC5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3NjcmlwdC5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjdlNDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9zY3JpcHQucm5nCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogc2NyaXB0LnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLSAgICAKLTwhLS0gU2NyaXB0IE1vZHVsZSAtLT4KLTxncmFtbWFyIHhtbG5zPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCI+Ci0KLTxkZWZpbmUgbmFtZT0ic2NyaXB0Ij4KLSAgPGVsZW1lbnQgbmFtZT0ic2NyaXB0Ij4KLSAgICA8cmVmIG5hbWU9InNjcmlwdC5hdHRsaXN0Ii8+Ci0gICAgPHRleHQvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJzY3JpcHQuYXR0bGlzdCI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNoYXJzZXQiPgotICAgICAgPHJlZiBuYW1lPSJDaGFyc2V0LmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSI+Ci0gICAgPHJlZiBuYW1lPSJDb250ZW50VHlwZS5kYXRhdHlwZSIvPgotICA8L2F0dHJpYnV0ZT4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmVyIj4KLSAgICAgIDx2YWx1ZT5kZWZlcjwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InhtbDpzcGFjZSI+Ci0gICAgICA8dmFsdWU+cHJlc2VydmU8L3ZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ibm9zY3JpcHQiPgotICA8ZWxlbWVudCBuYW1lPSJub3NjcmlwdCI+Ci0gICAgPHJlZiBuYW1lPSJub3NjcmlwdC5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJCbG9jay5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJub3NjcmlwdC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJoZWFkLmNvbnRlbnQiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8emVyb09yTW9yZT4KLSAgICA8cmVmIG5hbWU9InNjcmlwdCIvPgotICA8L3plcm9Pck1vcmU+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJTY3JpcHQuY2xhc3MiPgotICA8Y2hvaWNlPgotICAgIDxyZWYgbmFtZT0ibm9zY3JpcHQiLz4KLSAgICA8cmVmIG5hbWU9InNjcmlwdCIvPgotICA8L2Nob2ljZT4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklubGluZS5jbGFzcyIgY29tYmluZT0iY2hvaWNlIj4KLSAgPHJlZiBuYW1lPSJTY3JpcHQuY2xhc3MiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IkJsb2NrLmNsYXNzIiBjb21iaW5lPSJjaG9pY2UiPgotICA8cmVmIG5hbWU9IlNjcmlwdC5jbGFzcyIvPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3NzaXNtYXAucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9zc2lzbWFwLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzYzZjNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3NzaXNtYXAucm5nCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogc3Npc21hcC5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTwhLS0gU2VydmVyLXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAtLT4KLTwhLS0gRGVwZW5kcyBvbiBpbWFnZSBtb2R1bGUuIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJpbWcuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImlzbWFwIj4KLSAgICAgIDx2YWx1ZT5pc21hcDwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvc3RydWN0LnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvc3RydWN0LnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkYTY0MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3N0cnVjdC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBzdHJ1Y3Qucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIFN0cnVjdHVyZSBNb2R1bGUgLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08c3RhcnQ+Ci0gIDxyZWYgbmFtZT0iaHRtbCIvPgotPC9zdGFydD4KLQotPGRlZmluZSBuYW1lPSJ0aXRsZSI+Ci0gIDxlbGVtZW50IG5hbWU9InRpdGxlIj4KLSAgICA8cmVmIG5hbWU9InRpdGxlLmF0dGxpc3QiLz4KLSAgICA8dGV4dC8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InRpdGxlLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkkxOG4uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJoZWFkIj4KLSAgPGVsZW1lbnQgbmFtZT0iaGVhZCI+Ci0gICAgPHJlZiBuYW1lPSJoZWFkLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9ImhlYWQuY29udGVudCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJoZWFkLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkkxOG4uYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0icHJvZmlsZS5hdHRsaXN0Ii8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJoZWFkLmNvbnRlbnQiPgotICA8cmVmIG5hbWU9InRpdGxlIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJwcm9maWxlLmF0dGxpc3QiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9maWxlIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+ICAgICAKLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImJvZHkiPgotICA8ZWxlbWVudCBuYW1lPSJib2R5Ij4KLSAgICA8cmVmIG5hbWU9ImJvZHkuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iQmxvY2subW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYm9keS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJodG1sIj4KLSAgPGVsZW1lbnQgbmFtZT0iaHRtbCI+Ci0gICAgPHJlZiBuYW1lPSJodG1sLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9ImhlYWQiLz4KLSAgICA8cmVmIG5hbWU9ImJvZHkiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iaHRtbC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJYSFRNTC52ZXJzaW9uLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9IkkxOG4uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJYSFRNTC52ZXJzaW9uLmF0dHJpYiI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iPgotICAgICAgPHJlZiBuYW1lPSJGUEkuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9zdHlsZS5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3N0eWxlLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiOTViNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3N0eWxlLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHN0eWxlLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLSAgICAKLTwhLS0gU3R5bGUgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJzdHlsZSI+Ci0gIDxlbGVtZW50IG5hbWU9InN0eWxlIj4KLSAgICA8cmVmIG5hbWU9InN0eWxlLmF0dGxpc3QiLz4KLSAgICA8dGV4dC8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InN0eWxlLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9InRpdGxlLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9IkkxOG4uYXR0cmliIi8+Ci0gIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSI+Ci0gICAgPHJlZiBuYW1lPSJDb250ZW50VHlwZS5kYXRhdHlwZSIvPgotICA8L2F0dHJpYnV0ZT4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVkaWEiPgotICAgICAgPHJlZiBuYW1lPSJNZWRpYURlc2MuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0ieG1sOnNwYWNlIj4KLSAgICAgIDx2YWx1ZT5wcmVzZXJ2ZTwvdmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJoZWFkLmNvbnRlbnQiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8emVyb09yTW9yZT4KLSAgICA8cmVmIG5hbWU9InN0eWxlIi8+Ci0gIDwvemVyb09yTW9yZT4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy90YWJsZS5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3RhYmxlLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiZGRmYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3RhYmxlLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB0YWJsZS5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08IS0tIFRhYmxlcyBNb2R1bGUgLS0+Ci08IS0tIFRoaXMgYnVpbGRzIG9uIHRoZSBiYXNpYyB0YWJsZXMgbW9kdWxlLCB1bmxpa2Ugd2l0aCB0aGUgRFRECi1pbXBsZW1lbnRhdGlvbi4gLS0+Ci08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08aW5jbHVkZSBocmVmPSJiYXNpYy10YWJsZS5ybmciPgotCi0gIDxkZWZpbmUgbmFtZT0idGFibGUiPgotICAgIDxlbGVtZW50IG5hbWU9InRhYmxlIj4KLSAgICAgIDxyZWYgbmFtZT0idGFibGUuYXR0bGlzdCIvPgotICAgICAgPG9wdGlvbmFsPgotCTxyZWYgbmFtZT0iY2FwdGlvbiIvPgotICAgICAgPC9vcHRpb25hbD4KLSAgICAgIDxjaG9pY2U+Ci0JPHplcm9Pck1vcmU+Ci0JICA8cmVmIG5hbWU9ImNvbCIvPgotCTwvemVyb09yTW9yZT4KLQk8emVyb09yTW9yZT4KLQkgIDxyZWYgbmFtZT0iY29sZ3JvdXAiLz4KLQk8L3plcm9Pck1vcmU+Ci0gICAgICA8L2Nob2ljZT4KLSAgICAgIDxjaG9pY2U+Ci0JPGdyb3VwPgotCSAgPG9wdGlvbmFsPgotCSAgICA8cmVmIG5hbWU9InRoZWFkIi8+Ci0JICA8L29wdGlvbmFsPgotCSAgPG9wdGlvbmFsPgotCSAgICA8cmVmIG5hbWU9InRmb290Ii8+Ci0JICA8L29wdGlvbmFsPgotCSAgPG9uZU9yTW9yZT4KLQkgICAgPHJlZiBuYW1lPSJ0Ym9keSIvPgotCSAgPC9vbmVPck1vcmU+Ci0JPC9ncm91cD4KLQk8b25lT3JNb3JlPgotCSAgPHJlZiBuYW1lPSJ0ciIvPgotCTwvb25lT3JNb3JlPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC9lbGVtZW50PgotICA8L2RlZmluZT4KLQotICA8ZGVmaW5lIG5hbWU9InRoIj4KLSAgICA8ZWxlbWVudCBuYW1lPSJ0aCI+Ci0gICAgICA8cmVmIG5hbWU9InRoLmF0dGxpc3QiLz4KLSAgICAgIDxyZWYgbmFtZT0iRmxvdy5tb2RlbCIvPgotICAgIDwvZWxlbWVudD4KLSAgPC9kZWZpbmU+Ci0KLSAgPGRlZmluZSBuYW1lPSJ0ZCI+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGQiPgotICAgICAgPHJlZiBuYW1lPSJ0ZC5hdHRsaXN0Ii8+Ci0gICAgICA8cmVmIG5hbWU9IkZsb3cubW9kZWwiLz4KLSAgICA8L2VsZW1lbnQ+Ci0gIDwvZGVmaW5lPgotCi0gIDxkZWZpbmUgbmFtZT0iQ2VsbEhBbGlnbi5hdHRyaWIiPgotICAgIDxvcHRpb25hbD4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPgotCTxjaG9pY2U+Ci0JICA8dmFsdWU+bGVmdDwvdmFsdWU+Ci0JICA8dmFsdWU+Y2VudGVyPC92YWx1ZT4KLQkgIDx2YWx1ZT5yaWdodDwvdmFsdWU+Ci0JICA8dmFsdWU+anVzdGlmeTwvdmFsdWU+Ci0JICA8dmFsdWU+Y2hhcjwvdmFsdWU+Ci0JPC9jaG9pY2U+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L29wdGlvbmFsPgotICAgIDxvcHRpb25hbD4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2hhciI+Ci0JPHJlZiBuYW1lPSJDaGFyYWN0ZXIuZGF0YXR5cGUiLz4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvb3B0aW9uYWw+Ci0gICAgPG9wdGlvbmFsPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFyb2ZmIj4KLQk8cmVmIG5hbWU9Ikxlbmd0aC5kYXRhdHlwZSIvPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9vcHRpb25hbD4KLSAgPC9kZWZpbmU+Ci0KLSAgPGRlZmluZSBuYW1lPSJDZWxsVkFsaWduLmF0dHJpYiI+Ci0gICAgPG9wdGlvbmFsPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWxpZ24iPgotCTxjaG9pY2U+Ci0JICA8dmFsdWU+dG9wPC92YWx1ZT4KLQkgIDx2YWx1ZT5taWRkbGU8L3ZhbHVlPgotCSAgPHZhbHVlPmJvdHRvbTwvdmFsdWU+Ci0JICA8dmFsdWU+YmFzZWxpbmU8L3ZhbHVlPgotCTwvY2hvaWNlPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9vcHRpb25hbD4KLSAgPC9kZWZpbmU+Ci0KLSAgPGRlZmluZSBuYW1lPSJzY29wZS5hdHRyaWIiPgotICAgIDxvcHRpb25hbD4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiPgotCTxjaG9pY2U+Ci0JICA8dmFsdWU+cm93PC92YWx1ZT4KLQkgIDx2YWx1ZT5jb2w8L3ZhbHVlPgotCSAgPHZhbHVlPnJvd2dyb3VwPC92YWx1ZT4KLQkgIDx2YWx1ZT5jb2xncm91cDwvdmFsdWU+Ci0JPC9jaG9pY2U+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L29wdGlvbmFsPgotICA8L2RlZmluZT4KLQotPC9pbmNsdWRlPgotCi08ZGVmaW5lIG5hbWU9InRhYmxlLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCI+Ci0gICAgICA8cmVmIG5hbWU9Ikxlbmd0aC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJib3JkZXIiPgotICAgICAgPHJlZiBuYW1lPSJQaXhlbHMuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPHJlZiBuYW1lPSJmcmFtZS5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJydWxlcy5hdHRyaWIiLz4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2VsbHNwYWNpbmciPgotICAgICAgPHJlZiBuYW1lPSJMZW5ndGguZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2VsbHBhZGRpbmciPgotICAgICAgPHJlZiBuYW1lPSJMZW5ndGguZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImNvbCI+Ci0gIDxlbGVtZW50IG5hbWU9ImNvbCI+Ci0gICAgPHJlZiBuYW1lPSJjb2wuYXR0bGlzdCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjb2wuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzcGFuIj4KLSAgICAgIDxyZWYgbmFtZT0iTnVtYmVyLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9IndpZHRoIj4KLSAgICAgIDxyZWYgbmFtZT0iTXVsdGlMZW5ndGguZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPHJlZiBuYW1lPSJDZWxsSEFsaWduLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9IkNlbGxWQWxpZ24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjb2xncm91cCI+Ci0gIDxlbGVtZW50IG5hbWU9ImNvbGdyb3VwIj4KLSAgICA8cmVmIG5hbWU9ImNvbGdyb3VwLmF0dGxpc3QiLz4KLSAgICA8emVyb09yTW9yZT4KLSAgICAgIDxyZWYgbmFtZT0iY29sIi8+Ci0gICAgPC96ZXJvT3JNb3JlPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjb2xncm91cC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9InNwYW4iPgotICAgICAgPHJlZiBuYW1lPSJOdW1iZXIuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0id2lkdGgiPgotICAgICAgPHJlZiBuYW1lPSJNdWx0aUxlbmd0aC5kYXRhdHlwZSIvPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotICA8cmVmIG5hbWU9IkNlbGxIQWxpZ24uYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0iQ2VsbFZBbGlnbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InRib2R5Ij4KLSAgPGVsZW1lbnQgbmFtZT0idGJvZHkiPgotICAgIDxyZWYgbmFtZT0idGJvZHkuYXR0bGlzdCIvPgotICAgIDxvbmVPck1vcmU+Ci0gICAgICA8cmVmIG5hbWU9InRyIi8+Ci0gICAgPC9vbmVPck1vcmU+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InRib2R5LmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJDZWxsSEFsaWduLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9IkNlbGxWQWxpZ24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0aGVhZCI+Ci0gIDxlbGVtZW50IG5hbWU9InRoZWFkIj4KLSAgICA8cmVmIG5hbWU9InRoZWFkLmF0dGxpc3QiLz4KLSAgICA8b25lT3JNb3JlPgotICAgICAgPHJlZiBuYW1lPSJ0ciIvPgotICAgIDwvb25lT3JNb3JlPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0aGVhZC5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0iQ2VsbEhBbGlnbi5hdHRyaWIiLz4KLSAgPHJlZiBuYW1lPSJDZWxsVkFsaWduLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0idGZvb3QiPgotICA8ZWxlbWVudCBuYW1lPSJ0Zm9vdCI+Ci0gICAgPHJlZiBuYW1lPSJ0Zm9vdC5hdHRsaXN0Ii8+Ci0gICAgPG9uZU9yTW9yZT4KLSAgICAgIDxyZWYgbmFtZT0idHIiLz4KLSAgICA8L29uZU9yTW9yZT4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0idGZvb3QuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICA8cmVmIG5hbWU9IkNlbGxIQWxpZ24uYXR0cmliIi8+Ci0gIDxyZWYgbmFtZT0iQ2VsbFZBbGlnbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImZyYW1lLmF0dHJpYiI+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImZyYW1lIj4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx2YWx1ZT52b2lkPC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPmFib3ZlPC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPmJlbG93PC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPmhzaWRlczwvdmFsdWU+Ci0gICAgICAgIDx2YWx1ZT5saHM8L3ZhbHVlPgotICAgICAgICA8dmFsdWU+cmhzPC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPnZzaWRlczwvdmFsdWU+Ci0gICAgICAgIDx2YWx1ZT5ib3g8L3ZhbHVlPgotICAgICAgICA8dmFsdWU+Ym9yZGVyPC92YWx1ZT4KLSAgICAgIDwvY2hvaWNlPgotICAgIDwvYXR0cmlidXRlPgotICA8L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0icnVsZXMuYXR0cmliIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVsZXMiPgotICAgICAgPGNob2ljZT4KLSAgICAgICAgPHZhbHVlPm5vbmU8L3ZhbHVlPgotICAgICAgICA8dmFsdWU+Z3JvdXBzPC92YWx1ZT4KLSAgICAgICAgPHZhbHVlPnJvd3M8L3ZhbHVlPgotICAgICAgICA8dmFsdWU+Y29sczwvdmFsdWU+Ci0gICAgICAgIDx2YWx1ZT5hbGw8L3ZhbHVlPgotICAgICAgPC9jaG9pY2U+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvdGFyZ2V0LnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvdGFyZ2V0LnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkOWM0Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3RhcmdldC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB0YXJnZXQucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotICAgIAotPCEtLSBUYXJnZXQgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJhLmF0dGxpc3QiIGNvbWJpbmU9ImludGVybGVhdmUiPgotICA8cmVmIG5hbWU9InRhcmdldC5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImFyZWEuYXR0bGlzdCIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxyZWYgbmFtZT0idGFyZ2V0LmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYmFzZS5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJ0YXJnZXQuYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJsaW5rLmF0dHJpYiIgY29tYmluZT0iaW50ZXJsZWF2ZSI+Ci0gIDxyZWYgbmFtZT0idGFyZ2V0LmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZm9ybS5hdHRsaXN0IiBjb21iaW5lPSJpbnRlcmxlYXZlIj4KLSAgPHJlZiBuYW1lPSJ0YXJnZXQuYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJ0YXJnZXQuYXR0cmliIj4KLSAgPG9wdGlvbmFsPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0Ii8+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPC9ncmFtbWFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvdGV4dC5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3RleHQucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDdjNzdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvdGV4dC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdGV4dC5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08IS0tIFRleHQgTW9kdWxlIC0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGRlZmluZSBuYW1lPSJiciI+Ci0gIDxlbGVtZW50IG5hbWU9ImJyIj4KLSAgICA8cmVmIG5hbWU9ImJyLmF0dGxpc3QiLz4KLSAgICA8ZW1wdHkvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJici5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb3JlLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic3BhbiI+Ci0gIDxlbGVtZW50IG5hbWU9InNwYW4iPgotICAgIDxyZWYgbmFtZT0ic3Bhbi5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic3Bhbi5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJhYmJyIj4KLSAgPGVsZW1lbnQgbmFtZT0iYWJiciI+Ci0gICAgPHJlZiBuYW1lPSJhYmJyLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJhYmJyLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImFjcm9ueW0iPgotICA8ZWxlbWVudCBuYW1lPSJhY3JvbnltIj4KLSAgICA8cmVmIG5hbWU9ImFjcm9ueW0uYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImFjcm9ueW0uYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iY2l0ZSI+Ci0gIDxlbGVtZW50IG5hbWU9ImNpdGUiPgotICAgIDxyZWYgbmFtZT0iY2l0ZS5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iY2l0ZS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjb2RlIj4KLSAgPGVsZW1lbnQgbmFtZT0iY29kZSI+Ci0gICAgPHJlZiBuYW1lPSJjb2RlLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJjb2RlLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImRmbiI+Ci0gIDxlbGVtZW50IG5hbWU9ImRmbiI+Ci0gICAgPHJlZiBuYW1lPSJkZm4uYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImRmbi5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJlbSI+Ci0gIDxlbGVtZW50IG5hbWU9ImVtIj4KLSAgICA8cmVmIG5hbWU9ImVtLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJlbS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJrYmQiPgotICA8ZWxlbWVudCBuYW1lPSJrYmQiPgotICAgIDxyZWYgbmFtZT0ia2JkLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJrYmQuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0icSI+Ci0gIDxlbGVtZW50IG5hbWU9InEiPgotICAgIDxyZWYgbmFtZT0icS5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0icS5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci0gIDxvcHRpb25hbD4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNpdGUiPgotICAgICAgPHJlZiBuYW1lPSJVUkkuZGF0YXR5cGUiLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InNhbXAiPgotICA8ZWxlbWVudCBuYW1lPSJzYW1wIj4KLSAgICA8cmVmIG5hbWU9InNhbXAuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InNhbXAuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic3Ryb25nIj4KLSAgPGVsZW1lbnQgbmFtZT0ic3Ryb25nIj4KLSAgICA8cmVmIG5hbWU9InN0cm9uZy5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0ic3Ryb25nLmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InZhciI+Ci0gIDxlbGVtZW50IG5hbWU9InZhciI+Ci0gICAgPHJlZiBuYW1lPSJ2YXIuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InZhci5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJkaXYiPgotICA8ZWxlbWVudCBuYW1lPSJkaXYiPgotICAgIDxyZWYgbmFtZT0iZGl2LmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IkZsb3cubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iZGl2LmF0dGxpc3QiPgotICA8cmVmIG5hbWU9IkNvbW1vbi5hdHRyaWIiLz4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InAiPgotICA8ZWxlbWVudCBuYW1lPSJwIj4KLSAgICA8cmVmIG5hbWU9InAuYXR0bGlzdCIvPgotICAgIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9InAuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYWRkcmVzcyI+Ci0gIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiPgotICAgIDxyZWYgbmFtZT0iYWRkcmVzcy5hdHRsaXN0Ii8+Ci0gICAgPHJlZiBuYW1lPSJJbmxpbmUubW9kZWwiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLTxkZWZpbmUgbmFtZT0iYWRkcmVzcy5hdHRsaXN0Ij4KLSAgPHJlZiBuYW1lPSJDb21tb24uYXR0cmliIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJibG9ja3F1b3RlIj4KLSAgPGVsZW1lbnQgbmFtZT0iYmxvY2txdW90ZSI+Ci0gICAgPHJlZiBuYW1lPSJibG9ja3F1b3RlLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IkJsb2NrLm1vZGVsIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImJsb2NrcXVvdGUuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjaXRlIj4KLSAgICAgIDxyZWYgbmFtZT0iVVJJLmRhdGF0eXBlIi8+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvb3B0aW9uYWw+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJwcmUiPgotICA8ZWxlbWVudCBuYW1lPSJwcmUiPgotICAgIDxyZWYgbmFtZT0icHJlLmF0dGxpc3QiLz4KLSAgICA8cmVmIG5hbWU9IklubGluZS5tb2RlbCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJwcmUuYXR0bGlzdCI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotICA8b3B0aW9uYWw+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ4bWw6c3BhY2UiPgotICAgICAgPHZhbHVlPnByZXNlcnZlPC92YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9vcHRpb25hbD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9ImgxIj4KLSAgPGVsZW1lbnQgbmFtZT0iaDEiPgotICAgIDxyZWYgbmFtZT0iSGVhZGluZy5hdHRyaWIiLz4KLSAgICA8cmVmIG5hbWU9IkhlYWRpbmcuY29udGVudCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLSAKLTxkZWZpbmUgbmFtZT0iaDIiPgotICA8ZWxlbWVudCBuYW1lPSJoMiI+Ci0gICAgPHJlZiBuYW1lPSJIZWFkaW5nLmF0dHJpYiIvPgotICAgIDxyZWYgbmFtZT0iSGVhZGluZy5jb250ZW50Ii8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotIAotPGRlZmluZSBuYW1lPSJoMyI+Ci0gIDxlbGVtZW50IG5hbWU9ImgzIj4KLSAgICA8cmVmIG5hbWU9IkhlYWRpbmcuYXR0cmliIi8+Ci0gICAgPHJlZiBuYW1lPSJIZWFkaW5nLmNvbnRlbnQiLz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0gCi08ZGVmaW5lIG5hbWU9Img0Ij4KLSAgPGVsZW1lbnQgbmFtZT0iaDQiPgotICAgIDxyZWYgbmFtZT0iSGVhZGluZy5hdHRyaWIiLz4KLSAgICA8cmVmIG5hbWU9IkhlYWRpbmcuY29udGVudCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLSAKLTxkZWZpbmUgbmFtZT0iaDUiPgotICA8ZWxlbWVudCBuYW1lPSJoNSI+Ci0gICAgPHJlZiBuYW1lPSJIZWFkaW5nLmF0dHJpYiIvPgotICAgIDxyZWYgbmFtZT0iSGVhZGluZy5jb250ZW50Ii8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9Img2Ij4KLSAgPGVsZW1lbnQgbmFtZT0iaDYiPgotICAgIDxyZWYgbmFtZT0iSGVhZGluZy5hdHRyaWIiLz4KLSAgICA8cmVmIG5hbWU9IkhlYWRpbmcuY29udGVudCIvPgotICA8L2VsZW1lbnQ+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJIZWFkaW5nLmF0dHJpYiI+Ci0gIDxyZWYgbmFtZT0iQ29tbW9uLmF0dHJpYiIvPgotPC9kZWZpbmU+Ci0gCi08ZGVmaW5lIG5hbWU9IkhlYWRpbmcuY29udGVudCI+Ci0gIDxyZWYgbmFtZT0iSW5saW5lLm1vZGVsIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJIZWFkaW5nLmNsYXNzIj4KLSAgPGNob2ljZT4KLSAgICA8cmVmIG5hbWU9ImgxIi8+Ci0gICAgPHJlZiBuYW1lPSJoMiIvPgotICAgIDxyZWYgbmFtZT0iaDMiLz4KLSAgICA8cmVmIG5hbWU9Img0Ii8+Ci0gICAgPHJlZiBuYW1lPSJoNSIvPgotICAgIDxyZWYgbmFtZT0iaDYiLz4KLSAgPC9jaG9pY2U+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJCbG9jay5jbGFzcyI+Ci0gIDxjaG9pY2U+Ci0gICAgPHJlZiBuYW1lPSJhZGRyZXNzIi8+Ci0gICAgPHJlZiBuYW1lPSJibG9ja3F1b3RlIi8+Ci0gICAgPHJlZiBuYW1lPSJkaXYiLz4KLSAgICA8cmVmIG5hbWU9InAiLz4KLSAgICA8cmVmIG5hbWU9InByZSIvPgotICAgIDxyZWYgbmFtZT0iSGVhZGluZy5jbGFzcyIvPgotICA8L2Nob2ljZT4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklubGluZS5jbGFzcyI+Ci0gIDxjaG9pY2U+Ci0gICAgPHJlZiBuYW1lPSJhYmJyIi8+Ci0gICAgPHJlZiBuYW1lPSJhY3JvbnltIi8+Ci0gICAgPHJlZiBuYW1lPSJiciIvPgotICAgIDxyZWYgbmFtZT0iY2l0ZSIvPgotICAgIDxyZWYgbmFtZT0iY29kZSIvPgotICAgIDxyZWYgbmFtZT0iZGZuIi8+Ci0gICAgPHJlZiBuYW1lPSJlbSIvPgotICAgIDxyZWYgbmFtZT0ia2JkIi8+Ci0gICAgPHJlZiBuYW1lPSJxIi8+Ci0gICAgPHJlZiBuYW1lPSJzYW1wIi8+Ci0gICAgPHJlZiBuYW1lPSJzcGFuIi8+Ci0gICAgPHJlZiBuYW1lPSJzdHJvbmciLz4KLSAgICA8cmVmIG5hbWU9InZhciIvPgotICA8L2Nob2ljZT4KLTwvZGVmaW5lPgotCi08ZGVmaW5lIG5hbWU9IklubGluZS5tb2RlbCI+Ci0gIDx6ZXJvT3JNb3JlPgotICAgIDxjaG9pY2U+Ci0gICAgICA8dGV4dC8+Ci0gICAgICA8cmVmIG5hbWU9IklubGluZS5jbGFzcyIvPgotICAgIDwvY2hvaWNlPgotICA8L3plcm9Pck1vcmU+Ci08L2RlZmluZT4KLQotPCEtLSBUaGlzIGlzIHJlZGVmaW5lZCBieSB0aGUgbGVnYWN5IG1vZHVsZSB0byBpbmNsdWRlIGlubGluZXMuIC0tPgotPGRlZmluZSBuYW1lPSJCbG9jay5taXgiPgotICA8cmVmIG5hbWU9IkJsb2NrLmNsYXNzIi8+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJCbG9jay5tb2RlbCI+Ci0gIDxvbmVPck1vcmU+Ci0gICAgPHJlZiBuYW1lPSJCbG9jay5taXgiLz4KLSAgPC9vbmVPck1vcmU+Ci08L2RlZmluZT4KLQotPGRlZmluZSBuYW1lPSJGbG93Lm1vZGVsIj4KLSAgPHplcm9Pck1vcmU+Ci0gICAgPGNob2ljZT4KLSAgICAgIDx0ZXh0Lz4KLSAgICAgIDxyZWYgbmFtZT0iSW5saW5lLmNsYXNzIi8+Ci0gICAgICA8cmVmIG5hbWU9IkJsb2NrLmNsYXNzIi8+Ci0gICAgPC9jaG9pY2U+Ci0gIDwvemVyb09yTW9yZT4KLTwvZGVmaW5lPgotCi08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwveGh0bWwtYmFzaWMucm5nIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwveGh0bWwtYmFzaWMucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmExMzBkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL3hodG1sLWJhc2ljLnJuZworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB4aHRtbC1iYXNpYy5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTwhLS0gWEhUTUwgQmFzaWMgLS0+Ci0KLTxncmFtbWFyIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIj4KLQotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZGF0YXR5cGVzLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYXR0cmlicy5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3N0cnVjdC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3RleHQucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9oeXBlcnRleHQucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9saXN0LnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYmFzaWMtZm9ybS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jhc2ljLXRhYmxlLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvaW1hZ2Uucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9wYXJhbS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL29iamVjdC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL21ldGEucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9saW5rLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYmFzZS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3ByZXMucm5nIi8+Ci0KLTwvZ3JhbW1hcj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL3hodG1sLXN0cmljdC5ybmcgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC94aHRtbC1zdHJpY3Qucm5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWU4NzNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL3hodG1sLXN0cmljdC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB4aHRtbC1zdHJpY3Qucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotCi08IS0tIFhIVE1MIFN0cmljdCAtLT4KLQotPGdyYW1tYXIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9kYXRhdHlwZXMucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9hdHRyaWJzLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvc3RydWN0LnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvdGV4dC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2h5cGVydGV4dC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2xpc3Qucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9pbWFnZS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3NzaXNtYXAucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9iYXNlLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvbGluay5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL21ldGEucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9wYXJhbS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL29iamVjdC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jkby5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3ByZXMucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9lZGl0LnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYXBwbGV0LnJuZyIvPgotPCEtLSA8aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9iYXNpYy1mb3JtLnJuZyIvPiAtLT4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Zvcm0ucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9zdHlsZS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3NjcmlwdC5ybmciLz4KLTwhLS0gPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYmFzaWMtdGFibGUucm5nIi8+IC0tPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvdGFibGUucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9jc2lzbWFwLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZXZlbnRzLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvaW5sc3R5bGUucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy90YXJnZXQucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9pZnJhbWUucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9uYW1laWRlbnQucm5nIi8+Ci0KLTwvZ3JhbW1hcj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL3hodG1sLnJuZyBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL3hodG1sLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ4YmVmMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC94aHRtbC5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogeGh0bWwucm5nIDQyNzAyIDIwMDQtMDMtMTMgMTI6MzQ6MThaIGdyZWdvciAkIC0tPgotICAgIAotPGdyYW1tYXIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiPgotCi08IS0tIFhIVE1MIC0tPgotPCEtLSBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSB1bmlvbiBvZiB0cmFuc2l0aW9uYWwgYW5kIGZyYW1lc2V0LiAtLT4KLQotCi08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9kYXRhdHlwZXMucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9hdHRyaWJzLnJuZyIvPgotPCEtLSA8aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9zdHJ1Y3Qucm5nIi8+IC0tPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvZnJhbWVzLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvdGV4dC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2h5cGVydGV4dC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2xpc3Qucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9pbWFnZS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3NzaXNtYXAucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9iYXNlLnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvbGluay5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL21ldGEucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9wYXJhbS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL29iamVjdC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Jkby5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3ByZXMucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9lZGl0LnJuZyIvPgotPGluY2x1ZGUgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hodG1sL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sL21vZHVsZXMvYXBwbGV0LnJuZyIvPgotPCEtLSA8aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9iYXNpYy1mb3JtLnJuZyIvPiAtLT4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2Zvcm0ucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9zdHlsZS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3NjcmlwdC5ybmciLz4KLTwhLS0gPGluY2x1ZGUgaHJlZj0ibW9kdWxlcy9iYXNpYy10YWJsZS5ybmciLz4gLS0+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy90YWJsZS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2NzaXNtYXAucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9ldmVudHMucm5nIi8+Ci08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwvbW9kdWxlcy9pbmxzdHlsZS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL3RhcmdldC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2lmcmFtZS5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL25hbWVpZGVudC5ybmciLz4KLTxpbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvc2NoZW1hcy94aHRtbC9tb2R1bGVzL2xlZ2FjeS5ybmciLz4KLQotPC9ncmFtbWFyPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvc2FtcGxlcy9zYW1wbGVzLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3NhbXBsZXMvc2FtcGxlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTM4YTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvc2FtcGxlcy9zYW1wbGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08c2FtcGxlcz4KLSAgPHNhbXBsZSAKLSAgICBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3hodG1sK3htbCIKLSAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9zYW1wbGVzL3hodG1sLnhtbCIKLSAgLz4KLSAgPHNhbXBsZSAKLSAgICBuYW1lPSJUd28gQ29sdW1uIExheW91dCIgCi0gICAgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiCi0gICAgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvc2FtcGxlcy94aHRtbC0yY29sLnhtbCIKLSAgLz4KLTwvc2FtcGxlcz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3NhbXBsZXMveGh0bWwtMmNvbC54bWwgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9zYW1wbGVzL3hodG1sLTJjb2wueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGYzMGI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3NhbXBsZXMveGh0bWwtMmNvbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIKLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPk5ldyAyLWNvbHVtbiBYSFRNTCBkb2N1bWVudDwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPGJvZHk+ICAKLSAgCi0gICAgPGgyPk5ldyAyLWNvbHVtbiBYSFRNTCBkb2N1bWVudDwvaDI+Ci0gICAgCi0gICAgPHA+SGVyZSBjb21lcyB0aGUgdGV4dCBvZiB5b3VyIG5ldyBkb2N1bWVudC4uLjwvcD4KLSAgICA8cD4KLSAgICAgVG8gYWRkIHJlYWwgY29udGVudCwgdXNlIG9uZSBvZiB0aGUgZWRpdG9ycyBsaXN0ZWQgaW4gdGhlCi0gICAgIDxzdHJvbmc+RWRpdDwvc3Ryb25nPiBtZW51LgotICAgIDwvcD4KLQotICAgIDxkaXYgY2xhc3M9ImNvbHVtbjFvZjIiPiAKLSAgICAgIDxoMz5Db2x1bW4gMTwvaDM+Ci0gICAgICA8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdC4gCi0gICAgICBGdXNjZSB2b2x1dHBhdCBhbGlxdWFtIHJpc3VzLiBQcm9pbiBpbiBkdWkgbmVjIGFyY3Ugc2FnaXR0aXMgcGxhY2VyYXQuIAotICAgICAgPC9wPgotICAgPC9kaXY+Ci0KLSAgIDxkaXYgY2xhc3M9ImNvbHVtbjJvZjIiPgotICAgICAgPGgzPkNvbHVtbiAyPC9oMz4KLSAgICAgIDxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiAKLSAgICAgIEZ1c2NlIHZvbHV0cGF0IGFsaXF1YW0gcmlzdXMuIFByb2luIGluIGR1aSBuZWMgYXJjdSBzYWdpdHRpcyBwbGFjZXJhdC4gCi0gICAgICA8L3A+Ci0gICAgPC9kaXY+Ci0KLSAgICA8ZGl2PgotICAgICAgPGJyIGNsYXNzPSJjbGVhciIgLz4KLSAgICAgIDxiciAvPjxiciAvPgotICAgICAgPGJyIC8+PGJyIC8+Ci0gICAgICA8YnIgLz48YnIgLz4KLSAgICAgIDxiciAvPjxiciAvPgotICAgIDwvZGl2PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC9zYW1wbGVzL3hodG1sLnhtbCBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3NhbXBsZXMveGh0bWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmU2YTk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3NhbXBsZXMveGh0bWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiCi0+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT5OZXcgWEhUTUwgZG9jdW1lbnQ8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgIDxoMT5OZXcgWEhUTUwgZG9jdW1lbnQ8L2gxPgotICAgIDxwPkhlcmUgY29tZXMgdGhlIHRleHQgb2YgeW91ciBuZXcgZG9jdW1lbnQuLi48L3A+Ci0gICAgPHA+Ci0gICAgICBUbyBhZGQgcmVhbCBjb250ZW50LCB1c2Ugb25lIG9mIHRoZSBlZGl0b3JzIGxpc3RlZCBpbiB0aGUKLSAgICAgIDxzdHJvbmc+RWRpdDwvc3Ryb25nPiBtZW51LgotICAgIDwvcD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTVlMTFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZG9jdHlwZXMueG1hcCAxNzk0ODggMjAwNS0wNi0wMiAwMjoyOTozOVogZ3JlZ29yICQgLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPG1hcDpjb21wb25lbnRzPgotICAKLSAgICA8bWFwOnNlcmlhbGl6ZXJzIGRlZmF1bHQ9InhodG1sIj4gCi0gICAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0ieG1sLWdldCIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5zZXJpYWxpemF0aW9uLlhNTFNlcmlhbGl6ZXIiIG1pbWUtdHlwZT0idGV4dC94bWwiPgotICAgICAgICA8ZG9jdHlwZS1wdWJsaWM+LS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU48L2RvY3R5cGUtcHVibGljPgotICAgICAgICA8ZG9jdHlwZS1zeXN0ZW0+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZDwvZG9jdHlwZS1zeXN0ZW0+Ci0gICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+Ci0gICAgICA8L21hcDpzZXJpYWxpemVyPgotICAgIDwvbWFwOnNlcmlhbGl6ZXJzPgotIAotICA8L21hcDpjb21wb25lbnRzPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotCi0gICAgPCEtLSBzZWFyY2ggcGlwZWxpbmUgLS0+Ci0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIAotICAgICAgPCEtLSB7cHViLWlkfS97YXJlYX0ve3V1aWR9L3tsYW5ndWFnZX0gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im1ldGFkYXRhLyovKi8qLyoiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9ImxlbnlhTWV0YURhdGEiIHNyYz0ibGVueWEtZG9jdW1lbnQ6ezN9LHB1Yj17MX0sYXJlYT17Mn0sbGFuZz17NH0iLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSB7cHViLWlkfS97YXJlYX0ve3V1aWR9L3tsYW5ndWFnZX0gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Imx1Y2VuZS1pbmRleC8qLyovKi8qIj4KLSAgICAgICAgPG1hcDphZ2dyZWdhdGUgZWxlbWVudD0iY21zYm9keSI+Ci0gICAgICAgICAgPG1hcDpwYXJ0IHNyYz0ibGVueWEtZG9jdW1lbnQ6ezN9LHB1Yj17MX0sYXJlYT17Mn0sbGFuZz17NH0iLz4KLSAgICAgICAgICA8bWFwOnBhcnQgc3JjPSJjb2Nvb246L21ldGFkYXRhL3sxfS97Mn0vezN9L3s0fSIvPgotICAgICAgICA8L21hcDphZ2dyZWdhdGU+Ci0gIAotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC94c2x0L3hodG1sMmluZGV4LnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJsIiB2YWx1ZT0ie3JlcXVlc3Q6cmVxdWVzdFVSSX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICAKLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8IS0tIHdlYmRhdiBHRVQgbWF0Y2hlciAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iZGF2Z2V0LnhtbCI+Ci0gICAgICAgIDxtYXA6YWN0IHR5cGU9InNldC1oZWFkZXIiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Ikxhc3QtTW9kaWZpZWQiIHZhbHVlPSJ7ZGF0ZS1pc284NjAxLXJmYzgyMjp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYXN0bW9kaWZpZWR9fSIgLz4KLSAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0ibGVueWEtZG9jdW1lbnQ6e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0sbGFuZz17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1sYW5ndWFnZX0iLz4KLSAgICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJ1dWlkMnVybCIvPgotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ij4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVybHMiIHZhbHVlPSJhYnNvbHV0ZSIvPgotICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwtZ2V0Ii8+Ci0gICAgICAgIDwvbWFwOmFjdD4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIHBhcmFtZXRyaXplZCBkb2N0eXBlIG1hdGNoZXIgLS0+Ci0gICAgICA8IS0tIHBhdHRlcm49Intmb3JtYXR9LnhtbCIgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioueG1sIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvY29vbjovezF9LnhtbC97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9Ii8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0ge2Zvcm1hdH0ueG1sL3twdWJJZH0ve2FyZWF9L3t1dWlkfS97bGFuZ3VhZ2V9IC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLnhtbC8qLyovKi8qIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImxlbnlhLWRvY3VtZW50Ons0fSxsYW5nPXs1fXtsaW5rOnJldn0iLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwveHNsdC94aHRtbDJ4aHRtbC54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InJlbmRlcnR5cGUiIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpyZW5kZXJ0eXBlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Im5vZGVpZCIgdmFsdWU9Intkb2MtaW5mbzp7Mn06ezN9Ons0fTp7NX06bm9kZU5hbWV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibGFuZ3VhZ2UiIHZhbHVlPSJ7NH0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJjaW5jbHVkZSIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Imljb24vKi8qLyovKiI+Ci0gICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC9yZXNvdXJjZXMvaWNvbnMveGh0bWwuZ2lmIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveGh0bWwveHNsdC9jbGVhbi14aHRtbC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC94c2x0L2NsZWFuLXhodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkNDU0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC94c2x0L2NsZWFuLXhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIgotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgID4KLQotICA8eHNsOmltcG9ydCBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMva3VwdS9yZXNvdXJjZXMva3VwdS9hcGFjaGUtbGVueWEvbGVueWEva3VwdXNhdmUueHNsIi8+Ci0gIDx4c2w6aW1wb3J0IGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9ieGUveHNsdC9jaGFuZ2Utb2JqZWN0LXBhdGgtYmFjay54c2wiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIFByZXZlbnRzIGVtcHR5IHRpdGxlcyBmcm9tIGludGVyZmVyaW5nIHdpdGggSUUgZHVyaW5nIGVkaXRpbmcgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOnRpdGxlIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InRpdGxlIiBzZWxlY3Q9Ii4iIC8+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aCgkdGl0bGUpID0gMCI+Ci0gICAgICAgIDx4aHRtbDp0aXRsZT4mIzE2MDs8L3hodG1sOnRpdGxlPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmNvcHk+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICAgICAgPC94c2w6Y29weT4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLQotICA8IS0tIFJlbW92ZSB0YWcgdGhhdCBkaXNhYmxlcyBGaXJlZm94IHNwZWxsIGNoZWNrIGluIEZDSyAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6Ym9keVtAc3BlbGxjaGVja10iID4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKltuYW1lKCkhPSdzcGVsbGNoZWNrJ10iIC8+Ci0gICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tIFVuc3VwcG9ydGVkIGJ5IHRoZSBzY2hlbWEgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBzaGFwZXxAdGFyZ2V0fHhodG1sOnUiPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6YiI+Ci0gICAgPHhodG1sOnN0cm9uZz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94aHRtbDpzdHJvbmc+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aSI+Ci0gICAgPHhodG1sOmVtPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hodG1sOmVtPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZSBjb252ZXJ0cyB0aGUgaW1nIHRhZyB0byBvYmplY3QgCi0gICAgZm9yIG1vcmUsIHNlZSBodHRwOi8vd3d3LnhtbC5jb20vcHViL2EvMjAwMy8wNy8wMi9kaXZlLmh0bWwgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmltZyI+Ci0gICAgPG9iamVjdD4KLSAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRhdGEiPgotICAgICAgICA8IS0tIHN0cmlwIHRoZSBub2RlaWQgb3V0IGFnYWluIChpdCBpcyBub3Qgc2F2ZWQgaW4gdGhlIG9iamVjdCBAZGF0YSkgLS0+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdGFydHMtd2l0aChAc3JjLCAnLycpIj4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3JjIi8+ICAgICAgICAgICAgICAKLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdGFydHMtd2l0aChAc3JjLCAnaHR0cDonKSBvciBzdGFydHMtd2l0aChAc3JjLCAnaHR0cHM6JykiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzcmMiLz4gICAgICAgICAgICAgIAotICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKEBzcmMsICcvJykiLz4KLSAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRpdGxlIj4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbHQiLz4KLSAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgIDwhLS0gdXNlIHRoZSByYXJlbHktdXNlZCBpc21hcCB0byByb3VuZHRyaXAgdGhlIHR5cGUgYXR0cmlidXRlIGZvciB0aGUgb2JqZWN0IGVsZW1lbnQgLS0+Ci0gICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpc21hcCIvPgotICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmcoQGhlaWdodCkiPgotICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJoZWlnaHQiPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaGVpZ2h0Ii8+Ci0gICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgIDwveHNsOmlmPiAKLSAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nKEB3aWR0aCkiPgotICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCI+Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB3aWR0aCIvPgotICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICA8L3hzbDppZj4gICAgICAgICAKLSAgICA8L29iamVjdD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJsZW55YTphc3NldCI+Ci0gICAgPHA+Ci0gICAgICA8YSBocmVmPSJ7QHNyY30iIGNsYXNzPSJsZW55YS5hc3NldCI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYT4KLSAgICA8L3A+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3hzbHQvaGVscGVyLW9iamVjdC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy94aHRtbC94c2x0L2hlbHBlci1vYmplY3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmYwMzlhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3hzbHQvaGVscGVyLW9iamVjdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHhodG1sMnhodG1sLnhzbCAyMDE3NzYgMjAwNS0wNi0yNSAxODoyNToyNlogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIgCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgotICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4aHRtbCBsZW55YSIKLSAgICA+Ci0KLTx4c2w6cGFyYW0gbmFtZT0icmVuZGVydHlwZSIgc2VsZWN0PSInJyIvPgotPHhzbDpwYXJhbSBuYW1lPSJub2RlaWQiLz4KLSAgIDwhLS0gdGhpcyB0ZW1wbGF0ZSBjb252ZXJ0cyB0aGUgb2JqZWN0IHRhZyB0byBpbWcgKGZvciBjb21wYXRpYmxpdHkgd2l0aCBvbGRlciBicm93c2VycyAKLSAgICBmb3IgbW9yZSwgc2VlIGh0dHA6Ly93d3cueG1sLmNvbS9wdWIvYS8yMDAzLzA3LzAyL2RpdmUuaHRtbCAtLT4KLSAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ib2JqZWN0MmltZyI+Ci0gICAgICA8aW1nIGJvcmRlcj0iMCI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InNyYyI+Ci0gICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RhcnRzLXdpdGgoQGRhdGEsICdsZW55YS1kb2N1bWVudDonKSI+Ci0gICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGF0YSIvPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3Qoc3RhcnRzLXdpdGgoQGRhdGEsICcvJykgb3Igc3RhcnRzLXdpdGgoQGRhdGEsICdodHRwOi8vJykpIj4KLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub2RlaWQiLz4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkYXRhIi8+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGF0YSIvPgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbHQiPgotICAgICAgICAgIDwhLS0gdGhlIG92ZXJ3cml0dGVuIHRpdGxlIChzdG9yZWQgaW4gQG5hbWUpIGhhcyBwcmVjZWRlbmNlIG92ZXIgZGM6dGl0bGUgLS0+Ci0gICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5hbWUgIT0gJyciPgotICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHRpdGxlICE9ICcnIj4KLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGM6bWV0YWRhdGEvZGM6dGl0bGUiLz4gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZyhAaGVpZ2h0KSI+Ci0gICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaGVpZ2h0Ij4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaGVpZ2h0Ii8+Ci0gICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8L3hzbDppZj4gCi0gICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nKEB3aWR0aCkiPgotICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9IndpZHRoIj4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAd2lkdGgiLz4KLSAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IkBjbGFzcyI+Ci0gICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbGFzcyIvPgotICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94c2w6aWY+ICAgICAgICAgCi0gICAgICA8L2ltZz4KLSAgIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6b2JqZWN0IiBwcmlvcml0eT0iMyI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGhyZWYgIT0gJyciPgotICAgICAgICA8YSBocmVmPSJ7QGhyZWZ9Ij4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib2JqZWN0MmltZyIvPgotICAgICAgICA8L2E+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlID0gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJyI+Ci0gICAgICAgIDxvYmplY3QgY2xhc3NpZD0iY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtb3ZpZSIgdmFsdWU9Inskbm9kZWlkfS97QGRhdGF9Ii8+Ci0gICAgICAgIDwvb2JqZWN0PgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib2JqZWN0MmltZyIvPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+ICAKLQotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC94c2x0L3hodG1sMmluZGV4LnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3hzbHQveGh0bWwyaW5kZXgueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRmNzYyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3hzbHQveGh0bWwyaW5kZXgueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmx1Y2VuZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2x1Y2VuZS8xLjAiCi0gIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiCi0gIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKLT4KLQotPHhzbDpwYXJhbSBuYW1lPSJ1cmkiLz4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJib29zdCIgc2VsZWN0PSJudW1iZXIoL2Rlc2NlbmRhbnQtb3Itc2VsZjo6ZGM6cmlnaHRzKSIvPiAgCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICA8IS0tIGF0dHJpYnV0ZXMgb2YgdGhlIGluZGV4IGFuZCBkb2N1bWVudCBlbGVtZW50IHdpbGwgYmUgYWRkZWQgYnkgdGhlIGx1Y2VuZSBtb2R1bGUgLS0+Ci0gIDxsdWNlbmU6aW5kZXg+Ci0gICAgPGx1Y2VuZTpkb2N1bWVudD4KLSAgICAgIDxsdWNlbmU6ZmllbGQgbmFtZT0idXJsIiBib29zdD0ieyRib29zdH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXJpIi8+PC9sdWNlbmU6ZmllbGQ+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC9sdWNlbmU6ZG9jdW1lbnQ+Ci0gIDwvbHVjZW5lOmluZGV4PiAgCi08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGM6cmlnaHRzIiBwcmlvcml0eT0iMSIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpib2R5IiBwcmlvcml0eT0iMSI+Ci0gIDxsdWNlbmU6ZmllbGQgbmFtZT0iYm9keSIgYm9vc3Q9InskYm9vc3R9Ij4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi8vdGV4dCgpIj4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQobm9ybWFsaXplLXNwYWNlKC4pLCcgJykiLz4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLSAgPC9sdWNlbmU6ZmllbGQ+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGM6dGl0bGUiIHByaW9yaXR5PSIxIj4KLSAgPGx1Y2VuZTpmaWVsZCBuYW1lPSJ0aXRsZSIgYm9vc3Q9InskYm9vc3R9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvbHVjZW5lOmZpZWxkPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRjOmRlc2NyaXB0aW9uIiBwcmlvcml0eT0iMSI+Ci0gIDxsdWNlbmU6ZmllbGQgbmFtZT0iZGVzY3JpcHRpb24iIGJvb3N0PSJ7JGJvb3N0fSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L2x1Y2VuZTpmaWVsZD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJkYzpzdWJqZWN0IiBwcmlvcml0eT0iMSI+Ci0gIDxsdWNlbmU6ZmllbGQgbmFtZT0ic3ViamVjdCIgYm9vc3Q9InskYm9vc3R9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvbHVjZW5lOmZpZWxkPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSIgcHJpb3JpdHk9Ii0xIj4KLSAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94aHRtbC94c2x0L3hodG1sMnhodG1sLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3hzbHQveGh0bWwyeGh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk2YmY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hodG1sL3hzbHQveGh0bWwyeGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB4aHRtbDJ4aHRtbC54c2wgMjAxNzc2IDIwMDUtMDYtMjUgMTg6MjU6MjZaIGdyZWdvciAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiIAotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKLSAgICB4bWxuczpjaT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2luY2x1ZGUvMS4wIiAKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGh0bWwgbGVueWEiCi0gICAgPgotICAgIAotPHhzbDppbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94aHRtbC94c2x0L2hlbHBlci1vYmplY3QueHNsIi8+Ci08eHNsOnBhcmFtIG5hbWU9InJlbmRlcnR5cGUiIHNlbGVjdD0iJyciLz4KLTx4c2w6cGFyYW0gbmFtZT0ibm9kZWlkIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii94aHRtbDpodG1sIj4KLSAgPGh0bWw+Ci0gICAgPGJvZHk+Ci0gICAgICA8ZGl2IGlkPSJib2R5Ij4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkcmVuZGVydHlwZSA9ICdlZGl0JyI+Ci0gICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYnhlX3hwYXRoIj4veGh0bWw6aHRtbC94aHRtbDpib2R5PC94c2w6YXR0cmlidXRlPgotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ4aHRtbDpib2R5L25vZGUoKSIvPgotICAgICAgPC9kaXY+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgPHhzbDpjb3B5PgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gIDwveHNsOmNvcHk+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG5hbWU9InN1YnN0cmluZy1hZnRlci1sYXN0Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImlucHV0Ii8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJzdWJzdHIiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlbXAiIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRpbnB1dCwgJHN1YnN0cikiLz4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3Vic3RyIGFuZCBjb250YWlucygkdGVtcCwgJHN1YnN0cikiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3Vic3RyaW5nLWFmdGVyLWxhc3QiPgotICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbnB1dCIgc2VsZWN0PSIkdGVtcCIvPgotICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXNidHIiIHNlbGVjdD0iJHN1YnN0ciIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlbXAiLz4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmFbQGNsYXNzID0gJ2xlbnlhLmFzc2V0J10iPgotICAgIDxjaTppbmNsdWRlIHNyYz0ie0BocmVmfT9mb3JtYXQ9ZG93bmxvYWRMaW5rIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGM6bWV0YWRhdGEiLz4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tb2R1bGVzL3hvcHVzL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy94b3B1cy54Y29uZiBiL3RydW5rL3NyYy9tb2R1bGVzL3hvcHVzL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy94b3B1cy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwMTU2Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94b3B1cy9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMveG9wdXMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+Ci08IS0tCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFhvcHVzIGNvbnRleHQgcGF0aC4KLS0tPgotCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAneG9wdXMnXSI+Ci0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJ4b3B1cyIgY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5EZWZhdWx0c01vZHVsZSI+Ci0gICAgICA8dmFsdWVzPgotICAgICAgICA8IS0tIFNhbWUgYXMgZnJvbSAobG9jYWwuKWJ1aWxkLnByb3BlcnRpZXMgLS0+Ci0gICAgICAgIDxjb250ZXh0PlhvcHVzLTIuMS43OTwvY29udGV4dD4KLSAgICAgICAgPHBhdGg+Li4vLi4vLi4vLi4vdG9tY2F0LTUuNS54L2J1aWxkL2J1aWxkL3dlYmFwcHMvUk9PVDwvcGF0aD4KLSAgICAgIDwvdmFsdWVzPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPgotICA8L3hjb25mPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMvY29uZmlnL21vZHVsZS54bWwgYi90cnVuay9zcmMvbW9kdWxlcy94b3B1cy9jb25maWcvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4YWQ2Yy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94b3B1cy9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxsZW55YTptb2R1bGUgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8bGVueWE6aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLnhvcHVzPC9sZW55YTppZD4KLSAgPGxlbnlhOmRlcGVuZHMgbW9kdWxlPSJvcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXMudXNlY2FzZSIvPgotICA8bGVueWE6ZGVwZW5kcyBtb2R1bGU9Im9yZy5hcGFjaGUubGVueWEubW9kdWxlcy5zaXRlbWFuYWdlbWVudCIvPgotICA8bGVueWE6cGFja2FnZT5vcmcuYXBhY2hlLmxlbnlhLm1vZHVsZXM8L2xlbnlhOnBhY2thZ2U+Ci0gIDxsZW55YTp2ZXJzaW9uPjAuMS1kZXY8L2xlbnlhOnZlcnNpb24+Ci0gIDxsZW55YTpuYW1lPlhvcHVzIE1vZHVsZTwvbGVueWE6bmFtZT4KLSAgPGxlbnlhOmxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YTpsZW55YS12ZXJzaW9uPgotICA8bGVueWE6ZGVzY3JpcHRpb24+WG9wdXMgTW9kdWxlPC9sZW55YTpkZXNjcmlwdGlvbj4KLTwvbGVueWE6bW9kdWxlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMvcmVzb3VyY2VzL3NjaGVtYXMvaG9tZXBhZ2UueHNkIGIvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMvcmVzb3VyY2VzL3NjaGVtYXMvaG9tZXBhZ2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGI3MDczLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hvcHVzL3Jlc291cmNlcy9zY2hlbWFzL2hvbWVwYWdlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIDx4czplbGVtZW50IG5hbWU9Imh0bWwiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoZWFkIi8+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0iYm9keSIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9ImhlYWQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoZWFkLmNvbnRlbnQiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJib2R5Ij4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMSIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iaDIiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InAiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRhYmxlIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMyIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idWwiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im9sIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJkaXYiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImEiLz4KLSAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICAKLTx4czpncm91cCBuYW1lPSJUYWJsZS5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGFibGUiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iQ2VsbFZBbGlnbi5hdHRyaWIiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWduIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0b3AiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1pZGRsZSIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90dG9tIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJiYXNlbGluZSIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iQ2VsbEhBbGlnbi5hdHRyaWIiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxlZnQiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNlbnRlciIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmlnaHQiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imp1c3RpZnkiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNoYXIiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InRkLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJvd3NwYW4iIHR5cGU9Ik51bWJlciIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29sc3BhbiIgdHlwZT0iTnVtYmVyIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ2VsbEhBbGlnbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsVkFsaWduLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id2lkdGgiIHR5cGU9IlBpeGVscyIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhlaWdodCIgdHlwZT0iUGl4ZWxzIiB1c2U9Im9wdGlvbmFsIiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGQudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCByZWY9IkZsb3cubWl4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGQuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0ZCIgdHlwZT0idGQudHlwZSIvPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idGguYXR0bGlzdCI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icm93c3BhbiIgdHlwZT0iTnVtYmVyIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIiB0eXBlPSJOdW1iZXIiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsSEFsaWduLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNlbGxWQWxpZ24uYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCIgdHlwZT0iUGl4ZWxzIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaGVpZ2h0IiB0eXBlPSJQaXhlbHMiIHVzZT0ib3B0aW9uYWwiIC8+ICAgIAotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGgudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCByZWY9IkZsb3cubWl4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGguYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0aCIgdHlwZT0idGgudHlwZSIvPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0ci5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ2VsbEhBbGlnbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsVkFsaWduLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0idHIuY29udGVudCI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGQiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGgiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRyLnR5cGUiPgotICAgIDx4czpncm91cCByZWY9InRyLmNvbnRlbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0ci5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9InRyIiB0eXBlPSJ0ci50eXBlIi8+Ci0gIDx4czpncm91cCBuYW1lPSJ0Ym9keS5jb250ZW50Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InRyIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0Ym9keS50eXBlIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0Ym9keS5jb250ZW50Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9InRib2R5IiB0eXBlPSJ0Ym9keS50eXBlIi8+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0Zm9vdC5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ2VsbEhBbGlnbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsVkFsaWduLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0idGZvb3QuY29udGVudCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0ciIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGZvb3QudHlwZSI+Ci0gICAgPHhzOmdyb3VwIHJlZj0idGZvb3QuY29udGVudCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRmb290LmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0idGZvb3QiIHR5cGU9InRmb290LnR5cGUiLz4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InRoZWFkLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsSEFsaWduLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNlbGxWQWxpZ24uYXR0cmliIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJ0aGVhZC5jb250ZW50Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InRyIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0aGVhZC50eXBlIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0aGVhZC5jb250ZW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGhlYWQuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0aGVhZCIgdHlwZT0idGhlYWQudHlwZSIvPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idGFibGUuYXR0bGlzdCI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id2lkdGgiIHR5cGU9Ikxlbmd0aCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyIiB0eXBlPSJQaXhlbHMiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZWxsc3BhY2luZyIgdHlwZT0iUGl4ZWxzIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2VsbHBhZGRpbmciIHR5cGU9IlBpeGVscyIgdXNlPSJvcHRpb25hbCIgLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9InRhYmxlLmNvbnRlbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czpjaG9pY2U+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRoZWFkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRmb290IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRib2R5IiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0YWJsZS5jb250ZW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGFibGUuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0idGFibGUudHlwZSIvPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJJbmxQcmVzLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklubFByZXMudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IklubGluZS5taXgiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJJbmxQcmVzLmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3ViIiB0eXBlPSJJbmxQcmVzLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3VwIiB0eXBlPSJJbmxQcmVzLnR5cGUiLz4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idGl0bGUuYXR0bGlzdCI+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0aXRsZS50eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGl0bGUuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0aXRsZSIgdHlwZT0idGl0bGUudHlwZSIvPgotCi0gIDx4czpncm91cCBuYW1lPSJoZWFkLmNvbnRlbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGl0bGUiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iaGVhZC5hdHRsaXN0Ij4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhlYWQudHlwZSI+Ci0gICAgPHhzOmdyb3VwIHJlZj0iaGVhZC5jb250ZW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iaGVhZC5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9ImhlYWQiIHR5cGU9ImhlYWQudHlwZSIvPgotCi0gIDwhLS0gPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImJvZHkuYXR0bGlzdCI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYm9keS50eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmdyb3VwIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkJsb2NrLm1peCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9ImJvZHkuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJib2R5IiB0eXBlPSJib2R5LnR5cGUiLz4gLS0+Ci0KLSAgPCEtLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iaHRtbC5hdHRsaXN0Ij4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imh0bWwudHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJsZW55YTptZXRhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0iaGVhZCIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJib2R5Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJodG1sLmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaHRtbCIgdHlwZT0iaHRtbC50eXBlIi8+Ci0gLS0+Ci0gCi0gIDx4czplbGVtZW50IG5hbWU9Im9iamVjdCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbyB4bWxuczp4b3B1cz0iaHR0cDovL3d3dy54b3B1cy5jb20veG1sbnMveHNkIj4KLSAgICAgICAgPHhvcHVzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhvcHVzOm5hbWUgeG1sOmxhbmc9ImVuIj5PYmplY3Q8L3hvcHVzOm5hbWU+Ci0gICAgICAgICAgPHhvcHVzOm5hbWUgeG1sOmxhbmc9ImRlIj5PYmpla3Q8L3hvcHVzOm5hbWU+Ci0gICAgICAgIDwveG9wdXM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGl0bGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJVUkkiIC8+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkYXRhIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+ICAKLSAKLSAKLTwhLS0gICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ib2JqZWN0LmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGl0bGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LnR5cGUiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9Im9iamVjdC5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0ib2JqZWN0LnR5cGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8geG1sbnM6eG9wdXM9Imh0dHA6Ly93d3cueG9wdXMuY29tL3htbG5zL3hzZCI+Ci0gICAgICAgIDx4b3B1czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4b3B1czpuYW1lIHhtbDpsYW5nPSJlbiI+aGFsbG9fb2JqX2VuPC94b3B1czpuYW1lPgotICAgICAgICAgIDx4b3B1czpuYW1lIHhtbDpsYW5nPSJkZSI+aGFsbG9fb2JqX2RlPC94b3B1czpuYW1lPgotICAgICAgICA8L3hvcHVzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gLS0+ICAKLSAgPHhzOmVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpncm91cCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IklubE5vQW5jaG9yLm1peCIvPiAgCi0gICAgICA8IS0tIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImltZyIvPgotICAgICAgPC94czpzZXF1ZW5jZT4gLS0+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb3B1cCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwhLS0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9IlRhcmdldFR5cGUiLz4gLS0+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGkudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkZsb3cubWl4Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9ImxpIiB0eXBlPSJsaS50eXBlIi8+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJvbC5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJvbC50eXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9ImxpIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJvbC5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9Im9sIiB0eXBlPSJvbC50eXBlIi8+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InVsLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVsLnR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ibGkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InVsLmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0idWwiIHR5cGU9InVsLnR5cGUiLz4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ibGluay5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJVUkkiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0iVGFyZ2V0VHlwZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+ICAgIAotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGluay50eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmdyb3VwIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSW5sTm9BbmNob3IubWl4Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ibGluay5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9ImxpbmsiIHR5cGU9ImxpbmsudHlwZSIvPgotICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJyLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYnIiIHR5cGU9ImJyLnR5cGUiLz4gIAotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzcGFuLnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJJbmxpbmUubWl4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY2xhc3MiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3BhbiIgdHlwZT0ic3Bhbi50eXBlIi8+Ci0gIDx4czplbGVtZW50IG5hbWU9ImIiIHR5cGU9InNwYW4udHlwZSIvPiAgCi0gIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZm9udC50eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmdyb3VwIHJlZj0iSW5saW5lLm1peCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNsYXNzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYWNlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZm9udCIgdHlwZT0iZm9udC50eXBlIi8+ICAKLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iaW1nLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iVVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCIgdHlwZT0iUGl4ZWxzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJoZWlnaHQiIHR5cGU9IlBpeGVscyIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iaW1nLnR5cGUiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9ImltZy5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9ImltZyIgdHlwZT0iaW1nLnR5cGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8geG1sbnM6eG9wdXM9Imh0dHA6Ly93d3cueG9wdXMuY29tL3htbG5zL3hzZCI+Ci0gICAgICAgIDx4b3B1czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4b3B1czpuYW1lIHhtbDpsYW5nPSJlbiI+SW1hZ2U8L3hvcHVzOm5hbWU+Ci0gICAgICAgICAgPHhvcHVzOm5hbWUgeG1sOmxhbmc9ImRlIj5CaWxkPC94b3B1czpuYW1lPgotICAgICAgICA8L3hvcHVzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9IklubFBocmFzLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklubFBocmFzLnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJbmxpbmUubWl4Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iSW5sUGhyYXMuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJlbXBoYXNpcyIgdHlwZT0iSW5sUGhyYXMudHlwZSIvPgotICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJvbmciIHR5cGU9IklubFBocmFzLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0idSIgdHlwZT0iSW5sUGhyYXMudHlwZSIvPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJkaXYuYXR0bGlzdCI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGl2LnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQmxvY2subWl4Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iZGl2LmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGl2IiB0eXBlPSJkaXYudHlwZSIvPgotCi0gICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0icC5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwLnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJbmxpbmUubWl4Ii8+IAotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InAuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJwIiB0eXBlPSJwLnR5cGUiLz4KLSAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhlYWRpbmcudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCByZWY9IklubGluZS5taXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbGFzcyIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJoMSIgdHlwZT0iaGVhZGluZy50eXBlIi8+Ci0gIDx4czplbGVtZW50IG5hbWU9ImgyIiB0eXBlPSJoZWFkaW5nLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaDMiIHR5cGU9ImhlYWRpbmcudHlwZSIvPgotICA8eHM6ZWxlbWVudCBuYW1lPSJoNCIgdHlwZT0iaGVhZGluZy50eXBlIi8+Ci0gIDx4czplbGVtZW50IG5hbWU9Img1IiB0eXBlPSJoZWFkaW5nLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaDYiIHR5cGU9ImhlYWRpbmcudHlwZSIvPgotCi0gIDx4czpncm91cCBuYW1lPSJJbmxQaHJhcy5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZW1waGFzaXMiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ic3Ryb25nIi8+Ci0gICAgICA8IS0tIDx4czplbGVtZW50IHJlZj0idSIvPiAtLT4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IklubFByZXMuY2xhc3MiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InN1YiIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJzdXAiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IkFuY2hvci5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0iYSIvPgotICAgICAgPCEtLSA8eHM6ZWxlbWVudCByZWY9ImxpbmsiLz4gLS0+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJJbmxTcGVjaWFsLmNsYXNzIj4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpbWciLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ib2JqZWN0Ii8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJJbmxpbmUuZXh0cmEiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0iYnIiLz4KLSAgICAgICAgPCEtLSA8eHM6ZWxlbWVudCByZWY9ImIiLz4gLS0+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0ic3BhbiIvPgotICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImZvbnQiLz4gICAgICAgIAotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iSW5saW5lLmNsYXNzIj4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5sUGhyYXMuY2xhc3MiLz4KLSAgICAgIDx4czpncm91cCByZWY9IklubFByZXMuY2xhc3MiLz4KLSAgICAgIDx4czpncm91cCByZWY9IkFuY2hvci5jbGFzcyIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5sU3BlY2lhbC5jbGFzcyIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5saW5lLmV4dHJhIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJJbmxOb0FuY2hvci5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czpncm91cCByZWY9IklubFBocmFzLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJJbmxQcmVzLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJJbmxTcGVjaWFsLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJJbmxpbmUuZXh0cmEiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IklubE5vQW5jaG9yLm1peCI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czpncm91cCByZWY9IklubE5vQW5jaG9yLmNsYXNzIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJJbmxpbmUubWl4Ij4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5saW5lLmNsYXNzIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJIZWFkaW5nLmNsYXNzIj4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMSIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMiIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMyIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoNCIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoNSIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoNiIvPgotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iTGlzdC5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idWwiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ib2wiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IkJsa1N0cnVjdC5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0icCIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJkaXYiLz4KLSAgICAgIDwhLS0gPHhzOmVsZW1lbnQgcmVmPSJsaW5rIi8+IC0tPiAgICAgIAotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iQmxrU3BlY2lhbC5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGFibGUiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IkJsb2NrLmV4dHJhIj4KLSAgICA8eHM6Y2hvaWNlPgotICAgIDwhLS0gPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gLS0+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0iYnIiLz4KLSAgICAgICAgPCEtLSA8eHM6ZWxlbWVudCByZWY9ImIiLz4gLS0+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0ic3BhbiIvPgotICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImZvbnQiLz4gICAgICAgIAotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iQmxvY2suY2xhc3MiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJCbGtTdHJ1Y3QuY2xhc3MiLz4KLSAgICAgIDx4czpncm91cCByZWY9IkJsa1NwZWNpYWwuY2xhc3MiLz4KLSAgICAgIDx4czpncm91cCByZWY9IkJsb2NrLmV4dHJhIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJCbG9jay5taXgiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJIZWFkaW5nLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJMaXN0LmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJCbG9jay5jbGFzcyIvPgotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iRmxvdy5taXgiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJIZWFkaW5nLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJMaXN0LmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJCbG9jay5jbGFzcyIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5saW5lLmNsYXNzIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImlkIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iY2xhc3MiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzOk5NVE9LRU5TIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0aXRsZSI+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJDb3JlLmV4dHJhLmF0dHJpYiI+Ci0gICAgPCEtLSBhZGQgeW91ciBhdHRyaWJ1dGUgaGVyZSAtLT4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9IkNvcmUuYXR0cmliIj4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJpZCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNsYXNzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGl0bGUiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb3JlLmV4dHJhLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iQ29tbW9uLmV4dHJhIj4KLSAgICA8IS0tIGFkZCB5b3VyIGF0dHJpYnV0ZXMgaGVyZSAtLT4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9IkNvbW1vbi5hdHRyaWIiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvcmUuYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmV4dHJhIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTGVuZ3RoIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTGlua1R5cGVzIj4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6Tk1UT0tFTiIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik1lZGlhRGVzYyI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik11bHRpTGVuZ3RoIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTnVtYmVyIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iUGl4ZWxzIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iU2NyaXB0Ij4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ29sb3IiPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJUZXh0Ij4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ2hhcmFjdGVyIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ2hhcnNldCI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDx4czpzaW1wbGVUeXBlIG5hbWU9IkNoYXJzZXRzIj4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ29udGVudFR5cGUiPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJDb250ZW50VHlwZXMiPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJEYXRldGltZSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vcm1hbGl6ZWRTdHJpbmciLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJMYW5ndWFnZUNvZGUiPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVGFyZ2V0VHlwZSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJfYmxhbmsiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iX3RvcCIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJfc2VsZiIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVVJJIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VVJJIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVVJJcyI+Ci0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik11bHRpTGVuZ3RocyI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIAotIDwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwueHNkIGIvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGI3MDczLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hvcHVzL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIDx4czplbGVtZW50IG5hbWU9Imh0bWwiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoZWFkIi8+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0iYm9keSIvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0gIDx4czplbGVtZW50IG5hbWU9ImhlYWQiPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoZWFkLmNvbnRlbnQiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotICA8eHM6ZWxlbWVudCBuYW1lPSJib2R5Ij4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMSIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iaDIiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InAiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRhYmxlIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMyIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idWwiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im9sIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJkaXYiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImEiLz4KLSAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gIDwveHM6ZWxlbWVudD4KLQotICAKLTx4czpncm91cCBuYW1lPSJUYWJsZS5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGFibGUiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iQ2VsbFZBbGlnbi5hdHRyaWIiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWduIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0b3AiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1pZGRsZSIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90dG9tIi8+Ci0gICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJiYXNlbGluZSIvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6YXR0cmlidXRlPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iQ2VsbEhBbGlnbi5hdHRyaWIiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPgotICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxlZnQiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNlbnRlciIvPgotICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmlnaHQiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imp1c3RpZnkiLz4KLSAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNoYXIiLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InRkLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJvd3NwYW4iIHR5cGU9Ik51bWJlciIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29sc3BhbiIgdHlwZT0iTnVtYmVyIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ2VsbEhBbGlnbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsVkFsaWduLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id2lkdGgiIHR5cGU9IlBpeGVscyIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhlaWdodCIgdHlwZT0iUGl4ZWxzIiB1c2U9Im9wdGlvbmFsIiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGQudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCByZWY9IkZsb3cubWl4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGQuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0ZCIgdHlwZT0idGQudHlwZSIvPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idGguYXR0bGlzdCI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icm93c3BhbiIgdHlwZT0iTnVtYmVyIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIiB0eXBlPSJOdW1iZXIiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsSEFsaWduLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNlbGxWQWxpZ24uYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCIgdHlwZT0iUGl4ZWxzIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaGVpZ2h0IiB0eXBlPSJQaXhlbHMiIHVzZT0ib3B0aW9uYWwiIC8+ICAgIAotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGgudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCByZWY9IkZsb3cubWl4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGguYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0aCIgdHlwZT0idGgudHlwZSIvPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0ci5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ2VsbEhBbGlnbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsVkFsaWduLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0idHIuY29udGVudCI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGQiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGgiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRyLnR5cGUiPgotICAgIDx4czpncm91cCByZWY9InRyLmNvbnRlbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0ci5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9InRyIiB0eXBlPSJ0ci50eXBlIi8+Ci0gIDx4czpncm91cCBuYW1lPSJ0Ym9keS5jb250ZW50Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InRyIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0Ym9keS50eXBlIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0Ym9keS5jb250ZW50Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9InRib2R5IiB0eXBlPSJ0Ym9keS50eXBlIi8+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0Zm9vdC5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ2VsbEhBbGlnbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsVkFsaWduLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0idGZvb3QuY29udGVudCI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0ciIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGZvb3QudHlwZSI+Ci0gICAgPHhzOmdyb3VwIHJlZj0idGZvb3QuY29udGVudCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRmb290LmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0idGZvb3QiIHR5cGU9InRmb290LnR5cGUiLz4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InRoZWFkLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDZWxsSEFsaWduLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNlbGxWQWxpZ24uYXR0cmliIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJ0aGVhZC5jb250ZW50Ij4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InRyIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0aGVhZC50eXBlIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0aGVhZC5jb250ZW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGhlYWQuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0aGVhZCIgdHlwZT0idGhlYWQudHlwZSIvPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idGFibGUuYXR0bGlzdCI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmF0dHJpYiIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id2lkdGgiIHR5cGU9Ikxlbmd0aCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyIiB0eXBlPSJQaXhlbHMiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZWxsc3BhY2luZyIgdHlwZT0iUGl4ZWxzIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2VsbHBhZGRpbmciIHR5cGU9IlBpeGVscyIgdXNlPSJvcHRpb25hbCIgLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9InRhYmxlLmNvbnRlbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czpjaG9pY2U+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRoZWFkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRmb290IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRib2R5IiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0YWJsZS5jb250ZW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGFibGUuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0idGFibGUudHlwZSIvPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJJbmxQcmVzLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklubFByZXMudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IklubGluZS5taXgiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJJbmxQcmVzLmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3ViIiB0eXBlPSJJbmxQcmVzLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3VwIiB0eXBlPSJJbmxQcmVzLnR5cGUiLz4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idGl0bGUuYXR0bGlzdCI+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0aXRsZS50eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGl0bGUuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJ0aXRsZSIgdHlwZT0idGl0bGUudHlwZSIvPgotCi0gIDx4czpncm91cCBuYW1lPSJoZWFkLmNvbnRlbnQiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGl0bGUiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iaGVhZC5hdHRsaXN0Ij4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhlYWQudHlwZSI+Ci0gICAgPHhzOmdyb3VwIHJlZj0iaGVhZC5jb250ZW50Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iaGVhZC5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9ImhlYWQiIHR5cGU9ImhlYWQudHlwZSIvPgotCi0gIDwhLS0gPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImJvZHkuYXR0bGlzdCI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYm9keS50eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmdyb3VwIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkJsb2NrLm1peCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9ImJvZHkuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJib2R5IiB0eXBlPSJib2R5LnR5cGUiLz4gLS0+Ci0KLSAgPCEtLSA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iaHRtbC5hdHRsaXN0Ij4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imh0bWwudHlwZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJsZW55YTptZXRhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0iaGVhZCIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJib2R5Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJodG1sLmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaHRtbCIgdHlwZT0iaHRtbC50eXBlIi8+Ci0gLS0+Ci0gCi0gIDx4czplbGVtZW50IG5hbWU9Im9iamVjdCI+Ci0gICAgPHhzOmFubm90YXRpb24+Ci0gICAgICA8eHM6YXBwaW5mbyB4bWxuczp4b3B1cz0iaHR0cDovL3d3dy54b3B1cy5jb20veG1sbnMveHNkIj4KLSAgICAgICAgPHhvcHVzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhvcHVzOm5hbWUgeG1sOmxhbmc9ImVuIj5PYmplY3Q8L3hvcHVzOm5hbWU+Ci0gICAgICAgICAgPHhvcHVzOm5hbWUgeG1sOmxhbmc9ImRlIj5PYmpla3Q8L3hvcHVzOm5hbWU+Ci0gICAgICAgIDwveG9wdXM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHM6YXBwaW5mbz4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGl0bGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJVUkkiIC8+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkYXRhIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+ICAKLSAKLSAKLTwhLS0gICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ib2JqZWN0LmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGl0bGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LnR5cGUiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9Im9iamVjdC5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0ib2JqZWN0LnR5cGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8geG1sbnM6eG9wdXM9Imh0dHA6Ly93d3cueG9wdXMuY29tL3htbG5zL3hzZCI+Ci0gICAgICAgIDx4b3B1czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4b3B1czpuYW1lIHhtbDpsYW5nPSJlbiI+aGFsbG9fb2JqX2VuPC94b3B1czpuYW1lPgotICAgICAgICAgIDx4b3B1czpuYW1lIHhtbDpsYW5nPSJkZSI+aGFsbG9fb2JqX2RlPC94b3B1czpuYW1lPgotICAgICAgICA8L3hvcHVzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0gLS0+ICAKLSAgPHhzOmVsZW1lbnQgbmFtZT0iYSI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpncm91cCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IklubE5vQW5jaG9yLm1peCIvPiAgCi0gICAgICA8IS0tIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImltZyIvPgotICAgICAgPC94czpzZXF1ZW5jZT4gLS0+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb3B1cCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwhLS0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9IlRhcmdldFR5cGUiLz4gLS0+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgPC94czplbGVtZW50PgotCi0gIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGkudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkZsb3cubWl4Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9ImxpIiB0eXBlPSJsaS50eXBlIi8+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJvbC5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJvbC50eXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9ImxpIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJvbC5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9Im9sIiB0eXBlPSJvbC50eXBlIi8+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InVsLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVsLnR5cGUiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ibGkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InVsLmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0idWwiIHR5cGU9InVsLnR5cGUiLz4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ibGluay5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJVUkkiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0iVGFyZ2V0VHlwZSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+ICAgIAotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGluay50eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmdyb3VwIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSW5sTm9BbmNob3IubWl4Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ibGluay5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9ImxpbmsiIHR5cGU9ImxpbmsudHlwZSIvPgotICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJyLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYnIiIHR5cGU9ImJyLnR5cGUiLz4gIAotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzcGFuLnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJJbmxpbmUubWl4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY2xhc3MiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3BhbiIgdHlwZT0ic3Bhbi50eXBlIi8+Ci0gIDx4czplbGVtZW50IG5hbWU9ImIiIHR5cGU9InNwYW4udHlwZSIvPiAgCi0gIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZm9udC50eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmdyb3VwIHJlZj0iSW5saW5lLm1peCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNsYXNzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYWNlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZm9udCIgdHlwZT0iZm9udC50eXBlIi8+ICAKLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iaW1nLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iVVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCIgdHlwZT0iUGl4ZWxzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJoZWlnaHQiIHR5cGU9IlBpeGVscyIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iaW1nLnR5cGUiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9ImltZy5hdHRsaXN0Ii8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIDx4czplbGVtZW50IG5hbWU9ImltZyIgdHlwZT0iaW1nLnR5cGUiPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmFwcGluZm8geG1sbnM6eG9wdXM9Imh0dHA6Ly93d3cueG9wdXMuY29tL3htbG5zL3hzZCI+Ci0gICAgICAgIDx4b3B1czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4b3B1czpuYW1lIHhtbDpsYW5nPSJlbiI+SW1hZ2U8L3hvcHVzOm5hbWU+Ci0gICAgICAgICAgPHhvcHVzOm5hbWUgeG1sOmxhbmc9ImRlIj5CaWxkPC94b3B1czpuYW1lPgotICAgICAgICA8L3hvcHVzOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzOmFwcGluZm8+Ci0gICAgPC94czphbm5vdGF0aW9uPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9IklubFBocmFzLmF0dGxpc3QiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvbW1vbi5hdHRyaWIiLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklubFBocmFzLnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJbmxpbmUubWl4Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iSW5sUGhyYXMuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJlbXBoYXNpcyIgdHlwZT0iSW5sUGhyYXMudHlwZSIvPgotICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJvbmciIHR5cGU9IklubFBocmFzLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0idSIgdHlwZT0iSW5sUGhyYXMudHlwZSIvPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJkaXYuYXR0bGlzdCI+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGl2LnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQmxvY2subWl4Ii8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iZGl2LmF0dGxpc3QiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGl2IiB0eXBlPSJkaXYudHlwZSIvPgotCi0gICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0icC5hdHRsaXN0Ij4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb21tb24uYXR0cmliIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwLnR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Z3JvdXAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJbmxpbmUubWl4Ii8+IAotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InAuYXR0bGlzdCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJwIiB0eXBlPSJwLnR5cGUiLz4KLSAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhlYWRpbmcudHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpncm91cCByZWY9IklubGluZS5taXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbGFzcyIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotICA8eHM6ZWxlbWVudCBuYW1lPSJoMSIgdHlwZT0iaGVhZGluZy50eXBlIi8+Ci0gIDx4czplbGVtZW50IG5hbWU9ImgyIiB0eXBlPSJoZWFkaW5nLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaDMiIHR5cGU9ImhlYWRpbmcudHlwZSIvPgotICA8eHM6ZWxlbWVudCBuYW1lPSJoNCIgdHlwZT0iaGVhZGluZy50eXBlIi8+Ci0gIDx4czplbGVtZW50IG5hbWU9Img1IiB0eXBlPSJoZWFkaW5nLnR5cGUiLz4KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaDYiIHR5cGU9ImhlYWRpbmcudHlwZSIvPgotCi0gIDx4czpncm91cCBuYW1lPSJJbmxQaHJhcy5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZW1waGFzaXMiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ic3Ryb25nIi8+Ci0gICAgICA8IS0tIDx4czplbGVtZW50IHJlZj0idSIvPiAtLT4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IklubFByZXMuY2xhc3MiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6ZWxlbWVudCByZWY9InN1YiIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJzdXAiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IkFuY2hvci5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0iYSIvPgotICAgICAgPCEtLSA8eHM6ZWxlbWVudCByZWY9ImxpbmsiLz4gLS0+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJJbmxTcGVjaWFsLmNsYXNzIj4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpbWciLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ib2JqZWN0Ii8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJJbmxpbmUuZXh0cmEiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0iYnIiLz4KLSAgICAgICAgPCEtLSA8eHM6ZWxlbWVudCByZWY9ImIiLz4gLS0+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0ic3BhbiIvPgotICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImZvbnQiLz4gICAgICAgIAotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iSW5saW5lLmNsYXNzIj4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5sUGhyYXMuY2xhc3MiLz4KLSAgICAgIDx4czpncm91cCByZWY9IklubFByZXMuY2xhc3MiLz4KLSAgICAgIDx4czpncm91cCByZWY9IkFuY2hvci5jbGFzcyIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5sU3BlY2lhbC5jbGFzcyIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5saW5lLmV4dHJhIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJJbmxOb0FuY2hvci5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czpncm91cCByZWY9IklubFBocmFzLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJJbmxQcmVzLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJJbmxTcGVjaWFsLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJJbmxpbmUuZXh0cmEiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IklubE5vQW5jaG9yLm1peCI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czpncm91cCByZWY9IklubE5vQW5jaG9yLmNsYXNzIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJJbmxpbmUubWl4Ij4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5saW5lLmNsYXNzIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJIZWFkaW5nLmNsYXNzIj4KLSAgICA8eHM6Y2hvaWNlPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMSIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMiIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoMyIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoNCIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoNSIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJoNiIvPgotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iTGlzdC5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idWwiLz4KLSAgICAgIDx4czplbGVtZW50IHJlZj0ib2wiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IkJsa1N0cnVjdC5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0icCIvPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJkaXYiLz4KLSAgICAgIDwhLS0gPHhzOmVsZW1lbnQgcmVmPSJsaW5rIi8+IC0tPiAgICAgIAotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iQmxrU3BlY2lhbC5jbGFzcyI+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IHJlZj0idGFibGUiLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgPC94czpncm91cD4KLSAgPHhzOmdyb3VwIG5hbWU9IkJsb2NrLmV4dHJhIj4KLSAgICA8eHM6Y2hvaWNlPgotICAgIDwhLS0gPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gLS0+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0iYnIiLz4KLSAgICAgICAgPCEtLSA8eHM6ZWxlbWVudCByZWY9ImIiLz4gLS0+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0ic3BhbiIvPgotICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImZvbnQiLz4gICAgICAgIAotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iQmxvY2suY2xhc3MiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJCbGtTdHJ1Y3QuY2xhc3MiLz4KLSAgICAgIDx4czpncm91cCByZWY9IkJsa1NwZWNpYWwuY2xhc3MiLz4KLSAgICAgIDx4czpncm91cCByZWY9IkJsb2NrLmV4dHJhIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0gIDx4czpncm91cCBuYW1lPSJCbG9jay5taXgiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJIZWFkaW5nLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJMaXN0LmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJCbG9jay5jbGFzcyIvPgotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotICA8eHM6Z3JvdXAgbmFtZT0iRmxvdy5taXgiPgotICAgIDx4czpjaG9pY2U+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJIZWFkaW5nLmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJMaXN0LmNsYXNzIi8+Ci0gICAgICA8eHM6Z3JvdXAgcmVmPSJCbG9jay5jbGFzcyIvPgotICAgICAgPHhzOmdyb3VwIHJlZj0iSW5saW5lLmNsYXNzIi8+Ci0gICAgPC94czpjaG9pY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImlkIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iY2xhc3MiPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzOk5NVE9LRU5TIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0aXRsZSI+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJDb3JlLmV4dHJhLmF0dHJpYiI+Ci0gICAgPCEtLSBhZGQgeW91ciBhdHRyaWJ1dGUgaGVyZSAtLT4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9IkNvcmUuYXR0cmliIj4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJpZCIvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNsYXNzIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idGl0bGUiLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJDb3JlLmV4dHJhLmF0dHJpYiIvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iQ29tbW9uLmV4dHJhIj4KLSAgICA8IS0tIGFkZCB5b3VyIGF0dHJpYnV0ZXMgaGVyZSAtLT4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9IkNvbW1vbi5hdHRyaWIiPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9IkNvcmUuYXR0cmliIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iQ29tbW9uLmV4dHJhIi8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTGVuZ3RoIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTGlua1R5cGVzIj4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6Tk1UT0tFTiIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik1lZGlhRGVzYyI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik11bHRpTGVuZ3RoIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTnVtYmVyIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iUGl4ZWxzIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iU2NyaXB0Ij4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ29sb3IiPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJUZXh0Ij4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ2hhcmFjdGVyIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ2hhcnNldCI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDx4czpzaW1wbGVUeXBlIG5hbWU9IkNoYXJzZXRzIj4KLSAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iQ29udGVudFR5cGUiPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJDb250ZW50VHlwZXMiPgotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJEYXRldGltZSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vcm1hbGl6ZWRTdHJpbmciLz4KLSAgPC94czpzaW1wbGVUeXBlPgotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJMYW5ndWFnZUNvZGUiPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVGFyZ2V0VHlwZSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJfYmxhbmsiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iX3RvcCIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJfc2VsZiIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVVJJIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VVJJIi8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVVJJcyI+Ci0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik11bHRpTGVuZ3RocyI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIAotIDwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMvc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMvc2l0ZW1hcC54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTAxZDhmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hvcHVzL3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBWaWV3cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPG1hcDp2aWV3cz4KLSAgICA8bWFwOnZpZXcgZnJvbS1sYWJlbD0iYWdncmVnYXRpb24iIG5hbWU9ImFnZ3JlZ2F0aW9uIj4KLSAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgIDwvbWFwOnZpZXc+Ci0gICAgPG1hcDp2aWV3IGZyb20tbGFiZWw9InhzcCIgbmFtZT0ieHNwIj4KLSAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgIDwvbWFwOnZpZXc+Ci0gIDwvbWFwOnZpZXdzPgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVzb3VyY2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8bWFwOnJlc291cmNlcz4KLSAgICA8bWFwOnJlc291cmNlIG5hbWU9InN0eWxlLWNtcy1wYWdlIj4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPiAgICAgIAotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm0+ICAgIAotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9wYWdlMnhodG1sLnhzbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJjb250ZXh0Oi8vbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsIi8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJwcm94eSIvPgotICAgIDwvbWFwOnJlc291cmNlPgotICA8L21hcDpyZXNvdXJjZXM+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBQaXBlbGluZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAKLSAgPG1hcDpwaXBlbGluZXM+Ci0gIAotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgICAgIAotICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgICAgICA8IS0tICoqIFhvcHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIC0tPgotICAgICAgICA8IS0tICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIC0tPgotICAgICAgICA8IS0tICoqIE5PVEU6IHBhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aCBkZXBlbmRzIG9uIHRoZSAgICAgICAgICoqIC0tPgotICAgICAgICA8IS0tICoqICAgICAgIHB1YmxpY2F0aW9uIHNwZWNpZmljIERvY3VtZW50SWRUb1BhdGhNYXBwZXIgd2hpY2ggICoqIC0tPgotICAgICAgICA8IS0tICoqICAgICAgIGlzIGNvbmZpZ3VyZWQgd2l0aGluIGNvbmZpZy9wdWJsaWNhdGlvbi54bWwgICAgICAgICoqIC0tPgotICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgICAgICAKLSAgICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im9wZW4iIHR5cGU9InN0ZXAiPgotICAgICAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqL2F1dGhvcmluZy8qKi5odG1sIj4KLSAgICAgICAgICAgICAgPCEtLSBDaGVjayBmb3IgWG9wdXMgKHNldCB4b3B1czpwYXRoIGFuZCB4b3B1czpjb250ZXh0IGluIHhvcHVzLnhjb25mKSAtLT4KLSAgICAgICAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIiBzcmM9Int4b3B1czpwYXRofS97eG9wdXM6Y29udGV4dH0veG9wdXMveG9wdXMuanMiPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8bWFwOmFjdCB0eXBlPSJyZXNlcnZlZC1jaGVja291dCI+Ci0gICAgICAgICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY29udGVudC9yYy97ZXhjZXB0aW9ufS54c3AiPgotICAgICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1c2VyIiB2YWx1ZT0ie3VzZXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImZpbGVuYW1lIiB2YWx1ZT0ie2ZpbGVuYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkYXRlIiB2YWx1ZT0ie2RhdGV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJ7bWVzc2FnZX0iLz4KLSAgICAgICAgICAgICAgICAgIDwvbWFwOmdlbmVyYXRlPgotICAgICAgICAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvcmMvcmNvLWV4Y2VwdGlvbi54c2wiLz4KLSAgICAgICAgICAgICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0ic3R5bGUtY21zLXBhZ2UiLz4KLSAgICAgICAgICAgICAgICAgIDxtYXA6c2VyaWFsaXplIC8+Ci0gICAgICAgICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hvcHVzL3hzbHQvYXV0aG9yaW5nL2VkaXQveG9wdXMteGh0bWwueHNsIj4KLSAgICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRQcmVmaXgiIHZhbHVlPSJ7cmVxdWVzdDpjb250ZXh0UGF0aH0iLz4KLSAgICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InB1YmxpY2F0aW9uSWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0iLz4KLSAgICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNvbXBsZXRlQXJlYSIgdmFsdWU9ImF1dGhvcmluZyIvPgotICAgICAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZG9jdW1lbnRVcmwiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11cmx9Ii8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudElkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXVpZH0iLz4KLSAgICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InhvcHVzQ29udGV4dCIgdmFsdWU9Int4b3B1czpjb250ZXh0fSIvPgotICAgICAgICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgICAgICAgICA8IS0tIE5PVEU6IElFIG9yIFhvcHVzIGRvZXNuJ3QgYXBwcmVjaWF0ZSB0aGUgRFREIHdoaWNoIGlzIGJlaW5nIGluc2VydGVkIGJ5IENvY29vbiAtLT4KLSAgICAgICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJodG1sLW5vLWR0ZCIvPgotICAgICAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJyZXNvdXJjZXMvbWlzYy9kb3dubG9hZC54aHRtbCIvPgotICAgICAgICAgICAgICA8bWFwOmNhbGwgcmVzb3VyY2U9InN0eWxlLWNtcy1wYWdlIi8+Ci0gICAgICAgICAgICAgIDxtYXA6c2VyaWFsaXplIC8+Ci0gICAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InhtbCIgdHlwZT0ic3RlcCI+Ci0gICAgICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKi8qKi5odG1sIj4KLSAgICAgICAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icmVxdWVzdC1tZXRob2QiPgotICAgICAgICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJQT1NUIj4gPCEtLSBTYXZlIC0tPgotCi0gICAgICAgICAgICAgICAgICA8IS0tIHRlc3QgaWYgdGhlIGRvY3VtZW50IGlzIGNoZWNrZWQgb3V0IC0tPgotICAgICAgICAJICAgICAgICA8bWFwOmFjdCB0eXBlPSJyZXNlcnZlZC1jaGVja291dC10ZXN0Ij4KLSAgICAgICAgICAgIAkgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY29udGVudC9yYy97ZXhjZXB0aW9ufS54c3AiPgotICAgICAgICAgICAgICAgIAkgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlciIgdmFsdWU9Int1c2VyfSIvPgotICAgICAgICAgICAgICAgICAgICAJPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSJ7ZmlsZW5hbWV9Ii8+Ci0gICAgICAgIAkgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkYXRlIiB2YWx1ZT0ie2RhdGV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0ie21lc3NhZ2V9Ii8+Ci0gICAgICAgICAgICAJICAgICAgPC9tYXA6Z2VuZXJhdGU+Ci0gICAgICAgICAgICAgICAgCSAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvcmMvcmNvLWV4Y2VwdGlvbi54c2wiLz4KLSAgICAgICAgCSAgICAgICAgICA8bWFwOmNhbGwgcmVzb3VyY2U9InN0eWxlLWNtcy1wYWdlIi8+Ci0gICAgICAgIAkgICAgICAgICAgPG1hcDpzZXJpYWxpemUgLz4KLSAgICAgICAgICAgICAgICAJPC9tYXA6YWN0PgotICAgICAgICAKLSAgICAgICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic3RyZWFtIi8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9hdXRob3JpbmcvZWRpdC9hZGRTb3VyY2VUYWdzLnhzbCI+Ci0gICAgICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InNvdXJjZSIgdmFsdWU9ImNvbnRleHQ6Ly9sZW55YS9wdWJzL3sxfS9jb250ZW50L3syfS97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofSIvPgotICAgICAgICAgICAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0id3JpdGUtc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ic2VyaWFsaXplciIgdmFsdWU9InhtbCIvPgotICAgICAgICAgICAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICAgICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICAgICAgICA8bWFwOm90aGVyd2lzZT4gPCEtLSBHRVQ6IE9wZW4gLS0+Ci0gICAgICAgICAgICAgICAgICA8bWFwOmFjdCB0eXBlPSJzZXQtaGVhZGVyIj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBwcmV2ZW50IGNhY2hpbmcgaW4gdGhlIGJyb3dzZXIgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IkNhY2hlLUNvbnRyb2wiIHZhbHVlPSJwcmUtY2hlY2s9MCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iRXhwaXJlcyIgdmFsdWU9Ii0xIiAvPgotICAgICAgICAgICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRleHQ6Ly9sZW55YS9wdWJzL3sxfS9jb250ZW50L3syfS97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofSIvPgotICAgICAgICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICAgICAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InhzZCIgdHlwZT0ic3RlcCI+Ci0gICAgICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovYXV0aG9yaW5nLyoqLmh0bWwiPgotICAgICAgICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJyZXNvdXJjZS1leGlzdHMiPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwcmVmaXgiIHZhbHVlPSJmYWxsYmFjazovLyIvPgotICAgICAgICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJsZW55YS9tb2R1bGVzL3hvcHVzL3Jlc291cmNlcy9zY2hlbWFzL3twYWdlLWVudmVsb3BlOmRvY3VtZW50LXR5cGV9LnhzZCI+Ci0gICAgICAgICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hvcHVzL3Jlc291cmNlcy9zY2hlbWFzL3twYWdlLWVudmVsb3BlOmRvY3VtZW50LXR5cGV9LnhzZCIvPgotICAgICAgICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIiAvPgotICAgICAgICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgICAgICAgPG1hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hvcHVzL3Jlc291cmNlcy9zY2hlbWFzL3hodG1sLnhzZCIvPgotICAgICAgICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIiAvPgotICAgICAgICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgICAgCi0gICAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJ4c2x0IiB0eXBlPSJzdGVwIj4KLSAgICAgICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi9hdXRob3JpbmcvKiouaHRtbCI+Ci0gICAgICAgICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InByZWZpeCIgdmFsdWU9ImZhbGxiYWNrOi8vIi8+Ci0gICAgICAgICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImxlbnlhL21vZHVsZXMveG9wdXMveHNsdC97cGFnZS1lbnZlbG9wZTpkb2N1bWVudC10eXBlfS54c2wiPgotICAgICAgICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy94b3B1cy94c2x0L3twYWdlLWVudmVsb3BlOmRvY3VtZW50LXR5cGV9LnhzbCIvPgotICAgICAgICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIiAvPgotICAgICAgICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgICAgICAgPG1hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3hvcHVzL3hzbHQveGh0bWwueHNsIi8+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiIC8+Ci0gICAgICAgICAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBUaGlzIGlzIG5lZWRlZCB0byBhY2Nlc3Mgc2Vjb25kYXJ5IHhzbCBmaWxlcyBmcm9tIHdpdGhpbiB4b3B1cy14aHRtbC54c2wgLS0+Ci0gICAgICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovYXV0aG9yaW5nLyoqLnhzbCI+Ci0gICAgICAgICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9InhzbHQvezJ9LnhzbCI+Ci0gICAgICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJ4c2x0L3syfS54c2wiIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veG1sIi8+Ci0gICAgICAgICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICAgICAgICA8bWFwOndoZW4gdGVzdD0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3syfS54c2wiPgotICAgICAgICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3syfS54c2wiIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veG1sIi8+Ci0gICAgICAgICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgc3RhdHVzLWNvZGU9IjUwMCIgLz4KLSAgICAgICAgICAgICAgICA8L21hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDwvbWFwOnNlbGVjdD4KLSAgICAgICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgICAgIDwhLS0gKioqKioqKiogIC9Yb3B1cyBFZGl0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotCi08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMveHNsdC9hdXRob3JpbmcvZWRpdC94b3B1cy14aHRtbC54c2wgYi90cnVuay9zcmMvbW9kdWxlcy94b3B1cy94c2x0L2F1dGhvcmluZy9lZGl0L3hvcHVzLXhodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjMWEwNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94b3B1cy94c2x0L2F1dGhvcmluZy9lZGl0L3hvcHVzLXhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogeG9wdXMteGh0bWwueHNsLHYgMS43IDIwMDQvMDcvMjAgMTM6NTE6MTMgZWRpdGggRXhwICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotPgotCi08eHNsOnBhcmFtIG5hbWU9ImRvY3VtZW50SWQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZG9jdW1lbnRVcmwiLz4KLTx4c2w6cGFyYW0gbmFtZT0icHVibGljYXRpb25JZCIvPgotPHhzbDpwYXJhbSBuYW1lPSJjb21wbGV0ZUFyZWEiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY29udGV4dFByZWZpeCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ4b3B1c0NvbnRleHQiLz4KLQotCi08eHNsOnZhcmlhYmxlIG5hbWU9ImxlbnlhQ29udGV4dCIgc2VsZWN0PSJjb25jYXQoJGNvbnRleHRQcmVmaXgsICcvJywgJHB1YmxpY2F0aW9uSWQsICcvJywgJGNvbXBsZXRlQXJlYSkiLz4KLTx4c2w6dmFyaWFibGUgbmFtZT0ibGVueWFEb2N1bWVudFVybCIgc2VsZWN0PSJjb25jYXQoJGxlbnlhQ29udGV4dCwgJGRvY3VtZW50VXJsKSIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvKiI+Ci08aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPkxvYWQgWG9wdXMgLi4uPC90aXRsZT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii97JHhvcHVzQ29udGV4dH0veG9wdXMveG9wdXMuanMiLz4KLSAgPC9oZWFkPgotICA8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KLSAgICA8ZGl2IHhvcHVzPSJ0cnVlIiBhdXRvc3RhcnQ9InRydWUiPgotICAgICAgLi4uWG9wdXMgaGFzbid0IHN0YXJ0ZWQgeWV0Li4uCi0gICAgICA8eG1sPgotICAgICAgICA8cGlwZWxpbmUKLSAgICAgICAgICAgIHhtbD0ieyRsZW55YURvY3VtZW50VXJsfT9sZW55YS5tb2R1bGU9eG9wdXMmYW1wO2xlbnlhLnN0ZXA9eG1sIgotICAgICAgICAgICAgeHNkPSJ7JGxlbnlhRG9jdW1lbnRVcmx9P2xlbnlhLm1vZHVsZT14b3B1cyZhbXA7bGVueWEuc3RlcD14c2QiPgotICAgICAgICAgICAgCi0gICAgICAgICAgPHZpZXcgaWQ9ImRlZmF1bHRWaWV3IiBkZWZhdWx0PSJ0cnVlIj4KLSAgICAgICAgICAgIDx0cmFuc2Zvcm0geHNsPSIveyR4b3B1c0NvbnRleHR9L3hvcHVzUGx1Z2lucy9wcmVwYXJleGluY2x1ZGUueHNsIi8+Ci0gICAgICAgICAgICA8cmVzb2x2ZVhJbmNsdWRlcy8+Ci0gICAgICAgICAgICA8dHJhbnNmb3JtIHhzbD0ieyRsZW55YUNvbnRleHR9L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2w/bGVueWEubW9kdWxlPXhvcHVzJmFtcDtsZW55YS5zdGVwPXhzbHQiLz4KLSAgICAgICAgICAgIDx0cmFuc2Zvcm0geHNsPSJ7JGxlbnlhRG9jdW1lbnRVcmx9P2xlbnlhLm1vZHVsZT14b3B1cyZhbXA7bGVueWEuc3RlcD14c2x0Ij4KLSAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvbnRleHRwcmVmaXgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGV4dFByZWZpeCIvPjwvcGFyYW0+Ci0gICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwdWJsaWNhdGlvbmlkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1YmxpY2F0aW9uSWQiLz48L3BhcmFtPgotICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29tcGxldGVhcmVhIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbXBsZXRlQXJlYSIvPjwvcGFyYW0+Ci0JICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb2N1bWVudGlkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRvY3VtZW50SWQiLz48L3BhcmFtPgotICAgICAgICAgICAgPC90cmFuc2Zvcm0+Ci0gICAgICAgICAgPC92aWV3PgotICAgICAgICAgIAotICAgICAgICAgIDwhLS0KLSAgICAgICAgICA8dmlldyBpZD0ic3RlcDEiPgotICAgICAgICAgICAgPHRyYW5zZm9ybSB4c2w9Ii97JHhvcHVzQ29udGV4dH0veG9wdXNQbHVnaW5zL3ByZXBhcmV4aW5jbHVkZS54c2wiLz4KLSAgICAgICAgICAgIDx0cmFuc2Zvcm0geHNsPSIveyR4b3B1c0NvbnRleHR9L3hvcHVzL21lZGlhL3RyZWV2aWV3L3RyZWUueHNsIj48L3RyYW5zZm9ybT4KLSAgICAgICAgICA8L3ZpZXc+Ci0gICAgICAgICAgPHZpZXcgaWQ9InN0ZXAyIj4KLSAgICAgICAgICAgIDx0cmFuc2Zvcm0geHNsPSIveyR4b3B1c0NvbnRleHR9L3hvcHVzUGx1Z2lucy9wcmVwYXJleGluY2x1ZGUueHNsIi8+Ci0gICAgICAgICAgICA8cmVzb2x2ZVhJbmNsdWRlcy8+Ci0gICAgICAgICAgICA8dHJhbnNmb3JtIHhzbD0iL3skeG9wdXNDb250ZXh0fS94b3B1cy9tZWRpYS90cmVldmlldy90cmVlLnhzbCI+PC90cmFuc2Zvcm0+Ci0gICAgICAgICAgPC92aWV3PgotICAgICAgICAgIC0tPgotICAgICAgICAgIAotICAgICAgICAgIDx2aWV3IGlkPSJ0cmVlVmlldyI+Ci0gICAgICAgICAgICA8dHJhbnNmb3JtIHhzbD0iL3skeG9wdXNDb250ZXh0fS94b3B1cy9tZWRpYS90cmVldmlldy90cmVlLnhzbCI+PC90cmFuc2Zvcm0+Ci0gICAgICAgICAgPC92aWV3PgotICAgICAgICA8L3BpcGVsaW5lPgotICAgICAgPC94bWw+Ci0gICAgPC9kaXY+Ci0gIDwvYm9keT4KLTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21vZHVsZXMveG9wdXMveHNsdC9ob21lcGFnZS54c2wgYi90cnVuay9zcmMvbW9kdWxlcy94b3B1cy94c2x0L2hvbWVwYWdlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzYmJiNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbW9kdWxlcy94b3B1cy94c2x0L2hvbWVwYWdlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gIDx4c2w6Y29weT4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICA8L3hzbDpjb3B5PgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbW9kdWxlcy94b3B1cy94c2x0L3hodG1sLnhzbCBiL3RydW5rL3NyYy9tb2R1bGVzL3hvcHVzL3hzbHQveGh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTNiYmI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tb2R1bGVzL3hvcHVzL3hzbHQveGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgPHhzbDpjb3B5PgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gIDwveHNsOmNvcHk+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL2FjY2Vzcy1jb250cm9sLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL2FjY2Vzcy1jb250cm9sLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0YzkzMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9hY2Nlc3MtY29udHJvbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08YWNjZXNzLWNvbnRyb2xsZXIgdHlwZT0iYnlwYXNzYWJsZSI+Ci0gIAotICA8YWNjcmVkaXRhYmxlLW1hbmFnZXIgdHlwZT0iZmlsZSI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXJlY3RvcnkiIHZhbHVlPSJjb250ZXh0Oi8vL2xlbnlhL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkIi8+Ci0gICAgCi0gICAgPHVzZXItbWFuYWdlcj4KLSAgICAgIDx1c2VyLXR5cGUgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlciIgY3JlYXRlLXVzZS1jYXNlPSJhZG1pbi5hZGRVc2VyIj5Mb2NhbCBVc2VyPC91c2VyLXR5cGU+Ci0gICAgICA8IS0tIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYgeW91IHdhbnQgTERBUCBzdXBwb3J0IC0tPgotICAgICAgPCEtLSA8dXNlci10eXBlIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmFjLmxkYXAuTERBUFVzZXIiIGNyZWF0ZS11c2UtY2FzZT0iYWRtaW4uYWRkVXNlciI+TERBUCBVc2VyPC91c2VyLXR5cGU+IC0tPgotICAgIDwvdXNlci1tYW5hZ2VyPgotICA8L2FjY3JlZGl0YWJsZS1tYW5hZ2VyPgotICAKLSAgPHBvbGljeS1tYW5hZ2VyIHR5cGU9ImRvY3VtZW50Ij4KLSAgICA8cG9saWN5LW1hbmFnZXIgdHlwZT0iZmlsZSI+Ci0gICAgICA8cGFyYW1ldGVyIG5hbWU9ImRpcmVjdG9yeSIgdmFsdWU9ImNvbnRleHQ6Ly8vbGVueWEvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcyIvPgotICAgIDwvcG9saWN5LW1hbmFnZXI+Ci0gIDwvcG9saWN5LW1hbmFnZXI+Ci0gIAotICA8YXV0aG9yaXplciB0eXBlPSJ1c2VjYXNlIj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNvbmZpZ3VyYXRpb24iIHZhbHVlPSJhZ2dyZWdhdGUtZmFsbGJhY2s6Ly9jb25maWcvYWNjZXNzLWNvbnRyb2wvdXNlY2FzZS1wb2xpY2llcy54bWwiLz4KLSAgPC9hdXRob3JpemVyPgotICAKLTwvYWNjZXNzLWNvbnRyb2xsZXI+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvYWRtaW4uZ21sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2FkbWluLmdtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxYzgwMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvYWRtaW4uZ21sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08Z3JvdXAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlR3JvdXAiIGlkPSJhZG1pbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9hZG1pbi5ybWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvYWRtaW4ucm1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzRlZDBmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9hZG1pbi5ybWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxyb2xlIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZVJvbGUiIGlkPSJhZG1pbiIgYXNzaWduYWJsZT0iZmFsc2UiLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvYWxpY2UuaW1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2FsaWNlLmltbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjMjc0MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvYWxpY2UuaW1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPGlkZW50aXR5IGlkPSJhbGljZSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlciI+Ci0gIDxuYW1lPkFsaWNlPC9uYW1lPgotICA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAgPGVtYWlsPmFsaWNlQGxlbnlhLm9yZzwvZW1haWw+Ci0gIDxwYXNzd29yZCB0eXBlPSJtZDUiPjhlMDdkYWZkMTM0OTU1NjFkYjkwNjNlYmU0ZGI0YjI3PC9wYXNzd29yZD4KLSAgPGdyb3Vwcz4KLSAgICA8Z3JvdXA+ZWRpdG9yPC9ncm91cD4KLSAgICA8Z3JvdXA+cmV2aWV3ZXI8L2dyb3VwPgotICA8L2dyb3Vwcz4KLTwvaWRlbnRpdHk+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvY2lmcy5wcm9wZXJ0aWVzLnNhbXBsZSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9jaWZzLnByb3BlcnRpZXMuc2FtcGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzdhZDc4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9jaWZzLnByb3BlcnRpZXMuc2FtcGxlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIHRoZSBuYW1lIG9mIHRoZSBkb21haW4gY29udHJvbGxlciAob3Igc2FtYmEgc2V2ZXIpIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbnN0DQotZG9tYWluLWNvbnRyb2xsZXI9bXktZG9tYWluLWNvbnRyb2xsZXINCi0NCi0jIGRvbWFpbi93b3JrZ3JvdXAgbmFtZSB0byB1c2UNCi1kb21haW49V09SS0dST1VQClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2VkaXQucm1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2VkaXQucm1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjJhNjI5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9lZGl0LnJtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkJCAtLT4NCi0NCi08cm9sZSBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVSb2xlIiBpZD0iZWRpdCIvPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9lZGl0b3IuZ21sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2VkaXRvci5nbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjYwMGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2VkaXRvci5nbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxncm91cCBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVHcm91cCIgaWQ9ImVkaXRvciIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9sZGFwLnByb3BlcnRpZXMuc2FtcGxlIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2xkYXAucHJvcGVydGllcy5zYW1wbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZTBjZmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2xkYXAucHJvcGVydGllcy5zYW1wbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBGaWxlOiBsZGFwLnByb3BlcnRpZXMuc2FtcGxlCi0jICRJZCQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYWwgc2V0dGluZ3MgCi0jICAgIHNldCBoYW5kbC1yZWZlcnJhbHMgdG8gImZvbGxvdyIgaXMgeW91ciBsZGFwIHNlcnZlciB1c2VzIHJlZmVycmFscwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyLXVybD1sZGFwczovL2xkYXAuZXhhbXBsZS5jb206Mzg5L2RjPWV4YW1wbGUsZGM9Y29tCi1iYXNlLWRuPWRjPWV4YW1wbGUsZGM9Y29tCi1oYW5kbGUtcmVmZXJyYWxzPQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBVc2VyIHBhcmFtZXRlcnMgZm9yIGF1dGhlbnRpY2F0aW9uOgotIyB1c3ItYnJhbmNoOiAKLSMgICAgICBpZiB1c2VycyBhcmUgdG8gYmUgdGFrZW4gZnJvbSBhIHNwZWNpZmljIGJyYW5jaCwgc2V0IHRoaXMuCi0jICAgICAgSWYgeW91IHNldCB0aGlzIHRvIGVtcHR5LCB1c2VycyB3aWxsIGJlIHNlYXJjaGVkIGluIHRoZSB3aG9sZSAKLSMgICAgICBzdWJ0cmVlLCBpLmUuOgotIyAgICAgICAgIHVzci1icmFuY2g9Ci0jIHVzci1hdXRoZW50aWNhdGlvbjoKLSMgICAgICBhdXRoZW50aWNhdGlvbiBtZXRob2Qgd2hlbiB0aGUgdXNlciBhdXRoZW50aWNhdGVzCi0jIGRvbWFpbi1uYW1lOgotIyAgICAgIEFGQUlLLCB0aGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIE1TIEFjdGl2ZSBEaXJlY3RvcnkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jdXNyLWJyYW5jaD1vdT1QZW9wbGUKLXVzci1icmFuY2g9Ci11c3ItYXR0cj11aWQKLXVzci1uYW1lLWF0dHI9c24KLXVzci1hdXRoZW50aWNhdGlvbj1zaW1wbGUKLWRvbWFpbi1uYW1lPQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNlY3VyaXR5IHNldHRpbmdzCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIHNlY3VyaXR5LWF1dGhlbnRpY2F0aW9uOgotIyAgICAgICB5b3UgY2FuIHNldCB0aGlzIHRvIG5vbmUgaWYgdGhlcmUgaXMgbm8gbWFuYWdlciBhdXRoZW50aWNhdGlvbiwgaS5lLjoKLSMgICAgICAgICBzZWN1cml0eS1hdXRoZW50aWNhdGlvbj1ub25lCi0jIG1nci1kbiBhbmQgbWdyLXB3OgotIyAgICAgICBNYW5hZ2VyL3VzZXIgd2hpY2ggaXMgYWxsb3dlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgImFsbCIgdXNlcnMKLSMgICAgICAgKGZ1bGxuYW1lKSBmcm9tIExEQVAgc2VydmVyLiBMZWF2ZSBpdCBlbXB0eSBmb3IgYW5vbnltb3VzIGJpbmRpbmdzLgotIyBrZXktc3RvcmU6Ci0jICAgICAgIC0gSWYgeW91IGRvIG5vdCB1c2Ugc3NsLCB5b3UgY2FuIGNvbW1lbnQgb3V0IHRoaXMgcHJvcGVydHkuCi0jICAgICAgIC0ga2V5c3RvcmUgaXMgdGFrZW4gcmVsYXRpdmVseSB0byB0aGUgcHVibGljYXRpb24gY29uZmlnL2FjL3Bhc3N3ZAotIyAgICAgICBkaXJlY3RvcnkuIFlvdSBzaG91bGQgcHV0IHRoZSBEaXJlY3RvcnktU2VydmVyIGNlcnRpZmljYXRlIGluIHRoaXMgCi0jICAgICAgIGZpbGUsIGlmIHVzaW5nIHNzbC4gCi0jICAgICAgIFRoZSBrZXlzdG9yZSBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQgYXMgZm9sbG93czoKLSMgICAgICAgICAga2V5dG9vbCAtaW1wb3J0IC1rZXlzdG9yZSAua2V5c3RvcmUgLWZpbGUgPGNhX2NlcnRfZmlsZT4gCi0jICAgICAgICAgICAgICAgICAgICAtYWxpYXMgPHlvdXJkb21haW4uY29tPgotIyAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNlY3VyaXR5LWF1dGhlbnRpY2F0aW9uPXNpbXBsZQotbWdyLWRuPQotbWdyLXB3PQota2V5LXN0b3JlPS5rZXlzdG9yZQotc2VjdXJpdHktcHJvdG9jb2w9c3NsCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvbGVueWEuaW1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2xlbnlhLmltbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwNmIyZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvbGVueWEuaW1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPGlkZW50aXR5IGlkPSJsZW55YSIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlciI+Ci0gIDxuYW1lPkxldmkgVmFueWE8L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotICA8ZW1haWw+bGV2aS52YW55YUB3eW9uYS5vcmc8L2VtYWlsPgotICA8cGFzc3dvcmQgdHlwZT0ibWQ1Ij44ZTA3ZGFmZDEzNDk1NTYxZGI5MDYzZWJlNGRiNGIyNzwvcGFzc3dvcmQ+Ci0gIDxncm91cHM+Ci0gICAgPGdyb3VwPmVkaXRvcjwvZ3JvdXA+Ci0gICAgPGdyb3VwPmFkbWluPC9ncm91cD4KLSAgICA8Z3JvdXA+c2l0ZW1hbmFnZXI8L2dyb3VwPgotICA8L2dyb3Vwcz4KLTwvaWRlbnRpdHk+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvbG9jYWxob3N0LmlwbWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvbG9jYWxob3N0LmlwbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDc0MWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL2xvY2FsaG9zdC5pcG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08aXAtcmFuZ2UgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlSVBSYW5nZSIgaWQ9ImxvY2FsaG9zdCI+Ci0gIDxuYW1lPkxvY2FsaG9zdDwvbmFtZT4KLSAgPG5ldHdvcmstYWRkcmVzcz4xMjcuMC4wLjE8L25ldHdvcmstYWRkcmVzcz4KLSAgPHN1Ym5ldC1tYXNrPjI1NS4yNTUuMjU1LjA8L3N1Ym5ldC1tYXNrPgotPC9pcC1yYW5nZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9yZXZpZXcucm1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL3Jldmlldy5ybWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MmU5NWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL3Jldmlldy5ybWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZCQgLS0+DQotDQotPHJvbGUgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlUm9sZSIgaWQ9InJldmlldyIvPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9yZXZpZXdlci5nbWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvcmV2aWV3ZXIuZ21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzA0ZmZiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9yZXZpZXdlci5nbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxncm91cCBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVHcm91cCIgaWQ9InJldmlld2VyIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL3Nlc3Npb24ucm1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL3Nlc3Npb24ucm1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTgyYjAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9zZXNzaW9uLnJtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkJCAtLT4NCi0NCi08cm9sZSBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVSb2xlIiBpZD0ic2Vzc2lvbiIvPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9zaXRlbWFuYWdlci5nbWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2Qvc2l0ZW1hbmFnZXIuZ21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzA2YWQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9zaXRlbWFuYWdlci5nbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZWRpdG9yLmdtbCA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgLS0+Ci0KLTxncm91cCBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVHcm91cCIgaWQ9InNpdGVtYW5hZ2VyIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL3NpdGVtYW5hZ2VyLnJtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZC9zaXRlbWFuYWdlci5ybWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzM4NmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL3NpdGVtYW5hZ2VyLnJtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBhZG1pbi5ybWwgNDczODYxIDIwMDYtMTEtMTIgMDM6NTE6MTRaIGdyZWdvciAkIC0tPgotCi08cm9sZSBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5hYy5maWxlLkZpbGVSb2xlIiBpZD0ic2l0ZW1hbmFnZXIiLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvdmlzaXQucm1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcGFzc3dkL3Zpc2l0LnJtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlNGZmOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wYXNzd2QvdmlzaXQucm1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQkIC0tPg0KLQ0KLTxyb2xlIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmFjLmZpbGUuRmlsZVJvbGUiIGlkPSJ2aXNpdCIvPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL2FyY2hpdmUvc3VidHJlZS1wb2xpY3kuYWNtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL2FyY2hpdmUvc3VidHJlZS1wb2xpY3kuYWNtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5MDg0OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy9hcmNoaXZlL3N1YnRyZWUtcG9saWN5LmFjbWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHN1YnRyZWUtcG9saWN5LmFjbWwgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTxwb2xpY3kgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9hYy8xLjAiPgotCi0gIDxncm91cCBpZD0iZWRpdG9yIj4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIgLz4KLSAgPC9ncm91cD4KLQotICA8Z3JvdXAgaWQ9InJldmlld2VyIj4KLSAgICA8cm9sZSBpZD0icmV2aWV3IiBtZXRob2Q9ImdyYW50IiAvPgotICA8L2dyb3VwPgotCi0gIDxncm91cCBpZD0iYWRtaW4iPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC9ncm91cD4KLSAKLSAgPGdyb3VwIGlkPSJzaXRlbWFuYWdlciI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50IiAvPgotICA8L2dyb3VwPgotCi0gIDwhLS0gdGhlICJzZXNzaW9uIiByb2xlIGdyYW50cyBhY2Nlc3MgdG8gbG9naW4sIGxvZ291dCBhbmQgYWJvdXRMZW55YSAtLT4KLSAgPHdvcmxkPgotICAgIDxyb2xlIGlkPSJzZXNzaW9uIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvd29ybGQ+Ci0KLTwvcG9saWN5PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL2F1dGhvcmluZy9pbmRleC91cmwtcG9saWN5LmFjbWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy9hdXRob3JpbmcvaW5kZXgvdXJsLXBvbGljeS5hY21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYyMGU3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL2F1dGhvcmluZy9pbmRleC91cmwtcG9saWN5LmFjbWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHVybC1wb2xpY3kuYWNtbCx2IDEuMyAyMDA0LzAzLzEzIDEyOjM0OjE1IGdyZWdvciBFeHAgJCAtLT4KLQotPHBvbGljeSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2FjLzEuMCI+Ci0KLSAgPGdyb3VwIGlkPSJlZGl0b3IiPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvZ3JvdXA+Ci0gIAotICA8d29ybGQ+Ci0gICAgPCEtLSBJZiBubyBAbWV0aG9kIGlzIHNldCwgd2UgYXNzdW1lIG1ldGhvZD0iZGVueSIgLS0+Ci0gICAgPHJvbGUgaWQ9InZpc2l0Ii8+Ci0gIDwvd29ybGQ+Ci0gIAotPC9wb2xpY3k+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcG9saWNpZXMvYXV0aG9yaW5nL3N1YnRyZWUtcG9saWN5LmFjbWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy9hdXRob3Jpbmcvc3VidHJlZS1wb2xpY3kuYWNtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhYzkyMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy9hdXRob3Jpbmcvc3VidHJlZS1wb2xpY3kuYWNtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwb2xpY3kgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9hYy8xLjAiPgotCi0gIDxncm91cCBpZD0iZWRpdG9yIj4KLSAgICA8cm9sZSBpZD0iZWRpdCIgIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC9ncm91cD4KLQotICA8Z3JvdXAgaWQ9InJldmlld2VyIj4KLSAgICA8cm9sZSBpZD0icmV2aWV3IiAgbWV0aG9kPSJncmFudCIvPgotICA8L2dyb3VwPgotCi0gIDxncm91cCBpZD0iYWRtaW4iPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC9ncm91cD4KLSAKLSAgPGdyb3VwIGlkPSJzaXRlbWFuYWdlciI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvZ3JvdXA+Ci0gCi0gIDwhLS0gdGhlICJzZXNzaW9uIiByb2xlIGdyYW50cyBhY2Nlc3MgdG8gbG9naW4sIGxvZ291dCBhbmQgYWJvdXRMZW55YSAtLT4KLSAgPHdvcmxkPgotICAgIDxyb2xlIGlkPSJzZXNzaW9uIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvd29ybGQ+Ci0KLTwvcG9saWN5PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL2ludHJvZHVjdGlvbi5odG1sL3N1YnRyZWUtcG9saWN5LmFjbWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy9pbnRyb2R1Y3Rpb24uaHRtbC9zdWJ0cmVlLXBvbGljeS5hY21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ExN2RlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL2ludHJvZHVjdGlvbi5odG1sL3N1YnRyZWUtcG9saWN5LmFjbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08cG9saWN5IHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvYWMvMS4wIj4KLQotICA8d29ybGQ+Ci0gICAgPHJvbGUgaWQ9InZpc2l0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvd29ybGQ+Ci0KLTwvcG9saWN5PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL2xpdmUvc3VidHJlZS1wb2xpY3kuYWNtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL2xpdmUvc3VidHJlZS1wb2xpY3kuYWNtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMTdkZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy9saXZlL3N1YnRyZWUtcG9saWN5LmFjbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08cG9saWN5IHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvYWMvMS4wIj4KLQotICA8d29ybGQ+Ci0gICAgPHJvbGUgaWQ9InZpc2l0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvd29ybGQ+Ci0KLTwvcG9saWN5PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL21vZHVsZXMvc3VidHJlZS1wb2xpY3kuYWNtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL21vZHVsZXMvc3VidHJlZS1wb2xpY3kuYWNtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1MDkzOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy9tb2R1bGVzL3N1YnRyZWUtcG9saWN5LmFjbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHN1YnRyZWUtcG9saWN5LmFjbWwgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0KLTxwb2xpY3kgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9hYy8xLjAiPgotCi0gIDx3b3JsZD4KLSAgICA8cm9sZSBpZD0idmlzaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC93b3JsZD4KLQotPC9wb2xpY3k+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcG9saWNpZXMvdHJhc2gvc3VidHJlZS1wb2xpY3kuYWNtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL3RyYXNoL3N1YnRyZWUtcG9saWN5LmFjbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZGI2NWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcG9saWNpZXMvdHJhc2gvc3VidHJlZS1wb2xpY3kuYWNtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogc3VidHJlZS1wb2xpY3kuYWNtbCA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPHBvbGljeSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2FjLzEuMCI+Ci0KLSAgPGdyb3VwIGlkPSJlZGl0b3IiPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvZ3JvdXA+Ci0KLSAgPGdyb3VwIGlkPSJyZXZpZXdlciI+Ci0gICAgPHJvbGUgaWQ9InJldmlldyIgbWV0aG9kPSJncmFudCIvPgotICA8L2dyb3VwPgotCi0gIDxncm91cCBpZD0iYWRtaW4iPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgbWV0aG9kPSJncmFudCIvPgotICA8L2dyb3VwPgotICAKLSAgPGdyb3VwIGlkPSJzaXRlbWFuYWdlciI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiAgbWV0aG9kPSJncmFudCIvPgotICA8L2dyb3VwPgotCi0gIDwhLS0gdGhlICJzZXNzaW9uIiByb2xlIGdyYW50cyBhY2Nlc3MgdG8gbG9naW4sIGxvZ291dCBhbmQgYWJvdXRMZW55YSAtLT4KLSAgPHdvcmxkPgotICAgIDxyb2xlIGlkPSJzZXNzaW9uIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvd29ybGQ+Ci0KLTwvcG9saWN5PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL3VybC1wb2xpY3kuYWNtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL3VybC1wb2xpY3kuYWNtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlMTJhNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy91cmwtcG9saWN5LmFjbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08cG9saWN5IHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvYWMvMS4wIj4KLQotICA8d29ybGQ+Ci0gICAgPHJvbGUgaWQ9InZpc2l0IiBtZXRob2Q9ImRlbnkiLz4KLSAgPC93b3JsZD4KLQotPC9wb2xpY3k+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcG9saWNpZXMvd2ViZGF2L2luZGV4L3VybC1wb2xpY3kuYWNtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL3dlYmRhdi9pbmRleC91cmwtcG9saWN5LmFjbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZjIwZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvcG9saWNpZXMvd2ViZGF2L2luZGV4L3VybC1wb2xpY3kuYWNtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdXJsLXBvbGljeS5hY21sLHYgMS4zIDIwMDQvMDMvMTMgMTI6MzQ6MTUgZ3JlZ29yIEV4cCAkIC0tPgotCi08cG9saWN5IHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvYWMvMS4wIj4KLQotICA8Z3JvdXAgaWQ9ImVkaXRvciI+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC9ncm91cD4KLSAgCi0gIDx3b3JsZD4KLSAgICA8IS0tIElmIG5vIEBtZXRob2QgaXMgc2V0LCB3ZSBhc3N1bWUgbWV0aG9kPSJkZW55IiAtLT4KLSAgICA8cm9sZSBpZD0idmlzaXQiLz4KLSAgPC93b3JsZD4KLSAgCi08L3BvbGljeT4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC9wb2xpY2llcy93ZWJkYXYvc3VidHJlZS1wb2xpY3kuYWNtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL3dlYmRhdi9zdWJ0cmVlLXBvbGljeS5hY21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjFiMzI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL2FjY2Vzcy1jb250cm9sL3BvbGljaWVzL3dlYmRhdi9zdWJ0cmVlLXBvbGljeS5hY21sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBvbGljeSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2FjLzEuMCI+Ci0KLSAgPGdyb3VwIGlkPSJlZGl0b3IiPgotICAgIDxyb2xlIGlkPSJlZGl0IiAgbWV0aG9kPSJncmFudCIvPgotICA8L2dyb3VwPgotCi0gIDxncm91cCBpZD0icmV2aWV3ZXIiPgotICAgIDxyb2xlIGlkPSJyZXZpZXciICBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvZ3JvdXA+Ci0KLSAgPGdyb3VwIGlkPSJhZG1pbiI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiAgbWV0aG9kPSJncmFudCIvPgotICA8L2dyb3VwPgotCi0gIDxncm91cCBpZD0ic2l0ZW1hbmFnZXIiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC9ncm91cD4KLQotPC9wb2xpY3k+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvYWNjZXNzLWNvbnRyb2wvdXNlY2FzZS1wb2xpY2llcy54bWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC91c2VjYXNlLXBvbGljaWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViMTk4MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9hY2Nlc3MtY29udHJvbC91c2VjYXNlLXBvbGljaWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotICAgIAotPCEtLSsrK05PVEUrKysgVGhlIHVzZWNhc2UgbGlzdCB3YXMgaW5pdGlhbGl6ZWQgdXNpbmcgbW9kdWxlcy91c2VjYXNlLWltcGwveHNsdC9pbml0VXNlY2FzZVBvbGljaWVzLnhzbC4tLT4KLTx1c2VjYXNlcyB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2FjLzEuMCI+Ci0KLSAgPHVzZWNhc2UgaWQ9ImFjLnZpc2l0Ij4KLSAgICA8cm9sZSBpZD0idmlzaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJyZXZpZXciIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWMubG9nb3V0Ij4KLSAgICA8cm9sZSBpZD0ic2Vzc2lvbiIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJhYy5sb2dpbiI+Ci0gICAgPHJvbGUgaWQ9InNlc3Npb24iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uYWJvdXRMZW55YSI+Ci0gICAgPHJvbGUgaWQ9InNlc3Npb24iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotCi0gIDx1c2VjYXNlIGlkPSJieGUuZWRpdCI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYnhlLmNsb3NlIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIvPgotICA8L3VzZWNhc2U+ICAKLSAgPHVzZWNhc2UgaWQ9ImNmb3Jtcy5lZGl0Ij4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJmY2tlZGl0b3IuZWRpdCI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0ibGlua2NoZWNrLmdldExpbmtzIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJsdWNlbmUuZXh0ZXJuYWxPcGVuc2VhcmNoIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJsdWNlbmUuaW5kZXgiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9Imx1Y2VuZS5pbmRleFNpdGUiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9Imx1Y2VuZS5vcGVuc2VhcmNoIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJsdWNlbmUuc2VhcmNoIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJ2aXNpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJzaXRlbWFuYWdlbWVudC5hcmNoaXZlIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0ic2l0ZW1hbmFnZW1lbnQuY2hhbmdlTGFiZWwiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJzaXRlbWFuYWdlbWVudC5jaGFuZ2VOb2RlSUQiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJzaXRlbWFuYWdlbWVudC5jaGFuZ2VWaXNpYmlsaXR5Ij4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0ic2l0ZW1hbmFnZW1lbnQuY29weSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0ic2l0ZW1hbmFnZW1lbnQuY3JlYXRlIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJzaXRlbWFuYWdlbWVudC5jcmVhdGVMYW5ndWFnZSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0ic2l0ZW1hbmFnZW1lbnQuY3V0Ij4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJzaXRlbWFuYWdlbWVudC5kZWxldGUiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9InNpdGVtYW5hZ2VtZW50LmRlbGV0ZUxhbmd1YWdlIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJzaXRlbWFuYWdlbWVudC5wYXN0ZSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0ic2l0ZW1hbmFnZW1lbnQucmVzdG9yZSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0ic2l0ZW1hbmFnZW1lbnQucm9sbGJhY2siPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4gIAotICA8dXNlY2FzZSBpZD0ic2l0ZW1hbmFnZW1lbnQuZm9yY2VDaGVja0luIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+ICAKLSAgPHVzZWNhc2UgaWQ9InRhYi5hY0FyY2hpdmUiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9InRhYi5hY0F1dGhvcmluZyI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9InRhYi5hY0xpdmUiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJ0YWIuYWNUcmFzaCI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9InRhYi5hc3NldHMiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9InRhYi5tZXRhIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJ0YWIub3ZlcnZpZXciPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9InJldmlldyIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJ2aXNpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJ0YWIucmV2aXNpb25zIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJ0YWIuc2NoZWR1bGVyIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJ0YWIud29ya2Zsb3ciPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9Im9wZW5kb2N1bWVudC5jcmVhdGUiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9Im9wZW5kb2N1bWVudC51cGxvYWQiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9InNpdGV0cmVlLm51ZGdlIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJjb250YWN0Rm9ybS5zZW5kTWVzc2FnZSI+Ci0gICAgPHJvbGUgaWQ9InZpc2l0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9InVzZWNhc2Vkb2N1bWVudC5jcmVhdGUiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9IndlYmRhdi5kZWxldGUiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9IndlYmRhdi5maWxlUHJvcGZpbmQiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9IndlYmRhdi5ta2NvbCI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0id2ViZGF2LnByb3BmaW5kIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJ3ZWJkYXYucHV0Ij4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJhZG1pbi51c2VjYXNlcyI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImFkbWluLmFkZEdyb3VwIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uYWRkSVBSYW5nZSI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImFkbWluLmFkZFVzZXIiPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJhZG1pbi5jaGFuZ2VQYXNzd29yZCI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0icmV2aWV3IiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9InZpc2l0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImFkbWluLmNoYW5nZVBhc3N3b3JkQWRtaW4iPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJhZG1pbi5kZWxldGVHcm91cCI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImFkbWluLmRlbGV0ZUlQUmFuZ2UiPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJhZG1pbi5kZWxldGVVc2VyIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uZW1wdHlUcmFzaCI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImFkbWluLmdyb3VwIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uZ3JvdXBNZW1iZXJzIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uZ3JvdXBQcm9maWxlIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uZ3JvdXBzIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uaXBSYW5nZUdyb3VwcyI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImFkbWluLmlwUmFuZ2VQcm9maWxlIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uaXBSYW5nZSI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImFkbWluLmlwUmFuZ2VzIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uc2VydmVyU3RhdHVzIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4uc2Vzc2lvbnMiPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJhZG1pbi5zaXRlT3ZlcnZpZXciPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJhZG1pbi51c2VyIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4udXNlckdyb3VwcyI+Ci0gICAgPHJvbGUgaWQ9ImFkbWluIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImFkbWluLnVzZXJQcm9maWxlIj4KLSAgICA8cm9sZSBpZD0iYWRtaW4iIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iYWRtaW4udXNlcnMiPgotICAgIDxyb2xlIGlkPSJhZG1pbiIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJlZGl0b3JzLmZvcm1zIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJlZGl0b3JzLm9uZWZvcm0iPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImVkaXRvcnMucHVibGljYXRpb25FZGl0Ij4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0idGVtcGxhdGluZy5jcmVhdGVQdWJsaWNhdGlvbkZyb21UZW1wbGF0ZSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9IndvcmtmbG93LmRlbGV0ZSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9IndvcmtmbG93LnB1Ymxpc2giPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJyZXZpZXciIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0id29ya2Zsb3cuZGVhY3RpdmF0ZSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9InJldmlldyIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJ3b3JrZmxvdy5yZWplY3QiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJyZXZpZXciIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0id29ya2Zsb3cuc3VibWl0Ij4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJ3b3JrZmxvdy5tdWx0aVdvcmtmbG93Ij4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0icmV2aWV3IiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0id29ya2Zsb3cubXVsdGlXb3JrZmxvd0ludm9rZSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9InJldmlldyIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9Imt1cHUuZWRpdCI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0icmVzb3VyY2UudXBsb2FkIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJyZXNvdXJjZS5jcmVhdGUiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImVudHJ5LmNyZWF0ZSI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iZXhwb3J0LmltcG9ydCI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iZXhwb3J0LmltcG9ydEV4YW1wbGVDb250ZW50Ij4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJub3RpZmljYXRpb24uaW5ib3giPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9InJldmlldyIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJub3RpZmljYXRpb24uc2VuZE1lc3NhZ2UiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9InJldmlldyIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJuZXV0cm9uLmNoZWNrb3V0Ij4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJuZXV0cm9uLmNoZWNraW4iPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9Im5ld3MuZWRpdCI+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iIj4KLSAgICA8cm9sZSBpZD0ic2l0ZW1hbmFnZXIiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgICA8cm9sZSBpZD0iZWRpdCIgbWV0aG9kPSJncmFudCIvPgotICA8L3VzZWNhc2U+Ci0gIDx1c2VjYXNlIGlkPSJlZGl0b3JzLmluc2VydExpbmsiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImVkaXRvcnMuaW5zZXJ0SW1hZ2UiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImVkaXRvcnMuaW5zZXJ0QXNzZXQiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9ImVkaXRvcnMuY3JlYXRlUmVzb3VyY2UiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLSAgPHVzZWNhc2UgaWQ9InRpbnltY2UuZWRpdCI+Ci0gICAgPHJvbGUgaWQ9InNpdGVtYW5hZ2VyIiBtZXRob2Q9ImdyYW50Ii8+Ci0gICAgPHJvbGUgaWQ9ImVkaXQiIG1ldGhvZD0iZ3JhbnQiLz4KLSAgPC91c2VjYXNlPgotICA8dXNlY2FzZSBpZD0iZmNrZWRpdG9yLmVkaXQiPgotICAgIDxyb2xlIGlkPSJzaXRlbWFuYWdlciIgbWV0aG9kPSJncmFudCIvPgotICAgIDxyb2xlIGlkPSJlZGl0IiBtZXRob2Q9ImdyYW50Ii8+Ci0gIDwvdXNlY2FzZT4KLTwvdXNlY2FzZXM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9jb2Nvb24teGNvbmYvaW5zdGFudGlhdG9yLnhjb25mIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvY29jb29uLXhjb25mL2luc3RhbnRpYXRvci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzYTk5YS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9jb2Nvb24teGNvbmYvaW5zdGFudGlhdG9yLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB1c2VjYXNlLnhtYXAgMTU4Nzk0IDIwMDUtMDMtMjMgMTY6MjE6MTVaIGFuZHJlYXMgJCAtLT4KLTwhLS0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdGVtcGxhdGUgaW5zdGFudGlhdG9yCi0tLT4KLQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vdGVtcGxhdGUtaW5zdGFudGlhdG9ycyIgdW5sZXNzPSIvY29jb29uL3RlbXBsYXRlLWluc3RhbnRpYXRvcnMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2RlZmF1bHQnXSI+Ci0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImRlZmF1bHQiCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI9ImxlbnlhLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5kZWZhdWx0cHViLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLkluc3RhbnRpYXRvciIvPgotCi0gIDwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9tZW51cy9nZW5lcmljLnhzcCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL21lbnVzL2dlbmVyaWMueHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY3YThlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL21lbnVzL2dlbmVyaWMueHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZ2VuZXJpYy54c3AgMTU1ODA2IDIwMDUtMDMtMDEgMTc6NTU6NDJaIGFuZHJlYXMgJCAtLT4KLQotPHhzcDpwYWdlIAotICAgIGxhbmd1YWdlPSJqYXZhIiAKLSAgICB4bWxuczp4c3A9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcCIKLSAgICB4bWxuczp4c3AtcmVxdWVzdD0iaHR0cDovL2FwYWNoZS5vcmcveHNwL3JlcXVlc3QvMi4wIgotICAgIHhtbG5zOmlucHV0PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24veHNwL2lucHV0LzEuMCIKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiICAgIAotICAgIHhtbG5zOndmPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvd29ya2Zsb3cvMS4wIgotICAgIHhtbG5zOnVjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLT4KLQotICA8eHNwOnN0cnVjdHVyZT4KLSAgICA8eHNwOmluY2x1ZGU+b3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnQ8L3hzcDppbmNsdWRlPgotICAgIDx4c3A6aW5jbHVkZT5vcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbjwveHNwOmluY2x1ZGU+Ci0gIDwveHNwOnN0cnVjdHVyZT4KLSAgCi0gIDxtZW51PgotCi0gICAgPHhzcDpsb2dpYz4KLSAgICAgIFN0cmluZyBkb2N1bWVudElkID0gPGlucHV0OmdldC1hdHRyaWJ1dGUgbW9kdWxlPSJwYWdlLWVudmVsb3BlIiBhcz0ic3RyaW5nIiBuYW1lPSJjb250ZXh0LXByZWZpeCIvPiArICIvIiArIDxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9InN0cmluZyIgbmFtZT0icHVibGljYXRpb24taWQiLz4gKyAiL2F1dGhvcmluZyIgKyA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIGFzPSJzdHJpbmciIG5hbWU9ImRvY3VtZW50LXV1aWQiLz4gKyAiXyIgKyA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIGFzPSJzdHJpbmciIG5hbWU9ImRvY3VtZW50LWxhbmd1YWdlIi8+OwotICAgICAgU3RyaW5nIGFyZWEgPSA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIGFzPSJzdHJpbmciIG5hbWU9ImFyZWEiLz47Ci0gICAgICAKLSAgICAgIE9iamVjdCBkb2N1bWVudE9iamVjdCA9IDxpbnB1dDpnZXQtYXR0cmlidXRlIGFzPSJvYmplY3QiIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgbmFtZT0iZG9jdW1lbnQiLz47Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICBTdHJpbmcgdmlzaWJsZSA9IG51bGw7Ci0gICAgICBpZiAoZG9jdW1lbnRPYmplY3QgIT0gbnVsbCAmYW1wOyZhbXA7ICEiIi5lcXVhbHMoZG9jdW1lbnRPYmplY3QpKSB7Ci0gICAgICAgICAgZG9jdW1lbnQgPSAoRG9jdW1lbnQpIGRvY3VtZW50T2JqZWN0OwotCi0gICAgICAgIHZpc2libGUgPSA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9ImRvYy1pbmZvIiBhcz0ic3RyaW5nIj4KLSAgICAgICAgICA8aW5wdXQ6cGFyYW0gbmFtZT0ibmFtZSI+PHhzcDpleHByPmRvY3VtZW50LmdldFB1YmxpY2F0aW9uKCkuZ2V0SWQoKSArICI6IiArIGRvY3VtZW50LmdldEFyZWEoKSArICI6IiArIGRvY3VtZW50LmdldFVVSUQoKSArICI6IiArIGRvY3VtZW50LmdldExhbmd1YWdlKCkgKyAiOnZpc2libGVJbk5hdiI8L3hzcDpleHByPjwvaW5wdXQ6cGFyYW0+Ci0gICAgICAgIDwvaW5wdXQ6Z2V0LWF0dHJpYnV0ZT47Ci0gICAgICB9Ci0KLSAgICAgIGJvb2xlYW4gaXNEb2N1bWVudCA9IGZhbHNlOwotICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCAmYW1wOyZhbXA7IGRvY3VtZW50LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgIGlzRG9jdW1lbnQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgICAgCi0gICAgICAKLSAgICA8L3hzcDpsb2dpYz4KLSAgICAKLSAgICA8bWVudXM+Ci0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkZpbGUiPgotICAgICAgICA8YmxvY2sgYXJlYXM9ImF1dGhvcmluZyBzaXRlIj4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJzaXRlbWFuYWdlbWVudC5jcmVhdGVMYW5ndWFnZSIgaHJlZj0iPyI+PGkxOG46dGV4dD5OZXcgTGFuZ3VhZ2UgVmVyc2lvbjwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJzaXRlbWFuYWdlbWVudC5kZWxldGVMYW5ndWFnZSIgaHJlZj0iPyI+PGkxOG46dGV4dD5SZW1vdmUgTGFuZ3VhZ2UgVmVyc2lvbjwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgPC9ibG9jaz4KLSAgICAgICAgPGJsb2NrIGFyZWE9ImF1dGhvcmluZyI+Ci0gICAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZW1hbmFnZW1lbnQuZm9yY2VDaGVja0luIiBocmVmPSI/Ij48aTE4bjp0ZXh0PmZvcmNlLWNoZWNraW48L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgIDwvYmxvY2s+Ci0gICAgICAgIDxibG9jayBhcmVhcz0iYXV0aG9yaW5nIHNpdGUgYWRtaW4iPgotICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9ImFkbWluLmNoYW5nZVBhc3N3b3JkIiBocmVmPSI/Ij48aTE4bjp0ZXh0PkNoYW5nZSBQYXNzd29yZDwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJhYy5sb2dvdXQiIGhyZWY9Ij8iPjxpMThuOnRleHQ+TG9nb3V0PC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgICA8L2Jsb2NrPgotICAgICAgPC9tZW51PgotICAgICAgCi0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkVkaXQiPgotICAgICAgICAKLSAgICAgICAgPGJsb2NrIGFyZWFzPSJhdXRob3JpbmciPgotICAgICAgICAgIDxpdGVtIHdmOmV2ZW50PSJlZGl0IiB1Yzp1c2VjYXNlPSJ0YWIubWV0YSIgaHJlZj0iPyI+PGkxOG46dGV4dD5FZGl0IE1ldGFkYXRhPC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgICAgIDxpdGVtIHdmOmV2ZW50PSJlZGl0IiB1Yzp1c2VjYXNlPSJzaXRlbWFuYWdlbWVudC5jaGFuZ2VMYWJlbCIgaHJlZj0iPyI+PGkxOG46dGV4dD5FZGl0IE5hdmlnYXRpb24gVGl0bGU8L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgIDwvYmxvY2s+Ci0KLSAgICAgICAgPGJsb2NrIGFyZWFzPSJzaXRlIj4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJzaXRlbWFuYWdlbWVudC5jdXQiIGhyZWY9Ij8iPjxpMThuOnRleHQ+Q3V0PC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9InNpdGVtYW5hZ2VtZW50LmNvcHkiIGhyZWY9Ij8iPjxpMThuOnRleHQ+Q29weTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJzaXRlbWFuYWdlbWVudC5wYXN0ZSIgaHJlZj0iPyI+PGkxOG46dGV4dD5QYXN0ZTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgPC9ibG9jaz4KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgPGJsb2NrIGFyZWFzPSJzaXRlIj4KLSAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZW1hbmFnZW1lbnQuY2hhbmdlTm9kZUlEIiBocmVmPSI/Ij48aTE4bjp0ZXh0PlJlbmFtZSBVUkw8L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9InNpdGVtYW5hZ2VtZW50LmNoYW5nZUxhYmVsIiBocmVmPSI/Ij48aTE4bjp0ZXh0PkVkaXQgTmF2aWdhdGlvbiBUaXRsZTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZW1hbmFnZW1lbnQuY2hhbmdlVmlzaWJpbGl0eSIgaHJlZj0iPyI+Ci0gICAgICAgICAgPHhzcDphdHRyaWJ1dGUgbmFtZT0iY2hlY2tlZCI+PHhzcDpleHByPnZpc2libGU8L3hzcDpleHByPjwveHNwOmF0dHJpYnV0ZT4KLSAgICAgICAgICA8aTE4bjp0ZXh0PlZpc2libGUgaW4gTmF2aWdhdGlvbjwvaTE4bjp0ZXh0PgotICAgICAgICA8L2l0ZW0+Ci0gICAgICA8L2Jsb2NrPgotICAgICAgPGJsb2NrIGFyZWFzPSJzaXRlIj4KLSAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZXRyZWUubnVkZ2UiIGhyZWY9Ij9kaXJlY3Rpb249dXAiPjxpMThuOnRleHQ+TW92ZSBVcDwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZXRyZWUubnVkZ2UiIGhyZWY9Ij9kaXJlY3Rpb249ZG93biI+PGkxOG46dGV4dD5Nb3ZlIERvd248L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICA8L2Jsb2NrPgotICAgICAgPGJsb2NrIGFyZWFzPSJzaXRlIj4KLSAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZW1hbmFnZW1lbnQuZGVsZXRlIiBocmVmPSI/Ij48aTE4bjp0ZXh0PkRlbGV0ZTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0ic2l0ZW1hbmFnZW1lbnQuYXJjaGl2ZSIgaHJlZj0iPyI+PGkxOG46dGV4dD5BcmNoaXZlPC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJzaXRlbWFuYWdlbWVudC5yZXN0b3JlIiBocmVmPSI/Ij48aTE4bjp0ZXh0PlJlc3RvcmU8L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICA8L2Jsb2NrPgotICAgICAgICAKLSAgICAgIDwvbWVudT4KLSAgICAgIAotICAgICAgPG1lbnUgaTE4bjphdHRyPSJuYW1lIiBuYW1lPSJXb3JrZmxvdyI+Ci0gICAgICAgIDxibG9jayBhcmVhcz0iYXV0aG9yaW5nIHNpdGUiPgotICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9IndvcmtmbG93LnN1Ym1pdCIgd2Y6ZXZlbnQ9InN1Ym1pdCIgaHJlZj0iPyI+PGkxOG46dGV4dD53b3JrZmxvdy5zdWJtaXQ8L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0id29ya2Zsb3cucmVqZWN0IiB3ZjpldmVudD0icmVqZWN0IiBocmVmPSI/Ij48aTE4bjp0ZXh0PndvcmtmbG93LnJlamVjdDwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJ3b3JrZmxvdy5wdWJsaXNoIiB3ZjpldmVudD0icHVibGlzaCIgaHJlZj0iPyI+PGkxOG46dGV4dD53b3JrZmxvdy5wdWJsaXNoPC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9IndvcmtmbG93LmRlYWN0aXZhdGUiIHdmOmV2ZW50PSJkZWFjdGl2YXRlIiBocmVmPSI/Ij48aTE4bjp0ZXh0PndvcmtmbG93LmRlYWN0aXZhdGU8L2kxOG46dGV4dD48L2l0ZW0+Ci0gICAgICAgPC9ibG9jaz4KLSAgICAgICAgPGJsb2NrIGFyZWFzPSJhdXRob3Jpbmcgc2l0ZSI+Ci0gICAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0id29ya2Zsb3cubXVsdGlXb3JrZmxvdyIgaHJlZj0iPyI+PGkxOG46dGV4dD53b3JrZmxvdy5tdWx0aVdvcmtmbG93PC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgIDwvYmxvY2s+Ci0gICAgICA8L21lbnU+Ci0KLSAgICAgIDxtZW51IGkxOG46YXR0cj0ibmFtZSIgbmFtZT0iSGVscCI+Ci0gICAgICAgIDxibG9jayBhcmVhcz0iYXV0aG9yaW5nIHNpdGUgYWRtaW4iPgotICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9ImFkbWluLmFib3V0TGVueWEiIGhyZWY9Ij8iPjxpMThuOnRleHQ+QWJvdXQgQXBhY2hlIExlbnlhPC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgICAgIDxpdGVtIGhyZWY9Imh0dHA6Ly9sZW55YS5hcGFjaGUub3JnIj48aTE4bjp0ZXh0PkFwYWNoZSBMZW55YSBIb21lcGFnZTwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICA8aXRlbSBocmVmPSJodHRwOi8vbGVueWEuYXBhY2hlLm9yZy9kb2NzL2luZGV4Lmh0bWwiPjxpMThuOnRleHQ+RG9jdW1lbnRhdGlvbjwvaTE4bjp0ZXh0PjwvaXRlbT4KLSAgICAgICAgICA8aXRlbSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2xlbnlhLyI+PGkxOG46dGV4dD5XaWtpPC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgICA8L2Jsb2NrPgotICAgICAgPC9tZW51PgotICAgICAgCi0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkRldmVsb3BtZW50Ij4KLSAgICAgIDwvbWVudT4KLSAgICA8L21lbnVzPgotICAgIAotICA8L21lbnU+Ci08L3hzcDpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvcHVibGljYXRpb24ueG1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvcHVibGljYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY2MTQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL3B1YmxpY2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwdWJsaWNhdGlvbiB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3B1YmxpY2F0aW9uLzEuMSIgPgotCi0gIDxuYW1lPkRlZmF1bHQ8L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj5UaGlzIHB1YmxpY2F0aW9uIGlzIGEgYmVzdCBwcmFjdGljZSwgZ2V0dGluZyBzdGFydGVkIHB1YmxpY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci0gIDwhLS0gdGhlIEAuLi5AIG1hY3JvcyBhcmUgZXZhbHVhdGVkIGJ5IGFudCBhdCBidWlsZCB0aW1lIC0tPgotICA8dmVyc2lvbj5AbGVueWEudmVyc2lvbkA8L3ZlcnNpb24+Ci0gIDxsZW55YS12ZXJzaW9uPkBsZW55YS52ZXJzaW9uQDwvbGVueWEtdmVyc2lvbj4KLSAgPGxlbnlhLXJldmlzaW9uPkBsZW55YS5yZXZpc2lvbkA8L2xlbnlhLXJldmlzaW9uPgotICA8Y29jb29uLXZlcnNpb24+Mi4xLjEwLWRldjwvY29jb29uLXZlcnNpb24+Ci0KLSAgPCEtLSBUaGUgdmFyaW91cyBsYW5ndWFnZXMgbmVlZCB0byBiZSBsaXN0ZWQgZm9yIHZlcmlmaWNhdGlvbiBhbmQgd2lkZ2V0IGJ1aWxkaW5nIC0tPgotICA8bGFuZ3VhZ2VzPgotICAgIDxsYW5ndWFnZSBkZWZhdWx0PSJ0cnVlIj5lbjwvbGFuZ3VhZ2U+Ci0gICAgPGxhbmd1YWdlPmRlPC9sYW5ndWFnZT4KLSAgICA8bGFuZ3VhZ2U+aGU8L2xhbmd1YWdlPgotICAgIDxsYW5ndWFnZT5lczwvbGFuZ3VhZ2U+Ci0gICAgPGxhbmd1YWdlPmZyPC9sYW5ndWFnZT4KLSAgPC9sYW5ndWFnZXM+Ci0gIDwhLS0gQSB0ZW1wbGF0ZSBpbnN0YW50aWF0b3IgaXMgdXNlZCB0byBjcmVhdGUgbmV3IHB1YmxpY2F0aW9ucyBiYXNlZCBvbiB0aGlzIG9uZS4gLS0+Ci0gIDx0ZW1wbGF0ZS1pbnN0YW50aWF0b3IgbmFtZT0iZGVmYXVsdCIvPgotICA8IS0tIEEgcHVibGljYXRpb24gY2FuIGluaGVyaXQgZnJvbSBhbm90aGVyIHB1YmxpY2F0aW9uLiAiaWQiIGNvcnJlc3BvbmRzIHRvIHRoZSBwdWJsaWNhdGlvbiBpZCAKLSAgICAgICBvZiB0aGF0IHRlbXBsYXRlIChhbmQgdGh1cyB0byB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGl0J3Mgc3RvcmVkIGluKSAtLT4KLSAgPCEtLQotICAgICA8dGVtcGxhdGUgaWQ9InNvbWUtcHViLWlkIi8+Ci0gIC0tPgotICA8cGF0aC1tYXBwZXI+b3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRGVmYXVsdERvY3VtZW50SWRUb1BhdGhNYXBwZXI8L3BhdGgtbWFwcGVyPgotICA8ZG9jdW1lbnQtYnVpbGRlciBuYW1lPSJkZWZhdWx0Ii8+Ci0gIDxicmVhZGNydW1iLXByZWZpeC8+Ci0gIDxzaXRlLW1hbmFnZXIgbmFtZT0idHJlZSIvPgotICAKLSAgPCEtLSBSZXNvdXJjZSB0eXBlcyBuZWVkIHRvIGJlIGxpc3RlZCBiZWNhdXNlIG9mIHRoZSB3b3JrZmxvdyByZXNwLiBiZWNhdXNlIHRoZSB3b3JrZmxvdyBkZXBlbmRzIG9uIHRoZSBwdWJsaWNhdGlvbiBhbmQgbm90IG9uIHRoZSByZXNvdXJjZSB0eXBlIC0tPgotICA8cmVzb3VyY2UtdHlwZXM+Ci0gICAgPHJlc291cmNlLXR5cGUgbmFtZT0ieGh0bWwiIHdvcmtmbG93PSJmYWxsYmFjazovL2NvbmZpZy93b3JrZmxvdy93b3JrZmxvdy54bWwiLz4KLSAgICA8cmVzb3VyY2UtdHlwZSBuYW1lPSJob21lcGFnZSIgd29ya2Zsb3c9ImZhbGxiYWNrOi8vY29uZmlnL3dvcmtmbG93L3dvcmtmbG93LnhtbCIvPgotICAgIDxyZXNvdXJjZS10eXBlIG5hbWU9ImxpbmtzIiB3b3JrZmxvdz0iZmFsbGJhY2s6Ly9jb25maWcvd29ya2Zsb3cvd29ya2Zsb3cueG1sIi8+Ci0gICAgPHJlc291cmNlLXR5cGUgbmFtZT0iY2Zvcm1zIiB3b3JrZmxvdz0iZmFsbGJhY2s6Ly9jb25maWcvd29ya2Zsb3cvd29ya2Zsb3cueG1sIi8+Ci0gICAgPHJlc291cmNlLXR5cGUgbmFtZT0ib3BlbmRvY3VtZW50IiB3b3JrZmxvdz0iZmFsbGJhY2s6Ly9jb25maWcvd29ya2Zsb3cvd29ya2Zsb3cueG1sIi8+Ci0gICAgPHJlc291cmNlLXR5cGUgbmFtZT0icmVzb3VyY2UiIHdvcmtmbG93PSJmYWxsYmFjazovL2NvbmZpZy93b3JrZmxvdy93b3JrZmxvdy54bWwiLz4KLSAgICA8cmVzb3VyY2UtdHlwZSBuYW1lPSJ1c2VjYXNlIiB3b3JrZmxvdz0iZmFsbGJhY2s6Ly9jb25maWcvd29ya2Zsb3cvd29ya2Zsb3cueG1sIi8+Ci0gICAgPHJlc291cmNlLXR5cGUgbmFtZT0ibmV3cyIgd29ya2Zsb3c9ImZhbGxiYWNrOi8vY29uZmlnL3dvcmtmbG93L3dvcmtmbG93LnhtbCIvPgotICA8L3Jlc291cmNlLXR5cGVzPgotICAKLSAgPCEtLSBNb2R1bGVzIG5lZWQgdG8gYmUgbGlzdGVkIGJlY2F1c2Ugb2YgdGhlIG1lbnUgYW5kIGkxOG4gLS0+Ci0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGUgbmFtZT0idXNlY2FzZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iZWRpdG9ycyIvPgotICAgIDxtb2R1bGUgbmFtZT0ieGh0bWwiLz4KLSAgICA8bW9kdWxlIG5hbWU9ImxpbmtzIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJvcGVuZG9jdW1lbnQiLz4KLSAgICA8bW9kdWxlIG5hbWU9ImNmb3JtcyIvPgotICAgIDxtb2R1bGUgbmFtZT0iaG9tZXBhZ2UiLz4KLSAgICA8bW9kdWxlIG5hbWU9InJlc291cmNlIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJzaXRlbWFuYWdlbWVudCIvPgotICAgIDxtb2R1bGUgbmFtZT0ic2l0ZXRyZWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9ImV4cG9ydCIvPgotICAgIDxtb2R1bGUgbmFtZT0id29ya2Zsb3ciLz4KLSAgICA8bW9kdWxlIG5hbWU9Im5vdGlmaWNhdGlvbiIvPgotICAgIDxtb2R1bGUgbmFtZT0ic3ZnIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJsdWNlbmUiLz4KLSAgICA8bW9kdWxlIG5hbWU9ImRldmVsb3BtZW50Ii8+Ci0gICAgPG1vZHVsZSBuYW1lPSJwcm9maWxpbmciLz4KLSAgICA8bW9kdWxlIG5hbWU9Imxhbmd1YWdlc2VsZWN0b3IiLz4KLSAgICA8bW9kdWxlIG5hbWU9ImFkbWluaXN0cmF0aW9uIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJhY3VzZWNhc2VzIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJuZXdzIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJwcmV0dHlwcmludGluZyIvPgotICAgIDxtb2R1bGUgbmFtZT0idXNlY2FzZWRvY3VtZW50Ii8+Ci0gIDwvbW9kdWxlcz4KLSAgPCEtLSBUT0RPOiBUaGUgZ29hbCBpcyB0byBoYXZlIGEgYmxvZyBtb2R1bGUgOy0pIC0tPgotICA8IS0tCi0gIDxtb2R1bGUgbmFtZT0iYmxvZyIvPgotICAtLT4KLQotICA8IS0tIFlvdSBjYW4gc3BlY2lmeSBhIGN1c3RvbSBsb2NhdGlvbiBmb3IgeW91ciBjb250ZW50LCBvdXRzaWRlIHRoZSBMZW55YSBidWlsZCB0cmVlLiBOb3RlIHRoYXQgeW91IHdpbGwgcHJvYmFibHkgYWxzbyB3YW50Ci0gICAgICAgdG8gc3BlY2lmeSBjdXN0b20gbG9jYXRpb25zIGZvciBhY2Nlc3MgY29udHJvbCAoc2VlIGFjY2Vzcy1jb250cm9sL2FjY2Vzcy1jb250cm9sLnhtbCksIHNvIHRoYXQgYWxsIHlvdXIgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGRhdGEgaXMgaW4gb25lIHBsYWNlCi0gICAgICAgZm9yIGVhc3kgYmFja3VwLiAtLT4KLSAgPCEtLQotICAgICAgIFJlbGF0aXZlIHRvIHdlYmFwcCBjb250ZXh0OiAKLSAgICAgICAgICA8Y29udGVudC1kaXIgc3JjPSJsZW55YS9wdWJzL2RlZmF1bHQiLz4KLSAgICAgICBBYnNvbHV0ZToKLSAgICAgICAgICA8Y29udGVudC1kaXIgc3JjPSIvaG9tZS9VU0VSTkFNRS9kYXRhL2RlZmF1bHQiLz4KLSAgICAgICAgICA8Y29udGVudC1kaXIgc3JjPSJEOi90bXAvZGVmYXVsdCIvPgotICAtLT4KLSAgCi0gIDxwcm94aWVzPgotICAgIDwhLS0gCi0gICAgICAgTGVueWEgY2FuIHJld3JpdGUgdGhlIGxpbmtzIHRvIGNhdGVyIHRvIHNwZWNpYWwgcHJveHkgc2V0dXBzLgotICAgICAgIE1ha2Ugc3VyZSB0byB1cGRhdGUgdGhlIEdsb2JhbFByb3hpZXMgY29uZmlndXJhdGlvbiBpbiBjb2Nvb24ueGNvbmYgYXMgd2VsbC4KLSAgICAgICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2Ugc2V0dGluZ3MsIHJlYWQKLSAgICAgICBodHRwOi8vbGVueWEuYXBhY2hlLm9yZy9kb2N1L2RvY3MvMl8wX3gvdHV0b3JpYWxzL3Byb3h5Lmh0bWwKLSAgICAgIAotICAgICAgIFRoaXMgZXhhbXBsZSBzZXR0aW5nIHNpbXVsYXRlcyB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKLSAgICAgICAqIEEgY3VzdG9tZXIgd2FudHMgYSBjb21wYW55IGhvc3RuYW1lIGFuZCBVUkxzIHdpdGhvdXQgTGVueWEtc3BlY2lmaWMKLSAgICAgICAgIHBhdGggY29tcG9uZW50cyBmb3IgaGlzIGxpdmUgc2l0ZS4KLSAgICAgICAqIFRoZSBzZXJ2ZXIgdXNlcyBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdGluZyB3aXRoIGp1c3Qgb25lIElQLCBpLmUuCi0gICAgICAgICB0aGVyZSBjYW4gb25seSBiZSBvbmUgU1NMIHZob3N0LCB3aGljaCBpcyBzaGFyZWQgYW1vbmcgc2V2ZXJhbAotICAgICAgICAgY3VzdG9tZXJzLiBUaGlzIGltcGxpZXMgdGhlIG5lZWQgZm9yIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUgcHJveHkKLSAgICAgICAgIFVSTC4KLSAgICAgICAqICJhdXRob3JpbmciIHNob3VsZCBiZSBzc2wtcHJvdGVjdGVkLiBUaGVyZSBpcyBubyBuZWVkIGZvciBhCi0gICAgICAgICBjdXN0b21lciBob3N0bmFtZSBoZXJlLCBzaW5jZSBpdCdzIG5vdCBwdWJsaWNseSB2aXNpYmxlLgotICAgICAgICogQW55IFNTTC1wcm90ZWN0ZWQgZG9jdW1lbnRzIGluICJsaXZlIiBjYW4gYmUgaGFuZGxlZCBieSB0aGUgU1NMCi0gICAgICAgICB2aG9zdCAobm90IHVzaW5nIHRoZSBjb21wYW55IGhvc3RuYW1lIGlzIG9rIGluIHRoaXMgY2FzZSwgYmVjYXVzZQotICAgICAgICAgdGhlIGN1c3RvbWVyIGRvZXMgbm90IHdhbnQgdG8gcGF5IGZvciBhbiBhZGRpdGlvbmFsIElQIGFkZHJlc3MpLgotICAgICAgICAgCi0gICAgICAgVGhlIGRlc2lyZWQgY3VzdG9tZXIgaG9zdG5hbWUgaXMgY3VzdG9tZXIuZXhhbXBsZS5jb20uCi0gICAgICAgVGhlIFNTTCB2aG9zdCBpcyBjYWxsZWQgaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20uCi0gICAgICAgVGhlIExlbnlhIENNUyBmb3Igb3VyIGN1c3RvbWVyIGlzIHJlYWNoYWJsZSBhcwotICAgICAgIGh0dHBbc106Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvYXV0aG9yaW5nLgotICAgICAgIFRoZSBnbG9iYWwgcHJveHkgZm9yIG5vbi1wdWJsaWNhdGlvbi1zcGVjaWZpYyByZXNvdXJjZXMgc2hhbGwgYmUKLSAgICAgICBodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhLgotICAgICAtLT4KLTwhLS0KLSAgICA8cHJveHkgYXJlYT0ibGl2ZSIgc3NsPSJ0cnVlIiB1cmw9Imh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhL2N1c3RvbWVyL2xpdmUiLz4KLSAgICA8cHJveHkgYXJlYT0ibGl2ZSIgc3NsPSJmYWxzZSIgdXJsPSJodHRwOi8vY3VzdG9tZXIuZXhhbXBsZS5jb20iLz4KLSAgICA8cHJveHkgYXJlYT0iYXV0aG9yaW5nIiBzc2w9InRydWUiIHVybD0iaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvYXV0aG9yaW5nIi8+Ci0gICAgPHByb3h5IGFyZWE9ImF1dGhvcmluZyIgc3NsPSJmYWxzZSIgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhL2N1c3RvbWVyL2F1dGhvcmluZyIvPgotICAgIDxwcm94eSBhcmVhPSJhcmNoaXZlIiBzc2w9InRydWUiIHVybD0iaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvYXJjaGl2ZSIvPgotICAgIDxwcm94eSBhcmVhPSJhcmNoaXZlIiBzc2w9ImZhbHNlIiB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvYXJjaGl2ZSIvPgotICAgIDxwcm94eSBhcmVhPSJ0cmFzaCIgc3NsPSJ0cnVlIiB1cmw9Imh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhL2N1c3RvbWVyL3RyYXNoIi8+Ci0gICAgPHByb3h5IGFyZWE9InRyYXNoIiBzc2w9ImZhbHNlIiB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvdHJhc2giLz4KLS0tPgotICA8L3Byb3hpZXM+Ci0gIAotPC9wdWJsaWNhdGlvbj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvY29uZmlnL3NlYXJjaC9sdWNlbmVfaW5kZXgueG1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvc2VhcmNoL2x1Y2VuZV9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDNkYmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvc2VhcmNoL2x1Y2VuZV9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGluZGV4ZXM+Ci0gIDxpbmRleCBpZD0iZGVmYXVsdC1saXZlIiBhbmFseXplcj0ic3RvcHdvcmRfZW4iIGRpcmVjdG9yeT0ibGVueWEvcHVicy9kZWZhdWx0L3dvcmsvbHVjZW5lL2luZGV4L2xpdmUvaW5kZXgiPgotICAgIDxzdHJ1Y3R1cmU+Ci0gICAgICA8ZmllbGQgaWQ9InVybCIgdHlwZT0ia2V5d29yZCIgLz4KLSAgICAgIDxmaWVsZCBpZD0idGl0bGUiIHR5cGU9InRleHQiIHN0b3JldGV4dD0idHJ1ZSIvPgotICAgICAgPGZpZWxkIGlkPSJkZXNjcmlwdGlvbiIgdHlwZT0idGV4dCIgc3RvcmV0ZXh0PSJ0cnVlIi8+Ci0gICAgICA8ZmllbGQgaWQ9InN1YmplY3QiIHR5cGU9ImtleXdvcmQiIHN0b3JldGV4dD0idHJ1ZSIgLz4KLSAgICAgIDxmaWVsZCBpZD0iYm9keSIgdHlwZT0idGV4dCIgc3RvcmV0ZXh0PSJ0cnVlIi8+Ci0gICAgPC9zdHJ1Y3R1cmU+Ci0gIDwvaW5kZXg+Ci0gIDxpbmRleCBpZD0iZGVmYXVsdC1hdXRob3JpbmciIGFuYWx5emVyPSJzdG9wd29yZF9lbiIgZGlyZWN0b3J5PSJsZW55YS9wdWJzL2RlZmF1bHQvd29yay9sdWNlbmUvaW5kZXgvYXV0aG9yaW5nL2luZGV4Ij4KLSAgICA8c3RydWN0dXJlPgotICAgICAgPGZpZWxkIGlkPSJ1cmwiIHR5cGU9ImtleXdvcmQiIC8+Ci0gICAgICA8ZmllbGQgaWQ9InRpdGxlIiB0eXBlPSJ0ZXh0IiBzdG9yZXRleHQ9InRydWUiLz4KLSAgICAgIDxmaWVsZCBpZD0iZGVzY3JpcHRpb24iIHR5cGU9InRleHQiIHN0b3JldGV4dD0idHJ1ZSIvPgotICAgICAgPGZpZWxkIGlkPSJzdWJqZWN0IiB0eXBlPSJrZXl3b3JkIiBzdG9yZXRleHQ9InRydWUiIC8+Ci0gICAgICA8ZmllbGQgaWQ9ImJvZHkiIHR5cGU9InRleHQiIHN0b3JldGV4dD0idHJ1ZSIvPgotICAgIDwvc3RydWN0dXJlPgotICA8L2luZGV4PgotICA8aW5kZXggaWQ9ImRlZmF1bHQtdHJhc2giIGFuYWx5emVyPSJzdG9wd29yZF9lbiIgZGlyZWN0b3J5PSJsZW55YS9wdWJzL2RlZmF1bHQvd29yay9sdWNlbmUvaW5kZXgvdHJhc2gvaW5kZXgiPgotICAgIDxzdHJ1Y3R1cmU+Ci0gICAgICA8ZmllbGQgaWQ9InVybCIgdHlwZT0ia2V5d29yZCIgLz4KLSAgICAgIDxmaWVsZCBpZD0idGl0bGUiIHR5cGU9InRleHQiIHN0b3JldGV4dD0idHJ1ZSIvPgotICAgICAgPGZpZWxkIGlkPSJkZXNjcmlwdGlvbiIgdHlwZT0idGV4dCIgc3RvcmV0ZXh0PSJ0cnVlIi8+Ci0gICAgICA8ZmllbGQgaWQ9InN1YmplY3QiIHR5cGU9ImtleXdvcmQiIHN0b3JldGV4dD0idHJ1ZSIgLz4KLSAgICAgIDxmaWVsZCBpZD0iYm9keSIgdHlwZT0idGV4dCIgc3RvcmV0ZXh0PSJ0cnVlIi8+Ci0gICAgPC9zdHJ1Y3R1cmU+Ci0gIDwvaW5kZXg+Ci0gIDxpbmRleCBpZD0iZGVmYXVsdC1hcmNoaXZlIiBhbmFseXplcj0ic3RvcHdvcmRfZW4iIGRpcmVjdG9yeT0ibGVueWEvcHVicy9kZWZhdWx0L3dvcmsvbHVjZW5lL2luZGV4L2FyY2hpdmUvaW5kZXgiPgotICAgIDxzdHJ1Y3R1cmU+Ci0gICAgICA8ZmllbGQgaWQ9InVybCIgdHlwZT0ia2V5d29yZCIgLz4KLSAgICAgIDxmaWVsZCBpZD0idGl0bGUiIHR5cGU9InRleHQiIHN0b3JldGV4dD0idHJ1ZSIvPgotICAgICAgPGZpZWxkIGlkPSJkZXNjcmlwdGlvbiIgdHlwZT0idGV4dCIgc3RvcmV0ZXh0PSJ0cnVlIi8+Ci0gICAgICA8ZmllbGQgaWQ9InN1YmplY3QiIHR5cGU9ImtleXdvcmQiIHN0b3JldGV4dD0idHJ1ZSIgLz4KLSAgICAgIDxmaWVsZCBpZD0iYm9keSIgdHlwZT0idGV4dCIgc3RvcmV0ZXh0PSJ0cnVlIi8+Ci0gICAgPC9zdHJ1Y3R1cmU+Ci0gIDwvaW5kZXg+Ci08L2luZGV4ZXM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy93b3JrZmxvdy93b3JrZmxvdy54bWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2NvbmZpZy93b3JrZmxvdy93b3JrZmxvdy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNTIwZDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9jb25maWcvd29ya2Zsb3cvd29ya2Zsb3cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHdvcmtmbG93IHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvd29ya2Zsb3cvMS4wIj4KLQotICA8c3RhdGUgaWQ9ImF1dGhvcmluZyIgaW5pdGlhbD0idHJ1ZSIvPgotICA8c3RhdGUgaWQ9InJldmlldyIvPgotICA8c3RhdGUgaWQ9ImxpdmUiLz4KLSAgPHN0YXRlIGlkPSJ0cmFzaCIvPgotICA8c3RhdGUgaWQ9ImFyY2hpdmUiLz4KLSAgCi0gIDx2YXJpYWJsZSBuYW1lPSJpc19saXZlIiB2YWx1ZT0iZmFsc2UiLz4KLSAgCi0gIDx0cmFuc2l0aW9uIHNvdXJjZT0iYXV0aG9yaW5nIiBkZXN0aW5hdGlvbj0icmV2aWV3Ij4KLSAgICA8ZXZlbnQgaWQ9InN1Ym1pdCIvPgotICAgIDxjb25kaXRpb24gY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLndvcmtmbG93LlJvbGVDb25kaXRpb24iPmVkaXQ8L2NvbmRpdGlvbj4KLSAgPC90cmFuc2l0aW9uPgotICAgICAgICAKLSAgPHRyYW5zaXRpb24gc291cmNlPSJyZXZpZXciIGRlc3RpbmF0aW9uPSJsaXZlIj4KLSAgICA8ZXZlbnQgaWQ9InB1Ymxpc2giLz4KLSAgICA8Y29uZGl0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Sb2xlQ29uZGl0aW9uIj5yZXZpZXc8L2NvbmRpdGlvbj4KLSAgICA8YXNzaWduIHZhcmlhYmxlPSJpc19saXZlIiB2YWx1ZT0idHJ1ZSIvPgotICA8L3RyYW5zaXRpb24+Ci0gICAgICAgIAotICA8dHJhbnNpdGlvbiBzb3VyY2U9InJldmlldyIgZGVzdGluYXRpb249ImF1dGhvcmluZyI+Ci0gICAgPGV2ZW50IGlkPSJyZWplY3QiLz4KLSAgICA8Y29uZGl0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Sb2xlQ29uZGl0aW9uIj5yZXZpZXc8L2NvbmRpdGlvbj4KLSAgPC90cmFuc2l0aW9uPgotICAgICAgICAKLSAgPHRyYW5zaXRpb24gc291cmNlPSJsaXZlIiBkZXN0aW5hdGlvbj0iYXV0aG9yaW5nIj4KLSAgICA8ZXZlbnQgaWQ9ImVkaXQiLz4KLSAgICA8Y29uZGl0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Sb2xlQ29uZGl0aW9uIj5lZGl0PC9jb25kaXRpb24+Ci0gIDwvdHJhbnNpdGlvbj4KLSAgICAgICAgCi0gIDx0cmFuc2l0aW9uIHNvdXJjZT0iYXV0aG9yaW5nIiBkZXN0aW5hdGlvbj0iYXV0aG9yaW5nIj4KLSAgICA8ZXZlbnQgaWQ9ImVkaXQiLz4KLSAgICA8Y29uZGl0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Sb2xlQ29uZGl0aW9uIj5lZGl0PC9jb25kaXRpb24+Ci0gIDwvdHJhbnNpdGlvbj4KLSAgICAgICAgCi0gIDx0cmFuc2l0aW9uIHNvdXJjZT0ibGl2ZSIgZGVzdGluYXRpb249ImF1dGhvcmluZyI+Ci0gICAgPGV2ZW50IGlkPSJkZWFjdGl2YXRlIi8+Ci0gICAgPGNvbmRpdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuUm9sZUNvbmRpdGlvbiI+cmV2aWV3PC9jb25kaXRpb24+Ci0gICAgPGFzc2lnbiB2YXJpYWJsZT0iaXNfbGl2ZSIgdmFsdWU9ImZhbHNlIi8+Ci0gIDwvdHJhbnNpdGlvbj4KLQotICA8dHJhbnNpdGlvbiBzb3VyY2U9InJldmlldyIgZGVzdGluYXRpb249ImF1dGhvcmluZyI+Ci0gICAgPGV2ZW50IGlkPSJkZWFjdGl2YXRlIi8+Ci0gICAgPGNvbmRpdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS53b3JrZmxvdy5pbXBsLkJvb2xlYW5WYXJpYWJsZUNvbmRpdGlvbiI+aXNfbGl2ZSA9IHRydWU8L2NvbmRpdGlvbj4KLSAgICA8Y29uZGl0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Sb2xlQ29uZGl0aW9uIj5yZXZpZXc8L2NvbmRpdGlvbj4KLSAgICA8YXNzaWduIHZhcmlhYmxlPSJpc19saXZlIiB2YWx1ZT0iZmFsc2UiLz4KLSAgPC90cmFuc2l0aW9uPgotICAKLSAgPHRyYW5zaXRpb24gc291cmNlPSJhdXRob3JpbmciIGRlc3RpbmF0aW9uPSJhdXRob3JpbmciPgotICAgIDxldmVudCBpZD0iZGVhY3RpdmF0ZSIvPgotICAgIDxjb25kaXRpb24gY2xhc3M9Im9yZy5hcGFjaGUubGVueWEud29ya2Zsb3cuaW1wbC5Cb29sZWFuVmFyaWFibGVDb25kaXRpb24iPmlzX2xpdmUgPSB0cnVlPC9jb25kaXRpb24+Ci0gICAgPGNvbmRpdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuUm9sZUNvbmRpdGlvbiI+cmV2aWV3PC9jb25kaXRpb24+Ci0gICAgPGFzc2lnbiB2YXJpYWJsZT0iaXNfbGl2ZSIgdmFsdWU9ImZhbHNlIi8+Ci0gIDwvdHJhbnNpdGlvbj4KLSAgCi0gIDx0cmFuc2l0aW9uIHNvdXJjZT0iYXV0aG9yaW5nIiBkZXN0aW5hdGlvbj0idHJhc2giPgotICAgIDxldmVudCBpZD0iZGVsZXRlIi8+Ci0gICAgPGNvbmRpdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuUm9sZUNvbmRpdGlvbiI+ZWRpdDwvY29uZGl0aW9uPgotICAgIDxhc3NpZ24gdmFyaWFibGU9ImlzX2xpdmUiIHZhbHVlPSJmYWxzZSIvPgotICA8L3RyYW5zaXRpb24+Ci0KLSAgPHRyYW5zaXRpb24gc291cmNlPSJhdXRob3JpbmciIGRlc3RpbmF0aW9uPSJhcmNoaXZlIj4KLSAgICA8ZXZlbnQgaWQ9ImFyY2hpdmUiLz4KLSAgICA8Y29uZGl0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Sb2xlQ29uZGl0aW9uIj5lZGl0PC9jb25kaXRpb24+Ci0gICAgPGFzc2lnbiB2YXJpYWJsZT0iaXNfbGl2ZSIgdmFsdWU9ImZhbHNlIi8+Ci0gIDwvdHJhbnNpdGlvbj4KLSAgCi0gIDx0cmFuc2l0aW9uIHNvdXJjZT0iYXJjaGl2ZSIgZGVzdGluYXRpb249ImF1dGhvcmluZyI+Ci0gICAgPGV2ZW50IGlkPSJyZXN0b3JlIi8+Ci0gICAgPGNvbmRpdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuUm9sZUNvbmRpdGlvbiI+ZWRpdDwvY29uZGl0aW9uPgotICA8L3RyYW5zaXRpb24+Ci0KLSAgPHRyYW5zaXRpb24gc291cmNlPSJhcmNoaXZlIiBkZXN0aW5hdGlvbj0idHJhc2giPgotICAgIDxldmVudCBpZD0iZGVsZXRlIi8+Ci0gICAgPGNvbmRpdGlvbiBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMud29ya2Zsb3cuUm9sZUNvbmRpdGlvbiI+ZWRpdDwvY29uZGl0aW9uPgotICA8L3RyYW5zaXRpb24+Ci0gIAotICA8dHJhbnNpdGlvbiBzb3VyY2U9InRyYXNoIiBkZXN0aW5hdGlvbj0iYXV0aG9yaW5nIj4KLSAgICA8ZXZlbnQgaWQ9InJlc3RvcmUiLz4KLSAgICA8Y29uZGl0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy53b3JrZmxvdy5Sb2xlQ29uZGl0aW9uIj5lZGl0PC9jb25kaXRpb24+Ci0gIDwvdHJhbnNpdGlvbj4gIAotPC93b3JrZmxvdz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXJyb3IueG1hcCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXJyb3IueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0Yjk4Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2Vycm9yLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKi8qKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ibm90aWZ5aW5nIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L2V4Y2VwdGlvbi9nZW5lcmljLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icm9vdCIgdmFsdWU9Ii97MX0vezJ9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibGFuZ3VhZ2UiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpsYW5ndWFnZX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJwcm94eSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhodG1sIiBzdGF0dXMtY29kZT0iNTAwIiAvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gIDwvbWFwOnBpcGVsaW5lcz4KLSAgCi08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvY29uY2VwdHMvaW5kZXhfZGUgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9jb25jZXB0cy9pbmRleF9kZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmMzdmOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9jb25jZXB0cy9pbmRleF9kZQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPktvbnplcHRlPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+S29uemVwdGU8L2gxPgotICAgIAotICAgIDxoMj5QdWJsaWthdGlvbmVuPC9oMj4KLSAgICAKLSAgICA8cD4KLSAgICAgIEVpbmUgV2Vic2l0ZSB3aXJkIGluIEFwYWNoZSBMZW55YSBhbHMgPGVtPlB1Ymxpa2F0aW9uPC9lbT4gYmV6ZWljaG5ldC4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGgyPkFyZWFzOiBBdXRob3JpbmcsIExpdmUsIC4uLjwvaDI+Ci0gICAgCi0gICAgPHA+Ci0gICAgICBMZW55YSB1bnRlcnNjaGVpZGV0IHp3aXNjaGVuIHZlcnNjaGllZGVuZW4gPGVtPkFyZWFzPC9lbT4sIGluIGRlbmVuCi0gICAgICBzaWNoIERva3VtZW50ZSBiZWZpbmRlbiBrw7ZubmVuOgotICAgIDwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIERpZSBBdXRob3JpbmctQXJlYSBkaWVudCBkYXp1LCBEb2t1bWVudGUgenUgZXJzdGVsbGVuIHVuZCB6dSBlZGl0aWVyZW4uCi0gICAgICAgIEhpZXIgc2luZCBhbGxlIENNUy1GdW5rdGlvbmVuIHZlcmbDvGdiYXIuCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICBTb2JhbGQgZWluIERva3VtZW50IHB1YmxpemllcnQgaXN0LCB3aXJkIGVzIGluIGRpZSBMaXZlLUFyZWEga29waWVydC4KLSAgICAgICAgRGllIExpdmUtQXJlYSBrYW5uIGRpcmVrdCBkdXJjaCBlaW5lbiBXZWItU2VydmVyIHZlcsO2ZmZlbnRsaWNodCB3ZXJkZW4sCi0gICAgICAgIG9kZXIgU2llIGvDtm5uZW4gaW4gZWluZW0gd2VpdGVyZW4gWndpc2NoZW5zY2hyaXR0IGRpZSBJbmhhbHRlIHZvbgotICAgICAgICBkZXIgTGl2ZS1BcmVhIHp1bSBlaWdlbnRsaWNoZW4gV2ViLVNlcnZlciByZXBsaXppZXJlbi4gSW4gZGllc2VtIEZhbGwgZGllbnQKLSAgICAgICAgZGllIExpdmUtQXJlYSBhbHMgVm9yc2NoYXUgYXVmIGRlbiBJbmhhbHQsIGRlciB2b20gZWlnZW50bGljaGVuIFdlYnNlcnZlcgotICAgICAgICB2ZXLDtmZmZW50bGljaHQgd2lyZC4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIFdlaXRlcmUgU3RhbmRhcmQtQXJlYXMgc2luZCBUcmFzaCB1bmQgQXJjaGl2ZS4gQmVpIEJlZGFyZiBrw7ZubmVuIHp1c8OkdHpsaWNoZQotICAgICAgICBBcmVhcyBkZWZpbmllcnQgd2VyZGVuLgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICAgIAotICAgIDxoMj5SZXNzb3VyY2UtVHlwZW48L2gyPgotICAgIAotICAgIDxwPgotICAgICAgRGEgQXBhY2hlIExlbnlhIGF1ZiBDb2Nvb24gYmFzaWVydCwgdmVyZsO8Z3QgZXMgw7xiZXIgZWluIG3DpGNodGlnZXMKLSAgICAgIFhNTC0gdW5kIFhTTFQtRnVuZGFtZW50LiBEb2t1bWVudGUga8O2bm5lbiBhdWYgaWhyZSBLb25mb3JtaXTDpHQgenUKLSAgICAgIGVpbmVtIFhTRC0gb2RlciBSZWxheC1ORy1TY2hlbWEgw7xiZXJwcsO8ZnQgd2VyZGVuLiBUeXBpc2NoZXJ3ZWlzZQotICAgICAgd2VyZGVuIHZlcnNjaGllZGVuZSBUeXBlbiB2b24gRG9rdW1lbnRlbiBkZWZpbmllcnQgKHouQi4gQXJ0aWtlbCwKLSAgICAgIERvc3NpZXJzLCAuLi4pLCBkZXJlbiBYTUwtU3RydWt0dXIgZHVyY2ggdW50ZXJzY2hpZWRsaWNoZW4gU2NoZW1hdGEKLSAgICAgIHNwZXppZml6aWVydCB3ZXJkZW4uIEJlaW0gRWRpdGllcmVuIHdpcmQgZGllIEtvbmZvcm1pdMOkdCB6dW0gWE1MLVNjaGVtYQotICAgICAgw7xiZXJwcsO8ZnQuIEJlaSBkZXIgQXVmYmVyZWl0dW5nIGVpbmVzIERva3VtZW50ZXMgenVyIERhcnN0ZWxsdW5nCi0gICAgICBrw7ZubmVuIHZlcnNjaGllZGVuZSBYTUwtU3RydWt0dXJlbiBkdXJjaCBYU0xULVN0eWxlc2hlZXRzIGF1ZgotICAgICAgdW50ZXJzY2hpZWRsaWNoZSBXZWlzZSBpbiB2ZXJzY2hpZWRlbmUgTGF5b3V0cyB0cmFuc2Zvcm1pZXJ0IHdlcmRlbi4KLSAgICA8L3A+Ci0KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvY29uY2VwdHMvaW5kZXhfZGUubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2NvbmNlcHRzL2luZGV4X2RlLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2Y5NDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvY29uY2VwdHMvaW5kZXhfZGUubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+eGh0bWw8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veGh0bWwreG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIEtvbnplcHRlIGt1cnogZXJrbMOkcnQ8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci0gICAgICAgIDxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgS29uemVwdGU8L2RjOnN1YmplY3Q+Ci0gICAgICAgIDxkYzpkZXNjcmlwdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkVya2zDpHJ0IExlbnlhIEtvbnplcHRlLjwvZGM6ZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkYzpwdWJsaXNoZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvZGM6cHVibGlzaGVyPgotICAgICAgICA8ZGM6Y29udHJpYnV0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiAvPgotICAgICAgICA8ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDUtMDEtMzE8L2RjOmRhdGU+Ci0gICAgICAgIDxkYzp0eXBlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOmZvcm1hdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzppZGVudGlmaWVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOnNvdXJjZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmRlPC9kYzpsYW5ndWFnZT4KLSAgICAgICAgPGRjOnJlbGF0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOmNvdmVyYWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFsbGUgUmVjaHRlIHZvcmJlaGFsdGVuPC9kYzpyaWdodHM+Ci08L2xlbnlhOmRjPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2NvbmNlcHRzL2luZGV4X2VuIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvY29uY2VwdHMvaW5kZXhfZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkN2QyMmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvY29uY2VwdHMvaW5kZXhfZW4KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPkNvbmNlcHRzPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+Q29uY2VwdHM8L2gxPgotICAgIAotICAgIDxoMj5QdWJsaWNhdGlvbnM8L2gyPgotICAgIAotICAgIDxwPkluIEFwYWNoZSBMZW55YSwgYSB3ZWJzaXRlIGlzIGNhbGxlZCBhCi0gICAgPHN0cm9uZz5wdWJsaWNhdGlvbjwvc3Ryb25nPi48L3A+Ci0gICAgCi0gICAgPGgyPkFyZWFzOiBBdXRob3JpbmcsIExpdmUsIC4uLjwvaDI+Ci0KLSAgICA8cD5BcGFjaGUgTGVueWEgc2VwYXJhdGVzIGJldHdlZW4gZGlmZmVyZW50IGFyZWFzOjwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+VGhlIGF1dGhvcmluZyBhcmVhIGlzIGZvciBjcmVhdGluZyBhbmQgZWRpdGluZyBvZgotICAgICAgY29udGVudC4gQWxsIENNUyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBoZXJlLjwvbGk+Ci0KLSAgICAgIDxsaT5PbmNlIHRoZSBjb250ZW50IGhhcyBiZWVuIHB1Ymxpc2hlZCBpdCBpcyBtb3ZlZCB0byB0aGUgbGl2ZQotICAgICAgYXJlYS4gVGhlIGxpdmUgYXJlYSBjYW4gYmUgc2VydmVkIGJ5IGEgd2ViIHNlcnZlciBkaXJlY3RseSBvcgotICAgICAgeW91IGNhbiBhZGQgYW5vdGhlciBpbnRlcm1lZGlhdGUgc3RlcCB3aGVyZSB0aGUgY29udGVudCBpcwotICAgICAgcmVwbGljYXRlZCBmcm9tIHRoZSBsaXZlIGFyZWEgdG8gdGhlIGFjdHVhbCB3ZWIgc2VydmVyLiBJbiBhbnkKLSAgICAgIGNhc2UgdGhlIGxpdmUgYXJlYSBzaW1wbHkgc2VydmVzIGFzIGEgcHJldmlldyB0byB0aGUgY29udGVudAotICAgICAgdGhhdCB3aWxsIGJlIHNlcnZlZCBieSB0aGUgd2ViIHNlcnZlci48L2xpPgotICAgICAgPGxpPgotICAgICAgICBPdGhlciBzdGFuZGFyZCBhcmVhcyBhcmUgYW5kIGFyY2hpdmUuIElmIG5lY2Vzc2FyeSwgZnVydGhlcgotICAgICAgICBhcmVhcyBjYW4gYmUgZGVjbGFyZWQuCi0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gICAgCi0gICAgPGgyPlJlc291cmNlIFR5cGVzPC9oMj4KLQotICAgIDxwPkFzIEFwYWNoZSBMZW55YSBpcyBiYXNlZCBvbiBBcGFjaGUgQ29jb29uLCBpdCBoYXMgc3Ryb25nIFhNTCBhbmQKLSAgICBYU0xUIGZvdW5kYXRpb25zLiBJdCBpcyBwb3NzaWJsZSB0byBlbnN1cmUgdGhhdCBhIGRvY3VtZW50Ci0gICAgY29uZm9ybXMgdG8gYW4gWE1MIHNjaGVtYS4gVHlwaWNhbGx5IHlvdSBkZWZpbmUgZGlmZmVyZW50IHR5cGVzIG9mCi0gICAgZG9jdW1lbnRzLCBsaWtlIGFuIG5ld3MgYXJ0aWNsZSBvciBhbiBvcGluaW9uIHBpZWNlLCBjb25mb3JtaW5nIHRvCi0gICAgZGlmZmVyZW50IFhNTCBzY2hlbWFzLiBUaGVzZSBkaWZmZXJlbnQgdHlwZXMgYXJlIHJlZmVycmVkIHRvIGFzCi0gICAgZG9jdW1lbnQgdHlwZXMuIFRoZXkgYXJlIHVzZWQgdG8gZW5zdXJlIHRoZSBYTUwgc2NoZW1hIGNvbmZvcm1hbmNlCi0gICAgd2hlbiBlZGl0aW5nIGFuZCB0eXBpY2FsbHkgYWxzbyB3aGVuIHByZXBhcmluZyBhIHByZXNlbnRhdGlvbiBvZgotICAgIHRoZSBkb2N1bWVudCwgd2hlcmUgYW4gb3BpbmlvbiBwaWVjZSBoYXMgYSBkaWZmZXJlbnQgbGF5b3V0IHRoYW4gYQotICAgIG5ld3MgYXJ0aWNsZS48L3A+Ci0KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvY29uY2VwdHMvaW5kZXhfZW4ubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2NvbmNlcHRzL2luZGV4X2VuLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmY3Y2Y1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2NvbmNlcHRzL2luZGV4X2VuLm1ldGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPGxlbnlhOmRvY3VtZW50IHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotPGxlbnlhOm1ldGE+Ci08bGVueWE6aW50ZXJuYWw+Ci08bGVueWE6cmVzb3VyY2VUeXBlPnhodG1sPC9sZW55YTpyZXNvdXJjZVR5cGU+Ci08bGVueWE6Y29udGVudFR5cGU+eG1sPC9sZW55YTpjb250ZW50VHlwZT4KLSAgPGxlbnlhOm1pbWVUeXBlPmFwcGxpY2F0aW9uL3hodG1sK3htbDwvbGVueWE6bWltZVR5cGU+Ci08L2xlbnlhOmludGVybmFsPgotPGxlbnlhOmRjPgotICAgICAgICA8ZGM6dGl0bGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBDb25jZXB0cyBxdWlja2x5IGV4cGxhaW5lZDwvZGM6dGl0bGU+Ci0gICAgICAgIDxkYzpjcmVhdG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgRGV2ZWxvcG1lbnQgVGVhbTwvZGM6Y3JlYXRvcj4KLSAgICAgICAgPGRjOnN1YmplY3QgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBDb25jZXB0czwvZGM6c3ViamVjdD4KLSAgICAgICAgPGRjOmRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+RXhwbGFpbnMgTGVueWEgY29uY2VwdHM8L2RjOmRlc2NyaXB0aW9uPgotICAgICAgICA8ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2RjOnB1Ymxpc2hlcj4KLSAgICAgICAgPGRjOmNvbnRyaWJ1dG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA1LTAxLTMxPC9kYzpkYXRlPgotICAgICAgICA8ZGM6dHlwZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpmb3JtYXQgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiAvPgotICAgICAgICA8ZGM6aWRlbnRpZmllciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpzb3VyY2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiAvPgotICAgICAgICA8ZGM6bGFuZ3VhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5lbjwvZGM6bGFuZ3VhZ2U+Ci0gICAgICAgIDxkYzpyZWxhdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpjb3ZlcmFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BbGwgcmlnaHRzIHJlc2VydmVkPC9kYzpyaWdodHM+Ci08L2xlbnlhOmRjPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2Nmb3Jtcy9pbmRleF9kZSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2Nmb3Jtcy9pbmRleF9kZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZGM1OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9jZm9ybXMvaW5kZXhfZGUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZGF0YT4KLSAgPGNvbnRhY3RzPgotICA8L2NvbnRhY3RzPgotPC9kYXRhPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvY2Zvcm1zL2luZGV4X2RlLm1ldGEgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9jZm9ybXMvaW5kZXhfZGUubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkYTlhYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9jZm9ybXMvaW5kZXhfZGUubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTpkYz4KLTxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkNGb3Jtcy1SZXNzb3VyY2UtVHlwPC9kYzp0aXRsZT4KLTxkYzpjcmVhdG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+bGVueWE8L2RjOmNyZWF0b3I+Ci08ZGM6c3ViamVjdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLTxkYzpwdWJsaXNoZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci08ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDUtMTAtMTMgMTE6MTk6MzA8L2RjOmRhdGU+Ci08ZGM6bGFuZ3VhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5kZTwvZGM6bGFuZ3VhZ2U+Ci08ZGM6cmlnaHRzIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotPC9sZW55YTpkYz4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+Y2Zvcm1zPC9sZW55YTpyZXNvdXJjZVR5cGU+Ci08bGVueWE6Y29udGVudFR5cGU+eG1sPC9sZW55YTpjb250ZW50VHlwZT4KLSAgPGxlbnlhOm1pbWVUeXBlPmFwcGxpY2F0aW9uL3htbDwvbGVueWE6bWltZVR5cGU+Ci08L2xlbnlhOmludGVybmFsPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2Nmb3Jtcy9pbmRleF9lbiBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2Nmb3Jtcy9pbmRleF9lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZGM1OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9jZm9ybXMvaW5kZXhfZW4KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZGF0YT4KLSAgPGNvbnRhY3RzPgotICA8L2NvbnRhY3RzPgotPC9kYXRhPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvY2Zvcm1zL2luZGV4X2VuLm1ldGEgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9jZm9ybXMvaW5kZXhfZW4ubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxODc4Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9jZm9ybXMvaW5kZXhfZW4ubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTpkYz4KLTxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkNGb3JtcyBSZXNvdXJjZSBUeXBlPC9kYzp0aXRsZT4KLTxkYzpjcmVhdG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+bGVueWE8L2RjOmNyZWF0b3I+Ci08ZGM6c3ViamVjdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLTxkYzpwdWJsaXNoZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci08ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDUtMTAtMTMgMTE6MTk6MzA8L2RjOmRhdGU+Ci08ZGM6bGFuZ3VhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5lbjwvZGM6bGFuZ3VhZ2U+Ci08ZGM6cmlnaHRzIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotPC9sZW55YTpkYz4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+Y2Zvcm1zPC9sZW55YTpyZXNvdXJjZVR5cGU+Ci08bGVueWE6Y29udGVudFR5cGU+eG1sPC9sZW55YTpjb250ZW50VHlwZT4KLSAgPGxlbnlhOm1pbWVUeXBlPmFwcGxpY2F0aW9uL3htbDwvbGVueWE6bWltZVR5cGU+Ci08L2xlbnlhOmludGVybmFsPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2luZGV4X2RlIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvaW5kZXhfZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YThiMzIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvaW5kZXhfZGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci0KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotICA8aGVhZD4KLSAgICA8dGl0bGU+QmVpc3BpZWxlIGbDvHIgUmVzc291cmNlLVR5cGVuPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+QmVpc3BpZWxlIGbDvHIgUmVzc291cmNlLVR5cGVuPC9oMT4KLQotICAgIDxwPgotICAgICAgRGllIERlZmF1bHQtUHVibGlrYXRpb24gdW1mYXNzdCBkZW4gPGEgaHJlZj0iL2RlZmF1bHQvYXV0aG9yaW5nL2RvY3R5cGVzL3hodG1sLWRvY3VtZW50X2RlLmh0bWwiPlhIVE1MLVJlc3NvdXJjZS1UeXA8L2E+LAotICAgICAgZGVuIDxhIGhyZWY9Ii9kZWZhdWx0L2F1dGhvcmluZy9kb2N0eXBlcy9saW5rcy5odG1sIj5MaW5rcy1SZXNzb3VyY2UtVHlwPC9hPiwKLWRlbiA8YSBocmVmPSIvZGVmYXVsdC9hdXRob3JpbmcvZG9jdHlwZXMvb3BlbmRvY3VtZW50X2RlLmh0bWwiPk9wZW5Eb2N1bWVudC1SZXNzb3VyY2UtVHlwPC9hPiB1bmQKLWRlbiA8YSBocmVmPSIvZGVmYXVsdC9hdXRob3JpbmcvZG9jdHlwZXMvY2Zvcm1zLmh0bWwiPkNGb3Jtcy1SZXNzb3VyY2UtVHlwPC9hPi4KLSAgICA8L3A+Ci0gICAgCi0gICAgPHA+Ci0gICAgRGVyIDxzdHJvbmc+WEhUTUwtUmVzc291cmNlLVR5cDwvc3Ryb25nPiBlbXBmaWVobHQgc2ljaCBpbnNiZXNvbmRlcmUgZGFubiwgd2VubiBkZW0gTnV0emVyIHZvbGxzdMOkbmRpZ2UKLSAgICBGcmVpaGVpdCBpbiBCZXp1ZyBhdWYgZGllIGVpbnp1ZsO8Z2VuZGVuIEluZm9ybWF0aW9uZW4gZ2V3w6RocnQgd2VyZGVuIHNvbGwuCi0gICAgRGllc2VyIFJlc3NvdXJjZS1UeXAgbWFjaHQgendhciB3ZW5pZ2UgRWluc2NocsOkbmt1bmdlbiwgYWxsZXJkaW5ncyB2ZXJsaWVydAotICAgIG1hbiBkYWR1cmNoIGVpbmlnZSBkZXIgd2ljaHRpZ3N0ZW4gVm9ydGVpbGUgcmVzdHJpa3RpdmVyZXIgUmVzc291cmNlLVR5cGVuLgotICAgIDwvcD4KLSAgICAKLSAgICA8cD4KLSAgICAgIERlciA8c3Ryb25nPkxpbmtzLVJlc3NvdXJjZS1UeXA8L3N0cm9uZz4gZXJsYXVidCBlcywgTGlzdGVuIHZvbiBMaW5rcyB6dSB2ZXJ3YWx0ZW4uIEVyIGRpZW50Ci0gICAgICBoYXVwdHPDpGNobGljaCBkYXp1LCB6dSB6ZWlnZW4sIGRhc3MgTGVueWEgbWl0IGJlbGllYmlnZW4gUmVzc291cmNlLVR5cGVuIHVtZ2VoZW4ga2Fubi4KLSAgICA8L3A+Ci0gICAgCi0gICAgPHA+Ci0gICAgICBEZXIgPHN0cm9uZz5PcGVuRG9jdW1lbnQtUmVzc291cmNlLVR5cDwvc3Ryb25nPiBpc3QgZWluIHN0YW5kYXJkaXNpZXJ0ZXMgWE1MLWJhc2llcnRlcyBEYXRlaWZvcm1hdAotICAgICAgZsO8ciBPZmZpY2UtQW53ZW5kdW5nZW4uIEVyIHd1cmRlIHZvbiA8YSBocmVmPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvdGNfaG9tZS5waHA/d2dfYWJicmV2PW9mZmljZSI+T0FTSVM8L2E+Ci0gICAgICBlbnR3aWNrZWx0LgotICAgIDwvcD4KLSAgICAKLSAgICA8cD4KLSAgICAgIERlciA8c3Ryb25nPkNGb3Jtcy1SZXNzb3VyY2UtVHlwPC9zdHJvbmc+IGlzdCBlaW4gQmVpc3BpZWwsIHdpZSBMZW55YSBtaXQgRm9ybXVsYXItRGF0ZW4gYXVmIGRlcgotICAgICAgQmFzaXMgdm9uIENvY29vbidzIENGb3JtcyBpbiBWZXJiaW5kdW5nIG1pdCBBamF4IHVtZ2VodC4gCi0gICAgPC9wPgotICAgIAotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9pbmRleF9kZS5tZXRhIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvaW5kZXhfZGUubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4MGFkMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9pbmRleF9kZS5tZXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTxsZW55YTpkb2N1bWVudCB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLTxsZW55YTptZXRhPgotPGxlbnlhOmludGVybmFsPgotPGxlbnlhOnJlc291cmNlVHlwZT54aHRtbDwvbGVueWE6cmVzb3VyY2VUeXBlPgotPGxlbnlhOmNvbnRlbnRUeXBlPnhtbDwvbGVueWE6Y29udGVudFR5cGU+Ci0gIDxsZW55YTptaW1lVHlwZT5hcHBsaWNhdGlvbi94aHRtbCt4bWw8L2xlbnlhOm1pbWVUeXBlPgotPC9sZW55YTppbnRlcm5hbD4KLTxsZW55YTpkYz4KLSAgICAgICAgPGRjOnRpdGxlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+RWluaWdlIERva3VtZW50dHlwIEJlaXNwaWVsZTwvZGM6dGl0bGU+Ci0gICAgICAgIDxkYzpjcmVhdG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgRGV2ZWxvcG1lbnQgVGVhbTwvZGM6Y3JlYXRvcj4KLSAgICAgICAgPGRjOnN1YmplY3QgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5Eb2t1bWVudHR5cCBCZWlzcGllbGU8L2RjOnN1YmplY3Q+Ci0gICAgICAgIDxkYzpkZXNjcmlwdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkVudGjDpGx0IGVpbmlnZSBCZWlzcGllbGUgdm9uIERva3VtZW50dHlwZW48L2RjOmRlc2NyaXB0aW9uPgotICAgICAgICA8ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2RjOnB1Ymxpc2hlcj4KLSAgICAgICAgPGRjOmNvbnRyaWJ1dG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDUtMDEtMzE8L2RjOmRhdGU+Ci0gICAgICAgIDxkYzp0eXBlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Zm9ybWF0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6aWRlbnRpZmllciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnNvdXJjZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmxhbmd1YWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ZGU8L2RjOmxhbmd1YWdlPgotICAgICAgICA8ZGM6cmVsYXRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpjb3ZlcmFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFsbGUgUmVjaHRlIHZvcmJlaGFsdGVuPC9kYzpyaWdodHM+Ci08L2xlbnlhOmRjPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2luZGV4X2VuIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvaW5kZXhfZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTM2MWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvaW5kZXhfZW4KKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci0KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotICA8aGVhZD4KLSAgICA8dGl0bGU+UmVzb3VyY2UgVHlwZSBFeGFtcGxlczwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0gICAgPGgxPlJlc291cmNlIFR5cGUgRXhhbXBsZXM8L2gxPgotCi08cD4KLVRoZSBkZWZhdWx0IHB1YmxpY2F0aW9uIGNvbWVzIHdpdGggdGhlIDxhIGhyZWY9Ii9kZWZhdWx0L2F1dGhvcmluZy9kb2N0eXBlcy94aHRtbC1kb2N1bWVudC5odG1sIj5YSFRNTCByZXNvdXJjZSB0eXBlPC9hPiwKLXRoZSA8YSBocmVmPSIvZGVmYXVsdC9hdXRob3JpbmcvZG9jdHlwZXMvbGlua3MuaHRtbCI+TGlua3MgcmVzb3VyY2UgdHlwZTwvYT4sCi10aGUgPGEgaHJlZj0iL2RlZmF1bHQvYXV0aG9yaW5nL2RvY3R5cGVzL29wZW5kb2N1bWVudC5odG1sIj5PcGVuRG9jdW1lbnQgcmVzb3VyY2UgdHlwZTwvYT4gYW5kCi10aGUgPGEgaHJlZj0iL2RlZmF1bHQvYXV0aG9yaW5nL2RvY3R5cGVzL2Nmb3Jtcy5odG1sIj5DRm9ybXMgcmVzb3VyY2UgdHlwZTwvYT4uCi08L3A+Ci0KLTxwPgotVGhlIDxzdHJvbmc+WEhUTUwgcmVzb3VyY2UgdHlwZTwvc3Ryb25nPiBpcyBzdWl0YWJsZSBmb3Igc2l0dWF0aW9ucyB3aGVyZQotdXNlcnMgYXNrIGZvciBjb21wbGV0ZSBmcmVlZG9tIG9uIHdoYXQgaW5mb3JtYXRpb24gY2FuIGJlIGluc2VydGVkCi1pbnRvIGEgZG9jdW1lbnQuIFdoaWxlIHRoaXMgYXBwcm9hY2ggZG9lc24ndCByZXN0cmljdCB5b3UsIGl0IGFsc28KLWxvb3NlcyBzb21lIG9mIHRoZSBtYWpvciBiZW5lZml0cyBvZiB3ZWxsIGRlZmluZWQgZG9jdW1lbnQgdHlwZXMuCi08L3A+Ci0gICAgCi08cD4KLVRoZSA8c3Ryb25nPkxpbmtzIHJlc291cmNlIHR5cGU8L3N0cm9uZz4gaXMgbWFpbmx5IHRvIHNob3cgdGhhdCBMZW55YSBpcyBhYmxlIHRvIGhhbmRsZQotYXJiaXRyYXJ5IHJlc291cmNlIHR5cGVzIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGZvciBsaW5rLWxpc3RzLgotPC9wPgotICAgIAotPHA+Ci1UaGUgPHN0cm9uZz5PcGVuRG9jdW1lbnQgcmVzb3VyY2UgdHlwZTwvc3Ryb25nPiBpcyBhIHN0YW5kYXJkaXplZCBYTUwtYmFzZWQKLWZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24gc3VpdGFibGUgZm9yIG9mZmljZSBhcHBsaWNhdGlvbnMgYW5kIGhhcyBiZWVuIGRldmVsb3BlZAotYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL3RjX2hvbWUucGhwP3dnX2FiYnJldj1vZmZpY2UiPk9BU0lTPC9hPi4KLTwvcD4KLQotPHA+Ci1UaGUgPHN0cm9uZz5DRm9ybXMgcmVzb3VyY2UgdHlwZTwvc3Ryb25nPiBpcyBhbiBleGFtcGxlIG9mIGhvdyBMZW55YSBtYW5hZ2VzIGZvcm11bGFyIGRhdGEKLWJhc2VkIG9uIENvY29vbidzIENGb3JtcyBpbiBjb25qdW5jdGlvbiB3aXRoIEFqYXguCi08L3A+Ci0KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvaW5kZXhfZW4ubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2luZGV4X2VuLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NDYyMmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvaW5kZXhfZW4ubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+eGh0bWw8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veGh0bWwreG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPlNvbWUgUmVzb3VyY2UgVHlwZSBTYW1wbGVzPC9kYzp0aXRsZT4KLSAgICAgICAgPGRjOmNyZWF0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBEZXZlbG9wbWVudCBUZWFtPC9kYzpjcmVhdG9yPgotICAgICAgICA8ZGM6c3ViamVjdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPlJlc291cmNlIFR5cGUgU2FtcGxlczwvZGM6c3ViamVjdD4KLSAgICAgICAgPGRjOmRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+Q29udGFpbnMgc29tZSBzYW1wbGVzIG9mIExlbnlhIHJlc291cmNlIHR5cGVzPC9kYzpkZXNjcmlwdGlvbj4KLSAgICAgICAgPGRjOnB1Ymxpc2hlciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9kYzpwdWJsaXNoZXI+Ci0gICAgICAgIDxkYzpjb250cmlidXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA1LTAxLTMxPC9kYzpkYXRlPgotICAgICAgICA8ZGM6dHlwZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmZvcm1hdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmlkZW50aWZpZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpzb3VyY2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmVuPC9kYzpsYW5ndWFnZT4KLSAgICAgICAgPGRjOnJlbGF0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Y292ZXJhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BbGwgcmlnaHRzIHJlc2VydmVkPC9kYzpyaWdodHM+Ci08L2xlbnlhOmRjPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2xpbmtzL2luZGV4X2RlIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvbGlua3MvaW5kZXhfZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzcwNjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvbGlua3MvaW5kZXhfZGUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGlua3MgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL3B1YnMvZGVmYXVsdC8xLjAiPgotICA8dGl0bGU+RGVyIExpbmtzLVJlc3NvdXJjZS1UeXA8L3RpdGxlPgotICA8bGluayBocmVmPSJodHRwOi8vbGVueWEuYXBhY2hlLm9yZyI+QXBhY2hlIExlbnlhIFdlYnNpdGU8L2xpbms+Ci0gIDxsaW5rIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbGVueWEvIj5BcGFjaGUgTGVueWEgV2lraTwvbGluaz4KLTwvbGlua3M+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9saW5rcy9pbmRleF9kZS5tZXRhIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvbGlua3MvaW5kZXhfZGUubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmYmY1MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9saW5rcy9pbmRleF9kZS5tZXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsZW55YTpkb2N1bWVudCB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLTxsZW55YTptZXRhPgotPGxlbnlhOmRjPgotPGRjOnRpdGxlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGlua3M8L2RjOnRpdGxlPgotPGRjOmNyZWF0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5sZW55YTwvZGM6Y3JlYXRvcj4KLTxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotPGRjOnB1Ymxpc2hlciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLTxkYzpkYXRlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+MjAwNS0xMC0wMiAxMjo1MDoyNzwvZGM6ZGF0ZT4KLTxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmRlPC9kYzpsYW5ndWFnZT4KLTxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci08L2xlbnlhOmRjPgotPGxlbnlhOmludGVybmFsPgotPGxlbnlhOnJlc291cmNlVHlwZT5saW5rczwvbGVueWE6cmVzb3VyY2VUeXBlPgotPGxlbnlhOmNvbnRlbnRUeXBlPnhtbDwvbGVueWE6Y29udGVudFR5cGU+Ci0gIDxsZW55YTptaW1lVHlwZT5hcHBsaWNhdGlvbi94bWw8L2xlbnlhOm1pbWVUeXBlPgotPC9sZW55YTppbnRlcm5hbD4KLTwvbGVueWE6bWV0YT4KLTwvbGVueWE6ZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9saW5rcy9pbmRleF9lbiBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2xpbmtzL2luZGV4X2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWUxYzk1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2xpbmtzL2luZGV4X2VuCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxpbmtzIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9wdWJzL2RlZmF1bHQvMS4wIj4KLSAgPHRpdGxlPlRoZSBMaW5rcyBSZXNvdXJjZSBUeXBlPC90aXRsZT4KLSAgPGxpbmsgaHJlZj0iaHR0cDovL2xlbnlhLmFwYWNoZS5vcmciPkFwYWNoZSBMZW55YSBXZWJzaXRlPC9saW5rPgotICA8bGluayBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2xlbnlhLyI+QXBhY2hlIExlbnlhIFdpa2k8L2xpbms+Ci08L2xpbmtzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvbGlua3MvaW5kZXhfZW4ubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL2xpbmtzL2luZGV4X2VuLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzJhOGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvbGlua3MvaW5kZXhfZW4ubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTpkYz4KLTxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxpbmtzPC9kYzp0aXRsZT4KLTxkYzpjcmVhdG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+bGVueWE8L2RjOmNyZWF0b3I+Ci08ZGM6c3ViamVjdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLTxkYzpwdWJsaXNoZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci08ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDUtMTAtMDIgMTI6NTA6Mjc8L2RjOmRhdGU+Ci08ZGM6bGFuZ3VhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5lbjwvZGM6bGFuZ3VhZ2U+Ci08ZGM6cmlnaHRzIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotPC9sZW55YTpkYz4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+bGlua3M8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08L2xlbnlhOm1ldGE+Ci08L2xlbnlhOmRvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvb3BlbmRvY3VtZW50L2luZGV4X2RlIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvb3BlbmRvY3VtZW50L2luZGV4X2RlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY4NmE3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL29wZW5kb2N1bWVudC9pbmRleF9kZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL29wZW5kb2N1bWVudC9pbmRleF9kZS5tZXRhIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvb3BlbmRvY3VtZW50L2luZGV4X2RlLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxM2Y0N2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMvb3BlbmRvY3VtZW50L2luZGV4X2RlLm1ldGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxlbnlhOmRvY3VtZW50IHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotPGxlbnlhOm1ldGE+Ci0gIDxsZW55YTpkYz4KLSAgICA8ZGM6dGl0bGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5PcGVuRG9jdW1lbnQ8L2RjOnRpdGxlPgotICAgIDxkYzpjcmVhdG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+bGVueWE8L2RjOmNyZWF0b3I+Ci0gICAgPGRjOmxhbmd1YWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ZGU8L2RjOmxhbmd1YWdlPgotICA8L2xlbnlhOmRjPgotCi0gIDxsZW55YTppbnRlcm5hbD4KLSAgICA8bGVueWE6cmVzb3VyY2VUeXBlPm9wZW5kb2N1bWVudDwvbGVueWE6cmVzb3VyY2VUeXBlPgotICAgIDxsZW55YTpjb250ZW50VHlwZT5vZHQ8L2xlbnlhOmNvbnRlbnRUeXBlPgotICAgICA8bGVueWE6ZXh0ZW5zaW9uPm9kdDwvbGVueWE6ZXh0ZW5zaW9uPgotICAgIDxsZW55YTptaW1lVHlwZT5hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQ8L2xlbnlhOm1pbWVUeXBlPgotICA8L2xlbnlhOmludGVybmFsPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL29wZW5kb2N1bWVudC9pbmRleF9lbiBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL29wZW5kb2N1bWVudC9pbmRleF9lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzNDVlOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9vcGVuZG9jdW1lbnQvaW5kZXhfZW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy9vcGVuZG9jdW1lbnQvaW5kZXhfZW4ubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL29wZW5kb2N1bWVudC9pbmRleF9lbi5tZXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRjZTEwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL29wZW5kb2N1bWVudC9pbmRleF9lbi5tZXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsZW55YTpkb2N1bWVudCB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLTxsZW55YTptZXRhPgotICA8bGVueWE6ZGM+Ci0gICAgPGRjOnRpdGxlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+T3BlbkRvY3VtZW50PC9kYzp0aXRsZT4KLSAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmxlbnlhPC9kYzpjcmVhdG9yPgotICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmVuPC9kYzpsYW5ndWFnZT4KLSAgPC9sZW55YTpkYz4KLQotICA8bGVueWE6aW50ZXJuYWw+Ci0gICAgPGxlbnlhOnJlc291cmNlVHlwZT5vcGVuZG9jdW1lbnQ8L2xlbnlhOnJlc291cmNlVHlwZT4KLSAgICA8bGVueWE6Y29udGVudFR5cGU+b2R0PC9sZW55YTpjb250ZW50VHlwZT4KLSAgICAgPGxlbnlhOmV4dGVuc2lvbj5vZHQ8L2xlbnlhOmV4dGVuc2lvbj4KLSAgICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0PC9sZW55YTptaW1lVHlwZT4KLSAgPC9sZW55YTppbnRlcm5hbD4KLTwvbGVueWE6bWV0YT4KLTwvbGVueWE6ZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy94aHRtbC1kb2N1bWVudC9pbmRleF9kZSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL3hodG1sLWRvY3VtZW50L2luZGV4X2RlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2I3ZDAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL3hodG1sLWRvY3VtZW50L2luZGV4X2RlCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPkRlciBYSFRNTC1SZXNzb3VyY2UtVHlwPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+RGVyIFhIVE1MLVJlc3NvdXJjZS1UeXA8L2gxPgotCi0gICAgPHA+Ci0gICAgRGVyIFhIVE1MLVJlc3NvdXJjZS1UeXAgZXJsYXVidCBlcywgWEhUTUwtRG9rdW1lbnRlIHp1IHZlcndhbHRlbiwKLSAgICBkaWUgZGVyIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS8iPlhIVE1MLTEuMC1EZWZpbml0aW9uPC9hPgotICAgIGRlcyA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8iPldvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gKFczQyk8L2E+Ci0gICAgZW50c3ByZWNoZW4uCi0gICAgPC9wPgotCi0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL3hodG1sLWRvY3VtZW50L2luZGV4X2RlLm1ldGEgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy94aHRtbC1kb2N1bWVudC9pbmRleF9kZS5tZXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFjMjMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL3hodG1sLWRvY3VtZW50L2luZGV4X2RlLm1ldGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPGxlbnlhOmRvY3VtZW50IHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotPGxlbnlhOm1ldGE+Ci08bGVueWE6aW50ZXJuYWw+Ci08bGVueWE6cmVzb3VyY2VUeXBlPnhodG1sPC9sZW55YTpyZXNvdXJjZVR5cGU+Ci08bGVueWE6Y29udGVudFR5cGU+eG1sPC9sZW55YTpjb250ZW50VHlwZT4KLSAgPGxlbnlhOm1pbWVUeXBlPmFwcGxpY2F0aW9uL3hodG1sK3htbDwvbGVueWE6bWltZVR5cGU+Ci08L2xlbnlhOmludGVybmFsPgotPGxlbnlhOmRjPgotICAgICAgICA8ZGM6dGl0bGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5EZXIgWEhUTUwgRG9rdW1lbnR0eXA8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci0gICAgICAgIDxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+WEhUTUwgRG9rdW1lbnR0eXA8L2RjOnN1YmplY3Q+Ci0gICAgICAgIDxkYzpkZXNjcmlwdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkVybMOkdXRlcnQgZGVuIFhIVE1MIERva3VtZW50dHlwPC9kYzpkZXNjcmlwdGlvbj4KLSAgICAgICAgPGRjOnB1Ymxpc2hlciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9kYzpwdWJsaXNoZXI+Ci0gICAgICAgIDxkYzpjb250cmlidXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA1LTAxLTMxPC9kYzpkYXRlPgotICAgICAgICA8ZGM6dHlwZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmZvcm1hdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmlkZW50aWZpZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpzb3VyY2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmRlPC9kYzpsYW5ndWFnZT4KLSAgICAgICAgPGRjOnJlbGF0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Y292ZXJhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbjwvZGM6cmlnaHRzPgotPC9sZW55YTpkYz4KLTwvbGVueWE6bWV0YT4KLTwvbGVueWE6ZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy94aHRtbC1kb2N1bWVudC9pbmRleF9lbiBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL3hodG1sLWRvY3VtZW50L2luZGV4X2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjk0NmM3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2RvY3R5cGVzL3hodG1sLWRvY3VtZW50L2luZGV4X2VuCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPlRoZSBYSFRNTCBSZXNvdXJjZSBUeXBlPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+VGhlIFhIVE1MIFJlc291cmNlIFR5cGU8L2gxPgotCi0gICAgPHA+VGhlIFhIVE1MIHJlc291cmNlIHR5cGUgc3VwcG9ydHMgdG8gbWFpbnRhaW4gWEhUTUwgZG9jdW1lbnRzIHdoaWNoCi0gICAgY29uZm9ybSB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxLyI+WEhUTUwgMS4wCi0gICAgZGVmaW5pdGlvbjwvYT4gb2YgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+V29ybGQgV2lkZSBXZWIKLSAgICBDb25zb3J0aXVtIChXM0MpPC9hPi48L3A+ICAKLQotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy94aHRtbC1kb2N1bWVudC9pbmRleF9lbi5tZXRhIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZG9jdHlwZXMveGh0bWwtZG9jdW1lbnQvaW5kZXhfZW4ubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5Y2U5NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9kb2N0eXBlcy94aHRtbC1kb2N1bWVudC9pbmRleF9lbi5tZXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTxsZW55YTpkb2N1bWVudCB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLTxsZW55YTptZXRhPgotPGxlbnlhOmludGVybmFsPgotPGxlbnlhOnJlc291cmNlVHlwZT54aHRtbDwvbGVueWE6cmVzb3VyY2VUeXBlPgotPGxlbnlhOmNvbnRlbnRUeXBlPnhtbDwvbGVueWE6Y29udGVudFR5cGU+Ci0gIDxsZW55YTptaW1lVHlwZT5hcHBsaWNhdGlvbi94aHRtbCt4bWw8L2xlbnlhOm1pbWVUeXBlPgotPC9sZW55YTppbnRlcm5hbD4KLTxsZW55YTpkYz4KLSAgICAgICAgPGRjOnRpdGxlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+VGhlIFhIVE1MIFJlc291cmNlIFR5cGU8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci0gICAgICAgIDxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+WEhUTUwgUmVzb3VyY2UgVHlwZTwvZGM6c3ViamVjdD4KLSAgICAgICAgPGRjOmRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+RXhwbGFpbnMgdGhlIFhIVE1MIFJlc291cmNlIFR5cGU8L2RjOmRlc2NyaXB0aW9uPgotICAgICAgICA8ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2RjOnB1Ymxpc2hlcj4KLSAgICAgICAgPGRjOmNvbnRyaWJ1dG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDUtMDEtMzE8L2RjOmRhdGU+Ci0gICAgICAgIDxkYzp0eXBlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Zm9ybWF0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6aWRlbnRpZmllciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnNvdXJjZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmxhbmd1YWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ZW48L2RjOmxhbmd1YWdlPgotICAgICAgICA8ZGM6cmVsYXRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpjb3ZlcmFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFsbCByaWdodHMgcmVzZXJ2ZWQ8L2RjOnJpZ2h0cz4KLTwvbGVueWE6ZGM+Ci08L2xlbnlhOm1ldGE+Ci08L2xlbnlhOmRvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZmVhdHVyZXMvaW5kZXhfZGUgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9mZWF0dXJlcy9pbmRleF9kZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlNjgwYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9mZWF0dXJlcy9pbmRleF9kZQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi14bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgCi14bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLQotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT5GdW5rdGlvbmVuPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+RnVua3Rpb25lbjwvaDE+Ci0gICAgCi0gICAgPHA+Ci0gICAgICBBcGFjaGUgTGVueWEgYmlldGV0IGRpZSBGZWF0dXJlcywgZGllIFNpZSB2b24gZWluZW0gbW9kZXJuZW4KLSAgICAgIENvbnRlbnQtTWFuYWdlbWVudC1TeXN0ZW0gZXJ3YXJ0ZW4sIHouQi4gVmVyc2lvbmllcnVuZywgWmVpdHN0ZXVlcnVuZywKLSAgICAgIGVpbmUgZWluZ2ViYXV0ZSBTdWNobWFzY2hpbmUsIFN0YWdpbmcgdW5kIFdvcmtmbG93LgotICAgICAgRGEgZXMgZHVyY2hnw6RuZ2lnIGF1ZiBYTUwgYmFzaWVydCwga8O2bm5lbiBtZWhyIEZ1bmt0aW9uYWxpdMOkdGVuCi0gICAgICByZWFsaXNpZXJ0IHdlcmRlbiBhbHMgbWl0IENNUywgZGllIFhNTCBudXIgYW5zYXR6d2Vpc2UgdmVyd2VuZGVuLgotICAgICAgRWluaWdlIGVyd8OkaG5lbnN3ZXJ0ZSBGdW5rdGlvbmFsaXTDpHRlbiBzaW5kOgotICAgIDwvcD4KLQotICAgIDxoMj5Ccm93c2VyLWJhc2llcnRlcyBFZGl0aWVyZW4gaW0gV1lTSVdZRy1Nb2R1czwvaDI+Ci0gICAgCi0gICAgPHA+Ci0gICAgICBBcGFjaGUgTGVueWEgdmVyZsO8Z3Qgw7xiZXIgQnJvd3Nlci1iYXNpZXJ0ZSBXWVNJV1lHLUVkaXRvcmVuIGRpZQotICAgICAgZ2VnZW4gVzNDIFhNTCBTY2hlbWFzIGJ6dy4gUmVsYXgtTkctU2NoZW1hcyB2YWxpZGllcmVuLiBEYWR1cmNoIHdpcmQKLSAgICAgIGRhcyBuaWNodC1rb25mb3JtZSBNYXJrdXAsIGRhcyBhbmRlcmUgRWRpdG9yZW4gcHJvZHV6aWVyZW4sIHZlcm1pZWRlbi4KLSAgICAgIFNjaGVtYS1iYXNpZXJ0ZSBFZGl0b3JlbiBlcmxhdWJlbiBlcyBhdcOfZXJkZW0sIFdlYnNpdGUtU3R5bGUtR3VpZGVsaW5lcwotICAgICAgZHVyY2h6dXNldHplbi4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGgyPlhNTC1QdWJsaXNoaW5nPC9oMj4KLSAgICAKLSAgICA8cD4KLSAgICAgIERhIEFwYWNoZSBMZW55YSBhdWYgQXBhY2hlIENvY29vbiBiYXNpZXJ0LCBrYW5uIGVzIGF1ZiBhbGxlIFZvcnRlaWxlCi0gICAgICBlaW5lcyBtw6RjaHRpZ2VuIFhNTC1QdWJsaXNoaW5nLUZyYW1ld29ya3MgenVyw7xja2dyZWlmZW4sIGRhcnVudGVyCi0gICAgICBNdWx0aS1DaGFubmVsLSAvIENyb3NzLVBsYXRmb3JtLVB1Ymxpc2hpbmcgdW5kIENvbnRlbnQtQWdncmVnYXRpb24KLSAgICAgIHZvbiBleHRlcm5lbiBRdWVsbGVuIHdpZSBSU1MtRmVlZHMuIAotICAgIDwvcD4KLQotICAgIDxoMj5EYXMgUHVibGlrYXRpb25za29uemVwdDwvaDI+Ci0gICAgCi0gICAgPHA+Ci0gICAgICBEYXMgUHVibGlrYXRpb25za29uemVwdCBlcmxhdWJ0IGVzLCBJbmZvcm1hdGlvbnMtQXJjaGl0ZWt0dXJlbiB2b24KLSAgICAgIFdlYnNpdGVzIHdpZWRlcnp1dmVyd2VuZGVuIHVuZCBkaWUgSW5mb3JtYXRpb25lbiBhdWYgZGVyIEViZW5lIGRlcwotICAgICAgSW5oYWx0cyB6dSBtb2R1bGFyaXNpZXJlbi4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGgyPkVpbmUgenVrdW5mdHNzaWNoZXJlIEzDtnN1bmc8L2gyPgotICAgIAotICAgIDxwPgotICAgICAgRGVyIEFwYWNoZSBTb2Z0d2FyZS1TdGFjayBpc3QgZWluZSBkZXIgYmV3w6RocnRlc3RlbiBQbGF0dGZvcm1lbiB6dXIKLSAgICAgIEVyc3RlbGx1bmcgdm9uIEludGVybmV0LUFwcGxpa2F0aW9uZW4uIEF1ZiBkaWVzZXIgQmFzaXMgYmlldGV0IEFwYWNoZQotICAgICAgTGVueWEgZWluZSByb2J1c3RlLCB6dWt1bmZ0cy0gdW5kIGludmVzdGl0aW9uc3NpY2hlcmUgTMO2c3VuZy4KLSAgICA8L3A+Ci0KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZmVhdHVyZXMvaW5kZXhfZGUubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2ZlYXR1cmVzL2luZGV4X2RlLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDM5MzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvZmVhdHVyZXMvaW5kZXhfZGUubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+eGh0bWw8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veGh0bWwreG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkVpbmlnZSBMZW55YSBGdW5rdGlvbmVuIGt1cnogZXJrbMOkcnQ8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci0gICAgICAgIDxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgRnVua3Rpb25lbjwvZGM6c3ViamVjdD4KLSAgICAgICAgPGRjOmRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+RXJrbMOkcnQgZWluaWdlIExlbnlhIEZ1bmt0aW9uZW4uPC9kYzpkZXNjcmlwdGlvbj4KLSAgICAgICAgPGRjOnB1Ymxpc2hlciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9kYzpwdWJsaXNoZXI+Ci0gICAgICAgIDxkYzpjb250cmlidXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA1LTAxLTMxPC9kYzpkYXRlPgotICAgICAgICA8ZGM6dHlwZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmZvcm1hdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmlkZW50aWZpZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpzb3VyY2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmRlPC9kYzpsYW5ndWFnZT4KLSAgICAgICAgPGRjOnJlbGF0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Y292ZXJhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbjwvZGM6cmlnaHRzPgotPC9sZW55YTpkYz4KLTwvbGVueWE6bWV0YT4KLTwvbGVueWE6ZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9mZWF0dXJlcy9pbmRleF9lbiBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2ZlYXR1cmVzL2luZGV4X2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGJlODIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2ZlYXR1cmVzL2luZGV4X2VuCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiID4KLQotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT5GZWF0dXJlczwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0gICAgPGgxPkZlYXR1cmVzPC9oMT4KLQotICAgIDxwPkFwYWNoZSBMZW55YSBjb21lcyB3aXRoIHRoZSBmZWF0dXJlcyB5b3Ugd291bGQgZXhwZWN0IG9mIGEKLSAgICBtb2Rlcm4gQ29udGVudCBNYW5hZ2VtZW50IFN5c3RlbSwgc3VjaCBhcyBSZXZpc2lvbiBDb250cm9sLAotICAgIFNjaGVkdWxpbmcsIGEgYnVpbHQtaW4gU2VhcmNoIEVuZ2luZSwgc2VwYXJhdGUgU3RhZ2luZyBBcmVhcyBhbmQKLSAgICBXb3JrZmxvdy4gQmVjYXVzZSBBcGFjaGUgTGVueWEgdXNlcyBYTUwgdGhyb3VnaG91dCwgaXQgY2FuIG9mZmVyCi0gICAgbXVjaCBtb3JlIHRoYW4gb3RoZXIgQ01TIHRoYXQgdXNlIFhNTCBvbmx5IG1hcmdpbmFsbHkuIFNvbWUKLSAgICBub3RhYmxlIGZlYXR1cmVzIGluY2x1ZGU6PC9wPgotCi0gICAgPGgyPkJyb3dzZXItYmFzZWQgV1lTSVdZRyBFZGl0aW5nPC9oMj4KLSAgICAKLSAgICA8cD5BcGFjaGUgTGVueWEgY29tZXMgd2l0aCBCcm93c2VyLWJhc2VkIFdZU0lXWUcgRWRpdG9ycyB0aGF0Ci0gICAgdmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBhIFczQyBYTUwgU2NoZW1hLiBUaGlzIHByZXZlbnRzIHRoZSBpbnZhbGlkCi0gICAgbWFya3VwIHRoYXQgb3RoZXIgZWRpdG9ycyBwcm9kdWNlLiBTY2hlbWEtYmFzZWQgZWRpdG9ycyBhbHNvIGFsbG93Ci0gICAgdG8gZW5mb3JjZSB3ZWIgc2l0ZSBzdHlsZSBndWlkZWxpbmVzLjwvcD4gCi0KLSAgICA8aDI+WE1MIFB1Ymxpc2hpbmc8L2gyPgotCi0gICAgPHA+QXMgQXBhY2hlIExlbnlhIGlzIGJhc2VkIG9uIEFwYWNoZSBDb2Nvb24gaXQgbGV2ZXJhZ2VzIGFsbCB0aGUKLSAgICBiZW5lZml0cyBmcm9tIGEgcG93ZXJmdWwgWE1MIFB1Ymxpc2hpbmcgZnJhbWV3b3JrIHN1Y2ggYXMKLSAgICBtdWx0aS1jaGFubmVsIHB1Ymxpc2hpbmcsIGNvbnRlbnQgYWdncmVnYXRpb24gZXZlbiBmcm9tIGV4dGVybmFsCi0gICAgc291cmNlcyBzdWNoIGFzIFJTUy48L3A+Ci0KLSAgICA8aDI+VGhlIFB1YmxpY2F0aW9uIENvbmNlcHQ8L2gyPgotICAgIAotICAgIDxwPlRoZSBwdWJsaWNhdGlvbiBjb25jZXB0IGFsbG93cyBmb3IgcmV1c2Ugb2YgdGhlIGluZm9ybWF0aW9uCi0gICAgYXJjaGl0ZWN0dXJlIG9mIGEgc2l0ZSBhbmQgYnJpbmdzIG1vZHVsYXJpdHkgdG8gdGhlIGNvbnRlbnQKLSAgICBsZXZlbC48L3A+IAotCi0gICAgPGgyPkZ1dHVyZS1wcm9vZiBTb2x1dGlvbjwvaDI+Ci0gICAgCi0gICAgPHA+VGhlIEFwYWNoZSBTb2Z0d2FyZSBTdGFjayBpcyBxdWlja2x5IGJlY29taW5nIHRoZSBwcmVlbWluZW50Ci0gICAgcGxhdGZvcm0gZm9yIGJ1aWxkaW5nIEludGVybmV0IGFwcGxpY2F0aW9ucy4gQnkgbGV2ZXJhZ2luZyB0aGUKLSAgICBBcGFjaGUgU29mdHdhcmUgU3RhY2ssIEFwYWNoZSBMZW55YSBvZmZlcnMgYSByb2J1c3QsIGZ1dHVyZS1wcm9vZgotICAgIHNvbHV0aW9uIHRoYXQgcHJlc2VydmVzIHRlY2hub2xvZ3kgaW52ZXN0bWVudHMuPC9wPgotCi0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2ZlYXR1cmVzL2luZGV4X2VuLm1ldGEgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9mZWF0dXJlcy9pbmRleF9lbi5tZXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU1NzZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2ZlYXR1cmVzL2luZGV4X2VuLm1ldGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPGxlbnlhOmRvY3VtZW50IHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotPGxlbnlhOm1ldGE+Ci08bGVueWE6aW50ZXJuYWw+Ci08bGVueWE6cmVzb3VyY2VUeXBlPnhodG1sPC9sZW55YTpyZXNvdXJjZVR5cGU+Ci08bGVueWE6Y29udGVudFR5cGU+eG1sPC9sZW55YTpjb250ZW50VHlwZT4KLSAgPGxlbnlhOm1pbWVUeXBlPmFwcGxpY2F0aW9uL3hodG1sK3htbDwvbGVueWE6bWltZVR5cGU+Ci08L2xlbnlhOmludGVybmFsPgotPGxlbnlhOmRjPgotICAgICAgICA8ZGM6dGl0bGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5Tb21lIExlbnlhIEZlYXR1cmVzIHF1aWNrbHkgZXhwbGFpbmVkPC9kYzp0aXRsZT4KLSAgICAgICAgPGRjOmNyZWF0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBEZXZlbG9wbWVudCBUZWFtPC9kYzpjcmVhdG9yPgotICAgICAgICA8ZGM6c3ViamVjdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIEZlYXR1cmVzPC9kYzpzdWJqZWN0PgotICAgICAgICA8ZGM6ZGVzY3JpcHRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5FeHBsYWlucyBzb21lIExlbnlhIGZlYXR1cmVzPC9kYzpkZXNjcmlwdGlvbj4KLSAgICAgICAgPGRjOnB1Ymxpc2hlciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9kYzpwdWJsaXNoZXI+Ci0gICAgICAgIDxkYzpjb250cmlidXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA1LTAxLTMxPC9kYzpkYXRlPgotICAgICAgICA8ZGM6dHlwZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmZvcm1hdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmlkZW50aWZpZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpzb3VyY2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmVuPC9kYzpsYW5ndWFnZT4KLSAgICAgICAgPGRjOnJlbGF0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Y292ZXJhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BbGwgcmlnaHRzIHJlc2VydmVkPC9kYzpyaWdodHM+Ci08L2xlbnlhOmRjPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2luZGV4L2luZGV4X2RlIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvaW5kZXgvaW5kZXhfZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjAyY2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvaW5kZXgvaW5kZXhfZGUKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPldpbGxrb21tZW4genVyIERlZmF1bHQtUHVibGlrYXRpb24hPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+SGFsbG8gdW5kIGhlcnpsaWNoIFdpbGxrb21tZW4gYmVpIGRlciBMZW55YSBEZWZhdWx0LVB1Ymxpa2F0aW9uITwvaDE+Ci0gICAgCi0gICAgPHA+Ci0gICAgICBBcGFjaGUgTGVueWEgaXN0IGVpbiBpbiBKYXZhIGltcGxlbWVudGllcnRlcyBPcGVuLVNvdXJjZSBDb250ZW50IE1hbmFnZW1lbnQgU3lzdGVtLAotICAgICAgZGFzIGF1ZiBvZmZlbmVuIFN0YW5kYXJkcyB3aWUgWE1MIHVuZCBYU0xUIHNvd2llIGRlbSBiZXfDpGhydGVuIEFwYWNoZQotICAgICAgU29mdHdhcmUtU3RhY2sgYmFzaWVydC4gU2VpbiBGdW5kYW1lbnQgYmlsZGV0IGRhcyBYTUwtUHVibGlzaGluZy1GcmFtZXdvcmsKLSAgICAgIEFwYWNoZSBDb2Nvb24uCi0gICAgPC9wPgotCi0gICAgPHA+Ci0gICAgICBJbSBBcnRpa2VsIDxhIGhyZWY9Ii9kZWZhdWx0L2F1dGhvcmluZy9jb25jZXB0c19kZS5odG1sIj5Lb256ZXB0ZTwvYT4gZXJoYWx0ZW4gU2llCi0gICAgICBlaW5lbiDDnGJlcmJsaWNrIMO8YmVyIGRpZSBpbiBMZW55YSB2ZXJ3ZW5kZXRlZW4gS29uemVwdGUgdW5kIEJlZ3JpZmZlLgotICAgICAgRGVyIEFydGlrZWwgPGEgaHJlZj0iL2RlZmF1bHQvYXV0aG9yaW5nL2ZlYXR1cmVzX2RlLmh0bWwiPkZlYXR1cmVzPC9hPiBiaWV0ZXQKLSAgICAgIGVpbmVuIMOcYmVyYmxpY2sgw7xiZXIgZGllIGluIExlbnlhIHZlcmbDvGdiYXJlbiBGdW5rdGlvbmVuLgotICAgIDwvcD4KLSAgICAKLSAgICA8cD4KLSAgICAgIEbDvHIgZWluZSBzY2huZWxsZSBFaW5mw7xocnVuZyBpbiBkaWUgVmVyd2VuZHVuZyBkZXMgQXBhY2hlIExlbnlhIENNUyBlbXBmZWhsZW4KLSAgICAgIHdpciBkYXMgPGEgaHJlZj0iL2RlZmF1bHQvYXV0aG9yaW5nL3R1dG9yaWFsX2RlLmh0bWwiPlR1dG9yaWFsPC9hPi4KLSAgICA8L3A+Ci0KLSAgICA8cD5EZXIgWndlY2sgZGllc2VyIFB1Ymxpa2F0aW9uIGlzdCBlcyw8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIGRpZSBHcnVuZGZ1bmt0aW9uYWxpdMOkdCBkZXMgQXBhY2hlIExlbnlhIENNUyB6dSBwcsOkc2VudGllcmVuLAotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgZWluZSBQdWJsaWthdGlvbiAidm9uIGRlciBTdGFuZ2UiIGFuenViaWV0ZW4sIGRpZSBhdWYgZWluZmFjaGUKLSAgICAgICAgV2Vpc2UgYW5nZXBhc3N0IHVuZCBnZW51dHp0IHdlcmRlbiBrYW5uLCAgdW5kCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICBlaW5lIEJhc2lzIGbDvHIgUmVmZXJlbnppbXBsZW1lbnRhdGlvbiBuZXVlciBLb256ZXB0ZSB1bmQgQmVzdC1QcmFjdGlzZXMKLSAgICAgICAgenVyIFZlcmbDvGd1bmcgenUgc3RlbGxlbi4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgICAKLSAgICA8cD4KLSAgICAgIERpZXNlIFB1Ymxpa2F0aW9uIHJlaXp0IGRpZSBNw7ZnbGljaGtlaXRlbiB2b24gQXBhY2hlIExlbnlhIG5pY2h0IGF1czsKLSAgICAgIGVzIGdpYnQga2VpbmUgU3BpZWxlcmVpZW4sIGRpZSBTaWUgdmVyd2lycmVuIGvDtm5udGVuLiBEaWVzZSBQdWJsaWthdGlvbiBlbnRow6RsdAotICAgICAgbnVyLCB3YXMgU2llIGbDvHIgZWluZW4gc2NobmVsbGVuIEVpbnN0aWVnIGJlbsO2dGlnZW4uCi0gICAgPC9wPgotICAgIAotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9pbmRleC9pbmRleF9kZS5tZXRhIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvaW5kZXgvaW5kZXhfZGUubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2NzI3ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9pbmRleC9pbmRleF9kZS5tZXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTxsZW55YTpkb2N1bWVudCB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLTxsZW55YTptZXRhPgotICAgIDxsZW55YTpjdXN0b20+Ci0gICAgICA8bGVueWE6bXlNZXRhPkJlbnV0emVuIFNpZSBpaHJlIGVpZ25lbiBNZXRhZGF0ZW4gaW4gbGVueWEuPC9sZW55YTpteU1ldGE+Ci0gICAgPC9sZW55YTpjdXN0b20+Ci08bGVueWE6aW50ZXJuYWw+Ci08bGVueWE6cmVzb3VyY2VUeXBlPmhvbWVwYWdlPC9sZW55YTpyZXNvdXJjZVR5cGU+Ci08bGVueWE6Y29udGVudFR5cGU+eG1sPC9sZW55YTpjb250ZW50VHlwZT4KLSAgPGxlbnlhOm1pbWVUeXBlPmFwcGxpY2F0aW9uL3hodG1sK3htbDwvbGVueWE6bWltZVR5cGU+Ci08L2xlbnlhOmludGVybmFsPgotPGxlbnlhOmRjPgotICAgICAgICA8ZGM6dGl0bGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5XaWxsa29tbWVuIHp1ciBMZW55YSBTdGFuZGFyZHB1Ymxpa2F0aW9uPC9kYzp0aXRsZT4KLSAgICAgICAgPGRjOmNyZWF0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBEZXZlbG9wbWVudCBUZWFtPC9kYzpjcmVhdG9yPgotICAgICAgICA8ZGM6c3ViamVjdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIFN0YW5kYXJkcHVibGlrYXRpb248L2RjOnN1YmplY3Q+Ci0gICAgICAgIDxkYzpkZXNjcmlwdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPlN0YXJ0c2VpdGUgZGVyIExlbnlhIFN0YW5kYXJkcHVibGlrYXRpb248L2RjOmRlc2NyaXB0aW9uPgotICAgICAgICA8ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2RjOnB1Ymxpc2hlcj4KLSAgICAgICAgPGRjOmNvbnRyaWJ1dG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA1LTAxLTMxPC9kYzpkYXRlPgotICAgICAgICA8ZGM6dHlwZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpmb3JtYXQgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiAvPgotICAgICAgICA8ZGM6aWRlbnRpZmllciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpzb3VyY2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiAvPgotICAgICAgICA8ZGM6bGFuZ3VhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5kZTwvZGM6bGFuZ3VhZ2U+Ci0gICAgICAgIDxkYzpyZWxhdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpjb3ZlcmFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbjwvZGM6cmlnaHRzPgotPC9sZW55YTpkYz4KLTwvbGVueWE6bWV0YT4KLTwvbGVueWE6ZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9pbmRleC9pbmRleF9lbiBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2luZGV4L2luZGV4X2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBiNTI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2luZGV4L2luZGV4X2VuCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPldlbGNvbWUgdG8gdGhlIERlZmF1bHQgcHVibGljYXRpb248L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgIDxoMT5IZWxsbyBhbmQgd2VsY29tZSB0byB0aGUgTGVueWEgZGVmYXVsdCBwdWJsaWNhdGlvbiE8L2gxPgotCi0gICAgPHA+QXBhY2hlIExlbnlhIGlzIGEgSmF2YSBPcGVuLVNvdXJjZSBDb250ZW50IE1hbmFnZW1lbnQgU3lzdGVtCi0gICAgYmFzZWQgb24gb3BlbiBzdGFuZGFyZHMgc3VjaCBhcyBYTUwgYW5kIFhTTFQgYW5kIHRoZSBBcGFjaGUKLSAgICBTb2Z0d2FyZSBTdGFjaywgaW4gcGFydGljdWxhciB0aGUgWE1MIHB1Ymxpc2hpbmcgZnJhbWV3b3JrIEFwYWNoZQotICAgIENvY29vbi48L3A+Ci0KLSAgICA8cD5Gb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGNvbmNlcHRzIGFuZCB0aGUgdGVybWlub2xvZ3kgdXNlZCBpbgotICAgIEFwYWNoZSBMZW55YSBwbGVhc2Ugc2VlIHRoZSA8YSBocmVmPSIvZGVmYXVsdC9hdXRob3JpbmcvY29uY2VwdHMuaHRtbCI+Q29uY2VwdHMKLSAgICBzZWN0aW9uPC9hPi4gVG8gc2VlIHdoYXQgeW91IGNhbiBkbyB3aXRoIEFwYWNoZSBMZW55YSBwbGVhc2UKLSAgICByZWZlciB0byB0aGUgPGEgaHJlZj0iL2RlZmF1bHQvYXV0aG9yaW5nL2ZlYXR1cmVzLmh0bWwiPkZlYXR1cmVzCi0gICAgc2VjdGlvbjwvYT4uPC9wPgotCi0gICAgPHA+SWYgeW91J2QgbGlrZSB0byBnZXQgYSBxdWljayBpbnRyb2R1Y3Rpb24gb24gaG93IHRvIHVzZSBBcGFjaGUKLSAgICBMZW55YSBDTVMgcGxlYXNlIGdvIHRocm91Z2ggdGhlIDxhCi0gICAgaHJlZj0iL2RlZmF1bHQvYXV0aG9yaW5nL3R1dG9yaWFsLmh0bWwiPnR1dG9yaWFsPC9hPi48L3A+Ci0KLSAgICA8cD5UaGUgcHVycG9zZSBvZiB0aGlzIHB1YmxpY2F0aW9uIGlzPC9wPgotCi0gICAgPHVsPgotICAgICAgPGxpPnRvIHNob3cgYmVnaW5uZXJzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBBcGFjaGUKLSAgICAgIExlbnlhIENNUyw8L2xpPgotCi0gICAgICA8bGk+dG8gcHJvdmlkZSBhbiAib3V0IG9mIHRoZSBib3giIHB1YmxpY2F0aW9uIHRoYXQgY2FuIGJlCi0gICAgICBlYXNpbHkgYWRhcHRlZCBhbmQgdXNlZCw8L2xpPgotCi0gICAgICA8bGk+YW5kIHRvIHByb3ZpZGUgYSBiYXNpcyBmb3IgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9ucyBvZiBuZXcKLSAgICAgIGNvbmNlcHRzIGFuZCBiZXN0IHByYWN0aWNlcy48L2xpPgotCi0gICAgPC91bD4KLQotICAgIDxwPlRoaXMgcHVibGljYXRpb24gZG9lcyBub3QgZ28gdG8gdGhlIGxpbWl0IG9mIHdoYXQncyBwb3NzaWJsZQotICAgIHdpdGggQXBhY2hlIExlbnlhIENNUywgdGhlcmUgYXJlIG5vIGZhbmN5IGJlbGxzIGFuZCB3aGlzdGxlcyB0bwotICAgIGNvbmZ1c2UgeW91LCB0aGlzIHB1YmxpY2F0aW9uIHNpbXBseSBjb250YWlucyBldmVyeXRoaW5nIHlvdSBuZWVkCi0gICAgdG8gZ2V0IHN0YXJ0ZWQuPC9wPgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2luZGV4L2luZGV4X2VuLm1ldGEgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9pbmRleC9pbmRleF9lbi5tZXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjI0ZTI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2luZGV4L2luZGV4X2VuLm1ldGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQkIC0tPgotPGxlbnlhOmRvY3VtZW50IHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotPGxlbnlhOm1ldGE+Ci0gICAgPGxlbnlhOmN1c3RvbT4KLSAgICAgIDxsZW55YTpteU1ldGE+QWRkIHlvdXIgb3duIG1ldGFkYXRhIHRvIGxlbnlhLjwvbGVueWE6bXlNZXRhPgotICAgIDwvbGVueWE6Y3VzdG9tPgotPGxlbnlhOmludGVybmFsPgotPGxlbnlhOnJlc291cmNlVHlwZT5ob21lcGFnZTwvbGVueWE6cmVzb3VyY2VUeXBlPgotPGxlbnlhOmNvbnRlbnRUeXBlPnhtbDwvbGVueWE6Y29udGVudFR5cGU+Ci0gIDxsZW55YTptaW1lVHlwZT5hcHBsaWNhdGlvbi94aHRtbCt4bWw8L2xlbnlhOm1pbWVUeXBlPgotPC9sZW55YTppbnRlcm5hbD4KLTxsZW55YTpkYz4KLSAgICAgICAgPGRjOnRpdGxlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+V2VsY29tZSB0byB0aGUgTGVueWEgZGVmYXVsdCBwdWJsaWNhdGlvbjwvZGM6dGl0bGU+Ci0gICAgICAgIDxkYzpjcmVhdG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgRGV2ZWxvcG1lbnQgVGVhbTwvZGM6Y3JlYXRvcj4KLSAgICAgICAgPGRjOnN1YmplY3QgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBkZWZhdWx0IHB1YmxpY2F0aW9uPC9kYzpzdWJqZWN0PgotICAgICAgICA8ZGM6ZGVzY3JpcHRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5UaGUgc3RhcnQgcGFnZSBvZiB0aGUgTGVueWEgZGVmYXVsdCBwdWJsaWNhdGlvbjwvZGM6ZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkYzpwdWJsaXNoZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvZGM6cHVibGlzaGVyPgotICAgICAgICA8ZGM6Y29udHJpYnV0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiAvPgotICAgICAgICA8ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDUtMDEtMzE8L2RjOmRhdGU+Ci0gICAgICAgIDxkYzp0eXBlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOmZvcm1hdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzppZGVudGlmaWVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOnNvdXJjZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIC8+Ci0gICAgICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmVuPC9kYzpsYW5ndWFnZT4KLSAgICAgICAgPGRjOnJlbGF0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOmNvdmVyYWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4KLSAgICAgICAgPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFsbCByaWdodHMgcmVzZXJ2ZWQ8L2RjOnJpZ2h0cz4KLTwvbGVueWE6ZGM+Ci08L2xlbnlhOm1ldGE+Ci08L2xlbnlhOmRvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbGlua3MvaW5kZXhfZGUgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9saW5rcy9pbmRleF9kZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxZDBkMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9saW5rcy9pbmRleF9kZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxsaW5rcyB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvcHVicy9kZWZhdWx0LzEuMCI+Ci0gIDx0aXRsZT5MaW5rcyB6dSBBcGFjaGUgTGVueWE8L3RpdGxlPgotICA8bGluayBocmVmPSJodHRwOi8vbGVueWEuYXBhY2hlLm9yZy8iPkFwYWNoZSBMZW55YSBXZWJzaXRlPC9saW5rPgotICA8bGluayBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2xlbnlhLyI+QXBhY2hlIExlbnlhIFdpa2k8L2xpbms+Ci08L2xpbmtzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbGlua3MvaW5kZXhfZGUubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2xpbmtzL2luZGV4X2RlLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzRiNGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbGlua3MvaW5kZXhfZGUubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogaW5kZXhfZW4ubWV0YSA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgLS0+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+bGlua3M8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIGxpbmtzPC9kYzp0aXRsZT4KLSAgICAgICAgPGRjOmNyZWF0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBEZXZlbG9wbWVudCBUZWFtPC9kYzpjcmVhdG9yPgotPC9sZW55YTpkYz4KLTwvbGVueWE6bWV0YT4KLTwvbGVueWE6ZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9saW5rcy9pbmRleF9lbiBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2xpbmtzL2luZGV4X2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjcyNWI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L2xpbmtzL2luZGV4X2VuCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPGxpbmtzIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9wdWJzL2RlZmF1bHQvMS4wIj4KLSAgPHRpdGxlPkFwYWNoZSBMZW55YSBMaW5rczwvdGl0bGU+Ci0gIDxsaW5rIGhyZWY9Imh0dHA6Ly9sZW55YS5hcGFjaGUub3JnLyI+QXBhY2hlIExlbnlhIFdlYnNpdGU8L2xpbms+Ci0gIDxsaW5rIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbGVueWEvIj5BcGFjaGUgTGVueWEgV2lraTwvbGluaz4KLTwvbGlua3M+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9saW5rcy9pbmRleF9lbi5tZXRhIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbGlua3MvaW5kZXhfZW4ubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiZGE2Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9saW5rcy9pbmRleF9lbi5tZXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTxsZW55YTpkb2N1bWVudCB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLTxsZW55YTptZXRhPgotPGxlbnlhOmludGVybmFsPgotPGxlbnlhOnJlc291cmNlVHlwZT5saW5rczwvbGVueWE6cmVzb3VyY2VUeXBlPgotPGxlbnlhOmNvbnRlbnRUeXBlPnhtbDwvbGVueWE6Y29udGVudFR5cGU+Ci0gIDxsZW55YTptaW1lVHlwZT5hcHBsaWNhdGlvbi94bWw8L2xlbnlhOm1pbWVUeXBlPgotPC9sZW55YTppbnRlcm5hbD4KLTxsZW55YTpkYz4KLSAgICAgICAgPGRjOnRpdGxlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgbGlua3M8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci08L2xlbnlhOmRjPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5kZXhfZGUgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9uZXdzL2luZGV4X2RlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGM4N2VhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5kZXhfZGUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29sOmNvbGxlY3Rpb24geG1sbnM6Y29sPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY29sbGVjdGlvbi8xLjAiIHR5cGU9ImNoaWxkcmVuIiBpbmNsdWRlSXRlbXM9IjMiLz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5kZXhfZGUubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5kZXhfZGUubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0MTEwNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9uZXdzL2luZGV4X2RlLm1ldGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IGluZGV4X2VuLm1ldGEgNDczODYxIDIwMDYtMTEtMTIgMDM6NTE6MTRaIGdyZWdvciAkIC0tPgotPGxlbnlhOmRvY3VtZW50IHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotPGxlbnlhOm1ldGE+Ci08bGVueWE6aW50ZXJuYWw+Ci08bGVueWE6cmVzb3VyY2VUeXBlPm5ld3M8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPk5ld3M8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci0gICAgICAgIDxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TmV3czwvZGM6c3ViamVjdD4KLSAgICAgICAgPGRjOmRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QSBuZXdzIHBhZ2U8L2RjOmRlc2NyaXB0aW9uPgotICAgICAgICA8ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2RjOnB1Ymxpc2hlcj4KLSAgICAgICAgPGRjOmNvbnRyaWJ1dG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDctMDMtMjIgMTU6NTM6MjU8L2RjOmRhdGU+Ci0gICAgICAgIDxkYzp0eXBlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Zm9ybWF0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6aWRlbnRpZmllciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnNvdXJjZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmxhbmd1YWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ZGU8L2RjOmxhbmd1YWdlPgotICAgICAgICA8ZGM6cmVsYXRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpjb3ZlcmFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFsbCByaWdodHMgcmVzZXJ2ZWQ8L2RjOnJpZ2h0cz4KLTwvbGVueWE6ZGM+Ci08L2xlbnlhOm1ldGE+Ci08L2xlbnlhOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5kZXhfZW4gYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9uZXdzL2luZGV4X2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGM4N2VhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5kZXhfZW4KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29sOmNvbGxlY3Rpb24geG1sbnM6Y29sPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY29sbGVjdGlvbi8xLjAiIHR5cGU9ImNoaWxkcmVuIiBpbmNsdWRlSXRlbXM9IjMiLz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5kZXhfZW4ubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5kZXhfZW4ubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjNmM4Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9uZXdzL2luZGV4X2VuLm1ldGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLSAkSWQ6IGluZGV4X2VuLm1ldGEgNDczODYxIDIwMDYtMTEtMTIgMDM6NTE6MTRaIGdyZWdvciAkIC0tPgotPGxlbnlhOmRvY3VtZW50IHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotPGxlbnlhOm1ldGE+Ci08bGVueWE6aW50ZXJuYWw+Ci08bGVueWE6cmVzb3VyY2VUeXBlPm5ld3M8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPk5ld3M8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci0gICAgICAgIDxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TmV3czwvZGM6c3ViamVjdD4KLSAgICAgICAgPGRjOmRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QSBuZXdzIHBhZ2U8L2RjOmRlc2NyaXB0aW9uPgotICAgICAgICA8ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2RjOnB1Ymxpc2hlcj4KLSAgICAgICAgPGRjOmNvbnRyaWJ1dG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDctMDMtMjIgMTU6NTM6MjU8L2RjOmRhdGU+Ci0gICAgICAgIDxkYzp0eXBlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Zm9ybWF0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6aWRlbnRpZmllciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnNvdXJjZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmxhbmd1YWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ZW48L2RjOmxhbmd1YWdlPgotICAgICAgICA8ZGM6cmVsYXRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpjb3ZlcmFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFsbCByaWdodHMgcmVzZXJ2ZWQ8L2RjOnJpZ2h0cz4KLTwvbGVueWE6ZGM+Ci08L2xlbnlhOm1ldGE+Ci08L2xlbnlhOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5zdGFsbGVkL2luZGV4X2RlIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbmV3cy9pbnN0YWxsZWQvaW5kZXhfZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5Y2I2MDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbmV3cy9pbnN0YWxsZWQvaW5kZXhfZGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci0KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGluZGV4X2VuIDQ3Mzg2MSAyMDA2LTExLTEyIDAzOjUxOjE0WiBncmVnb3IgJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPkxlbnlhIGVyZm9sZ3JlaWNoIGluc3RhbGxpZXJ0PC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgCi0gICAgPGgxPkxlbnlhIGVyZm9sZ3JlaWNoIGluc3RhbGxpZXJ0PC9oMT4KLQotICAgIDxwPkhlcnpsaWNoZW4gR2zDvGNrd3Vuc2NoLCBTaWUgaGFiZW4gTGVueWEgZXJmb2xncmVpY2ggaW5zdGFsbGllcnQgdW5kIGRlbiBCZWlzcGllbC1JbmhhbHQgaW1wb3J0aWVydCE8L3A+Ci0KLSAgICA8cD5EaWVzZXIgVGV4dCB3aXJkIG5pY2h0IGF1ZiBkZXIgTmV3cy3DnGJlcnNpY2h0IGVyc2NoZWluZW4sIGRhIGRvcnQgbnVyIGRlciBlcnN0ZSBBYnNhdHogZGFyZ2VzdGVsbHQgd2lyZC48L3A+Ci0KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbmV3cy9pbnN0YWxsZWQvaW5kZXhfZGUubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5zdGFsbGVkL2luZGV4X2RlLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDM1ZmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbmV3cy9pbnN0YWxsZWQvaW5kZXhfZGUubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogaW5kZXhfZW4ubWV0YSA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgLS0+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+eGh0bWw8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veGh0bWwreG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIGVyZm9sZ3JlaWNoIGluc3RhbGxpZXJ0PC9kYzp0aXRsZT4KLSAgICAgICAgPGRjOmNyZWF0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBEZXZlbG9wbWVudCBUZWFtPC9kYzpjcmVhdG9yPgotICAgICAgICA8ZGM6c3ViamVjdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIGVyZm9sZ3JlaWNoIGluc3RhbGxpZXJ0PC9kYzpzdWJqZWN0PgotICAgICAgICA8ZGM6ZGVzY3JpcHRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BIG5ld3MgbWVzc2FnZS48L2RjOmRlc2NyaXB0aW9uPgotICAgICAgICA8ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2RjOnB1Ymxpc2hlcj4KLSAgICAgICAgPGRjOmNvbnRyaWJ1dG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6ZGF0ZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjIwMDctMDMtMjIgMTU6NTQ6MzU8L2RjOmRhdGU+Ci0gICAgICAgIDxkYzp0eXBlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Zm9ybWF0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6aWRlbnRpZmllciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnNvdXJjZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmxhbmd1YWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ZGU8L2RjOmxhbmd1YWdlPgotICAgICAgICA8ZGM6cmVsYXRpb24geG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpjb3ZlcmFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFsbCByaWdodHMgcmVzZXJ2ZWQ8L2RjOnJpZ2h0cz4KLTwvbGVueWE6ZGM+Ci08L2xlbnlhOm1ldGE+Ci08L2xlbnlhOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5zdGFsbGVkL2luZGV4X2VuIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbmV3cy9pbnN0YWxsZWQvaW5kZXhfZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNGZlYjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbmV3cy9pbnN0YWxsZWQvaW5kZXhfZW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAoteG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci0KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGluZGV4X2VuIDQ3Mzg2MSAyMDA2LTExLTEyIDAzOjUxOjE0WiBncmVnb3IgJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPkxlbnlhIFN1Y2Nlc3NmdWxseSBJbnN0YWxsZWQ8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAKLSAgICA8aDE+TGVueWEgU3VjY2Vzc2Z1bGx5IEluc3RhbGxlZDwvaDE+Ci0KLSAgICA8cD5Db25ncmF0dWxhdGlvbnMsIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgTGVueWEgYW5kIGltcG9ydGVkIHRoZSBleGFtcGxlIGNvbnRlbnQhPC9wPgotCi0gICAgPHA+VGhpcyB0ZXh0IHdpbGwgbm90IGFwcGVhciBpbiB0aGUgbmV3cyBvdmVydmlldywgc2luY2Ugb25seSB0aGUgZmlyc3QgcGFyYWdyYXBoIGlzIGRpc3BsYXllZCB0aGVyZS48L3A+Ci0KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbmV3cy9pbnN0YWxsZWQvaW5kZXhfZW4ubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L25ld3MvaW5zdGFsbGVkL2luZGV4X2VuLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTg0OTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvbmV3cy9pbnN0YWxsZWQvaW5kZXhfZW4ubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZDogaW5kZXhfZW4ubWV0YSA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgLS0+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+eGh0bWw8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veGh0bWwreG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIFN1Y2Nlc3NmdWxseSBJbnN0YWxsZWQ8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci0gICAgICAgIDxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgU3VjY2Vzc2Z1bGx5IEluc3RhbGxlZDwvZGM6c3ViamVjdD4KLSAgICAgICAgPGRjOmRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QSBuZXdzIG1lc3NhZ2UuPC9kYzpkZXNjcmlwdGlvbj4KLSAgICAgICAgPGRjOnB1Ymxpc2hlciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9kYzpwdWJsaXNoZXI+Ci0gICAgICAgIDxkYzpjb250cmlidXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA3LTAzLTIyIDE1OjU0OjM1PC9kYzpkYXRlPgotICAgICAgICA8ZGM6dHlwZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmZvcm1hdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmlkZW50aWZpZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpzb3VyY2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmVuPC9kYzpsYW5ndWFnZT4KLSAgICAgICAgPGRjOnJlbGF0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Y292ZXJhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BbGwgcmlnaHRzIHJlc2VydmVkPC9kYzpyaWdodHM+Ci08L2xlbnlhOmRjPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9zZWFyY2gvaW5kZXhfZGUgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9zZWFyY2gvaW5kZXhfZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDg4ZWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvc2VhcmNoL2luZGV4X2RlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVzZWNhc2UgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL3VzZWNhc2UvMS4wIiBuYW1lPSJsdWNlbmUuc2VhcmNoIi8+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9zZWFyY2gvaW5kZXhfZGUubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3NlYXJjaC9pbmRleF9kZS5tZXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjA5NTU3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3NlYXJjaC9pbmRleF9kZS5tZXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsZW55YTpkb2N1bWVudCB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLTxsZW55YTptZXRhPgotPGxlbnlhOmN1c3RvbT4KLTxsZW55YTpteU1ldGEvPgotPC9sZW55YTpjdXN0b20+Ci08bGVueWE6ZGM+Ci08ZGM6dGl0bGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5TdWNoZTwvZGM6dGl0bGU+Ci08ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmxlbnlhPC9kYzpjcmVhdG9yPgotPGRjOnN1YmplY3QgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci08ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA2LTA2LTEyIDEzOjQzOjE0PC9kYzpkYXRlPgotPGRjOmxhbmd1YWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ZGU8L2RjOmxhbmd1YWdlPgotPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLTwvbGVueWE6ZGM+Ci08bGVueWE6aW50ZXJuYWw+Ci08bGVueWE6cmVzb3VyY2VUeXBlPnVzZWNhc2U8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotPGxlbnlhOmV4dGVuc2lvbj54bWw8L2xlbnlhOmV4dGVuc2lvbj4KLSAgPGxlbnlhOm1pbWVUeXBlPmFwcGxpY2F0aW9uL3htbDwvbGVueWE6bWltZVR5cGU+Ci08L2xlbnlhOmludGVybmFsPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3NlYXJjaC9pbmRleF9lbiBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3NlYXJjaC9pbmRleF9lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwODhlYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9zZWFyY2gvaW5kZXhfZW4KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dXNlY2FzZSB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvdXNlY2FzZS8xLjAiIG5hbWU9Imx1Y2VuZS5zZWFyY2giLz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3NlYXJjaC9pbmRleF9lbi5tZXRhIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvc2VhcmNoL2luZGV4X2VuLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZWRlODguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvc2VhcmNoL2luZGV4X2VuLm1ldGEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxlbnlhOmRvY3VtZW50IHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotPGxlbnlhOm1ldGE+Ci08bGVueWE6Y3VzdG9tPgotPGxlbnlhOm15TWV0YS8+Ci08L2xlbnlhOmN1c3RvbT4KLTxsZW55YTpkYz4KLTxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPlNlYXJjaDwvZGM6dGl0bGU+Ci08ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmxlbnlhPC9kYzpjcmVhdG9yPgotPGRjOnN1YmplY3QgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci08ZGM6cHVibGlzaGVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA2LTA2LTEyIDEzOjQzOjE0PC9kYzpkYXRlPgotPGRjOmxhbmd1YWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ZW48L2RjOmxhbmd1YWdlPgotPGRjOnJpZ2h0cyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLTwvbGVueWE6ZGM+Ci08bGVueWE6aW50ZXJuYWw+Ci08bGVueWE6cmVzb3VyY2VUeXBlPnVzZWNhc2U8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotPGxlbnlhOmV4dGVuc2lvbj54bWw8L2xlbnlhOmV4dGVuc2lvbj4KLSAgPGxlbnlhOm1pbWVUeXBlPmFwcGxpY2F0aW9uL3htbDwvbGVueWE6bWltZVR5cGU+Ci08L2xlbnlhOmludGVybmFsPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3NpdGV0cmVlLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3NpdGV0cmVlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5NjVkMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC9zaXRldHJlZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgaTE4bjphdHRyPSJsYWJlbCIgbGFiZWw9IkF1dGhvcmluZyIKLSAgICB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3NpdGV0cmVlLzEuMCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0KLSAgICAgICAgImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9zaXRldHJlZS8xLjAKLSAgICAgICAgLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2VudGl0aWVzL3NpdGV0cmVlLnhzZCIKLSAgICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0+Ci0gICAgCi0gIDxub2RlIGlkPSJpbmRleCI+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJlbiI+SG9tZTwvbGFiZWw+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJkZSI+SG9tZTwvbGFiZWw+Ci0gIDwvbm9kZT4KLSAgCi0gIDxub2RlIGlkPSJ0dXRvcmlhbCI+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJlbiI+VHV0b3JpYWw8L2xhYmVsPgotICAgIDxsYWJlbCB4bWw6bGFuZz0iZGUiPlR1dG9yaWFsPC9sYWJlbD4KLSAgPC9ub2RlPgotCi0gIDxub2RlIGlkPSJjb25jZXB0cyI+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJlbiI+Q29uY2VwdHM8L2xhYmVsPgotICAgIDxsYWJlbCB4bWw6bGFuZz0iZGUiPktvbnplcHRlPC9sYWJlbD4KLSAgPC9ub2RlPgotCi0gIDxub2RlIGlkPSJsaW5rcyI+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJlbiI+QXBhY2hlIExlbnlhIExpbmtzPC9sYWJlbD4KLSAgICA8bGFiZWwgeG1sOmxhbmc9ImRlIj5MaW5rcyB6dSBBcGFjaGUgTGVueWE8L2xhYmVsPgotICA8L25vZGU+Ci0gIAotICA8bm9kZSBpZD0iZmVhdHVyZXMiPgotICAgIDxsYWJlbCB4bWw6bGFuZz0iZW4iPkZlYXR1cmVzPC9sYWJlbD4KLSAgICA8bGFiZWwgeG1sOmxhbmc9ImRlIj5GdW5rdGlvbmVuPC9sYWJlbD4KLSAgPC9ub2RlPgotCi0gIDxub2RlIGlkPSJkb2N0eXBlcyI+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJlbiI+UmVzb3VyY2UgVHlwZSBFeGFtcGxlczwvbGFiZWw+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJkZSI+QmVpc3BpZWxlIGbDvHIgUmVzc291cmNlLVR5cGVuPC9sYWJlbD4KLQotICAgIDxub2RlIGlkPSJ4aHRtbC1kb2N1bWVudCI+Ci0gICAgICA8bGFiZWwgeG1sOmxhbmc9ImVuIj5YSFRNTCBSZXNvdXJjZSBUeXBlPC9sYWJlbD4KLSAgICAgIDxsYWJlbCB4bWw6bGFuZz0iZGUiPlhIVE1MLVJlc3NvdXJjZS1UeXA8L2xhYmVsPgotICAgIDwvbm9kZT4KLQotICAgIDxub2RlIGlkPSJsaW5rcyI+Ci0gICAgICA8bGFiZWwgeG1sOmxhbmc9ImVuIj5MaW5rcyBSZXNvdXJjZSBUeXBlPC9sYWJlbD4KLSAgICAgIDxsYWJlbCB4bWw6bGFuZz0iZGUiPkxpbmtzLVJlc3NvdXJjZS1UeXA8L2xhYmVsPgotICAgIDwvbm9kZT4KLQotICAgIDxub2RlIGlkPSJvcGVuZG9jdW1lbnQiPgotICAgICAgPGxhYmVsIHhtbDpsYW5nPSJlbiI+T3BlbkRvY3VtZW50IFJlc291cmNlIFR5cGU8L2xhYmVsPgotICAgICAgPGxhYmVsIHhtbDpsYW5nPSJkZSI+T3BlbkRvY3VtZW50LVJlc3NvdXJjZS1UeXA8L2xhYmVsPgotICAgIDwvbm9kZT4KLQotICAgIDxub2RlIGlkPSJjZm9ybXMiIHZpc2libGVpbm5hdj0idHJ1ZSI+Ci0gICAgICA8bGFiZWwgeG1sOmxhbmc9ImVuIj5DRm9ybXMgUmVzb3VyY2UgVHlwZTwvbGFiZWw+Ci0gICAgICA8bGFiZWwgeG1sOmxhbmc9ImRlIj5DRm9ybXMtUmVzc291cmNlLVR5cDwvbGFiZWw+Ci0gICAgPC9ub2RlPgotIDwvbm9kZT4KLQotICA8bm9kZSBpZD0ic2VhcmNoIiB2aXNpYmxlaW5uYXY9ImZhbHNlIj4KLSAgICA8bGFiZWwgeG1sOmxhbmc9ImVuIj5TZWFyY2g8L2xhYmVsPgotICAgIDxsYWJlbCB4bWw6bGFuZz0iZGUiPlN1Y2hlPC9sYWJlbD4KLSAgPC9ub2RlPgotICAKLSAgPG5vZGUgaWQ9Im5ld3MiIHZpc2libGVpbm5hdj0idHJ1ZSI+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJlbiI+TmV3czwvbGFiZWw+Ci0gICAgPGxhYmVsIHhtbDpsYW5nPSJkZSI+TmV3czwvbGFiZWw+Ci0gICAgPG5vZGUgaWQ9Imluc3RhbGxlZCIgdmlzaWJsZWlubmF2PSJmYWxzZSI+Ci0gICAgICA8bGFiZWwgeG1sOmxhbmc9ImVuIj5MZW55YSBpbnN0YWxsZWQ8L2xhYmVsPgotICAgICAgPGxhYmVsIHhtbDpsYW5nPSJkZSI+TGVueWEgaW5zdGFsbGllcnQ8L2xhYmVsPgotICAgIDwvbm9kZT4KLSAgPC9ub2RlPgotICAKLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3R1dG9yaWFsL2luZGV4X2RlIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvdHV0b3JpYWwvaW5kZXhfZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjlmMDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvdHV0b3JpYWwvaW5kZXhfZGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPkxlbnlhIFR1dG9yaWFsPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+VHV0b3JpYWw8L2gxPgotCi0gICAgPHA+RGFzIGZvbGdlbmRlIFR1dG9yaWFsIGdpYnQgZWluZSBrdXJ6ZSBFaW5mw7xocnVuZyBpbiBkYXMgQ29udGVudCBNYW5hZ2VtZW50Ci0gICAgU3lzdGVtIEFwYWNoZSBMZW55YS4gV2lyIGJldHJhY2h0ZW4gdHlwaXNjaGUgQW53ZW5kdW5nc2bDpGxsZSwKLSAgICB3aWUgenVtIEJlaXNwaWVsIGVpbiBuZXVlcyBEb2t1bWVudCBlcnN0ZWxsZW4sIGJlYXJiZWl0ZW4gdW5kIHB1YmxpemllcmVuLjwvcD4KLQotICAgIDxoMj5FaW4gbmV1ZXMgRG9rdW1lbnQgZXJzdGVsbGVuPC9oMj4KLSAgICAKLSAgICA8cD4KLSAgICAgIFVtIGVpbiBuZXVlcyBEb2t1bWVudCB6dSBlcnN0ZWxsZW4sIGtsaWNrZW4gU2llIGF1ZiBkZW4gTWVuw7xwdW5rdAotICAgICAgPGVtPkRhdGVpIC0+IE5ldWVzIFhIVE1MLURva3VtZW50PC9lbT4uIFNpZSBlcmhhbHRlbiBlaW4gRm9ybXVsYXIsCi0gICAgICBkYXMgU2llIGF1ZmZvcmRlcnQsIGVpbmVuIEtub3Rlbi1OYW1lbiB1bmQgTmF2aWdhdGlvbnN0aXRlbCBmw7xyIGRhcwotICAgICAgbmV1ZSBEb2t1bWVudCBlaW56dWdlYmVuLiBEZXIgS25vdGVuLU5hbWUgd2lyZCB6dXIgSWRlbnRpZmlrYXRpb24gZGVzCi0gICAgICBEb2t1bWVudGVzIGluIGRlciBVUkwgdmVyd2VuZGV0LiBEZXIgTmF2aWdhdGlvbnN0aXRlbCB3aXJkIGxpbmtzIGltCi0gICAgICBNZW7DvCBlcnNjaGVpbmVuLgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIEdlYmVuIFNpZSAiaGVsbG93b3JsZCIgYWxzIEtub3Rlbi1OYW1lIHVuZCAiSGVsbG8gV29ybGQiIGFscyBOYXZpZ2F0aW9uc3RpdGVsCi0gICAgICBlaW4gdW5kIGtsaWNrZW4gU2llIGF1ZiBkZW4gIkVyc3RlbGxlbiItQnV0dG9uLiBTaWUgd2VyZGVuIHp1ciBuZXUgZXJzdGVsbHRlbgotICAgICAgIkhlbGxvIFdvcmxkIi1TZWl0ZSB3ZWl0ZXJnZWxlaXRldC4gTGlua3MgaW0gTmF2aWdhdGlvbnNtZW7DvCBrw7ZubmVuIFNpZQotICAgICAgZGVuIG5ldWVuIEVpbnRyYWcgc2VoZW4uIERhIFNpZSBpbSAiRXJzdGVsbGVuIi1Gb3JtdWxhciBkaWUgU3RhbmRhcmQtRWluc3RlbGx1bmcKLSAgICAgICJjaGlsZCIgZ2V3w6RobHQgaGFiZW4sIHd1cmRlIGRhcyBuZXVlIERva3VtZW50IGFscyBLaW5kLURva3VtZW50IGRlcwotICAgICAgQXVzZ2FuZ3MtRG9rdW1lbnRlcyBlaW5nZWbDvGd0LgotICAgIDwvcD4KLQotICAgIDxoMj5FaW4gRG9rdW1lbnQgYmVhcmJlaXRlbjwvaDI+Ci0gICAgCi0gICAgPHA+Ci0gICAgICBXaWUgU2llIHNlaGVuIGVudGjDpGx0IGRhcyAiSGVsbG8gV29ybGQiLURva3VtZW50IGJlcmVpdHMgZWluIHdlbmlnCi0gICAgICBCZWlzcGllbC1JbmhhbHQuIFVtIGRpZXNlbiB6dSDDpG5kZXJuLCBrw7ZubmVuIFNpZSBkYXMgRG9rdW1lbnQgbWl0IGVpbmVtCi0gICAgICBkZXIgZWluZ2ViYXV0ZW4gRWRpdG9yZW4gYmVhcmJlaXRlbjoKLSAgICA8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+S3VwdTogRWluZSBndXRlIFdhaGwgZsO8ciBJbnRlcm5ldC1FeHBsb3Jlci1OdXR6ZXIuPC9saT4KLSAgICAgIDxsaT5CWEU6IEVpbmUgZ3V0ZSBXYWhsIGbDvHIgRmlyZWZveC1OdXR6ZXIuPC9saT4KLSAgICAgIDxsaT5Gb3Jtd2l6YXJkOiBFaW5lIGd1dGUgV2FobCBmw7xyIE1vc2FpYy1OdXR6ZXIuIDstKTwvbGk+Ci0gICAgICA8bGk+Rm9ybXVsYXJlZGl0b3I6IEbDvHIgTnV0emVyLCBkaWUgZGllIHZvbGxlIEtvbnRyb2xsZSBiZW7DtnRpZ2VuLjwvbGk+Ci0gICAgPC91bD4KLSAgICAKLSAgICA8cD4KLSAgICAgIFfDpGhsZW4gU2llIGVpbmVuIEVkaXRvciBhdXMgZGVtICJCZWFyYmVpdGVuIi1NZW7DvCAoYWJow6RuZ2lnIHZvbiBJaHJlciBQbGF0dGZvcm0pCi0gICAgICB1bmQgYmVnaW5uZW4gU2llLCBkYXMgbmV1IGVyc3RlbGx0ZSBEb2t1bWVudCB6dSBiZWFyYmVpdGVuLgotICAgICAgSW4gZGllc2VtIEJlaXNwaWVsIHZlcndlbmRlbiB3aXIgZGVuIEJYRS1FZGl0b3IuCi0gICAgICBEYXMgTGVueWEtTWVuw7wgd2lyZCB2ZXJzY2h3aW5kZW4gdW5kIGRlciBCWEUtVG9vbGJhciBlcnNjaGVpbnQgc3RhdHRkZXNzZW4uCi0gICAgICBNaXQgZGVyIHJlY2h0ZW4gTWF1c3Rhc3RlIGVyaGFsdGVuIFNpZSBlaW4gS29udGV4dC1NZW7DvCwKLSAgICAgIG1pdCBIaWxmZSBkZXNzZW4gU2llIFRleHRiYXVzdGVpbmUga29waWVyZW4sIGF1c3NjaG5laWRlbiB1bmQgZWluZsO8Z2VuIGvDtm5uZW4uCi0gICAgICBTaWUga8O2bm5lbiBhdWNoIG5ldWUgRWxlbWVudGUgbWl0dGVscyBkZXMgS29udGV4dC1NZW7DvHMgaW4gZGFzIERva3VtZW50Ci0gICAgICBlaW5mw7xnZW4uIFNvYmFsZCBTaWUgaWhyZSDDhG5kZXJ1bmdlbiBhYmdlc2NobG9zc2VuIGhhYmVuLCBrbGlja2VuIFNpZSBhdWYKLSAgICAgICJTYXZlICZhbXA7IEV4aXQiIHVtIHp1csO8Y2sgenVyIExlbnlhLUFuc2ljaHQgZGVzIERva3VtZW50ZXMgenUgZ2VsYW5nZW4uCi0gICAgICBEb3J0IGvDtm5uZW4gU2llIElocmUgw4RuZGVydW5nZW4gYmV0cmFjaHRlbi4KLSAgICA8L3A+Ci0KLSAgICA8aDI+RWluIERva3VtZW50IHZlcsO2ZmZlbnRsaWNoZW48L2gyPgotICAgIAotICAgIDxwPgotICAgICAgU29iYWxkIFNpZSBtaXQgZGVtIEluaGFsdCBJaHJlcyBEb2t1bWVudGVzIHp1ZnJpZWRlbiBzaW5kLCBrw7ZubmVuIFNpZQotICAgICAgZXMgcHVibGl6aWVyZW4sIHVtIGVzIGluIGRlciBMaXZlLVVtZ2VidW5nIHNpY2h0YmFyIHp1IG1hY2hlbi4KLSAgICA8L3A+Ci0KLSAgICA8aDM+V29ya2Zsb3c8L2gzPgotICAgIAotICAgIDxwPgotICAgICAgRGllIERlZmF1bHQtUHVibGlrYXRpb24gdmVyd2VuZGV0IGVpbmVuIGVpbmZhY2hlbiBXb3JrZmxvdywgZGVyIGRpZSBSb2xsZW4KLSAgICAgIGVpbmVzIEVkaXRvcnMgdW5kIGVpbmVuIFByw7xmZXJzIGludm9sdmllcnQuIERlciBFZGl0b3IgZXJzdGVsbHQgdW5kCi0gICAgICBiZWFyYmVpdGV0IG5ldWUgRG9rdW1lbnRlIHVuZCByZWljaHQgc2llIHp1ciBQcsO8ZnVuZyBlaW4uIERlciBQcsO8ZmVyCi0gICAgICDDvGJlcnByw7xmdCBkYXMgRG9rdW1lbnQgdW5kIHB1YmxpemllcnQgZXMsIHNvIGRhc3MgZXMgYXVmIGRlciBMaXZlLVdlYnNpdGUKLSAgICAgIGVyc2NoZWludC4gCi0gICAgPC9wPgotICAgIAotICAgIDxwPgotICAgICAgRGVyIE51dHplciA8ZW0+bGVueWE8L2VtPiwgbWl0IGRlbSBTaWUgc2ljaCB3YWhyc2NoZWlubGljaCBlaW5nZWxvZ2d0Ci0gICAgICBoYWJlbiwgYmVzaXR6dCBkaWUgRWRpdG9yLVJvbGxlLCBkLmguIGVyIGthbm4gbmV1ZSBEb2t1bWVudGUgZXJzdGVsbGVuIHVuZAotICAgICAgenVyIFByw7xmdW5nIGVpbnJlaWNoZW4uIERpZSBOdXR6ZXJpbiA8ZW0+YWxpY2U8L2VtPiBiZXNpdHp0IGRpZSBQcsO8ZmVyLVJvbGxlLAotICAgICAgZGllIGVzIGlociBlcmxhdWJ0LCBEb2t1bWVudGUgenUgcHLDvGZlbiB1bmQgenUgcHVibGl6aWVyZW4uCi0gICAgPC9wPgotICAgIAotICAgIDxwPgotICAgICAgVW0gSWhyIG5ldSBlcnN0ZWxsdGVzIERva3VtZW50IHp1IHZlcsO2ZmZlbnRsaWNoZW4sIGxvZ2dlbiBTaWUgc2ljaCAoZmFsbHMKLSAgICAgIG7DtnRpZykgYWxzIE51dHplciA8ZW0+bGVueWE8L2VtPiBlaW4gdW5kIGtsaWNrZW4gU2llIGF1ZiBkZW4gTWVuw7xwdW5rdAotICAgICAgPGVtPkFyYmVpdHNmbHVzcyAtPiBFaW5yZWljaGVuPC9lbT4uIExvZ2dlbiBTaWUgc2ljaCBudW4gYXVzICg8ZW0+RGF0ZWkKLSAgICAgIC0+IEFibWVsZGVuPC9lbT4pIHVuZCBsb2dnZW4gU2llIHNpY2ggYWxzIE51dHplciA8ZW0+YWxpY2U8L2VtPiBlaW4uCi0gICAgICBOdW4ga8O2bm5lbiBTaWUgZGFzIERva3VtZW50IG1pdHRlbHMgZGVzIE1lbsO8cHVua3RzIDxlbT5BcmJlaXRzZmx1c3MgLT4KLSAgICAgIFB1YmxpemllcmVuPC9lbT4gdmVyw7ZmZmVudGxpY2hlbi4gR2VnZWJlbmVuZmFsbHMgd2VyZGVuIFNpZSBhdWYgZGVtCi0gICAgICBCZXN0w6R0aWd1bmdzLUJpbGRzY2hpcm0gZGFyYXVmIGhpbmdld2llc2VuLCBkYXNzIGRpZSB6dWVyc3QgZGFzIMO8YmVyZ2VvcmRuZXRlCi0gICAgICBEb2t1bWVudCBwdWJsaXppZXJlbiBtw7xzc2VuLCBkYSBlcyBzaWNoIG5vY2ggbmljaHQgaW4gZGVyIExpdmUtQXJlYQotICAgICAgYmVmaW5kZXQuIFVtIHp1IHNlaGVuLCB3aWUgZGFzIERva3VtZW50IGluIGRlciBMaXZlLUFuc2ljaHQgYXVzc2llaHQsCi0gICAgICBrbGlja2VuIFNpZSBhdWYgZGVuICJMaXZlIi1SZWl0ZXIgaW0gTGVueWEtTWVuw7wuIERpZXNlciB3aXJkIGVpbiBuZXVlcwotICAgICAgQnJvd3Nlci1GZW5zdGVyIGJ6dy4gLVRhYiDDtmZmbmVuLCBkYXMgSWhuZW4gZGllIFNlaXRlIGluIGRlciBMaXZlLUFyZWEKLSAgICAgIHplaWd0LgotICAgIDwvcD4KLQotICAgIDxoMj5aZWl0c3RldWVydW5nPC9oMj4KLSAgICAKLSAgICA8cD4KLSAgICAgIEFwYWNoZSBMZW55YSBlcmxhdWJ0IGVzLCBlaW4gRG9rdW1lbnQgenUgZWluZW0gc3BlemlmaXNjaGVuIFplaXRwdW5rdCB6dQotICAgICAgdmVyw7ZmZmVudGxpY2hlbi4gV8OkaGxlbiBTaWUgZGF6dSBkZW4gTWVuw7xwdW5rdCA8ZW0+QXJiZWl0c2ZsdXNzIC0+Ci0gICAgICBQdWJsaXppZXJlbjwvZW0+LiBBbnN0YXR0IGplZG9jaCB1bm1pdHRlbGJhciBhdWYgIlB1YmxpemllcmVuIiB6dSBrbGlja2VuLAotICAgICAgZ2ViZW4gU2llIHp1bsOkY2hzdCBlaW5lIFplaXQgZWluLCB6dSBkZXIgZGFzIERva3VtZW50IHZlcsO2ZmZlbnRsaWNodCB3ZXJkZW4KLSAgICAgIHNvbGwuIEltIFJlaXRlciAiWmVpdHN0ZXVlcnVuZyIgaW4gZGVyIFNpdGUtQXJlYSBlcmhhbHRlbiBTaWUgZWluZW4gw5xiZXJibGljawotICAgICAgw7xiZXIgZGllIGFuc3RlaGVuZGVuIEF1ZnRyw6RnZSB1bmQgZGVyZW4gU3RhdHVzLiAKLSAgICA8L3A+Ci0gICAgCi0gICAgPGgyPlZlcnNpb25pZXJ1bmc8L2gyPgotICAgIAotICAgIDxwPgotICAgICAgSmVkZXMgTWFsIHdlbm4gU2llIGVpbiBEb2t1bWVudCBlZGl0aWVyZW4gdW5kIGRlbiBFZGl0b3IgdmVybGFzc2VuLCB3aXJkCi0gICAgICBlaW5lIG5ldWUgUmV2aXNpb24gZGVzIERva3VtZW50ZXMgYW5nZWxlZ3QuIEFsdGUgUmV2aXNpb25lbiB3ZXJkZW4KLSAgICAgIGF1ZmJld2FocnQsIFNpZSBrw7ZubmVuIHNpZSBhdWYgZGVtIFJlaXRlciAiUmV2aXNpb25lbiIgaW4gZGVyIFNpdGUtQXJlYQotICAgICAgYmV0cmFjaHRlbiB1bmQgZ2dmLiBkYXMgRG9rdW1lbnQgZHVyY2ggZWluZSDDpGx0ZXJlIFJldmlzaW9uIGVyc2V0emVuLgotICAgIDwvcD4KLQotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC90dXRvcmlhbC9pbmRleF9kZS5tZXRhIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvdHV0b3JpYWwvaW5kZXhfZGUubWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhZjA1NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2V4YW1wbGUtY29udGVudC90dXRvcmlhbC9pbmRleF9kZS5tZXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkJCAtLT4KLTxsZW55YTpkb2N1bWVudCB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIj4KLTxsZW55YTptZXRhPgotPGxlbnlhOmludGVybmFsPgotPGxlbnlhOnJlc291cmNlVHlwZT54aHRtbDwvbGVueWE6cmVzb3VyY2VUeXBlPgotPGxlbnlhOmNvbnRlbnRUeXBlPnhtbDwvbGVueWE6Y29udGVudFR5cGU+Ci0gIDxsZW55YTptaW1lVHlwZT5hcHBsaWNhdGlvbi94aHRtbCt4bWw8L2xlbnlhOm1pbWVUeXBlPgotPC9sZW55YTppbnRlcm5hbD4KLTxsZW55YTpkYz4KLSAgICAgICAgPGRjOnRpdGxlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+RWluIGt1cnplcyBMZW55YSBUdXRvcmlhbDwvZGM6dGl0bGU+Ci0gICAgICAgIDxkYzpjcmVhdG9yIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgRGV2ZWxvcG1lbnQgVGVhbTwvZGM6Y3JlYXRvcj4KLSAgICAgICAgPGRjOnN1YmplY3QgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5MZW55YSBUdXRvcmlhbDwvZGM6c3ViamVjdD4KLSAgICAgICAgPGRjOmRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+RWluIGt1cnplcyBUdXRvcmlhbCB6dXIgQmVudXR6dW5nIHZvbiBMZW55YTwvZGM6ZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkYzpwdWJsaXNoZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvZGM6cHVibGlzaGVyPgotICAgICAgICA8ZGM6Y29udHJpYnV0b3IgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpkYXRlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+MjAwNS0wMS0zMTwvZGM6ZGF0ZT4KLSAgICAgICAgPGRjOnR5cGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpmb3JtYXQgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzppZGVudGlmaWVyIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6c291cmNlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6bGFuZ3VhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5kZTwvZGM6bGFuZ3VhZ2U+Ci0gICAgICAgIDxkYzpyZWxhdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmNvdmVyYWdlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6cmlnaHRzIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+QWxsZSBSZWNodGUgdm9yYmVoYWx0ZW48L2RjOnJpZ2h0cz4KLTwvbGVueWE6ZGM+Ci08L2xlbnlhOm1ldGE+Ci08L2xlbnlhOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3R1dG9yaWFsL2luZGV4X2VuIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvdHV0b3JpYWwvaW5kZXhfZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGMzY2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvdHV0b3JpYWwvaW5kZXhfZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLXhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiPgotCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPkxlbnlhIFR1dG9yaWFsPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8aDE+VHV0b3JpYWw8L2gxPgotCi0gICAgPHA+VGhpcyB0dXRvcmlhbCBnaXZlcyB5b3UgYSBzaG9ydCBpbnRyb2R1Y3Rpb24gaW50byB0aGUgQXBhY2hlCi0gICAgTGVueWEgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbS4gV2UnbGwgbG9vayBhdCBhIHR5cGljYWwgdXNlIGNhc2UKLSAgICB3aGVyZSB3ZSBjcmVhdGUgYSBuZXcgZG9jdW1lbnQsIGVkaXQgYW5kIHB1Ymxpc2ggaXQuPC9wPgotCi0gICAgPGgyPkNyZWF0aW5nIGEgbmV3IGRvY3VtZW50PC9oMj4KLQotICAgIDxwPlRvIGNyZWF0ZSBhIG5ldyBkb2N1bWVudCwgZ28gdG8gdGhlIDxjb2RlPkZpbGUgLT4gTmV3Ci0gICAgWEhUTUwgRG9jdW1lbnQ8L2NvZGU+IG1lbnUgZW50cnkuIFlvdSdsbCBnZXQgYSBuZXcgc2NyZWVuIHRoYXQgYXNrcyB5b3UKLSAgICBmb3IgYW4gaWQgYW5kIGEgbmFtZSBmb3IgdGhpcyBuZXcgZG9jdW1lbnQuIFRoZSBpZCB3aWxsIGJlIHVzZWQKLSAgICBpbnRlcm5hbGx5IGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkb2N1bWVudCBhbmQgdGhlIG5hbWUgd2lsbCBiZQotICAgIHVzZWQgaW4gdGhlIG5hdmlnYXRpb24uIExldCdzIHVzZSAiaGVsbG93b3JsZCIgYXMgaWQgYW5kICJIZWxsbyBXb3JsZCIgYXMgdGhlCi0gICAgbmFtZSBvZiB0aGUgbmV3IGRvY3VtZW50LiBOb3cgcHJlc3MgPGNvZGU+Q3JlYXRlPC9jb2RlPi4gWW91IHdpbGwKLSAgICBiZSByZWRpcmVjdGVkIGJhY2sgdG8gdGhlIHBhZ2Ugd2hlcmUgeW91IG9yaWdpbmFsbHkgaW52b2tlZCB0aGUKLSAgICBjcmVhdGlvbiBhbmQgeW91J2xsIG5vdGljZSB0aGF0IHRoZSBuZXcgZG9jdW1lbnQgIkhlbGxvIFdvcmxkIiBub3cgc2hvd3MKLSAgICB1cCBhcyBhIHN1Yi1kb2N1bWVudCBvZiB0aGUgVHV0b3JpYWwgZG9jdW1lbnQgaW4gdGhlCi0gICAgbmF2aWdhdGlvbi48L3A+Ci0KLSAgICA8cD5UaGlzIGlsbHVzdHJhdGVzIHRoZSBmYWN0IHRoYXQgYSBuZXcgZG9jdW1lbnQgaXMgYWx3YXlzIGNyZWF0ZWQKLSAgICBhcyBhIHN1Yi1kb2N1bWVudCBvZiB0aGUgZG9jdW1lbnQgeW91J3JlIGN1cnJlbnRseSBsb29raW5nIGF0LiBZb3UKLSAgICBhbHNvIG5vdGljZSBob3cgdGhlIG5hdmlnYXRpb24gaXMgYnVpbHQgYXV0b21hdGljYWxseS48L3A+Ci0KLSAgICA8aDI+RWRpdGluZyBhIGRvY3VtZW50PC9oMj4KLQotICAgIDxwPlRvIGxvb2sgYXQgdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQgY2xpY2sgb24gdGhlICJIZWxsbyBXb3JsZCIgZW50cnkKLSAgICBpbiB0aGUgbmF2aWdhdGlvbi4gWW91J2xsIG5vdGljZSB0aGF0IHRoZSAiSGVsbG8gV29ybGQiIGRvY3VtZW50IGFscmVhZHkKLSAgICBjb250YWlucyBzb21lIGNvbnRlbnQuIEl0IHdhcyBjcmVhdGVkIGZyb20gYSBzYW1wbGUgWE1MCi0gICAgZG9jdW1lbnQuIFRvIGNoYW5nZSB0aGlzIHNhbXBsZSBjb250ZW50IHlvdSB3aWxsIGhhdmUgdG8gZWRpdCB0aGUKLSAgICBkb2N1bWVudC4gWW91IGNhbiBwaWNrIG9uIG9mIHRoZSBmb2xsb3dpbmcgd2ViLWJhc2VkIFdZU0lXWUcKLSAgICBlZGl0b3JzOjwvcD4KLQotICAgIDx1bD4KLSAgICAgIDxsaT5LdXB1OiBUaGlzIGlzIGEgZ29vZCBjaG9pY2UgZm9yIHVzZXJzIG9mIEludGVybmV0IEV4cGxvcmVyLjwvbGk+Ci0gICAgICA8bGk+QlhFOiBUaGlzIGlzIGEgZ29vZCBjaG9pY2UgZm9yIHVzZXJzIG9mIE1vemlsbGEuPC9saT4KLSAgICAgIDxsaT5IVE1MIEZvcm1zOiBUaGlzIGlzIGEgZ29vZCBjaG9pY2UgZm9yIHVzZXJzIG9mIE1vc2FpYyA7LSk8L2xpPgotICAgICAgPGxpPk9uZSBGb3JtOiBGb3IgdGhlIHBvd2VyIHVzZXIgd2hvIG5lZWRzIGFsbCB0aGUgY29udHJvbDwvbGk+Ci0gICAgPC91bD4KLQotICAgIDxwPlBpY2sgeW91ciBjaG9pY2Ugb2YgZWRpdG9yIChiYXNlZCBvbiB5b3VyIHBsYXRmb3JtKSBhbmQgc3RhcnQKLSAgICBlZGl0aW5nIHRoZSBuZXdseSBjcmVhdGVkIGRvY3VtZW50IGJ5IHNlbGVjdGluZyB0aGUKLSAgICA8Y29kZT5FZGl0LT5FZGl0IHdpdGggQlhFPC9jb2RlPiBtZW51IGJ1dHRvbi4gVGhlIExlbnlhIG1lbnUgd2lsbAotICAgIGRpc2FwcGVhciBhbmQgdGhlIEJpdGZsdXggdG9vbGJhciB3aWxsIGFwcGVhciBpbnN0ZWFkLiBZb3UgY2FuIHVzZQotICAgIHRoZSByaWdodCBtb3VzZSBidXR0b24gdG8gZ2V0IGEgY29udGV4dCBzZW5zaXRpdmUgbWVudSBmcm9tIHdoZXJlCi0gICAgeW91IGNhbiBjb3B5LCBjdXQgYW5kIHBhc3RlLiBZb3UncmUgYWxzbyBhYmxlIHRvIGluc2VydCBuZXcKLSAgICBlbGVtZW50cyBpbnRvIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBjb250ZXh0IHNlbnNpdGl2ZSBtZW51LiBPbmNlCi0gICAgeW91J3JlIGRvbmUgd2l0aCBhbGwgeW91ciBjaGFuZ2VzLCBwcmVzcwotICAgIDxjb2RlPlNhdmUmYW1wO0V4aXQ8L2NvZGU+IHRvIGdldCBiYWNrLiBZb3UnbGwgc2VlIHlvdXIgY2hhbmdlcyBpbgotICAgIHRoZSBkb2N1bWVudC48L3A+Ci0gICAgCi0gICAgPGgyPkxlbnlhIE1ldGEgRGF0YTwvaDI+Ci0gICAgCi0gICAgPHA+VGhlIExlbnlhTWV0YURhdGFHZW5lcmF0b3IgbGV0cyB5b3UgcmVjZWl2ZSB0aGUgbWV0YSBkYXRhIGZvciBhbnkgZ2l2ZW4gZG9jdW1lbnQuIEluCi0gICAgICB0aGlzIHB1YiB0aGVyZSBpcyBhbiBleGFtcGxlIGluIHRoZSBzaXRlbWFwLnhtYXAgKHBhdHRlcm49Im1ldGEiKSBpdCBvbmx5IHNob3VsZAotICAgICAgZGVtb25zdHJhdGUgb25lIHBvc3NpYmxlIHVzYWdlICh5b3Ugd291bGQgbmVlZCB0byBlZGl0IHRoaXMgbWF0Y2ggZm9yIHlvdXIgb3duIHVzZSBjYXNlKS4KLSAgICAgIFNlZSB0aGUgbWV0YSBkYXRhIGZyb20gdGhpcyBwYWdlIHdpdGggPGEgaHJlZj0ibWV0YT9kb2NpZD0vdHV0b3JpYWwmYW1wO2xhbmc9ZW4iPgotICAgICAgbWV0YT9kb2NpZD0vdHV0b3JpYWwmYW1wO2xhbmc9ZW48L2E+LjwvcD4KLSAgICAKLSAgICA8aDI+UHVibGlzaGluZyBhIGRvY3VtZW50PC9oMj4KLQotICAgIDxwPk9uY2UgeW91IGFyZSBzYXRpc2ZpZWQgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnQgeW91Ci0gICAgd2FudCB0byBwdWJsaXNoIGl0IHRvIG1ha2UgaXQgdmlzaWJsZSBpbiB0aGUgbGl2ZSBhcmVhLjwvcD4gCi0KLSAgICA8aDM+V29ya2Zsb3c8L2gzPgotCi0gICAgPHA+VGhlIGRlZmF1bHQgcHVibGljYXRpb24gaGFzIGEgc2ltcGxlIHdvcmtmbG93IGNvbmZpZ3VyZWQgd2hpY2gKLSAgICBpbnZvbHZlcyBhbiBhdXRob3IgYW5kIGEgcmV2aWV3ZXIuIFRoZSBhdXRob3IgY3JlYXRlcyBhbmQgZWRpdHMgYQotICAgIG5ldyBkb2N1bWVudCBhbmQgc3VibWl0cyBpdCBmb3IgYXBwcm92YWwuIFRoZSByZXZpZXdlciAob2J2aW91c2x5Ci0gICAgOi0pKSByZXZpZXdzIHRoZSBkb2N1bWVudCBhbmQgcHVibGlzaGVzIGl0IHNvIHRoYXQgaXQgd2lsbCBhcHBlYXIKLSAgICBvbiB0aGUgbGl2ZSBzaXRlLgotCi0gICAgVGhlIHVzZXIgbGVueWEgKHdoaWNoIHlvdSBhcmUgcHJvYmFibHkgY3VycmVudGx5IGxvZ2dlZCBpbiBhcykgaGFzCi0gICAgdGhlIHJvbGUgZWRpdCwgaS5lLiBoZSBjYW4gY3JlYXRlIG5ldyBkb2N1bWVudHMgYW5kIHN1Ym1pdCB0aGVtCi0gICAgZm9yIGFwcHJvdmFsICh3aXRoIDxjb2RlPldvcmtmbG93LT5TdWJtaXQgZm9yIHJldmlldzwvY29kZT4pLiBUaGUKLSAgICB1c2VyIGFsaWNlIGhhcyB0aGUgcm9sZSByZXZpZXcgd2hpY2ggYWxsb3dzIGhlciB0byBhcHByb3ZlLAotICAgIGkuZS4gcHVibGlzaCBkb2N1bWVudHMuPC9wPgotCi0gICAgPHA+SW4gb3JkZXIgdG8gcHVibGlzaCB5b3VyIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQgc2ltcGx5IHByZXNzCi0gICAgPGNvZGU+V29ya2Zsb3ctPlN1bWJpdDwvY29kZT4gKGFzIHVzZXIgbGVueWEpIHRvIHN1Ym1pdCB0aGUKLSAgICBjdXJyZW50IGRvY3VtZW50IGZvciBhcHByb3ZhbC4gTm93IGxvZyBvdXQKLSAgICAoPGNvZGU+RmlsZS0+TG9nb3V0PC9jb2RlPiksIGxvZyBiYWNrIGluIGFzIGFsaWNlICh1c2UgdGhlIHNhbWUKLSAgICBwYXNzd29yZCBhcyBmb3IgdXNlciBsZW55YSkgYW5kIHB1Ymxpc2ggdGhlIGN1cnJlbnQgZG9jdW1lbnQgYnkKLSAgICBzZWxlY3RpbmcgPGNvZGU+V29ya2Zsb3ctPlB1Ymxpc2g8L2NvZGU+LiBZb3Ugd2lsbCBnZXQgYQotICAgIGNvbmZpcm1hdGlvbiBzY3JlZW4gd2hlcmUgeW91IGNvbmZpcm0geW91ciBpbnRlbnRpb24gdG8gcHVibGlzaAotICAgIHRoZSBkb2N1bWVudCAiSGVsbG8gV29ybGQiIGJ5IHByZXNzaW5nIDxjb2RlPlB1Ymxpc2ggTm93PC9jb2RlPi4gWW91IG1pZ2h0Ci0gICAgaGF2ZSB0byBwdWJsaXNoIHRoZSBwYXJlbnQgZG9jdW1lbnQgKCJUdXRvcmlhbCIpIGZpcnN0LCBhcyB0aGUKLSAgICAiSGVsbG8gV29ybGQiIGRvY3VtZW50IHdpbGwgbm90IGJlIHB1Ymxpc2hlZCBpZiB0aGUgcGFyZW50IGRvY3VtZW50IGlzIG5vdAotICAgIGluIHRoZSBsaXZlIGFyZWEgeWV0LjwvcD4gPHA+VG8gY2hlY2sgaG93IHRoZSAiSGVsbG8gV29ybGQiIGRvY3VtZW50IGxvb2tzCi0gICAgbGlrZSBpbiB0aGUgbGl2ZSBzaXRlIGNsaWNrIG9uIHRoZSA8Y29kZT5saXZlPC9jb2RlPiB0YWIgaW4gdGhlCi0gICAgTGVueWEgbWVudS4gVGhpcyB3aWxsIG9wZW4gYSBuZXcgYnJvd3NlciB3aW5kb3cgc2hvd2luZyB5b3UgdGhlCi0gICAgbGl2ZSBzaXRlLjwvcD4KLSAgICAKLSAgICA8aDI+U2NoZWR1bGluZzwvaDI+Ci0gICAgCi0gICAgPHA+QXBhY2hlIExlbnlhIGFsbG93cyB5b3UgdG8gcHVibGlzaCBhIGRvY3VtZW50IGF0IGEgc3BlY2lmaWMKLSAgICBkYXRlLiBUbyBkbyB0aGlzIHNlbGVjdCB0aGUgPGNvZGU+V29ya2Zsb3ctPlB1Ymxpc2g8L2NvZGU+IG1lbnUKLSAgICBlbnRyeS4gTm93IGluc3RlYWQgb2YgcHJlc3NpbmcgPGNvZGU+UHVibGlzaDwvY29kZT4gaW1tZWRpYXRlbHksCi0gICAgc3BlY2lmeSB0aGUgZGF0ZSBhbmQgdGhlIHRpbWUgYXQgd2hpY2ggeW91IHdpc2ggdG8gcHVibGlzaCB0aGUKLSAgICBkb2N1bWVudCBmaXJzdC4gWW91ciBkb2N1bWVudCB3aWxsIGJlIHB1Ymxpc2hlZCBhdAotICAgIHRoZSBzcGVjaWZpZWQgZGF0ZS4gVXNlIHRoZSA8Y29kZT5TY2hlZHVsZXI8L2NvZGU+IHRhYiBpbiB0aGUgc2l0ZQotICAgIGFyZWEgdG8gc2VlIHRoZSBwZW5kaW5nIHRhc2tzIGFuZCB0aGVpciBzdGF0dXMuPC9wPgotCi0gICAgPGgyPlJldmlzaW9uIENvbnRyb2w8L2gyPgotCi0gICAgPHA+RXZlcnkgdGltZSB5b3UgZWRpdCBhIGRvY3VtZW50IGFuZCBleGl0IHRoZSBlZGl0b3IgYSBuZXcKLSAgICByZXZpc2lvbiBvZiB0aGUgZG9jdW1lbnQgaXMgc3RvcmVkLiBPbGQgdmVyc2lvbnMgb2YgdGhlIGRvY3VtZW50Ci0gICAgYXJlIGtlcHQgYW5kIHlvdSBjYW4gZ28gYmFjayB0byBhbiBvbGRlciB2ZXJzaW9uIGlmIHlvdSB3YW50IHRvCi0gICAgdW5kbyBzb21lIG9mIHRoZSBjaGFuZ2VzIHlvdSBhcHBsaWVkIHRvIGl0LiBUbyBzZWUgYWxsIGF2YWlsYWJsZQotICAgIHZlcnNpb25zIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50IHByZXNzCi0gICAgPGNvZGU+VG9vbHMtPlJvbGxiYWNrPC9jb2RlPi4gVGhpcyB3aWxsIGdpdmUgeW91IGEgbGlzdCBvZiBhbGwKLSAgICBwcmV2aW91cyB2ZXJzaW9ucy4gWW91IGNhbiB2aWV3IGEgc3BlY2lmaWMgb2xkIHZlcnNpb24gb3Igcm9sbGJhY2sKLSAgICB0byBhIHNwZWNpZmljIG9sZCB2ZXJzaW9uIGJ5IGNsaWNraW5nIG9uIHRoZSBhcHByb3ByaWF0ZSBsaW5rcy48L3A+Ci0KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvdHV0b3JpYWwvaW5kZXhfZW4ubWV0YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvZXhhbXBsZS1jb250ZW50L3R1dG9yaWFsL2luZGV4X2VuLm1ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzk5M2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9leGFtcGxlLWNvbnRlbnQvdHV0b3JpYWwvaW5kZXhfZW4ubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tICRJZCQgLS0+Ci08bGVueWE6ZG9jdW1lbnQgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCI+Ci08bGVueWE6bWV0YT4KLTxsZW55YTppbnRlcm5hbD4KLTxsZW55YTpyZXNvdXJjZVR5cGU+eGh0bWw8L2xlbnlhOnJlc291cmNlVHlwZT4KLTxsZW55YTpjb250ZW50VHlwZT54bWw8L2xlbnlhOmNvbnRlbnRUeXBlPgotICA8bGVueWE6bWltZVR5cGU+YXBwbGljYXRpb24veGh0bWwreG1sPC9sZW55YTptaW1lVHlwZT4KLTwvbGVueWE6aW50ZXJuYWw+Ci08bGVueWE6ZGM+Ci0gICAgICAgIDxkYzp0aXRsZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkEgc2hvcnQgTGVueWEgVHV0b3JpYWw8L2RjOnRpdGxlPgotICAgICAgICA8ZGM6Y3JlYXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkxlbnlhIERldmVsb3BtZW50IFRlYW08L2RjOmNyZWF0b3I+Ci0gICAgICAgIDxkYzpzdWJqZWN0IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+TGVueWEgVHV0b3JpYWw8L2RjOnN1YmplY3Q+Ci0gICAgICAgIDxkYzpkZXNjcmlwdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkEgc2hvcnQgdHV0b3JpYWwgb24gdXNpbmcgQXBhY2hlIExlbnlhPC9kYzpkZXNjcmlwdGlvbj4KLSAgICAgICAgPGRjOnB1Ymxpc2hlciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9kYzpwdWJsaXNoZXI+Ci0gICAgICAgIDxkYzpjb250cmlidXRvciB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmRhdGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4yMDA1LTAxLTMxPC9kYzpkYXRlPgotICAgICAgICA8ZGM6dHlwZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmZvcm1hdCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4KLSAgICAgICAgPGRjOmlkZW50aWZpZXIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpzb3VyY2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpsYW5ndWFnZSB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPmVuPC9kYzpsYW5ndWFnZT4KLSAgICAgICAgPGRjOnJlbGF0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPgotICAgICAgICA8ZGM6Y292ZXJhZ2UgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+Ci0gICAgICAgIDxkYzpyaWdodHMgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj5BbGwgcmlnaHRzIHJlc2VydmVkPC9kYzpyaWdodHM+Ci08L2xlbnlhOmRjPgotPC9sZW55YTptZXRhPgotPC9sZW55YTpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvZGVmYXVsdHB1Yi9jbXMvcHVibGljYXRpb24vdGVtcGxhdGluZy9JbnN0YW50aWF0b3IuamF2YSBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9kZWZhdWx0cHViL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0luc3RhbnRpYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk0YmM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvamF2YS9zcmMvb3JnL2FwYWNoZS9sZW55YS9kZWZhdWx0cHViL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0luc3RhbnRpYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmRlZmF1bHRwdWIuY21zLnB1YmxpY2F0aW9uLnRlbXBsYXRpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLk11dGFibGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsubG9nZ2VyLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLlNlcnZpY2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Nb2RpZmlhYmxlU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5Tb3VyY2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuaW1wbC5GaWxlU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uTWFuYWdlcjsKLS8vIGltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuRG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEluc3RhbnRpYXRlIHRoZSBwdWJsaWNhdGlvbi4KLSAqIAotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFudGlhdG9yIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkIGltcGxlbWVudHMKLSAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udGVtcGxhdGluZy5JbnN0YW50aWF0b3IsIFNlcnZpY2VhYmxlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gc291cmNlc1RvQ29weSA9IHsKLSAgICAgICAgICAgICJjb25maWcvcHVibGljYXRpb24ueG1sIiwKLSAgICAgICAgICAgICJjb25maWcvYWNjZXNzLWNvbnRyb2wvYWNjZXNzLWNvbnRyb2wueG1sIiwKLSAgICAgICAgICAgICJjb25maWcvYWNjZXNzLWNvbnRyb2wvcG9saWNpZXMvIiwKLSAgICAgICAgICAgICJjb25maWcvYWNjZXNzLWNvbnRyb2wvdXNlY2FzZS1wb2xpY2llcy54bWwiLAotICAgICAgICAgICAgImNvbmZpZy93b3JrZmxvdy93b3JrZmxvdy54bWwiLAotICAgICAgICAgICAgImNvbmZpZy8iCi0gICAgICAgICAgICAgICAgICAgICsgb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guY29tcG9uZW50cy5pbXBsLkluZGV4TWFuYWdlckltcGwuSU5ERVhfQ09ORl9GSUxFIH07Ci0KLSAgICAvLyB0aGUgZm9sbG93aW5nIHN0dWZmIHNob3VsZCBhY3R1YWxseSBjb21lIGZyb20gUHVibGljYXRpb25Db25maWd1cmF0aW9uLAotICAgIC8vIGJ1dCB0aGVyZSdzIGN1cnJlbnRseSBubyB3YXkgdG8gZ2V0IGF0IGl0LgotICAgIC8vIHRoZSBjb3JyZWN0IHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBhbmRyZWFzIGlzIG5vdCB0byBtZWRkbGUgd2l0aCBjb25maWcKLSAgICAvLyBmaWxlcyBoZXJlIGF0IGFsbCwgYnV0IGluc3RlYWQgaW1wbGVtZW50Ci0gICAgLy8gYXBwcm9wcmlhdGUgc2V0dGVyIGZ1bmN0aW9ucyBpbiB0aGUgUHVibGljYXRpb24gY2xhc3MuIHBvc3Rwb25lZCB0byBhZnRlcgotICAgIC8vIDIuMC4KLSAgICAvLyB0aHVzLCBkb24ndCB3YXN0ZSB0b28gbXVjaCBlZmZvcnQgb24gdGhpcyBmaWxlLCBpdCdzIGFsbCBhbiBpbnRlcm1lZGlhdGUKLSAgICAvLyBoYWNrLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0ZJTEUgPSAiY29uZmlnL3B1YmxpY2F0aW9uLnhtbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wdWJsaWNhdGlvbi8xLjEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05BTUUgPSAibmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVNUExBVEUgPSAidGVtcGxhdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1JFU09VUkNFX1RZUEVTID0gInJlc291cmNlLXR5cGVzIjsvLyAqCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUkVTT1VSQ0VfVFlQRSA9ICJyZXNvdXJjZS10eXBlIjsvLyAqCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTU9EVUxFUyA9ICJtb2R1bGVzIjsvLyAqCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTU9EVUxFID0gIm1vZHVsZSI7Ly8gKgotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi50ZW1wbGF0aW5nLkluc3RhbnRpYXRvciNpbnN0YW50aWF0ZShvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5QdWJsaWNhdGlvbiwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zdGFudGlhdGUoUHVibGljYXRpb24gdGVtcGxhdGUsIFN0cmluZyBuZXdQdWJsaWNhdGlvbklkLCBTdHJpbmcgbmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgU291cmNlIHB1YmxpY2F0aW9uc1NvdXJjZSA9IG51bGw7Ci0gICAgICAgIFB1YmxpY2F0aW9uTWFuYWdlciBwdWJNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVyID0gKFNvdXJjZVJlc29sdmVyKSB0aGlzLm1hbmFnZXIubG9va3VwKFNvdXJjZVJlc29sdmVyLlJPTEUpOwotCi0gICAgICAgICAgICBwdWJsaWNhdGlvbnNTb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlVVJJKCJjb250ZXh0Oi8vIgotICAgICAgICAgICAgICAgICAgICArIFB1YmxpY2F0aW9uLlBVQkxJQ0FUSU9OX1BSRUZJWF9VUkkpOwotICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uc1VyaSA9IHB1YmxpY2F0aW9uc1NvdXJjZS5nZXRVUkkoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzVG9Db3B5Lmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlID0gc291cmNlc1RvQ29weVtpXTsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlLmVuZHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29weURpclNvdXJjZSh0ZW1wbGF0ZSwgbmV3UHVibGljYXRpb25JZCwgcmVzb2x2ZXIsIHB1YmxpY2F0aW9uc1VyaSwgc291cmNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb3B5U291cmNlKHRlbXBsYXRlLCBuZXdQdWJsaWNhdGlvbklkLCByZXNvbHZlciwgcHVibGljYXRpb25zVXJpLCBzb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlTWV0YURhdGEocmVzb2x2ZXIsIG5ld1B1YmxpY2F0aW9uSWQsIG5hbWUsIHB1YmxpY2F0aW9uc1VyaSk7Ci0KLSAgICAgICAgICAgIGNvbmZpZ3VyZVNlYXJjaEluZGV4KHJlc29sdmVyLCB0ZW1wbGF0ZSwgbmV3UHVibGljYXRpb25JZCwgcHVibGljYXRpb25zVXJpKTsKLQotICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJhdGlvbihyZXNvbHZlciwgdGVtcGxhdGUsIG5ld1B1YmxpY2F0aW9uSWQsIHB1YmxpY2F0aW9uc1VyaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHB1Yk1hbmFnZXIgPSAoUHVibGljYXRpb25NYW5hZ2VyKSB0aGlzLm1hbmFnZXIubG9va3VwKFB1YmxpY2F0aW9uTWFuYWdlci5ST0xFKTsKLSAgICAgICAgICAgIHB1Yk1hbmFnZXIuYWRkUHVibGljYXRpb24obmV3UHVibGljYXRpb25JZCk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbGVhc2UocmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgIGlmIChwdWJsaWNhdGlvbnNTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHB1YmxpY2F0aW9uc1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHB1Yk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZWxlYXNlKHB1Yk1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNZXRhRGF0YShTb3VyY2VSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIG5ld1B1YmxpY2F0aW9uSWQsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uc1VyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLAotICAgICAgICAgICAgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZGlmaWFibGVTb3VyY2UgbWV0YVNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXRhU291cmNlID0gKE1vZGlmaWFibGVTb3VyY2UpIHJlc29sdmVyLnJlc29sdmVVUkkocHVibGljYXRpb25zVXJpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICsgbmV3UHVibGljYXRpb25JZCArICIvIiArIENPTkZJR1VSQVRJT05fRklMRSk7Ci0gICAgICAgICAgICBEb2N1bWVudCBtZXRhRG9jID0gRG9jdW1lbnRIZWxwZXIucmVhZERvY3VtZW50KG1ldGFTb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBOYW1lc3BhY2VIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUhlbHBlcihDT05GSUdVUkFUSU9OX05BTUVTUEFDRSwgIiIsIG1ldGFEb2MpOwotICAgICAgICAgICAgRWxlbWVudCBuYW1lRWxlbWVudCA9IGhlbHBlci5nZXRGaXJzdENoaWxkKG1ldGFEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksIEVMRU1FTlRfTkFNRSk7Ci0gICAgICAgICAgICBEb2N1bWVudEhlbHBlci5zZXRTaW1wbGVFbGVtZW50VGV4dChuYW1lRWxlbWVudCwgbmFtZSk7Ci0KLSAgICAgICAgICAgIHNhdmUobWV0YURvYywgbWV0YVNvdXJjZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtZXRhU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShtZXRhU291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb25maWd1cmF0aW9uKFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLCBQdWJsaWNhdGlvbiB0ZW1wbGF0ZSwKLSAgICAgICAgICAgIFN0cmluZyBuZXdQdWJsaWNhdGlvbklkLCBTdHJpbmcgcHVibGljYXRpb25zVXJpKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU291cmNlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBNb2RpZmlhYmxlU291cmNlIGNvbmZpZ1NvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGNvbmZpZ1NvdXJjZSA9IChNb2RpZmlhYmxlU291cmNlKSByZXNvbHZlci5yZXNvbHZlVVJJKHB1YmxpY2F0aW9uc1VyaSArICIvIgotICAgICAgICAgICAgICAgICAgICArIG5ld1B1YmxpY2F0aW9uSWQgKyAiLyIgKyBDT05GSUdVUkFUSU9OX0ZJTEUpOwotCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIEVOQUJMRV9YTUxfTkFNRVNQQUNFUyA9IHRydWU7Ci0gICAgICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbiBjb25maWcgPSAoRGVmYXVsdENvbmZpZ3VyYXRpb24pIG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIEVOQUJMRV9YTUxfTkFNRVNQQUNFUykuYnVpbGQoY29uZmlnU291cmNlLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgYWRkVGVtcGxhdGVDb25maWd1cmF0aW9uKHRlbXBsYXRlLCBjb25maWcpOwotCi0gICAgICAgICAgICByZW1vdmVDaGlsZHJlbihjb25maWcuZ2V0TXV0YWJsZUNoaWxkKEVMRU1FTlRfTU9EVUxFUyksIEVMRU1FTlRfTU9EVUxFKTsKLSAgICAgICAgICAgIHJlbW92ZUNoaWxkcmVuKGNvbmZpZy5nZXRNdXRhYmxlQ2hpbGQoRUxFTUVOVF9SRVNPVVJDRV9UWVBFUyksIEVMRU1FTlRfUkVTT1VSQ0VfVFlQRSk7Ci0KLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvU3RyZWFtID0gY29uZmlnU291cmNlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgbmV3IERlZmF1bHRDb25maWd1cmF0aW9uU2VyaWFsaXplcigpLnNlcmlhbGl6ZShvU3RyZWFtLCBjb25maWcpOwotICAgICAgICAgICAgaWYgKG9TdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9TdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCJFeGNlcHRpb24gY2xvc2luZyBvdXRwdXQgc3RyZWFtOiAiLCB0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGRvY3VtZW50OiAiLCB0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjb25maWdTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKGNvbmZpZ1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVGVtcGxhdGVDb25maWd1cmF0aW9uKFB1YmxpY2F0aW9uIHRlbXBsYXRlLCBEZWZhdWx0Q29uZmlndXJhdGlvbiBjb25maWcpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25bXSB0ZW1wbGF0ZUNvbmZpZ3MgPSBjb25maWcuZ2V0Q2hpbGRyZW4oRUxFTUVOVF9URU1QTEFURSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGVDb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25maWcucmVtb3ZlQ2hpbGQodGVtcGxhdGVDb25maWdzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbiB0ZW1wbGF0ZUNvbmZpZyA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbihFTEVNRU5UX1RFTVBMQVRFLCBudWxsLAotICAgICAgICAgICAgICAgIENPTkZJR1VSQVRJT05fTkFNRVNQQUNFLCAiIik7Ci0gICAgICAgIHRlbXBsYXRlQ29uZmlnLnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQsIHRlbXBsYXRlLmdldElkKCkpOwotICAgICAgICBjb25maWcuYWRkQ2hpbGQodGVtcGxhdGVDb25maWcpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkcmVuKE11dGFibGVDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIG5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE11dGFibGVDb25maWd1cmF0aW9uW10gbW9kdWxlQ29uZmlncyA9IGNvbmZpZy5nZXRNdXRhYmxlQ2hpbGRyZW4obmFtZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlQ29uZmlncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY29uZmlnLnJlbW92ZUNoaWxkKG1vZHVsZUNvbmZpZ3NbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2VhcmNoSW5kZXgoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIFB1YmxpY2F0aW9uIHRlbXBsYXRlLAotICAgICAgICAgICAgU3RyaW5nIG5ld1B1YmxpY2F0aW9uSWQsIFN0cmluZyBwdWJsaWNhdGlvbnNVcmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBTb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24sCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kaWZpYWJsZVNvdXJjZSBpbmRleFNvdXJjZSA9IG51bGw7Ci0gICAgICAgIEluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBSR0U6IFNvYyBhZGRpdGlvbgotICAgICAgICAgICAgLy8gRmlyc3QsIHBhdGNoIHRoZSB4Y29uZiBwYXRjaGZpbGUgd2l0aCB0aGUgbmV3IHB1YmxpY2F0aW9uIG5hbWUKLQotICAgICAgICAgICAgU3RyaW5nIGluZGV4RGlyID0gImxlbnlhL3B1YnMvIiArIG5ld1B1YmxpY2F0aW9uSWQgKyAiL3dvcmsvbHVjZW5lL2luZGV4IjsKLQotICAgICAgICAgICAgaW5kZXhTb3VyY2UgPSAoTW9kaWZpYWJsZVNvdXJjZSkgcmVzb2x2ZXIKLSAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVVUkkocHVibGljYXRpb25zVXJpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5ld1B1YmxpY2F0aW9uSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIvY29uZmlnLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuaW1wbC5JbmRleE1hbmFnZXJJbXBsLklOREVYX0NPTkZfRklMRSk7Ci0gICAgICAgICAgICBEb2N1bWVudCBpbmRleERvYyA9IERvY3VtZW50SGVscGVyLnJlYWREb2N1bWVudChpbmRleFNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVsZW1lbnRbXSBpbmRleEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5nZXRDaGlsZHJlbihpbmRleERvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgImluZGV4Iik7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhFbGVtZW50Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gaW5kZXhFbGVtZW50W2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXJlYSA9IGlkLnNwbGl0KCItIilbMV07Ci0gICAgICAgICAgICAgICAgaW5kZXhFbGVtZW50W2ldLnNldEF0dHJpYnV0ZSgiaWQiLCBuZXdQdWJsaWNhdGlvbklkICsgIi0iICsgYXJlYSk7Ci0gICAgICAgICAgICAgICAgaW5kZXhFbGVtZW50W2ldLnNldEF0dHJpYnV0ZSgiZGlyZWN0b3J5IiwgaW5kZXhEaXIgKyAiLyIgKyBhcmVhICsgIi9pbmRleCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYXZlKGluZGV4RG9jLCBpbmRleFNvdXJjZSk7Ci0KLSAgICAgICAgICAgIC8vIFNlY29uZCwgY29uZmlndXJlIHRoZSBpbmRleCBhbmQgYWRkIGl0IHRvIHRoZSBJbmRleE1hbmFnZXIKLQotICAgICAgICAgICAgaW5kZXhNYW5hZ2VyID0gKEluZGV4TWFuYWdlcikgbWFuYWdlci5sb29rdXAoSW5kZXhNYW5hZ2VyLlJPTEUpOwotCi0gICAgICAgICAgICBpbmRleE1hbmFnZXIuYWRkSW5kZXhlcyhpbmRleFNvdXJjZSk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IHJlbGVhc2UgYWxsIG9iamVjdHMhCi0KLSAgICAgICAgICAgIC8vIFJHRTogRW5kIFNvYyBhZGRpdGlvbgotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5kZXhNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShpbmRleE1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIucmVsZWFzZShyZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4U291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVsZWFzZShpbmRleFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weVNvdXJjZShQdWJsaWNhdGlvbiB0ZW1wbGF0ZSwgU3RyaW5nIHB1YmxpY2F0aW9uSWQsIFNvdXJjZVJlc29sdmVyIHJlc29sdmVyLAotICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2F0aW9uc1VyaSwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTb3VyY2UgdGVtcGxhdGVTb3VyY2UgPSBudWxsOwotICAgICAgICBNb2RpZmlhYmxlU291cmNlIHRhcmdldFNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZW1wbGF0ZVNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVVUkkocHVibGljYXRpb25zVXJpICsgIi8iICsgdGVtcGxhdGUuZ2V0SWQoKSArICIvIgotICAgICAgICAgICAgICAgICAgICArIHNvdXJjZSk7Ci0gICAgICAgICAgICB0YXJnZXRTb3VyY2UgPSAoTW9kaWZpYWJsZVNvdXJjZSkgcmVzb2x2ZXIucmVzb2x2ZVVSSShwdWJsaWNhdGlvbnNVcmkgKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNhdGlvbklkICsgIi8iICsgc291cmNlKTsKLQotICAgICAgICAgICAgb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5Tb3VyY2VVdGlsLmNvcHkodGVtcGxhdGVTb3VyY2UsIHRhcmdldFNvdXJjZSwgZmFsc2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHRlbXBsYXRlU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlci5yZWxlYXNlKHRlbXBsYXRlU291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0YXJnZXRTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlbGVhc2UodGFyZ2V0U291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlEaXJTb3VyY2UoUHVibGljYXRpb24gdGVtcGxhdGUsIFN0cmluZyBwdWJsaWNhdGlvbklkLAotICAgICAgICAgICAgU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBwdWJsaWNhdGlvbnNVcmksIFN0cmluZyBzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVTb3VyY2UgZGlyZWN0b3J5ID0gbmV3IEZpbGVTb3VyY2UocHVibGljYXRpb25zVXJpICsgIi8iICsgdGVtcGxhdGUuZ2V0SWQoKSArICIvIgotICAgICAgICAgICAgICAgICsgc291cmNlKTsKLSAgICAgICAgQ29sbGVjdGlvbiBmaWxlcyA9IGRpcmVjdG9yeS5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmaWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEZpbGVTb3VyY2UgZmlsZXNvdXJjZSA9IChGaWxlU291cmNlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChmaWxlc291cmNlLmlzQ29sbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgY29weURpclNvdXJjZSh0ZW1wbGF0ZSwgcHVibGljYXRpb25JZCwgcmVzb2x2ZXIsIHB1YmxpY2F0aW9uc1VyaSwgc291cmNlICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29weVNvdXJjZSh0ZW1wbGF0ZSwgcHVibGljYXRpb25JZCwgcmVzb2x2ZXIsIHB1YmxpY2F0aW9uc1VyaSwgc291cmNlICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNhdmUoRG9jdW1lbnQgbWV0YURvYywgTW9kaWZpYWJsZVNvdXJjZSBtZXRhU291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG9TdHJlYW0gPSBtZXRhU291cmNlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICBEb2N1bWVudEhlbHBlci53cml0ZURvY3VtZW50KG1ldGFEb2MsIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob1N0cmVhbSkpOwotICAgICAgICBpZiAob1N0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9TdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkV4Y2VwdGlvbiBjbG9zaW5nIG91dHB1dCBzdHJlYW06ICIsIHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGRvY3VtZW50OiAiLCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZU1hbmFnZXIgbWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLnNlcnZpY2UuU2VydmljZWFibGUjc2VydmljZShvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuc2VydmljZS5TZXJ2aWNlTWFuYWdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEucHJvcGVydGllcy54bWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhLnByb3BlcnRpZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmRiN2E2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEucHJvcGVydGllcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb3BlcnRpZXM+Ci0gIDwhLS0gTm90ZTogWW91IGNhbiBkZWZpbmUgYW5kIG92ZXJyaWRlIHByb3BlcnRpZXMgYW5kIHVzZSB0aGVtICAKLSAgICBpbiB5b3VyIHNpdGVtYXAgbGlrZSB7cHJvcGVydGllczpwdWJzLmRlZmF1bHQuYXV0aG9yfSAtLT4KLSAgCi0gIDwhLS0gaHR0cDovL2xvY2FsaG9zdDo4ODg4L2RlZmF1bHQvYXV0aG9yaW5nL2luZGV4Lmh0bWwgd2lsbCBzaG93IGluIHRoZSBmaXJzdCBoZWFkaW5nOiAKLSAgICAiV2VsY29tZSB0byB0aGUgRGVmYXVsdCBQdWJsaWNhdGlvbiBmcm9tIHtwcm9wZXJ0aWVzOnB1YnMuZGVmYXVsdC5hdXRob3J9ISItLT4KLSAgPCEtLTxwcm9wZXJ0eSBuYW1lPSJwdWJzLmRlZmF1bHQuYXV0aG9yIiB2YWx1ZT0iTWUiLz4tLT4KLTwvcHJvcGVydGllcz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvY29udGVudC9wdWJsaXNoaW5nL3B1Ymxpc2gtc2NyZWVuLnhzcCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvY29udGVudC9wdWJsaXNoaW5nL3B1Ymxpc2gtc2NyZWVuLnhzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkZjBhNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL2NvbnRlbnQvcHVibGlzaGluZy9wdWJsaXNoLXNjcmVlbi54c3AKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzcDpwYWdlCi0gICAgICAgbGFuZ3VhZ2U9ImphdmEiCi0gICAgICAgeG1sbnM6eHNwPSJodHRwOi8vYXBhY2hlLm9yZy94c3AiCi0gICAgICAgeG1sbnM6aW5wdXQ9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi94c3AvaW5wdXQvMS4wIgotICAgICAgIHhtbG5zOnVzZWNhc2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91c2VjYXNlLzEuMCIKLSAgICAgICB4bWxuczpzY2g9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9zY2hlZHVsZXIvMS4wIgotICAgICAgIHhtbG5zOnhzcC1yZXF1ZXN0PSJodHRwOi8vYXBhY2hlLm9yZy94c3AvcmVxdWVzdC8yLjAiCi0gICAgICAgPgotCi08dXNlY2FzZTpwdWJsaXNoPgotCi0gIDx1c2VjYXNlOmRvY3VtZW50LXV1aWQ+PGlucHV0OmdldC1hdHRyaWJ1dGUgbW9kdWxlPSJwYWdlLWVudmVsb3BlIiBuYW1lPSJkb2N1bWVudC11dWlkIiBhcz0ic3RyaW5nIi8+PC91c2VjYXNlOmRvY3VtZW50LXV1aWQ+Ci0gIDx1c2VjYXNlOnVyaXM+PHhzcC1yZXF1ZXN0OmdldC11cmkvPjwvdXNlY2FzZTp1cmlzPgotICA8dXNlY2FzZTpzb3VyY2VzPjxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgYXM9InN0cmluZyIgbmFtZT0iZG9jdW1lbnQtcGF0aCIvPjwvdXNlY2FzZTpzb3VyY2VzPgotICA8dXNlY2FzZTpwdWJsaWNhdGlvbi1pZD48aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIG5hbWU9InB1YmxpY2F0aW9uLWlkIiBhcz0ic3RyaW5nIi8+PC91c2VjYXNlOnB1YmxpY2F0aW9uLWlkPgotICA8dXNlY2FzZTpjb250ZXh0LXByZWZpeD48aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIG5hbWU9ImNvbnRleHQtcHJlZml4IiBhcz0ic3RyaW5nIi8+PC91c2VjYXNlOmNvbnRleHQtcHJlZml4PgotICA8dXNlY2FzZTphcmVhPjxpbnB1dDpnZXQtYXR0cmlidXRlIG1vZHVsZT0icGFnZS1lbnZlbG9wZSIgbmFtZT0iYXJlYSIgYXM9InN0cmluZyIvPjwvdXNlY2FzZTphcmVhPgotICA8dXNlY2FzZTpsYW5ndWFnZT48aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIG5hbWU9ImRvY3VtZW50LWxhbmd1YWdlIiBhcz0ic3RyaW5nIi8+PC91c2VjYXNlOmxhbmd1YWdlPgotICAKLSAgPCEtLSBGSVhNRTogdGhpcyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgd29ya2Zsb3cgc2NoZW1hIC0tPgotICA8dXNlY2FzZTp0YXNrLWlkPnB1Ymxpc2g8L3VzZWNhc2U6dGFzay1pZD4KLQotICA8IS0tIGFkZCBkYXRlIGZvciBzY2hlZHVsZXIgLS0+Ci0gIDx4c3A6bG9naWM+Ci0gICAgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIGNhbGVuZGFyID0gbmV3IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcigpOwotICA8L3hzcDpsb2dpYz4KLSAgCi0gIDxzY2g6Y3VycmVudC1kYXRlPgotICAgIDxzY2g6eWVhcj48eHNwOmV4cHI+Y2FsZW5kYXIuZ2V0KGphdmEudXRpbC5DYWxlbmRhci5ZRUFSKTwveHNwOmV4cHI+PC9zY2g6eWVhcj4KLSAgICA8c2NoOm1vbnRoPjx4c3A6ZXhwcj5jYWxlbmRhci5nZXQoamF2YS51dGlsLkNhbGVuZGFyLk1PTlRIKSArIDE8L3hzcDpleHByPjwvc2NoOm1vbnRoPgotICAgIDxzY2g6ZGF5Pjx4c3A6ZXhwcj5jYWxlbmRhci5nZXQoamF2YS51dGlsLkNhbGVuZGFyLkRBWV9PRl9NT05USCk8L3hzcDpleHByPjwvc2NoOmRheT4KLSAgICA8c2NoOmhvdXI+PHhzcDpleHByPmNhbGVuZGFyLmdldChqYXZhLnV0aWwuQ2FsZW5kYXIuSE9VUl9PRl9EQVkpPC94c3A6ZXhwcj48L3NjaDpob3VyPgotICAgIDxzY2g6bWludXRlPjx4c3A6ZXhwcj5jYWxlbmRhci5nZXQoamF2YS51dGlsLkNhbGVuZGFyLk1JTlVURSk8L3hzcDpleHByPjwvc2NoOm1pbnV0ZT4KLSAgICA8c2NoOnNlY29uZD48eHNwOmV4cHI+Y2FsZW5kYXIuZ2V0KGphdmEudXRpbC5DYWxlbmRhci5TRUNPTkQpPC94c3A6ZXhwcj48L3NjaDpzZWNvbmQ+Ci0gIDwvc2NoOmN1cnJlbnQtZGF0ZT4KLSAgCi08L3VzZWNhc2U6cHVibGlzaD4KLQotPC94c3A6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2hvbWVwYWdlLnhzbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2hvbWVwYWdlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjZWYwYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL21vZHVsZXMvZWRpdG9ycy91c2VjYXNlcy9mb3Jtcy9ob21lcGFnZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB4aHRtbC54c2wgNDI3MDMgMjAwNC0wMy0xMyAxMjo1Nzo1M1ogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIKLSAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgotPgotCi08eHNsOmltcG9ydCBocmVmPSJ4aHRtbC54c2wiLz4KLQotPC94c2w6c3R5bGVzaGVldD4gIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvbGlua3MueHNsIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMvbGlua3MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODYxYWY5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2xpbmtzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL3B1YnMvZGVmYXVsdC8xLjAiCi0gIHhtbG5zOmxpbmtzPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9wdWJzL2RlZmF1bHQvMS4wIgotPgotCi08eHNsOmltcG9ydCBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi91c2VjYXNlcy9lZGl0L2Zvcm1zL2Zvcm0ueHNsIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpbmtzOmxpbmtzIj4KLSAgCi08bmFtZXNwYWNlIHByZWZpeD0iIiB1cmk9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL3B1YnMvZGVmYXVsdC8xLjAiLz4KLSAgCi08bm9kZSBuYW1lPSJUaXRsZSIgc2VsZWN0PSJsaW5rcy90aXRsZVtAdGFnSUQ9J3t0aXRsZS9AdGFnSUR9J10iPgotICA8Y29udGVudD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJmx0O3h1cGRhdGU6dXBkYXRlIHNlbGVjdD0mcXVvdDsvbGlua3MvdGl0bGVbQHRhZ0lEPSd7dGl0bGUvQHRhZ0lEfSddJnF1b3Q7Jmd0OyIgc2l6ZT0iNDAiPjx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idGl0bGUiLz48L3hzbDphdHRyaWJ1dGU+PC9pbnB1dD48L2NvbnRlbnQ+Ci08L25vZGU+Ci0KLTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGluayIvPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4gIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMveGh0bWwtY29tbW9uLnhzbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL3hodG1sLWNvbW1vbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2M0MWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMveGh0bWwtY29tbW9uLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB4aHRtbC1jb21tb24ueHNsIDE1MzE2NSAyMDA1LTAyLTEwIDA2OjAxOjAxWiBncmVnb3IgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIgotICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCi0+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmJvZHkiPgotPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iYm9keSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iaW5zZXJ0bWVudSI+Ci08eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KLTx4c2w6dmFyaWFibGUgbmFtZT0ibnMiPm5hbWVzcGFjZT0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJnF1b3Q7PC94c2w6dmFyaWFibGU+Ci08aW5zZXJ0LWFmdGVyIHNlbGVjdD0ieyRwYXRofVtAdGFnSUQ9J3tAdGFnSUR9J10iPgotICA8ZWxlbWVudCBuYW1lPSJQYXJhZ3JhcGgiIHh1cGRhdGU9IiZsdDt4dXBkYXRlOmluc2VydC1hZnRlciBzZWxlY3Q9JnF1b3Q7eyRwYXRofVtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsmZ3Q7Jmx0O3h1cGRhdGU6ZWxlbWVudCBuYW1lPSZxdW90O3hodG1sOnAmcXVvdDsgeyRuc30mZ3Q7TmV3IFBhcmFncmFwaCZsdDsveHVwZGF0ZTplbGVtZW50Jmd0OyZsdDsveHVwZGF0ZTppbnNlcnQtYWZ0ZXImZ3Q7Ii8+Ci0gIDxlbGVtZW50IG5hbWU9IlRhYmxlIiB4dXBkYXRlPSImbHQ7eHVwZGF0ZTppbnNlcnQtYWZ0ZXIgc2VsZWN0PSZxdW90O3skcGF0aH1bQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7Jmd0OyZsdDt4dXBkYXRlOmVsZW1lbnQgbmFtZT0mcXVvdDt4aHRtbDp0YWJsZSZxdW90OyB7JG5zfSZndDsmbHQ7dHImZ3Q7Jmx0O3RkJmd0O05ldyBUYWJsZSZsdDsvdGQmZ3Q7Jmx0Oy90ciZndDsmbHQ7L3h1cGRhdGU6ZWxlbWVudCZndDsmbHQ7L3h1cGRhdGU6aW5zZXJ0LWFmdGVyJmd0OyIvPgotICA8ZWxlbWVudCBuYW1lPSJVbm9yZGVyZWQgTGlzdCIgeHVwZGF0ZT0iJmx0O3h1cGRhdGU6aW5zZXJ0LWFmdGVyIHNlbGVjdD0mcXVvdDt7JHBhdGh9W0B0YWdJRD0ne0B0YWdJRH0nXSZxdW90OyZndDsmbHQ7eHVwZGF0ZTplbGVtZW50IG5hbWU9JnF1b3Q7eGh0bWw6dWwmcXVvdDsgeyRuc30mZ3Q7Jmx0O2xpJmd0O05ldyBVbm9yZGVyZWQgTGlzdCZsdDsvbGkmZ3Q7Jmx0Oy94dXBkYXRlOmVsZW1lbnQmZ3Q7Jmx0Oy94dXBkYXRlOmluc2VydC1hZnRlciZndDsiLz4KLSAgPGVsZW1lbnQgbmFtZT0iT3JkZXJlZCBMaXN0IiB4dXBkYXRlPSImbHQ7eHVwZGF0ZTppbnNlcnQtYWZ0ZXIgc2VsZWN0PSZxdW90O3skcGF0aH1bQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7Jmd0OyZsdDt4dXBkYXRlOmVsZW1lbnQgbmFtZT0mcXVvdDt4aHRtbDpvbCZxdW90OyB7JG5zfSZndDsmbHQ7bGkmZ3Q7TmV3IE9yZGVyZWQgTGlzdCZsdDsvbGkmZ3Q7Jmx0Oy94dXBkYXRlOmVsZW1lbnQmZ3Q7Jmx0Oy94dXBkYXRlOmluc2VydC1hZnRlciZndDsiLz4KLSAgPGVsZW1lbnQgbmFtZT0iSGVhZGxpbmUgMSIgeHVwZGF0ZT0iJmx0O3h1cGRhdGU6aW5zZXJ0LWFmdGVyIHNlbGVjdD0mcXVvdDt7JHBhdGh9W0B0YWdJRD0ne0B0YWdJRH0nXSZxdW90OyZndDsmbHQ7eHVwZGF0ZTplbGVtZW50IG5hbWU9JnF1b3Q7eGh0bWw6aDEmcXVvdDsgeyRuc30mZ3Q7TmV3IEhlYWRsaW5lIDEmbHQ7L3h1cGRhdGU6ZWxlbWVudCZndDsmbHQ7L3h1cGRhdGU6aW5zZXJ0LWFmdGVyJmd0OyIvPgotICA8ZWxlbWVudCBuYW1lPSJIZWFkbGluZSAyIiB4dXBkYXRlPSImbHQ7eHVwZGF0ZTppbnNlcnQtYWZ0ZXIgc2VsZWN0PSZxdW90O3skcGF0aH1bQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7Jmd0OyZsdDt4dXBkYXRlOmVsZW1lbnQgbmFtZT0mcXVvdDt4aHRtbDpoMiZxdW90OyB7JG5zfSZndDtOZXcgSGVhZGxpbmUgMiZsdDsveHVwZGF0ZTplbGVtZW50Jmd0OyZsdDsveHVwZGF0ZTppbnNlcnQtYWZ0ZXImZ3Q7Ii8+Ci0gIDxlbGVtZW50IG5hbWU9IkhlYWRsaW5lIDMiIHh1cGRhdGU9IiZsdDt4dXBkYXRlOmluc2VydC1hZnRlciBzZWxlY3Q9JnF1b3Q7eyRwYXRofVtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsmZ3Q7Jmx0O3h1cGRhdGU6ZWxlbWVudCBuYW1lPSZxdW90O3hodG1sOmgzJnF1b3Q7IHskbnN9Jmd0O05ldyBIZWFkbGluZSAzJmx0Oy94dXBkYXRlOmVsZW1lbnQmZ3Q7Jmx0Oy94dXBkYXRlOmluc2VydC1hZnRlciZndDsiLz4KLSAgPGVsZW1lbnQgbmFtZT0iSGVhZGxpbmUgNCIgeHVwZGF0ZT0iJmx0O3h1cGRhdGU6aW5zZXJ0LWFmdGVyIHNlbGVjdD0mcXVvdDt7JHBhdGh9W0B0YWdJRD0ne0B0YWdJRH0nXSZxdW90OyZndDsmbHQ7eHVwZGF0ZTplbGVtZW50IG5hbWU9JnF1b3Q7eGh0bWw6aDQmcXVvdDsgeyRuc30mZ3Q7TmV3IEhlYWRsaW5lIDQmbHQ7L3h1cGRhdGU6ZWxlbWVudCZndDsmbHQ7L3h1cGRhdGU6aW5zZXJ0LWFmdGVyJmd0OyIvPgotPC9pbnNlcnQtYWZ0ZXI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpwIiBtb2RlPSJib2R5Ij4KLSAgICA8eHNsOmNob29zZSA+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0ieGh0bWw6b2JqZWN0Ij4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOm9iamVjdCIgbW9kZT0iYm9keSIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotCTxub2RlIG5hbWU9IlBhcmFncmFwaCIgc2VsZWN0PSIvKi94aHRtbDpib2R5L3hodG1sOnBbQHRhZ0lEPSd7QHRhZ0lEfSddIj4KLQkgIDxhY3Rpb24+PGRlbGV0ZSBuYW1lPSImbHQ7eHVwZGF0ZTpyZW1vdmUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkveGh0bWw6cFtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsvJmd0OyIvPjwvYWN0aW9uPgotCSAgPGNvbnRlbnQ+Ci0JICAgIDx0ZXh0YXJlYSBuYW1lPSImbHQ7eHVwZGF0ZTp1cGRhdGUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkveGh0bWw6cFtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsmZ3Q7IiBjb2xzPSI4MCIgcm93cz0iMzAiPgotCSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9Im5vZGUoKSIvPgotCSAgICA8L3RleHRhcmVhPgotCSAgPC9jb250ZW50PgotCTwvbm9kZT4KLQkKLQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5zZXJ0bWVudSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPi8qL3hodG1sOmJvZHkveGh0bWw6cDwveHNsOndpdGgtcGFyYW0+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDp0YWJsZSIgbW9kZT0iYm9keSI+Ci08bm9kZSBuYW1lPSJUYWJsZSIgc2VsZWN0PSIvKi94aHRtbDpib2R5L3hodG1sOnRhYmxlW0B0YWdJRD0ne0B0YWdJRH0nXSI+Ci0gIDxhY3Rpb24+PGRlbGV0ZSBuYW1lPSImbHQ7eHVwZGF0ZTpyZW1vdmUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkveGh0bWw6dGFibGVbQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7LyZndDsiLz48L2FjdGlvbj4KLSAgPGNvbnRlbnQ+Ci0gICAgPHRleHRhcmVhIG5hbWU9IiZsdDt4dXBkYXRlOnVwZGF0ZSBzZWxlY3Q9JnF1b3Q7LyoveGh0bWw6Ym9keS94aHRtbDp0YWJsZVtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsmZ3Q7IiBjb2xzPSI4MCIgcm93cz0iMzAiPgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0ibm9kZSgpIi8+Ci0gICAgPC90ZXh0YXJlYT4KLSAgPC9jb250ZW50PgotPC9ub2RlPgotCi08eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5zZXJ0bWVudSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPi8qL3hodG1sOmJvZHkveGh0bWw6dGFibGU8L3hzbDp3aXRoLXBhcmFtPjwveHNsOmNhbGwtdGVtcGxhdGU+Ci0KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDp1bCIgbW9kZT0iYm9keSI+Ci08bm9kZSBuYW1lPSJVbm9yZGVyZWQgTGlzdCIgc2VsZWN0PSIvKi94aHRtbDpib2R5L3hodG1sOnVsW0B0YWdJRD0ne0B0YWdJRH0nXSI+Ci0gIDxhY3Rpb24+PGRlbGV0ZSBuYW1lPSImbHQ7eHVwZGF0ZTpyZW1vdmUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkveGh0bWw6dWxbQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7LyZndDsiLz48L2FjdGlvbj4KLSAgPGNvbnRlbnQ+Ci0gICAgPHRleHRhcmVhIG5hbWU9IiZsdDt4dXBkYXRlOnVwZGF0ZSBzZWxlY3Q9JnF1b3Q7LyoveGh0bWw6Ym9keS94aHRtbDp1bFtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsmZ3Q7IiBjb2xzPSI4MCIgcm93cz0iMzAiPgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0ibm9kZSgpIi8+Ci0gICAgPC90ZXh0YXJlYT4KLSAgPC9jb250ZW50PgotPC9ub2RlPgotCi08eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5zZXJ0bWVudSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPi8qL3hodG1sOmJvZHkveGh0bWw6dWw8L3hzbDp3aXRoLXBhcmFtPjwveHNsOmNhbGwtdGVtcGxhdGU+Ci0KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpvbCIgbW9kZT0iYm9keSI+Ci08bm9kZSBuYW1lPSJPcmRlcmVkIExpc3QiIHNlbGVjdD0iLyoveGh0bWw6Ym9keS94aHRtbDpvbFtAdGFnSUQ9J3tAdGFnSUR9J10iPgotICA8YWN0aW9uPjxkZWxldGUgbmFtZT0iJmx0O3h1cGRhdGU6cmVtb3ZlIHNlbGVjdD0mcXVvdDsvKi94aHRtbDpib2R5L3hodG1sOm9sW0B0YWdJRD0ne0B0YWdJRH0nXSZxdW90Oy8mZ3Q7Ii8+PC9hY3Rpb24+Ci0gIDxjb250ZW50PgotICAgIDx0ZXh0YXJlYSBuYW1lPSImbHQ7eHVwZGF0ZTp1cGRhdGUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkveGh0bWw6b2xbQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7Jmd0OyIgY29scz0iODAiIHJvd3M9IjMwIj4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9Im5vZGUoKSIvPgotICAgIDwvdGV4dGFyZWE+Ci0gIDwvY29udGVudD4KLTwvbm9kZT4KLQotPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imluc2VydG1lbnUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj4vKi94aHRtbDpib2R5L3hodG1sOm9sPC94c2w6d2l0aC1wYXJhbT48L3hzbDpjYWxsLXRlbXBsYXRlPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aDEiIG1vZGU9ImJvZHkiPgotPG5vZGUgbmFtZT0iSGVhZGxpbmUgMSIgc2VsZWN0PSIvKi94aHRtbDpib2R5L3hodG1sOmgxW0B0YWdJRD0ne0B0YWdJRH0nXSI+Ci0gIDxhY3Rpb24+PGRlbGV0ZSBuYW1lPSImbHQ7eHVwZGF0ZTpyZW1vdmUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkveGh0bWw6aDFbQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7LyZndDsiLz48L2FjdGlvbj4KLSAgPGNvbnRlbnQ+Ci0gICAgPHRleHRhcmVhIG5hbWU9IiZsdDt4dXBkYXRlOnVwZGF0ZSBzZWxlY3Q9JnF1b3Q7LyoveGh0bWw6Ym9keS94aHRtbDpoMVtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsmZ3Q7IiBjb2xzPSI4MCIgcm93cz0iMyI+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJub2RlKCkiLz4KLSAgICA8L3RleHRhcmVhPgotICA8L2NvbnRlbnQ+Ci08L25vZGU+Ci0KLTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbnNlcnRtZW51Ij48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+LyoveGh0bWw6Ym9keS94aHRtbDpoMTwveHNsOndpdGgtcGFyYW0+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotPC94c2w6dGVtcGxhdGU+Ci0gICAgCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpoMiIgbW9kZT0iYm9keSI+Ci08bm9kZSBuYW1lPSJIZWFkbGluZSAyIiBzZWxlY3Q9Ii8qL3hodG1sOmJvZHkveGh0bWw6aDJbQHRhZ0lEPSd7QHRhZ0lEfSddIj4KLSAgPGFjdGlvbj48ZGVsZXRlIG5hbWU9IiZsdDt4dXBkYXRlOnJlbW92ZSBzZWxlY3Q9JnF1b3Q7LyoveGh0bWw6Ym9keS94aHRtbDpoMltAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsvJmd0OyIvPjwvYWN0aW9uPgotICA8Y29udGVudD4KLSAgICA8dGV4dGFyZWEgbmFtZT0iJmx0O3h1cGRhdGU6dXBkYXRlIHNlbGVjdD0mcXVvdDsvKi94aHRtbDpib2R5L3hodG1sOmgyW0B0YWdJRD0ne0B0YWdJRH0nXSZxdW90OyZndDsiIGNvbHM9IjgwIiByb3dzPSIzIj4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9Im5vZGUoKSIvPgotICAgIDwvdGV4dGFyZWE+Ci0gIDwvY29udGVudD4KLTwvbm9kZT4KLQotPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imluc2VydG1lbnUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj4vKi94aHRtbDpib2R5L3hodG1sOmgyPC94c2w6d2l0aC1wYXJhbT48L3hzbDpjYWxsLXRlbXBsYXRlPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aDMiIG1vZGU9ImJvZHkiPgotPG5vZGUgbmFtZT0iSGVhZGxpbmUgMyIgc2VsZWN0PSIvKi94aHRtbDpib2R5L3hodG1sOmgzW0B0YWdJRD0ne0B0YWdJRH0nXSI+Ci0gIDxhY3Rpb24+PGRlbGV0ZSBuYW1lPSImbHQ7eHVwZGF0ZTpyZW1vdmUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkveGh0bWw6aDNbQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7LyZndDsiLz48L2FjdGlvbj4KLSAgPGNvbnRlbnQ+Ci0gICAgPHRleHRhcmVhIG5hbWU9IiZsdDt4dXBkYXRlOnVwZGF0ZSBzZWxlY3Q9JnF1b3Q7LyoveGh0bWw6Ym9keS94aHRtbDpoM1tAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsmZ3Q7IiBjb2xzPSI4MCIgcm93cz0iMyI+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJub2RlKCkiLz4KLSAgICA8L3RleHRhcmVhPgotICA8L2NvbnRlbnQ+Ci08L25vZGU+Ci0KLTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbnNlcnRtZW51Ij48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+LyoveGh0bWw6Ym9keS94aHRtbDpoMzwveHNsOndpdGgtcGFyYW0+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmg0IiBtb2RlPSJib2R5Ij4KLTxub2RlIG5hbWU9IkhlYWRsaW5lIDQiIHNlbGVjdD0iLyoveGh0bWw6Ym9keS94aHRtbDpoNFtAdGFnSUQ9J3tAdGFnSUR9J10iPgotICA8YWN0aW9uPjxkZWxldGUgbmFtZT0iJmx0O3h1cGRhdGU6cmVtb3ZlIHNlbGVjdD0mcXVvdDsvKi94aHRtbDpib2R5L3hodG1sOmg0W0B0YWdJRD0ne0B0YWdJRH0nXSZxdW90Oy8mZ3Q7Ii8+PC9hY3Rpb24+Ci0gIDxjb250ZW50PgotICAgIDx0ZXh0YXJlYSBuYW1lPSImbHQ7eHVwZGF0ZTp1cGRhdGUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkveGh0bWw6aDRbQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7Jmd0OyIgY29scz0iODAiIHJvd3M9IjMiPgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0ibm9kZSgpIi8+Ci0gICAgPC90ZXh0YXJlYT4KLSAgPC9jb250ZW50PgotPC9ub2RlPgotCi08eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5zZXJ0bWVudSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPi8qL3hodG1sOmJvZHkveGh0bWw6aDQ8L3hzbDp3aXRoLXBhcmFtPjwveHNsOmNhbGwtdGVtcGxhdGU+Ci0KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpociIgbW9kZT0iYm9keSI+Ci08bm9kZSBuYW1lPSJIb3Jpem9udGFsIFJ1bGUiIHNlbGVjdD0iLyoveGh0bWw6Ym9keS94aHRtbDpocltAdGFnSUQ9J3tAdGFnSUR9J10iPgotICA8YWN0aW9uPjxkZWxldGUgbmFtZT0iJmx0O3h1cGRhdGU6cmVtb3ZlIHNlbGVjdD0mcXVvdDsvKi94aHRtbDpib2R5L3hodG1sOmhyW0B0YWdJRD0ne0B0YWdJRH0nXSZxdW90Oy8mZ3Q7Ii8+PC9hY3Rpb24+Ci08L25vZGU+Ci0KLTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbnNlcnRtZW51Ij48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+LyoveGh0bWw6Ym9keS94aHRtbDpocjwveHNsOndpdGgtcGFyYW0+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6b2JqZWN0IiBtb2RlPSJib2R5Ij4KLSAgICA8bm9kZSBuYW1lPSJPYmplY3QiPgotICAgICAgPGFjdGlvbj48ZGVsZXRlIG5hbWU9IiZsdDt4dXBkYXRlOnJlbW92ZSBzZWxlY3Q9JnF1b3Q7LyoveGh0bWw6Ym9keS94aHRtbDpwL3hodG1sOm9iamVjdFtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsvJmd0OyIvPjwvYWN0aW9uPgotICAgICAgPGNvbnRlbnQ+Ci0JPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IiZsdDt4dXBkYXRlOnVwZGF0ZSBzZWxlY3Q9JnF1b3Q7LyoveGh0bWw6Ym9keS94aHRtbDpwL3hodG1sOm9iamVjdFtAdGFnSUQ9J3tAdGFnSUR9J10mcXVvdDsmZ3Q7IiBzaXplPSI4MCI+Ci0JICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRhdGEiLz4KLQkgIDwveHNsOmF0dHJpYnV0ZT4KLQk8L2lucHV0PgotICAgICAgPC9jb250ZW50PgotICAgIDwvbm9kZT4KLSAgICAKLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5zZXJ0bWVudSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPi8qL3hodG1sOmJvZHk8L3hzbDp3aXRoLXBhcmFtPjwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgCi0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxlbnlhOmFzc2V0IiBtb2RlPSJib2R5Ij4KLSAgICA8bm9kZSBuYW1lPSJBc3NldCI+Ci0gICAgICA8YWN0aW9uPgotCTxkZWxldGUgbmFtZT0iJmx0O3h1cGRhdGU6cmVtb3ZlIHNlbGVjdD0mcXVvdDsvKi94aHRtbDpib2R5L2xlbnlhOmFzc2V0W0B0YWdJRD0ne0B0YWdJRH0nXSZxdW90Oy8mZ3Q7Ii8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICAgIDxjb250ZW50PgotCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSImbHQ7eHVwZGF0ZTp1cGRhdGUgc2VsZWN0PSZxdW90Oy8qL3hodG1sOmJvZHkvbGVueWE6YXNzZXRbQHRhZ0lEPSd7QHRhZ0lEfSddJnF1b3Q7Jmd0OyIgc2l6ZT0iODAiPgotCSAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPgotCSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNyYyIvPgotCSAgPC94c2w6YXR0cmlidXRlPgotCTwvaW5wdXQ+Ci0gICAgICA8L2NvbnRlbnQ+Ci0gICAgPC9ub2RlPgotCi0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imluc2VydG1lbnUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj4vKi94aHRtbDpib2R5PC94c2w6d2l0aC1wYXJhbT48L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIAotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4gIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMveGh0bWwueHNsIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9tb2R1bGVzL2VkaXRvcnMvdXNlY2FzZXMvZm9ybXMveGh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGQyMTYwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL3hodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHhodG1sLnhzbCA0MjcwMyAyMDA0LTAzLTEzIDEyOjU3OjUzWiBncmVnb3IgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIgotICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCi0+Ci0KLTx4c2w6aW1wb3J0IGhyZWY9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9lZGl0b3JzL3VzZWNhc2VzL2Zvcm1zL2Zvcm0ueHNsIi8+Ci08eHNsOmltcG9ydCBocmVmPSJ4aHRtbC1jb21tb24ueHNsIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmh0bWwiPgotCi08bmFtZXNwYWNlIHByZWZpeD0ieGh0bWwiIHVyaT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIvPgotICAKLTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6Ym9keSIvPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4gIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9zZWFyY2gueHNsIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi9zZWFyY2gueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTM4NDlmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vc2VhcmNoLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogc2VhcmNoLnhzbCA3NjAxOSAyMDA0LTExLTE2IDIwOjEzOjMyWiBncmVnb3IgJCAtLT4KLQotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6bmF2PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbmF2aWdhdGlvbi8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ibmF2IgotICA+Ci0gIAotICA8eHNsOnBhcmFtIG5hbWU9InJvb3QiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJjaG9zZW5sYW5ndWFnZSIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImRlZmF1bHRsYW5ndWFnZSIvPgotICAKLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsYW5ndWFnZVN1ZmZpeCI+Ci0gICAgPHhzbDppZiB0ZXN0PSIkY2hvc2VubGFuZ3VhZ2UgIT0gJGRlZmF1bHRsYW5ndWFnZSI+Ci0gICAgICA8eHNsOnRleHQ+XzwveHNsOnRleHQ+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNob3Nlbmxhbmd1YWdlIi8+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnZhcmlhYmxlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmF2OnNpdGUiPgotICAgIDxkaXYgaWQ9InNlYXJjaCI+Ci0gICAgICA8Zm9ybSBhY3Rpb249Inskcm9vdH1zZWFyY2h7JGxhbmd1YWdlU3VmZml4fS5odG1sIiBpZD0iZm9ybS1zZWFyY2giPgotICAgICAgICA8cD4KLSAgICAgICAgICA8aW5wdXQgY2xhc3M9InNlYXJjaGZpZWxkIiB0eXBlPSJ0ZXh0IiBuYW1lPSJxdWVyeVN0cmluZyIgYWx0PSJTZWFyY2ggZmllbGQiLz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iMjAiIG5hbWU9InBhZ2VMZW5ndGgiLz4KLSAgICAgICAgICA8aW5wdXQgY2xhc3M9InNlYXJjaHN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIG5hbWU9ImlucHV0LWdvIi8+Ci0gICAgICAgIDwvcD4KLSAgICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vdGFicy54c2wgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL21vZHVsZXMvc2l0ZXRyZWUveHNsdC9uYXZpZ2F0aW9uL3RhYnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWI1NjI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvbW9kdWxlcy9zaXRldHJlZS94c2x0L25hdmlnYXRpb24vdGFicy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHRhYnMueHNsIDE4OTg4MCAyMDA1LTA2LTEwIDAyOjM2OjA5WiBncmVnb3IgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB4bWxuczpuYXY9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9uYXZpZ2F0aW9uLzEuMCIKLSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ibmF2IgotICAgID4KLSAgICAKLTx4c2w6aW1wb3J0IGhyZWY9InRlbXBsYXRlLWZhbGxiYWNrOmRlZmF1bHQ6Ly9sZW55YS9tb2R1bGVzL3NpdGV0cmVlL3hzbHQvbmF2aWdhdGlvbi90YWJzLnhzbCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJuYXY6c2l0ZSI+Ci0gICAgCi0gIDxkaXYgaWQ9InRhYnMiPgotICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJlLXNlcGFyYXRvciIvPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJuYXY6bm9kZSI+Ci0gICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgJmd0OyAxIGFuZCBAdmlzaWJsZWlubmF2ID0gJ3RydWUnIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcGFyYXRvciIvPgotICAgICAgPC94c2w6aWY+Ci0gICAgICAKLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHZpc2libGVpbm5hdiA9ICdmYWxzZSciLz4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImRlc2NlbmRhbnQtb3Itc2VsZjo6bmF2Om5vZGVbQGN1cnJlbnQgPSAndHJ1ZSddIj4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiLXNlbGVjdGVkIi8+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWIiLz4KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAKLSAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icG9zdC1zZXBhcmF0b3IiLz4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8L2Rpdj4KLQotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWIiPgotICA8dGQ+PGRpdiBjbGFzcz0idGFiIj48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibGFiZWwiLz48L2Rpdj48L3RkPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWItc2VsZWN0ZWQiPgotICA8dGQ+PGRpdiBjbGFzcz0idGFiLXNlbGVjdGVkIj48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibGFiZWwiLz48L2Rpdj48L3RkPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzZXBhcmF0b3IiPgotICAgIDx0ZD48ZGl2IGNsYXNzPSJ0YWItc2VwYXJhdG9yIj4mIzE2MDs8L2Rpdj48L3RkPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcmUtc2VwYXJhdG9yIj4KLSAgICA8dGQ+PGRpdiBjbGFzcz0idGFiLXByZS1zZXBhcmF0b3IiPiYjMTYwOzwvZGl2PjwvdGQ+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBvc3Qtc2VwYXJhdG9yIj4KLSAgICA8dGQgY2xhc3M9InRhYi1wb3N0LXNlcGFyYXRvciI+PGRpdiBjbGFzcz0idGFiLXNlcGFyYXRvciI+JiMxNjA7PC9kaXY+PC90ZD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5NmNhYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgIAotICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgIAotICAgJElkJAotICAgCi0tLT4KLQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iPgotICAKLSAgPG1lc3NhZ2Uga2V5PSJwdWJsaWNhdGlvbi10aXRsZSI+V2VsY29tZSB0byB0aGUgRGVmYXVsdCBQdWJsaWNhdGlvbiBmcm9tIHswfSE8L21lc3NhZ2U+Ci0gCi0gIDxtZXNzYWdlIGtleT0iZGVmYXVsdC5jcmVhdGVkb2MuaWR0YWtlbiI+VGhlIElEIHlvdSd2ZSBlbnRlcmVkIGlzIGFscmVhZHkgdGFrZW4uIFBsZWFzZSBjaG9vc2UgYW5vdGhlciBvbmUuPC9tZXNzYWdlPgotIAotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiI+Q3JlYXRlIG5ldyBsYW5ndWFnZSB2ZXJzaW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBsYW5ndWFnZSBmb3IgZXhpc3RpbmcgRG9jdW1lbnQiPk5ldyBsYW5ndWFnZSBmb3IgZXhpc3RpbmcgRG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVmYXVsdC5jcmVhdGVkb2MuaW5mby5hbGwtbGFuZ3VhZ2UtdmVyc2lvbnMtZXhpc3RzIj5UaGVyZSBhcmUgYWxyZWFkeSB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50IGZvciBhbGwgbGFuZ3VhZ2VzLjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9Imxhc3QtcHVibGlzaGVkIj5UaGlzIHBhZ2Ugd2FzIGxhc3QgcHVibGlzaGVkIGF0IHswfSBieSB7MX0uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5ldmVyLXB1Ymxpc2hlZCI+VGhpcyBwYWdlIGhhcyBub3QgYmVlbiBwdWJsaXNoZWQgeWV0LjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9ImVycm9yLWdlbmVyaWMtY29tbWVudCI+UGxlYXNlIGNvbnRhY3QgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvci48L21lc3NhZ2U+Ci0gIAotPC9jYXRhbG9ndWU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJkMTYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICAgCi0gICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgCi0gCi0gICAkSWQkIAotICAgCi0tLT4KLQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiPgotCi0gIDxtZXNzYWdlIGtleT0icHVibGljYXRpb24tdGl0bGUiPldpbGxrb21tZW4genVyIERlZmF1bHQtUHVibGlrYXRpb24gdm9uIHswfSE8L21lc3NhZ2U+Ci0gIAotICA8bWVzc2FnZSBrZXk9ImRlZmF1bHQuZG9jLmNyZWF0ZS5pZHRha2VuIj5EaWUgZWluZ2ViZW5lIElEIGlzdCBzY2hvbiB2ZXJnZWJlbi4gQml0dGUgd8OkO2hsZW4gU2llIGVpbmUgYW5kZXJlIElELjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiI+TmV1ZSBTcHJhY2h2ZXJzaW9uIGFubGVnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IGxhbmd1YWdlIGZvciBleGlzdGluZyBEb2N1bWVudCI+TmV1ZSBTcHJhY2h2ZXJzaW9uIGbDvHIgZXhpc3RpZXJlbmRlcyBEb2t1bWVudCBhbmxlZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlZmF1bHQuY3JlYXRlZG9jLmluZm8uYWxsLWxhbmd1YWdlLXZlcnNpb25zLWV4aXN0cyI+RGFzIERva3VtZW50IGV4aXN0aWVydCBiZXJlaXRzIGluIGFsbGVuIG5vdHdlbmRpZ2VuIFNwcmFjaGVuLjwvbWVzc2FnZT4KLSAgCi0gIDxtZXNzYWdlIGtleT0ibGFzdC1wdWJsaXNoZWQiPkRpZXNlIFNlaXRlIHd1cmRlIHp1bGV0enQgcHVibGl6aWVydCBhbSB7MH0gdm9uIHsxfS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibmV2ZXItcHVibGlzaGVkIj5EaWVzZSBTZWl0ZSB3dXJkZSBub2NoIG5pY2h0IHB1YmxpemllcnQuPC9tZXNzYWdlPgotICAKLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci1nZW5lcmljLWNvbW1lbnQiPkJpdHRlIGtvbnRha3RpZXJlbiBTaWUgZGVuIFN5c3RlbWFkbWluaXN0cmF0b3IuPC9tZXNzYWdlPgotICAKLTwvY2F0YWxvZ3VlPgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2VzLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ5Y2VlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICAgCi0gICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgCi0gICAkSWQkCi0KLSAgIEB0cmFuc2xhdG9ycyBTYWx2YWRvciBDb2JyZXJvIDxzYWx2YWRvcl9jb2JyZXJvX2ppbWVuZXogYXQgZG1yLWNvbnN1bHRpbmcgZG90IGNvbT4KLSAgIAotLS0+Ci0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVzIj4KLQotICA8bWVzc2FnZSBrZXk9ImRlZmF1bHQuY3JlYXRlZG9jLmlkdGFrZW4iPkVsIElEIGludHJvZHVjaWRvIHlhIGV4aXN0ZS4gUG9yIGZhdm9yLCBlc2NvamEgb3Ryby48L21lc3NhZ2U+Ci0gCi0gIDxtZXNzYWdlIGtleT0iQ3JlYXRlIG5ldyBsYW5ndWFnZSB2ZXJzaW9uIj5DcmVhciBudWV2YSB2ZXJzaW9uIGRlIGlkaW9tYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgbGFuZ3VhZ2UgZm9yIGV4aXN0aW5nIERvY3VtZW50Ij5OdWV2byBpZGlvbWEgcGFyYSBlbCBEb2N1bWVudG8gZXhpc3RlbnRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlZmF1bHQuY3JlYXRlZG9jLmluZm8uYWxsLWxhbmd1YWdlLXZlcnNpb25zLWV4aXN0cyI+WWEgZXhpc3RlbiB2ZXJzaW9uZXMgZGUgZXN0ZSBkb2N1bWVudG8gcGFyYSB0b2RvcyBsb3MgaWRpb21hcy48L21lc3NhZ2U+Ci0KLTwvY2F0YWxvZ3VlPgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2ZyLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZnIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNhMjZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZnIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICAgCi0gICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgCi0gICAkSWQkCi0gICAKLSAgIEB0cmFuc2xhdG9ycyBPbGl2aWVyIExhbmdlIDx3aXJlIGF0IHBldGl0LWF0ZWxpZXIgZG90IGNoPgotICAgCi0tLT4KLQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZnIiPgotCi0gIDxtZXNzYWdlIGtleT0iZGVmYXVsdC5jcmVhdGVkb2MuaWR0YWtlbiI+TCdpZGVudGlmaWFudCAoSUQpIHF1ZSB2b3VzIGF2ZXogY2hvaXNpIGVzdCBkw6lqw6AgdXRpbGlzw6kuIFZldWlsbGV6IGVuIGNob2lzaXIgdW4gYXV0cmUuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiI+Q3LDqWVyIHVuZSBub3V2ZWxsZSB0cmFkdWN0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBsYW5ndWFnZSBmb3IgZXhpc3RpbmcgRG9jdW1lbnQiPk5vdXZlbGxlIHRyYWR1Y3Rpb24gZCd1biBkb2N1bWVudCBleGlzdGFudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZWZhdWx0LmNyZWF0ZWRvYy5pbmZvLmFsbC1sYW5ndWFnZS12ZXJzaW9ucy1leGlzdHMiPkxlcyB0cmFkdWN0aW9ucyBkZSBjZSBkb2N1bWVudCBleGlzdGVudCBkw6lqw6AgZGFucyB0b3V0ZXMgbGVzIGxhbmd1ZXMuPC9tZXNzYWdlPgotICAKLTwvY2F0YWxvZ3VlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9pdC54bWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2l0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyZDExMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2l0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAKLSAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAKLSAgICRJZCQKLSAgIEB0cmFuc2xhdG9ycyBHaWFtcGFvbG8gVHJhcGFzc28gIDx0cmFwbyBhdCB0cmFwbyBkb3QgaXQ+Ci0tLT4KLTxjYXRhbG9ndWUgeG1sOmxhbmc9Iml0Ij4KLQk8bWVzc2FnZSBrZXk9ImRlZmF1bHQuY3JlYXRlZG9jLmlkdGFrZW4iPkwnSUQgc2NlbHRvIMOoIGdpw6AgdXRpbGl6emF0by4gU2NlZ2xpZXJlIHVuIGFsdHJvIElELjwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkNyZWF0ZSBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiI+Q3JlYSBudW92YSBsaW5ndWE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJOZXcgbGFuZ3VhZ2UgZm9yIGV4aXN0aW5nIERvY3VtZW50Ij5OdW92YSBsaW5ndWEgcGVyIHVuIERvY3VtZW50byBlc2lzdGVudGU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJkZWZhdWx0LmNyZWF0ZWRvYy5pbmZvLmFsbC1sYW5ndWFnZS12ZXJzaW9ucy1leGlzdHMiPkVzaXN0b25vIGdpw6AgdmVyc2lvbmkgZGkgcXVlc3RvIGRvY3VtZW50byBwZXIgdHV0dGUgbGUgbGluZ3VlLjwvbWVzc2FnZT4KLTwvY2F0YWxvZ3VlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9wdC54bWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX3B0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2ZTQ4Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX3B0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSAgJElkOiBjbXN1aV9wdC54bWwgMTExNjc2IDIwMDUtMDYtMTUgMjM6NTA6NDNaIGdyZWdvciAkDQotDQotICAgQHRyYW5zbGF0b3JzIFJvbGFuZG8gSXNpZG9ybyA8cmxpIGF0IHVuaW5vdmEgZG90IHB0Pg0KLQ0KLS0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9InB0Ij4NCi0NCi0gIDxtZXNzYWdlIGtleT0iZGVmYXVsdC5jcmVhdGVkb2MuaWR0YWtlbiI+TyBJRCBpbnRyb2R1emlkbyBqw6EgZXhpc3RlLiBQb3IgZmF2b3IgaW50cm9kdXphIG91dHJvLjwvbWVzc2FnZT4NCi0gDQotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiI+Q3JpYXIgbm92YSB2ZXJzw6NvIGRlIGlkaW9tYTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iTmV3IGxhbmd1YWdlIGZvciBleGlzdGluZyBEb2N1bWVudCI+Tm92byBpZGlvbWEgcGFyYSBvIERvY3VtZW50byBleGlzdGVudGU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImRlZmF1bHQuY3JlYXRlZG9jLmluZm8uYWxsLWxhbmd1YWdlLXZlcnNpb25zLWV4aXN0cyI+SsOhIGV4aXN0ZW0gdmVyc8O1ZXMgZGVzdGUgZG9jdW1lbnRvIGVtIHRvZG9zIG9zIGlkaW9tYXMuPC9tZXNzYWdlPg0KLQ0KLTwvY2F0YWxvZ3VlPg0KLQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfcnUueG1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9ydS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NTRjODkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9ydS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gICANCi0gICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0gICANCi0gICAkSWQ6IGNtc3VpLnhtbCAxNTMwOTEgMjAwNS0wMi0wOSAxNzoyNzoxOVogZWRpdGggJA0KLSAgIA0KLS0tPg0KLQ0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9InJ1Ij4NCi0gDQotICA8bWVzc2FnZSBrZXk9ImRlZmF1bHQuY3JlYXRlZG9jLmlkdGFrZW4iPtCS0LLQtdC00ZHQvdC90YvQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQt9Cw0L3Rj9GCLiDQktGL0LHQtdGA0LXRgtC1INC00YzRgNGD0LPQvtC5LCDQv9C+0LbQsNC70YPQudGB0YLQsC48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiI+0KHQvtC30LTQsNGC0Ywg0LLQtdGA0YHQuNGOINC90LAg0LTRgNGD0LPQvtC8INGP0LfRi9C60LU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ik5ldyBsYW5ndWFnZSBmb3IgZXhpc3RpbmcgRG9jdW1lbnQiPtCf0LXRgNC10LLQtdGB0YLQuCDRgdGD0YnQtdGB0YLQstGD0Y7RidC40Lkg0LTQvtC60YPQvNC10L3RgjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iZGVmYXVsdC5jcmVhdGVkb2MuaW5mby5hbGwtbGFuZ3VhZ2UtdmVyc2lvbnMtZXhpc3RzIj7QktC10YDRgdC40Lgg0Y3RgtC+0LPQviDQtNC+0LrRg9C80LXQvdGC0LAg0YPQttC1INC10YHRgtGMINC90LAg0LLRgdC10YUg0Y/Qt9GL0LrQsNGFLjwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIGtleT0ibGFzdF9wdWJsaXNoZWQiPtCf0L7RgdC70LXQtNC90Y/RjyDQv9GD0LHQu9C40LrQsNGG0LjRjzwvbWVzc2FnZT4NCi08L2NhdGFsb2d1ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3VzZWNhc2VzL3RhYi9tZXRhLmp4IGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS91c2VjYXNlcy90YWIvbWV0YS5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1Zjc0My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L2xlbnlhL3VzZWNhc2VzL3RhYi9tZXRhLmp4CisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6ang9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi90ZW1wbGF0ZXMvangvMS4wIiAKLSAgICAgICAgICAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIgCi0gICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiAKLSAgICAgICAgICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiA+Ci0gIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL3VzZWNhc2VzL3RhYi9oZWFkLmp4Ii8+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvdXNlY2FzZXMvdGFiL3NpdGV0cmVlLmp4Ii8+Ci0gICAgPGp4OmltcG9ydCB1cmk9ImZhbGxiYWNrOi8vbGVueWEvdXNlY2FzZXMvdGVtcGxhdGVzL3RhYnMuangiLz4KLSAgICA8ZGl2IGlkPSJjb250ZW50YmxvY2sxIiBjbGFzcz0ibGVueWEtdGFiLXNpdGV0cmVlIj4KLSAgICAgIDxmb3JtIGlkPSJmb3JtLW1ldGEiPgotICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgIDxqeDppbXBvcnQgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS90ZW1wbGF0ZXMvbWVzc2FnZXMuangiLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9InRpdGxlIj48aTE4bjp0ZXh0PlRpdGxlPC9pMThuOnRleHQ+OjwvbGFiZWw+PC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJ0aXRsZSIgbmFtZT0ibWV0YS5kYy50aXRsZSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ21ldGEuZGMudGl0bGUnKX0iLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9InN1YmplY3QiPjxpMThuOnRleHQ+U3ViamVjdDwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic3ViamVjdCIgbmFtZT0ibWV0YS5kYy5zdWJqZWN0IiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbWV0YS5kYy5zdWJqZWN0Jyl9Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJkZXNjcmlwdGlvbiI+PGkxOG46dGV4dD5EZXNjcmlwdGlvbjwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDwhLS0gTi5CLjogZG8gbm90IHB1dCBzcGFjZXMgb3IgY2FycmlhZ2UgcmV0dXJucyBpbnNpZGUgdGhlCi0gICAgICAgICAgICAgICAgICAgdGV4dGFyZWEgZWxlbWVudCAtIHRoZXNlIHdvdWxkIGJlIHJlbmRlcmVkIC0tPgotICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9ImRlc2NyaXB0aW9uIiBuYW1lPSJtZXRhLmRjLmRlc2NyaXB0aW9uIiByb3dzPSIzIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50Ij48ang6b3V0IHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdtZXRhLmRjLmRlc2NyaXB0aW9uJyl9Ii8+PC90ZXh0YXJlYT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxsYWJlbCBmb3I9InB1Ymxpc2hlciI+PGkxOG46dGV4dD5QdWJsaXNoZXI8L2kxOG46dGV4dD46PC9sYWJlbD48L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InB1Ymxpc2hlciIgbmFtZT0ibWV0YS5kYy5wdWJsaXNoZXIiIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiIHZhbHVlPSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdtZXRhLmRjLnB1Ymxpc2hlcicpfSIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+PGxhYmVsIGZvcj0icmlnaHRzIj48aTE4bjp0ZXh0PlJpZ2h0czwvaTE4bjp0ZXh0Pjo8L2xhYmVsPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icmlnaHRzIiBuYW1lPSJtZXRhLmRjLnJpZ2h0cyIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ21ldGEuZGMucmlnaHRzJyl9Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PkNyZWF0aW9uIERhdGU8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGp4Om91dCB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbWV0YS5kYy5kYXRlJyl9Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJjcmVhdG9yIj48aTE4bjp0ZXh0PkNyZWF0b3I8L2kxOG46dGV4dD46PC9sYWJlbD48L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY3JlYXRvciIgbmFtZT0ibWV0YS5kYy5jcmVhdG9yIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbWV0YS5kYy5jcmVhdG9yJyl9Ii8+Ci0gICAgICAgICAgICAgIDxqeDpvdXQgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ21ldGEuZGMuY3JlYXRvcicpfSIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDxqeDppZiB0ZXN0PSIke3VzZWNhc2UuZ2V0UGFyYW1ldGVyKCdzaG93Q3VzdG9tJykuZXF1YWxzKCd0cnVlJyl9Ij4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj4KLSAgICAgICAgICAgICAgICA8aDI+PGkxOG46dGV4dD5DdXN0b20gbWV0YWRhdGE8L2kxOG46dGV4dD48L2gyPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48bGFiZWwgZm9yPSJteU1ldGEiPjxpMThuOnRleHQ+TXkKLSAgICAgICAgICAgICAgICBjdXN0b20gbWV0YWRhdGE8L2kxOG46dGV4dD46PC9sYWJlbD48L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJteU1ldGEiIG5hbWU9Im1ldGEuY3VzdG9tLm15TWV0YSIKLSAgICAgICAgICAgICAgICAgIGNsYXNzPSJsZW55YS1mb3JtLWVsZW1lbnQiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignbWV0YS5jdXN0b20ubXlNZXRhJyl9Ii8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvang6aWY+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkLz4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgICAgPGp4OmlmCi0gICAgICAgICAgICAgICAgdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc2hvd0N1c3RvbScpLmVxdWFscygnZmFsc2UnKX0iPgotICAgICAgICAgICAgICAgIDxpbnB1dCBpMThuOmF0dHI9InZhbHVlIiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJTaG93IGN1c3RvbSBtZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9InRoaXMuZm9ybS5zaG93Q3VzdG9tLnZhbHVlPSd0cnVlJzsiLz4KLSAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgICAgPGp4OmlmCi0gICAgICAgICAgICAgICAgdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignc2hvd0N1c3RvbScpLmVxdWFscygndHJ1ZScpfSI+Ci0gICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IgotICAgICAgICAgICAgICAgICAgdmFsdWU9IkhpZGUgY3VzdG9tIG1ldGFkYXRhIgotICAgICAgICAgICAgICAgICAgb25DbGljaz0idGhpcy5mb3JtLnNob3dDdXN0b20udmFsdWU9J2ZhbHNlJzsiLz4KLSAgICAgICAgICAgICAgPC9qeDppZj4KLSAgICAgICAgICAgICAgPGp4OmNob29zZT4KLSAgICAgICAgICAgICAgICA8ang6d2hlbgotICAgICAgICAgICAgICAgICAgdGVzdD0iJHt1c2VjYXNlLmdldFBhcmFtZXRlcignZG9jdW1lbnQnKS5nZXRBcmVhKCkuZXF1YWxzKCdhdXRob3JpbmcnKSAmYW1wOyZhbXA7ICEgdXNlY2FzZS5oYXNFcnJvcnMoKX0iPgotICAgICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iU2F2ZSIvPgotICAgICAgICAgICAgICAgIDwvang6d2hlbj4KLSAgICAgICAgICAgICAgICA8ang6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IgotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD0iZGlzYWJsZWQiIHZhbHVlPSJTYXZlIi8+Ci0gICAgICAgICAgICAgICAgPC9qeDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDwvang6Y2hvb3NlPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsZW55YS51c2VjYXNlIiB2YWx1ZT0iJHtyZXF1ZXN0LmdldFBhcmFtZXRlcignbGVueWEudXNlY2FzZScpfSIvPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0ic2hvd0N1c3RvbSIgbmFtZT0ic2hvd0N1c3RvbSIgdmFsdWU9IiR7dXNlY2FzZS5nZXRQYXJhbWV0ZXIoJ3Nob3dDdXN0b20nKX0iLz4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB2YWx1ZT0iJHtjb250aW51YXRpb24uaWR9Ii8+Ci0gICAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS94c2x0L2V4Y2VwdGlvbi9nZW5lcmljLnhzbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbGVueWEveHNsdC9leGNlcHRpb24vZ2VuZXJpYy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjRkNGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9sZW55YS94c2x0L2V4Y2VwdGlvbi9nZW5lcmljLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGdlbmVyaWMueHNsIDU4OTg3MiAyMDA3LTEwLTI5IDIxOjQ3OjM5WiBhbmRyZWFzICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczplcnJvcj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2Vycm9yLzIuMSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSI+Ci0gIAotICA8eHNsOnBhcmFtIG5hbWU9InJvb3QiLz4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVycm9yOm5vdGlmeSI+Ci0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPjxpMThuOnRleHQgaTE4bjprZXk9ImVycm9yLWdlbmVyaWMiIC8+PC90aXRsZT4KLSAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7JHJvb3R9L2Nzcy9wYWdlLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLSAgICAgIDwvaGVhZD4KLSAgICAgIDxib2R5PgotICAgICAgICAKLSAgICAgICAgPGRpdiBpZD0icGFnZSI+Ci0gICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZC8+Ci0gICAgICAgICAgICAgIDx0ZCBpZD0icHJvamVjdC1sb2dvIj48aW1nIHNyYz0ieyRyb290fS9pbWFnZXMvcHJvamVjdC1sb2dvLnBuZyIgYWx0PSJwcm9qZWN0IGxvZ28iLz48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHN0eWxlPSJ3aWR0aDogMjMwcHgiLz4KLSAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4KLSAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImJvZHkiPgotICAgICAgICAgICAgICAgICAgICA8aDE+Ci0gICAgICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0iZXJyb3ItZ2VuZXJpYyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC9oMT4KLSAgICAgICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0iZXJyb3ItZ2VuZXJpYy1jb21tZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjb21tZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJlcnJvcjptZXNzYWdlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImVycm9yOmRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlcnJvcjpleHRyYSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjb21tZW50PgotICAgICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3I6ZXh0cmEiPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKEBlcnJvcjpkZXNjcmlwdGlvbiwnc3RhY2t0cmFjZScpIj4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlcnJvcjpkZXNjcmlwdGlvbiIvPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKC4sJyYjMTM7JywnJykiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21lbnVzLnhtYXAgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L21lbnVzLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMWJiZGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tZW51cy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgCQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJsaXZlLyoqIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJzZXJ2ZXJwYWdlcyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL2NvbnRlbnQvbWVudXMvbGl2ZS54c3AiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSBhbGwgZG9jdW1lbnQgdHlwZXMgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioqIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJzZXJ2ZXJwYWdlcyIgc3JjPSJmYWxsYmFjazovL2NvbmZpZy9tZW51cy9nZW5lcmljLnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvY29uZmlnL2NvY29vbi14Y29uZi9yZXNvdXJjZS10eXBlLWhvbWVwYWdlLnhjb25mIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL2NvbmZpZy9jb2Nvb24teGNvbmYvcmVzb3VyY2UtdHlwZS1ob21lcGFnZS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ZGYwMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvY29uZmlnL2NvY29vbi14Y29uZi9yZXNvdXJjZS10eXBlLWhvbWVwYWdlLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBkb2N0eXBlcy54Y29uZiAxNjQ2MzUgMjAwNS0wNC0yNSAyMDowMTo0M1ogdHNjaGxhYmFjaCAkIC0tPgotCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24vcmVzb3VyY2UtdHlwZXMiIHVubGVzcz0iL2NvY29vbi9yZXNvdXJjZS10eXBlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnaG9tZXBhZ2UnXSI+Ci0KLSAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJob21lcGFnZSIKLSAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI9ImxlbnlhLnJlc291cmNldHlwZXMuaG9tZXBhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlJlc291cmNlVHlwZUltcGwiPgotICAgIDxzY2hlbWEgCi0gICAgICAgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvaG9tZXBhZ2UvcmVzb3VyY2VzL3NjaGVtYXMvaG9tZXBhZ2Uucm5nIgotICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8wLjkiCi0gICAgLz4KLQotICAgIDwhLS0gRGVmYXVsdCB0aW1lIGluIHNlY29uZHMgdW50aWwgdGhlIHJlc291cmNlLXR5cGUgaGFzIGV4cGlyZWQgLS0+ICAKLSAgICA8ZXhwaXJlcyBzZWNvbmRzPSIwIiAvPgotCi0gICAgPHNhbXBsZSAKLSAgICAgICBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3hodG1sK3htbCIKLSAgICAgICB1cmk9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9ob21lcGFnZS9zYW1wbGVzL2hvbWVwYWdlLnhtbCIKLSAgICAvPgotICAgIDxsaW5rLWF0dHJpYnV0ZSB4cGF0aD0iLy8qW25hbWVzcGFjZS11cmkoKSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJ10vQGhyZWYiLz4KLSAgICA8bGluay1hdHRyaWJ1dGUgeHBhdGg9Ii8vKltuYW1lc3BhY2UtdXJpKCkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCddL0BkYXRhIi8+Ci0gICAgPGxpbmstYXR0cmlidXRlIHhwYXRoPSIvLypbbmFtZXNwYWNlLXVyaSgpID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnXS9Ac3JjIi8+Ci0gICAgPGZvcm1hdCBuYW1lPSJ4aHRtbCIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL2hvbWVwYWdlL3hodG1sLnhtbCIvPgotICAgIDxmb3JtYXQgbmFtZT0ibHVjZW5lSW5kZXgiIHVyaT0iY29jb29uOi8vbW9kdWxlcy94aHRtbC9sdWNlbmUtaW5kZXgiLz4KLSAgICA8Zm9ybWF0IG5hbWU9IndlYmRhdkdFVCIgdXJpPSJjb2Nvb246Ly9tb2R1bGVzL3hodG1sL2RhdmdldC54bWwiLz4KLSAgICA8IS0tICJ4c2x0LWNsZWFuIiBmb3JtYXQgaXMgdXNlZCBieSB3ZWJEQVYgKGFuZCBvdGhlciBlZGl0b3JzPykgdG8gImNsZWFuIiB4bWwgY29udGVudCBiZWZvcmUgaXQgaXMgdmFsaWRhdGVkL3NhdmVkIC0tPgotICAgIDxmb3JtYXQgbmFtZT0ieHNsdC1jbGVhbiIgdXJpPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvaG9tZXBhZ2UveHNsdC9jbGVhbi1ob21lcGFnZS54c2wiLz4KLSAgPC9jb21wb25lbnQtaW5zdGFuY2U+Ci0KLTwveGNvbmY+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvY29uZmlnL21lbnVzL2hvbWVwYWdlLnhzcCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9jb25maWcvbWVudXMvaG9tZXBhZ2UueHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjRkYzZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9jb25maWcvbWVudXMvaG9tZXBhZ2UueHNwCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBnZW5lcmljLnhzcCAxNTU4MDYgMjAwNS0wMy0wMSAxNzo1NTo0MlogYW5kcmVhcyAkIC0tPgotCi08eHNwOnBhZ2UgCi0gICAgbGFuZ3VhZ2U9ImphdmEiIAotICAgIHhtbG5zOnhzcD0iaHR0cDovL2FwYWNoZS5vcmcveHNwIgotICAgIHhtbG5zOnhzcC1yZXF1ZXN0PSJodHRwOi8vYXBhY2hlLm9yZy94c3AvcmVxdWVzdC8yLjAiCi0gICAgeG1sbnM6aW5wdXQ9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi94c3AvaW5wdXQvMS4wIgotICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gICAgeG1sbnM6d2Y9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS93b3JrZmxvdy8xLjAiCi0gICAgeG1sbnM6dWM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91c2VjYXNlLzEuMCIKLSAgICB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21lbnViYXIvMS4wIgotPgotCi0gIDx4c3A6c3RydWN0dXJlPgotICAgIDx4c3A6aW5jbHVkZT5vcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudDwveHNwOmluY2x1ZGU+Ci0gICAgPHhzcDppbmNsdWRlPm9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLlB1YmxpY2F0aW9uPC94c3A6aW5jbHVkZT4KLSAgPC94c3A6c3RydWN0dXJlPgotICAKLSAgPG1lbnU+Ci0KLSAgICA8bWVudXM+Ci0gICAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkVkaXQiPgotICAgICAgICAgIDx4c3A6bG9naWM+Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE9iamVjdCBkb2MgPSA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIGFzPSJvYmplY3QiIG5hbWU9ImRvY3VtZW50Ii8+OwotICAgICAgICAgICAgICAgIGlmIChkb2MgaW5zdGFuY2VvZiBEb2N1bWVudCAmYW1wOyZhbXA7ICgoRG9jdW1lbnQpIGRvYykuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGUgPSA8aW5wdXQ6Z2V0LWF0dHJpYnV0ZSBtb2R1bGU9InBhZ2UtZW52ZWxvcGUiIGFzPSJzdHJpbmciIG5hbWU9ImRvY3VtZW50LXR5cGUiLz47Ci0gICAgICAgICAgICAgICAgICAgIGlmICgiaG9tZXBhZ2UiLmVxdWFscyhkb2N0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgPGJsb2NrIGFyZWFzPSJhdXRob3JpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJrdXB1LmVkaXQiIGhyZWY9Ij8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PldpdGggS3VwdTwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L2l0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9ImJ4ZS5lZGl0IiBocmVmPSI/Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PldpdGggQlhFPC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGl0ZW0gdWM6dXNlY2FzZT0iZWRpdG9ycy5mb3JtcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzcDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzcDpleHByPiI/Zm9ybT0iICsgZG9jdHlwZTwveHNwOmV4cHI+PC94c3A6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+V2l0aCBGb3JtczwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L2l0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtIHVjOnVzZWNhc2U9ImVkaXRvcnMub25lZm9ybSIgaHJlZj0iPyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD5XaXRoIG9uZSBGb3JtPC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYmxvY2s+Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIG1lbnUgZ2VuZXJhdGlvbjogIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgPC94c3A6bG9naWM+Ci0gICAgICA8L21lbnU+Ci0gICAgICAKLSAgICA8L21lbnVzPgotICAgIAotICA8L21lbnU+Ci08L3hzcDpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL2NvbmZpZy9tb2R1bGUueG1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL2NvbmZpZy9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JiZmY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9jb25maWcvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54bWwgMzc0Njg3IDIwMDYtMDItMDMgMTU6MjQ6NTVaIG1pY2hpICQgLS0+Ci0KLTxtb2R1bGUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8aWQ+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmhvbWVwYWdlPC9pZD4KLSAgPHBhY2thZ2U+b3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzPC9wYWNrYWdlPgotICA8dmVyc2lvbj4wLjEtZGV2PC92ZXJzaW9uPgotICA8bmFtZT5Ib21lcGFnZTwvbmFtZT4KLSAgPGxlbnlhLXZlcnNpb24+QGxlbnlhLnZlcnNpb25APC9sZW55YS12ZXJzaW9uPgotICA8ZGVzY3JpcHRpb24+SG9tZXBhZ2UgcmVzb3VyY2UgdHlwZSBmb3IgZGVmYXVsdCBwdWJsaWNhdGlvbi48L2Rlc2NyaXB0aW9uPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvbWVudXMueG1hcCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9tZW51cy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmVmYzc5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9tZW51cy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBtZW51cy54bWFwIDE3ODczOCAyMDA1LTA1LTI3IDAzOjQyOjA5WiBncmVnb3IgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgCQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKiI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2VydmVycGFnZXMiIHNyYz0iY29uZmlnL21lbnVzL2hvbWVwYWdlLnhzcCIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvcmVzb3VyY2VzL2Nzcy9ob21lcGFnZS5jc3MgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvcmVzb3VyY2VzL2Nzcy9ob21lcGFnZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjE0ZDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL3Jlc291cmNlcy9jc3MvaG9tZXBhZ2UuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0vKiBQdXQgeW91ciBkb2N0eXBlLXNwZWNpZmljIENTUyBoZXJlICovCi0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc4MjIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWkueG1sIDQ0NjU0MiAyMDA2LTA5LTE1IDA4OjE0OjM5WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZW4iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDxtZXNzYWdlIGtleT0icmVzb3VyY2VUeXBlLWhvbWVwYWdlIj5Ib21lcGFnZTwvbWVzc2FnZT4KLSAgDQotPC9jYXRhbG9ndWU+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ODViMzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBjbXN1aV9kZS54bWwgNDQ2NTQyIDIwMDYtMDktMTUgMDg6MTQ6MzlaIGFuZHJlYXMgJCAtLT4NCi0NCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJkZSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQ0KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUtaG9tZXBhZ2UiPkhvbWVwYWdlPC9tZXNzYWdlPgotICANCi08L2NhdGFsb2d1ZT4NCi0NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvcmVzb3VyY2VzL3NjaGVtYXMvaG9tZXBhZ2Uucm5nIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL3Jlc291cmNlcy9zY2hlbWFzL2hvbWVwYWdlLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3ZDVmOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UvcmVzb3VyY2VzL3NjaGVtYXMvaG9tZXBhZ2Uucm5nCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHhodG1sLnJuZyA0MjcwMiAyMDA0LTAzLTEzIDEyOjM0OjE4WiBncmVnb3IgJCAtLT4KLQotPCEtLSsKLSAgICB8IFhIVE1MIGRvY3R5cGUKLSAgICArLS0+Ci0KLTwhLS0rCi0gICAgfCBOYW1lc3BhY2VzOgotICAgIHwgbGVueWEgbmFtZXNwYWNlIGlzIHJlcXVpcmVkIGZvciBlbWJlZGRpbmcgYXNzZXRzLgotICAgICstLT4KLQotPGdyYW1tYXIgbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIgotICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiCi0gICAgPgotCi08aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwvcmVzb3VyY2VzL3NjaGVtYXMveGh0bWwucm5nIi8+Ci0KLTwvZ3JhbW1hcj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9zYW1wbGVzL2hvbWVwYWdlLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS9zYW1wbGVzL2hvbWVwYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4YzQwYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2Uvc2FtcGxlcy9ob21lcGFnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIAotICAgICAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIKLT4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPkRlZmF1bHQgUHVibGljYXRpb248L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgIDxoMT5EZWZhdWx0IFB1YmxpY2F0aW9uPC9oMT4KLSAgICA8cD5XZWxjb21lIHRvIHRoZSBkZWZhdWx0IExlbnlhIHB1YmxpY2F0aW9uITwvcD4KLSAgICA8cD5UaGUgcHVycG9zZSBvZiB0aGlzIHB1YmxpY2F0aW9uIGlzPC9wPgotICAgIDx1bD4KLSAgICAgIDxsaT50byBzaG93IGJlZ2lubmVycyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgTGVueWEgQ01TLDwvbGk+Ci0gICAgICA8bGk+dG8gcHJvdmlkZSBhbiAib3V0IG9mIHRoZSBib3giIHB1YmxpY2F0aW9uIHRoYXQgY2FuIGJlIGVhc2lseSBhZGFwdGVkIGFuZCB1c2VkLCBhbmQ8L2xpPgotICAgICAgPGxpPnRvIHByb3ZpZGUgYSBiYXNpcyBmb3IgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9ucyBvZiBuZXcgY29uY2VwdHMgYW5kIGJlc3QgcHJhY3RpY2VzLjwvbGk+Ci0gICAgPC91bD4KLSAgICA8cD4KLSAgICBZb3Ugd29uJ3QgZmluZCBhbnkgZmFuY3kgYW5kIGNvbmZ1c2luZyBiZWxscyBhbmQgd2hpc3RsZXMgaGVyZSwgYnV0IHRoZQotICAgIHB1YmxpY2F0aW9uIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gZ2V0IHN0YXJ0ZWQuCi0gICAgPC9wPgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2Uvc2l0ZW1hcC54bWFwIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL3NpdGVtYXAueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwYjQ5OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2Uvc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGRvY3R5cGVzLnhtYXAgMTc5NDg4IDIwMDUtMDYtMDIgMDI6Mjk6MzlaIGdyZWdvciAkIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotCi0gIDxtYXA6cGlwZWxpbmVzPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDwhLS0gVmlldyBSZXZpc2lvbj8gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioueG1sIj4KLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJzdGVwIiBwYXR0ZXJuPSJ2aWV3LXJldmlzaW9uIj4KLSAgICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY29udGVudC9yYy92aWV3LnhzcCI+Ci0gICAgICAgICAgPC9tYXA6Z2VuZXJhdGU+Ci0gICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvcmMvdG9Eb2MueHNsIi8+Ci0gICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvaG9tZXBhZ2UveHNsdC9ob21lcGFnZTJ4aHRtbC54c2wiPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVuZGVydHlwZSIgdmFsdWU9InsxfSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibm9kZWlkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbmFtZX0iLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9Ii8+Ci0gICAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im5ld3MtKl8qLnhtbCI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9InNpdGU6L3syfS9uZXdzP2Zvcm1hdD17MX0iPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9InNpdGU6L3syfS9uZXdzP2Zvcm1hdD17MX0iLz4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICAgIDxtYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIHBhcmFtZXRyaXplZCBkb2N0eXBlIG1hdGNoZXIgLS0+Ci0gICAgICA8IS0tIHBhdHRlcm49IntyZW5kZXJ0eXBlfSIgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioueG1sIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImxlbnlhLWRvY3VtZW50OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9LGxhbmc9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9e2xpbms6cmV2fSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9ob21lcGFnZS94c2x0L2hvbWVwYWdlMnhodG1sLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVuZGVydHlwZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOnJlbmRlcnR5cGV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibm9kZWlkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbmFtZX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InB1YklkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iY2luY2x1ZGUiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL3hzbHQvY2xlYW4taG9tZXBhZ2UueHNsIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL3hzbHQvY2xlYW4taG9tZXBhZ2UueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMxMWI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvbW9kdWxlcy9ob21lcGFnZS94c2x0L2NsZWFuLWhvbWVwYWdlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgID4KLQotICA8eHNsOmltcG9ydCBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwveHNsdC9jbGVhbi14aHRtbC54c2wiLz4KLQotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UveHNsdC9ob21lcGFnZTJ4aHRtbC54c2wgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L21vZHVsZXMvaG9tZXBhZ2UveHNsdC9ob21lcGFnZTJ4aHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDcyOWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9tb2R1bGVzL2hvbWVwYWdlL3hzbHQvaG9tZXBhZ2UyeGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcGFnZS1lbnZlbG9wZS8xLjAiCi0gIHhtbG5zOmNpPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaW5jbHVkZS8xLjAiIAotICA+Ci0gIAotICA8eHNsOmltcG9ydCBocmVmPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMveGh0bWwveHNsdC94aHRtbDJ4aHRtbC54c2wiLz4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0icHViSWQiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJjb250ZXh0UGF0aCIvPgotICA8eHNsOnBhcmFtIG5hbWU9Imxhbmd1YWdlIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibmV3c1BhdGgiLz4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii94aHRtbDpodG1sIj4KLSAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJsZW55YTptZXRhIi8+Ci0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7JGNvbnRleHRQYXRofS97JHB1YklkfS9tb2R1bGVzL2hvbWVwYWdlL2Nzcy9ob21lcGFnZS5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0gICAgICAgIDxjaTppbmNsdWRlIHNyYz0iY29jb29uOi9uZXdzLWhlYWRlcl97JGxhbmd1YWdlfS54bWwiLz4KLSAgICAgIDwvaGVhZD4KLSAgICAgIDxib2R5PgotICAgICAgICA8Y2k6aW5jbHVkZSBzcmM9ImNvY29vbjovbmV3cy1pbmNsdWRlX3skbGFuZ3VhZ2V9LnhtbCIvPgotICAgICAgICA8ZGl2IGlkPSJib2R5Ij4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRyZW5kZXJ0eXBlID0gJ2VkaXQnIj4KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImJ4ZV94cGF0aCI+L3hodG1sOmh0bWwveGh0bWw6Ym9keTwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmJvZHkvbm9kZSgpIi8+Ci0gICAgICAgIDwvZGl2PgotICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3JlYWRtZS54bWwgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3JlYWRtZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OWJmNGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9yZWFkbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBpbnRyb2R1Y3Rpb24ueG1sIDQ3Mzg2MSAyMDA2LTExLTEyIDAzOjUxOjE0WiBncmVnb3IgJCAtLT4KLQotPHBhZ2U6cGFnZSAKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0+Ci0gIDxwYWdlOmhlYWQvPgotICA8cGFnZTpib2R5PgotICAgIDxoMT5SRUFETUU6IERlZmF1bHQgcHVibGljYXRpb248L2gxPgotICAgIDxoMj5Vc2UgV2ViREFWOjwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpPkNhZGF2ZXI6IGNhZGF2ZXIgaHR0cDovLzEyNy4wLjAuMTo4ODg4L2RlZmF1bHQvd2ViZGF2PC9saT4KLSAgICAgIDxsaT5Nb3JlIEluZm86IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbGVueWEvSG93VG9FZGl0V2l0aFdlYkRBViI+aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9sZW55YS9Ib3dUb0VkaXRXaXRoV2ViREFWPC9hPjwvbGk+Ci0gICAgPC91bD4KLTwhLS0KLSAgICA8aDI+RW5hYmxlIEpDUjwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpPkJ1aWxkIExlbnlhIGFuZCBzdGFydCBpdDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIEltcG9ydCBjb250ZW50IGZyb20gZmlsZXN5c3RlbSBpbnRvIEpDUiBSZXBvc2l0b3J5IGJ5IGV4ZWN1dGluZzoKLSAgICAgICAgPGEgaHJlZj0iLi4vaW5kZXguaHRtbD9sZW55YS51c2VjYXNlPWpjci5pbXBvcnQiPi4uL2luZGV4Lmh0bWw/bGVueWEudXNlY2FzZT1qY3IuaW1wb3J0PC9hPgotICAgICAgPC9saT4KLSAgICAgIDxsaT5TdG9wIExlbnlhPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgU3dpdGNoIHRoZSBOb2RlRmFjdG9yeSB3aXRoaW4gPGk+YnVpbGQvbGVueWEvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2xlbnlhL2xlbnlhLnJvbGVzPC9pPgotICAgICAgICB0byA8aT5vcmcuYXBhY2hlLmxlbnlhLmNtcy5qY3IuSkNSTm9kZUZhY3Rvcnk8L2k+Ci0gICAgICA8L2xpPgotICAgICAgPGxpPk9wdGlvbmFsOiBUaGUgSkNSIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25maWd1cmVkIHdpdGhpbiBsb2NhbC5idWlsZC5wcm9wZXJ0aWVzIHJlc3AuIGJ1aWxkLnByb3BlcnRpZXM8L2xpPgotICAgICAgPGxpPlN0YXJ0IExlbnlhPC9saT4KLSAgICA8L3VsPgotLS0+Ci0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9taXNjL2J4ZS94aHRtbC1uYW1lc3BhY2VzLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvcmVzb3VyY2VzL21pc2MvYnhlL3hodG1sLW5hbWVzcGFjZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmU5YjA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvcmVzb3VyY2VzL21pc2MvYnhlL3hodG1sLW5hbWVzcGFjZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPG5hbWVzcGFjZXM+Ci0KLTx4bWxucz54aHRtbD1odHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sPC94bWxucz4KLTx4bWxucz5kYz1odHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLzwveG1sbnM+Ci08eG1sbnM+bGVueWE9aHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wPC94bWxucz4KLQotPC9uYW1lc3BhY2VzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9yZXNvdXJjZXMvc2hhcmVkL2Nzcy9ob21lcGFnZS5jc3MgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvY3NzL2hvbWVwYWdlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhMmVjZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvY3NzL2hvbWVwYWdlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotLyogUHV0IHlvdXIgZG9jdHlwZS1zcGVjaWZpYyBDU1MgaGVyZSAqLwotCi1kaXYjYm9keSB7Ci0gIG1hcmdpbi1yaWdodDogMzAwcHg7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9yZXNvdXJjZXMvc2hhcmVkL2Nzcy9saW5rcy5jc3MgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvY3NzL2xpbmtzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlYTczMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvY3NzL2xpbmtzLmNzcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8qIFB1dCB5b3VyIGRvY3R5cGUtc3BlY2lmaWMgQ1NTIGhlcmUgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvY3NzL25ld3MuY3NzIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9yZXNvdXJjZXMvc2hhcmVkL2Nzcy9uZXdzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzNjYwNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvY3NzL25ld3MuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0qIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0qIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0qICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0qIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLWRpdi5uZXdzRGF0ZSB7Ci0gIGZvbnQtc2l6ZTogc21hbGw7Ci0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0gIGZsb2F0OiByaWdodAotfQotCi0KLWRpdiNuZXdzIHsKLSAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBTYW5zLXNlcmlmOwotICBjbGVhcjogYm90aDsKLSAgZmxvYXQ6IHJpZ2h0OwotICB3aWR0aDogMjUwcHg7Ci0gIGJvcmRlcjogc29saWQgMXB4ICNCQjk5OTk7Ci0gIG1hcmdpbjogMHB4IDEwcHggMTBweCAxMHB4OwotICBwYWRkaW5nOiAxMHB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZFRUVFOwotfQotCi1kaXYjbmV3cyBoMSB7Ci0gIGZvbnQtc2l6ZTogbWVkaXVtOwotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDA7Ci19Ci0KLWRpdiNuZXdzIGgyIHsKLSAgZm9udC1zaXplOiBzbWFsbDsKLSAgbWFyZ2luLXRvcDogMTBweDsKLSAgYm9yZGVyLWJvdHRvbTogbm9uZTsKLSAgbWFyZ2luLWJvdHRvbTogMDsKLX0KLQotZGl2I25ld3MgcCB7Ci0gIG1hcmdpbi10b3A6IDAuM2VtOwotfQotCi1kaXYjbmV3cyBkaXYubmV3c0RhdGUgewotICBmbG9hdDogbm9uZTsKLX0KLQotZGl2LnJzc2xpbmsgewotICBmbG9hdDogcmlnaHQ7Ci0gIGZvbnQtc2l6ZTogeC1zbWFsbDsKLSAgYm9yZGVyLXRvcDogc29saWQgMXB4ICNGRkZGRkY7Ci0gIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggI0ZGRkZGRjsKLSAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICM2NjY2NjY7Ci0gIGJvcmRlci1yaWdodDogc29saWQgMXB4ICM2NjY2NjY7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNEREJCQkI7Ci0gIGNvbG9yOiAjMDAwMDAwOwotICBwYWRkaW5nOiAxcHggM3B4IDFweCAzcHg7Ci19Ci0KLWRpdi5yc3NsaW5rIGEgewotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9yZXNvdXJjZXMvc2hhcmVkL2Nzcy9wYWdlLmNzcyBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvcmVzb3VyY2VzL3NoYXJlZC9jc3MvcGFnZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjNkMTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9yZXNvdXJjZXMvc2hhcmVkL2Nzcy9wYWdlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLyogcGFnZSAqLwotCi1AaW1wb3J0IHVybCgibmV3cy5jc3MiKTsKLQotI3BhZ2UgewotICAgIHBhZGRpbmc6IDBweDsKLSAgICBtYXJnaW46IDBweDsKLX0KLQotLyogdGFicyAqLwotCi0jdGFicyB7Ci0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgNXB4ICNEREJCQkI7Ci0gICAgY29sb3I6IE1hcm9vbjsKLX0KLQotI3RhYnMgYSB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiBNYXJvb247Ci19Ci0KLSN0YWJzIHRhYmxlIHsKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIFNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiA4MCU7Ci19Ci0KLSN0YWJzIHRkIHsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwotfQotCi0jdGFicyBkaXYgewotICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Ci19Ci0KLS50YWIgYSwgLnRhYi1zZWxlY3RlZCBhIHsKLSAgICBkaXNwbGF5OiBibG9jazsKLX0KLQotLnRhYiBhIHNwYW4sIC50YWItc2VsZWN0ZWQgYSBzcGFuIHsKLSAgICBwYWRkaW5nOiAuM2VtIC42ZW07Ci0gICAgZGlzcGxheTogYmxvY2s7Ci19Ci0KLS50YWIgYSBzcGFuIHsKLSAgICBiYWNrZ3JvdW5kOiB1cmwoJy9tb2R1bGVzL3N2Zy90YWItdG9wUmlnaHQtNS1GRkVFRUUtQkI5OTk5LnBuZycpIHJpZ2h0IHRvcCBuby1yZXBlYXQ7Ci0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNCQjk5OTk7Ci19Ci0KLS50YWIgYSB7Ci0gICAgYmFja2dyb3VuZDogdXJsKCcvbW9kdWxlcy9zdmcvdGFiLXRvcExlZnQtNS1GRkVFRUUtQkI5OTk5LnBuZycpIGxlZnQgdG9wIG5vLXJlcGVhdDsKLX0KLQotLnRhYiBhOmhvdmVyIHNwYW4gewotICAgIGJhY2tncm91bmQ6IHVybCgnL21vZHVsZXMvc3ZnL3RhYi10b3BSaWdodC01LUVFQ0NDQy1CQjk5OTkucG5nJykgcmlnaHQgdG9wIG5vLXJlcGVhdDsKLSAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI0JCOTk5OTsKLX0KLSAgCi0udGFiIGE6aG92ZXIgewotICAgIGJhY2tncm91bmQ6IHVybCgnL21vZHVsZXMvc3ZnL3RhYi10b3BMZWZ0LTUtRUVDQ0NDLUJCOTk5OS5wbmcnKSBsZWZ0IHRvcCBuby1yZXBlYXQ7Ci19Ci0gIAotLnRhYi1zZWxlY3RlZCBhIHNwYW4gewotICAgIGJhY2tncm91bmQ6IHVybCgnL21vZHVsZXMvc3ZnL3RhYi10b3BSaWdodC01LUREQkJCQi1CQjk5OTkucG5nJykgcmlnaHQgdG9wIG5vLXJlcGVhdDsKLSAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI0REQkJCQjsKLX0KLQotLnRhYi1zZWxlY3RlZCBhIHsKLSAgICBiYWNrZ3JvdW5kOiB1cmwoJy9tb2R1bGVzL3N2Zy90YWItdG9wTGVmdC01LUREQkJCQi1CQjk5OTkucG5nJykgbGVmdCB0b3Agbm8tcmVwZWF0OwotfQotCi0udGFiLXNlcGFyYXRvciB7Ci0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNCQjk5OTk7Ci19Ci0KLS50YWItcHJlLXNlcGFyYXRvciB7Ci0gICAgd2lkdGg6IDI1cHg7Ci0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNCQjk5OTk7Ci19Ci0KLXRkLnRhYi1wb3N0LXNlcGFyYXRvciB7Ci0gICAgd2lkdGg6IDEwMCU7Ci19Ci0KLS8qIG1lbnUgKi8KLQotI21lbnUsICNsYW5ndWFnZXNlbGVjdG9yIHsKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIFNhbnMtc2VyaWY7Ci0gICAgYm9yZGVyOiBzb2xpZCAxcHggI0JCOTk5OTsKLSAgICBib3JkZXItbGVmdDogbm9uZTsKLSAgICBib3JkZXItdG9wOiBub25lOwotICAgIGNvbG9yOiBNYXJvb247Ci0gICAgcGFkZGluZzogNXB4IDBweCA1cHggMHB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZDQ0NDOwotfQotCi0jbWVudSB7Ci0gIGJvcmRlci1ib3R0b206IG5vbmU7Ci19Ci0KLSNsYW5ndWFnZXNlbGVjdG9yIHsKLSAgICBmb250LXNpemU6IDgwJTsKLSAgICBwYWRkaW5nLXRvcDogMTBweDsKLSAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7Ci0gICAgLyoKLSAgICBib3JkZXI6IG5vbmU7Ci0gICAgYmFja2dyb3VuZDogdXJsKCcvbW9kdWxlcy9zdmcvdGFiLWJvdHRvbVJpZ2h0LTUtRkZDQ0NDLUJCOTk5OS5wbmcnKSByaWdodCBib3R0b20gbm8tcmVwZWF0OwotICAgICovCi19Ci0KLSNsYW5ndWFnZXNlbGVjdG9yIHVsIHsKLSAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci0gICAgbWFyZ2luOiAwOwotICAgIHBhZGRpbmc6IDA7Ci19Ci0KLSNsYW5ndWFnZXNlbGVjdG9yIHVsIGxpIHsKLSAgICBkaXNwbGF5OiBpbmxpbmU7Ci19Ci0KLSNsYW5ndWFnZXNlbGVjdG9yIGEgaW1nIHsKLSAgICBib3JkZXI6IG5vbmU7Ci0gICAgbWFyZ2luOiAwOwotICAgIHBhZGRpbmc6IDFweDsKLSAgYm9yZGVyOiBzb2xpZCA1cHggI0ZGQ0NDQzsKLSAgICAvKgotICBib3JkZXI6IHNvbGlkIDFweCAjMDAwMDAwOwotICAqLwotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi0jbWVudSBhLCAjbGFuZ3VhZ2VzZWxlY3RvciBhIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgY29sb3I6IE1hcm9vbjsKLX0KLQotI2xhbmd1YWdlc2VsZWN0b3IgYSB7Ci19Ci0KLSNsYW5ndWFnZXNlbGVjdG9yIGE6aG92ZXIgewotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotI2xhbmd1YWdlc2VsZWN0b3IgYS5sZW55YS1sYW5ndWFnZS1pc0N1cnJlbnQgewotICAgIGZvbnQtd2VpZ2h0OmJvbGQ7Ci19Ci0KLSNsYW5ndWFnZXNlbGVjdG9yIGEubGVueWEtbGFuZ3VhZ2UtaXNDdXJyZW50IGltZyB7Ci0gIGJvcmRlcjogc29saWQgNXB4ICNGRkVFRUU7Ci19Ci0KLSNsYW5ndWFnZXNlbGVjdG9yIGEubGVueWEtbGFuZ3VhZ2UtaXNBdmFpbGFibGUgewotfQotCi0jbGFuZ3VhZ2VzZWxlY3RvciBhLmxlbnlhLWxhbmd1YWdlLWlzVW5hdmFpbGFibGUgewotICAgIGNvbG9yOiNhYWFhYWE7Ci0gICAgb3BhY2l0eTogMC41OwotfQotCi0jbWVudSBhOmhvdmVyIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotCi0ubWVudWJsb2NrLTEsIC5tZW51YmxvY2stc2VsZWN0ZWQtMSB7Ci0gICAgcGFkZGluZzogMHB4OwotICAgIC8qCi0gICAgYm9yZGVyLXRvcDogc29saWQgMXB4ICNEREJCQkI7Ci0gICAgYmFja2dyb3VuZDogI0ZGQ0NDQzsKLSAgICAqLwotfQotCi0ubWVudWJsb2NrLTEgLm1lbnVibG9jay0yIHsgZGlzcGxheTogbm9uZTsgfQotLm1lbnVibG9jay0yIC5tZW51YmxvY2stMyB7IGRpc3BsYXk6IG5vbmU7IH0KLS5tZW51YmxvY2stMyAubWVudWJsb2NrLTQgeyBkaXNwbGF5OiBub25lOyB9Ci0ubWVudWJsb2NrLTQgLm1lbnVibG9jay01IHsgZGlzcGxheTogbm9uZTsgfQotCi0ubWVudWl0ZW0tMSwgLm1lbnVpdGVtLXNlbGVjdGVkLTEsCi0ubWVudWl0ZW0tMiwgLm1lbnVpdGVtLXNlbGVjdGVkLTIsCi0ubWVudWl0ZW0tMywgLm1lbnVpdGVtLXNlbGVjdGVkLTMsCi0ubWVudWl0ZW0tNCwgLm1lbnVpdGVtLXNlbGVjdGVkLTQsCi0ubWVudWl0ZW0tNSwgLm1lbnVpdGVtLXNlbGVjdGVkLTUgewotICBmb250LXNpemU6IDgwJTsKLX0KLSAgCi0ubWVudWl0ZW0tMSwgLm1lbnVpdGVtLXNlbGVjdGVkLTEgewotICBtYXJnaW46IDEwcHggMHB4IDBweCAwcHg7Ci0gIHBhZGRpbmc6IDJweCA1cHggMnB4IDMwcHg7Ci0gIGJhY2tncm91bmQ6IHVybCgnL2RlZmF1bHQvbGl2ZS9pbWFnZXMvYnVsbGV0LnBuZycpIDE2cHggLjRlbSBuby1yZXBlYXQ7Ci19Ci0KLS5tZW51aXRlbS0yLCAubWVudWl0ZW0tc2VsZWN0ZWQtMiB7Ci0gIHBhZGRpbmc6IDJweCA1cHggMnB4IDUwcHg7Ci0gIGJhY2tncm91bmQ6IHVybCgnL2RlZmF1bHQvbGl2ZS9pbWFnZXMvYnVsbGV0LnBuZycpIDM2cHggLjRlbSBuby1yZXBlYXQ7Ci19Ci0KLS5tZW51aXRlbS0zLCAubWVudWl0ZW0tc2VsZWN0ZWQtMyB7Ci0gIHBhZGRpbmc6IDJweCA1cHggMnB4IDcwcHg7Ci0gIGJhY2tncm91bmQ6IHVybCgnL2RlZmF1bHQvbGl2ZS9pbWFnZXMvYnVsbGV0LnBuZycpIDU2cHggLjRlbSBuby1yZXBlYXQ7Ci19Ci0gIAotLm1lbnVpdGVtLTQsIC5tZW51aXRlbS1zZWxlY3RlZC00IHsKLSAgcGFkZGluZzogMnB4IDVweCAycHggOTBweDsKLSAgYmFja2dyb3VuZDogdXJsKCcvZGVmYXVsdC9saXZlL2ltYWdlcy9idWxsZXQucG5nJykgNzZweCAuNGVtIG5vLXJlcGVhdDsKLX0KLSAgCi0ubWVudWl0ZW0tNSwgLm1lbnVpdGVtLXNlbGVjdGVkLTUgewotICBwYWRkaW5nOiAycHggNXB4IDJweCAxMTBweDsKLSAgYmFja2dyb3VuZDogdXJsKCcvZGVmYXVsdC9saXZlL2ltYWdlcy9idWxsZXQucG5nJykgOTZweCAuNGVtIG5vLXJlcGVhdDsKLX0KLSAgCi0KLS5tZW51aXRlbS1zZWxlY3RlZC0xLAotLm1lbnVpdGVtLXNlbGVjdGVkLTIsCi0ubWVudWl0ZW0tc2VsZWN0ZWQtMywKLS5tZW51aXRlbS1zZWxlY3RlZC00LAotLm1lbnVpdGVtLXNlbGVjdGVkLTUgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZFRUVFOwotLyoKLSAgY29sb3I6IGJsYWNrOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjQkI5OTk5OwotICBmb250LXdlaWdodDogYm9sZDsKLSovCi19Ci0gIAotLyogYnJlYWRjcnVtYiAqLwotCi0jYnJlYWRjcnVtYiB7Ci0gICAgcGFkZGluZzogM3B4IDBweCAzcHggMzBweDsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZFRUVFOwotICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAjQkI5OTk5OwotICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjQkI5OTk5OwotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgU2Fucy1zZXJpZjsKLSAgICBmb250LXNpemU6IDgwJTsKLX0KLQotI2JyZWFkY3J1bWIgYSB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiBNYXJvb247Ci19Ci0KLSNzZWFyY2ggewotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgU2Fucy1zZXJpZjsKLSAgICBmb250LXNpemU6IDEwMCU7Ci0gICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwotICAgIGZsb2F0OiByaWdodDsKLSAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgICB0b3A6LTIwcHgKLX0KLQotaW5wdXQuc2VhcmNoZmllbGQgewotICAgIGZvbnQtc2l6ZTogODAlOwotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI0JCOTk5OTsKLX0KLQotaW5wdXQuc2VhcmNoc3VibWl0IHsKLSAgICBmb250LXNpemU6IDgwJTsKLSAgICBjb2xvcjogTWFyb29uOwotICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkVFRUU7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI0JCOTk5OTsKLX0KLQotaW5wdXQuc2VhcmNoc3VibWl0OmhvdmVyIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRERCQkJCOwotfQotCi0vKgotI3NlYXJjaCBhIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgY29sb3I6IE1hcm9vbjsKLX0KLSovCi0KLS8qIGJvZHkgKi8KLQotYm9keSB7Ci0gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBTYW5zLXNlcmlmOwotfQotCi0jYm9keSB7Ci0gICAgYm9yZGVyOiBub25lOwotICAgIHBhZGRpbmc6IDFlbTsKLSAgICBtYXJnaW4tbGVmdDogMTBweDsKLX0KLQotI2Zvb3RlciB7Ci0gICAgYm9yZGVyOiBub25lOwotICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjQkJCQjk5OwotICAgIHBhZGRpbmc6IDBlbSAxZW07Ci0gICAgbWFyZ2luLWxlZnQ6IDEwcHg7Ci0gICAgZm9udC1zdHlsZTogaXRhbGljOwotICAgIGNvbG9yOiBNYXJvb247Ci19Ci0KLSNtYWluIHsKLS8qCi0gICAgZmxvYXQ6IGxlZnQ7Ci0gICAgd2lkdGg6IDgwJTsKLSovCi19Ci0KLWgxIHsgZm9udC1zaXplOiAxNDAlOyB9Ci1oMiB7IGZvbnQtc2l6ZTogMTAwJTsgfQotaDMgeyBmb250LXNpemU6IDgwJTsgfQotcCB7IGZvbnQtc2l6ZTogODAlOyB9Ci1saSB7IGZvbnQtc2l6ZTogODAlOyB9Ci0KLS5jcm9zc2hlYWRpbmcgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxMTAlOyB9Ci0KLXRhYmxlLnNpbXBsZSB7Ci0gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLS8qCi0gICAgYmFja2dyb3VuZC1jb2xvcjogIzkwOTA5MDsKLSAgICBib3JkZXItY29sb3I6ICM5MDkwOTA7Ci0qLwotICAgIHdpZHRoOiBhdXRvOwotfQotCi1kaXYjYm9keSB0ZCB7Ci0gICAgZm9udC1zaXplOiBzbWFsbDsKLX0KLQotdGQuc2ltcGxlIHsKLSAgICBmb250LXNpemU6IDgwJTsKLSAgICBwYWRkaW5nOiAzcHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogV2hpdGU7Ci0gICAgYm9yZGVyOiBzb2xpZCAxcHggTmF2eTsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotfQotCi10aC52ZXJ0aWNhbCB7Ci0gIGZvbnQtc2l6ZTogc21hbGw7Ci0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0gIHRleHQtYWxpZ246IHJpZ2h0OwotICBwYWRkaW5nLXJpZ2h0OiAxZW07Ci0gIGNvbG9yOiAjNjY2NjY2OwotfQotICAKLWltZy5zaW1wbGUgewotfQotCi0jcHVibGljYXRpb24tdGl0bGUgewotICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDIwcHg7Ci0gICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKLSAgICBwYWRkaW5nLWxlZnQ6IDI1cHg7Ci0gICAgcGFkZGluZy1ib3R0b206IDE1cHg7Ci0gICAgY29sb3I6IE1hcm9vbjsKLX0KLQotI3Byb2plY3QtbG9nbyB7Ci0gICAgcGFkZGluZzogMTBweCAyMHB4IDBweCAwcHg7Ci0gICAgdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5tZWRpYSB7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgIHBhZGRpbmc6IDEwcHg7Ci19Ci0KLS5jYXB0aW9uIHsKLSAgICBwYWRkaW5nOiA1cHg7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKLSAgICBmb250LXNpemU6IDgwJTsKLX0KLQotLmFic3RyYWN0IHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotaDEgewotICAgIGZvbnQtc2l6ZTogMTIwJTsKLSAgICBjb2xvcjogTWFyb29uOwotfQotCi1oMiB7Ci0gICAgZm9udC1zaXplOiAxMDAlOwotICAgIGNvbG9yOiBNYXJvb247Ci0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNCQjk5OTk7Ci0gICAgbWFyZ2luLXRvcDogMzBweDsKLX0KLQotLmFzc2V0IHsgCi0gICAgZGlzcGxheTogYmxvY2s7Ci0gICAgY29sb3I6ICMwMDA7Ci0gICAgbWFyZ2luOiAxMHB4IDEwcHggMTBweCA1cHg7Ci0gICAgZm9udC1zaXplOiBzbWFsbDsKLX0KLQotLmFzc2V0IGltZyB7Ci0gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKLX0KLQotZGl2LnNlYXJjaC1ib3ggewotCWJvcmRlcjogc29saWQgMXB4ICNDQ0NDQ0M7Ci0Jd2lkdGg6IGF1dG87Ci0JbWF4LXdpZHRoOiAxMDAlOwotCWZvbnQtc2l6ZTogc21hbGw7Ci0JbWFyZ2luLWJvdHRvbTogMTBweDsKLX0KLQotZGl2LnNlYXJjaC1ib3gtdGl0bGUgewotICAgIGJhY2tncm91bmQtY29sb3I6ICNERERDQ0Y7Ci0JYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNDQ0NDQ0M7Ci0JY29sb3I6IEJsYWNrOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmc6IDNweCAxMHB4OwotfQotCi1kaXYuc2VhcmNoLWJveC1ib2R5IHsKLSAgICBwYWRkaW5nOiAxMHB4OwotICAgIGJhY2tncm91bmQtY29sb3I6ICNGNUY0RTk7Ci0JY29sb3I6IEJsYWNrOwotfQotCi10YWJsZS5zZWFyY2gtdGFibGUgewotCWNvbG9yOiBCbGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiBXaGl0ZTsKLQlib3JkZXItc3BhY2luZzogMHB4OwotCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci19Ci0KLXRhYmxlLnNlYXJjaC10YWJsZS1ub2JvcmRlciB7Ci0JYm9yZGVyOiAwcHg7Ci0JYm9yZGVyLXNwYWNpbmc6IDBweDsKLX0KLQotdGFibGUuc2VhcmNoLXRhYmxlIHRoIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREREQ0NGOwotCWJvcmRlcjogc29saWQgMXB4ICNDQ0NDQ0M7Ci0JY29sb3I6IEJsYWNrOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmc6IDNweCAxMHB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci0JZm9udC1zaXplOiBzbWFsbDsKLX0KLQotdGFibGUuc2VhcmNoLXRhYmxlIHRkIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNEU5OwotCWJvcmRlcjogc29saWQgMXB4ICNDQ0NDQ0M7Ci0JcGFkZGluZzogM3B4IDEwcHg7Ci0JZm9udC1zaXplOiBzbWFsbDsKLQljb2xvcjogQmxhY2s7Ci19Ci0KLXRhYmxlLnNlYXJjaC10YWJsZS1ub2JvcmRlciB0ZCB7Ci0JYm9yZGVyOiAwcHg7Ci0JcGFkZGluZzogM3B4IDEwcHg7Ci0JZm9udC1zaXplOiBzbWFsbDsKLX0KLQotdGFibGUuc2VhcmNoLXRhYmxlLW5vYm9yZGVyLW5vcGFkZGluZyB0ZCB7Ci0JYm9yZGVyOiAwcHg7Ci0JcGFkZGluZzogMHB4OwotCWZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLXRhYmxlLnNlYXJjaC10YWJsZS1ub2JvcmRlci1ub3BhZGRpbmcgdGggewotCWZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLS8qIEJyb2tlbiBJbnRlcm5hbCBMaW5rcyBpbiBBdXRob3JpbmcgYXJlYSAqLwotYS5icm9rZW5saW5rIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7Ci0gICAgYm9yZGVyOiAxcHggZGFzaGVkICMwMDAwMDA7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBTZWFyY2ggUmVzdWx0cyAqLwotLnNlYXJjaC1yZXN1bHRzLWZvcm0gewotICAgIG1hcmdpbi1ib3R0b206IDIwcHg7IH0KLQotLnNlYXJjaC1yZXN1bHRzIHsKLSAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci0gICAgbWFyZ2luOiAwOwotICAgIHBhZGRpbmc6IDA7Ci19IAotCi0uc2VhcmNoLXJlc3VsdCB7Ci0gICAgcGFkZGluZzogMC41MGVtIDA7Ci19Ci0KLS5zZWFyY2gtcmVzdWx0LXNjb3JlIHsKLSAgICBmb250LXNpemU6IDkwJTsKLSAgICBmb250LXdlaWdodDogbm9ybWFsOwotfQotCi0uc2VhcmNoLXJlc3VsdC1yYW5rIHsKLSAgICBmbG9hdDogbGVmdDsgCi19Ci0KLS5zZWFyY2gtcmVzdWx0LXRpdGxlIHsKLSAgICBtYXJnaW46IDAgMCAwIDMwcHg7Ci0gICAgcGFkZGluZzogMDsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnNlYXJjaC1yZXN1bHQtZGVzY3JpcHRpb24gewotICAgIG1hcmdpbi1sZWZ0OiAzMHB4OwotICAgIGNvbG9yOiAjOTk5OTk5OwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9yZXNvdXJjZXMvc2hhcmVkL2Nzcy94aHRtbC5jc3MgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvY3NzL3hodG1sLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0YjhlMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvY3NzL3hodG1sLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qIFB1dCB5b3VyIGRvY3R5cGUtc3BlY2lmaWMgQ1NTIGhlcmUgKi8KLQotLmNvbHVtbjFvZjIgewotICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gICAgICAgIHdpZHRoOiA0OCU7Ci0gICAgICAgIGZsb2F0OiBsZWZ0OwotfQotCi0uY29sdW1uMm9mMiB7Ci0gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICAgICAgZmxvYXQ6IGxlZnQ7Ci0gICAgICAgIHdpZHRoOiA0OCU7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxMnB4OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvcmVzb3VyY2VzL3NoYXJlZC9pbWFnZXMvYnVsbGV0LnBuZyBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvcmVzb3VyY2VzL3NoYXJlZC9pbWFnZXMvYnVsbGV0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlOTRmMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvaW1hZ2VzL2J1bGxldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvaW1hZ2VzL3Byb2plY3QtbG9nby5wbmcgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3Jlc291cmNlcy9zaGFyZWQvaW1hZ2VzL3Byb2plY3QtbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDMxMDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9yZXNvdXJjZXMvc2hhcmVkL2ltYWdlcy9wcm9qZWN0LWxvZ28ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC9zaXRlbWFwLnhtYXAgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3NpdGVtYXAueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4ODNkMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3NpdGVtYXAueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLQotICA8bWFwOmNvbXBvbmVudHM+Ci0gICAgPG1hcDp0cmFuc2Zvcm1lcnMgZGVmYXVsdD0ieHNsdCI+Ci0gICAgICA8bWFwOnRyYW5zZm9ybWVyIG5hbWU9Im1ldGFEYXRhIiBsb2dnZXI9ImxlbnlhLnNpdGVtYXAudHJhbnNmb3JtZXIubWV0YURhdGEiIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnRyYW5zZm9ybWF0aW9uLk1ldGFEYXRhVHJhbnNmb3JtZXIiLz4KLSAgICA8L21hcDp0cmFuc2Zvcm1lcnM+Ci0gICAgPG1hcDpzZXJpYWxpemVycyBkZWZhdWx0PSJ4aHRtbCI+Ci0gICAgICA8bWFwOnNlcmlhbGl6ZXIgbG9nZ2VyPSJzaXRlbWFwLnNlcmlhbGl6ZXIubGlua3MiIG5hbWU9ImxpbmtzIiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zZXJpYWxpemF0aW9uLkxpbmtTZXJpYWxpemVyIi8+Ci0gICAgPC9tYXA6c2VyaWFsaXplcnM+Ci0gIDwvbWFwOmNvbXBvbmVudHM+Ci0KLSAgPG1hcDp2aWV3cz4KLSAgICA8bWFwOnZpZXcgZnJvbS1wb3NpdGlvbj0ibGFzdCIgbmFtZT0ibGlua3MiPgotICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ibGlua3MiIC8+Ci0gICAgPC9tYXA6dmlldz4KLSAgPC9tYXA6dmlld3M+Ci0KLQotICA8bWFwOnBpcGVsaW5lcz4KLQotICAgIDwhLS0gVGhpcyBwaXBlbGluZSBoYW5kbGVzIGhlbHBlciByZXF1ZXN0cyBhbmQgbWV0YWRhdGEsIG5vdCB0aGUgYWN0dWFsIHB1YmxpY2F0aW9uIGRvY3VtZW50cyAtLT4KLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8IS0tIE5ldXRyb24gaW50cm9zcGVjdGlvbgotICAgICAgICAgICBUaGUgbG9jYXRpb24gb2YgdGhlIGludHJvc3BlY3Rpb24gZmlsZSBpcyBkZWZpbmVkIGluIDxsaW5rIHJlbD0ibmV1dHJvbi1pbnRyb3NwZWN0aW9uIi8+Ci0gICAgICAgICAgIChzZWUgeHNsdC9wYWdlMnhodG1sLnhzbCkuCi0gICAgICAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qKi9pbnRyb3NwZWN0aW9uLnhtbCI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy9uZXV0cm9uL3NpdGVtYXAueG1hcCI+Ci0gICAgICAgICAgICA8IS0tIE5COiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgZmFsbGJhY2s6Ly8gc291cmNlIGZhY3Rvcnkgd2hlbiBtb3VudGluZyBzaXRlbWFwcywgCi0gICAgICAgICAgICAgICAgIHRoYXQncyB3aHkgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgbW9kdWxlIHtmYWxsYmFjazp9IGlzIHVzZWQuIC0tPgotICAgICAgICAgICAgPG1hcDptb3VudCAKLSAgICAgICAgICAgICAgdXJpLXByZWZpeD0iIiAKLSAgICAgICAgICAgICAgc3JjPSJ7ZmFsbGJhY2s6bGVueWEvbW9kdWxlcy9uZXV0cm9uL3NpdGVtYXAueG1hcH0iIAotICAgICAgICAgICAgICBjaGVjay1yZWxvYWQ9InRydWUiIAotICAgICAgICAgICAgICByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIKLSAgICAgICAgICAgIC8+Ci0gICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZXh0Oi9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIi8+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgICAgICA8L21hcDpvdGhlcndpc2U+Ci0gICAgICAgIDwvbWFwOnNlbGVjdD4KLSAgICAgIDwvbWFwOm1hdGNoPgotIAotICAgICAgPCEtLQotICAgICAgICAgRklYTUU6IHRoZSB3aG9sZSB3ZWJkYXYgc2hlYmFuZyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgd2ViZGF2IG1vZHVsZSBzaXRlbWFwLgotICAgICAgLS0+Ci0gICAgICA8IS0tIGNhdGNoIHdlYmRhdiBHRVQgcmVxdWVzdHMuIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqL3dlYmRhdioqIj4KLSAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSJ7MX0vIiBzcmM9IntmYWxsYmFjazpsZW55YS9tb2R1bGVzL3dlYmRhdi9zaXRlbWFwLnhtYXB9IiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+ICAgIAotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDwhLS0gY2F0Y2ggUFVUIHJlcXVlc3RzICh1c2VkIGJ5IHdlYmRhdiBjbGllbnRzKSAtLT4KLSAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlcXVlc3QtbWV0aG9kIj4KLSAgICAgICAgPCEtLSBtYW55IGNsaWVudCBlZGl0b3JzIGxpa2UgdG8gUFVUIGNoYW5nZXMgLS0+Ci0gICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJQVVQiPgotICAgICAgICAgIDxtYXA6bW91bnQgdXJpLXByZWZpeD0iIiBzcmM9IntmYWxsYmFjazpsZW55YS9tb2R1bGVzL3dlYmRhdi9zaXRlbWFwLnhtYXB9IiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+Ci0gICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICAKLSAgICAgIDwhLS0gRklYTUU6IHRoaXMgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBnZXREb2N0eXBlWFNMVC8qIG1hdGNoZXIgYmVsb3cuIGN1cnJlbnRseSwgaXQgaXMgbmVjZXNzYXJ5Ci0gICAgICAgICAgIHNvIHRoYXQgImdldERvY3R5cGVYU0xULyIgcmVxdWVzdHMgZG8gbm90IGdldCBlYXRlbiBieSB0aGUgKiovIG1hdGNoZXIgYmVsb3cuIAotICAgICAgICAgICBQbHVzIGl0IHNob3VsZCBiZSBtb3ZlZCB0byBhbiBpbnRlcm5hbC1vbmx5IHBpcGVsaW5lLgotICAgICAgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImdldERvY3R5cGVYU0xULyI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJmYWxsYmFjazovL3hzbHQvcGFnZTJ4aHRtbC54c2wiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSBSZXF1ZXN0cyBlbmRpbmcgaW4gYSBzbGFzaCBhcmUgcmVkaXJlY3RlZCB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleC5odG1sIHBhZ2UgdG8gbWltaWMKLSAgICAgICAgICAgc3RhbmRhcmQgd2ViIGJyb3dzZXIgYmVoYXZpb3VyLiAtLT4KLSAgICAgIDwhLS0gRklYTUU6IHRoaXMgd2lsbCB0cmlnZ2VyIGEgSFRUUCByZWRpcmVjdC4gTWF5YmUgaXQncyBtb3JlIGVmZmVjdGl2ZSB0byBkbyBhbiBpbnRlcm5hbCByZWRpcmVjdCB1c2luZwotICAgICAgICAgICBhIGNvY29vbjovIFVSST8gQW4gYXBhY2hlIGh0dHBkIHNlcnZlciB3aWxsIG5vdCBzZW5kIGEgSFRUUCByZWRpcmVjdCB3aGVuIGEgZGlyZWN0b3J5IGlzIHJlcXVlc3RlZCwgYnV0Ci0gICAgICAgICAgIHNlcnZlIHRoZSBpbmRleC5odG1sIGZpbGUgaW1wbGljaXRseSBJSVJDLiAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKiovIj4KLSAgICAgICAgPG1hcDpyZWRpcmVjdC10byB1cmk9Intwcm94eTove3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3sxfS9pbmRleC5odG1sfSIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLQotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0iY2FjaGluZyI+Ci0KLSAgICAgIDwhLS0gUlNTIGZvcm1hdHRpbmcuIAotICAgICAgICAgICBGSVhNRTogdGhpcyBzaG91bGQgYmUgaGFuZGxlZCBieSBhbiBSU1MgZmVlZCBtb2R1bGUhCi0gICAgICAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKioucnNzIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9IntyZXNvdXJjZS10eXBlOmZvcm1hdC1yc3N9Ii8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDwhLS0gRklYTUU6IGVpdGhlciB0aGlzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGEgbWV0YWRhdGEgbW9kdWxlLCBvciBhdCBsZWFzdCB3ZSBuZWVkIHRvIGVzdGFibGlzaAotICAgICAgICAgICBzb21lIHN0YW5kYXJkIGZvciBtYWdpYyBleHRyYSBzdWZmaXhlcyBhbmQgc3RpY2sgdG8gaXQuCi0gICAgICAgICAgIEhlcmUgd2UgdXNlIC5odG1sLm1ldGEsIGJ4ZSB1c2VzIC5ieGUuaHRtbC4KLSAgICAgIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyoqLmh0bWwubWV0YSI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ibGVueWFNZXRhRGF0YSIgc3JjPSJsZW55YS1kb2N1bWVudDp7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSxhcmVhPXsxfSIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKm1ldGEiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9ImxlbnlhTWV0YURhdGEiIHNyYz0ibGVueWEtZG9jdW1lbnQ6e3JlcXVlc3QtcGFyYW06dXVpZH0sbGFuZz17cmVxdWVzdC1wYXJhbTpsYW5nfSxwdWJpZD17cmVxdWVzdC1wYXJhbTpwdWJpZH0sYXJlYT17cmVxdWVzdC1wYXJhbTphcmVhfSIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIHsxOnJlbmRlcnR5cGV9L3syOnB1Yn0vezM6YXJlYX0vezQ6cGF0aH0gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImRvY3VtZW50LWNvbnRlbnQvKi8qLyovKioiPgotICAgICAgICA8bWFwOmFjdCB0eXBlPSJsYW5ndWFnZS1leGlzdHMiPgotICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJ7cmVzb3VyY2UtdHlwZTpmb3JtYXQteGh0bWx9P3JlbmRlcnR5cGU9ey4uLzF9Ii8+Ci0gICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgPCEtLSBpZiB0aGUgYWN0aW9uIGZhaWxzIChpLmUuIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBleGlzdCksIGNyZWF0ZSBhIG5pY2UgZXJyb3IgcGFnZS4gLS0+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0ic2VydmVycGFnZXMiIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9jb250ZW50L2V4Y2VwdGlvbi9kb2N1bWVudC1kb2VzLW5vdC1leGlzdC54c3AiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvZXhjZXB0aW9uL2RvY3VtZW50LWRvZXMtbm90LWV4aXN0LnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFVybCIgdmFsdWU9IntyZXF1ZXN0OnJlcXVlc3RVUkl9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFBhdGgiIHZhbHVlPSJ7cmVxdWVzdDpjb250ZXh0UGF0aH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWIiIHZhbHVlPSJ7Mn0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYXRoIiB2YWx1ZT0iL3s0fSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJ7M30iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJpMThuIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpsYW5ndWFnZX0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIAotICAgICAgICAgVGhpcyBtYXRjaGVyIGFnZ3JlZ2F0ZXMgdGhlIExlbnlhIHBhZ2U6IGJyZWFkY3J1bWJzLCB0YWJzLCBtZW51IGV0Yy4gYW5kIHRoZSBhY3R1YWwgZG9jdW1lbnQgY29udGVudC4KLSAgICAgICAgIC9sZW55YWJvZHktcmF3LXsxOnJlbmRlcnR5cGV9L3syOnB1YmxpY2F0aW9uLWlkfS97MzphcmVhfS97NDpkb2N0eXBlfS97NTpkZWZhdWx0LWxhbmd1YWdlfS97NjpsYW5ndWFnZX0vezc6cGF0aH0gCi0gICAgICAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ibGVueWFib2R5LXJhdy0qLyovKi8qLyovKi8qKiI+Ci0gICAgICAgIDxtYXA6YWdncmVnYXRlIGVsZW1lbnQ9ImNtc2JvZHkiPgotICAgICAgICAgIDxtYXA6cGFydCBzcmM9ImNvY29vbjovL21vZHVsZXMvc2l0ZXRyZWUvYnJlYWRjcnVtYi97Mn0vezN9L3s1fS97Nn0vezd9LnhtbCIvPgotICAgICAgICAgIDxtYXA6cGFydCBzcmM9ImNvY29vbjovL21vZHVsZXMvc2l0ZXRyZWUvdGFicy97Mn0vezN9L3s1fS97Nn0vezd9LnhtbCIvPgotICAgICAgICAgIDxtYXA6cGFydCBzcmM9ImNvY29vbjovL21vZHVsZXMvc2l0ZXRyZWUvbWVudS97Mn0vezN9L3s1fS97Nn0vezd9LnhtbCIvPgotICAgICAgICAgIDxtYXA6cGFydCBzcmM9ImNvY29vbjovL21vZHVsZXMvc2l0ZXRyZWUvc2VhcmNoL3syfS97M30vezV9L3s2fS97N30ueG1sIi8+Ci0gICAgICAgICAgPG1hcDpwYXJ0IHNyYz0iY29jb29uOi8vbW9kdWxlcy9sYW5ndWFnZXNlbGVjdG9yL3RleHQtbm9uZS9mbGFnc2l6ZS0xMyIvPgotICAgICAgICAgIDxtYXA6cGFydCBzcmM9ImNvY29vbjovZG9jdW1lbnQtY29udGVudC97MX0vezJ9L3szfS97N30iLz4KLSAgICAgICAgPC9tYXA6YWdncmVnYXRlPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tCi0gICAgICAgIFRoaXMgbWF0Y2ggcHJvdmlkZXMgdGhlIFhTTFQgdG8gcmVuZGVyIGEgZ2l2ZW4gZG9jdHlwZSB0byBYSFRNTAotICAgICAgICBJdCBjaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSBkb2N0eXBlLXNwZWNpZmljIG9uZSwgYW5kIGlmIG5vbmUKLSAgICAgICAgZXhpc3RzLCBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IG9uZS4KLSAgICAgICAgL2dldERvY3R5cGVYU0xUL3sxOmRvY3R5cGV9Ci0gICAgICAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iZ2V0RG9jdHlwZVhTTFQvKiI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHJlZml4IiB2YWx1ZT0iZmFsbGJhY2s6Ly8iLz4KLSAgICAgICAgICA8bWFwOndoZW4gdGVzdD0ieHNsdC9wYWdlMnhodG1sLXsxfS54c2wiPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8veHNsdC9wYWdlMnhodG1sLXsxfS54c2wiLz4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICAgIDxtYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8veHNsdC9wYWdlMnhodG1sLnhzbCIvPgotICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0KLSAgICA8IS0tIFRoaXMgaXMgdGhlIHBpcGVsaW5lIHRoYXQgdWx0aW1hdGVseSBidWlsZHMgdGhlIHBhZ2UuIC0tPgotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0ibm9uY2FjaGluZyI+Ci0KLSAgICAgIDwhLS0gCi0gICAgICAgICBUaGlzIG1hdGNoZXIgdGFrZXMgdGhlIHJhdyBhZ2dyZWdhdGVkIHBhZ2UgY29udGVudCBhbmQgYXBwbGllcyBTVkcgcmVuZGVyaW5nIGFuZCBhIGRvY3R5cGUtc3BlY2lmaWMKLSAgICAgICAgIFhTTCB0cmFuc2Zvcm1hdGlvbi4gSXQgbWFrZXMgc29tZSBtZXRhIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byB0aGUgWFNMVCwgYW5kIGRlbW9uc3RyYXRlcyB0aGUgdXNlCi0gICAgICAgICBvZiB0aGUgTGVueWFNZXRhRGF0YVRyYW5zZm9ybWVyIChzZWUgYmVsb3cpLgotICAgICAgICAgL2xlbnlhYm9keS17MTpyZW5kZXJ0eXBlfS97MjpwdWJsaWNhdGlvbi1pZH0vezM6YXJlYX0vezQ6ZG9jdHlwZX0vezU6cGF0aH0gCi0gICAgICAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ibGVueWFib2R5LSovKi8qLyovKioiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi9sZW55YWJvZHktcmF3LXsxfS97Mn0vezN9L3s0fS97cGFnZS1lbnZlbG9wZTpkZWZhdWx0LWxhbmd1YWdlfS97cGFnZS1lbnZlbG9wZTpsYW5ndWFnZX0vezV9Ii8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3N2Zy94c2x0L2ltYWdlMnN2Zy54c2wiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJjb2Nvb246L2dldERvY3R5cGVYU0xUL3s0fSI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icm9vdCIgdmFsdWU9Ii97Mn0vezN9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHVibGljYXRpb24taWQiIHZhbHVlPSJ7Mn0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhcmVhIiB2YWx1ZT0iezN9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJsIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXJsfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50LXBhdGgiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50LXR5cGUiIHZhbHVlPSJ7NH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYW5ndWFnZSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRwcmVmaXgiIHZhbHVlPSJ7cmVxdWVzdDpjb250ZXh0UGF0aH0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsYXN0UHVibGlzaGVkVXNlciIgdmFsdWU9InthY2Nlc3MtY29udHJvbDp1c2VyLW5hbWU6e3dvcmtmbG93Omxhc3RVc2VyLnB1Ymxpc2h9fSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9Imxhc3RQdWJsaXNoZWREYXRlIiB2YWx1ZT0ie3dvcmtmbG93Omxhc3REYXRlLnB1Ymxpc2h9Ii8+Ci0gICAgICAgICAgPCEtLSBGb2xsb3dpbmcgaXMgYSBzaG93IG9mZiB0byBleHBsYWluIGxlbnlhLnByb3BlcnRpZXMueG1sIC0tPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImF1dGhvciIgdmFsdWU9Intwcm9wZXJ0aWVzOnB1YnMuZGVmYXVsdC5hdXRob3J9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibm9kZU5hbWUiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1uYW1lfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0KLSAgICAgICA8IS0tCi0gICAgICAgICBUaGUgc3R5bGVzaGVldCBhYm92ZSBoYXMgbm8gY2hhbmNlIHRvIGNoZWNrIGlmIHRoZSBkb2N1bWVudCBleGlzdHMsIHNvIGl0Ci0gICAgICAgICBpbnNlcnRzIHRoZSB0aXRsZSAiNDA0IChQYWdlIG5vdCBmb3VuZCkiIGludG8gdGhlIHBhZ2UuCi0gICAgICAgICBJZiB0aGUgZG9jdW1lbnQgZXhpc3RzIGluIHRoZSByZXF1ZXN0ZWQgbGFuZ3VhZ2UsIHRoZSB0aXRsZSBpcyBub3cgcmVwbGFjZWQgYnkKLSAgICAgICAgIHRoZSBhY3R1YWwgZHVibGluIGNvcmUgdGl0bGUuCi0gICAgICAgLS0+ICAKLSAgICAgICAgPG1hcDphY3QgdHlwZT0ibGFuZ3VhZ2UtZXhpc3RzIj4KLSAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8veHNsdC9hZGRYaHRtbFRpdGxlLnhzbCI+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdmFsdWU9IntkdWJsaW5jb3JlOnRpdGxlfSIvPgotICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPC9tYXA6YWN0PgotCi0gICAgICAgIDwhLS0gVGhpcyBpcyBhIGRlbW9uc3RyYXRpb24gb2YgdGhlIGdlbmVyaWMgbWV0YSBkYXRhIHRyYW5zZm9ybWVyCi0gICAgICAgICAgZGVzY3JpYmVkIGluIGJ1ZyAzOTg5MS4KLQotICAgICAgICAgIDEpIGRlZmluZSB0aGUgbnM6IHhtbG5zOm1ldGE9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGEvMS4wLyIKLSAgICAgICAgICAyKSB1c2UgaXQgaW4gYWJvdmUgeHNsIGxpa2UgZS5nLgotICAgICAgICAgIDxtZXRhOnZhbHVlIG5zPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgZWxlbWVudD0iZGF0ZSIgdXVpZD0ie0B1dWlkfSIvPgotCi0gICAgICAgICAgV2hlcmUgQG5zIGlzIHRoZSBuYW1lc3BhY2UgZm9yIHdoaWNoIHlvdSB3YW50IHRvIHJldHJpZXZlIHRoZSBAZWxlbWVudCBmb3IuCi0gICAgICAgICAgSWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBlbGVtZW50IHJlZ2lzdGVyZWQgdGhlbiB0aGUgdHJhbnNmb3JtZXIgcmV0dXJuczoKLSAgICAgICAgICA8dmFsdWUgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGEvMS4wLyIgdmFsdWU9IjIwMDUtMDktMTEgMTI6NDQ6MDUiIGVsZW1lbnQ9ImRhdGUiIC8+Ci0gICAgICAgICAgPHZhbHVlIHhtbG5zPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhLzEuMC8iIHZhbHVlPSIyMDA2LTA5LTExIDEyOjQ0OjA1IiBlbGVtZW50PSJkYXRlIiAvPgotCi0gICAgICAgICAgT3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBhcyBjaGFyYWN0ZXJzLgotICAgICAgICAtLT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0ibWV0YURhdGEiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9J3B1YmlkJyB2YWx1ZT0ne3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9Jy8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0nYXJlYScgdmFsdWU9J3twYWdlLWVudmVsb3BlOmFyZWF9Jy8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+ICAgICAgCi0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6bGFuZ3VhZ2V9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0idXVpZDJ1cmwiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gICAgPCEtLSBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGludG8gdGhlIHB1YmxpY2F0aW9uLiBUaGlzCi0gICAgcGlwZWxpbmUgdXNlcyB0aGUgdXJpcGFyYW1ldHJpemVyIHRvIGRldGVybWluZSB0aGUgZG9jdHlwZSBvZiB0aGlzCi0gICAgcmVxdWVzdC4gSXQgdGhlbiBhZ2dyZWdhdGVzIHRoZSBsZW55YSBtZW51IChmb3IgdGhlIGdpdmVuIGFyZWEpIGFuZAotICAgIHRoZSBsZW55YSBib2R5LCB0aGUgYWN0dWFsIGRvY3VtZW50LiAtLT4KLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8IS0tIAotICAgICAgICAgRklYTUU6IHRoaXMgaXMgYSBCWEUtc3BlY2lmaWMgaGFjayB0aGF0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IEJYRSdzIG1vZHVsZSBzaXRlbWFwLiBUaGUgcHVibGljYXRpb24gCi0gICAgICAgICBzaG91bGQgbm90IGJlIGNvbmNlcm5lZCB3aXRoIEJYRS1zcGVjaWZpYyBwcmUtcHJvY2Vzc2luZyBvZiBkb2N1bWVudHMuCi0gICAgICAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKiouYnhlLmh0bWwiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi9sZW55YWJvZHktZWRpdC97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdHlwZX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJwcm94eSIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIAotICAgICAgICBGaW5hbGx5OiB0aGlzIG1hdGNoZXIgaGFuZGxlcyByZXF1ZXN0cyBmb3IgcHVibGljYXRpb24gZG9jdW1lbnRzLiAKLSAgICAgICAgL3sxOmFyZWF9L3syOmRvY3VtZW50LXBhdGh9Lmh0bWwKLSAgICAgIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyoqLmh0bWwiPgotICAgICAgICA8IS0tIAotICAgICAgICAgIFRoZSBkZWZhdWx0IHB1YmxpY2F0aW9uIGRvZXMgbm90IGhhdmUgY29udGVudCBieSBkZWZhdWx0LiAKLSAgICAgICAgICBUaGlzIGNoZWNrIHByb3ZpZGVzIHRoZSB1c2VyIHdpdGggYSBkaWFsb2cgdG8gaW1wb3J0IGV4YW1wbGUgY29udGVudC4gCi0gICAgICAgICAgSXQgc2hvdWxkIGJlIHJlbW92ZWQgaW4gcHJvZHVjdGlvbiBzeXN0ZW1zLgotICAgICAgICAtLT4gCi0KLSAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIj4KLSAgICAgICAgICA8bWFwOndoZW4gdGVzdD0ibGVueWE6Ly9sZW55YS9wdWJzL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS9jb250ZW50L2F1dGhvcmluZy9zaXRldHJlZS54bWwiLz4KLSAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDxtYXA6cmVkaXJlY3QtdG8gdXJpPSJ7cHJveHk6L3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97MX0vezJ9Lmh0bWx9P2xlbnlhLnVzZWNhc2U9ZXhwb3J0LmltcG9ydEV4YW1wbGVDb250ZW50Ii8+Ci0gICAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPgotICAgICAgICA8L21hcDpzZWxlY3Q+Ci0KLSAgICAgICAgPCEtLSBJZiB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IGV4aXN0cywgd2Ugc2V0IGEgbGFzdC1tb2RpZmllZCBoZWFkZXIuIC0tPgotICAgICAgICA8bWFwOmFjdCB0eXBlPSJsYW5ndWFnZS1leGlzdHMiPgotICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InNldC1oZWFkZXIiPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iTGFzdC1Nb2RpZmllZCIgdmFsdWU9IntkYXRlLWlzbzg2MDEtcmZjODIyOntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhc3Rtb2RpZmllZH19IiAvPgotICAgICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICAgICAgCi0gICAgICAgIDwhLS0gCi0gICAgICAgICAgSEVBRCByZXF1ZXN0cyBzaG91bGRuJ3QgaGF2ZSBhbGwgdGhlIHhzbHQgb3ZlcmhlYWQsIGFsbCB0aGUgdXNlciB3YW50cyBpcyB0aGUgSFRUUCBoZWFkZXIgaW5mb3JtYXRpb24uCi0gICAgICAgICAgU28gdGhlIGFjdHVhbCBjb250ZW50IGdlbmVyYXRpb24gaXMgYnlwYXNzZWQuCi0gICAgICAgIC0tPgotICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJyZXF1ZXN0LW1ldGhvZCI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9IkhFQUQiPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRleHQ6Ly9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIiAvPgotICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieGh0bWwiLz4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICA8L21hcDpzZWxlY3Q+ICAgICAgICAgIAotCi0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InBhcmFtZXRlciI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyLXNlbGVjdG9yLXRlc3QiIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpyZW5kZXJ0eXBlfSIvPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJlZGl0Ij4KLSAgICAgICAgICAgIDwhLS0gcHV0IHRoZSBieGVfeHBhdGggYXR0cmlidXRlIGludG8gdGhlIHBhZ2UgLS0+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi9sZW55YWJvZHktZWRpdC97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdHlwZX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofSIvPgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgPG1hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8IS0tIHNhbmUgcGFnZSB3L28gaGFja3MgLS0+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi9sZW55YWJvZHktdmlldy97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX0ve3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdHlwZX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC1wYXRofSIvPgotICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotCi0gICAgICAgIDwhLS0gTWVudSBnZW5lcmF0aW9uIC0tPgotICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJwYXJhbWV0ZXIiPgotICAgICAgICAgIDwhLS0geW91IHJlbWVtYmVyIHRoYXQgezF9IGlzIHRoZSBhcmVhLCByaWdodD8gLS0+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyLXNlbGVjdG9yLXRlc3QiIHZhbHVlPSJ7MX0iLz4KLSAgICAgICAgICA8bWFwOndoZW4gdGVzdD0ibGl2ZSI+Ci0gICAgICAgICAgICA8IS0tIGRvIG5vdGhpbmcgZm9yIGxpdmUgLS0+Ci0gICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwhLS0gZm9yIGFsbCBvdGhlciBhcmVhcywgd2Ugd2FudCBhIEdVSSBtZW51IChoYW5kbGVkIGJ5IGdsb2JhbC1zaXRlbWFwLnhtYXAgLS0+Ci0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvY29vbjovL2xlbnlhLXBhZ2Uve3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3sxfS97Mn0ueG1sIi8+Ci0gICAgICAgICAgICA8IS0tIAotICAgICAgICAgICAgICAgIGV4dGVybmFsIGJyb2tlbiBsaW5rIHJlcG9ydGluZyAocHJldHR5IG11Y2ggdW50ZXN0ZWQpIAotICAgICAgICAgICAgICAgIFRPRE86IEV4dGVybmFsIExpbmtzIGNoZWNraW5nIHNob3VsZCBiZSBvcHRpb25hbCBvbiBhIGRvY3VtZW50IGJ5IGRvY3VtZW50IGJhc2lzLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9hdXRob3JpbmcvYWRkSmF2YVNjcmlwdC54c2wiPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJzY3JpcHRTUkMiIHZhbHVlPSIvbW9kdWxlcy9saW5rY2hlY2svbGlua3JlcG9ydGVyLmpzIi8+Ci0gICAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgICAgICAtLT4KLSAgICAgICAgICA8L21hcDpvdGhlcndpc2U+Ci0gICAgICAgIDwvbWFwOnNlbGVjdD4KLQotICAgICAgICA8IS0tIAotICAgICAgICAgICAgc3RyaXAgeGh0bWwgbmFtZXNwYWNlIHByZWZpeCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1YTUwgY29uZm9ybWFudCBicm93c2VycwotICAgICAgICAgICAgd29ya2Fyb3VuZCB0byBhdm9pZCBlbXB0eSBzY3JpcHQsIHN0eWxlIGFuZCB0ZXh0YXJlYSB0YWdzIChmaXJlZm94IGNob2tlcyBvbiB0aG9zZSkKLSAgICAgICAgLS0+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2wiLz4KLQotICAgICAgICA8IS0tIGNsaWVudCBjYWNoZSBleHBpcmF0aW9uIHNldHRpbmdzIC0tPgotICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJwYXJhbWV0ZXIiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlci1zZWxlY3Rvci10ZXN0IiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICAgPCEtLSBmb3IgbGl2ZSBhcmVhOiAtLT4KLSAgICAgICAgICA8bWFwOndoZW4gdGVzdD0ibGl2ZSI+Ci0gICAgICAgICAgICA8IS0tIHNldCBjYWNoZSBleHBpcmF0aW9uIGhlYWRlciBhY2NvcmRpbmcgdG8gcmVzb3VyY2UgdHlwZSBjb25maWd1cmF0aW9uICg8ZXhwaXJlcy8+KSAtLT4KLSAgICAgICAgICAgIDxtYXA6YWN0IHR5cGU9Imxhbmd1YWdlLWV4aXN0cyI+Ci0gICAgICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InNldC1oZWFkZXIiPgotICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IkV4cGlyZXMiIHZhbHVlPSJ7ZGF0ZS1pc284NjAxLXJmYzgyMjp7ZG9jLWluZm86e3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9OntwYWdlLWVudmVsb3BlOmFyZWF9OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfTpleHBpcmVzfX0iLz4KLSAgICAgICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgPCEtLSBmb3Igb3RoZXIgYXJlYXMgLS0+Ci0gICAgICAgICAgPG1hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8IS0tIHRlbGwgdGhlIGJyb3dzZXIgbm90IHRvIGNhY2hlIHN0dWZmIHNvIHRoYXQgdGhlIHVzZXIgYWx3YXlzIHNlZXMgdXAtdG8tZGF0ZSBjb250ZW50IC0tPgotICAgICAgICAgICAgPG1hcDphY3QgdHlwZT0ic2V0LWhlYWRlciI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IkNhY2hlLUNvbnRyb2wiIHZhbHVlPSJuby1jYWNoZSIgLz4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iUHJhZ21hIiB2YWx1ZT0ibm8tY2FjaGUiLz4KLSAgICAgICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgICA8L21hcDpvdGhlcndpc2U+IAotICAgICAgICA8L21hcDpzZWxlY3Q+Ci0KLSAgICAgICAgPCEtLSBwcmV0dHktcHJpbnQgb3V0cHV0IGZvciBlYXNpZXIgZGVidWdnaW5nIGFuZCBmb3IgdGhlIGJlbmVmaXQgb2YgbmV3IHVzZXJzIAotICAgICAgICAgICAgICBOT1RFOiB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGluIHByb2R1Y3Rpb24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsCi0gICAgICAgICAgICAgIGJ1dCBpdCdzIG9uIGJ5IGRlZmF1bHQgaW4gdGhlIGRlZmF1bHQgcHVibGljYXRpb24gdG8gbWFrZSB0aGUgZ2VuZXJhdGVkIGNvZGUgCi0gICAgICAgICAgICAgIGVhc2llciB0byB3b3JrIHdpdGggZm9yIG5ldyB1c2Vycy4gLS0+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3ByZXR0eXByaW50aW5nL3hzbHQveG1sMm5pY2V4bWwueHNsIi8+Ci0KLSAgICAgICAgPCEtLSB0aGUgcHJveHkgdHJhbnNmb3JtZXIgaGFuZGxlcyBwcm94eS1yZWxhdGVkIFVSTCByZXdyaXRpbmcgLS0+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ii8+Ci0KLSAgICAgICAgPG1hcDphY3QgdHlwZT0ibGFuZ3VhZ2UtZXhpc3RzIj4KLSAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4aHRtbCIvPgotICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDwhLS0gCi0gICAgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgZG9jdW1lbnQgZG9lcyBub3QgZXhpc3QsIHdlIGdlbmVyYXRlIGEgbmljZSBlcnJvciBwYWdlLgotICAgICAgICAgICAgU3RpbGwsIGl0J3Mgbm90IHdoYXQgdGhlIHVzZXIgd2FudHMsIHNvIG1ha2Ugc3VyZSB3ZSBzZW5kIGEgNDA0ICJub3QgZm91bmQiLgotICAgICAgICAtLT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieGh0bWwiIHN0YXR1cy1jb2RlPSI0MDQiLz4KLQotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICA8L21hcDpwaXBlbGluZT4KLQotICAgIDwhLS0KLSAgICAgICBUaGlzIHBpcGVsaW5lIGhhbmRsZXMgYWxsIHJlcXVlc3RzIHRoYXQgZG8gKm5vdCogZW5kIGluICIuaHRtbCIuCi0gICAgLS0+Ci0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qKiI+Ci0gICAgICAgIDxtYXA6YWN0IHR5cGU9Imxhbmd1YWdlLWV4aXN0cyI+Ci0gICAgICAgICAgPCEtLQotICAgICAgICAgICAgIEEgd29ya2Fyb3VuZCBmb3IgYSBieXRlLXJhbmdlIGlzc3VlIHdpdGggUERGcywKLSAgICAgICAgICAgICBzZWUgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD14bWwtY29jb29uLWRldiZhbXA7bT0xMTI0OTYyNTUyMDc3MzMmYW1wO3c9MiAuCi0gICAgICAgICAgICAgRklYTUU6IHN0aWxsIG5lY2Vzc2FyeT8KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHBkZnxQREZ8UGRmKSQiPiAKLSAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImxlbnlhLWRvY3VtZW50OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9LGxhbmc9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9e2xpbms6cmV2fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi9wZGYiPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJieXRlLXJhbmdlcyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L21hcDpyZWFkPgotICAgICAgICAgIDwvbWFwOm1hdGNoPiAgICAgIAotICAgICAgICAgIDwhLS0gRG9jdW1lbnRzIG90aGVyIHRoYW4gKi5odG1sIGFyZSBzZXJ2ZWQgYXMtaXMgYW5kIGRvIG5vdCByZXF1aXJlIHByb2Nlc3Npbmc6IC0tPgotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImxlbnlhLWRvY3VtZW50OntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9LGxhbmc9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtbGFuZ3VhZ2V9e2xpbms6cmV2fSIvPgotICAgICAgICA8L21hcDphY3Q+Ci0KLSAgICAgICAgPCEtLSAKLSAgICAgICAgICBJZiB0aGUgYWN0aW9uIGFib3ZlIGZhaWxzIChlLmcuIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBleGlzdCksIGNhbGwgaW50byB0aGUgbGVueWFib2R5IHBpcGVsaW5lLgotICAgICAgICAgIEl0IHdpbGwgZ2VuZXJhdGUgYSBuaWNlIGRvY3VtZW50LWRvZXMtbm90LWV4aXN0IHBhZ2UgZm9yIHVzLgotICAgICAgICAtLT4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvY29vbjovbGVueWFib2R5LXZpZXcve3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3twYWdlLWVudmVsb3BlOmFyZWF9L3twYWdlLWVudmVsb3BlOmRvY3VtZW50LXR5cGV9e3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtcGF0aH0iLz4KLSAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icGFyYW1ldGVyIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXItc2VsZWN0b3ItdGVzdCIgdmFsdWU9InsxfSIvPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJsaXZlIi8+Ci0gICAgICAgICAgPG1hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvY29vbjovL2xlbnlhLXBhZ2Uve3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9L3sxfS97Mn0/ZG9jdHlwZT17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC10eXBlfSIvPgotICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ii8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhodG1sIiBzdGF0dXMtY29kZT0iNDA0Ii8+Ci0KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0KLQotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC90ZXN0L2FudGVhdGVyL3Rlc3RzLnhtbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvdGVzdC9hbnRlYXRlci90ZXN0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NWM2YTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC90ZXN0L2FudGVhdGVyL3Rlc3RzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHByb3BlcnR5IG5hbWU9InB1YmxpY2F0aW9uLWlkIiB2YWx1ZT0iZGVmYXVsdCIvPgotCi08dGFyZ2V0IG5hbWU9InB1YnMuZGVmYXVsdCIgZGVwZW5kcz0iCi0gICAgICAgIHB1YnMuZGVmYXVsdC5pbnRybywKLSAgICAgICAgcHVicy5kZWZhdWx0LmxvZ2luLAotICAgICAgICBwdWJzLmRlZmF1bHQuYWRtaW4KLSAgICAiLz4KLQotPHRhcmdldCBuYW1lPSJwdWJzLmRlZmF1bHQuaW50cm8iPgotICA8ZWNobz5UZXN0aW5nIHRoZSBkZWZhdWx0IHB1YmxpY2F0aW9uPC9lY2hvPgotICA8ZWNobz5UZXN0aW5nIGludHJvZHVjdGlvbjwvZWNobz4KLSAgPGh0dHBSZXF1ZXN0IHBhdGg9Ii8ke3B1YmxpY2F0aW9uLWlkfS9pbnRyb2R1Y3Rpb24uaHRtbCI+Ci0gICAgPG1hdGNoPgotICAgICAgPHJlc3BvbnNlQ29kZSB2YWx1ZT0iMjAwIi8+Ci0gICAgICA8cmVnZXhwPkRlZmF1bHQgUHVibGljYXRpb248L3JlZ2V4cD4KLSAgICA8L21hdGNoPgotICA8L2h0dHBSZXF1ZXN0PgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0icHVicy5kZWZhdWx0LmxvZ2luIj4KLSAgPGVjaG8+VGVzdGluZyBsb2dpbjwvZWNobz4KLSAgCi0gIDxodHRwUmVxdWVzdAotICAgICAgcGF0aD0iLyR7cHVibGljYXRpb24taWR9L2FkbWluL2luZGV4Lmh0bWwiCi0gICAgICBmb2xsb3dSZWRpcmVjdHM9InRydWUiPgotICAgIDxtYXRjaD4KLSAgICAgIDxyZXNwb25zZUNvZGUgdmFsdWU9IjIwMCIvPgotICAgICAgPHJlZ2V4cD5Vc2VybmFtZTo8L3JlZ2V4cD4KLSAgICA8L21hdGNoPgotICA8L2h0dHBSZXF1ZXN0PgotICAKLSAgPGh0dHBSZXF1ZXN0Ci0gICAgICBwYXRoPSIvJHtwdWJsaWNhdGlvbi1pZH0vYWRtaW4vaW5kZXguaHRtbCIKLSAgICAgIGZvbGxvd1JlZGlyZWN0cz0idHJ1ZSI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VybmFtZSIgdmFsdWU9ImxlbnlhIi8+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCIgdmFsdWU9ImxldmkiLz4KLSAgICA8bWF0Y2g+Ci0gICAgICA8cmVzcG9uc2VDb2RlIHZhbHVlPSIyMDAiLz4KLSAgICAgIDxyZWdleHA+V2VsY29tZTwvcmVnZXhwPgotICAgIDwvbWF0Y2g+Ci0gIDwvaHR0cFJlcXVlc3Q+Ci0gIAotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0icHVicy5kZWZhdWx0LmFkbWluIiBkZXBlbmRzPSJwdWJzLmRlZmF1bHQuYWRtaW4udXNlciIvPgotCi08dGFyZ2V0IG5hbWU9InB1YnMuZGVmYXVsdC5hZG1pbi51c2VyIj4KLSAgPGVjaG8+VGVzdGluZyB1c2VyIGFkbWluaXN0cmF0aW9uPC9lY2hvPgotICA8aHR0cFJlcXVlc3QgcGF0aD0iLyR7cHVibGljYXRpb24taWR9L2FkbWluL2luZGV4Lmh0bWwiPgotICAgIDxtYXRjaD4KLSAgICAgIDxyZXNwb25zZUNvZGUgdmFsdWU9IjIwMCIvPgotICAgICAgPHJlZ2V4cD5EZWZhdWx0IFB1YmxpY2F0aW9uPC9yZWdleHA+Ci0gICAgPC9tYXRjaD4KLSAgPC9odHRwUmVxdWVzdD4KLTwvdGFyZ2V0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC90ZXN0L3dlYnRlc3QvdGVzdHMueG1sIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC90ZXN0L3dlYnRlc3QvdGVzdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3MDE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQvdGVzdC93ZWJ0ZXN0L3Rlc3RzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHByb3BlcnR5IG5hbWU9InB1YmxpY2F0aW9uLWlkIiB2YWx1ZT0iZGVmYXVsdCIvPgotCi08dGFyZ2V0IG5hbWU9InB1YnMuZGVmYXVsdCI+Ci0KLSAgPHRlc3RTcGVjIG5hbWU9InB1YnMuZGVmYXVsdC5pbnRybyI+Ci0gICAgJmNvbmZpZzsKLSAgICA8c3RlcHM+Ci0gICAgICA8aW52b2tlIHVybD0iJHtwdWJsaWNhdGlvbi1pZH0vaW50cm9kdWN0aW9uLmh0bWwiLz4KLSAgICAgIDx2ZXJpZnl0aXRsZSB0ZXh0PSJMZW55YSBDTVMgUHVibGljYXRpb246IERlZmF1bHQgUHVibGljYXRpb24iLz4KLSAgICA8L3N0ZXBzPgotICA8L3Rlc3RTcGVjPgotICAKLSAgPHRlc3RTcGVjIG5hbWU9InB1YnMuZGVmYXVsdC5sb2dpbiI+Ci0gICAgJmNvbmZpZzsKLSAgICA8c3RlcHM+Ci0gICAgICA8aW52b2tlIHVybD0iJHtwdWJsaWNhdGlvbi1pZH0vaW50cm9kdWN0aW9uLmh0bWwiLz4KLSAgICAgIDxjbGlja2xpbmsgbGFiZWw9IkxvZ2luIGFzIEVkaXRvciIvPgotICAgICAgPHZlcmlmeXRpdGxlIHRleHQ9IkxPR0lOIi8+Ci0gICAgICAKLSAgICAgIDxzZXRpbnB1dGZpZWxkIG5hbWU9InVzZXJuYW1lIiB2YWx1ZT0ibGVueWEiLz4KLSAgICAgIDxzZXRpbnB1dGZpZWxkIG5hbWU9InBhc3N3b3JkIiB2YWx1ZT0id3JvbmciLz4KLSAgICAgIDxjbGlja2J1dHRvbiBsYWJlbD0ibG9naW4iLz4KLSAgICAgIDx2ZXJpZnl0aXRsZSB0ZXh0PSJMT0dJTiIvPgotICAgICAgPHZlcmlmeXRleHQgdGV4dD0iQXV0aGVudGljYXRpb24gZmFpbGVkIi8+Ci0gICAgICAKLSAgICAgIDwhLS0KLSAgICAgIDxzZXRpbnB1dGZpZWxkIG5hbWU9InVzZXJuYW1lIiB2YWx1ZT0ibGVueWEiLz4KLSAgICAgIDxzZXRpbnB1dGZpZWxkIG5hbWU9InBhc3N3b3JkIiB2YWx1ZT0ibGV2aSIvPgotICAgICAgPGNsaWNrYnV0dG9uIGxhYmVsPSJsb2dpbiIvPgotICAgICAgPHZlcmlmeXRpdGxlIHRleHQ9IkFwYWNoZSBMZW55YSAtIGRlZmF1bHQiLz4KLSAgICAgIC0tPgotICAgICAgCi0gICAgPC9zdGVwcz4KLSAgPC90ZXN0U3BlYz4KLSAgCi08L3RhcmdldD4KLSAgCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvYWRkWGh0bWxUaXRsZS54c2wgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvYWRkWGh0bWxUaXRsZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTRiYmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L2FkZFhodG1sVGl0bGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwYWdlMnhodG1sLnhzbCA1NTc2MDMgMjAwNy0wNy0xOSAxMjo0ODozMVogYW5kcmVhcyAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGh0bWwiCi0gID4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpoZWFkIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOnRpdGxlIi8+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIiBwcmlvcml0eT0iLTEiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgotICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvcGFnZTJ4aHRtbC1ob21lcGFnZS54c2wgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvcGFnZTJ4aHRtbC1ob21lcGFnZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2Y5MzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwtaG9tZXBhZ2UueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0+Ci0gIAotPHhzbDppbXBvcnQgaHJlZj0iZmFsbGJhY2s6Ly94c2x0L3BhZ2UyeGh0bWwueHNsIi8+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQveHNsdC9wYWdlMnhodG1sLWxpbmtzLnhzbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQveHNsdC9wYWdlMnhodG1sLWxpbmtzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzZjkzMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvcGFnZTJ4aHRtbC1saW5rcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLT4KLSAgCi08eHNsOmltcG9ydCBocmVmPSJmYWxsYmFjazovL3hzbHQvcGFnZTJ4aHRtbC54c2wiLz4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwtb3BlbmRvY3VtZW50LnhzbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQveHNsdC9wYWdlMnhodG1sLW9wZW5kb2N1bWVudC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODQ2NDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwtb3BlbmRvY3VtZW50LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIiAKLSAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0icGFnZSB4aHRtbCBkYyBsZW55YSIKLSAgPgotCi08eHNsOmltcG9ydCBocmVmPSJmYWxsYmFjazovL3hzbHQvcGFnZTJ4aHRtbC54c2wiLz4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwtc2VhcmNoLnhzbCBiL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQveHNsdC9wYWdlMnhodG1sLXNlYXJjaC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmRlNjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwtc2VhcmNoLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotPgotICAKLTx4c2w6aW1wb3J0IGhyZWY9ImZhbGxiYWNrOi8veHNsdC9wYWdlMnhodG1sLnhzbCIvPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwteGh0bWwueHNsIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwteGh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJkZjMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQveHNsdC9wYWdlMnhodG1sLXhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotPgotICAKLTx4c2w6aW1wb3J0IGhyZWY9ImZhbGxiYWNrOi8veHNsdC9wYWdlMnhodG1sLnhzbCIvPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwueHNsIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3BhZ2UyeGh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhmYTVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQveHNsdC9wYWdlMnhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3BhZ2UtZW52ZWxvcGUvMS4wIiAKLSAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJwYWdlIHhodG1sIGRjIGxlbnlhIgotICA+Ci0gIAotICA8IS0tIHtjb250ZXh0LXByZWZpeH0ve3B1YmxpY2F0aW9uLWlkfS97YXJlYX0gLS0+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icm9vdCIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImNvbnRleHQtcHJlZml4Ii8+Ci0gIAotICA8IS0tIGkuZS4gZG9jdHlwZXMveGh0bWwtZG9jdW1lbnQgLS0+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iZG9jdW1lbnQtdHlwZSIvPgotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJkb2N1bWVudC1wYXRoIi8+Ci0gIAotICA8IS0tIFRoZSByZXF1ZXN0IHVybCBpLmUuIC9sZW55YS9kb2N0eXBlcy94aHRtbC1kb2N1bWVudF9lbi5odG1sIC0tPgotICA8eHNsOnBhcmFtIG5hbWU9InVybCIvPgotICA8eHNsOnBhcmFtIG5hbWU9Imxhbmd1YWdlIi8+Ci0gIAotICA8eHNsOnBhcmFtIG5hbWU9Imxhc3RQdWJsaXNoZWRVc2VyIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0ibGFzdFB1Ymxpc2hlZERhdGUiLz4KLSAgCi0gIDwhLS1Gb2xsb3dpbmcgaXMgYSBzaG93IG9mZiB0byBleHBsYWluIGxlbnlhLnByb3BlcnRpZXMueG1sIC0tPgotICA8eHNsOnBhcmFtIG5hbWU9ImF1dGhvciIvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY21zYm9keSI+Ci0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgPCEtLSAKLSAgICAgICAgPGxpbmsgcmVsPSJuZXV0cm9uLWludHJvc3BlY3Rpb24iIHR5cGU9ImFwcGxpY2F0aW9uL25ldXRyb24reG1sIiBocmVmPSJ7JHJvb3R9eyRkb2N1bWVudC1wYXRofS9pbnRyb3NwZWN0aW9uLnhtbCIvPgotICAgICAgICAgLS0+Ci0gICAgICAgIDxsaW5rIHJlbD0ibmV1dHJvbi1pbnRyb3NwZWN0aW9uIiB0eXBlPSJhcHBsaWNhdGlvbi9uZXV0cm9uK3htbCIKLSAgICAgICAgICBocmVmPSJ7JHJvb3R9eyRkb2N1bWVudC1wYXRofS54bWw/bGVueWEubW9kdWxlPW5ldXRyb24mYW1wO2xlbnlhLmFjdGlvbj1pbnRyb3NwZWN0Ii8+Ci0gICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ieyRyb290fS9jc3MvcGFnZS5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0gICAgICAgIDxsaW5rIHJlbD0iU0hPUlRDVVQgSUNPTiIgdHlwZT0iaW1hZ2UvaWNvIiBocmVmPSIvbGVueWEvaW1hZ2VzL2xlbnlhLmljbyIvPgotICAgICAgICA8IS0tIExvYWQgZG9jdHlwZS1zcGVjaWZpYyBDU1MgLS0+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZG9jdW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICA8IS0tIExvb2tpbmcgaW50byB0aGUgcHViIGUuZy4geyR5b3VyUHVifS9yZXNvdXJjZXMvc2hhcmVkL2Nzcy97JGRvY3VtZW50LXR5cGV9LmNzcyAtLT4KLSAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ieyRyb290fS9jc3MveyRkb2N1bWVudC10eXBlfS5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0gICAgICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJ4aHRtbDpodG1sL3hodG1sOmhlYWQvKiIvPgotICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8IS0tIGRvIG5vdGhpbmcgLS0+Ci0gICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDxtZXRhIGNvbnRlbnQ9IkFwYWNoZSBMZW55YSIgbmFtZT0iZ2VuZXJhdG9yIi8+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRoZSB0aXRsZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IGFkZFhodG1sVGl0bGUueHNsIGlmIHRoZSBkb2N1bWVudCBleGlzdHMuIC0tPgotICAgICAgICA8dGl0bGU+PGkxOG46dGV4dD5lcnJvci00MDQ8L2kxOG46dGV4dD48L3RpdGxlPgotICAgICAgICAKLSAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJhcHBsaWNhdGlvbi94aHRtbCt4bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLSAgICAgIDwvaGVhZD4KLSAgICAgIDxib2R5PgotICAgICAgICA8ZGl2IGlkPSJwYWdlIj4KLSAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGlkPSJwdWJsaWNhdGlvbi10aXRsZSI+Ci0gICAgICAgICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD5wdWJsaWNhdGlvbi10aXRsZTwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgICAgPGkxOG46cGFyYW0+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhdXRob3IiLz48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkIGlkPSJwcm9qZWN0LWxvZ28iPjxpbWcgc3JjPSJ7JHJvb3R9L2ltYWdlcy9wcm9qZWN0LWxvZ28ucG5nIiBhbHQ9InByb2plY3QgbG9nbyIvPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ4aHRtbDpkaXZbQGlkID0gJ3RhYnMnXSIvPgotICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHN0eWxlPSJ3aWR0aDogMjMwcHgiPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6ZGl2W0BpZCA9ICdtZW51J10iLz4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmRpdltAaWQgPSAnbGFuZ3VhZ2VzZWxlY3RvciddIi8+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFpbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmRpdltAaWQgPSAnYnJlYWRjcnVtYiddIi8+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmRpdltAaWQgPSAnc2VhcmNoJ10iLz4KLSAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6ZGl2W0BpZCA9ICdib2R5J10iLz4KLSAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ieGh0bWw6aHRtbCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6aHRtbC94aHRtbDpib2R5LyoiLz4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImZvb3RlciIvPgotICAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLSAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmRpdltAaWQgPSAnYnJlYWRjcnVtYiddIj4KLSAgICA8eHNsOmlmIHRlc3Q9IioiPgotICAgICAgPHhzbDpjb3B5PgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgPC94c2w6Y29weT4KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmb290ZXIiPgotICAgIDxkaXYgaWQ9ImZvb3RlciI+Ci0gICAgICA8cD4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRsYXN0UHVibGlzaGVkVXNlciAhPSAnJyI+Ci0gICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+bGFzdC1wdWJsaXNoZWQ8L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgPGkxOG46cGFyYW0+PGkxOG46ZGF0ZS10aW1lIHNyYy1wYXR0ZXJuPSJ5eXl5LU1NLWRkIEhIOm1tOnNzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxhc3RQdWJsaXNoZWREYXRlIi8+PC9pMThuOmRhdGUtdGltZT48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICAgIDxpMThuOnBhcmFtPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGFzdFB1Ymxpc2hlZFVzZXIiLz48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8aTE4bjp0ZXh0Pm5ldmVyLXB1Ymxpc2hlZDwvaTE4bjp0ZXh0PgotICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgPC9wPgotICAgIDwvZGl2PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiIHByaW9yaXR5PSItMSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvdG9Eb2MueHNsIGIvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3RvRG9jLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhNzZhOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvdG9Eb2MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6cmM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9yYy8xLjAiID4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icmM6YmFja3VwIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPiAKLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIqIHwgQCoiPgotIDx4c2w6Y29weT4KLSAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAKiIvPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6Y29weT4KLTwveHNsOnRlbXBsYXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQveHNsdC91cGxvYWQtZ2VuZXJpYy54c2wgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvdXBsb2FkLWdlbmVyaWMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE3OGNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9wdWJzL2RlZmF1bHQveHNsdC91cGxvYWQtZ2VuZXJpYy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczp1Yz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3VzZWNhc2UvMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gIAotICA8eHNsOnBhcmFtIG5hbWU9ImxlbnlhLnVzZWNhc2UiLz4KLSAgCi0gIDx4c2w6b3V0cHV0IGVuY29kaW5nPSJJU08tODg1OS0xIiBpbmRlbnQ9InllcyIgdmVyc2lvbj0iMS4wIi8+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9InVzZXItaWQiIHNlbGVjdD0iL3VjOmNyZWF0ZS91Yzp1c2VyLWlkIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8cGFnZTpwYWdlIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiPgotICAgICAgPHBhZ2U6dGl0bGU+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRpdGxlIi8+PC9wYWdlOnRpdGxlPgotICAgICAgPHBhZ2U6Ym9keT4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgPC9wYWdlOmJvZHk+Ci0gICAgPC9wYWdlOnBhZ2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idWM6Y29uZmlybSI+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InVjOmZvcm0tdGl0bGUiLz48L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idWM6ZXJyb3ItbWVzc2FnZXMiLz4KLSAgICAgICAgCi0KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZmllbGRzIi8+Ci0gICAgICAgIAotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ1YzplcnJvci1tZXNzYWdlcyI+Ci0gIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgIDx4c2w6aWYgdGVzdD0idWM6bWVzc2FnZSI+Ci0gICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZW50cnktY2FwdGlvbiI+UHJvYmxlbTo8L3RkPgotICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InVjOm1lc3NhZ2UiLz48L3RkPgotICAgICAgIDwvdHI+Ci0gICAgPC94c2w6aWY+Ci0gIDwvdGFibGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idWM6bWVzc2FnZSI+Ci0gIDxzcGFuIGNsYXNzPSJsZW55YS1mb3JtLW1lc3NhZ2UtZXJyb3IiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9zcGFuPjxici8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InRpdGxlIj5VcGxvYWQgRG9jdW1lbnQ8L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmaWVsZHMiLz4KLQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3B1YnMvZGVmYXVsdC94c2x0L3VwbG9hZC54c2wgYi90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvdXBsb2FkLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5MThhNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcHVicy9kZWZhdWx0L3hzbHQvdXBsb2FkLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnVjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgCi0gIDx4c2w6aW1wb3J0IGhyZWY9InVwbG9hZC1nZW5lcmljLnhzbCIvPgotICAKLSAgPCEtLTx4c2w6dGVtcGxhdGUgbmFtZT0idGl0bGUiPkltcG9ydCBBcnRpY2xlIChTR01MKTwveHNsOnRlbXBsYXRlPi0tPgotICAKLTx4c2w6dGVtcGxhdGUgbmFtZT0iZmllbGRzIj4KLSAgPGZvcm0gbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0iZm9ybS11cGxvYWRfZG9jdW1lbnQiPgotCi0gICAgPGlucHV0IG5hbWU9ImxlbnlhLnVzZWNhc2UiIHR5cGU9ImhpZGRlbiIgdmFsdWU9InskbGVueWEudXNlY2FzZX0iLz4KLSAgICA8aW5wdXQgbmFtZT0ibGVueWEuY29udGludWF0aW9uIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJ7dWM6Y29udGludWF0aW9ufSIvPgotCi0gICAgPCEtLSBERUJVRyAuLi4gLS0+Ci0gICAgPCEtLTxpbnB1dCBuYW1lPSJjb2Nvb24tdmlldyIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0ieG1sIi8+LS0+Ci0KLSAgICA8dGFibGUgY2xhc3M9ImxlbnlhLXRhYmxlLW5vYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPlVwbG9hZCBEb2N1bWVudDwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiBuYW1lPSJ1cGxvYWQtcmVndWxhdGlvbiIgdHlwZT0iZmlsZSIvPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotCi0gICAgPHRyPgotICAgICAgPHRkLz4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIi8+Ci0gICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNhbmNlbCIgbmFtZT0iaW5wdXQtY2FuY2VsIi8+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9mb3JtPgotPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvbW9kdWxlLnJuZyBiL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvbW9kdWxlLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiZGI5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcmVzb3VyY2VzL2J1aWxkL21vZHVsZS5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGdyYW1tYXIgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIgotICB4bWxuczp4c3A9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcC9jb3JlL3YxIgotICB4bWxuczpzPSJodHRwOi8vd3d3LmFzY2MubmV0L3htbC9zY2hlbWF0cm9uIgotICB4bWxuczphPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvY29tcGF0aWJpbGl0eS9hbm5vdGF0aW9ucy8xLjAiCi0gIHhtbG5zOmY9Imh0dHA6Ly9heGtpdC5vcmcvTlMveHNwL3BlcmZvcm0vdjEiIAotICBkYXRhdHlwZUxpYnJhcnk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyIKLSAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21vZHVsZS8xLjAiPgotICA8c3RhcnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0ibGVueWE6bW9kdWxlIiA+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJsZW55YTppZCI+PHRleHQvPjwvZWxlbWVudD4KLSAgICAgIDx6ZXJvT3JNb3JlPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJsZW55YTpleHBvcnQiPgotICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnZSI+PHRleHQvPjwvYXR0cmlidXRlPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8L3plcm9Pck1vcmU+Ci0gICAgICA8emVyb09yTW9yZT4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGVueWE6ZGVwZW5kcyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtb2R1bGUiPjx0ZXh0Lz48L2F0dHJpYnV0ZT4KLSAgICAgICAgPC9lbGVtZW50PgotICAgICAgPC96ZXJvT3JNb3JlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibGVueWE6cGFja2FnZSI+PHRleHQvPjwvZWxlbWVudD4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImxlbnlhOnZlcnNpb24iPjx0ZXh0Lz48L2VsZW1lbnQ+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJsZW55YTpuYW1lIj48dGV4dC8+PC9lbGVtZW50PgotICAgICAgPGVsZW1lbnQgbmFtZT0ibGVueWE6bGVueWEtdmVyc2lvbiI+PHRleHQvPjwvZWxlbWVudD4KLSAgICAgIDxvcHRpb25hbD4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGVueWE6ZGVzY3JpcHRpb24iPjx0ZXh0Lz48L2VsZW1lbnQ+Ci0gICAgICA8L29wdGlvbmFsPgotICAgICAgPG9wdGlvbmFsPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJsZW55YTpjcmVhdG9yIj48dGV4dC8+PC9lbGVtZW50PgotICAgICAgPC9vcHRpb25hbD4KLSAgICAgIDxvcHRpb25hbD4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGVueWE6Y29weXJpZ2h0cyI+PHRleHQvPjwvZWxlbWVudD4KLSAgICAgIDwvb3B0aW9uYWw+Ci0gICAgICA8b3B0aW9uYWw+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9ImxlbnlhOnJlYWRtZSI+PHRleHQvPjwvZWxlbWVudD4KLSAgICAgIDwvb3B0aW9uYWw+Ci0gICAgICA8b3B0aW9uYWw+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9ImxlbnlhOmluc3RhbGxhdGlvbiI+PHRleHQvPjwvZWxlbWVudD4KLSAgICAgIDwvb3B0aW9uYWw+Ci0gICAgPC9lbGVtZW50PgotICA8L3N0YXJ0PgotPC9ncmFtbWFyPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9idWlsZC9tb2R1bGVzMmJ1aWxkLnhzbCBiL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvbW9kdWxlczJidWlsZC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjhlNmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9idWlsZC9tb2R1bGVzMmJ1aWxkLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgeG1sbnM6bW9kPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIgotICB4bWxuczpsaXN0PSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUtbGlzdC8xLjAiPgotICAKLSAgPHhzbDppbXBvcnQgaHJlZj0idXRpbC54c2wiLz4KLSAgCi0gIDx4c2w6b3V0cHV0IGluZGVudD0ieWVzIi8+Ci0gIAotICA8eHNsOnBhcmFtIG5hbWU9ImNvY29vbi14Y29uZiIvPgotICA8eHNsOnBhcmFtIG5hbWU9Im1vZHVsZS1zY2hlbWEiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJjb3B5LW1vZHVsZXMiLz4KLSAgCi0gIDx4c2w6dmFyaWFibGUgbmFtZT0iY29uZmlnRmlsZSI+L2NvbmZpZy9tb2R1bGUueG1sPC94c2w6dmFyaWFibGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzZXBhcmF0b3IiPgotICAgIDx4c2w6aWYgdGVzdD0iZm9sbG93aW5nLXNpYmxpbmc6Omxpc3Q6bW9kdWxlIj4KLSAgICAgIDx4c2w6dGV4dD4sIDwveHNsOnRleHQ+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Imxpc3Q6bW9kdWxlcyI+Ci0gICAgPHByb2plY3QgbmFtZT0ibGVueWEtbW9kdWxlcyI+Ci0gICAgICAKLSAgICAgIDwhLS0gU2V0IHVwIGNsYXNzcGF0aCAtLT4KLSAgICAgIDxwYXRoIGlkPSJjbGFzc3BhdGgiPgotICAgICAgICA8ZmlsZXNldD4KLSAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7bGliLmRpcn08L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8ZmlsZXNldD4KLSAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGQuZGlyfS9saWI8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8ZmlsZXNldD4KLSAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y29jb29uLndlYmFwcC5kaXJ9L1dFQi1JTkYvbGliPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJ0b29scy9qZXR0eS9saWIiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZsZXQtKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9wYXRoPgotICAgICAgCi0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBpbGVEZXBlbmRlbmN5TGlzdCI+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJsaXN0Om1vZHVsZSI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtb2Q6bW9kdWxlIiBtb2RlPSJjYWxsIi8+Ci0gICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcGFyYXRvciIvPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLW1vZHVsZXMiIGRlcGVuZHM9InskY29tcGlsZURlcGVuZGVuY3lMaXN0fSIvPgotICAgICAgCi0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3REZXBlbmRlbmN5TGlzdCI+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJsaXN0Om1vZHVsZSI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtb2Q6bW9kdWxlIiBtb2RlPSJwYXRjaC10ZXN0Ii8+Ci0gICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcGFyYXRvciIvPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgCi0gICAgICA8dGFyZ2V0IG5hbWU9InBhdGNoLW1vZHVsZXMtdGVzdCIgZGVwZW5kcz0ieyR0ZXN0RGVwZW5kZW5jeUxpc3R9Ii8+Ci0gICAgICAKLSAgICAgIDx0YXJnZXQgbmFtZT0iamF2YWRvY3MtbW9kdWxlcyI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGlzdDptb2R1bGUiIG1vZGU9ImNhbGwtamF2YWRvY3MiLz4KLSAgICAgIDwvdGFyZ2V0PgotICAgICAgCi0gICAgICA8dGFyZ2V0IG5hbWU9InRlc3QtbW9kdWxlcyIgZGVwZW5kcz0icGF0Y2gtbW9kdWxlcy10ZXN0Ij4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJsaXN0Om1vZHVsZSIgbW9kZT0iY2FsbC10ZXN0Ii8+Ci0gICAgICA8L3RhcmdldD4KLSAgICAgIAotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjYW5vb0RlcGVuZGVuY3lMaXN0Ij4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Imxpc3Q6bW9kdWxlIj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1vZDptb2R1bGUiIG1vZGU9InRlc3QtY2Fub28iLz4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VwYXJhdG9yIi8+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICA8dGFyZ2V0IG5hbWU9InRlc3QtbW9kdWxlcy1jYW5vbyIgZGVwZW5kcz0ieyRjYW5vb0RlcGVuZGVuY3lMaXN0fSIvPgotICAgICAgCi0gICAgICAKLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGlzdDptb2R1bGUiIG1vZGU9InRhcmdldCIvPgotICAgICAgCi0gICAgPC9wcm9qZWN0PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtb2Q6bW9kdWxlIiBtb2RlPSJjYWxsIj4KLSAgICA8eHNsOnRleHQ+ZGVwbG95LW1vZHVsZS08L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJtb2Q6aWQiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1vZDptb2R1bGUiIG1vZGU9InBhdGNoLXRlc3QiPgotICAgIDx4c2w6dGV4dD5wYXRjaC1tb2R1bGUtdGVzdC08L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJtb2Q6aWQiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGlzdDptb2R1bGUiIG1vZGU9ImNhbGwtdGVzdCI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtb2Q6bW9kdWxlIiBtb2RlPSJjYWxsLXRlc3QiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtb2Q6bW9kdWxlIiBtb2RlPSJjYWxsLXRlc3QiPgotICAgIDxhbnRjYWxsIHRhcmdldD0idGVzdC1tb2R1bGUte21vZDppZH0iLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGlzdDptb2R1bGUiIG1vZGU9ImNhbGwtdGVzdC1jYW5vbyI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtb2Q6bW9kdWxlIiBtb2RlPSJjYWxsLXRlc3QtY2Fub28iLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtb2Q6bW9kdWxlIiBtb2RlPSJjYWxsLXRlc3QtY2Fub28iPgotICAgIDxhbnRjYWxsIHRhcmdldD0iY2Fub28tbW9kdWxlLXttb2Q6aWR9Ii8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1vZDptb2R1bGUiIG1vZGU9InRlc3QtY2Fub28iPgotICAgIDx4c2w6dGV4dD5jYW5vby1tb2R1bGUtPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibW9kOmlkIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Imxpc3Q6bW9kdWxlIiBtb2RlPSJjYWxsLWphdmFkb2NzIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1vZDptb2R1bGUiIG1vZGU9ImNhbGwtamF2YWRvY3MiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtb2Q6bW9kdWxlIiBtb2RlPSJjYWxsLWphdmFkb2NzIj4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImphdmFkb2NzLW1vZHVsZS17bW9kOmlkfSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJsaXN0Om1vZHVsZSIgbW9kZT0idGFyZ2V0Ij4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1vZDptb2R1bGUiIG1vZGU9InRhcmdldCI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3JjIiBzZWxlY3Q9IkBzcmMiLz4KLSAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1vZDptb2R1bGUiIG1vZGU9InRhcmdldCI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJzcmMiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlkIiBzZWxlY3Q9Im1vZDppZCIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hvcnRuYW1lIiBzZWxlY3Q9InN1YnN0cmluZyhtb2Q6aWQsIHN0cmluZy1sZW5ndGgobW9kOnBhY2thZ2UpICsgMikiLz4KLQotICAgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGUtbW9kdWxlLXskaWR9Ij4KLSAgICAgIDxqaW5nIHJuZ2ZpbGU9InskbW9kdWxlLXNjaGVtYX0iIGZpbGU9Inskc3JjfXskY29uZmlnRmlsZX0iLz4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8eHNsOnRleHQ+Ci0gICAgICAKLSAgICA8L3hzbDp0ZXh0PgotICAgIDx4c2w6Y29tbWVudD5Db21waWxlIG1vZHVsZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNyYyIvPiA8L3hzbDpjb21tZW50PgotICAgIDx4c2w6dGV4dD4KLSAgICA8L3hzbDp0ZXh0PgotICAgIAotICAgIDxhdmFpbGFibGUgZmlsZT0ieyRzcmN9L2phdmEvc3JjIiBwcm9wZXJ0eT0iY29tcGlsZS5tb2R1bGUueyRpZH0iLz4KLSAgICAKLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc3REaXJQdWJsaWMiPiR7YnVpbGQuZGlyfS9tb2R1bGVzLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWQiLz4vamF2YS9jbGFzc2VzL2FwaTwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGVzdERpclByaXZhdGUiPiR7YnVpbGQuZGlyfS9tb2R1bGVzLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWQiLz4vamF2YS9jbGFzc2VzL2ltcGw8L3hzbDp2YXJpYWJsZT4KLSAgICAKLSAgICA8cGF0aCBpZD0ibW9kdWxlLmNsYXNzcGF0aC57JGlkfS5hcGkiPgotICAgICAgPHBhdGggcmVmaWQ9ImNsYXNzcGF0aCIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3tidWlsZC53ZWJhcHB9fS9XRUItSU5GL2xpYiIgaW5jbHVkZXM9ImxlbnlhLSotYXBpLmphciIvPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1vZDpkZXBlbmRzIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3tidWlsZC53ZWJhcHB9fS9XRUItSU5GL2xpYiIgaW5jbHVkZXM9ImxlbnlhLW1vZHVsZS17QG1vZHVsZX0tYXBpLmphciIvPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8ZmlsZXNldCBkaXI9Inskc3JjfSIgaW5jbHVkZXM9ImphdmEvbGliLyouamFyIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7e2xpYi5kaXJ9fSIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIAotICAgIDxwYXRoIGlkPSJtb2R1bGUuY2xhc3NwYXRoLnskaWR9LmltcGwiPgotICAgICAgPHBhdGggcmVmaWQ9Im1vZHVsZS5jbGFzc3BhdGgueyRpZH0uYXBpIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7e2J1aWxkLndlYmFwcH19L1dFQi1JTkYvbGliIiBpbmNsdWRlcz0ibGVueWEtbW9kdWxlLXskaWR9LWFwaS5qYXIiLz4KLSAgICA8L3BhdGg+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLW1vZHVsZS17JGlkfSIgaWY9ImNvbXBpbGUubW9kdWxlLnskaWR9Ij4KLSAgICAgIAotICAgICAgPG1rZGlyIGRpcj0ieyRkZXN0RGlyUHVibGljfSIvPgotICAgICAgCi0gICAgICA8eHNsOmlmIHRlc3Q9Im1vZDpleHBvcnRbQHBhY2thZ2VdIj4KLSAgICAgICAgPGphdmFjCi0gICAgICAgICAgZGVzdGRpcj0ieyRkZXN0RGlyUHVibGljfSIKLSAgICAgICAgICBkZWJ1Zz0iJHt7ZGVidWd9fSIKLSAgICAgICAgICBvcHRpbWl6ZT0iJHt7b3B0aW1pemV9fSIKLSAgICAgICAgICBkZXByZWNhdGlvbj0iJHt7ZGVwcmVjYXRpb259fSIKLSAgICAgICAgICB0YXJnZXQ9IiR7e3RhcmdldC52bX19IgotICAgICAgICAgIG5vd2Fybj0iJHt7bm93YXJufX0iCi0gICAgICAgICAgc291cmNlPSIke3tzcmMuamF2YS52ZXJzaW9ufX0iPgotICAgICAgICAgIDxzcmMgcGF0aD0ieyRzcmN9L2phdmEvc3JjIi8+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1vZDpleHBvcnRbQHBhY2thZ2VdIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Int0cmFuc2xhdGUoQHBhY2thZ2UsICcuJywgJy8nKX0vKi5qYXZhIi8+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibW9kdWxlLmNsYXNzcGF0aC57JGlkfS5hcGkiLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICAgICAgCi0gICAgICAgIDxqYXIgamFyZmlsZT0iJHt7YnVpbGQud2ViYXBwfX0vV0VCLUlORi9saWIvbGVueWEtbW9kdWxlLXskaWR9LWFwaS5qYXIiIGluZGV4PSJ0cnVlIj4KLSAgICAgICAgICA8ZmlsZXNldCBkaXI9InskZGVzdERpclB1YmxpY30iPgotICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovTWFuaWZlc3QubWYiLz4KLSAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgICAgPC94c2w6aWY+Ci0KLSAgICAgIDxta2RpciBkaXI9InskZGVzdERpclByaXZhdGV9Ii8+Ci0gICAgICA8amF2YWMKLSAgICAgICAgZGVzdGRpcj0ieyRkZXN0RGlyUHJpdmF0ZX0iCi0gICAgICAgIGRlYnVnPSIke3tkZWJ1Z319IgotICAgICAgICBvcHRpbWl6ZT0iJHt7b3B0aW1pemV9fSIKLSAgICAgICAgZGVwcmVjYXRpb249IiR7e2RlcHJlY2F0aW9ufX0iCi0gICAgICAgIHRhcmdldD0iJHt7dGFyZ2V0LnZtfX0iCi0gICAgICAgIG5vd2Fybj0iJHt7bm93YXJufX0iCi0gICAgICAgIHNvdXJjZT0iJHt7c3JjLmphdmEudmVyc2lvbn19Ij4KLSAgICAgICAgPHNyYyBwYXRoPSJ7JHNyY30vamF2YS9zcmMiLz4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1vZDpleHBvcnRbQHBhY2thZ2VdIj4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJ7dHJhbnNsYXRlKEBwYWNrYWdlLCAnLicsICcvJyl9LyouamF2YSIvPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibW9kdWxlLmNsYXNzcGF0aC57JGlkfS5pbXBsIi8+Ci0gICAgICA8L2phdmFjPgotICAgICAgCi0gICAgICA8amFyIGphcmZpbGU9IiR7e2J1aWxkLndlYmFwcH19L1dFQi1JTkYvbGliL2xlbnlhLW1vZHVsZS17JGlkfS1pbXBsLmphciIgaW5kZXg9InRydWUiPgotICAgICAgICA8ZmlsZXNldCBkaXI9InskZGVzdERpclByaXZhdGV9Ij4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9NYW5pZmVzdC5tZiIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2phcj4KLSAgICAgIAotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGlyTmFtZSI+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibGFzdFN0ZXAiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSIkc3JjIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOnZhcmlhYmxlPgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iY29weS1tb2R1bGUteyRpZH0iPgotICAgICAgPHhzbDppZiB0ZXN0PSIkY29weS1tb2R1bGVzID0gJ3RydWUnIj4KLSAgICAgICAgPGNvcHkgCi0gICAgICAgICAgdG9kaXI9IiR7e2J1aWxkLndlYmFwcH19L2xlbnlhL21vZHVsZXMveyRkaXJOYW1lfSIKLSAgICAgICAgICBmbGF0dGVuPSJmYWxzZSI+Ci0gICAgICAgICAgPGZpbGVzZXQgZGlyPSJ7JHNyY30iPgotICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iamF2YS8qKiIvPgotICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKi9qYXZhLyoqIi8+Ci0gICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb25maWcvY29jb29uLXhjb25mLyoqIi8+Ci0gICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqL2NvbmZpZy9jb2Nvb24teGNvbmYvKioiLz4KLSAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbmZpZy9sZW55YS1yb2xlcy8qKiIvPgotICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKi9jb25maWcvbGVueWEtcm9sZXMvKioiLz4KLSAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbmZpZy9zaXRlbWFwLyoqIi8+Ci0gICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqL2NvbmZpZy9zaXRlbWFwLyoqIi8+Ci0gICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9InBhdGNoLW1vZHVsZS17JGlkfSI+Ci0gICAgICA8eHBhdGNoIGZpbGU9InskY29jb29uLXhjb25mfSIKLSAgICAgICAgc3JjZGlyPSJ7JHNyY30iCi0gICAgICAgIGluY2x1ZGVzPSJjb25maWcvY29jb29uLXhjb25mLyoueGNvbmYsIGNvbmZpZy9jb2Nvb24teGNvbmYvKi8qLnhjb25mIgotICAgICAgICBhZGRDb21tZW50cz0iZmFsc2UiLz4KLSAgICAgICAgCi0gICAgICA8eHBhdGNoIGZpbGU9IiR7e2J1aWxkLmRpcn19L2ltcGwvb3JnL2FwYWNoZS9sZW55YS9sZW55YS5yb2xlcyIKLSAgICAgICAgc3JjZGlyPSJ7JHNyY30iCi0gICAgICAgIGluY2x1ZGVzPSJjb25maWcvbGVueWEtcm9sZXMvKi54cm9sZXMiCi0gICAgICAgIGFkZENvbW1lbnRzPSJmYWxzZSIvPgotICAgICAgCi0gICAgICA8eHBhdGNoIGZpbGU9IiR7e2J1aWxkLndlYmFwcH19L3NpdGVtYXAueG1hcCIKLSAgICAgICAgc3JjZGlyPSJ7JHNyY30iIAotICAgICAgICBpbmNsdWRlcz0iY29uZmlnL3NpdGVtYXAvKi54bWFwIgotICAgICAgICBhZGRDb21tZW50cz0iZmFsc2UiLz4KLSAgICAgIAotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGVwZW5kZW5jeUxpc3QiPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1vZDpkZXBlbmRzIj4KLSAgICAgICAgPHhzbDp0ZXh0PmRlcGxveS1tb2R1bGUtPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1vZHVsZSIvPjx4c2w6dGV4dD4sIDwveHNsOnRleHQ+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1tb2R1bGUteyRpZH0iCi0gICAgICBkZXBlbmRzPSJ7JGRlcGVuZGVuY3lMaXN0fSB2YWxpZGF0ZS1tb2R1bGUteyRpZH0sIGNvbXBpbGUtbW9kdWxlLXskaWR9LCBjb3B5LW1vZHVsZS17JGlkfSwgcGF0Y2gtbW9kdWxlLXskaWR9Ii8+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBKYXZhZG9jcyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAKLSAgICA8IS0tIFNldCBhIHZhcmlhYmxlIGlmIGphdmFkb2MgaXMgYWxyZWFkeSB1cC10by1kYXRlIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iamF2YWRvY3MtbW9kdWxlLWNoZWNrLXskaWR9Ij4KLSAgICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iamF2YWRvY3Mubm90cmVxdWlyZWQubW9kdWxlLnskaWR9IiB0YXJnZXRmaWxlPSIke3tkaXN0LmJpbi5qYXZhZG9jc319L3BhY2thZ2VzLmh0bWwiID4KLSAgICAgICAgPHNyY2ZpbGVzIGRpcj0ieyRzcmN9L2phdmEvc3JjIiBpbmNsdWRlcz0iKiovKi5qYXZhIi8+Ci0gICAgICA8L3VwdG9kYXRlPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iamF2YWRvY3MtbW9kdWxlLXskaWR9IgotICAgICAgICAgICAgaWY9ImNvbXBpbGUubW9kdWxlLnskaWR9IgotICAgICAgICAgICAgdW5sZXNzPSJqYXZhZG9jcy5ub3RyZXF1aXJlZC5tb2R1bGUueyRpZH0iPgotICAgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSIke3twYWNrYWdlc319IgotICAgICAgICBkZXN0ZGlyPSIke3tkaXN0LmJpbi5qYXZhZG9jc319L21vZHVsZXMveyRzaG9ydG5hbWV9IgotICAgICAgICBhdXRob3I9InRydWUiCi0gICAgICAgIHZlcnNpb249InRydWUiCi0gICAgICAgIHVzZT0iZmFsc2UiCi0gICAgICAgIG5vaW5kZXg9InRydWUiCi0gICAgICAgIGJyZWFraXRlcmF0b3I9InRydWUiCi0gICAgICAgIHdpbmRvd3RpdGxlPSIke3tOYW1lfX0gQVBJIC0gVmVyc2lvbiAke3t2ZXJzaW9ufX0iCi0gICAgICAgIGRvY3RpdGxlPSIke3tOYW1lfX0iCi0gICAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICYjMTY5OyAke3llYXJ9IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIKLSAgICAgICAgc3R5bGVzaGVldGZpbGU9IiR7e3NyYy5yZXNvdXJjZS5kaXJ9fS9qYXZhZG9jLmNzcyIKLSAgICAgICAgc291cmNlPSIke3tzcmMuamF2YS52ZXJzaW9ufX0iPgotICAgICAgICA8IS0tIHNvdXJjZXMgLS0+Ci0gICAgICAgIDxzb3VyY2VwYXRoPgotICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ7JHNyY30vamF2YS9zcmMiLz4KLSAgICAgICAgPC9zb3VyY2VwYXRoPgotICAgICAgICAKLSAgICAgICAgPCEtLSBwYXNzIGFudCBpbiB0aGUgY2xhc3NwYXRoIHRvIGF2b2lkIGNsYXNzIG5vdCBmb3VuZCBlcnJvcnMgLS0+Ci0gICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1vZHVsZS5jbGFzc3BhdGgueyRpZH0uYXBpIi8+Ci0gICAgICA8L2phdmFkb2M+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUZXN0IC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIAotICAgIDxhdmFpbGFibGUgZmlsZT0ieyRzcmN9L2phdmEvdGVzdCIgcHJvcGVydHk9InRlc3QubW9kdWxlLnskaWR9Ii8+Ci0gICAgCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0RGVwZW5kZW5jeUxpc3QiPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1vZDpkZXBlbmRzIj4KLSAgICAgICAgPHhzbDp0ZXh0PnBhdGNoLW1vZHVsZS10ZXN0LTwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtb2R1bGUiLz4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJmb2xsb3dpbmctc2libGluZzo6bW9kOmRlcGVuZHMiPgotICAgICAgICAgIDx4c2w6dGV4dD4sIDwveHNsOnRleHQ+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJwYXRjaC1tb2R1bGUtdGVzdC17JGlkfSI+Ci0gICAgICA8eHNsOmlmIHRlc3Q9Im5vcm1hbGl6ZS1zcGFjZSgkdGVzdERlcGVuZGVuY3lMaXN0KSAhPSAnJyI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlcGVuZHMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdERlcGVuZGVuY3lMaXN0Ii8+PC94c2w6YXR0cmlidXRlPgotICAgICAgPC94c2w6aWY+Ci0gICAgICA8bWtkaXIgZGlyPSIke3tidWlsZC5kaXJ9fS9tb2R1bGVzL3skaWR9Ii8+Ci0gICAgICA8eHNsdCBiYXNlZGlyPSJ7JHNyY30iCi0gICAgICAgIGluY2x1ZGVzPSJjb25maWcvY29jb29uLXhjb25mLyoueGNvbmYsIGNvbmZpZy9jb2Nvb24teGNvbmYvKi8qLnhjb25mIgotICAgICAgICBkZXN0ZGlyPSIke3tidWlsZC5kaXJ9fS9tb2R1bGVzL3skaWR9IgotICAgICAgICBzdHlsZT0iJHt7c3JjLnJlc291cmNlLmRpcn19L3Rlc3QveHBhdGNoMnRlc3RwYXRjaC54c2wiCi0gICAgICAgIGV4dGVuc2lvbj0iLnh0ZXN0Ii8+Ci0gICAgICA8eHBhdGNoIGZpbGU9IiR7e2J1aWxkLnRlc3R9fS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9MZW55YVRlc3RDYXNlLnh0ZXN0IgotICAgICAgICBzcmNkaXI9IiR7e2J1aWxkLmRpcn19L21vZHVsZXMveyRpZH0iCi0gICAgICAgIGluY2x1ZGVzPSJjb25maWcvY29jb29uLXhjb25mLyoueHRlc3QsIGNvbmZpZy9jb2Nvb24teGNvbmYvKi8qLnh0ZXN0IgotICAgICAgICBhZGRDb21tZW50cz0iZmFsc2UiLz4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtbW9kdWxlLXskaWR9IiBpZj0idGVzdC5tb2R1bGUueyRpZH0iIGRlcGVuZHM9ImNvbXBpbGUtbW9kdWxlLXskaWR9Ij4KLQotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0RGVzdERpciI+JHtidWlsZC5kaXJ9L21vZHVsZXMvPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpZCIvPi9qYXZhL3Rlc3Q8L3hzbDp2YXJpYWJsZT4KLSAgICAgIAotICAgICAgPG1rZGlyIGRpcj0ieyR0ZXN0RGVzdERpcn0iLz4KLSAgICAgIAotICAgICAgPHBhdGggaWQ9Im1vZHVsZS50ZXN0LWNsYXNzcGF0aC57JGlkfSI+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJtb2R1bGUuY2xhc3NwYXRoLnskaWR9LmltcGwiLz4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3tidWlsZC53ZWJhcHB9fS9XRUItSU5GL2xpYiI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0ibGVueWEtbW9kdWxlLXskaWR9LWltcGwuamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGggbG9jYXRpb249IiR7e2J1aWxkLnRlc3R9fSIvPgotICAgICAgPC9wYXRoPgotICAgICAgCi0gICAgICA8amF2YWMKLSAgICAgICAgZGVzdGRpcj0ieyR0ZXN0RGVzdERpcn0iCi0gICAgICAgIGRlYnVnPSIke3tkZWJ1Z319IgotICAgICAgICBvcHRpbWl6ZT0iJHt7b3B0aW1pemV9fSIKLSAgICAgICAgZGVwcmVjYXRpb249IiR7e2RlcHJlY2F0aW9ufX0iCi0gICAgICAgIHRhcmdldD0iJHt7dGFyZ2V0LnZtfX0iCi0gICAgICAgIG5vd2Fybj0iJHt7bm93YXJufX0iCi0gICAgICAgIHNvdXJjZT0iJHt7c3JjLmphdmEudmVyc2lvbn19Ij4KLSAgICAgICAgPHNyYyBwYXRoPSJ7JHNyY30vamF2YS90ZXN0Ii8+Ci0gICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1vZHVsZS50ZXN0LWNsYXNzcGF0aC57JGlkfSIvPgotICAgICAgPC9qYXZhYz4KLSAgICAgIAotICAgICAgPCEtLSBDb3B5IHRlc3QgcmVzb3VyY2VzIC0tPgotICAgICAgPGNvcHkgdG9kaXI9InskdGVzdERlc3REaXJ9IiBmaWx0ZXJpbmc9Im9uIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJ7JHNyY30vamF2YS90ZXN0IiBleGNsdWRlcz0iKiovKi5qYXZhIi8+Ci0gICAgICA8L2NvcHk+Ci0gICAgICAKLSAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgc2hvd291dHB1dD0idHJ1ZSIgaGFsdG9uZXJyb3I9Im9uIiBoYWx0b25mYWlsdXJlPSJvbiI+Ci0gICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3tidWlsZC53ZWJhcHB9fS9XRUItSU5GL2xpYiIgaW5jbHVkZXM9IiouamFyLCBlbmRvcnNlZC8qLmphciIvPgotICAgICAgICAgIDxwYXRoIGxvY2F0aW9uPSIke3tidWlsZC53ZWJhcHB9fS9XRUItSU5GL2NsYXNzZXMiLz4KLSAgICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHt7YnVpbGQudGVzdH19Ii8+Ci0gICAgICAgICAgPHBhdGggbG9jYXRpb249InskdGVzdERlc3REaXJ9Ii8+Ci0gICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJmYWxzZSIgLz4KLSAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiIC8+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EamF2YS5lbmRvcnNlZC5kaXJzPScke3tiYXNlZGlyfX0vYnVpbGQvbGVueWEvd2ViYXBwL1dFQi1JTkYvbGliL2VuZG9yc2VkJyIvPgotICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJqdW5pdC50ZXN0LmxvZ2xldmVsIiB2YWx1ZT0iJHt7anVuaXQudGVzdC5sb2dsZXZlbH19Ii8+Ci0gICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImNvbnRleHRSb290IiB2YWx1ZT0iJHt7YmFzZWRpcn19L2J1aWxkL2xlbnlhL3dlYmFwcCIvPgotICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJ0ZW1wRGlyIiB2YWx1ZT0iJHt7YmFzZWRpcn19L2J1aWxkL2xlbnlhL3RlbXAiLz4KLSAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0idGVzdC5yZXBvLndlYmFwcERpcmVjdG9yeSIgdmFsdWU9IiR7e2J1aWxkLndlYmFwcH19Ii8+Ci0gICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9InRlc3QucmVwby5yZXBvc2l0b3J5RmFjdG9yeSIgdmFsdWU9IiR7e3JlcG9zaXRvcnkuZmFjdG9yeX19Ii8+Ci0gICAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7e2p1bml0LmRpcn19Ij4KLSAgICAgICAgICA8ZmlsZXNldCBkaXI9InskdGVzdERlc3REaXJ9IiBpbmNsdWRlcz0iKiovKlRlc3QuY2xhc3MiIGV4Y2x1ZGVzPSIqKi9BYnN0cmFjdCouY2xhc3MiLz4KLSAgICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ2Fub28gV2ViVGVzdCAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAKLSAgICA8YXZhaWxhYmxlIGZpbGU9Inskc3JjfS90ZXN0L2Nhbm9vL3Rlc3QueG1sIiBwcm9wZXJ0eT0iY2Fub28ubW9kdWxlLnskaWR9Ii8+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJjYW5vby1tb2R1bGUteyRpZH0iIGlmPSJjYW5vby5tb2R1bGUueyRpZH0iPgotICAgICAgPGFudCBkaXI9Inskc3JjfS90ZXN0L2Nhbm9vIiBhbnRmaWxlPSJ0ZXN0LnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotICAgICAgCi0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibW9kOmRlcGVuZHMiIG1vZGU9ImRlcGVuZGVuY3lXYXJuaW5nIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImlkIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJkZXBlbmRlbmN5LXdhcm5pbmcte0Btb2R1bGV9Ij4KLSAgICAgIDxwYXJhbSBuYW1lPSJkZXBlbmRlbnRNb2R1bGUiIHZhbHVlPSJ7JGlkfSIvPgotICAgIDwvYW50Y2FsbD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcmVzb3VyY2VzL2J1aWxkL21vZHVsZXMyY29uZmlnLnhzbCBiL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvbW9kdWxlczJjb25maWcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzVkZTdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvbW9kdWxlczJjb25maWcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOm1vZD0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLzEuMCIKLSAgeG1sbnM6bGlzdD0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbW9kdWxlLWxpc3QvMS4wIj4KLSAgCi0gIDx4c2w6b3V0cHV0IGluZGVudD0ieWVzIi8+Ci0gIAotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmZpZ0ZpbGUiPi9jb25maWcvbW9kdWxlLnhtbDwveHNsOnZhcmlhYmxlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGlzdDptb2R1bGUiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8ZG9jdW1lbnQoY29uY2F0KEBzcmMsICRjb25maWdGaWxlKSkvbW9kOm1vZHVsZSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSIgcHJpb3JpdHk9Ii0xIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9idWlsZC9tb2R1bGVzMnBhdGNoLnhzbCBiL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvbW9kdWxlczJwYXRjaC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMzU0YjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9idWlsZC9tb2R1bGVzMnBhdGNoLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBnbG9iYWwtc2l0ZW1hcC54bWFwIDM5Mzc2MSAyMDA2LTA0LTEzIDA4OjM4OjAwWiBtaWNoaSAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgeG1sbnM6bW9kPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUvMS4wIgotICB4bWxuczpsaXN0PSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUtbGlzdC8xLjAiCi0gIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJtb2QgbGlzdCI+Ci0gIAotICA8eHNsOmltcG9ydCBocmVmPSJ1dGlsLnhzbCIvPgotICAKLSAgPHhzbDpvdXRwdXQgaW5kZW50PSJ5ZXMiLz4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0iY29weS1tb2R1bGVzIi8+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGlzdDptb2R1bGVzIj4KLSAgICAKLSAgICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHJlbW92ZT0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMubW9kdWxlLk1vZHVsZU1hbmFnZXInXSI+Ci0KLSAgICAgIDxjb21wb25lbnQKLSAgICAgICAgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMubW9kdWxlLk1vZHVsZU1hbmFnZXIiCi0gICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5tb2R1bGUuTW9kdWxlTWFuYWdlckltcGwiPgotICAgICAgICA8bW9kdWxlcyBjb3B5PSJ7JGNvcHktbW9kdWxlc30iPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGlzdDptb2R1bGUiLz4KLSAgICAgICAgPC9tb2R1bGVzPgotICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC94Y29uZj4KLSAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJsaXN0Om1vZHVsZSI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydGN1dCI+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibGFzdFN0ZXAiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSJAc3JjIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOnZhcmlhYmxlPgotICAgIAotICAgIDxtb2R1bGUgc3JjPSJ7QHNyY30iIHNob3J0Y3V0PSJ7JHNob3J0Y3V0fSIvPgotICAgIAotICA8L3hzbDp0ZW1wbGF0ZT4gIAotCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvcHVibGljYXRpb24ucm5nIGIvdHJ1bmsvc3JjL3Jlc291cmNlcy9idWlsZC9wdWJsaWNhdGlvbi5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2Q4MjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9idWlsZC9wdWJsaWNhdGlvbi5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAKLSAgVGhpcyBSRUxBWCBORyBncmFtbWFyIGRlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvZiBhLiBMZW55YSBwdWJsaWNhdGlvbi4KLSAgQ29uZmlndXJhdGlvbiBmaWxlcyBtdXN0IGJlIGxvY2F0ZWQgdW5kZXIgIiRZT1VSUFVCUk9PVC8kUFVCTkFNRS9jb25maWcvcHVibGljYXRpb24ueG1sIi4KLSAgCi0gIFRoaXMgc2NoZW1hIGlzIG5ldyBhcyBvZiAyMDA3LTAyLTIzLiBJdCBpcyBOT1QgYmFja3dhcmRzLWNvbXBhdGlibGUuIEl0IGNvbWJpbmVzIHRoZQotICBjb250ZW50cyBvZiAkWU9VUlBVQlJPT1QvJFBVQk5BTUUvcHVibGljYXRpb24ueG1sIGFuZCAkWU9VUlBVQlJPT1QvJFBVQk5BTUUvY29uZmlnL3B1YmxpY2F0aW9uLnhtbC4KLSAgCi0gIFRoZSBwdWJsaWNhdGlvbi54bWwgZmlsZSBpcyBwYXJzZWQgYnk6Ci0gIAotICAqIHNyYy9pbXBsL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jbXMvcHVibGljYXRpb24vUHVibGljYXRpb25Db25maWd1cmF0aW9uLmphdmEKLSAgKiBzcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9wdWJsaWNhdGlvbi90ZW1wbGF0aW5nL0V4aXN0aW5nVXNlY2FzZVJlc29sdmVyLmphdmEKLSAgKiBzcmMvbW9kdWxlcy9yZXBvc2l0b3J5L2phdmEvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL21pZ3JhdGlvbi9NaWdyYXRlMTQuamF2YSAoPykKLSAgKiBzcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC9hZ2dyZWdhdGUtcHVibGljYXRpb25zLnhzbAotICAqIHdlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9tb2R1bGVzMnhpbmNsdWRlLnhzbAotICAqIHdlYmFwcC9nbG9iYWwtc2l0ZW1hcC54bWFwCi0gIAotICBQbGVhc2Uga2VlcCB0aGUgaW1wbGVtZW50YXRpb25zIGFuZCB0aGlzIGdyYW1tYXIgaW4gc3luYyEKLS0tPgotCi08Z3JhbW1hciAKLSAgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIgotICBkYXRhdHlwZUxpYnJhcnk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyIKLSAgPgotICAKLSAgPCEtLSBzb21lIGNvbnZlbmllbmNlIGRhdGEgdHlwZXMgdXNlZCBpbiB0aGlzIGdyYW1tYXI6IC0tPgotICAKLSAgPGRlZmluZSBuYW1lPSJib29sZWFuU3RyaW5nIj4KLSAgICA8Y2hvaWNlPgotICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgPHZhbHVlPmZhbHNlPC92YWx1ZT4KLSAgICA8L2Nob2ljZT4KLSAgPC9kZWZpbmU+Ci0gIAotICA8ZGVmaW5lIG5hbWU9ImZpbGVVUkwiPgotICAgIDwhLS0gcmVnZXggYW55b25lPyAtLT4KLSAgICA8ZGF0YSB0eXBlPSJzdHJpbmciLz4KLSAgPC9kZWZpbmU+Ci0gIAotICA8ZGVmaW5lIG5hbWU9Imlzb0xhbmd1YWdlIj4KLSAgICA8ZGF0YSB0eXBlPSJzdHJpbmciPgotICAgICAgPHBhcmFtIG5hbWU9InBhdHRlcm4iPlthLXpBLVpdezJ9PC9wYXJhbT4KLSAgICA8L2RhdGE+Ci0gIDwvZGVmaW5lPgotICAKLSAgPGRlZmluZSBuYW1lPSJsZW55YUFyZWFOYW1lIj4KLSAgICA8Y2hvaWNlPgotICAgICAgPHZhbHVlPmxpdmU8L3ZhbHVlPgotICAgICAgPHZhbHVlPmF1dGhvcmluZzwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YXJjaGl2ZTwvdmFsdWU+Ci0gICAgICA8dmFsdWU+dHJhc2g8L3ZhbHVlPgotICAgIDwvY2hvaWNlPgotICA8L2RlZmluZT4KLSAgCi0gIDxkZWZpbmUgbmFtZT0iamF2YUNsYXNzTmFtZSI+Ci0gICAgPGRhdGEgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDwhLS0gdG9vIGxlbmllbnQsIG5lZWRzIHRpZ2h0ZW5pbmcgLS0+Ci0gICAgICA8cGFyYW0gbmFtZT0icGF0dGVybiI+KFtcLV9hLXpBLVowLTldK1wuKStbXC1fYS16QS1aMC05XSs8L3BhcmFtPgotICAgIDwvZGF0YT4KLSAgPC9kZWZpbmU+Ci0gIAotICA8ZGVmaW5lIG5hbWU9Im1vZHVsZU5hbWUiPgotICAgIDxyZWYgbmFtZT0ic2ltcGxlTmFtZVRva2VuIi8+Ci0gIDwvZGVmaW5lPgotICAKLSAgPGRlZmluZSBuYW1lPSJyZXNvdXJjZVR5cGVOYW1lIj4KLSAgICA8cmVmIG5hbWU9InNpbXBsZU5hbWVUb2tlbiIvPgotICA8L2RlZmluZT4KLSAgCi0gIDxkZWZpbmUgbmFtZT0icmV2aXNpb25TdHJpbmciPgotICAgIDxkYXRhIHR5cGU9InN0cmluZyI+Ci0gICAgPC9kYXRhPgotICA8L2RlZmluZT4KLSAgCi0gIDxkZWZpbmUgbmFtZT0ic2ltcGxlTmFtZVRva2VuIj4KLSAgICA8ZGF0YSB0eXBlPSJzdHJpbmciPgotICAgICAgPHBhcmFtIG5hbWU9InBhdHRlcm4iPlthLXpdKzwvcGFyYW0+Ci0gICAgPC9kYXRhPgotICA8L2RlZmluZT4KLSAgCi0gIDxkZWZpbmUgbmFtZT0idmVyc2lvblN0cmluZyI+Ci0gICAgPGRhdGEgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxwYXJhbSBuYW1lPSJwYXR0ZXJuIj4oQGxlbnlhLnZlcnNpb25AKXwoKFswLTldK1wuKStbMC05XSsoLVtcLV9hLXpBLVowLTldKyk/KTwvcGFyYW0+Ci0gICAgPC9kYXRhPgotICA8L2RlZmluZT4KLSAgCi0gIDxkZWZpbmUgbmFtZT0id29ya2Zsb3dVcmkiPgotICAgIDxkYXRhIHR5cGU9ImFueVVSSSIvPgotICA8L2RlZmluZT4KLSAgCi0gIDxkZWZpbmUgbmFtZT0iWFBhdGhFeHByZXNzaW9uIj4KLSAgICA8IS0tIHJlZ2V4IGFueW9uZT8gLS0+Ci0gICAgPGRhdGEgdHlwZT0ic3RyaW5nIi8+Ci0gIDwvZGVmaW5lPgotICAKLSAgPCEtLSBoZXJlIGNvbWVzIHRoZSBpbXBvcnRhbnQgcGFydCAtLT4KLSAgCi0gIDxzdGFydD4KLSAgICAKLSAgICA8ZWxlbWVudCBuYW1lPSJwdWJsaWNhdGlvbiIKLSAgICAgIG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcHVibGljYXRpb24vMS4xIgotICAgICAgPgotICAgICAgPG9wdGlvbmFsPiAKLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaG93Ij48cmVmIG5hbWU9ImJvb2xlYW5TdHJpbmciLz48L2F0dHJpYnV0ZT4KLSAgICAgIDwvb3B0aW9uYWw+Ci0gICAgICA8aW50ZXJsZWF2ZT4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSI+PGRhdGEgdHlwZT0ic3RyaW5nIi8+PC9lbGVtZW50PgotICAgICAgICA8b3B0aW9uYWw+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iPjxkYXRhIHR5cGU9InN0cmluZyIvPjwvZWxlbWVudD4KLSAgICAgICAgPC9vcHRpb25hbD4KLSAgICAgICAgPG9wdGlvbmFsPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZlcnNpb24iPjxyZWYgbmFtZT0idmVyc2lvblN0cmluZyIvPjwvZWxlbWVudD4KLSAgICAgICAgPC9vcHRpb25hbD4KLSAgICAgICAgPG9wdGlvbmFsPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxlbnlhLXZlcnNpb24iPjxyZWYgbmFtZT0idmVyc2lvblN0cmluZyIvPjwvZWxlbWVudD4KLSAgICAgICAgPC9vcHRpb25hbD4KLSAgICAgICAgPG9wdGlvbmFsPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxlbnlhLXJldmlzaW9uIj48cmVmIG5hbWU9InJldmlzaW9uU3RyaW5nIi8+PC9lbGVtZW50PgotICAgICAgICA8L29wdGlvbmFsPgotICAgICAgICA8b3B0aW9uYWw+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY29jb29uLXZlcnNpb24iPjxyZWYgbmFtZT0idmVyc2lvblN0cmluZyIvPjwvZWxlbWVudD4KLSAgICAgICAgPC9vcHRpb25hbD4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGFuZ3VhZ2VzIj4KLSAgICAgICAgICA8b25lT3JNb3JlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGFuZ3VhZ2UiPgotICAgICAgICAgICAgICA8b3B0aW9uYWw+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Ij4KLSAgICAgICAgICAgICAgICAgIDxyZWYgbmFtZT0iYm9vbGVhblN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgICAgICA8L29wdGlvbmFsPgotICAgICAgICAgICAgICA8cmVmIG5hbWU9Imlzb0xhbmd1YWdlIi8+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgPC9vbmVPck1vcmU+Ci0gICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgPG9wdGlvbmFsPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlbXBsYXRlIj4KLSAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiPgotICAgICAgICAgICAgICA8cmVmIG5hbWU9InNpbXBsZU5hbWVUb2tlbiIvPgotICAgICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICA8L29wdGlvbmFsPgotICAgICAgICA8b3B0aW9uYWw+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVtcGxhdGUtaW5zdGFudGlhdG9yIj48YXR0cmlidXRlIG5hbWU9Im5hbWUiPjxkYXRhIHR5cGU9InN0cmluZyIvPjwvYXR0cmlidXRlPjwvZWxlbWVudD4KLSAgICAgICAgPC9vcHRpb25hbD4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0icGF0aC1tYXBwZXIiPgotICAgICAgICAgIDxyZWYgbmFtZT0iamF2YUNsYXNzTmFtZSIvPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9ImRvY3VtZW50LWJ1aWxkZXIiPjxhdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PGRhdGEgdHlwZT0ic3RyaW5nIi8+PC9hdHRyaWJ1dGU+PC9lbGVtZW50PgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJzaXRlLW1hbmFnZXIiPjxhdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PGRhdGEgdHlwZT0ic3RyaW5nIi8+PC9hdHRyaWJ1dGU+PC9lbGVtZW50PgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS10eXBlcyI+Ci0gICAgICAgICAgPHplcm9Pck1vcmU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS10eXBlIj4KLSAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48cmVmIG5hbWU9InJlc291cmNlVHlwZU5hbWUiLz48L2F0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3b3JrZmxvdyI+PHJlZiBuYW1lPSJ3b3JrZmxvd1VyaSIvPjwvYXR0cmlidXRlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgIDwvemVyb09yTW9yZT4KLSAgICAgICAgPC9lbGVtZW50PgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJtb2R1bGVzIj4KLSAgICAgICAgICA8emVyb09yTW9yZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im1vZHVsZSI+Ci0gICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PHJlZiBuYW1lPSJtb2R1bGVOYW1lIi8+PC9hdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgPC96ZXJvT3JNb3JlPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDxvcHRpb25hbD4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJicmVhZGNydW1iLXByZWZpeCI+PGRhdGEgdHlwZT0ic3RyaW5nIi8+PC9lbGVtZW50PgotICAgICAgICA8L29wdGlvbmFsPgotICAgICAgICA8b3B0aW9uYWw+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY29udGVudC1kaXIiPgotICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiPgotICAgICAgICAgICAgICA8cmVmIG5hbWU9ImZpbGVVUkwiLz4KLSAgICAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgPC9vcHRpb25hbD4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0icHJveGllcyI+Ci0gICAgICAgICAgPHplcm9Pck1vcmU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwcm94eSI+Ci0gICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJlYSI+PHJlZiBuYW1lPSJsZW55YUFyZWFOYW1lIi8+PC9hdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NsIj48cmVmIG5hbWU9ImJvb2xlYW5TdHJpbmciLz48L2F0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiPjxkYXRhIHR5cGU9ImFueVVSSSIvPjwvYXR0cmlidXRlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgIDwvemVyb09yTW9yZT4KLSAgICAgICAgPC9lbGVtZW50PgotICAgICAgPC9pbnRlcmxlYXZlPgotICAgICAgCi0gICAgPC9lbGVtZW50PgotICAgIAotICA8L3N0YXJ0PgotICAKLTwvZ3JhbW1hcj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvdXRpbC54c2wgYi90cnVuay9zcmMvcmVzb3VyY2VzL2J1aWxkL3V0aWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWUzNjc1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9yZXNvdXJjZXMvYnVpbGQvdXRpbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZ2xvYmFsLXNpdGVtYXAueG1hcCAzOTM3NjEgMjAwNi0wNC0xMyAwODozODowMFogbWljaGkgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0ibGFzdFN0ZXAiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icGF0aCIvPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCRwYXRoLCAnLycpIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imxhc3RTdGVwIj4KLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsICcvJykiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHBhdGgsICdcJykiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibGFzdFN0ZXAiPgotICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aCwgJ1wnKSIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhdGgiLz4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9idWlsZC93b3JrZmxvdy5ybmcgYi90cnVuay9zcmMvcmVzb3VyY2VzL2J1aWxkL3dvcmtmbG93LnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2YmRiMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcmVzb3VyY2VzL2J1aWxkL3dvcmtmbG93LnJuZworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB3b3JrZmxvdy54c2QgNDczODYxIDIwMDYtMTEtMTIgMDM6NTE6MTRaIGdyZWdvciAkIC0tPgotCi08Z3JhbW1hciAKLSAgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIgotICBkYXRhdHlwZUxpYnJhcnk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyIKLT4KLQotICA8ZGVmaW5lIG5hbWU9InNpbXBsZU5hbWVUb2tlbiI+Ci0gICAgPGRhdGEgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxwYXJhbSBuYW1lPSJwYXR0ZXJuIj5bXC1fYS16QS1aXSs8L3BhcmFtPgotICAgIDwvZGF0YT4KLSAgPC9kZWZpbmU+Ci0KLSAgPGRlZmluZSBuYW1lPSJqYXZhQ2xhc3NOYW1lIj4KLSAgICA8ZGF0YSB0eXBlPSJzdHJpbmciPgotICAgICAgPHBhcmFtIG5hbWU9InBhdHRlcm4iPihbXC1fYS16QS1aMC05XStcLikrW1wtX2EtekEtWjAtOV0rPC9wYXJhbT4KLSAgICA8L2RhdGE+Ci0gIDwvZGVmaW5lPgotCi0gIDxkZWZpbmUgbmFtZT0iYm9vbGVhblN0cmluZyI+Ci0gICAgPGNob2ljZT4KLSAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5mYWxzZTwvdmFsdWU+Ci0gICAgPC9jaG9pY2U+Ci0gIDwvZGVmaW5lPgotCi08c3RhcnQ+Ci0KLTxlbGVtZW50IAotICAgbmFtZT0id29ya2Zsb3ciICAgIG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvd29ya2Zsb3cvMS4wIgotPgotICA8emVyb09yTW9yZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJzdGF0ZSI+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIj48cmVmIG5hbWU9InNpbXBsZU5hbWVUb2tlbiIvPjwvYXR0cmlidXRlPgotICAgICAgPG9wdGlvbmFsPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluaXRpYWwiPjx2YWx1ZT50cnVlPC92YWx1ZT48L2F0dHJpYnV0ZT4KLSAgICAgIDwvb3B0aW9uYWw+Ci0gICAgPC9lbGVtZW50PgotICA8L3plcm9Pck1vcmU+Ci0gIDwhLS0gY2FuIHRoaXMgYmUgbWFkZSBtb3JlIGZsZXhpYmxlPyB6ZXJvT3JNb3JlIHZhcmlhYmxlcyBvZiBhcmJpdHJhcnkgdHlwZT8gLS0+Ci0gIDxlbGVtZW50IG5hbWU9InZhcmlhYmxlIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiPjxyZWYgbmFtZT0ic2ltcGxlTmFtZVRva2VuIi8+PC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+Ci0gICAgICA8cmVmIG5hbWU9ImJvb2xlYW5TdHJpbmciLz4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC9lbGVtZW50PgotICA8b25lT3JNb3JlPgotICAgIDxlbGVtZW50IG5hbWU9InRyYW5zaXRpb24iPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiPjxyZWYgbmFtZT0ic2ltcGxlTmFtZVRva2VuIi8+PC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RpbmF0aW9uIj48cmVmIG5hbWU9InNpbXBsZU5hbWVUb2tlbiIvPjwvYXR0cmlidXRlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZXZlbnQiPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIj48cmVmIG5hbWU9InNpbXBsZU5hbWVUb2tlbiIvPjwvYXR0cmlidXRlPgotICAgICAgPC9lbGVtZW50PgotICAgICAgPG9uZU9yTW9yZT4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0iY29uZGl0aW9uIj4KLSAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIj48cmVmIG5hbWU9ImphdmFDbGFzc05hbWUiLz48L2F0dHJpYnV0ZT4KLSAgICAgICAgICA8ZGF0YSB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgPC9lbGVtZW50PgotICAgICAgPC9vbmVPck1vcmU+Ci0gICAgICA8b3B0aW9uYWw+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9ImFzc2lnbiI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJsZSI+PHJlZiBuYW1lPSJzaW1wbGVOYW1lVG9rZW4iLz48L2F0dHJpYnV0ZT4KLSAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIj4KLSAgICAgICAgICAgIDxyZWYgbmFtZT0iYm9vbGVhblN0cmluZyIvPgotICAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICA8L29wdGlvbmFsPgotICAgIDwvZWxlbWVudD4KLSAgPC9vbmVPck1vcmU+Ci08L2VsZW1lbnQ+Ci0KLTwvc3RhcnQ+Ci08L2dyYW1tYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9kZXYvZWNsaXBzZS9jaGVja3N0eWxlLXBsdWdpbi5jZmcgYi90cnVuay9zcmMvcmVzb3VyY2VzL2Rldi9lY2xpcHNlL2NoZWNrc3R5bGUtcGx1Z2luLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhMmUxNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcmVzb3VyY2VzL2Rldi9lY2xpcHNlL2NoZWNrc3R5bGUtcGx1Z2luLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPGNoZWNrc3R5bGUtY29uZmlndXJhdGlvbnMgZmlsZS1mb3JtYXQtdmVyc2lvbj0iMS4wLjAiPgotICAgIDxjaGVjay1jb25maWd1cmF0aW9uIG5hbWU9InN0YW5kYXJkIj4KLSAgICAgICAgPHJ1bGUtY29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3NuYW1lPSJjb20ucHVwcHljcmF3bC50b29scy5jaGVja3N0eWxlLmNoZWNrcy5KYXZhZG9jVHlwZUNoZWNrIiBzZXZlcml0eT0id2FybmluZyI+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9Indhcm5pbmciLz4KLSAgICAgICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkNMQVNTX0RFRiwgSU5URVJGQUNFX0RFRiIvPgotICAgICAgICAgICAgICAgIDxjb25maWctcHJvcGVydHkgbmFtZT0iYXV0aG9yRm9ybWF0IiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBuYW1lPSJzY29wZSIgdmFsdWU9InByaXZhdGUiLz4KLSAgICAgICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5IG5hbWU9InZlcnNpb25Gb3JtYXQiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvY29uZmlnLXByb3BlcnRpZXM+Ci0gICAgICAgIDwvcnVsZS1jb25maWd1cmF0aW9uPgotICAgICAgICA8cnVsZS1jb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzc25hbWU9ImNvbS5wdXBweWNyYXdsLnRvb2xzLmNoZWNrc3R5bGUuY2hlY2tzLkphdmFkb2NNZXRob2RDaGVjayIgc2V2ZXJpdHk9Indhcm5pbmciPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDxjb25maWctcHJvcGVydHkgbmFtZT0iYWxsb3dUaHJvd3NUYWdzRm9yU3ViY2xhc3NlcyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBuYW1lPSJhbGxvd1VuZGVjbGFyZWRSVEUiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxjb25maWctcHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJ3YXJuaW5nIi8+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJNRVRIT0RfREVGLCBDVE9SX0RFRiIvPgotICAgICAgICAgICAgICAgIDxjb25maWctcHJvcGVydHkgbmFtZT0iYWxsb3dNaXNzaW5nUGFyYW1UYWdzIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5IG5hbWU9InNjb3BlIiB2YWx1ZT0icHJpdmF0ZSIvPgotICAgICAgICAgICAgICAgIDxjb25maWctcHJvcGVydHkgbmFtZT0iYWxsb3dNaXNzaW5nUmV0dXJuVGFnIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5IG5hbWU9ImFsbG93TWlzc2luZ1Rocm93c1RhZ3MiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jb25maWctcHJvcGVydGllcz4KLSAgICAgICAgPC9ydWxlLWNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxydWxlLWNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLnB1cHB5Y3Jhd2wudG9vbHMuY2hlY2tzdHlsZS5jaGVja3MuUmVkdW5kYW50TW9kaWZpZXJDaGVjayIgc2V2ZXJpdHk9Indhcm5pbmciPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDxjb25maWctcHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJ3YXJuaW5nIi8+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJNRVRIT0RfREVGLCBWQVJJQUJMRV9ERUYiLz4KLSAgICAgICAgICAgIDwvY29uZmlnLXByb3BlcnRpZXM+Ci0gICAgICAgIDwvcnVsZS1jb25maWd1cmF0aW9uPgotICAgICAgICA8cnVsZS1jb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzc25hbWU9ImNvbS5wdXBweWNyYXdsLnRvb2xzLmNoZWNrc3R5bGUuY2hlY2tzLlZpc2liaWxpdHlNb2RpZmllckNoZWNrIiBzZXZlcml0eT0id2FybmluZyI+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBuYW1lPSJwYWNrYWdlQWxsb3dlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9Indhcm5pbmciLz4KLSAgICAgICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5IG5hbWU9InB1YmxpY01lbWJlclBhdHRlcm4iIHZhbHVlPSJec2VyaWFsVmVyc2lvblVJRCIvPgotICAgICAgICAgICAgICAgIDxjb25maWctcHJvcGVydHkgbmFtZT0icHJvdGVjdGVkQWxsb3dlZCIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0aWVzPgotICAgICAgICA8L3J1bGUtY29uZmlndXJhdGlvbj4KLSAgICAgICAgPHJ1bGUtY29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3NuYW1lPSJjb20ucHVwcHljcmF3bC50b29scy5jaGVja3N0eWxlLmNoZWNrcy5GaW5hbENsYXNzQ2hlY2siIHNldmVyaXR5PSJ3YXJuaW5nIj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0id2FybmluZyIvPgotICAgICAgICAgICAgPC9jb25maWctcHJvcGVydGllcz4KLSAgICAgICAgPC9ydWxlLWNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxydWxlLWNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLnB1cHB5Y3Jhd2wudG9vbHMuY2hlY2tzdHlsZS5jaGVja3MuSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yQ2hlY2siIHNldmVyaXR5PSJ3YXJuaW5nIj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0id2FybmluZyIvPgotICAgICAgICAgICAgPC9jb25maWctcHJvcGVydGllcz4KLSAgICAgICAgPC9ydWxlLWNvbmZpZ3VyYXRpb24+Ci0gICAgPC9jaGVjay1jb25maWd1cmF0aW9uPgotPC9jaGVja3N0eWxlLWNvbmZpZ3VyYXRpb25zPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9kZXYvZWNsaXBzZS9jbGFzc3BhdGgtdG1wbC54bWwgYi90cnVuay9zcmMvcmVzb3VyY2VzL2Rldi9lY2xpcHNlL2NsYXNzcGF0aC10bXBsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyY2EwZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcmVzb3VyY2VzL2Rldi9lY2xpcHNlL2NsYXNzcGF0aC10bXBsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGRhdGE+Ci0gIDxzcmMtZGlycz48aXRlbT5AU1JDX0RJUlNAPC9pdGVtPjwvc3JjLWRpcnM+Ci0gIDxsaWJzPjxpdGVtPkBMSUJTQDwvaXRlbT48L2xpYnM+Ci0gIDxvdXRwdXQ+QE9VVFBVVF9ESVJAPC9vdXRwdXQ+Ci08L2RhdGE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Jlc291cmNlcy9kZXYvZWNsaXBzZS9tYWtlLWNsYXNzcGF0aC54c2wgYi90cnVuay9zcmMvcmVzb3VyY2VzL2Rldi9lY2xpcHNlL21ha2UtY2xhc3NwYXRoLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1OTJhNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcmVzb3VyY2VzL2Rldi9lY2xpcHNlL21ha2UtY2xhc3NwYXRoLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0gIEJ1aWxkIHRoZSBFY2xpcHNlIC5jbGFzc3BhdGggZmlsZSBmcm9tIGEgbGlzdCBvZiBwYXRoIGl0ZW1zCi0gIChzZWUgImVjbGlwc2UtcHJvamVjdCIgdGFyZ2V0IGluIGJ1aWxkLnhtbCkKLSAgCi0gICRJZCQKLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLSAgPHhzbDpvdXRwdXQgaW5kZW50PSJ5ZXMiIG1ldGhvZD0ieG1sIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iZXhwb3J0bGliIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29jb29uUHJvamVjdE5hbWUiLz4KLSAgCi0gIDx4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHM9IioiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvZGF0YSI+Ci0gICAgPGNsYXNzcGF0aD4KLQotICAgICAgPCEtLSAxLiBzb3VyY2UgZGlycyAtLT4KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJzcmMtZGlycy9pdGVtIj4KLSAgICAgICAgPCEtLSBhbHBoYWJldGljYWwgc29ydGluZywgY29tcGxldGUgcGF0aCAtLT4KLSAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iLiIvPgotICAgICAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ7Ln0iLz4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIAotICAgICAgPCEtLSAyLiBsaWJyYXJpZXMgLS0+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibGlicy9pdGVtIj4KLSAgICAgICAgPCEtLSBhbHBoYWJldGljYWwgc29ydGluZywgb25seSBmaWxlIG5hbWUgLS0+Ci0gICAgICAgIDwhLS0gaGVhdnkgY2FsY3VsYXRpb24sIGJ1dCBoZXJlJ3MgdGhlIGxvZ2ljOgotICAgICAgICAgICAgIDEuIHJldHVybnMgdGhlIHN0cmluZyBhZnRlciA0IHNsYXNoZXMgKDQgaXMgdGhlIG1heCAoYmxvY2tzKSksCi0gICAgICAgICAgICAgICAgcmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gNCBzbGFzaGVzCi0gICAgICAgICAgICAgMi4gLi4uIDMgc2xhc2hlcyAuLi4KLSAgICAgICAgICAgICAzLiAuLi4gMiBzbGFzaGVzIC4uLiAodGhlIG1pbmltdW0pIC0tPgotICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJjb25jYXQoc3Vic3RyaW5nLWFmdGVyKHN1YnN0cmluZy1hZnRlcihzdWJzdHJpbmctYWZ0ZXIoc3Vic3RyaW5nLWFmdGVyKC4sICcvJyksICcvJyksICcvJyksICcvJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyaW5nLWFmdGVyKHN1YnN0cmluZy1hZnRlcihzdWJzdHJpbmctYWZ0ZXIoLiwgJy8nKSwgJy8nKSwgJy8nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyaW5nLWFmdGVyKHN1YnN0cmluZy1hZnRlciguLCAnLycpLCAnLycpKSIvPgotICAgICAgICA8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InskZXhwb3J0bGlifSIga2luZD0ibGliIiBwYXRoPSJ7Ln0iLz4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICA8IS0tIDMuIEpSRSBydW50aW1lIC0tPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotICAgICAKLSAgICAgIDwhLS0gNC4gb3V0cHV0IGRpcmVjdG9yeQotICAgICAgICAgICBCdWlsZCBpbiBhIHNlcGFyYXRlIGRpciBzaW5jZSBFY2xpcHNlIGlzIGNvbmZ1c2VkCi0gICAgICAgICAgIGJ5IGNsYXNzZXMgY29tcGlsZWQgZXh0ZXJuYWxseSBieSBTdW4ncyBKYXZhYyAtLT4KLSAgICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9IntvdXRwdXR9Ii8+Ci0KLSAgICAgIDwhLS0gNS4gRGVwZW5kYW5jZSBvbiBDb2Nvb24uIFRoZXJlIG5lZWRzIHRvIGJlIGEgY29jb29uLTIuMSBlY2xpcHNlIHByb2plY3QgLS0+Ci0JICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIveyRjb2Nvb25Qcm9qZWN0TmFtZX0iLz4KLQotICAgIDwvY2xhc3NwYXRoPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9yZXNvdXJjZXMvZGV2L2VjbGlwc2UvcHJvamVjdCBiL3RydW5rL3NyYy9yZXNvdXJjZXMvZGV2L2VjbGlwc2UvcHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4YzliMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcmVzb3VyY2VzL2Rldi9lY2xpcHNlL3Byb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLSAgPG5hbWU+TGVueWEgQFZFUlNJT05APC9uYW1lPgotICA8Y29tbWVudD48L2NvbW1lbnQ+Ci0gIDxwcm9qZWN0cz4KLSAgICA8cHJvamVjdD5AQ09DT09OX1BST0pFQ1RAPC9wcm9qZWN0PgotICA8L3Byb2plY3RzPgotICA8YnVpbGRTcGVjPgotICAgIDxidWlsZENvbW1hbmQ+Ci0gICAgICA8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLSAgICAgIDxhcmd1bWVudHM+Ci0gICAgICA8L2FyZ3VtZW50cz4KLSAgICA8L2J1aWxkQ29tbWFuZD4KLSAgPC9idWlsZFNwZWM+Ci0gIDxuYXR1cmVzPgotICAgIDxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotICA8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9yZXNvdXJjZXMvamF2YWRvYy5jc3MgYi90cnVuay9zcmMvcmVzb3VyY2VzL2phdmFkb2MuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMwNjA5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9yZXNvdXJjZXMvamF2YWRvYy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS8qIEFwYWNoZSBKYXZhZG9jIHN0eWxlIHNoZWV0ICovCi0KLS8qIFBhZ2UgYmFja2dyb3VuZCBjb2xvciAqLwotYm9keSB7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYgfQotCi0vKiBUYWJsZSBjb2xvcnMgKi8KLS5UYWJsZUhlYWRpbmdDb2xvciAgICAgeyBiYWNrZ3JvdW5kOiAjRDBEMEQwIH0KLS5UYWJsZVN1YkhlYWRpbmdDb2xvciAgeyBiYWNrZ3JvdW5kOiAjRTBFMEUwIH0KLS5UYWJsZVJvd0NvbG9yICAgICAgICAgeyBiYWNrZ3JvdW5kOiAjRjlGOUY5IH0KLQotLyogTmF2aWdhdGlvbiBiYXIgZm9udHMgYW5kIGNvbG9ycyAqLwotLk5hdkJhckNlbGwxICAgIHsgYmFja2dyb3VuZC1jb2xvcjojRDBEMEQwO30KLS5OYXZCYXJDZWxsMVJldiB7IGJhY2tncm91bmQtY29sb3I6I0EwQTBBMDt9Ci0uTmF2QmFyRm9udDEgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6IzAwMDAwMDt9Ci0uTmF2QmFyRm9udDFSZXYgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6I0ZGRkZGRjt9Ci0uTmF2QmFyQ2VsbDIgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRTBFMEUwO30KLS5OYXZCYXJDZWxsMyAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiNGMEYwRjA7fQotCi0vKiBGb250IHVzZWQgaW4gbGVmdC1oYW5kIGZyYW1lIGxpc3RzICovCi0uRnJhbWVUaXRsZUZvbnQgICB7IGZvbnQtc2l6ZTogbm9ybWFsOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiB9Ci0uRnJhbWVIZWFkaW5nRm9udCB7IGZvbnQtc2l6ZTogbm9ybWFsOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiB9Ci0uRnJhbWVJdGVtRm9udCAgICB7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgfQotCi0vKiBMaW5rIGNvbG9ycyBzdHlsaW5nICovCi1BOmxpbmsgeyBjb2xvcjogIzAwMDBBMCB9ICAgICAgICAgIC8qIHVudmlzaXRlZCBsaW5rICovCi1BOnZpc2l0ZWQgeyBjb2xvcjogI0EwMDAwMCB9ICAgICAgIC8qIHZpc2l0ZWQgbGlua3MgKi8KLUE6YWN0aXZlIHsgY29sb3I6ICMwMEEwMDAgfSAgICAgICAgLyogYWN0aXZlIGxpbmtzICovCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcmVzb3VyY2VzL3Rlc3QvbWV0YS54c2wgYi90cnVuay9zcmMvcmVzb3VyY2VzL3Rlc3QvbWV0YS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDA5OTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3Jlc291cmNlcy90ZXN0L21ldGEueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c289Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS94c2x0LzEuMCIKLSAgPgotCi0gIDx4c2w6bmFtZXNwYWNlLWFsaWFzIHN0eWxlc2hlZXQtcHJlZml4PSJ4c28iIHJlc3VsdC1wcmVmaXg9InhzbCIvPgotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPHhzbzpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCI+Ci0gICAgICAKLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIAotICAgICAgPHhzbzp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICAgICAgPHhzbzpjb3B5PgotICAgICAgICAgIDx4c286YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgICAgIDwveHNvOmNvcHk+Ci0gICAgICA8L3hzbzp0ZW1wbGF0ZT4KLSAgICAgIAotICAgIDwveHNvOnN0eWxlc2hlZXQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyoiPgotICAgIDx4c286dGVtcGxhdGUgbWF0Y2g9InskZWxlbWVudH0iPgotICAgICAgPHhzbzpjb3B5PgotICAgICAgICA8eHNvOmNvcHktb2Ygc2VsZWN0PSIqIi8+Ci0gICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IioiLz4KLSAgICAgIDwveHNvOmNvcHk+Ci0gICAgPC94c286dGVtcGxhdGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcmVzb3VyY2VzL3Rlc3QvdGVtcGxhdGUteHRlc3QueG1sIGIvdHJ1bmsvc3JjL3Jlc291cmNlcy90ZXN0L3RlbXBsYXRlLXh0ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmMjI1Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcmVzb3VyY2VzL3Rlc3QvdGVtcGxhdGUteHRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHRlc3RjYXNlPgotICAKLSAgPGFubm90YXRpb24+Ci0gICAgVGVzdCBDYXNlcwotICA8L2Fubm90YXRpb24+Ci0gIAotICA8cm9sZXM+Ci0gICAgCi0gICAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLlNvdXJjZUZhY3RvcnlTZWxlY3RvciIKLSAgICAgIHNob3J0aGFuZD0ic291cmNlLWZhY3RvcmllcyIKLSAgICAgIGRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5jb21wb25lbnQuRXhjYWxpYnVyQ29tcG9uZW50U2VsZWN0b3IiLz4KLSAgICA8cm9sZSBuYW1lPSJvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuU291cmNlUmVzb2x2ZXIiCi0gICAgICBzaG9ydGhhbmQ9InNvdXJjZS1yZXNvbHZlciIKLSAgICAgIGRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5pbXBsLlNvdXJjZVJlc29sdmVySW1wbCIvPgotICAgICAgCi0gICAgPHJvbGUgbmFtZT0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZWFyY2guTHVjZW5lQ29jb29uU2VhcmNoZXIiCi0gICAgICBzaG9ydGhhbmQ9ImNvY29vbi1zZWFyY2hlciIKLSAgICAgIGRlZmF1bHQtY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLlNpbXBsZUx1Y2VuZUNvY29vblNlYXJjaGVySW1wbCIvPgotICAgICAgCi0gIDwvcm9sZXM+Ci0gIAotICA8Y29tcG9uZW50cy8+Ci0gIAotPC90ZXN0Y2FzZT4KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvcmVzb3VyY2VzL3Rlc3QveGNvbmYtdGVtcGxhdGUueG1sIGIvdHJ1bmsvc3JjL3Jlc291cmNlcy90ZXN0L3hjb25mLXRlbXBsYXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjOWRmNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvcmVzb3VyY2VzL3Rlc3QveGNvbmYtdGVtcGxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvY29vbj4KLQotICA8c291cmNlLWZhY3Rvcmllcz4KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIGNsYXNzPSJvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3VyY2UuaW1wbC5SZXNvdXJjZVNvdXJjZUZhY3RvcnkiIG5hbWU9InJlc291cmNlIi8+Ci0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBjbGFzcz0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zb3VyY2UuaW1wbC5Db250ZXh0U291cmNlRmFjdG9yeSIgbmFtZT0iY29udGV4dCIvPgotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgY2xhc3M9Im9yZy5hcGFjaGUuZXhjYWxpYnVyLnNvdXJjZS5pbXBsLlVSTFNvdXJjZUZhY3RvcnkiIG5hbWU9IioiLz4KLSAgPC9zb3VyY2UtZmFjdG9yaWVzPgotICAKLSAgPHNvdXJjZS1yZXNvbHZlciBjbGFzcz0ib3JnLmFwYWNoZS5leGNhbGlidXIuc291cmNlLmltcGwuU291cmNlUmVzb2x2ZXJJbXBsIi8+Ci0gIAotPC9jb2Nvb24+Ci0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Jlc291cmNlcy90ZXN0L3hwYXRjaDJ0ZXN0cGF0Y2gueHNsIGIvdHJ1bmsvc3JjL3Jlc291cmNlcy90ZXN0L3hwYXRjaDJ0ZXN0cGF0Y2gueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGQ5NjQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9yZXNvdXJjZXMvdGVzdC94cGF0Y2gydGVzdHBhdGNoLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNvPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEveHNsdC8xLjAiCi0gID4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIveGNvbmYiPgotICAgIDx4dGVzdD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94dGVzdD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCogW2xvY2FsLW5hbWUoKSA9ICd4cGF0aCcgb3IgbG9jYWwtbmFtZSgpID0gJ3JlbW92ZScgb3IgbG9jYWwtbmFtZSgpID0gJ3VubGVzcyddIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdGFydHMtd2l0aCguLCAnL2NvY29vbicpIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ie2xvY2FsLW5hbWUoKX0iPi90ZXN0Y2FzZS9jb21wb25lbnRzPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlciguLCAnL2NvY29vbicpIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIuIi8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGFyZ2V0cy9jb21waWxlLWJ1aWxkLnhtbCBiL3RydW5rL3NyYy90YXJnZXRzL2NvbXBpbGUtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQwMzU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy90YXJnZXRzL2NvbXBpbGUtYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHByb2plY3QgbmFtZT0ibGVueWEtY29tcGlsZSI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgIENvbXBpbGF0aW9uIFRhcmdldHMKLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDwhLS0gY29tcGlsZSBhbmQgcGFja2FnZSBhIHNwZWNpZmljIHNvdXJjZSBkaXJlY3RvcnkgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS1zcmMiPgotICAgIAotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLnNyYy5kaXIiIHZhbHVlPSIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZXN0LmRpciIgdmFsdWU9IiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9IiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXIubmFtZSIgdmFsdWU9IiIvPgotICAgIAotICAgIDwhLS0gREVCVUcgY2xhc3NwYXRoIC0tPgotICAgIDwhLS0KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc3BhdGguY29tcGlsZSIgcmVmaWQ9ImNsYXNzcGF0aCIvPgotICAgICAgPGVjaG8+Q0xBU1NQQVRIIDogJHtjbGFzc3BhdGguY29tcGlsZX08L2VjaG8+Ci0gICAgLS0+Ci0KLSAgICA8bWtkaXIgZGlyPSIke2NvbXBpbGUuZGVzdC5kaXJ9Ii8+Ci0gICAgCi0gICAgPCEtLSAgY29weSBwcm9wZXJ0aWVzLCB4bWwgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgcm9sZXMgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7Y29tcGlsZS5kZXN0LmRpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2NvbXBpbGUuc3JjLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5yb2xlcyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnJuZyIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICAKLSAgICA8amF2YWMgZGVzdGRpcj0iJHtjb21waWxlLmRlc3QuZGlyfSIKLSAgICAgIGRlYnVnPSIke2RlYnVnfSIKLSAgICAgIG9wdGltaXplPSIke29wdGltaXplfSIKLSAgICAgIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKLSAgICAgIHRhcmdldD0iJHt0YXJnZXQudm19IgotICAgICAgbm93YXJuPSIke25vd2Fybn0iCi0gICAgICBzb3VyY2U9IiR7c3JjLmphdmEudmVyc2lvbn0iPgotICAgICAgPHNyYyBwYXRoPSIke2NvbXBpbGUuc3JjLmRpcn0iLz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9IiR7Y29tcGlsZS5jbGFzc3BhdGh9Ii8+Ci0gICAgPC9qYXZhYz4KLQotICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliLyR7ZnVsbG5hbWV9LSR7amFyLm5hbWV9LmphciIgaW5kZXg9InRydWUiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2NvbXBpbGUuZGVzdC5kaXJ9Ij4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovTWFuaWZlc3QubWYiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0gIAotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90YXJnZXRzL2Rpc3QtYnVpbGQueG1sIGIvdHJ1bmsvc3JjL3RhcmdldHMvZGlzdC1idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWI3NDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3RhcmdldHMvZGlzdC1idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHByb2plY3QgbmFtZT0ibGVueWEtZGlzdCI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgIERpc3RyaWJ1dGlvbiBUYXJnZXRzCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjbGVhbixkaXN0LXNyYyxkaXN0LWJpbiIgZGVzY3JpcHRpb249IkJ1aWxkIGFsbCBkaXN0cmlidXRpb24gcmVsZXZhbnQgdGFyYmFsbHMiLz4KLQotICA8IS0tCi0gIFRoaXMgdGFyZ2V0IHByZXBhcmVzIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIHRhcmJhbGwgZm9yCi0gIGVuZCB1c2Vycy4gSXQgZm9yY2VzIGEgY29tcGxldGUgcmVidWlsZCBvZiBldmVyeXRoaW5nIHRocm91Z2ggaXRzCi0gIGRlcGVuZGVuY3kgb24gdGhlICJjbGVhbiIgdGFyZ2V0IGluIG9yZGVyIHRvIHByZXZlbnQgZ2FyYmFnZQotICBsaWtlIHRoZSBjb2Nvb24gbG9nZmlsZXMgZnJvbSBlbmRpbmcgdXAgaW4gdGhlIGRpc3RyaWJ1dGlvbiB0YXJiYWxsLgotICAtLT4KLSAgPHRhcmdldCBuYW1lPSJwcmVwYXJlLWRpc3QtYmluIiBkZXBlbmRzPSJjbGVhbixrdXB1LHdhciI+Ci0KLSAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmJpbi5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IklOU1RBTEwtQklOLnR4dCIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJSRUFETUUudHh0Ii8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0Ii8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iQ1JFRElUUy50eHQiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ibGVueWEuc2giLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ibGVueWEuYmF0Ii8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImxlZ2FsLyoqIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotCi0gICAgPCEtLSBDb3B5IEpldHR5IC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuYmluLmRpcn0vdG9vbHMiPgotICAgICAgPGZpbGVzZXQgZGlyPSJ0b29scyIvPgotICAgIDwvY29weT4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmJpbi5kaXJ9L3Rvb2xzL2FudHRhc2tzIi8+Ci0gICAgCi0gICAgIDwhLS0gTWFrZSBzaGVsbCBzY3JpcHRzIGV4ZWN1dGFibGUgLS0+Ci0gICAgPGNobW9kIGZpbGU9IiR7ZGlzdC5iaW4uZGlyfS8qLnNoIiBwZXJtPSJ1Z28rcngiLz4KLSAgICA8Y2htb2QgZmlsZT0iJHtkaXN0LmJpbi5kaXJ9L3Rvb2xzL2Jpbi8qLnNoIiBwZXJtPSJ1Z28rcngiLz4KLQotICAJPCEtLSBNYWtlIHN1cmUgbGluZWZlZWRzIGluIHNoZWxsIHNjcmlwdHMgYXJlIFVOSVgtc3R5bGUgLS0+Ci0gICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5iaW4uZGlyfSIgZW9sPSJsZiIgaW5jbHVkZXM9Iiouc2giLz4KLSAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtkaXN0LmJpbi5kaXJ9L3Rvb2xzL2JpbiIgZW9sPSJsZiIgaW5jbHVkZXM9Iiouc2giLz4KLQotICAJPCEtLSBNYWtlIHN1cmUgbGluZWZlZWRzIGluIGJhdGNoIGZpbGVzIGFyZSBXaW5kb3dzLXN0eWxlIC0tPgotICAgPGZpeGNybGYgc3JjZGlyPSIke2Rpc3QuYmluLmRpcn0iIGVvbD0iY3JsZiIgaW5jbHVkZXM9IiouYmF0Ii8+Ci0gICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5iaW4uZGlyfS90b29scy9iaW4iIGVvbD0iY3JsZiIgaW5jbHVkZXM9IiouYmF0Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlzdC1iaW4iIGRlcGVuZHM9InByZXBhcmUtZGlzdC1iaW4iIGRlc2NyaXB0aW9uPSJCdWlsZCBhIHJlZ3VsYXIgYmluYXJ5IGRpc3RyaWJ1dGlvbiB0YXIgYmFsbCI+Ci0KLSAgICA8dGFyIHRhcmZpbGU9IiR7ZGlzdC5iaW4uZGlyfS50YXIiIGJhc2VkaXI9IiR7ZGlzdC5yb290fSIgaW5jbHVkZXM9IiR7ZGlzdG5hbWV9LWJpbi8qKiIvPgotCi0gICAgPGd6aXAgemlwZmlsZT0iJHtkaXN0LmJpbi5kaXJ9LnRhci5neiIgc3JjPSIke2Rpc3QuYmluLmRpcn0udGFyIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke2Rpc3QuYmluLmRpcn0udGFyIi8+Ci0gICAgPGNoZWNrc3VtIGZpbGU9IiR7ZGlzdC5iaW4uZGlyfS50YXIuZ3oiIGZpbGVleHQ9Ii5tZDUiLz4KLSAgICAKLSAgICA8emlwIHppcGZpbGU9IiR7ZGlzdC5iaW4uZGlyfS56aXAiIGJhc2VkaXI9IiR7ZGlzdC5yb290fSIgaW5jbHVkZXM9IiR7ZGlzdG5hbWV9LWJpbi8qKiIvPgotICAgIDxjaGVja3N1bSBmaWxlPSIke2Rpc3QuYmluLmRpcn0uemlwIiBmaWxlZXh0PSIubWQ1Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0KLSAgVGhpcyB0YXJnZXQgcHJlcGFyZXMgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gdGFyYmFsbCBmb3IKLSAgZW5kIHVzZXJzLiBJdCBmb3JjZXMgYSBjb21wbGV0ZSByZWJ1aWxkIG9mIGV2ZXJ5dGhpbmcgdGhyb3VnaCBpdHMKLSAgZGVwZW5kZW5jeSBvbiB0aGUgImNsZWFuIiB0YXJnZXQgaW4gb3JkZXIgdG8gcHJldmVudCBnYXJiYWdlCi0gIGxpa2UgdGhlIGNvY29vbiBsb2dmaWxlcyBmcm9tIGVuZGluZyB1cCBpbiB0aGUgZGlzdHJpYnV0aW9uIHRhcmJhbGwuCi0gIC0tPgotICA8dGFyZ2V0IG5hbWU9InNuYXBzaG90LWJpbiIgZGVwZW5kcz0icHJlcGFyZS1kaXN0LWJpbiIgZGVzY3JpcHRpb249IkJ1aWxkIGEgc25hcHNob3QgYmluYXJ5IGRpc3RyaWJ1dGlvbiB0YXIgYmFsbCAodGhlIHNhbWUgYXMgJ2Rpc3QnIGV4Y2VwdCBmb3IgdGhlIGZpbGVuYW1lKSI+Ci0gICAgPGNvcHkgdG9kaXI9IiR7c25hcHNob3QuYmluLmRpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3Qucm9vdH0vJHtkaXN0bmFtZX0tYmluIi8+Ci0gICAgPC9jb3B5PgotCi0gICAgPHRhciB0YXJmaWxlPSIke3NuYXBzaG90LmJpbi5kaXJ9LnRhciIgYmFzZWRpcj0iJHtkaXN0LnJvb3R9IiBpbmNsdWRlcz0iJHtzbmFwc2hvdC5iaW4ubmFtZX0vKioiLz4KLQotICAgIDxnemlwIHppcGZpbGU9IiR7c25hcHNob3QuYmluLmRpcn0udGFyLmd6IiBzcmM9IiR7c25hcHNob3QuYmluLmRpcn0udGFyIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke3NuYXBzaG90LmJpbi5kaXJ9LnRhciIvPgotICAgIDx6aXAgemlwZmlsZT0iJHtzbmFwc2hvdC5iaW4uZGlyfS56aXAiIGJhc2VkaXI9IiR7ZGlzdC5yb290fS8ke3NuYXBzaG90LmJpbi5uYW1lfSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tCi0gIFRoZSBkaXN0LXNyYyB0YXJnZXQgcHJlcGFyZXMgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gdGFyYmFsbCBmb3IKLSAgZGV2ZWxvcGVycy4gSXQgYWxzbyBkZXBlbmRzIG9uIHRoZSBjbGVhbiB0YXJnZXQgdG8gcmVtb3ZlIGFsbCBidWlsZCBzdHVmZi4KLSAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0icHJlcGFyZS1kaXN0LXNyYyIgZGVwZW5kcz0iY2xlYW4iPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5zcmMuZGlyfSIvPgotCi0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5zcmMuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9Ii4iPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsb2NhbC5idWlsZC5wcm9wZXJ0aWVzIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9Ii5jbGFzc3BhdGgiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iLnByb2plY3QiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iLmZicHJlZnMiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iZGlzdC8qKiIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC8qKiIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJiaW4vKioiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gIAkKLSAgCTwhLS0gUmVwbGFjZSB2ZXJzaW9uIHBsYWNlaG9sZGVyIHdpdGggYnVpbGQgdmVyc2lvbiAtLT4KLSAgCTxyZXBsYWNlIGRpcj0iJHtkaXN0LnNyYy5kaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi93ZWxjb21lLnhtbCIvPgotICAJICA8aW5jbHVkZSBuYW1lPSIqKi9hYm91dC54bWwiLz4KLQkgIDxpbmNsdWRlIG5hbWU9IioqL2NvbmZpZy9wdWJsaWNhdGlvbi54bWwiLz4KLSAgCSAgPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBsZW55YS52ZXJzaW9uQCIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgCSAgPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBsZW55YS5yZXZpc2lvbkAiIHZhbHVlPSIke2xlbnlhLnJldmlzaW9ufSIvPgotICAJPC9yZXBsYWNlPgotCi0gICAgPCEtLSBNYWtlIHNoZWxsIHNjcmlwdHMgZXhlY3V0YWJsZSAtLT4KLSAgIDxjaG1vZCBmaWxlPSIke2Rpc3Quc3JjLmRpcn0vKi5zaCIgcGVybT0idWdvK3J4Ii8+Ci0gICA8Y2htb2QgZmlsZT0iJHtkaXN0LnNyYy5kaXJ9L3Rvb2xzL2Jpbi8qLnNoIiBwZXJtPSJ1Z28rcngiLz4KLSAKLSAgCTwhLS0gTWFrZSBzdXJlIGxpbmVmZWVkcyBpbiBzaGVsbCBzY3JpcHRzIGFyZSBVTklYLXN0eWxlIC0tPgotICAgPGZpeGNybGYgc3JjZGlyPSIke2Rpc3Quc3JjLmRpcn0iIGVvbD0ibGYiIGluY2x1ZGVzPSIqLnNoIi8+Ci0gICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5zcmMuZGlyfS90b29scy9iaW4iIGVvbD0ibGYiIGluY2x1ZGVzPSIqLnNoIi8+Ci0gCi0gIAk8IS0tIE1ha2Ugc3VyZSBsaW5lZmVlZHMgaW4gYmF0Y2ggZmlsZXMgYXJlIFdpbmRvd3Mtc3R5bGUgLS0+Ci0gICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5zcmMuZGlyfSIgZW9sPSJjcmxmIiBpbmNsdWRlcz0iKi5iYXQiLz4KLSAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtkaXN0LnNyYy5kaXJ9L3Rvb2xzL2JpbiIgZW9sPSJjcmxmIiBpbmNsdWRlcz0iKi5iYXQiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXN0LXNyYyIgZGVwZW5kcz0icHJlcGFyZS1kaXN0LXNyYyIgZGVzY3JpcHRpb249IkJ1aWxkcyBhIHJlZ3VsYXIgdGFyIGJhbGwgY29udGFpbmluZyB0aGUgc291cmNlcyBmb3IgZGV2ZWxvcGVycyI+Ci0gICAgPHRhciB0YXJmaWxlPSIke2Rpc3Quc3JjLmRpcn0udGFyIiBiYXNlZGlyPSIke2Rpc3Qucm9vdH0iIGluY2x1ZGVzPSIke2Rpc3RuYW1lfS1zcmMvKioiLz4KLQotICAgIDxnemlwIHppcGZpbGU9IiR7ZGlzdC5zcmMuZGlyfS50YXIuZ3oiIHNyYz0iJHtkaXN0LnNyYy5kaXJ9LnRhciIvPgotICAgIDxkZWxldGUgZmlsZT0iJHtkaXN0LnNyYy5kaXJ9LnRhciIvPgotICAgIDxjaGVja3N1bSBmaWxlPSIke2Rpc3Quc3JjLmRpcn0udGFyLmd6IiBmaWxlZXh0PSIubWQ1Ii8+Ci0KLSAgICA8emlwIHppcGZpbGU9IiR7ZGlzdC5zcmMuZGlyfS56aXAiIGJhc2VkaXI9IiR7ZGlzdC5yb290fSIgaW5jbHVkZXM9IiR7ZGlzdG5hbWV9LXNyYy8qKiIvPgotICAgIDxjaGVja3N1bSBmaWxlPSIke2Rpc3Quc3JjLmRpcn0uemlwIiBmaWxlZXh0PSIubWQ1Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0KLSAgVGhpcyB0YXJnZXQgcHJlcGFyZXMgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gdGFyYmFsbCBmb3IKLSAgZW5kIHVzZXJzLiBJdCBmb3JjZXMgYSBjb21wbGV0ZSByZWJ1aWxkIG9mIGV2ZXJ5dGhpbmcgdGhyb3VnaCBpdHMKLSAgZGVwZW5kZW5jeSBvbiB0aGUgImNsZWFuIiB0YXJnZXQgaW4gb3JkZXIgdG8gcHJldmVudCBnYXJiYWdlCi0gIGxpa2UgdGhlIGNvY29vbiBsb2dmaWxlcyBmcm9tIGVuZGluZyB1cCBpbiB0aGUgZGlzdHJpYnV0aW9uIHRhcmJhbGwuCi0gIC0tPgotICA8dGFyZ2V0IG5hbWU9InNuYXBzaG90LXNyYyIgZGVwZW5kcz0icHJlcGFyZS1kaXN0LXNyYyIgZGVzY3JpcHRpb249IkJ1aWxkcyBhIHNuYXBzaG90IHRhciBiYWxsIGNvbnRhaW5pbmcgdGhlIHNvdXJjZXMgZm9yIGRldmVsb3BlcnMgKHRoZSBzYW1lIGFzICdkaXN0LXNyYycgZXhjZXB0IGZvciB0aGUgZmlsZW5hbWUpIj4KLSAgICA8Y29weSB0b2Rpcj0iJHtzbmFwc2hvdC5zcmMuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5zcmMuZGlyfSIvPgotICAgIDwvY29weT4KLQotICAgIDx0YXIgdGFyZmlsZT0iJHtzbmFwc2hvdC5zcmMuZGlyfS50YXIiIGJhc2VkaXI9IiR7ZGlzdC5yb290fSIgaW5jbHVkZXM9IiR7c25hcHNob3Quc3JjLm5hbWV9LyoqIi8+Ci0gICAgPGd6aXAgemlwZmlsZT0iJHtzbmFwc2hvdC5zcmMuZGlyfS50YXIuZ3oiIHNyYz0iJHtzbmFwc2hvdC5zcmMuZGlyfS50YXIiLz4KLSAgICA8ZGVsZXRlIGZpbGU9IiR7c25hcHNob3Quc3JjLmRpcn0udGFyIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iemlwLXdlYmFwcCIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IlppcHMgdGhlIHdlYmFwcCBpbiBvcmRlciB0byBkZXBsb3kgd2l0aGluIGFub3RoZXIgc2VydmxldCBjb250YWluZXIiPgotICAgIDx0YXIgdGFyZmlsZT0iLi8ke2J1aWxkLmRpcn0vJHtzbmFwc2hvdC5iaW4ubmFtZX0udGFyIiBiYXNlZGlyPSIke2J1aWxkLndlYmFwcH0iLz4KLSAgICA8Z3ppcCB6aXBmaWxlPSIuLyR7YnVpbGQuZGlyfS8ke3NuYXBzaG90LmJpbi5uYW1lfS50YXIuZ3oiIHNyYz0iLi8ke2J1aWxkLmRpcn0vJHtzbmFwc2hvdC5iaW4ubmFtZX0udGFyIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIuLyR7YnVpbGQuZGlyfS8ke3NuYXBzaG90LmJpbi5uYW1lfS50YXIiLz4gICAgCi0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3RhcmdldHMvZG9jcy1idWlsZC54bWwgYi90cnVuay9zcmMvdGFyZ2V0cy9kb2NzLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2Y2I3Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvdGFyZ2V0cy9kb2NzLWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9ImxlbnlhLWRvY3VtZW50YXRpb24iPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICBEb2N1bWVudGF0aW9uIFRhcmdldHMKLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8IS0tIFNldCBhIHZhcmlhYmxlIGlmIGphdmFkb2MgaXMgYWxyZWFkeSB1cC10by1kYXRlIC0tPgotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2NzX2NoZWNrIj4KLSAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphdmFkb2NzLm5vdHJlcXVpcmVkIiB0YXJnZXRmaWxlPSIke2Rpc3QuYmluLmphdmFkb2NzfS9wYWNrYWdlcy5odG1sIiA+Ci0gICAgICA8c3JjZmlsZXMgZGlyPSIke3NyYy5qYXZhLmFwaS5kaXJ9IiBpbmNsdWRlcz0iKiovKi5qYXZhIi8+Ci0gICAgPC91cHRvZGF0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBJZiBqYXZhZG9jIGlzIGFscmVhZHkgdXAtdG8tZGF0ZSwgcHJpbnQgYSBtZXNzYWdlIHNheWluZyBzbyAtLT4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jc19kb25lIiBpZj0iamF2YWRvY3Mubm90cmVxdWlyZWQiPgotICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIgIE5vdCByZWJ1aWxkaW5nIEphdmFkb2NzLCBhcyB0aGV5IGFyZSB1cC10by1kYXRlOiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiAgJHtkaXN0LmJpbi5qYXZhZG9jc30vcGFja2FnZXMuaHRtbCBpcyBtb3JlIHJlY2VudCB0aGFuIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iICAke3NyYy5qYXZhLmRpcn0vKiovKi5qYXZhIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIvPgotICA8L3RhcmdldD4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iamF2YWRvY3MtYXBpIj4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuYmluLmphdmFkb2NzfSIvPgotICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iJHtwYWNrYWdlc30iCi0gICAgICBkZXN0ZGlyPSIke2Rpc3QuYmluLmphdmFkb2NzfSIKLSAgICAgIGF1dGhvcj0idHJ1ZSIKLSAgICAgIHZlcnNpb249InRydWUiCi0gICAgICB1c2U9ImZhbHNlIgotICAgICAgbm9pbmRleD0idHJ1ZSIKLSAgICAgIGJyZWFraXRlcmF0b3I9InRydWUiCi0gICAgICB3aW5kb3d0aXRsZT0iJHtOYW1lfSBBUEkgLSBWZXJzaW9uICR7dmVyc2lvbn0iCi0gICAgICBkb2N0aXRsZT0iJHtOYW1lfSIKLSAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICYjMTY5OyAke3llYXJ9IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIKLSAgICAgIHN0eWxlc2hlZXRmaWxlPSIke3NyYy5yZXNvdXJjZS5kaXJ9L2phdmFkb2MuY3NzIgotICAgICAgc291cmNlPSIke3NyYy5qYXZhLnZlcnNpb259Ij4KLSAgICAgIDwhLS0gc291cmNlcyAtLT4KLSAgICAgIDxzb3VyY2VwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtzcmMuamF2YS5hcGkuZGlyfSIvPgotICAgICAgICA8IS0tCi0gICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGQuamF2YS5zcmN9Ii8+Ci0gICAgICAgIC0tPgotICAgICAgPC9zb3VyY2VwYXRoPgotICAgICAgCi0gICAgICA8IS0tIHBhc3MgYW50IGluIHRoZSBjbGFzc3BhdGggdG8gYXZvaWQgY2xhc3Mgbm90IGZvdW5kIGVycm9ycyAtLT4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y29jb29uLndlYmFwcC5kaXJ9L1dFQi1JTkYvbGliIj4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0idG9vbHMvamV0dHkvbGliIj4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2bGV0LSouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSJ0b29scy9saWIiPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBDcmVhdGVzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiAtLT4KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jcyIKLSAgICBkZXBlbmRzPSJwcmVwYXJlLXNyYywgamF2YWRvY3NfY2hlY2ssIGphdmFkb2NzX2RvbmUsIGphdmFkb2NzLWFwaSwgamF2YWRvY3MtbW9kdWxlcyIKLSAgICB1bmxlc3M9ImphdmFkb2NzLm5vdHJlcXVpcmVkIgotICAgIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZXMgdGhlIEFQSSBkb2N1bWVudGF0aW9uIi8+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3RhcmdldHMvZXhwb3J0LWJ1aWxkLnhtbCBiL3RydW5rL3NyYy90YXJnZXRzL2V4cG9ydC1idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzNiY2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3RhcmdldHMvZXhwb3J0LWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9ImxlbnlhLWV4cG9ydCI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgIEV4cG9ydCBUYXJnZXRzCi0gIDwvZGVzY3JpcHRpb24+Ci0KLTwhLS0gRXhwb3J0IHRoZSB3ZWJhcHAgLS0+Ci08dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0id2ViYXBwIiBkZXNjcmlwdGlvbj0iRXhwb3J0cyBhIHB1YmxpY2F0aW9uIHRvIHN0YXRpYyBIVE1MLiBBcyBhIHBhcmFtZXRlciBvbmUgc2hvdWxkIHNwZWNpZnkgYSBwdWJsaWNhdGlvbiwgZS5nLiAtRHB1YmxpY2F0aW9uPWRlZmF1bHQiPgotICA8cHJvcGVydHkgbmFtZT0icHVibGljYXRpb24iIHZhbHVlPSIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InB1YmxpY2F0aW9uLmRpciIgdmFsdWU9IiR7YnVpbGQud2ViYXBwfS9sZW55YS9wdWJzLyR7cHVibGljYXRpb259Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5leHBvcnQiIHZhbHVlPSIke2J1aWxkLmRpcn0vZXhwb3J0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC53b3JrIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3dvcmsiLz4KLSAgICAKLSAgPHByb3BlcnR5IG5hbWU9InByb2plY3QuZGVidWdsZXZlbCIgdmFsdWU9IkRFQlVHIi8+Ci0gICAgICAKLSAgPCEtLSBDb3B5aW5nIHNvdXJjZSBmaWxlcyBmcm9tIGF1dGhvcmluZyB0byBsaXZlIC0tPgotICA8Y29weSB0b2Rpcj0iJHtwdWJsaWNhdGlvbi5kaXJ9L2NvbnRlbnQvbGl2ZSI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke3B1YmxpY2F0aW9uLmRpcn0vY29udGVudC9hdXRob3JpbmciLz4KLSAgPC9jb3B5PgotCi0gIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb2Nvb24uTWFpbiIKLSAgICBmb3JrPSJ0cnVlIgotICAgIG1heG1lbW9yeT0iMTI4bSIKLSAgICBkaXI9Ii4iCi0gICAgZmFpbG9uZXJyb3I9InRydWUiPgotICAgIAotICA8Y2xhc3NwYXRoPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvY2xhc3NlcyIvPgotICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliIiBpbmNsdWRlcz0iKi5qYXIiLz4KLSAgICA8ZmlsZXNldCBkaXI9InRvb2xzL2pldHR5L2xpYiI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2bGV0LSouamFyIi8+Ci0gICAgPC9maWxlc2V0PgotICA8L2NsYXNzcGF0aD4KLSAgCi0gICAgPGp2bWFyZyB2YWx1ZT0iLURqYXZhLmVuZG9yc2VkLmRpcnM9JHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliL2VuZG9yc2VkJHtwYXRoLnNlcGFyYXRvcn0ke2phdmEuZW5kb3JzZWQuZGlyc30iLz4KLSAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAKLSAgICA8YXJnIHZhbHVlPSItYyR7YnVpbGQud2ViYXBwfSIvPiAgIDwhLS0gaW5wdXQgdG8gdGhlIHByb2Nlc3MgLS0+Ci0gICAgPGFyZyB2YWx1ZT0iLWQke2J1aWxkLmV4cG9ydH0iLz4gICA8IS0tIG91dHB1dCB0byBiZSBwdXQgLS0+Ci0gICAgPGFyZyB2YWx1ZT0iLXcke2J1aWxkLndvcmt9Ii8+ICAgPCEtLSB0ZW1wIGRpciB0byB1c2UgZm9yIGUuZy4gY2FjaGUgLS0+Ci0gICAgPGFyZyB2YWx1ZT0iLXUke3Byb2plY3QuZGVidWdsZXZlbH0iLz4gPCEtLSB0aHJlc2hvbGQgZm9yIGxvZyBtZXNzYWdlcyAtLT4KLSAgICA8YXJnIHZhbHVlPSItQyR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2NvY29vbi54Y29uZiIvPiA8IS0tIGNvY29vbi54Y29uZiBmaWxlIHRvIHVzZSAtLT4KLSAgICA8YXJnIHZhbHVlPSItYiR7YnVpbGQuZXhwb3J0fS9icm9rZW5saW5rcy50eHQiLz4gIDwhLS0gb3V0cHV0IGxpc3Qgb2YgYnJva2VuIGxpbmtzIC0tPgotICAgIDxhcmcgdmFsdWU9Ii1rJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbG9na2l0Lnhjb25mIi8+ICA8IS0tIGxvZ2tpdCBjb25maWd1cmF0aW9uIC0tPgotICAgIDxhcmcgdmFsdWU9Ii8ke3B1YmxpY2F0aW9ufS9saXZlL2luZGV4Lmh0bWwiLz4gIDwhLS0gc3RhcnRpbmcgcGFnZSAtLT4KLSAgICA8YXJnIHZhbHVlPSItZWZhbHNlIi8+IDwhLS0gZG9uJ3QgY29uZmlybSBleHRlbnNpb25zIC0tPgotICAgIDxhcmcgdmFsdWU9Ii1WIiAvPiAgPCEtLSBiZSB2ZXJib3NlIC0tPgotICA8L2phdmE+Ci0gIAotPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGFyZ2V0cy9pZGUtYnVpbGQueG1sIGIvdHJ1bmsvc3JjL3RhcmdldHMvaWRlLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1ZDgwMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvdGFyZ2V0cy9pZGUtYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0ibGVueWEtaWRlIj4KLSAgCi0gIDxkZXNjcmlwdGlvbj4KLSAgICBJREUgdGFyZ2V0cwotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDwhLS0gQnVpbGQgdGhlIEVjbGlwc2UgcHJvamVjdHMgZmlsZXMgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iZWNsaXBzZS1wcm9qZWN0IiBkZXBlbmRzPSJwcmVwYXJlIiBkZXNjcmlwdGlvbj0iR2VuZXJhdGUgdGhlIEVjbGlwc2UgcHJvamVjdCBmaWxlcyI+Ci0KLSAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZGluZyBFY2xpcHNlIFByb2plY3QgRmlsZXMiLz4KLQotICAgIDx4bWxwcm9wZXJ0eSBmaWxlPSIke2NvY29vbi5zcmMuZGlyfS8ucHJvamVjdCIvPgotICAgIAotICAgIDxmYWlsIHVubGVzcz0icHJvamVjdERlc2NyaXB0aW9uLm5hbWUiPgotICAgICAgUGxlYXNlIGNhbGwgIi4vYnVpbGQuc2ggZWNsaXBzZS1wcm9qZWN0IiBpbiB0aGUgQ29jb29uIHNvdXJjZSBkaXJlY3RvcnkgZmlyc3QuCi0gICAgPC9mYWlsPgotICAgIAotICAgIDwhLS0gcHJlcGFyZSB0aGUgdmFyaW91cyBwYXRocyB0aGF0IHdpbGwgZm9ybSB0aGUgcHJvamVjdCAtLT4KLSAgICA8cGF0aCBpZD0ic3JjcyI+Ci0KLSAgICAgIDwhLS0gQW50IHRhc2tzIC0tPgotICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRvb2xzL2FudHRhc2tzL3NyYyIvPgotICAgICAgCi0gICAgICA8IS0tIEFQSSBzb3VyY2UgZGlycyAtLT4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3NyYy5qYXZhLmFwaS5kaXJ9Ii8+Ci0gICAgICAKLSAgICAgIDwhLS0gaW1wbGVtZW50YXRpb24gc291cmNlIGRpcnMgLS0+Ci0gICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtzcmMuamF2YS5pbXBsLmRpcn0iLz4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3NyYy50ZXN0LmltcGwuZGlyfSIvPgotICAgICAgCi0gICAgICA8ZGlyc2V0IGRpcj0ic3JjL3B1YnMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqL2phdmEvc3JjIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IiovamF2YS90ZXN0Ii8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IiovbW9kdWxlcy8qL2phdmEvc3JjIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IiovbW9kdWxlcy8qL2phdmEvdGVzdCIvPgotICAgICAgPC9kaXJzZXQ+Ci0gICAgICA8ZGlyc2V0IGRpcj0ic3JjL21vZHVsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqL2phdmEvc3JjIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IiovamF2YS90ZXN0Ii8+Ci0gICAgICA8L2RpcnNldD4KLSAgICAgIDxkaXJzZXQgZGlyPSJzcmMvbW9kdWxlcy1jb3JlIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi9qYXZhL3NyYyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqL2phdmEvdGVzdCIvPgotICAgICAgPC9kaXJzZXQ+Ci0gICAgICA8ZGlyc2V0IGRpcj0ic3JjL21vZHVsZXMtb3B0aW9uYWwiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqL2phdmEvc3JjIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IiovamF2YS90ZXN0Ii8+Ci0gICAgICA8L2RpcnNldD4KLSAgICA8L3BhdGg+Ci0KLSAgICA8cGF0aCBpZD0ibGlicyI+Ci0gICAgICA8IS0tIENvY29vbiBsaWJzIC0tPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2NvY29vbi5zcmMuZGlyfS8ke2xpYi5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29yZS8qLmphciIvPgotICAgICAgICA8IS0tIEN1cnJlbnRseSwgd2UgaGF2ZSBubyBKVk0gZGVwZW5kZW50IGxpYnJhcmllcyAgICAgICAKLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb3JlL2p2bSR7dGFyZ2V0LnZtfS8qLmphciIvPgotICAgICAgICAtLT4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3B0aW9uYWwvKi5qYXIiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ibG9jYWwvKi5qYXIiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iZW5kb3JzZWQvKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwhLS0gQ29jb29uIGJsb2NrcyBsaWIgLS0+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7Y29jb29uLnNyYy5kaXJ9L3NyYy9ibG9ja3MiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPCEtLSBDb2Nvb24gdG9vbHMgbGlicyAtLT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb2Nvb24uc3JjLmRpcn0vdG9vbHMvbGliIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ieGFsYW4qLmphciIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJ4bWwtYXBpKi5qYXIiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ieGVyY2VzKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4gICAgICAKLSAgICAgIDwhLS0gbWFpbiBsaWJzIC0tPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iZW5kb3JzZWQvKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0KLSAgICA8IS0tIGNvbnZlcnQgcGF0aHMgdG8gcHJvcGVydGllcyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjcyIgcmVmaWQ9InNyY3MiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGlicyIgcmVmaWQ9ImxpYnMiLz4KLQotICAgIDwhLS0gZXhwYW5kIHByb3BlcnRpZXMgaW4gdGhlIHRlbXBsYXRlIGZpbGUgLS0+Ci0gICAgPGNvcHkgZmlsZT0iJHtzcmMucmVzb3VyY2UuZGlyfS9kZXYvZWNsaXBzZS9jbGFzc3BhdGgtdG1wbC54bWwiCi0gICAgICAgICAgdG9maWxlPSIke2J1aWxkLnRlbXB9L2NsYXNzcGF0aC10ZW1wLnhtbCIKLSAgICAgICAgICBmaWx0ZXJpbmc9InllcyIKLSAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICA8ZmlsdGVyc2V0PgotICAgICAgICA8ZmlsdGVyIHRva2VuPSJTUkNfRElSUyIgdmFsdWU9IiR7c3Jjc30iLz4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iTElCUyIgdmFsdWU9IiR7bGlic30iLz4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iT1VUUFVUX0RJUiIgdmFsdWU9IiR7aWRlLmVjbGlwc2Uub3V0cHV0ZGlyfSIvPgotICAgICAgPC9maWx0ZXJzZXQ+Ci0gICAgPC9jb3B5PgotCi0gICAgPCEtLSBzcGxpdCB0aGUgcGF0aCBpbiAnaXRlbScgWE1MIGVsZW1lbnRzIC0tPgotICAgIDxyZXBsYWNlIGZpbGU9IiR7YnVpbGQudGVtcH0vY2xhc3NwYXRoLXRlbXAueG1sIgotICAgICAgICAgICAgIHRva2VuPSIke3BhdGguc2VwYXJhdG9yfSIgdmFsdWU9IiZsdDsvaXRlbSZndDsmI3hBOyAmbHQ7aXRlbSZndDsiLz4KLSAgICA8IS0tIHJlbGF0aXZpemUgZmlsZSBuYW1lcyBieSByZW1vdmluZyB0aGUgY3VycmVudCBkaXJlY3RvcnkgLS0+Ci0gICAgPHJlcGxhY2UgZmlsZT0iJHtidWlsZC50ZW1wfS9jbGFzc3BhdGgtdGVtcC54bWwiCi0gICAgICAgICAgICAgdG9rZW49IiR7dXNlcn0ke2ZpbGUuc2VwYXJhdG9yfSIgdmFsdWU9IiIvPgotICAgIDwhLS0gYW5kIGluIGNhc2UgdGhhdCBmYWlscywgcmVtb3ZlIHRoZSBiYXNlIGRpcmVjdG9yeSAtLT4KLSAgICA8cmVwbGFjZSBmaWxlPSIke2J1aWxkLnRlbXB9L2NsYXNzcGF0aC10ZW1wLnhtbCIKLSAgICAgICAgICAgICB0b2tlbj0iJHtiYXNlZGlyfSR7ZmlsZS5zZXBhcmF0b3J9IiB2YWx1ZT0iIi8+Ci0KLSAgICA8IS0tIHJlcGxhY2UgcGxhdGZvcm0tZGVwZW5kZW50IHBhdGggc2VwYXJhdG9yIGJ5ICcvJyAtLT4KLSAgICA8cmVwbGFjZSBmaWxlPSIke2J1aWxkLnRlbXB9L2NsYXNzcGF0aC10ZW1wLnhtbCIKLSAgICAgICAgICAgICB0b2tlbj0iJHtmaWxlLnNlcGFyYXRvcn0iIHZhbHVlPSIvIi8+Ci0KLSAgICA8IS0tIG5vdyBidWlsZCB0aGUgLmNsYXNzcGF0aCBmaWxlIC0tPgotICAgIDx4c2x0IGluPSIke2J1aWxkLnRlbXB9L2NsYXNzcGF0aC10ZW1wLnhtbCIgb3V0PSIke2Jhc2VkaXJ9Ly5jbGFzc3BhdGgiCi0gICAgICAgICAgcHJvY2Vzc29yPSJ0cmF4IgotICAgICAgICAgIHN0eWxlPSIke3NyYy5yZXNvdXJjZS5kaXJ9L2Rldi9lY2xpcHNlL21ha2UtY2xhc3NwYXRoLnhzbCI+Ci0gICAgICAgPHBhcmFtIG5hbWU9ImV4cG9ydGxpYiIgZXhwcmVzc2lvbj0iJHtpZGUuZWNsaXBzZS5leHBvcnQubGlic30iLz4KLSAgICAgICA8cGFyYW0gbmFtZT0iY29jb29uUHJvamVjdE5hbWUiIGV4cHJlc3Npb249IiR7cHJvamVjdERlc2NyaXB0aW9uLm5hbWV9Ii8+Ci0gICAgPC94c2x0PgotCi0gICAgPCEtLSBjb3B5IHRoZSBwcm9qZWN0IGZpbGUgKGV4cGFuZCB2ZXJzaW9uKSAtLT4KLSAgICA8Y29weSBmaWxlPSIke3NyYy5yZXNvdXJjZS5kaXJ9L2Rldi9lY2xpcHNlL3Byb2plY3QiCi0gICAgICAgICAgdG9maWxlPSIke2Jhc2VkaXJ9Ly5wcm9qZWN0IgotICAgICAgICAgIGZpbHRlcmluZz0ieWVzIgotICAgICAgICAgIG92ZXJ3cml0ZT0ieWVzIj4KLSAgICAgIDxmaWx0ZXJzZXQ+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IkNPQ09PTl9QUk9KRUNUIiB2YWx1ZT0iJHtwcm9qZWN0RGVzY3JpcHRpb24ubmFtZX0iLz4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgIDwvZmlsdGVyc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBQcmVwYXJlcyB0aGUgd2ViYXBwIHRvIG1ha2UgaXQgZGlyZWN0bHkgdXNhYmxlIHdpdGggdGhlIGVjbGlwc2UgcHJvamVjdCAtLT4KLSAgPHRhcmdldCBuYW1lPSJlY2xpcHNlLXdlYmFwcC1wcmVwYXJlIiBkZXBlbmRzPSJlY2xpcHNlLXdlYmFwcC1kZWxldGUtamFycyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iUHJlcGFyZXMgdGhlIHdlYmFwcCBkaXJlY3RvcnkgdG8gbWFrZSBpdCB1c2FibGUgd2l0aGluIEVjbGlwc2UiLz4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iZWNsaXBzZS13ZWJhcHAtZGVsZXRlLWphcnMiIGRlcGVuZHM9InByZXBhcmUiPgotICAgICAgPCEtLSBkZWxldGUgYWxsIGphcnMgYW5kIGNsYXNzIGZpbGVzLCB0aGV5IGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSBwcm9qZWN0IC0tPgotICAgICAgPGRlbGV0ZT4KLSAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYi8qLmphciIgLz4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNsYXNzZXMvKiovKi5jbGFzcyIgLz4KLSAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGFyZ2V0cy9pbml0LWJ1aWxkLnhtbCBiL3RydW5rL3NyYy90YXJnZXRzL2luaXQtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNkNDE5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy90YXJnZXRzL2luaXQtYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9ImxlbnlhLWluaXQiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICBJbml0aWFsaXphdGlvbiBUYXJnZXRzCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPCEtLSBJbml0aWFsaXphdGlvbiB0YXJnZXQgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iaW5pdC10YXNrcyI+Ci0gICAgPHRzdGFtcD4KLSAgICAgIDxmb3JtYXQgcHJvcGVydHk9IlNOQVBTSE9UX1NUQU1QIiBwYXR0ZXJuPSJ5eXl5TU1kZGhobW1zcyIvPgotICAgIDwvdHN0YW1wPgotICAgIAotICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tLS0tLS0tLS0tLS0tLS0gJHtOYW1lfSAke3ZlcnNpb259IFske3llYXJ9XSAtLS0tLS0tLS0tLS0tLS0tIi8+Ci0gICAgPGVjaG8+QnVpbGRpbmcgd2l0aCAke2FudC52ZXJzaW9ufSBhbmQgSmF2YSB2ZXJzaW9uICR7YW50LmphdmEudmVyc2lvbn08L2VjaG8+Ci0gICAgPGVjaG8+VXNpbmcgYnVpbGQgZmlsZSAke2FudC5maWxlfTwvZWNobz4KLQotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImphdmEudmVyc2lvbi5lcXVhbC50YXJnZXQudm0iPgotICAgICAgPGVxdWFscyBhcmcxPSIke3RhcmdldC52bX0iIGFyZzI9IiR7YW50LmphdmEudmVyc2lvbn0iLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9Indhcm5pbmctcmUtamF2YS12ZXJzaW9uIi8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0ic25hcHNob3QuYmluLm5hbWUiIHZhbHVlPSIke2Z1bGxuYW1lfS0ke1NOQVBTSE9UX1NUQU1QfS1iaW4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic25hcHNob3Quc3JjLm5hbWUiIHZhbHVlPSIke2Z1bGxuYW1lfS0ke1NOQVBTSE9UX1NUQU1QfS1zcmMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic25hcHNob3QuYmluLmRpciIgdmFsdWU9IiR7ZGlzdC5yb290fS8ke3NuYXBzaG90LmJpbi5uYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzbmFwc2hvdC5zcmMuZGlyIiB2YWx1ZT0iJHtkaXN0LnJvb3R9LyR7c25hcHNob3Quc3JjLm5hbWV9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0id2FybmluZy1yZS1qYXZhLXZlcnNpb24iIHVubGVzcz0iamF2YS52ZXJzaW9uLmVxdWFsLnRhcmdldC52bSI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiBXQVJOSU5HOiBBcGFjaGUgTGVueWEgJHt2ZXJzaW9ufSBpcyB0YXJnZXRlZCBmb3IgSmF2YSB2ZXJzaW9uICR7dGFyZ2V0LnZtfS4gUGxlYXNlIHJlZmVyIHRvIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0IGZvciBvdGhlciBKYXZhIHZlcnNpb24uIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIi8+Ci08IS0tCi0gICAgPGZhaWwgbWVzc2FnZT0iQnVpbGQgcHJvY2VzcyB3aWxsIGJlIGFib3J0ZWQhIi8+Ci0tLT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBQcmVwYXJlIHRoZSBidWlsZCB3ZWJhcHAgZGlyZWN0b3J5IC0tPgotICA8dGFyZ2V0IG5hbWU9ImNoZWNrLWNvY29vbiIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJndW1wLnNraXBjb2Nvb25idWlsZCI+Ci0gICAgPGF2YWlsYWJsZSBmaWxlPSIke2NvY29vbi5zcmMuZGlyfS9idWlsZC93ZWJhcHAiIHR5cGU9ImRpciIgcHJvcGVydHk9ImNvY29vbi5idWlsZC53ZWJhcHAuZGlyLmV4aXN0cyIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0iY2hlY2stYmxvY2tzLXByb3BlcnRpZXMiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImNoZWNrLWJ1aWxkLXByb3BlcnRpZXMiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLWNvY29vbiIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIEJ1aWxkIENvY29vbiB3aXRoIG91ciBwcm9wZXJ0aWVzIC0tPgotICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNvY29vbiIgdW5sZXNzPSJjb2Nvb24uYnVpbGQud2ViYXBwLmRpci5leGlzdHMiPgotICAgIDxjb3B5IHRvZGlyPSIke2NvY29vbi5zcmMuZGlyfSIgZmlsdGVyaW5nPSJvZmYiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5jb2Nvb24ucHJvcGVydGllcy5kaXJ9Ii8+Ci0gICAgPC9jb3B5PgotCi0gICAgPGFudCBkaXI9IiR7Y29jb29uLnNyYy5kaXJ9IiBpbmhlcml0YWxsPSJmYWxzZSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIENoZWNrIGxvY2FsLmJsb2Nrcy5wcm9wZXJ0aWVzICAtLT4KLSAgPHRhcmdldCBuYW1lPSJjaGVjay1ibG9ja3MtcHJvcGVydGllcyIgaWY9ImNvY29vbi5idWlsZC53ZWJhcHAuZGlyLmV4aXN0cyI+Ci0gICAgPHByb3BlcnR5IGZpbGU9IiR7Y29jb29uLnNyYy5kaXJ9L2xvY2FsLmJsb2Nrcy5wcm9wZXJ0aWVzIi8+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibG9jYWwuYmxvY2tzLnByb3BlcnRpZXMuaW4uc3luYyI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7bGVueWEuYmxvY2tzLnByb3BlcnRpZXMudmVyc2lvbn0iIGFyZzI9IjQyNjYwMyIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxmYWlsIHVubGVzcz0ibG9jYWwuYmxvY2tzLnByb3BlcnRpZXMuaW4uc3luYyIgbWVzc2FnZT0iSXQgc2VlbXMgdGhhdCB5b3VyICR7Y29jb29uLnNyYy5kaXJ9L2xvY2FsLmJsb2Nrcy5wcm9wZXJ0aWVzIGlzIE5PVCBpbiBzeW5jIHdpdGggJHtzcmMuY29jb29uLnByb3BlcnRpZXMuZGlyfS9sb2NhbC5ibG9ja3MucHJvcGVydGllcyEgVGhlIGZpbGUgJHtzcmMuY29jb29uLnByb3BlcnRpZXMuZGlyfS9sb2NhbC5ibG9ja3MucHJvcGVydGllcyBoYXMgcHJvYmFibHkgYmVlbiBtb2RpZmllZCBieSBzb21lIEFwYWNoZSBMZW55YSBkZXZlbG9wZXIuIElzc3VlIGEgJ2J1aWxkIGNsZWFuLWFsbCcgYW5kIHJlYnVpbGQgTGVueWEuIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gQ2hlY2sgbG9jYWwuYnVpbGQucHJvcGVydGllcyAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2hlY2stYnVpbGQtcHJvcGVydGllcyIgaWY9ImNvY29vbi5idWlsZC53ZWJhcHAuZGlyLmV4aXN0cyI+Ci0gICAgPHByb3BlcnR5IGZpbGU9IiR7Y29jb29uLnNyYy5kaXJ9L2xvY2FsLmJ1aWxkLnByb3BlcnRpZXMiLz4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJsb2NhbC5idWlsZC5wcm9wZXJ0aWVzLmluLnN5bmMiPgotICAgICAgPGVxdWFscyBhcmcxPSIke2xlbnlhLmJ1aWxkLnByb3BlcnRpZXMudmVyc2lvbn0iIGFyZzI9IjUyOTE2MSIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxmYWlsIHVubGVzcz0ibG9jYWwuYnVpbGQucHJvcGVydGllcy5pbi5zeW5jIiBtZXNzYWdlPSJJdCBzZWVtcyB0aGF0IHlvdXIgJHtjb2Nvb24uc3JjLmRpcn0vbG9jYWwuYnVpbGQucHJvcGVydGllcyBpcyBOT1QgaW4gc3luYyB3aXRoICR7c3JjLmNvY29vbi5wcm9wZXJ0aWVzLmRpcn0vbG9jYWwuYnVpbGQucHJvcGVydGllcyEgVGhlIGZpbGUgJHtzcmMuY29jb29uLnByb3BlcnRpZXMuZGlyfS9sb2NhbC5idWlsZC5wcm9wZXJ0aWVzIGhhcyBwcm9iYWJseSBiZWVuIG1vZGlmaWVkIGJ5IHNvbWUgQXBhY2hlIExlbnlhIGRldmVsb3Blci4gSXNzdWUgYSAnYnVpbGQgY2xlYW4tYWxsJyBhbmQgcmVidWlsZCBMZW55YS4iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBDb3B5IHRoZSBidWxrIG9mIHRoZSBjb2Nvb24gd2ViYXBwIHRvIG91ciBkZXN0aW5hdGlvbiAtLT4KLSAgPHRhcmdldCBuYW1lPSJwcmVwYXJlLWNvY29vbiIgZGVwZW5kcz0iY2hlY2stY29jb29uIiB1bmxlc3M9Imd1bXAuc2tpcGNvY29vbmJ1aWxkIj4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC53ZWJhcHB9IiBmaWx0ZXJpbmc9Im9mZiI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7Y29jb29uLndlYmFwcC5kaXJ9Ij4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0icmVzb3VyY2VzLyoqIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9InN0eWxlc2hlZXRzKioiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKi54bWwiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKi54c2x0Ii8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9InRlc3Qtc3VpdGUvKioiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGVnYWwvKioiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iV0VCLUlORi9kYi8qKiIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJXRUItSU5GL3hjb25mLyoqIi8+Ci0gICAgICAgIDwhLS0gZXhjbHVkZSB0aGUgZ2Vyb25pbW8gbGlicmFyaWVzLCBzZWUgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zODU4NyAtLT4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iV0VCLUlORi9saWIvZ2Vyb25pbW8tKi5qYXIiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovamF2YWMuamFyIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotCi0gICAgPCEtLSBwYXRjaCBsb2draXQueGNvbmYgLS0+Ci0gICAgPHhwYXRjaCBmaWxlPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9sb2draXQueGNvbmYiCi0gICAgICAgIGluY2x1ZGVzPSJzcmMvY29uZnBhdGNoL2xvZ2tpdC0qLnhjb25mIi8+IAotICAgIAotICAgIDwhLS0gcGF0Y2ggbG9nNGoueGNvbmYgLS0+Ci0gICAgPHhwYXRjaCBmaWxlPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9sb2c0ai54Y29uZiIKLSAgICAgICAgaW5jbHVkZXM9InNyYy9jb25mcGF0Y2gvbG9nNGotKi54Y29uZiIvPiAKLSAgICAKLSAgICA8IS0tIHBhdGNoIHdlYi54bWwgLS0+Ci0gICAgPGVjaG8+UEFUQ0ggd2ViLnhtbDwvZWNobz4KLSAgICA8eHBhdGNoIGZpbGU9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL3dlYi54bWwiIAotICAgICAgICAgICAgaW5jbHVkZXM9InNyYy9jb25mcGF0Y2gvKi54d2ViIi8+IAotCi0gICAgPCEtLSBDb3B5IEVudGl0aWVzIAotICAgIDxjb3B5SmF2YVNvdXJjZXMgcHVic3Jvb3RkaXJzPSIke3B1YnMucm9vdC5kaXJzfSIgamF2YWRpcj0iJHtzcmMuZW50aXRpZXMuZGlyfSIgYnVpbGRkaXI9IiR7YnVpbGQud2ViYXBwfS8ke2J1aWxkLmVudGl0aWVzLmRpcn0iIC8+ICAgIAotICAgIC0tPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InByZXBhcmUiIGRlcGVuZHM9InByZXBhcmUtY29jb29uIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLndlYmFwcH0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBDb3B5IHB1YmxpY2F0aW9uIHNvdXJjZSBjb2RlIGFuZCBsaWJyYXJpZXMgdG8gJHtidWlsZC5qYXZhLnNyY30gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icHJlcGFyZS1zcmMiIGRlcGVuZHM9InByZXBhcmUiPgotICAgIAotICAgIDwhLS0gRklYTUU6IFVzZSBidWxrQ29weSB0YXNrIGluIHRoZSBmdXR1cmU7IG5lZWRzIHJlZ2V4cCBtYXBwZXIgd2hpY2ggaXMgcGFydCBvZiBhbnQgb3B0aW9uYWwgcGFja2FnZS4gLS0+Ci0gICAgPCEtLSBDb3B5IGphdmEgc291cmNlIGZpbGVzIGZyb20gJHtwdWJzLnJvb3QuZGlyc30gdG8gJHtidWlsZC5qYXZhLnNyY30gLS0+Ci0gICAgPGNvcHlKYXZhU291cmNlcyBwdWJzcm9vdGRpcnM9IiR7cHVicy5yb290LmRpcnN9IiBqYXZhZGlyPSJqYXZhL3NyYyIgYnVpbGRkaXI9IiR7YnVpbGQuZGlyfS9qYXZhL3B1YnMiIC8+Ci0gICAgCi0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9L2xpYiIvPgotICAgIAotICAgIDwhLS0gQ29weSBwdWJsaWNhdGlvbiBzcGVjaWZpYyBsaWJyYXJpZXMgZnJvbSAke3B1YnMucm9vdC5kaXJzfSAoamF2YS9saWIpIHRvICR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2xpYiAtLT4KLSAgICA8YnVsa0NvcHkgCi0gICAgICBzb3VyY2VkaXJzPSIke3B1YnMucm9vdC5kaXJzfSIgCi0gICAgICB0b2Rpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliIiAKLSAgICAgIGZsYXR0ZW49InRydWUiPgotICAgICAgPGZpbGVzZXQgaW5jbHVkZXM9IiovamF2YS9saWIvKiIvPiA8IS0tIGlmIGEgZGlyZWN0b3J5IHdpdGggbW9yZSB0aGFuIG9uZSBwdWJsaWNhdGlvbiBpcyBiZWluZyBzcGVjaWZpZWQsIGUuZy4gcHVicyAtLT4KLSAgICAgIDxmaWxlc2V0IGluY2x1ZGVzPSJqYXZhL2xpYi8qIi8+ICAgPCEtLSBpZiBvbmx5IGEgc3BlY2lmaWMgcHVibGljYXRpb24gaXMgYmVpbmcgc3BlY2lmaWVkLCBlLmcuIHB1YnMvYmxvZyAtLT4KLSAgICA8L2J1bGtDb3B5PgotICAgIDxidWxrQ29weSAKLSAgICAgIHNvdXJjZWRpcnM9IiR7cHVicy5yb290LmRpcnN9IiAKLSAgICAgIHRvZGlyPSIke2J1aWxkLmRpcn0vbGliIiAKLSAgICAgIGZsYXR0ZW49InRydWUiPgotICAgICAgPGZpbGVzZXQgaW5jbHVkZXM9IiovamF2YS9saWIvKiIvPiA8IS0tIGlmIGEgZGlyZWN0b3J5IHdpdGggbW9yZSB0aGFuIG9uZSBwdWJsaWNhdGlvbiBpcyBiZWluZyBzcGVjaWZpZWQsIGUuZy4gcHVicyAtLT4KLSAgICAgIDxmaWxlc2V0IGluY2x1ZGVzPSJqYXZhL2xpYi8qIi8+ICAgPCEtLSBpZiBvbmx5IGEgc3BlY2lmaWMgcHVibGljYXRpb24gaXMgYmVpbmcgc3BlY2lmaWVkLCBlLmcuIHB1YnMvYmxvZyAtLT4KLSAgICA8L2J1bGtDb3B5PgotICAgIDxidWxrQ29weSAKLSAgICAgIHNvdXJjZWRpcnM9IiR7bW9kdWxlcy5yb290LmRpcnN9IiAKLSAgICAgIHRvZGlyPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9saWIiIAotICAgICAgZmxhdHRlbj0idHJ1ZSI+Ci0gICAgICA8ZmlsZXNldCBpbmNsdWRlcz0iKi9qYXZhL2xpYi8qIi8+IDwhLS0gaWYgYSBkaXJlY3Rvcnkgd2l0aCBtb3JlIHRoYW4gb25lIHB1YmxpY2F0aW9uIGlzIGJlaW5nIHNwZWNpZmllZCwgZS5nLiBwdWJzIC0tPgotICAgICAgPGZpbGVzZXQgaW5jbHVkZXM9ImphdmEvbGliLyoiLz4gICA8IS0tIGlmIG9ubHkgYSBzcGVjaWZpYyBwdWJsaWNhdGlvbiBpcyBiZWluZyBzcGVjaWZpZWQsIGUuZy4gcHVicy9ibG9nIC0tPgotICAgIDwvYnVsa0NvcHk+Ci0gICAgPGJ1bGtDb3B5IAotICAgICAgc291cmNlZGlycz0iJHttb2R1bGVzLnJvb3QuZGlyc30iIAotICAgICAgdG9kaXI9IiR7YnVpbGQuZGlyfS9saWIiIAotICAgICAgZmxhdHRlbj0idHJ1ZSI+Ci0gICAgICA8ZmlsZXNldCBpbmNsdWRlcz0iKi9qYXZhL2xpYi8qIi8+IDwhLS0gaWYgYSBkaXJlY3Rvcnkgd2l0aCBtb3JlIHRoYW4gb25lIHB1YmxpY2F0aW9uIGlzIGJlaW5nIHNwZWNpZmllZCwgZS5nLiBwdWJzIC0tPgotICAgICAgPGZpbGVzZXQgaW5jbHVkZXM9ImphdmEvbGliLyoiLz4gICA8IS0tIGlmIG9ubHkgYSBzcGVjaWZpYyBwdWJsaWNhdGlvbiBpcyBiZWluZyBzcGVjaWZpZWQsIGUuZy4gcHVicy9ibG9nIC0tPgotICAgIDwvYnVsa0NvcHk+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3RhcmdldHMva3VwdS1idWlsZC54bWwgYi90cnVuay9zcmMvdGFyZ2V0cy9rdXB1LWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0NjZhYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvdGFyZ2V0cy9rdXB1LWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0ia3VwdSIgZGVmYXVsdD0ia3VwdSI+Ci0gIAotICA8ZGVzY3JpcHRpb24+Ci0gICAgS3VwdSB0YXJnZXRzCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHRhcmdldCBuYW1lPSJrdXB1IiBkZXBlbmRzPSJ3ZWJhcHAiIGRlc2NyaXB0aW9uPSJCdWlsZCBLdXB1Ij4KLQotICAgIDxlY2hvPgotICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICogICAgICAgICAgICAgICBCdWlsZCBLdXB1LiAgICAgICAgICAgICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDwvZWNobz4KLSAgICAKLSAgICA8ZXhlYyAKLSAgICAgIGRpcj0iJHtidWlsZC53ZWJhcHB9L2xlbnlhL3Jlc291cmNlcy9rdXB1IiAKLSAgICAgIGV4ZWN1dGFibGU9InhzbHRwcm9jIiAKLSAgICAgIGZhaWxvbmVycm9yPSJmYWxzZSIgCi0gICAgICBmYWlsaWZleGVjdXRpb25mYWlscz0iZmFsc2UiIAotICAgICAgb3V0cHV0cHJvcGVydHk9InhzbHRwcm9jLm91dHB1dCIKLSAgICAvPgotICAgIAotICAgIDxmYWlsIHVubGVzcz0ieHNsdHByb2Mub3V0cHV0Ij46ICAgICAgICAgICAgCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiBQbGVhc2UgaW5zdGFsbCAieHNsdHByb2MiIHRvIGJ1aWxkIEt1cHUuICoKLQkgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0JICAqIHhzbHRwcm9jIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gICAgICAgICAgKgotCSAgKiBmdHA6Ly9mdHAuemxhdGtvdmljLmNvbS9wdWIvbGlieG1sLyAgICAgICoKLQkgICogKHlvdSBhbHNvIG5lZWQgemxpYiBhbmQgaWNvbnYpICAgICAgICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgCi0gICAgPC9mYWlsPgotICAgIAotICAgIDxleGVjIGRpcj0iJHtidWlsZC53ZWJhcHB9L2xlbnlhL3Jlc291cmNlcy9rdXB1IiAKLSAgICAgIGV4ZWN1dGFibGU9Im1ha2UiIAotICAgICAgZmFpbG9uZXJyb3I9InRydWUiIAotICAgICAgZmFpbGlmZXhlY3V0aW9uZmFpbHM9ImZhbHNlIgotICAgIC8+Ci0KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGFyZ2V0cy9tZXNzYWdlLWJ1aWxkLnhtbCBiL3RydW5rL3NyYy90YXJnZXRzL21lc3NhZ2UtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU0MzYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy90YXJnZXRzL21lc3NhZ2UtYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHByb2plY3QgbmFtZT0ibWVzc2FnZSI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgIE1lc3NhZ2UgdGFyZ2V0cwotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDx0YXJnZXQgbmFtZT0ic3VjY2Vzc2Z1bGx5LWJ1aWx0LW1lc3NhZ2UtamV0dHkiIGlmPSJzZXJ2bGV0LmVuZ2luZS5qZXR0eSI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgYnVpbHQgJHtOYW1lfSAke3ZlcnNpb259IGJhc2VkIG9uIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiogICAgICBDb2Nvb24gKCR7Y29jb29uLnNyYy5kaXJ9KSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IioiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqIFN0YXJ0IHVzaW5nICR7TmFtZX0gd2l0aCBKZXR0eSBieSB0eXBpbmciLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqICAgICAgTGludXgvVU5JWDogLi9sZW55YS5zaCIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiogICAgICBXaW5kb3dzOiAgICAgIGxlbnlhIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiogYW5kIGJyb3dzZSB0byAiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqICAgICAgaHR0cDovLzEyNy4wLjAuMToke3dlYi5hcHAuc2VydmVyLmpldHR5LnBvcnR9Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiAgICAgIChKZXR0eSBBZG1pbiBQb3J0OiAke3dlYi5hcHAuc2VydmVyLmpldHR5LmFkbWluLnBvcnR9KSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IioiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqIFRoYW5rcyBmb3IgdXNpbmcgJHtOYW1lfSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IioiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InN1Y2Nlc3NmdWxseS1idWlsdC1tZXNzYWdlLXRvbWNhdCIgaWY9InNlcnZsZXQuZW5naW5lLnRvbWNhdCI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgYnVpbHQgJHtOYW1lfSAke3ZlcnNpb259IGJhc2VkIG9uIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiogICAgICBDb2Nvb24gKCR7Y29jb29uLnNyYy5kaXJ9KSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IioiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqIElNUE9SVEFOVDogTWFrZSBzdXJlIHRoYXQgdGhlIGVuZG9yc2VkIGxpYnJhcmllcyBhcmUgc2V0IGNvcnJlY3RseSIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiogICAgICAgICAgICAke3RvbWNhdC5lbmRvcnNlZC5kaXJ9Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiogU3RhcnQgdXNpbmcgJHtOYW1lfSB3aXRoIFRvbWNhdCBieSB0eXBpbmciLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqICAgICAgTGludXgvVU5JWDogJHt0b21jYXQuaG9tZS5kaXJ9L2Jpbi9zdGFydHVwLnNoIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiAgICAgIFdpbmRvd3M6ICAgICR7dG9tY2F0LmhvbWUuZGlyfS9iaW4vc3RhcnR1cC5iYXQiLz4KLSAgICA8ZWNobyBtZXNzYWdlPSIqIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiBhbmQgYnJvd3NlIHRvICIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiogICAgICBodHRwOi8vMTI3LjAuMC4xOjgwODAvbGVueWEvIi8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IiogVGhhbmtzIGZvciB1c2luZyAke05hbWV9Ii8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iKiIvPgotICAgIDxlY2hvIG1lc3NhZ2U9IioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIi8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGFyZ2V0cy9taWdyYXRpb24tYnVpbGQueG1sIGIvdHJ1bmsvc3JjL3RhcmdldHMvbWlncmF0aW9uLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyNmJlNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvdGFyZ2V0cy9taWdyYXRpb24tYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiB3ZWJhcHAtYnVpbGQueG1sIDI0MDI1NSAyMDA1LTA4LTI2IDE0OjU5OjM3WiBhbmRyZWFzICQgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9ImxlbnlhLW1pZ3JhdGlvbiI+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgIE1pZ3JhdGlvbiB0YXJnZXRzCi0gIDwvZGVzY3JpcHRpb24+Ci0gIAotICA8dGFyZ2V0IG5hbWU9Im1pZ3JhdGUtZXh0ZW5zaW9ucyI+Ci0gICAgCi0gICAgPGVjaG8+Ci0gICAgQ0FVVElPTjogVGhpcyB0YXJnZXQgZG9lcyBub3Qgd29yayBvdXQgb2YgdGhlIGJveCBpZiB5b3UgdXNlIGFuIGV4dGVybmFsIGNvbnRlbnQgZGlyZWN0b3J5Ci0gICAgaW4gcHVibGljYXRpb24ueG1sLiBQbGVhc2UgY2hhbmdlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0YXJnZXQgYWNjb3JkaW5nbHkuCi0gICAgPC9lY2hvPgotICAgIAotICAgIDxwcm9wZXJ0eSBuYW1lPSJwdWJsaWNhdGlvbiIgdmFsdWU9IiIvPgotICAgIDxtb3ZlIHRvZGlyPSIke2J1aWxkLndlYmFwcH0vbGVueWEvcHVicyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQud2ViYXBwfS9sZW55YS9wdWJzLyR7cHVibGljYXRpb259Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29udGVudC8qKiIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb250ZW50Lyovc2l0ZS54bWwiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29udGVudC8qL3NpdGV0cmVlLnhtbCIvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGNvbXBvc2l0ZW1hcHBlcj4KLSAgICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqLnhtbCIgdG89IioiLz4KLSAgICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqLnhtbC5tZXRhIiB0bz0iKi5tZXRhIi8+Ci0gICAgICA8L2NvbXBvc2l0ZW1hcHBlcj4KLSAgICA8L21vdmU+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibWlncmF0ZS0xNCI+Ci0gICAgPHBhdGggaWQ9Im1pZ3JhdGlvbi5jbGFzc3BhdGgiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9jbGFzc2VzIi8+Ci0gICAgPC9wYXRoPgotICAgIAotICAgIDxqYXZhIGZvcms9InRydWUiIGNsYXNzcGF0aHJlZj0ibWlncmF0aW9uLmNsYXNzcGF0aCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5taWdyYXRpb24uTWlncmF0ZTE0Ij4KLSAgICAgIDxhcmcgdmFsdWU9IiR7YnVpbGQud2ViYXBwfSIvPgotICAgICAgPGFyZyB2YWx1ZT0iJHtyZXBvc2l0b3J5LmZhY3Rvcnl9Ii8+Ci0gICAgPC9qYXZhPgotICAgIAotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3RhcmdldHMvbW9kdWxlcy1idWlsZC54bWwgYi90cnVuay9zcmMvdGFyZ2V0cy9tb2R1bGVzLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4YjgyNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvdGFyZ2V0cy9tb2R1bGVzLWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHdlYmFwcC1idWlsZC54bWwgMTc3OTIwIDIwMDUtMDUtMjMgMDQ6NTk6MzdaIGdyZWdvciAkIC0tPgotCi08cHJvamVjdCBuYW1lPSJtb2R1bGVzIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgTW9kdWxlcyBUYXJnZXRzCi0gIDwvZGVzY3JpcHRpb24+Ci0gIAotICA8cHJvcGVydHkgbmFtZT0ibW9kdWxlcy5yb290LmRpcnMiIHZhbHVlPSIiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLm1vZHVsZXMiIHZhbHVlPSIke2J1aWxkLndlYmFwcH0vbGVueWEvbW9kdWxlcyIvPgotICA8cHJvcGVydHkgbmFtZT0ibW9kdWxlcy5jb3B5IiB2YWx1ZT0iZmFsc2UiLz4KLQotICA8dGFyZ2V0IG5hbWU9InByZXBhcmUtbW9kdWxlcyIgZGVwZW5kcz0iaW5pdC10YXNrcyI+Ci0gICAgCi0gICAgPHByb3BlcnR5IG5hbWU9ImNvY29vbi54Y29uZiIgdmFsdWU9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2NvY29vbi54Y29uZiIvPgotICAgIAotICAgIDxnZW5lcmF0ZU1vZHVsZUxpc3QKLSAgICAgIG1vZHVsZURpcnM9IiR7bW9kdWxlcy5yb290LmRpcnN9IgotICAgICAgbW9kdWxlRmlsZT0iJHtidWlsZC5kaXJ9L3RlbXAvbW9kdWxlcy54bWwiLz4KLSAgICAKLSAgICA8IS0tIGFnZ3JlZ2F0ZSBhbGwgbW9kdWxlIGNvbmZpZyBmaWxlcyB0byBvbmUgZmlsZTogLS0+Ci0gICAgPHhzbHQKLSAgICAgIGluPSIke2J1aWxkLmRpcn0vdGVtcC9tb2R1bGVzLnhtbCIKLSAgICAgIG91dD0iJHtidWlsZC5kaXJ9L3RlbXAvbW9kdWxlcy1jb25maWcueG1sIgotICAgICAgc3R5bGU9IiR7c3JjLnJlc291cmNlLmRpcn0vYnVpbGQvbW9kdWxlczJjb25maWcueHNsIj4KLSAgICA8L3hzbHQ+Ci0gICAgCi0gICAgPHhzbHQKLSAgICAgIGluPSIke2J1aWxkLmRpcn0vdGVtcC9tb2R1bGVzLWNvbmZpZy54bWwiCi0gICAgICBvdXQ9IiR7YnVpbGQuZGlyfS90ZW1wL21vZHVsZXMtYnVpbGQueG1sIgotICAgICAgc3R5bGU9IiR7c3JjLnJlc291cmNlLmRpcn0vYnVpbGQvbW9kdWxlczJidWlsZC54c2wiPgotICAgICAgPHBhcmFtIG5hbWU9ImNvY29vbi14Y29uZiIgZXhwcmVzc2lvbj0iJHtjb2Nvb24ueGNvbmZ9IiAvPgotICAgICAgPHBhcmFtIG5hbWU9Im1vZHVsZS1zY2hlbWEiIGV4cHJlc3Npb249IiR7c3JjLnJlc291cmNlLmRpcn0vYnVpbGQvbW9kdWxlLnJuZyIvPgotICAgICAgPHBhcmFtIG5hbWU9ImNvcHktbW9kdWxlcyIgZXhwcmVzc2lvbj0iJHttb2R1bGVzLmNvcHl9Ii8+Ci0gICAgPC94c2x0PgotICAgIAotICAgIDx4c2x0Ci0gICAgICBpbj0iJHtidWlsZC5kaXJ9L3RlbXAvbW9kdWxlcy54bWwiCi0gICAgICBvdXQ9IiR7YnVpbGQuZGlyfS90ZW1wL21vZHVsZXMueGNvbmYiCi0gICAgICBzdHlsZT0iJHtzcmMucmVzb3VyY2UuZGlyfS9idWlsZC9tb2R1bGVzMnBhdGNoLnhzbCI+Ci0gICAgICA8cGFyYW0gbmFtZT0iY29weS1tb2R1bGVzIiBleHByZXNzaW9uPSIke21vZHVsZXMuY29weX0iLz4KLSAgICA8L3hzbHQ+Ci0gICAgCi0gICAgPHhwYXRjaCBhZGRDb21tZW50cz0iZmFsc2UiCi0gICAgICBpbmNsdWRlcz0ibW9kdWxlcy54Y29uZiIKLSAgICAgIHNyY2Rpcj0iJHtidWlsZC5kaXJ9L3RlbXAvIgotICAgICAgZmlsZT0iJHtjb2Nvb24ueGNvbmZ9Ii8+Ci0KLSAgPC90YXJnZXQ+Ci0gIAotICAKLSAgPHRhcmdldCBuYW1lPSJkZXBsb3ktbW9kdWxlcyIgZGVwZW5kcz0icHJlcGFyZS1tb2R1bGVzIj4KLSAgICA8YW50IGFudGZpbGU9IiR7YnVpbGQuZGlyfS90ZW1wL21vZHVsZXMtYnVpbGQueG1sIgotICAgICAgaW5oZXJpdGFsbD0idHJ1ZSIKLSAgICAgIGluaGVyaXRyZWZzPSJ0cnVlIgotICAgICAgdGFyZ2V0PSJjb21waWxlLW1vZHVsZXMiLz4KLSAgPC90YXJnZXQ+Ci0gIAotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gSmF2YWRvY3MgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAKLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jcy1tb2R1bGVzIiBkZXBlbmRzPSJwcmVwYXJlLW1vZHVsZXMiPgotICAgIDxhbnQgYW50ZmlsZT0iJHtidWlsZC5kaXJ9L3RlbXAvbW9kdWxlcy1idWlsZC54bWwiCi0gICAgICBpbmhlcml0YWxsPSJ0cnVlIgotICAgICAgaW5oZXJpdHJlZnM9InRydWUiCi0gICAgICB0YXJnZXQ9ImphdmFkb2NzLW1vZHVsZXMiLz4KLSAgPC90YXJnZXQ+Ci0gIAotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gTW9kdWxlIHRlc3RzIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgCi0gIDx0YXJnZXQgbmFtZT0icHJlcGFyZS1tb2R1bGUtdGVzdCI+Ci0gICAgPHhzbHQgYmFzZWRpcj0iJHtidWlsZC5kaXJ9L3RlbXAiCi0gICAgICBpbmNsdWRlcz0iKi54Y29uZiIKLSAgICAgIGRlc3RkaXI9IiR7YnVpbGQuZGlyfS90ZW1wIgotICAgICAgc3R5bGU9IiR7c3JjLnJlc291cmNlLmRpcn0vdGVzdC94cGF0Y2gydGVzdHBhdGNoLnhzbCIKLSAgICAgIGV4dGVuc2lvbj0iLnh0ZXN0Ii8+Ci0gICAgPHhwYXRjaCBhZGRDb21tZW50cz0iZmFsc2UiCi0gICAgICBpbmNsdWRlcz0ibW9kdWxlcy54dGVzdCIKLSAgICAgIHNyY2Rpcj0iJHtidWlsZC5kaXJ9L3RlbXAiCi0gICAgICBmaWxlPSIke2J1aWxkLnRlc3R9L29yZy9hcGFjaGUvbGVueWEvY21zL0xlbnlhVGVzdENhc2UueHRlc3QiLz4KLSAgPC90YXJnZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9Im1vZHVsZXMudGVzdCIgZGVwZW5kcz0icGF0Y2gtbW9kdWxlcy10ZXN0Ij4KLSAgICA8YW50IGFudGZpbGU9IiR7YnVpbGQuZGlyfS90ZW1wL21vZHVsZXMtYnVpbGQueG1sIgotICAgICAgaW5oZXJpdGFsbD0idHJ1ZSIKLSAgICAgIGluaGVyaXRyZWZzPSJ0cnVlIj4KLSAgICAgIDx0YXJnZXQgbmFtZT0idGVzdC1tb2R1bGUtb3JnLmFwYWNoZS5sZW55YS5tb2R1bGVzLmV4cG9ydCIvPgotICAgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW1vZHVsZXMiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9Im1vZHVsZXMudGVzdC5jYW5vbyIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IlJ1biBDYW5vbyB3ZWIgdGVzdHMgZm9yIG1vZHVsZXMiPgotICAgIDxhbnQgYW50ZmlsZT0iJHtidWlsZC5kaXJ9L3RlbXAvbW9kdWxlcy1idWlsZC54bWwiPgotICAgICAgPHByb3BlcnR5IG5hbWU9IndlYnRlc3QuaG9tZSIgdmFsdWU9IiR7d2VidGVzdC5ob21lfSIvPgotICAgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW1vZHVsZXMtY2Fub28iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9InBhdGNoLW1vZHVsZXMtdGVzdCIgZGVwZW5kcz0ic2V0LXRlc3QtcGF0Y2gtcHJvcGVydHksIHRlc3RzLnByZXBhcmUsIHByZXBhcmUtbW9kdWxlLXRlc3QiPgotICAgIDxhbnQgYW50ZmlsZT0iJHtidWlsZC5kaXJ9L3RlbXAvbW9kdWxlcy1idWlsZC54bWwiCi0gICAgICBpbmhlcml0YWxsPSJ0cnVlIgotICAgICAgaW5oZXJpdHJlZnM9InRydWUiCi0gICAgICB0YXJnZXQ9InBhdGNoLW1vZHVsZXMtdGVzdCIvPgotICA8L3RhcmdldD4KLSAgCi0gIDx0YXJnZXQgbmFtZT0ibW9kdWxlLnRlc3QiIGRlcGVuZHM9InBhdGNoLW1vZHVsZXMtdGVzdCI+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im1vZHVsZSIgdmFsdWU9IiIvPgotICAgIDxhbnQgYW50ZmlsZT0iJHtidWlsZC5kaXJ9L3RlbXAvbW9kdWxlcy1idWlsZC54bWwiCi0gICAgICBpbmhlcml0YWxsPSJ0cnVlIgotICAgICAgaW5oZXJpdHJlZnM9InRydWUiCi0gICAgICB0YXJnZXQ9InRlc3QtbW9kdWxlLSR7bW9kdWxlfSIvPgotICA8L3RhcmdldD4KLSAgCi0gIDx0YXJnZXQgbmFtZT0ibW9kdWxlLmNvbXBpbGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtb2R1bGUiIHZhbHVlPSIiLz4KLSAgICA8YW50IGFudGZpbGU9IiR7YnVpbGQuZGlyfS90ZW1wL21vZHVsZXMtYnVpbGQueG1sIgotICAgICAgaW5oZXJpdGFsbD0idHJ1ZSIKLSAgICAgIGluaGVyaXRyZWZzPSJ0cnVlIgotICAgICAgdGFyZ2V0PSJjb21waWxlLW1vZHVsZS0ke21vZHVsZX0iLz4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3RhcmdldHMvcHJvcGVydGllcy1idWlsZC54bWwgYi90cnVuay9zcmMvdGFyZ2V0cy9wcm9wZXJ0aWVzLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwNDJlZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvdGFyZ2V0cy9wcm9wZXJ0aWVzLWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08cHJvamVjdCBuYW1lPSJsZW55YS1wcm9wZXJ0aWVzIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgUHJvcGVydGllcyBUYXJnZXRzCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPCEtLSBTZXQgdXAgc29tZSBnbG9iYWwgcHJvcGVydGllcyAtLT4KLSAgPCEtLQotICBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgd2l0aG91dCBlZGl0aW5nIGJ1aWxkLnByb3BlcnRpZXMKLSAgKGxvY2FsLmJ1aWxkLnByb3BlcnRpZXMgdGFrZXMgcHJlY2VkZW5jZSkKLSAgLS0+Ci0gIDxwcm9wZXJ0eSBmaWxlPSJsb2NhbC5idWlsZC5wcm9wZXJ0aWVzIi8+Ci0gIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+Ci0KLSAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibG9jYWwucHJvcGVydGllcy5pbi5zeW5jIj4KLSAgICA8ZXF1YWxzIGFyZzE9IiR7YnVpbGQucHJvcGVydGllcy52ZXJzaW9ufSIgYXJnMj0iNTk0NjQ0Ii8+Ci0gIDwvY29uZGl0aW9uPgotCi0gIDxmYWlsIHVubGVzcz0ibG9jYWwucHJvcGVydGllcy5pbi5zeW5jIiBtZXNzYWdlPSJJdCBzZWVtcyB0aGF0IHlvdXIgbG9jYWwuYnVpbGQucHJvcGVydGllcyBpcyBOT1QgaW4gc3luYyB3aXRoIGJ1aWxkLnByb3BlcnRpZXMhIFRoZSBmaWxlIGJ1aWxkLnByb3BlcnRpZXMgaGFzIHByb2JhYmx5IGJlZW4gbW9kaWZpZWQgYnkgc29tZSBBcGFjaGUgTGVueWEgZGV2ZWxvcGVyLiBSZS1jb3B5IGJ1aWxkLnByb3BlcnRpZXMgdG8gbG9jYWwuYnVpbGQucHJvcGVydGllcyBhbmQgcmUtc2V0IHlvdXIgbG9jYWwgcHJvcGVydGllcyB0byBnZXQgdGhlIHR3byBmaWxlcyBiYWNrIGluIHN5bmMuIFBsZWFzZSBhcG9sb2dpemUgYW55IGluY29udmVuaWVuY2UuIi8+Ci0KLSAgPCEtLSBjb2Nvb24gYnVpbGQgcHJvcGVydGllcyBkaXJlY3RvcnkgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMuY29jb29uLnByb3BlcnRpZXMuZGlyIiB2YWx1ZT0ic3JjL2NvY29vbiIvPgotCi0gIDwhLS0gUHJvamVjdCB2ZXJzaW9uIGFuZCBuYW1lIC0tPgotICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjIuMC1kZXYiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxlbnlhLnJldmlzaW9uIiB2YWx1ZT0ieHh4eHh4Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJmdWxsbmFtZSIgdmFsdWU9IiR7YW50LnByb2plY3QubmFtZX0tJHt2ZXJzaW9ufSIvPgotICA8cHJvcGVydHkgbmFtZT0iZGlzdG5hbWUiIHZhbHVlPSJhcGFjaGUtJHthbnQucHJvamVjdC5uYW1lfS0ke3ZlcnNpb259Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJOYW1lIiAgICAgdmFsdWU9IkFwYWNoZSBMZW55YSIvPgotICA8cHJvcGVydHkgbmFtZT0ieWVhciIgICAgIHZhbHVlPSIxOTk5LTIwMDYiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iZGVidWciICAgICAgICAgIHZhbHVlPSJvbiIvPgotICA8cHJvcGVydHkgbmFtZT0ib3B0aW1pemUiICAgICAgIHZhbHVlPSJvbiIvPgotICA8cHJvcGVydHkgbmFtZT0iZGVwcmVjYXRpb24iICAgIHZhbHVlPSJvZmYiLz4KLSAgPHByb3BlcnR5IG5hbWU9Im5vd2FybiIgICAgICAgICB2YWx1ZT0ib2ZmIi8+Ci0gIDwhLS0gRGV0ZWN0aW5nIHRoZSBjdXJyZW50IGp2bSAtLT4KLSAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGFyZ2V0LnZtIiB2YWx1ZT0iJHthbnQuamF2YS52ZXJzaW9ufSI+Ci0gICAgPG5vdD4KLSAgICAgIDxvcj4KLSAgICAgICAgPGVxdWFscyBhcmcxPSIxLjEiIGFyZzI9IiR7YW50LmphdmEudmVyc2lvbn0iLz4KLSAgICAgICAgPGVxdWFscyBhcmcxPSIxLjIiIGFyZzI9IiR7YW50LmphdmEudmVyc2lvbn0iLz4KLSAgICAgICAgPGVxdWFscyBhcmcxPSIxLjMiIGFyZzI9IiR7YW50LmphdmEudmVyc2lvbn0iLz4KLSAgICAgIDwvb3I+Ci0gICAgPC9ub3Q+Ci0gIDwvY29uZGl0aW9uPgotICA8ZmFpbCB1bmxlc3M9InRhcmdldC52bSI+UGxlYXNlIHVzZSBhIEpWTSAxLjQgb3Igc3VwZXJpb3IgdG8gY29tcGlsZSBsZW55YSAke3ZlcnNpb259PC9mYWlsPgotICAKLSAgPCEtLQotICBUaGUgbWluaW1hbCBzdXBwb3J0ZWQgSmF2YSB2ZXJzaW9uLiBUaGUgY2xhc3MgZmlsZXMgd2Ugc2hpcCB3aXRoIExlbnlhIChlLmcuLCBidWlsZCB0YXNrcykKLSAgYXJlIGNvbXBpbGVkIGZvciB0aGlzIHZlcnNpb24uCi0gIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0LnZtLm1pbmltYWwiIHZhbHVlPSIxLjQiLz4KLQotICA8cHJvcGVydHkgbmFtZT0icGFja2FnZXMiICAgICAgdmFsdWU9IiouKiIvPgotCi0gIDwhLS0gY29jb29uIGVuZG9yc2VkIGxpYnJhcmllcyBkaXJlY3RvcnkgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjb2Nvb24uZW5kb3JzZWQubGliLmRpciIgdmFsdWU9IiR7Y29jb29uLnNyYy5kaXJ9L2xpYi9lbmRvcnNlZCIvPgotCi0gIDwhLS0gVGhlIGxpYnJhcmllcyB3ZSB1c2UgYW5kIHdoaWNoIGFyZSBub3QgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgY29jb29uIHBhY2thZ2UgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIiB2YWx1ZT0ibGliIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0b29scy5saWIuZGlyIiB2YWx1ZT0idG9vbHMvbGliIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlbmRvcnNlZC5saWIuZGlyIiB2YWx1ZT0ibGliL2VuZG9yc2VkIi8+Ci0gIDwhLS0gQWxsIGNvbXBpbGF0aW9uIGFuZCBwcmVwYXJhdGlvbiB0YWtlcyBwbGFjZSBpbiBidWlsZC5yb290IC0tPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQucm9vdCIgdmFsdWU9ImJ1aWxkIi8+Ci0gIDwhLS0gRGVzdGluYXRpb24gZm9yIHRoZSBjb21wbGlhdGlvbiBvZiBvdXIgb3duIGNsYXNzZXMgaW4gdGhlICJjb21waWxlIiB0YXJnZXQgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSIke2J1aWxkLnJvb3R9LyR7YW50LnByb2plY3QubmFtZX0iLz4KLSAgPCEtLSBEZXN0aW5hdGlvbiBmb3IgdGhlIGZpbHRlcmVkIHNvdXJjZSBmaWxlcyAgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5qYXZhLnNyYyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9qYXZhL3NyYyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuamF2YS50ZXN0IiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2phdmEvdGVzdCIvPgotICAKLSAgPCEtLSBEZXN0aW5hdGlvbiBmb3IgdGVtcG9yYXJ5IGZpbGVzIGR1cmluZyB0aGUgYnVpbGQgIC0tPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGVtcCIgdmFsdWU9IiR7YnVpbGQuZGlyfS90ZW1wIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5wYXRjaCIgdmFsdWU9IiR7YnVpbGQudGVtcH0vcGF0Y2giLz4KLSAgPCEtLSBUaGlzIGlzIHdoZXJlIHdlIGFzc2VtYmxlIHRoZSB3ZWJhcHAgZGlyZWN0b3J5IGluIHRoZSAid2ViYXBwIiB0YXNrIC0tPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQud2ViYXBwIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3dlYmFwcCIvPgotICA8IS0tIFRoaXMgaXMgd2hlcmUgd2UgZG8gdGhlIHRlc3RzIC0tPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGVzdCIgdmFsdWU9IiR7YnVpbGQucm9vdH0vdGVzdCIvPgotICA8IS0tIEFsbCBwYWNrYWdpbmcgZm9yIGRpc3RyaWJ1dGlvbiB0YWtlcyBwbGFjZSBpbiBkaXN0LnJvb3QgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LnJvb3QiIHZhbHVlPSJkaXN0Ii8+Ci0gIDwhLS0gVGhlIHRvcGxldmVsIGRpcmVjdG9yeSBmb3IgdGhlIGZpbmFsIGVuZC11c2VyIGRpc3RyaWJ1dGlvbiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QuYmluLmRpciIgdmFsdWU9IiR7ZGlzdC5yb290fS8ke2Rpc3RuYW1lfS1iaW4iLz4KLSAgPCEtLSBUaGUgamF2YWRvYyBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmJpbi5qYXZhZG9jcyIgdmFsdWU9IiR7YnVpbGQud2ViYXBwfS9zaXRlL2FwaWRvY3MiLz4KLSAgPCEtLSBUaGUgZmlsZW5hbWUgb2YgdGhlIGZpbmFsIGVuZC11c2VyIHdhciBwYWNrYWdlIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZGlzdC5iaW4ud2FyZmlsZSIgdmFsdWU9IiR7ZGlzdC5iaW4uZGlyfS8ke2FudC5wcm9qZWN0Lm5hbWV9LndhciIvPgotICA8IS0tIFRoZSB0b3BsZXZlbCBkaXJlY3RvcnkgZm9yIHRoZSBmaW5hbCBkZXZlbG9wZXIgc291cmNlIGRpc3RyaWJ1dGlvbiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3Quc3JjLmRpciIgdmFsdWU9IiR7ZGlzdC5yb290fS8ke2Rpc3RuYW1lfS1zcmMiLz4KLSAgPCEtLQotICBUaGUgZmlsZXMgdGhhdCBzaG91bGQgYmUgY29waWVkIGludG8gdGhlIGRpc3QKLSAgZGlyZWN0b3J5IGFuZCBwYWNrZWQgdXAgYXMgdGFyLmd6IGZpbGUsIGFsb25nIHdpdGggdGhlIC53YXIgZmlsZQotICAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXN0LmRpciIgdmFsdWU9Ii4vc3JjL2Rpc3QiLz4KLSAgPCEtLQotICBUaGUgZmlsZXMgdGhhdCBzaG91bGQgYmUgY29waWVkIGludG8gdGhlIHNvdXJjZSBkaXN0Ci0gIGRpcmVjdG9yeSBhbmQgcGFja2VkIHVwIGFzIHRhci5neiBmaWxlLCBhbG9uZyB3aXRoIHRoZSBzb3VyY2VzIGV0Yy4KLSAgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlzdC1zcmMuZGlyIiB2YWx1ZT0iLi9zcmMvZGlzdC1zcmMiLz4KLSAgCi0gIDwhLS0gT3VyIG93biBzb3VyY2UgY29kZSB0cmVlIGlzIGhlcmUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMuamF2YS5hcGkuZGlyIiB2YWx1ZT0iLi9zcmMvamF2YSIvPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLmphdmEuaW1wbC5kaXIiIHZhbHVlPSIuL3NyYy9pbXBsL2phdmEiLz4KLSAgCi0gIDwhLS0gVGhpcyBpcyB3aGVyZSB0aGUgc291cmNlIG9mIHRoZSB0ZXN0cyBhcmUgbG9jYXRlZCAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy50ZXN0LmFwaS5kaXIiIHZhbHVlPSJzcmMvdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLnRlc3QuaW1wbC5kaXIiIHZhbHVlPSJzcmMvaW1wbC90ZXN0Ii8+Ci0gIAotICA8IS0tIFB1YmxpY2F0aW9uLXNwZWNpZmljIGVudGl0aWVzIGFyZSBoZXJlIC0tPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLmVudGl0aWVzLmRpciIgdmFsdWU9InJlc291cmNlcy9lbnRpdGllcyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZW50aXRpZXMuZGlyIiB2YWx1ZT0iV0VCLUlORi9lbnRpdGllcyIvPgotICA8IS0tCi0gIE91ciBvd24gd2ViYXBwIHJlc291cmNlcyB0byBiZSBtZXJnZWQgd2l0aCB0aGUKLSAgY29udGVudHMgb2YgdGhlIGNvY29vbiB3ZWJhcHAgYXJlIGhlcmUKLSAgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMud2ViYXBwLmRpciIgdmFsdWU9InNyYy93ZWJhcHAiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRvb2xzLnRhc2tzLmRlc3QiIHZhbHVlPSJ0b29scy9hbnR0YXNrcy9idWlsZC9jbGFzc2VzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMucmVzb3VyY2UuZGlyIiAgdmFsdWU9InNyYy9yZXNvdXJjZXMiLz4KLSAgPCEtLSBoc3FsZGIgZGF0YWJhc2UgY29uZmlnIGZpbGVzIGRpcmVjdG9yeSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5kYXRhYmFzZS5kaXIiIHZhbHVlPSJzcmMvd2ViYXBwL1dFQi1JTkYvZGIiLz4KLQotICA8IS0tIFNldCB1cCBjbGFzc3BhdGggLS0+Ci0gIDxwYXRoIGlkPSJjbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgIDwvZmlsZXNldD4KLSAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfS9saWIiPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2NvY29vbi53ZWJhcHAuZGlyfS9XRUItSU5GL2xpYiI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgIDwvZmlsZXNldD4KLSAgICA8ZmlsZXNldCBkaXI9InRvb2xzL2pldHR5L2xpYiI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2bGV0LSouamFyIi8+Ci0gICAgPC9maWxlc2V0PgotICA8L3BhdGg+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb2Nvb24taW5pdC10YXNrcyI+Ci0gICAgPGFudCBkaXI9IiR7Y29jb29uLnNyYy5kaXJ9IiB0YXJnZXQ9ImluaXQtdGFza3MiIGluaGVyaXRhbGw9ImZhbHNlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gQ3VzdG9tIEFudCB0YXNrcyB1c2VkIGZvciBidWlsZGluZyBMZW55YSAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0LXRhc2tzIiBkZXBlbmRzPSJjb2Nvb24taW5pdC10YXNrcyI+Ci0gICAgPHRhc2tkZWYgbmFtZT0iY29weUphdmFTb3VyY2VzIiBjbGFzc3BhdGg9IiR7dG9vbHMudGFza3MuZGVzdH0iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYW50LkNvcHlKYXZhU291cmNlc1Rhc2siLz4KLSAgICA8dGFza2RlZiBuYW1lPSJidWxrQ29weSIgICAgICAgIGNsYXNzcGF0aD0iJHt0b29scy50YXNrcy5kZXN0fSIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5hbnQuQnVsa0NvcHlUYXNrIi8+Ci0gICAgPHRhc2tkZWYgbmFtZT0iY29weVB1YnMiICAgICAgICBjbGFzc3BhdGg9IiR7dG9vbHMudGFza3MuZGVzdH0iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYW50LkNvcHlQdWJsaWNhdGlvbnNUYXNrIi8+Ci0gICAgPHRhc2tkZWYgbmFtZT0ieHBhdGNoIiAgICAgICAgICBjbGFzc3BhdGg9IiR7Y29jb29uLnNyYy5kaXJ9L3Rvb2xzL2FudHRhc2tzIiBjbGFzc25hbWU9IlhDb25mVG9vbFRhc2siIC8+Ci0gICAgPHRhc2tkZWYgbmFtZT0iZ2VuZXJhdGVNb2R1bGVMaXN0IiBjbGFzc3BhdGg9IiR7dG9vbHMudGFza3MuZGVzdH0iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMuYW50LkdlbmVyYXRlTW9kdWxlTGlzdCIgLz4KLSAgICA8dGFza2RlZiBuYW1lPSJqaW5nIiBjbGFzc25hbWU9ImNvbS50aGFpb3BlbnNvdXJjZS5yZWxheG5nLnV0aWwuSmluZ1Rhc2siLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBDb21waWxlIHRhc2tzIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtYnVpbGQtdGFza3MiIGRlc2NyaXB0aW9uPSJUYXJnZXQgdG8gY29tcGlsZSB0YXNrcyBuZWVkZWQgZHVyaW5nIGJ1aWxkIj4KLSAgICA8amF2YWMgc3JjZGlyPSJ0b29scy9hbnR0YXNrcy9zcmMiCi0gICAgICAgICAgIGRlc3RkaXI9InRvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMiCi0gICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKLSAgICAgICAgICAgb3B0aW1pemU9IntvcHRpbWl6ZX0iCi0gICAgICAgICAgIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKLSAgICAgICAgICAgdGFyZ2V0PSIke3RhcmdldC52bS5taW5pbWFsfSIKLSAgICAgICAgICAgbm93YXJuPSIke25vd2Fybn0iCi0gICAgICAgICAgIHNvdXJjZT0iJHt0YXJnZXQudm0ubWluaW1hbH0iLz4KLQkgICA8IS0tCi0gICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIgotCSAgIC0tPgotICA8L3RhcmdldD4KLQotICA8IS0tIENvbXBpbGUgQ29uZmlndXJlIENvbW1hbmQgTGluZSBUb29sIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtY29uZmlndXJlIiBkZXNjcmlwdGlvbj0iQ29tcGlsZSBjb25maWd1cmUgY29tbWFuZCBsaW5lIHRvb2wiPgotCi0gICAgPGRlbGV0ZSBkaXI9InRvb2xzL2NvbmZpZ3VyZS9idWlsZCIvPgotCi0gICAgPG1rZGlyIGRpcj0idG9vbHMvY29uZmlndXJlL2J1aWxkIi8+Ci0gICAgPG1rZGlyIGRpcj0idG9vbHMvY29uZmlndXJlL2J1aWxkL2NsYXNzZXMiLz4KLSAgICA8bWtkaXIgZGlyPSJ0b29scy9jb25maWd1cmUvYnVpbGQvbGliIi8+Ci0gIAkKLSAgICA8amF2YWMgc3JjZGlyPSJ0b29scy9jb25maWd1cmUvc3JjL2phdmEiCi0gICAgICAgICAgIGRlc3RkaXI9InRvb2xzL2NvbmZpZ3VyZS9idWlsZC9jbGFzc2VzIgotICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCi0gICAgICAgICAgIG9wdGltaXplPSJ7b3B0aW1pemV9IgotICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtkZXByZWNhdGlvbn0iCi0gICAgICAgICAgIHRhcmdldD0iJHt0YXJnZXQudm19IgotICAgICAgICAgICBub3dhcm49IiR7bm93YXJufSIKLSAgICAgICAgICAgc291cmNlPSIke3RhcmdldC52bX0iLz4KLQkgICA8IS0tCi0gICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIgotCSAgIC0tPgotCi0KLSAgICA8amFyIGRlc3RmaWxlPSJ0b29scy9jb25maWd1cmUvYnVpbGQvbGliL2FwYWNoZS1sZW55YS1jb25maWd1cmUtY29yZS0ke3ZlcnNpb259LXIke2xlbnlhLnJldmlzaW9ufS5qYXIiCi0gICAgICAgICBiYXNlZGlyPSJ0b29scy9jb25maWd1cmUvYnVpbGQvY2xhc3NlcyIgCi0gICAgICAgICBpbmNsdWRlcz0ib3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS8qKiIvPgotICAgIDxqYXIgZGVzdGZpbGU9InRvb2xzL2NvbmZpZ3VyZS9idWlsZC9saWIvYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1pbXBsLSR7dmVyc2lvbn0tciR7bGVueWEucmV2aXNpb259LmphciIKLSAgICAgICAgIGJhc2VkaXI9InRvb2xzL2NvbmZpZ3VyZS9idWlsZC9jbGFzc2VzIiAKLSAgICAgICAgIGluY2x1ZGVzPSJvcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsLyoqIi8+Ci0KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSJ0b29scy9jb25maWd1cmUvbGliIiBpbmNsdWRlcz0iKi5qYXIiLz4KLSAgICA8L2RlbGV0ZT4KLQotICAgIDxjb3B5IGZpbGU9InRvb2xzL2NvbmZpZ3VyZS9idWlsZC9saWIvYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1jb3JlLSR7dmVyc2lvbn0tciR7bGVueWEucmV2aXNpb259LmphciIKLSAgICAgICAgICB0b2ZpbGU9InRvb2xzL2NvbmZpZ3VyZS9saWIvYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1jb3JlLSR7dmVyc2lvbn0tciR7bGVueWEucmV2aXNpb259LmphciIvPgotICAgIDxjb3B5IGZpbGU9InRvb2xzL2NvbmZpZ3VyZS9idWlsZC9saWIvYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1pbXBsLSR7dmVyc2lvbn0tciR7bGVueWEucmV2aXNpb259LmphciIKLSAgICAgICAgICB0b2ZpbGU9InRvb2xzL2NvbmZpZ3VyZS9saWIvYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1pbXBsLSR7dmVyc2lvbn0tciR7bGVueWEucmV2aXNpb259LmphciIvPgotICAgICAgICAgIAotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGFyZ2V0cy9wdWJsaWNhdGlvbi10ZXN0LWJ1aWxkLXRlbXBsYXRlLnhtbCBiL3RydW5rL3NyYy90YXJnZXRzL3B1YmxpY2F0aW9uLXRlc3QtYnVpbGQtdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDA1MWUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy90YXJnZXRzL3B1YmxpY2F0aW9uLXRlc3QtYnVpbGQtdGVtcGxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLTxwcm9qZWN0IG5hbWU9ImxlbnlhLXB1YnRlc3QiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICBQdWJsaWNhdGlvbiBUZXN0IFRhcmdldHMKLSAgPC9kZXNjcmlwdGlvbj4KLQotPHRhcmdldCBkZXBlbmRzPSJpbml0LCB0ZXN0cy5wcmVwYXJlIiBuYW1lPSJ0ZXN0LnB1YmxpY2F0aW9ucyI+Ci08L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGFyZ2V0cy9wdWJsaWNhdGlvbi10ZXN0LWJ1aWxkLnhtbCBiL3RydW5rL3NyYy90YXJnZXRzL3B1YmxpY2F0aW9uLXRlc3QtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDA1MWUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy90YXJnZXRzL3B1YmxpY2F0aW9uLXRlc3QtYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLTxwcm9qZWN0IG5hbWU9ImxlbnlhLXB1YnRlc3QiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICBQdWJsaWNhdGlvbiBUZXN0IFRhcmdldHMKLSAgPC9kZXNjcmlwdGlvbj4KLQotPHRhcmdldCBkZXBlbmRzPSJpbml0LCB0ZXN0cy5wcmVwYXJlIiBuYW1lPSJ0ZXN0LnB1YmxpY2F0aW9ucyI+Ci08L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGFyZ2V0cy90ZXN0LWJ1aWxkLnhtbCBiL3RydW5rL3NyYy90YXJnZXRzL3Rlc3QtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y3Yzk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy90YXJnZXRzL3Rlc3QtYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9ImxlbnlhLXRlc3QiPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICBUZXN0IFRhcmdldHMKLSAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS0gPT09IFRlc3QgdGFyZ2V0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8cHJvcGVydHkgbmFtZT0iZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnB1Yi5pZCIgdmFsdWU9InRlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QucHViLnNvdXJjZS5pZCIgdmFsdWU9ImRlZmF1bHQiLz4KLSAgPHByb3BlcnR5IG5hbWU9Imp1bml0LnRlc3QubG9nbGV2ZWwiIHZhbHVlPSIyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5kaXIiIHZhbHVlPSIke2J1aWxkLnJvb3R9L3Rlc3Qvb3V0cHV0IiAvPgotICAKLSAgPHRhcmdldCBuYW1lPSJzZXQtdGVzdC1wYXRjaC1wcm9wZXJ0eSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InBhdGNoLndlYmFwcCIgdmFsdWU9ImZhbHNlIi8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLQotICBERUJVRyAwCi0gIElORk8gIDEKLSAgV0FSTiAgMgotICBFUlJPUiAzCi0gIEZBVEFMIDQKLSAgLS0+Ci0KLSAgPHBhdGggaWQ9ImNsYXNzcGF0aC5kZWZhdWx0Ij4KLSAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLnRlc3R9IiAvPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9jbGFzc2VzIiAvPgotICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLmphciIvPgotICAgIDwvZmlsZXNldD4KLSAgPC9wYXRoPgotICAgICAgCi0gIDwhLS0gUnVucyBhbGwgdGVzdHMgLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIKLSAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIGFsbCB0ZXN0cyIKLSAgICBkZXBlbmRzPSJtb2R1bGVzLnRlc3QsIHRlc3RzLmp1bml0Ii8+Ci0gIDwhLS0KLSAgZGVwZW5kcz0idGVzdHMuanVuaXQsIHRlc3RzLmFudGVhdGVyLCB0ZXN0cy53ZWJ0ZXN0Ii8+Ci0gIC0tPgotICAKLSAgPCEtLSBQcmVwYXJlcyB0aGUgdGVzdCBwdWJsaWNhdGlvbiAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0LnB1Yi5wcmVwYXJlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5wdWIuZGlyIiB2YWx1ZT0iJHtidWlsZC53ZWJhcHB9L2xlbnlhL3B1YnMvJHt0ZXN0LnB1Yi5pZH0iLz4KLSAgICA8ZWNobz5DcmVhdGluZyB0ZXN0IHB1YmxpY2F0aW9uIGF0ICR7dGVzdC5wdWIuZGlyfTwvZWNobz4KLSAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LnB1Yi5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0LnB1Yi5kaXJ9Ii8+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dGVzdC5wdWIuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQud2ViYXBwfS9sZW55YS9wdWJzLyR7dGVzdC5wdWIuc291cmNlLmlkfSI+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbnRlbnQvKioiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPHJlcGxhY2UgZW5jb2Rpbmc9InV0Zi04IgotICAgICAgZmlsZT0iJHtidWlsZC53ZWJhcHB9L2xlbnlhL3B1YnMvJHt0ZXN0LnB1Yi5pZH0vY29uZmlnL3B1YmxpY2F0aW9uLnhtbCIKLSAgICAgIHRva2VuPSJEZWZhdWx0IFB1YmxpY2F0aW9uIiB2YWx1ZT0iVGVzdCBQdWJsaWNhdGlvbiIvPgotICAgIDxyZXBsYWNlIGVuY29kaW5nPSJ1dGYtOCIKLSAgICAgIGZpbGU9IiR7YnVpbGQud2ViYXBwfS9sZW55YS9wdWJzLyR7dGVzdC5wdWIuaWR9L2NvbmZpZy9zZWFyY2gvbHVjZW5lX2luZGV4LnhtbCIKLSAgICAgIHRva2VuPSJkZWZhdWx0IiB2YWx1ZT0idGVzdCIvPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gcHJlcGFyZXMgdGhlIHRlc3RzLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0cy5wcmVwYXJlIiBkZXBlbmRzPSJpbml0LCB0ZXN0LnB1Yi5wcmVwYXJlLCBzZXQtdGVzdC1wYXRjaC1wcm9wZXJ0eSI+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50ZXN0fSIvPgotICAgIDxta2RpciBkaXI9IiR7anVuaXQuZGlyfSIgLz4KLSAgICAKLSAgICA8IS0tIENvcHkgdGVzdCBmaWxlcyB0byBidWlsZCB0ZXN0IGRpciAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5qYXZhLnRlc3R9IiBmaWx0ZXJpbmc9Im9uIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMudGVzdC5pbXBsLmRpcn0iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8Y29weUphdmFTb3VyY2VzIHB1YnNyb290ZGlycz0iJHtwdWJzLnJvb3QuZGlyc30iIGphdmFkaXI9ImphdmEvdGVzdCIgYnVpbGRkaXI9IiR7YnVpbGQuamF2YS50ZXN0fSIgLz4KLSAgICAKLSAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnRlc3QiPgotICAgICAgPHBhdGggcmVmaWQ9ImNsYXNzcGF0aCIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9saWIiIGluY2x1ZGVzPSJsZW55YS0qLmphciIvPgotICAgIDwvcGF0aD4KLSAgICAKLSAgICA8IS0tIENvbXBpbGUgdGVzdHMgLS0+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtidWlsZC5qYXZhLnRlc3R9IgotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLnRlc3R9IgotICAgICAgICAgICBkZWJ1Zz0idHJ1ZSIKLSAgICAgICAgICAgZGVidWdsZXZlbD0ibGluZXMsdmFycyxzb3VyY2UiCi0gICAgICAgICAgIG9wdGltaXplPSJ7b3B0aW1pemV9IgotICAgICAgICAgICBkZXByZWNhdGlvbj0ie2RlcHJlY2F0aW9ufSIKLSAgICAgICAgICAgdGFyZ2V0PSIke3RhcmdldC52bX0iCi0gICAgICAgICAgIGZvcms9InRydWUiCi0gICAgICAgICAgIHNvdXJjZT0iJHtzcmMuamF2YS52ZXJzaW9ufSI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgudGVzdCIvPgotICAgIDwvamF2YWM+Ci0gICAgCi0gICAgPCEtLSBDb3B5IHRlc3QgcmVzb3VyY2VzIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLnRlc3R9IiBmaWx0ZXJpbmc9Im9uIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5qYXZhLnRlc3R9IiBleGNsdWRlcz0iKiouamF2YSIvPgotICAgIDwvY29weT4KLSAgICAKLSAgICA8IS0tIEdlbmVyYXRlIHRoZSB4dGVzdCBmaWxlIC0tPgotCi0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQudGVtcH0vdGVzdCIgZmlsdGVyaW5nPSJvbiIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMucmVzb3VyY2UuZGlyfS90ZXN0Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi10ZW1wbGF0ZS54bWwiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgCi0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQudGVtcH0vdGVzdCIgZmlsdGVyaW5nPSJvbiIgb3ZlcndyaXRlPSJ0cnVlIgotICAgICAgZmlsZT0iJHtzcmMuamF2YS5pbXBsLmRpcn0vb3JnL2FwYWNoZS9sZW55YS9sZW55YS5yb2xlcyIvPgotICAgIAotICAgIDx4cGF0Y2ggZmlsZT0iJHtidWlsZC50ZW1wfS90ZXN0L2xlbnlhLnJvbGVzIgotICAgICAgc3JjZGlyPSIke2J1aWxkLnBhdGNofSIgCi0gICAgICBpbmNsdWRlcz0ibGVueWEtcm9sZXMvKiovKi54cm9sZXMiCi0gICAgICBhZGRDb21tZW50cz0idHJ1ZSIvPgotICAgIAotICAgIDx4c2x0IGluPSIke2J1aWxkLnRlbXB9L3Rlc3QvbGVueWEucm9sZXMiCi0gICAgICAgICAgb3V0PSIke2J1aWxkLnRlbXB9L3Rlc3Qvcm9sZXMueHNsIgotICAgICAgICAgIHN0eWxlPSIke3NyYy5yZXNvdXJjZS5kaXJ9L3Rlc3QvbWV0YS54c2wiPgotICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiIGV4cHJlc3Npb249InJvbGVzIi8+Ci0gICAgPC94c2x0PgotICAgIAotICAgIDx4cGF0Y2ggZmlsZT0iJHtidWlsZC50ZW1wfS90ZXN0L3hjb25mLXRlbXBsYXRlLnhtbCIKLSAgICAgIHNyY2Rpcj0iJHtidWlsZC5wYXRjaH0vY29jb29uLXhjb25mIiAKLSAgICAgIGluY2x1ZGVzPSJwcmVwYXJlLyoueGNvbmYiCi0gICAgICBhZGRDb21tZW50cz0idHJ1ZSIvPgotICAgIDx4cGF0Y2ggZmlsZT0iJHtidWlsZC50ZW1wfS90ZXN0L3hjb25mLXRlbXBsYXRlLnhtbCIKLSAgICAgIHNyY2Rpcj0iJHtidWlsZC5wYXRjaH0vY29jb29uLXhjb25mIiAKLSAgICAgIGluY2x1ZGVzPSIqKi8qLnhjb25mIgotICAgICAgZXhjbHVkZXM9InByZXBhcmUvKi54Y29uZiIKLSAgICAgIGFkZENvbW1lbnRzPSJ0cnVlIi8+Ci0gICAgCi0gICAgPHhzbHQgaW49IiR7YnVpbGQudGVtcH0vdGVzdC94Y29uZi10ZW1wbGF0ZS54bWwiCi0gICAgICBvdXQ9IiR7YnVpbGQudGVtcH0vdGVzdC9jb21wb25lbnRzLnhzbCIKLSAgICAgIHN0eWxlPSIke3NyYy5yZXNvdXJjZS5kaXJ9L3Rlc3QvbWV0YS54c2wiPgotICAgICAgPHBhcmFtIG5hbWU9ImVsZW1lbnQiIGV4cHJlc3Npb249ImNvbXBvbmVudHMiLz4KLSAgICA8L3hzbHQ+Ci0gICAgCi0gICAgPHhzbHQgaW49IiR7c3JjLnJlc291cmNlLmRpcn0vdGVzdC90ZW1wbGF0ZS14dGVzdC54bWwiCi0gICAgICBvdXQ9IiR7YnVpbGQudGVtcH0vdGVzdC9yb2xlcy54dGVzdCIKLSAgICAgIHN0eWxlPSIke2J1aWxkLnRlbXB9L3Rlc3Qvcm9sZXMueHNsIi8+Ci0gICAgCi0gICAgPHhzbHQgaW49IiR7YnVpbGQudGVtcH0vdGVzdC9yb2xlcy54dGVzdCIKLSAgICAgIG91dD0iJHtidWlsZC50ZXN0fS9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9MZW55YVRlc3RDYXNlLnh0ZXN0IgotICAgICAgc3R5bGU9IiR7YnVpbGQudGVtcH0vdGVzdC9jb21wb25lbnRzLnhzbCIvPgotICAgICAgCi0gICAgPCEtLSAtLT4KLSAgICAKLSAgPC90YXJnZXQ+Ci0KLQotICA8IS0tIFJ1bnMgSlVuaXQgdGVzdHMgLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdHMuanVuaXQiIGRlcGVuZHM9InBhdGNoLW1vZHVsZXMtdGVzdCI+Ci0gICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBzaG93b3V0cHV0PSJ0cnVlIiBoYWx0b25lcnJvcj0ib24iIGhhbHRvbmZhaWx1cmU9Im9uIiBmb3JrPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EamF2YS5lbmRvcnNlZC5kaXJzPSR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2xpYi9lbmRvcnNlZCIvPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLURvcmcueG1sLnNheC5wYXJzZXI9b3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Imp1bml0LnRlc3QubG9nbGV2ZWwiIHZhbHVlPSIke2p1bml0LnRlc3QubG9nbGV2ZWx9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJjb250ZXh0Um9vdCIgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQvbGVueWEvd2ViYXBwIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ0ZW1wRGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9idWlsZC9sZW55YS90ZW1wIi8+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJmYWxzZSIgLz4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIiAvPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIi8+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdH0iIC8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9jbGFzc2VzIiAvPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2xpYiI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJlbmRvcnNlZC8qLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3NyYy50ZXN0LmltcGwuZGlyfSIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAKLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7anVuaXQuZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC50ZXN0fSIgaW5jbHVkZXM9IioqLypUZXN0LmNsYXNzIiBleGNsdWRlcz0iKiovQWJzdHJhY3QqLmNsYXNzIi8+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICAgIAotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICAKLSAgICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQW50ZWF0ZXIgdGVzdHMgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8dGFyZ2V0IG5hbWU9InRlc3RzLmFudGVhdGVyIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iYW50ZWF0ZXIuaG9tZSIgdmFsdWU9IiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnRlYXRlci5idWlsZGZpbGUiIHZhbHVlPSJzcmMvdGVzdC9hbnRlYXRlci90ZXN0cy54bWwiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4iIGZvcms9InRydWUiPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudGVhdGVyLmhvbWV9L3Jlc291cmNlcyIvPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50ZWF0ZXIuaG9tZX0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYi8qKi8qLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYW50LmhvbWU9JHthbnRlYXRlci5ob21lfSIvPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLURhbnRlYXRlci5ob21lPSR7YW50ZWF0ZXIuaG9tZX0iIC8+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItRGFudGVhdGVyLnJlcG9ydD0ke2FudGVhdGVyLmhvbWV9L3Jlc291cmNlcy9zY3JpcHRzL3JlcG9ydC54bWwiIC8+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItRGFudGVhdGVyLnJlc291cmNlcz0ke2FudGVhdGVyLmhvbWV9L3Jlc291cmNlcyIgLz4KLSAgICAgIDxhcmcgbGluZT0iLWYgJHthbnRlYXRlci5idWlsZGZpbGV9Ii8+Ci0gICAgICA8YXJnIHZhbHVlPSItcHJvcGVydHlmaWxlIiAvPgotICAgICAgPGFyZyB2YWx1ZT0iJHthbnRlYXRlci5ob21lfS9yZXNvdXJjZXMvTUVUQS1JTkYvQW50ZWF0ZXIucHJvcGVydGllcyIgLz4KLSAgICAgIDwhLS0KLSAgICAgIDxhcmcgdmFsdWU9Ii1EZGVmYXVsdC5kZWJ1Zz0xMCIvPgotICAgICAgLS0+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotPCEtLSBUaGUgWFNQIGNvbXBpbGF0aW9uIHRhcmdldCAtLT4KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXhzcCIgZGVwZW5kcz0idGVzdHMucHJlcGFyZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcGlsZSB0aGUgWFNQIHNvdXJjZXMiPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS93b3JrIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUteHNwLmZhaWxvbmVycm9yIiB2YWx1ZT0iZmFsc2UiLz4gPCEtLSBtYXkgYmUgb3ZlcnJpZGRlbiB3aXRoIC1EIC0tPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb2Nvb24uYmVhbi5YU1BQcmVjb21waWxlV3JhcHBlciIgZmFpbG9uZXJyb3I9IiR7Y29tcGlsZS14c3AuZmFpbG9uZXJyb3J9Ij4KLSAgICAgIDxhcmcgdmFsdWU9Ii1jJHtidWlsZC53ZWJhcHB9Ii8+Ci0gICAgICA8YXJnIHZhbHVlPSItdyR7YnVpbGQuZGlyfS93b3JrIi8+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2NsYXNzZXMiLz4KLSAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIi8+Ci0gICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICA8ZmlsZXNldCBkaXI9InRvb2xzL2pldHR5L2xpYiI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0ic2VydmxldC0qLmphciIvPgotICAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90YXJnZXRzL3dlYmFwcC1idWlsZC54bWwgYi90cnVuay9zcmMvdGFyZ2V0cy93ZWJhcHAtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBkZTdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy90YXJnZXRzL3dlYmFwcC1idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHByb2plY3QgbmFtZT0ibGVueWEtd2ViYXBwIj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgV2ViYXBwIFRhcmdldHMKLSAgPC9kZXNjcmlwdGlvbj4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS1hcGkiIGRlc2NyaXB0aW9uPSJjb21waWxlIGFuZCBkZXBsb3kgQVBJIj4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXBpbGUtc3JjIj4KLSAgICAgIDxwYXJhbSBuYW1lPSJjb21waWxlLnNyYy5kaXIiIHZhbHVlPSIke3NyYy5qYXZhLmFwaS5kaXJ9Ii8+Ci0gICAgICA8cGFyYW0gbmFtZT0iY29tcGlsZS5kZXN0LmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9hcGkiLz4KLSAgICAgIDxwYXJhbSBuYW1lPSJjb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImNsYXNzcGF0aCIvPgotICAgICAgPHBhcmFtIG5hbWU9Imphci5uYW1lIiB2YWx1ZT0iYXBpIi8+Ci0gICAgPC9hbnRjYWxsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtaW1wbCIgZGVzY3JpcHRpb249ImNvbXBpbGUgYW5kIGRlcGxveSBjb3JlIGltcGxlbWVudGF0aW9uIj4KLSAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLmltcGwiPgotICAgICAgPHBhdGggcmVmaWQ9ImNsYXNzcGF0aCIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9saWIiIGluY2x1ZGVzPSJsZW55YS0qLWFwaS5qYXIiLz4KLSAgICA8L3BhdGg+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJjb21waWxlLXNyYyI+Ci0gICAgICA8cGFyYW0gbmFtZT0iY29tcGlsZS5zcmMuZGlyIiB2YWx1ZT0iJHtzcmMuamF2YS5pbXBsLmRpcn0iLz4KLSAgICAgIDxwYXJhbSBuYW1lPSJjb21waWxlLmRlc3QuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2ltcGwiLz4KLSAgICAgIDxwYXJhbSBuYW1lPSJjb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImNsYXNzcGF0aC5pbXBsIi8+Ci0gICAgICA8cGFyYW0gbmFtZT0iamFyLm5hbWUiIHZhbHVlPSJpbXBsIi8+Ci0gICAgPC9hbnRjYWxsPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gCi0gIFRoaXMgdGFyZ2V0IGNyZWF0ZXMgYSB3ZWJhcHAgZGlyZWN0b3J5IHdoaWNoIGV4YWN0bHkgbWlycm9ycyBob3cKLSAgdGhlIHdhciBmaWxlIHdpbGwgbG9vay4gSXQgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHdhciBmaWxlIGZvcgotICB0aGUgIndhciIgdGFyZ2V0IGJ1dCBpdCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRldmVsb3BlcnMKLSAgZGlyZWN0bHkuCi0gIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSByZWxvYWRhYmxlIGF0dHJpYnV0ZSBvZiB0aGUgY29udGV4dAotICBpbiB0aGUgc2VydmVyLnhtbCBjb25maWd1cmF0aW9uIGlzIHNldCB0byB0cnVlIHNvIGNoYW5nZXMgaW4gdGhlIGNsYXNzZXMKLSAgYXJlIHJlZmxlY3RlZCBpbW1lZGlhdGVseS4KLSAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0id2ViYXBwIiBkZXBlbmRzPSJwcmVwYXJlLXNyYyIKLSAgICAgIGRlc2NyaXB0aW9uPSJCdWlsZHMgdGhlIHdlYmFwcCBkaXJlY3RvcnkgcmVhZHkgdG8gYmUgbGlua2VkIGludG8gYSBzZXJ2bGV0IGVuZ2luZXMgY29udGV4dCBkaXJlY3RvcnkiPiAgCi0gICAgPCEtLQotICAgIENvcHkgQ01TIGZpbGVzIGFuZCBvdmVyd3JpdGUgc29tZSBwYXJ0cyBvZiB0aGUgcHJldmlvdXNseSBjb3BpZWQgY29jb29uIHdlYmFwcCBwYWNrYWdlIHdpdGggb3VyIGN1c3RvbWl6ZWQgZmlsZXMKLSAgICAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC53ZWJhcHB9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMud2ViYXBwLmRpcn0iPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsZW55YS9jb25maWcvY29jb29uLXhjb25mLyoqIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImxlbnlhL2NvbmZpZy9zaXRlbWFwLyoqIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotCi0gICAgPCEtLSBDb3B5IHB1YmxpY2F0aW9ucyAtLT4KLSAgICA8Y29weVB1YnMgdG9kaXI9IiR7YnVpbGQud2ViYXBwfS9sZW55YS9wdWJzIgotICAgICAgcHVic3Jvb3RkaXJzPSIke3B1YnMucm9vdC5kaXJzfSIKLSAgICAgIGV4Y2x1ZGVzPSJDVlMsLnN2bixjb2Nvb24teGNvbmYsbGVueWEtcm9sZXMsbG9jYWwucHVibGljYXRpb24ueG1sLGxvY2FsLmFjLnhjb25mLC5wcm9qZWN0Ii8+Ci0gICAgPGppbmcgcm5nZmlsZT0iJHtzcmMucmVzb3VyY2UuZGlyfS9idWlsZC9wdWJsaWNhdGlvbi5ybmciPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLndlYmFwcH0iIGluY2x1ZGVzPSJsZW55YS9wdWJzLyovY29uZmlnL3B1YmxpY2F0aW9uLnhtbCIvPgotICAgIDwvamluZz4KLSAgICA8amluZyBybmdmaWxlPSIke3NyYy5yZXNvdXJjZS5kaXJ9L2J1aWxkL3dvcmtmbG93LnJuZyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQud2ViYXBwfSIgaW5jbHVkZXM9ImxlbnlhL3B1YnMvKi9jb25maWcvd29ya2Zsb3cvd29ya2Zsb3cueG1sIi8+ICAgIAotICAgIDwvamluZz4KLSAgICAKLSAgICA8YnVsa0NvcHkgCi0gICAgICBzb3VyY2VkaXJzPSIke3B1YnMucm9vdC5kaXJzfSIgCi0gICAgICB0b2Rpcj0iJHtidWlsZC5wYXRjaH0vY29jb29uLXhjb25mL3B1YnMiCi0gICAgICBmbGF0dGVuPSJmYWxzZSI+Ci0gICAgICA8ZmlsZXNldCBpbmNsdWRlcz0iY29uZmlnL2NvY29vbi14Y29uZi8qKi54Y29uZiIvPgotICAgICAgPGZpbGVzZXQgaW5jbHVkZXM9IiovY29uZmlnL2NvY29vbi14Y29uZi8qKi54Y29uZiIvPgotICAgIDwvYnVsa0NvcHk+Ci0gICAgCi0gICAgPGJ1bGtDb3B5IAotICAgICAgc291cmNlZGlycz0iJHtwdWJzLnJvb3QuZGlyc30iIAotICAgICAgdG9kaXI9IiR7YnVpbGQucGF0Y2h9L2xlbnlhLXJvbGVzL3B1YnMiCi0gICAgICBmbGF0dGVuPSJmYWxzZSI+Ci0gICAgICA8ZmlsZXNldCBpbmNsdWRlcz0iY29uZmlnL2xlbnlhLXJvbGVzLyoqLnhyb2xlcyIvPgotICAgICAgPGZpbGVzZXQgaW5jbHVkZXM9IiovY29uZmlnL2xlbnlhLXJvbGVzLyoqLnhyb2xlcyIvPgotICAgIDwvYnVsa0NvcHk+Ci0gICAgCi0gICAgPCEtLSBjb3B5IHBhdGNoIGZpbGVzIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLnBhdGNofSIgZmxhdHRlbj0iZmFsc2UiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy53ZWJhcHAuZGlyfS9sZW55YS9jb25maWciPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb2Nvb24teGNvbmYvKiovKi54Y29uZiIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb2Nvb24teGNvbmYvKi54Y29uZiIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJzaXRlbWFwLyoqLyoueG1hcCIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJzaXRlbWFwLyoueG1hcCIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgICAKLSAgICA8IS0tIFBhdGNoIHB1YmxpY2F0aW9uIHRlc3RzIC0tPgotICAgIDxjb3B5IGZpbGU9Ii4vc3JjL3RhcmdldHMvcHVibGljYXRpb24tdGVzdC1idWlsZC10ZW1wbGF0ZS54bWwiCi0gICAgICAgICAgdG9maWxlPSIuL3NyYy90YXJnZXRzL3B1YmxpY2F0aW9uLXRlc3QtYnVpbGQueG1sIgotICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICAgIDx4cGF0Y2ggZmlsZT0iLi9zcmMvdGFyZ2V0cy9wdWJsaWNhdGlvbi10ZXN0LWJ1aWxkLnhtbCIKLSAgICAgICAgICAgIHNyY2Rpcj0iJHtidWlsZC53ZWJhcHB9L2xlbnlhL3B1YnMiIAotICAgICAgICAgICAgaW5jbHVkZXM9IiovdGFyZ2V0cy90ZXN0LWJ1aWxkLnhjb25mIgotICAgICAgICAgICAgYWRkQ29tbWVudHM9InRydWUiLz4KLQotICAgIDwhLS0gbm93IGNyZWF0ZSBsb2dzIGRpcmVjdG9yeSwgd2hlcmUgbG9nNGogY2FuIHdyaXRlIHRvIC0tPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2xvZ3MiLz4KLSAgICAKLSAgICA8IS0tIG5vdyBjb3B5IGFueSBhZGRpdGlvbmFsIGxpYnJhcmllcyBpbiAuL2xpYiAtLT4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9saWIiLz4KLQotICAgIDwhLS0gQ29weSBsaWJyYXJpZXMgZnJvbSAke2xpYi5kaXJ9IGFuZCAke3Rvb2xzLmxpYi5kaXJ9IHRvICR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2xpYiAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b29scy5saWIuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0KLSAgICA8IS0tIG5vdyBjcmVhdGUgZGlyZWN0b3J5IGZvciBlbmRvcnNlZCBsaWJyYXJpZXMgLS0+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliL2VuZG9yc2VkIi8+Ci0KLSAgICA8IS0tIENvcHkgbGlicmFyaWVzIGZyb20gJHtlbmRvcnNlZC5saWIuZGlyfSBhbmQgJHtjb2Nvb24uZW5kb3JzZWQubGliLmRpcn0gdG8gJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliL2VuZG9yc2VkIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLndlYmFwcH0vV0VCLUlORi9saWIvZW5kb3JzZWQiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2NvY29vbi5lbmRvcnNlZC5saWIuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0KLSAgICA8IS0tIERlbGV0ZSBlbmRvcnNlZCBsaWJyYXJpZXMgZnJvbSBjb21tb24gd2ViYXBwIGxpYiBkaXJlY3RvcnkgLS0+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliIj4KLSAgICAgICAgPHByZXNlbnQgcHJlc2VudD0iYm90aCIgdGFyZ2V0ZGlyPSIke2NvY29vbi5lbmRvcnNlZC5saWIuZGlyfSIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvZGVsZXRlPgotCi0gICAgPGFudGNhbGwgdGFyZ2V0PSJjb21waWxlLWFwaSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcGlsZS1pbXBsIi8+Ci0gICAgCi0gICAgPCEtLQotICAgIDxhbnRjYWxsIHRhcmdldD0iZGVwbG95LW1vZHVsZXMiLz4KLSAgICAtLT4KLQotICAgIDwhLS0gUGF0Y2ggc2l0ZW1hcC54bWFwIC0tPgotICAgIDx4cGF0Y2ggZmlsZT0iJHtidWlsZC53ZWJhcHB9L3NpdGVtYXAueG1hcCIKLSAgICAgIHNyY2Rpcj0iJHtidWlsZC5wYXRjaH0vc2l0ZW1hcCIgCi0gICAgICBpbmNsdWRlcz0iKiovKi54bWFwIgotICAgICAgYWRkQ29tbWVudHM9ImZhbHNlIi8+Ci0gICAgCi0gICAgPCEtLSBQYXRjaCBjb2Nvb24ueGNvbmYgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9InBhdGNoLndlYmFwcCIgdmFsdWU9InRydWUiLz4KLSAgICA8eHBhdGNoIGZpbGU9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2NvY29vbi54Y29uZiIKLSAgICAgIHNyY2Rpcj0iJHtidWlsZC5wYXRjaH0vY29jb29uLXhjb25mIiAKLSAgICAgIGluY2x1ZGVzPSJwcmVwYXJlLyoueGNvbmYiCi0gICAgICBhZGRDb21tZW50cz0idHJ1ZSIvPgotICAgIDx4cGF0Y2ggZmlsZT0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvY29jb29uLnhjb25mIgotICAgICAgc3JjZGlyPSIke2J1aWxkLnBhdGNofS9jb2Nvb24teGNvbmYiIAotICAgICAgaW5jbHVkZXM9IioqLyoueGNvbmYiCi0gICAgICBleGNsdWRlcz0icHJlcGFyZS8qLnhjb25mIgotICAgICAgYWRkQ29tbWVudHM9ImZhbHNlIi8+Ci0gICAgCi0gICAgPGFudGNhbGwgdGFyZ2V0PSJkZXBsb3ktbW9kdWxlcyIvPgotICAgICAgCi0gICAgPHBhdGggaWQ9ImNsYXNzcGF0aC5wdWJzIj4KLSAgICAgIDxwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliIiBpbmNsdWRlcz0ibGVueWEtKi1hcGkuamFyIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2xpYiIgaW5jbHVkZXM9ImxlbnlhLW1vZHVsZS0qLmphciIvPgotICAgIDwvcGF0aD4KLSAgICAKLSAgICA8IS0tIGNvbXBpbGUgYW5kIHBhY2thZ2UgcHVibGljYXRpb25zIC0tPgotICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcGlsZS1zcmMiPgotICAgICAgPHBhcmFtIG5hbWU9ImNvbXBpbGUuc3JjLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9qYXZhL3B1YnMiLz4KLSAgICAgIDxwYXJhbSBuYW1lPSJjb21waWxlLmRlc3QuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3B1YnMiLz4KLSAgICAgIDxwYXJhbSBuYW1lPSJjb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImNsYXNzcGF0aC5wdWJzIi8+Ci0gICAgICA8cGFyYW0gbmFtZT0iamFyLm5hbWUiIHZhbHVlPSJwdWJzIi8+Ci0gICAgPC9hbnRjYWxsPgotICAgIAotICAgIDwhLS0gUGF0Y2ggbGVueWEucm9sZXMgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQud2ViYXBwfS9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YSIKLSAgICAgIGZpbGU9IiR7YnVpbGQuZGlyfS9pbXBsL29yZy9hcGFjaGUvbGVueWEvbGVueWEucm9sZXMiLz4KLSAgICAgIAotICAgIDwhLS0gQ29weSBkYXRhYmFzZSBmaWxlcyB0byAke2J1aWxkLndlYmFwcH0vV0VCLUlORi9kYiAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvZGIiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kYXRhYmFzZS5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKiIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgCQotICAgIDwhLS0gUmVwbGFjZSB2ZXJzaW9uIHBsYWNlaG9sZGVyIHdpdGggYnVpbGQgdmVyc2lvbiAtLT4KLSAgICA8cmVwbGFjZSBkaXI9IiR7YnVpbGQud2ViYXBwfSI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSJsZW55YS9jb250ZW50L3dlbGNvbWUueG1sIi8+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSJsZW55YS9jb250ZW50L2Fib3V0LnhtbCIvPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovY29uZmlnL3B1YmxpY2F0aW9uLnhtbCIvPgotICAgICAgPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBsZW55YS52ZXJzaW9uQCIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgIDxyZXBsYWNlZmlsdGVyIHRva2VuPSJAbGVueWEucmV2aXNpb25AIiB2YWx1ZT0iJHtsZW55YS5yZXZpc2lvbn0iLz4KLSAgICA8L3JlcGxhY2U+Ci0KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzZXJ2bGV0LmVuZ2luZS50b21jYXQiPgotICAgICAgPGVxdWFscyBhcmcxPSIke3dlYi5hcHAuc2VydmVyfSIgYXJnMj0iVG9tY2F0Ii8+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJpbnN0YWxsLXRvbWNhdCIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0ic3VjY2Vzc2Z1bGx5LWJ1aWx0LW1lc3NhZ2UtdG9tY2F0Ii8+Ci0KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzZXJ2bGV0LmVuZ2luZS5qZXR0eSI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7d2ViLmFwcC5zZXJ2ZXJ9IiBhcmcyPSJKZXR0eSIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxhbnRjYWxsIHRhcmdldD0ic3VjY2Vzc2Z1bGx5LWJ1aWx0LW1lc3NhZ2UtamV0dHkiLz4KLQotICA8L3RhcmdldD4KLQotICAKLSAgPCEtLQotICBUaGUgd2FyIHRhcmdldCBqdXN0IHBhY2tzIHVwIHdoYXQgd2FzIGNyZWF0ZWQgaW4gdGhlIHdlYmFwcCB0YXJnZXQKLSAgKGFuZCB0cmlnZ2VycyB0aGUgamF2YWRvYyB0YXJnZXQgd2l0aCB0aGUgZGVwZW5kZW5jeSkKLSAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0id2FyIiBkZXBlbmRzPSJ3ZWJhcHAiIGRlc2NyaXB0aW9uPSJCdWlsZHMgdGhlIGRlcGxveWFibGUgd2FyIGZpbGUiPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5iaW4uZGlyfSIvPgotICAgIDxqYXIgamFyZmlsZT0iJHtkaXN0LmJpbi53YXJmaWxlfSIgYmFzZWRpcj0iJHtidWlsZC53ZWJhcHB9IiBleGNsdWRlcz0iTUVUQS1JTkYvTUFOSUZFU1QuTUYiLz4KLSAgICA8ZWNobz4KLVRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIG11c3QgYmUgcGxhY2VkIGluIHRoZSBlbmRvcnNlZCBsaWJyYXJ5IGRpcmVjdG9yeSBmb3IgeW91ciBkZXBsb3ltZW50LgotKiBqYWthcnRhLWJjZWwtMjAwNDAzMjkuamFyCi0qIGpha2FydGEtcmVnZXhwLTEuMy5qYXIKLSogeGFsYW4tMi42LjAuamFyCi0qIHhlcmNlc0ltcGwtMi42LjIuamFyCi0qIHhtbC1hcGlzLmphcgotICAgIDwvZWNobz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBDbGVhbiBUb21jYXQgZGlyZWN0b3JpZXMgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4tdG9tY2F0IiBkZXNjcmlwdGlvbj0iQ2xlYW4gYWxzbyB0aGUgc2VydmxldCBlbmdpbmUgY29udGV4dCBvZiBUb21jYXQiIGlmPSJzZXJ2bGV0LmVuZ2luZS50b21jYXQiPgotICAgIDxlY2hvPklORk86IENsZWFuIFRvbWNhdCBjb250ZXh0IGFuZCBjYWNoZTogJHt0b21jYXQud2ViYXBwcy5kaXJ9LCAke3RvbWNhdC5jYWNoZS5kaXJ9PC9lY2hvPgotICAgIDxkZWxldGUgZGlyPSIke3RvbWNhdC5jYWNoZS5kaXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxkZWxldGUgaW5jbHVkZUVtcHR5RGlycz0idHJ1ZSIgcXVpZXQ9InRydWUiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC53ZWJhcHBzLmRpcn0iIGV4Y2x1ZGVzPSIke3RhcmdldC5yZXNldC5leGNsdWRlc30iIC8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gQ2xlYW5zIHRoZSBMZW55YSBidWlsZCBkaXJlY3RvcnksIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0YXJnZXQucmVzZXQuZXhjbHVkZXMgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJDbGVhbnMgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnJvb3R9Ii8+IDwhLS0gQ3JlYXRlIGRpciBzdWNoIHRoYXQgYnVpbGQgcHJvY2VzcyBkb2VzIG5vdCBmYWlsIGlmIGJ1aWxkIGRpciBkb2VzIG5vdCBleGlzdCAtLT4KLSAgICA8ZGVsZXRlIGluY2x1ZGVFbXB0eURpcnM9InRydWUiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLnJvb3R9IiBleGNsdWRlcz0iJHt0YXJnZXQucmVzZXQuZXhjbHVkZXN9IiAvPgotICAgIDwvZGVsZXRlPgotICAgIDxkZWxldGUgZGlyPSIke2Rpc3Qucm9vdH0iLz4KLQotICAgIDxjb25kaXRpb24gcHJvcGVydHk9InNlcnZsZXQuZW5naW5lLnRvbWNhdCI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7d2ViLmFwcC5zZXJ2ZXJ9IiBhcmcyPSJUb21jYXQiLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuLXRvbWNhdCIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIENsZWFucyB0aGUgQ29jb29uIGJ1aWxkIGRpcmVjdG9yeSBhbmQgdGhlIGxvY2FsLnAqIGZpbGVzIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWNvY29vbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkNsZWFucyBDb2Nvb24iPgotICAgIDxlY2hvPklORk86IENsZWFuIENvY29vbjogJHtjb2Nvb24uc3JjLmRpcn0vYnVpbGQ8L2VjaG8+Ci0gICAgPGRlbGV0ZSBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIiBxdWlldD0idHJ1ZSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7Y29jb29uLnNyYy5kaXJ9L2J1aWxkIi8+Ci0gICAgPC9kZWxldGU+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke2NvY29vbi5zcmMuZGlyfS9sb2NhbC5idWlsZC5wcm9wZXJ0aWVzIiBxdWlldD0idHJ1ZSIvPgotICAgIDxkZWxldGUgZmlsZT0iJHtjb2Nvb24uc3JjLmRpcn0vbG9jYWwuYmxvY2tzLnByb3BlcnRpZXMiIHF1aWV0PSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gQ2xlYW5zIHRoZSBidWlsZCBmaWxlcyBvZiBMZW55YSwgQ29jb29uIGFuZCBUb21jYXQgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW4tYWxsIiBkZXBlbmRzPSJjbGVhbiwgY2xlYW4tY29jb29uIiBkZXNjcmlwdGlvbj0iQ2xlYW5zIExlbnlhIGFuZCBDb2Nvb24iLz4KLQotICA8IS0tIEluc3RhbGwgdGhlIHdlYmFwcCBpbnRvIFRvbWNhdCAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLXRvbWNhdCIgZGVzY3JpcHRpb249Ikluc3RhbGwgdGhlIHdlYmFwcCBpbnRvIFRvbWNhdCBzZXJ2bGV0IGVuZ2luZSBjb250ZXh0IiBpZj0ic2VydmxldC5lbmdpbmUudG9tY2F0Ij4KLSAgICA8IS0tIENvcHkgRnJvbSBidWlsZC53ZWJhcHA9JHtidWlsZC53ZWJhcHB9IFRvIHRvbWNhdC53ZWJhcHBzLmRpcj0ke3RvbWNhdC53ZWJhcHBzLmRpcn0gLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LndlYmFwcHMuZGlyfSIgZmlsdGVyaW5nPSJvZmYiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLndlYmFwcH0iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8IS0tIENvcHkgZW5kb3JzZWQgbGlicmFyaWVzIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5lbmRvcnNlZC5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC53ZWJhcHB9L1dFQi1JTkYvbGliL2VuZG9yc2VkIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0KLSAgPC90YXJnZXQ+Ci0KLQotCi0KLSAgPCEtLSBJbnN0YWxsIHB1YmxpY2F0aW9uIC0tPgotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtcHViIiBkZXBlbmRzPSJ3ZWJhcHAiIGRlc2NyaXB0aW9uPSJJbnN0YWxsIGEgcHVibGljYXRpb24gaW50byBzZXJ2bGV0IGVuZ2luZSBjb250ZXh0LiBVc2FnZTogLURwdWIucHJlZml4PWJsb2ciPgotICAgIDwhLS0gQ29weSBGcm9tIGJ1aWxkLndlYmFwcD0ke2J1aWxkLndlYmFwcH0vbGVueWEvcHVicy8ke3B1Yi5wcmVmaXh9IFRvIHRvbWNhdC53ZWJhcHBzLmRpcj0ke3RvbWNhdC53ZWJhcHBzLmRpcn0vbGVueWEvcHVicy8ke3B1Yi5wcmVmaXh9IC0tPgotICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC53ZWJhcHBzLmRpcn0vbGVueWEvcHVicy8ke3B1Yi5wcmVmaXh9IiBmaWx0ZXJpbmc9Im9mZiI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQud2ViYXBwfS9sZW55YS9wdWJzLyR7cHViLnByZWZpeH0iIGV4Y2x1ZGVzPSIke3RhcmdldC5pbnN0YWxsLmV4Y2x1ZGVzfSIvPgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBSZWxvYWQgVG9tY2F0IC0tPgotICA8dGFyZ2V0IG5hbWU9InJlbG9hZCI+Ci0gICAgPCEtLSBGb3IgVG9tY2F0IFRhc2tzIC0tPgotICAgIDxwYXRoIGlkPSJ0b21jYXQuY2xhc3NwYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC53ZWJhcHBzLmRpcn0vLi4vLi4vc2VydmVyL2xpYiIgCi0gICAgICAgICAgICBpbmNsdWRlcz0iY2F0YWxpbmEtYW50LmphciIgLz4KLSAgICA8L3BhdGg+Ci0gICAgPHRhc2tkZWYgbmFtZT0icmVsb2FkIiAKLSAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5SZWxvYWRUYXNrIgotICAgICAgICBjbGFzc3BhdGhyZWY9InRvbWNhdC5jbGFzc3BhdGgiIC8+IAotICAgIDxyZWxvYWQKLSAgICAJCXVybD0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIiCi0gICAgCQl1c2VybmFtZT0idXNlciIKLSAgICAJCXBhc3N3b3JkPSJwYXNzd29yZCIKLSAgICAJICBwYXRoPSIvbGVueWEiLz4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvcGVyZmllbGRjb25mLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9wZXJmaWVsZGNvbmYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTI5OTc5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9wZXJmaWVsZGNvbmYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tIGFsbG93IHRvIGFuYWx5emUgbXVsdGktbGFuZ2FnZSBkb2N1bWVudHM+IC0tPgotICA8Y29uZmlnIGRlZmF1bHRBbmFseXplcj0ic3RvcHdvcmRfZnIiPgotCQk8ZmllbGQgbmFtZT0iZGVzY3JpcHRpb25fZW4iIGFuYWx5emVyPSJzdG9wd29yZF9lbiIvPgotCQk8ZmllbGQgbmFtZT0ic3ViamVjdCIgYW5hbHl6ZXI9InN0b3B3b3JkX2VuIi8+Ci0gIDwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL0RhbmlzaF9kYS54bWwgYi90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvRGFuaXNoX2RhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4Y2M3Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvRGFuaXNoX2RhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxzdG9wd29yZHM+Ci0gIDxzdG9wd29yZD5hZjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbGRyaWc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxsZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbHRpZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iYWd2ZWQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmR1PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVmdGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVsbGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVuZG51PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmV0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmZqZXJudDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5mb3I8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Zm9yYW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZnJhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmbDpTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZW5uZW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Z29kPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aG9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhvdmZvcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5odW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aHVydGlnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmh2YWQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aHZlbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5odm9uw6VyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmh2b3I8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aHZvcmRhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5odm9yaGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aW1vZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZWc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bGFuZ3NvbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5saWR0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1hbmdlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1lZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZWdldDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZWxsZW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5taW5kcmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bcOlc2tlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5lZGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmVqPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5vazwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5udTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uw6VyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9nPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9wcGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cMOlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnJhc2s8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2FtbWVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRlbW1lbGlnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRpbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51ZGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVkZW5mb3I8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dW5kZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmVkPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZpPC9zdG9wd29yZD4KLTwvc3RvcHdvcmRzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL0R1dGNoX25sLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9EdXRjaF9ubC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNzkyYTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL0R1dGNoX25sLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08c3RvcHdvcmRzPgotICA8c3RvcHdvcmQ+YWFuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFhbmdhYW5kZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hYW5nZXppZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWNodGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFjaHRlcm5hPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFmZ2Vsb3Blbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbGRhYXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxkdXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxob2V3ZWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxpYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxsZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbGxlYmVpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsbGVlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbHNub2c8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWx0aWpkPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsdG9vczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbmRlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbmRlcmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YW5kZXJzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFuZGVyc3ppbnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmVoYWx2ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iZWhvdWRlbnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmVpZGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmVpZGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iZW5lZGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJlbnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmVwYWFsZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iZXRyZWZmZW5kZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iaWo8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmlubmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJpbm5lbmluPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJvdmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJvdmVuYWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Ym92ZW5kaWVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJvdmVuZ2Vub2VtZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ib3ZlbnN0YWFuZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ib3ZlbnZlcm1lbGQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YnVpdGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhYXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFhcmhlZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFhcmluPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhYXJuYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYWFybmV0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhYXJvbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYWFyb3A8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFhcnZhbmxhbmdzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGllPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRpa3dpamxzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRpdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kb29yPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRvb3JnYWFuZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kdXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWNodGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lZXJkYXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWVyZGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVlcmxhbmc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWVyc3Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWxrPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVsa2U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZW5pZzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbmlnc3ppbnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZW5rZWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXJkb29yPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmV2ZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXZlbmVlbnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXZlbndlbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nYXV3PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdlZHVyZW5kZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZWVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdlaGFkPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdla3VuZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZWxlZGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdlbGlqazwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZW1vZXRlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZW1vZ2VuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdld2Vlc3Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Z2V3b29uPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdld29vbndlZzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oYWFyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhhZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oYWRkZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGFyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oZWI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGViYmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhlYnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGVlZnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oZXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGllcmJlbmVkZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGllcmJvdmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhpajwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ob2U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aG9ld2VsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmh1bjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5odW5uZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pazwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pa3plbGY8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aW5taWRkZWxzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmluemFrZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZXplbGY8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+amlqPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmppanplbGY8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+am91PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmpvdXc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+am91d2U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+anVpc3Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+anVsbGllPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmthbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rbGFhcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rb248L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+a29uZGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmtyYWNodGVuczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rdW5uZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+a3VudDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5sYXRlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5saWV2ZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWFhcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tYWc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWV6ZWxmPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1pajwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5taWpuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1pam5lbnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWlqbmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1panplbGY8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWlzc2NoaWVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1vY2h0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1vY2h0ZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bW9lc3Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bW9lc3Rlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tb2V0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1vZXRlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tb2dlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uYWFyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5hZGF0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5ldDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uaWV0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5vY2g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bm9nPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5vZ2FsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm51PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9mPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9mc2Nob29uPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9tPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9tZGF0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9taG9vZzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vbWxhYWc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b21zdHJlZWtzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9tdHJlbnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b212ZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b25kZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b25kZXJ0dXNzZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b25nZXZlZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b25zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9uc3plbGY8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b256ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vb2s8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b3A8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b3BuaWV1dzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vcHppajwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vdmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm92ZXJlaW5kPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm92ZXJpZ2Vuczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cHJlY2llczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5yZWVkczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5yb25kPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnJvbmRvbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZWRlcnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2luZHM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2luZHNkaWVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNsZWNodHM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c29tbWlnZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zcG9lZGlnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN0ZWVkczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50YW1lbGlqazwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50ZW56aWo8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGVyd2lqbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50aGFuczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50aWpkZW5zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRvY2g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dG9lbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50b2VubWFhbHM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dG9lbm1hbGlnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRvdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50b3RkYXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dHVzc2VuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVpdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51aXRnZXpvbmRlcmQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFhazwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52YW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFuZGFhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52YW51aXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFud2VnZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52ZWVsZWVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZlcmRlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52ZXJ2b2xnZW5zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZvbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52b2xnZW5zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZvb3I8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dm9vcmFmPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZvb3JhbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52b29yYWxzbm9nPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZvb3JiaWo8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dm9vcmRhdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52b29yZGV6ZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dm9vcmRpZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dm9vcmhlZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dm9vcm9wPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZvb3J1aXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dnJpajwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52cm9lZzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53YWFyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndhYXJvbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53YW5uZWVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndhbnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2FyZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2FzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndhdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53ZWVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndlZzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53ZWdlbnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2VsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndlbGRyYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53ZWxrPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndlbGtlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndpZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53aWVuczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53aWVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndpajwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53aWp6ZWxmPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnphbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56ZWxmczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56aWNoemVsZjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56aWo8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+emlqbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56aWpuZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56b2RyYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56b25kZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+em91PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnpvdWRlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56b3dhdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56dWxrZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56dWxsZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+enVsdDwvc3RvcHdvcmQ+Ci08L3N0b3B3b3Jkcz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9FbmdsaXNoX2VuLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9FbmdsaXNoX2VuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkZDE5Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvRW5nbGlzaF9lbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08c3RvcHdvcmRzPgotICA8c3RvcHdvcmQ+YTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hYm91dDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hZnRlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbGw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxzbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbmQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YW55PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iZWNhdXNlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJlZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YnV0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJ5PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jb3JwPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNvdWxkPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmZvcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5mcm9tPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhhZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGF2ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGlzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlmPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmluPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmluYzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pbnRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPml0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPml0czwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5sYXN0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1vcmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bW9zdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tcnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bXo8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bm88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bm90PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9mPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9uPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9uZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vbmx5PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9yPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm90aGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm91dDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vdmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2F5czwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zaGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c288L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c29tZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zdWNoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRoYW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGhhdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50aGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGhlaXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGhlcmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGhleTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50aGlzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVwPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53ZXJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndoZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2hpY2g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2hvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndpbGw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2l0aDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53b3VsZDwvc3RvcHdvcmQ+Ci08L3N0b3B3b3Jkcz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9GaW5uaXNoX2ZpLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9GaW5uaXNoX2ZpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlMzU5OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvRmlubmlzaF9maS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08c3RvcHdvcmRzPgotICA8c3RvcHdvcmQ+YWxsYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbnNpb3N0YTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5laGvDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5laTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbmVtbcOkbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbm5lbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ldGVzc2E8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Zjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oYWlra2k8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGl0YWFzdGk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aG9pa2Vpbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oeXZpbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ow6RuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlsbWFuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmphPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmpvczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qw6Rsa2Vlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rYW5zc2E8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+a2F1a2FuYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rZW50aWVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmtlc2tlbGzDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rZXNrZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+a29za2Fhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rdWlua2FuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmt1a2thPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmt5bGxpa3NpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmt5bGzDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5saWlhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5sbGE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bGxhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmx1b25hPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmzDpGhlbGzDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5sw6RwaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5taWtzaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5taWvDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5taWxsb2luPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1pbGxvaW5rYW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWluw6Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWlzc8OkPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1pdGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5vcGVhc3RpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm55dDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vaWtlYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vaWtlYWxsYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wYWxqb248L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2llbGzDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zaW7DpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zc2E8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c3RhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1b3JhYW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGFpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRha2FuYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50YWtpYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50YXJwZWVrc2k8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dMOkc3PDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51bGtvcHVvbGVsbGE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFoZW1tw6RuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZhc2VuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZhc2VubWFsbGE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFzdGFuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZpZWzDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52aWVyZXNzw6Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dsOkaMOkbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD55aGRlc3PDpDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD55bMO2czwvc3RvcHdvcmQ+Ci08L3N0b3B3b3Jkcz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9GcmVuY2hfZnIueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL0ZyZW5jaF9mci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjM3MDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL0ZyZW5jaF9mci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IS0tCi1Db250cmlidXRpb24gZGUgTmljbyBNYWlzb25uZXV2ZSwgbmljb29fQGhvdG1haWwuY29tLCAKLWNvbnN0cnVpdCDgIHBhcnRpciBkZSBsYSBsaXN0ZSBxdWUgbCdvbiB0cm91dmUgc3VyIGxlIHNpdGU6Ci1odHRwOi8vd3d3LnVuaW5lLmNoL0luZm8vY2xlZi8KLSAtLT4KLSAKLTxmcmVuY2ggdXNlU3RvcFdvcmRzPSJ0cnVlIiBrZWVwQWNjZW50cz0iZmFsc2UiPgotCi08c3RvcFdvcmRzPgotCTxzdG9wV29yZD5hPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+4Dwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPuI8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hYm9yZDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmFmaW48L3N0b3BXb3JkPgotCTxzdG9wV29yZD5haDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmFpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YWllPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YWluc2k8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hbGxhaWVudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmFsbG88L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hbGz0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YWxsb25zPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXBy6HM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hc3Nlejwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmF0dGVuZHU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hdTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmF1Y3VuPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXVjdW5lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXVqb3VyZDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmF1am91cmQnaHVpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXVxdWVsPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXVyYTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmF1cm9udDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmF1c3NpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXV0cmU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hdXRyZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hdXg8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hdXhxdWVsbGVzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXV4cXVlbHM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hdmFpZW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXZhaXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5hdmFpdDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmF2YW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXZlYzwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmF2b2lyPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YXlhbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5iPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YmFoPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YmVhdWNvdXA8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5iaWVuPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YmlncmU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5ib3VtPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+YnJhdm88L3N0b3BXb3JkPgotCTxzdG9wV29yZD5icnJyPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Yzwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPudhPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2FyPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2U8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jZWNpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2VsYTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlbGxlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2VsbGUtY2k8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jZWxsZS1s4Dwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlbGxlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlbGxlcy1jaTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlbGxlcy1s4Dwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlbHVpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2VsdWktY2k8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jZWx1aS1s4Dwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlcGVuZGFudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlcnRhaW48L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jZXJ0YWluZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlcnRhaW5lczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNlcnRhaW5zPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2VydGVzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2VzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2V0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2V0dGU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jZXV4PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2V1eC1jaTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNldXgtbOA8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jaGFjdW48L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jaGFxdWU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jaGVyPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2jocmU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jaOhyZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jaGVyczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNoZXo8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jaGljaGU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jaHV0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2k8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jbGFjPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y2xpYzwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNvbW1lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y29tbWVudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmNvbXByaXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jb25jZXJuYW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y29udHJlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Y291aWM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5jcmFjPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRhPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGFuczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGVib3V0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGVkYW5zPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGVob3JzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGVs4Dwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRlcHVpczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRlcnJp6HJlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGVzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZOhzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZOlzb3JtYWlzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGVzcXVlbGxlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRlc3F1ZWxzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGVzc291czwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRlc3N1czwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRldmFudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRldmVyczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRldnJhPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZGlyZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRpdmVyczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRpdmVyc2U8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5kaXZlcnNlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRvaXQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5kb2l2ZW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZG9uYzwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmRvbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5kcmluZzwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmR1PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZHVxdWVsPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZHVyYW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmVmZmV0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZWg8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5lbGxlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZWxsZS1t6m1lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZWxsZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5lbGxlcy1t6m1lczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmVuPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZW50cmU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5lbnZlcnM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5lbnZpcm9uPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD7oczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmVzdDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmV0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZXRhbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD7pdGFpZW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+6XRhaXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD7pdGFpdDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPul0YW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZXRjPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+6XTpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZXRyZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPup0cmU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5ldTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmV1aDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmV1eDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmV1eC1t6m1lczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmV4Y2VwdOk8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5mPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZmHnb248L3N0b3BXb3JkPgotCTxzdG9wV29yZD5mYWlzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZmFpc2FpZW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+ZmFpc2FudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmZhaXQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5mZXJvbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5maTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmZsYWM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5mbG9jPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+Zm9udDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmc8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5nZW5zPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmhhPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aOk8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5oZWluPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aOlsYXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5oZW08L3N0b3BXb3JkPgotCTxzdG9wV29yZD5oZXA8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5oaTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmhvPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aG9s4Dwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmhvcDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmhvcm1pczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmhvcnM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5ob3U8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5ob3VwPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aHVlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aHVpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aHVtPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aHVycmFoPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmlsPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aWxzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+aW1wb3J0ZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmo8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5qZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmp1c3F1PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+anVzcXVlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+azwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmw8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5sYTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmzgPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bGFxdWVsbGU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5sYXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5sZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmxlcXVlbDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmxlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmzoczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmxlc3F1ZWxsZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5sZXNxdWVsczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmxldXI8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5sZXVyczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmxvbmd0ZW1wczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPmxvcnNxdWU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5sdWk8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5sdWktbeptZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm08L3N0b3BXb3JkPgotCTxzdG9wV29yZD5tYTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm1haW50PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bWFpczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm1hbGdy6Twvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm1lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+beptZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm3qbWVzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bWVyY2k8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5tZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5taWVuPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bWllbm5lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bWllbm5lczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm1pZW5zPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bWlsbGU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5taW5jZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm1vaTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm1vaS1t6m1lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bW9pbnM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5tb248L3N0b3BXb3JkPgotCTxzdG9wV29yZD5tb3llbm5hbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5uPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bmE8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5uZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm7pYW5tb2luczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm5pPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bm9tYnJldXNlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm5vbWJyZXV4PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bm9uPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bm9zPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bm90cmU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5u9HRyZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm70dHJlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm5vdXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5ub3VzLW3qbWVzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bnVsPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+bzwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm88L3N0b3BXb3JkPgotCTxzdG9wV29yZD70PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+b2g8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vaOk8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vbOk8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vbGzpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+b248L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vcmU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vcjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm91PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+b/k8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vdWY8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vdWlhczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm91c3Q8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5vdXN0ZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPm91dHJlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBhZjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBhbjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBhcjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBhcm1pPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGFydGFudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBhcnRpY3VsaWVyPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGFydGljdWxp6HJlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGFydGljdWxp6HJlbWVudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBhczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBhc3PpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGVuZGFudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBlcnNvbm5lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGV1PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGV1dDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBldXZlbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5wZXV4PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGZmPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGZmdDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBmdXQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5waWY8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5wbGVpbjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBsb3VmPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cGx1czwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBsdXNpZXVyczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBsdXT0dDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBvdWFoPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cG91cjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBvdXJxdW9pPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cHLoczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnByb2NoZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnBzaXR0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cHVpc3F1ZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnE8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5xdTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnF1YW5kPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cXVhbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5xdWFudGE8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5xdWFudC3gLXNvaTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnF1ZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnF1ZWw8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5xdWVsY29ucXVlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cXVlbGxlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cXVlbGxlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnF1ZWxxdWU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5xdWVscXVlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnF1ZWxxdSd1bjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnF1ZWxzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cXVpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cXVpY29ucXVlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cXVvaTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnF1b2lxdWU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5yPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+cmV2b2ljaTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnJldm9pbOA8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5yaWVuPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+czwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNhPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c2FjcmVibGV1PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c2Fuczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNhcHJpc3RpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c2F1Zjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c2Vsb248L3N0b3BXb3JkPgotCTxzdG9wV29yZD5zZXB0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c2VyYTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNlcm9udDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNpPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c2llbjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNpZW5uZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNpZW5uZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5zaWVuczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNpbm9uPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c29pPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c29pLW3qbWU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5zb2l0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c29udDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnNvdXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5zdG9wPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+c3Vpczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnN1aXZhbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5zdXI8L3N0b3BXb3JkPgotCTxzdG9wV29yZD5zdXJ0b3V0PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRhPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dGFjPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dGFudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dOk8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50ZWw8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50ZWxsZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRlbGxlbWVudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRlbGxlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRlbHM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50ZW5hbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50ZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50aWM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50aWVuPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dGllbm5lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dGllbm5lczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRpZW5zPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dG9jPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dG9pPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dG9pLW3qbWU8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50b248L3N0b3BXb3JkPgotCTxzdG9wV29yZD50b3VjaGFudDwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRvdWpvdXJzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dG91czwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRvdXQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50b3V0ZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRvdXRlczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRy6HM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50cm9pczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRyb3A8L3N0b3BXb3JkPgotCTxzdG9wV29yZD50c29pbjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnRzb3Vpbjwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnR1PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnVuPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dW5lPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dW5lczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnVuczwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnY8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52YTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnZhaXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52YXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD526Twvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnZlcnM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52aWE8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52aWY8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52aWZzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dml2YXQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52aXZlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dml2ZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52bGFuPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dm9pY2k8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52b2ls4Dwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnZvbnQ8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52b3M8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52b3RyZTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnb0dHJlPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dvR0cmVzPC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+dm91czwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnZvdXMtbeptZXM8L3N0b3BXb3JkPgotCTxzdG9wV29yZD52dTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPnc8L3N0b3BXb3JkPgotCTxzdG9wV29yZD54PC9zdG9wV29yZD4KLQk8c3RvcFdvcmQ+eTwvc3RvcFdvcmQ+Ci0JPHN0b3BXb3JkPno8L3N0b3BXb3JkPgotCTxzdG9wV29yZD56dXQ8L3N0b3BXb3JkPgotPC9zdG9wV29yZHM+Ci0KLTwvZnJlbmNoPgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvR2VybWFuX2RlLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9HZXJtYW5fZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYwYzAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9HZXJtYW5fZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxzdG9wd29yZHM+Ci0gIDxzdG9wd29yZD5hYjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hYmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsbGVpbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbHM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxzbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hdWNoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmF1Zjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hdXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YXXDn2VyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJhbGQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmVpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJlaW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmluPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJpczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iaXN0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJpw59jaGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhYmVpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhZHVyY2g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFmw7xyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhZ2VnZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFoaW50ZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFtaXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFuYWNoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhbmViZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFubjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYXJhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYXJhdWY8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFyYXVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhcmluPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhcnVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhcnVudGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhcsO8YmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYXNzZWxiZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYXZvbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYXZvcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYXp1PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhendpc2NoZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGHDnzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZWluPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlaW5lPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlaW5lbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZWluZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVpbmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlaW5lczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVtc2VsYmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZW5uPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZXJzZWxiZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlc3NlbGJlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZXNzZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGljaDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kaWU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGllczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kaWVzZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kaWVzZWxiZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kaWVzZWxiZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGllc2VtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRpZXNlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kaWVzZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGllc2VzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRpcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kb2NoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRvcnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZHU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWJlbnNvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVoZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5laW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWluZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5laW5lbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5laW5lbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5laW5lcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5laW5lczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbnRsYW5nPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmV0d2E8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXR3YXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXVjaDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ldWVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmV1cmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXVyZW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXVyZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXVyZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXVyZXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZsO8cjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5mw7xyczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nYW56PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdhcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZWdlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZW5hdTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZXdlc2VuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oZXJlaW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGVydW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGluPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhpbnRlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oaW50ZXJuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmljaDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5paG08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aWhuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlobmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlocjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5paHJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlocmVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlocmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlocmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlocmVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmltPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmluPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlzdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZWRlc21hbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZWRvY2g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+amVuZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZW5lbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZW5lbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZW5lcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5qZW5lczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rYXVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmtlaW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+a2VpbmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+a2VpbmVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmtlaW5lbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rZWluZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+a2VpbmVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1hbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZWhyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1laW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVpbmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVpbmVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1laW5lbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZWluZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVpbmVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1pY2g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWlyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1pdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uYWNoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5hY2hkZW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmViZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmVpbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uaWNodDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uaWNodHM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bm9jaDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5udW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bnVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm7DpG1saWNoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9iPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9iZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b2JnbGVpY2g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b2Rlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vaG5lPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnBhYXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2Vocjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZWk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2Vpbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZWluZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZWluZW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2VpbmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNlaW5lcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZWluZXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2VpdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZWl0ZGVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNlbGJzdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zaWNoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNpZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zaW5kPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvZ2FyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvbGNoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvbGNoZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zb2xjaGVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvbGNoZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c29sY2hlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zb2xjaGVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvbmRlcm48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c29uc3Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c292aWVsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvd2VpdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51bTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51bmQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dW5zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVuc2VyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVuc3JlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVuc3JlbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51bnNyZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dW5zcmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVuc3Jlczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52b208L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dm9uPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZvcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53YXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2FydW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2FzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndlZ2VuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndlaWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2VpdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53ZWxjaGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2VsY2hlbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53ZWxjaGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndlbGNoZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2VsY2hlczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53ZW08L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2VuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndlbm48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2VyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndlc2hhbGI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d2Vzc2VuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPndpZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD53aXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d288L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d29taXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d8OkaHJlbmQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d8OkcmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+d8OkcmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnp1PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnp1bTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56dXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+endhcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56d2lzY2hlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD56d2lzY2hlbnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+w7xiZXI8L3N0b3B3b3JkPgotPC9zdG9wd29yZHM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvSXRhbGlhbl9pdC54bWwgYi90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvSXRhbGlhbl9pdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OGIxZDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL0l0YWxpYW5faXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxzdG9wd29yZHM+Ci0gIDxzdG9wd29yZD5hPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFmZmluY2jDqDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hZ2wnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFnbGk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxsJzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbGxhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsbGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxsbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbmNoZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbnppY2jDqDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hdmVyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iZW5zw6w8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Y2hlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNoaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jaW/DqDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jb21lPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNvbXVucXVlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNvbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jb250cm88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Y29zYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYWNow6g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFnbCc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFnbGk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGFpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRhbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYWxsJzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYWxsYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYWxsZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYWxsbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZWdsJzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZWdsaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZWk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlbGwnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlbGxlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlbGxvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRvcG88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZG92ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kdW5xdWU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZHVyYW50ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVnbGk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXBwdXJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVzc2VyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lc3NpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmZpbmNow6k8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Zmlubzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5mcmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Z2lhY2Now6g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Z2wnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdsaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ncmF6aWU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pbm9sdHJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmwnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmxhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmxlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmxvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmxvcm88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVudHJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1pbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uZWFuY2hlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5lZ2wnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5lZ2xpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5laTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uZWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmVsbCc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmVsbGE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmVsbGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmVsbG88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmVtbWVubzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uZXBwdXJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5vaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ub25jaMOoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5vbmRpbWVubzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ub3N0cm88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vbmRlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9wcHVyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vc3NpYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vdnZlcm88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnBlcmNow6g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cGVyY2nDsjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wZXLDsjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wb2ljaMOoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnByaW1hPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnB1cmNow6g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cXVhbmQnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnF1YW5kbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5xdWFudHVucXVlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnF1YXNpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnF1aW5kaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZWJiZW5lPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNlbm5vbmNow6g8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2VuemE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2VwcHVyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zaWNjb21lPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvcHJhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvdHRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1Yml0bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zdWdsJzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zdWdsaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zdWk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c3VsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1bGwnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1bGxhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1bGxlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1bGxvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50YWxjaMOoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnR1PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnR1bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50dXR0YXZpYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50dXR0aTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51bjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51bmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dW5vPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZvaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52b3N0cm88L3N0b3B3b3JkPgotPC9zdG9wd29yZHM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvTm9yd2VnaWFuX25vLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9Ob3J3ZWdpYW5fbm8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Y2Zjc1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9Ob3J3ZWdpYW5fbm8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxzdG9wd29yZHM+Ci0gIDxzdG9wd29yZD5hbGxlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFuZHJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFyYmVpZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hdjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5iZWdnZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ib3J0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJyYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5icnVrZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZW5uZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVyZXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGV0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRpbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kaXNzZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kdTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbGxlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZW5lc3RlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVuaHZlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbm48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Zm9sazwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5mb3I8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Zm9yZGk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Zm9yc8O4a2U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZnJhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmbDpTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5mw7hyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmbDuHJzdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nam9yZGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Z2rDuHJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmdvZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nw6U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGFkZGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGFuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhhbnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGVubmVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5odmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aHZlbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5odmVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmh2aWxrZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aHZpczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5odm9yPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmh2b3JkYW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aHZvcmZvcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlra2U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aW5uPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmlubmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmthbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5rdW5uZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5sYWdlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmxhbmc8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bGlrPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmxpa2U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWFrdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tYW5nZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZWQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1lZ2V0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1lbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZW5zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1lcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZXN0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1pbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5teWU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bcOlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm3DpXRlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5hdm48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmVpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm55PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm7DpTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uw6VyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9nPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9nc8OlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9tPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9wcDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vc3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b3Zlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wYXJ0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnB1bmt0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnDDpTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5yZXR0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnJpa3RpZzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zYW1tZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zYW50PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNpZGVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNpc3Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2t1bGxlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNsaWs8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2x1dHQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c29tPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN0YXJ0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN0aWxsZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zw6U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGlkPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRpbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50aWxiYWtlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRpbHN0YW5kPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVuZGVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnV0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnV0ZW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZlZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52ZXJkaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52aTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52aWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmlsbGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dml0ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52w6VyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnbDpnJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnbDpnJ0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPsOlPC9zdG9wd29yZD4KLTwvc3RvcHdvcmRzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL1BvbGlzaF9wbC54bWwgYi90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvUG9saXNoX3BsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjOGQxNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvUG9saXNoX3BsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08c3RvcHdvcmRzPgotPHN0b3B3b3JkPmk8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnc8L3N0b3B3b3JkPgotPHN0b3B3b3JkPno8L3N0b3B3b3JkPgotPHN0b3B3b3JkPm88L3N0b3B3b3JkPgotPHN0b3B3b3JkPm5hPC9zdG9wd29yZD4KLTxzdG9wd29yZD5kbzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+YTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+amVzdDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+b2Q8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnByemV6PC9zdG9wd29yZD4KLTxzdG9wd29yZD50bzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+cG88L3N0b3B3b3JkPgotPHN0b3B3b3JkPnNpxJk8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmRsYTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+bmllPC9zdG9wd29yZD4KLTxzdG9wd29yZD5vcmF6PC9zdG9wd29yZD4KLTxzdG9wd29yZD5qYWs8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnphPC9zdG9wd29yZD4KLTxzdG9wd29yZD56ZTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+dHltPC9zdG9wd29yZD4KLTxzdG9wd29yZD5jbzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+cHJ6eTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+dGVnbzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+aWNoPC9zdG9wd29yZD4KLTxzdG9wd29yZD5hbGU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnR5bGtvPC9zdG9wd29yZD4KLTxzdG9wd29yZD5wb2Q8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnPEhTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+amVnbzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+amFrbzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+Y3p5PC9zdG9wd29yZD4KLTxzdG9wd29yZD7FvGU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnRhazwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+bWE8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnRlajwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+bHViPC9zdG9wd29yZD4KLTxzdG9wd29yZD50YWvFvGU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmplZG5hazwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+dGVuPC9zdG9wd29yZD4KLTxzdG9wd29yZD5qZWo8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmp1xbw8L3N0b3B3b3JkPgotPHN0b3B3b3JkPm5hZDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+dHljaDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+a3TDs3JlPC9zdG9wd29yZD4KLTxzdG9wd29yZD50ZTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+amVzemN6ZTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+YmFyZHpvPC9zdG9wd29yZD4KLTxzdG9wd29yZD5tb8W8ZTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+YmV6PC9zdG9wd29yZD4KLTxzdG9wd29yZD5pbm55Y2g8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmltPC9zdG9wd29yZD4KLTxzdG9wd29yZD5wcnplZDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+d3N6eXN0a2ljaDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+d2U8L3N0b3B3b3JkPgotPHN0b3B3b3JkPm1vxbxuYTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+a3TDs3J5Y2g8L3N0b3B3b3JkPgotPHN0b3B3b3JkPndzenlzdGtpbTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+csOzd25pZcW8PC9zdG9wd29yZD4KLTxzdG9wd29yZD5rdMOzcnk8L3N0b3B3b3JkPgotPHN0b3B3b3JkPm5hd2V0PC9zdG9wd29yZD4KLTxzdG9wd29yZD50ZcW8PC9zdG9wd29yZD4KLTxzdG9wd29yZD5zb2JpZTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+dHU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPm5pY2g8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmJ5xYJvPC9zdG9wd29yZD4KLTxzdG9wd29yZD5iecWCPC9zdG9wd29yZD4KLTxzdG9wd29yZD5ixJlkemllPC9zdG9wd29yZD4KLTxzdG9wd29yZD53aWVsdTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+Z288L3N0b3B3b3JkPgotPHN0b3B3b3JkPmdkeTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+d2llbGU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnRhPC9zdG9wd29yZD4KLTxzdG9wd29yZD5uYXM8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmFieTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+Z2R6aWU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmJvPC9zdG9wd29yZD4KLTxzdG9wd29yZD53acSZYzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+dGFtPC9zdG9wd29yZD4KLTxzdG9wd29yZD5rdMOzcnp5PC9zdG9wd29yZD4KLTxzdG9wd29yZD5rdMOzcmE8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmtpbGthPC9zdG9wd29yZD4KLTxzdG9wd29yZD5tacSZZHp5PC9zdG9wd29yZD4KLTxzdG9wd29yZD5uYXN6ZWdvPC9zdG9wd29yZD4KLTxzdG9wd29yZD5iecWCYTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+YmFyZHppZWo8L3N0b3B3b3JkPgotPHN0b3B3b3JkPnByemVkZTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+bmFtPC9zdG9wd29yZD4KLTxzdG9wd29yZD53c3p5c3Rrbzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+c3dvamU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmt0w7NyZWo8L3N0b3B3b3JkPgotPHN0b3B3b3JkPm5pxbw8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmN6eWxpPC9zdG9wd29yZD4KLTxzdG9wd29yZD56YXdzemU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmt0w7NyeW08L3N0b3B3b3JkPgotPHN0b3B3b3JkPnRha2llPC9zdG9wd29yZD4KLTxzdG9wd29yZD5ib3dpZW08L3N0b3B3b3JkPgotPHN0b3B3b3JkPm5pbTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+cG96YTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+d8WCYcWbbmllPC9zdG9wd29yZD4KLTxzdG9wd29yZD5pxbw8L3N0b3B3b3JkPgotPHN0b3B3b3JkPmJ5xYJ5PC9zdG9wd29yZD4KLTxzdG9wd29yZD5raWVkeTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+bW9nxIU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPm1pPC9zdG9wd29yZD4KLTxzdG9wd29yZD5rdMOzcmVnbzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+bW5pZTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+ZGxhdGVnbzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+bmFzenljaDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+amXFm2xpPC9zdG9wd29yZD4KLTwvc3RvcHdvcmRzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL1BvcnR1Z3Vlc2VfcHQueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL1BvcnR1Z3Vlc2VfcHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTAyMzE4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9Qb3J0dWd1ZXNlX3B0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxzdG9wd29yZHM+Ci0gIDxzdG9wd29yZD5hPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFiYWl4bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hZGlhbnRlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFnb3JhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsaTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbnRlczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hcXVpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmF0cmFzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmF0w6k8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmFzdGFudGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNvbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jb21vPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNvbnRyYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZWJhaXhvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlbWFpczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZXBvaXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVwcmVzc2E8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGV2YWdhcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kaXJlaXRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWxhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVsYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWxlczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbnRyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ldTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5mb3JhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmp1bnRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmxvbmdlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1haXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVub3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bXVpdG88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmluZ3VlbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5udW5jYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uw6NvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm7Ds3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b25kZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vdTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wYXJhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnBvcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wb3JxdWU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cG91Y288L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cHLDs3hpbW88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cXVhbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5xdWFuZG88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cXVhbnRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnF1ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5xdWVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNlbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zZW1wcmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2ltPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNvYjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zb2JyZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50YWx2ZXo8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dG9kYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dG9kb3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFnYXJvc2FtZW50ZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52b2PDqjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52b2PDqnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+w6psZTwvc3RvcHdvcmQ+Ci08L3N0b3B3b3Jkcz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9SdXNzaWFuX3J1LnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9SdXNzaWFuX3J1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlZGQ1NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvUnVzc2lhbl9ydS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzdG9wd29yZHM+Ci08c3RvcHdvcmQ+0LA8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtCx0LXQtzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LHQvtC70LXQtTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LHRizwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LHRi9C7PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QsdGL0LvQsDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LHRi9C70Lg8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtCx0YvQu9C+PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QsdGL0YLRjDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LI8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtCy0LDQvDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LLQsNE/PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QstC10T/RjDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LLQvjwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LLQvtGCPC9zdG9wd29yZD4KLTxzdG9wd29yZD7QstE/0LU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtCy0T/QtdCz0L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtCy0T/QtdGFPC9zdG9wd29yZD4KLTxzdG9wd29yZD7QstGLPC9zdG9wd29yZD4KLTxzdG9wd29yZD7Qs9C00LU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC00LA8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC00LDQttC1PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QtNC70T88L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC00L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC10LPQvjwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LXQtTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LXRP9C70Lg8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC10T/RgtGMPC9zdG9wd29yZD4KLTxzdG9wd29yZD7QtdGJ0LU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC20LU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC30LA8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC30LTQtdE/0Yw8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC4PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QuNC3PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QuNC70Lg8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC40Lw8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC40YU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC6PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QutCw0Lo8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC60L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC60L7Qs9C00LA8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC60YLQvjwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LvQuDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LvQuNCx0L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC80L3QtTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LzQvtC20LXRgjwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0LzRizwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0L3QsDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0L3QsNC00L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC90LDRiDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0L3QtTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0L3QtdCz0L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC90LXQtTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0L3QtdGCPC9zdG9wd29yZD4KLTxzdG9wd29yZD7QvdC4PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QvdC40YU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC90L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC90YM8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC+PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QvtCxPC9zdG9wd29yZD4KLTxzdG9wd29yZD7QvtC00L3QsNC60L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC+0L08L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC+0L3QsDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0L7QvdC4PC9zdG9wd29yZD4KLTxzdG9wd29yZD7QvtC90L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC+0YI8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC+0YfQtdC90Yw8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC/0L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtC/0L7QtDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0L/RgNC4PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RPzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0T/Qvjwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0YLQsNC6PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RgtCw0LrQttC1PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RgtCw0LrQvtC5PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RgtCw0Lw8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtGC0LU8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtGC0LXQvDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0YLQvjwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0YLQvtCz0L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtGC0L7QttC1PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RgtC+0Lk8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtGC0L7Qu9GM0LrQvjwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0YLQvtC8PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RgtGLPC9zdG9wd29yZD4KLTxzdG9wd29yZD7Rgzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0YPQttC1PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RhdC+0YLRPzwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0YfQtdCz0L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtGH0LXQuTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0YfQtdC8PC9zdG9wd29yZD4KLTxzdG9wd29yZD7Rh9GC0L48L3N0b3B3b3JkPgotPHN0b3B3b3JkPtGH0YLQvtCx0Ys8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtGH0YzQtTwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0YfRjNE/PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RP9GC0LA8L3N0b3B3b3JkPgotPHN0b3B3b3JkPtE/0YLQuDwvc3RvcHdvcmQ+Ci08c3RvcHdvcmQ+0T/RgtC+PC9zdG9wd29yZD4KLTxzdG9wd29yZD7RPzwvc3RvcHdvcmQ+PC9zdG9wd29yZHM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvU3BhbmlzaF9lcy54bWwgYi90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvYW5hbHl6ZXIvc3RvcHdvcmQvU3BhbmlzaF9lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNDU2NzUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL1NwYW5pc2hfZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxzdG9wd29yZHM+Ci0gIDxzdG9wd29yZD5hPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFjw6E8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWjDrTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hamVuYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hamVuYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWplbm88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWplbm9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsZ288L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxndW5hPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsZ3VuYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxndW5vPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsZ3Vub3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxnw7puPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsbMOhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsbMOtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFxdWVsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFxdWVsbGE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YXF1ZWxsYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YXF1ZWxsbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hcXVlbGxvczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hcXXDrTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jYWRhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNpZXJ0YTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jaWVydGFzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNpZXJ0bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jaWVydG9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNvbW88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Y29uPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmNvbm1pZ288L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Y29uc2lnbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jb250aWdvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmN1YWxxdWllcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jdWFscXVpZXJhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmN1YWxxdWllcmFzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmN1YW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Y3VhbnRhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmN1YW50YXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Y3VhbnRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmN1YW50b3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Y3XDoW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+Y3XDoW50YTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jdcOhbnRhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5jdcOhbnRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmN1w6FudG9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmPDs21vPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlamFyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZW1hc2lhZGE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVtYXNpYWRhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZW1hc2lhZG88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVtYXNpYWRvczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZW3DoXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZWxsYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbGxhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbGxvczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lc2E8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXNhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lc2U8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXNvczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lc3RhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVzdGFyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVzdGFzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVzdGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZXN0b3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGFjZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGFzdGE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+amFtw6FzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmp1bnRvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmp1bnRvczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5sYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5sYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bG88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bG9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1hczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZW5vczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5taWVudHJhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5taXNtYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5taXNtYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWlzbW88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWlzbW9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm11Y2hhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm11Y2hhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tdWNobzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tdWNob3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bXVjaMOtc2ltYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tdWNow61zaW1hczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tdWNow61zaW1vPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm11Y2jDrXNpbW9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm11eTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tw6FzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm3DrWE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bcOtbzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uYWRhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5pPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5pbmd1bmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmluZ3VuYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bmluZ3Vubzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uaW5ndW5vczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ubzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ub3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bm9zb3RyYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bm9zb3Ryb3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bnVlc3RyYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5udWVzdHJhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5udWVzdHJvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm51ZXN0cm9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm51bmNhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm90cmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b3RyYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b3Rybzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5vdHJvczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wYXJhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnBhcmVjZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cG9jYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wb2Nhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wb2NvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnBvY29zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnBvcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5wb3JxdWU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cXVlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnF1ZXJlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5xdWllbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5xdWllbmVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnF1aWVuZXNxdWllcmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cXVpZW5xdWllcmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cXVpw6luPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnF1w6k8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c2VyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNpPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNpZW1wcmU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c3I8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c3JhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNyZXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c3RhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnN1eWE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c3V5YXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c3V5bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zdXlvczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zw608L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c8Otbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50YWw8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGFsZXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGFuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRhbnRhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRhbnRhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50YW50bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50YW50b3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGVuZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dG9kYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50b2Rhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50b2RvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRvZG9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRvbWFyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnR1eWE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dHV5bzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50w7o8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dW5hPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnVuYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dW5vczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51c3RlZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51c3RlZGVzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZhcmlhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52YXJpb3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dm9zb3RyYXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dm9zb3Ryb3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dnVlc3RyYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52dWVzdHJhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52dWVzdHJvPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZ1ZXN0cm9zPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+eW88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+w6lsPC9zdG9wd29yZD4KLTwvc3RvcHdvcmRzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL1N3ZWRpc2hfc3YueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL1N3ZWRpc2hfc3YueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY3OTMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9Td2VkaXNoX3N2LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08c3RvcHdvcmRzPgotICA8c3RvcHdvcmQ+YWI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YWxkcmlnPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hbGxhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmFsbHRpZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5hdHQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YXY8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YXZzZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YXZzZXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YmFrb208L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+YnJhPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmJyZWR2aWQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGU8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZGVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZW5uYTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZXJhczwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZXNzPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmRldDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kZXR0YTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kdTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5kw6Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZMOkcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lZnRlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lZnRlcnNvbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lZnRlcsOkdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lajwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbGxlcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5lbW90PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmVuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmV0dDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5mYXN0w6RuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmZvcnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZnJhbWbDtnI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZnLDpW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+ZsO2cjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nZW5vbTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5nb3R0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhhbXNrZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5oYW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aGVsbHJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmhvbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5ob3M8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aHVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmjDpHI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+aTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pbmdlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pbm5hbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5pbnRlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmphPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmphZzwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5saXRlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPmzDpW5nc2FtdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5sw6VuZ3Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWFuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1lZDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZWRhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5tZWxsYW48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWVyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1lcmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bWluZHJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm1vdDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5teWNrZXR0PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5lajwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5uZXJlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm5pPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm51PC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm7DpHI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+bsOkcmE8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b2NoPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPm9rc2E8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+b208L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+cMOlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnNpbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5za2FsbDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD5zb208L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+c8OlPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnPDpWRhbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD50aWxsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnRpbGxyw6Rja2xpZ3Q8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dGlsbHNhbW1hbnM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dHJvdHM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dW5kZXI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dXBwZTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51dDwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD51dGFuPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnV0b208L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFkPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZhcjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52YXJmw7ZyPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZhcnQ8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmFydGjDpG48L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmVtPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZlbXM8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmk8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+dmlkPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPnZpbGtlbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD52w6RsPC9zdG9wd29yZD4KLSAgPHN0b3B3b3JkPsOkbjwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD7DpG5udTwvc3RvcHdvcmQ+Ci0gIDxzdG9wd29yZD7DpHI8L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+w6VueW88L3N0b3B3b3JkPgotICA8c3RvcHdvcmQ+w7Z2ZXI8L3N0b3B3b3JkPgotPC9zdG9wd29yZHM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvZGIvY29jb29uZGIucHJvcGVydGllcyBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9kYi9jb2Nvb25kYi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzliMDczLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9kYi9jb2Nvb25kYi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI0hTUUwgZGF0YWJhc2UKLSNNb24gTWFyIDE0IDIzOjIxOjU0IENFVCAyMDA1Ci1oc3FsZGIuY2FjaGVfZmlsZV9zY2FsZT0xCi1ydW50aW1lLmdjX2ludGVydmFsPTAKLWhzcWxkYi5maXJzdF9pZGVudGl0eT0wCi12ZXJzaW9uPTEuNy4zCi1tb2RpZmllZD15ZXMKLWhzcWxkYi5zY3JpcHRfZm9ybWF0PTAKLXNxbC5lbmZvcmNlX3NpemU9ZmFsc2UKLWhzcWxkYi5jYWNoZV9zaXplX3NjYWxlPTEwCi1oc3FsZGIuY2FjaGVfc2NhbGU9MTQKLWhzcWxkYi52ZXJzaW9uPTEuNy4zCi1oc3FsZGIubG9nX3NpemU9MjAwCi1zcWwuZW5mb3JjZV9zdHJpY3Rfc2l6ZT1mYWxzZQotcmVhZG9ubHk9ZmFsc2UKLWhzcWxkYi5jb21wYXRpYmxlX3ZlcnNpb249MS43LjIKLWhzcWxkYi5vcmlnaW5hbF92ZXJzaW9uPTEuNy4xCi1zcWwuY29tcGFyZV9pbl9sb2NhbGU9ZmFsc2UKLWhzcWxkYi5uaW9fZGF0YV9maWxlPXRydWUKLWhzcWxkYi5jYWNoZV92ZXJzaW9uPTEuNy4wCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvZGIvY29jb29uZGIuc2NyaXB0IGIvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2RiL2NvY29vbmRiLnNjcmlwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyMTJjYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvZGIvY29jb29uZGIuc2NyaXB0CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0tLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLS0tIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLS0tIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0tLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotLS0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS0tCi0tLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0tLQotLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLS0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS0tIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLS0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLS0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUNSRUFURSBVU0VSIFNBIFBBU1NXT1JEICIiIEFETUlOCi0KLURST1AgVEFCTEUgcXJ0el9sb2NrcyBJRiBFWElTVFMKLURST1AgVEFCTEUgcXJ0el9zY2hlZHVsZXJfc3RhdGUgSUYgRVhJU1RTCi1EUk9QIFRBQkxFIHFydHpfZmlyZWRfdHJpZ2dlcnMgSUYgRVhJU1RTCi1EUk9QIFRBQkxFIHFydHpfcGF1c2VkX3RyaWdnZXJfZ3JwcyBJRiBFWElTVFMKLURST1AgVEFCTEUgcXJ0el9jYWxlbmRhcnMgSUYgRVhJU1RTCi1EUk9QIFRBQkxFIHFydHpfdHJpZ2dlcl9saXN0ZW5lcnMgSUYgRVhJU1RTCi1EUk9QIFRBQkxFIHFydHpfYmxvYl90cmlnZ2VycyBJRiBFWElTVFMKLURST1AgVEFCTEUgcXJ0el9jcm9uX3RyaWdnZXJzIElGIEVYSVNUUwotRFJPUCBUQUJMRSBxcnR6X3NpbXBsZV90cmlnZ2VycyBJRiBFWElTVFMKLURST1AgVEFCTEUgcXJ0el90cmlnZ2VycyBJRiBFWElTVFMKLURST1AgVEFCTEUgcXJ0el9qb2JfbGlzdGVuZXJzIElGIEVYSVNUUwotRFJPUCBUQUJMRSBxcnR6X2pvYl9kZXRhaWxzIElGIEVYSVNUUwotCi1DUkVBVEUgVEFCTEUgcXJ0el9qb2JfZGV0YWlscyAoSk9CX05BTUUgVkFSQ0hBUig4MCkgTk9UIE5VTEwsIEpPQl9HUk9VUCBWQVJDSEFSKDgwKSBOT1QgTlVMTCwgREVTQ1JJUFRJT04gVkFSQ0hBUigxMjApIE5VTEwsIEpPQl9DTEFTU19OQU1FIFZBUkNIQVIoMTI4KSBOT1QgTlVMTCwgSVNfRFVSQUJMRSBWQVJDSEFSKDEpIE5PVCBOVUxMLCBJU19WT0xBVElMRSBWQVJDSEFSKDEpIE5PVCBOVUxMLCBJU19TVEFURUZVTCBWQVJDSEFSKDEpIE5PVCBOVUxMLCBSRVFVRVNUU19SRUNPVkVSWSBWQVJDSEFSKDEpIE5PVCBOVUxMLCBKT0JfREFUQSBCSU5BUlkgTlVMTCwgUFJJTUFSWSBLRVkgKEpPQl9OQU1FLEpPQl9HUk9VUCkpCi1DUkVBVEUgVEFCTEUgcXJ0el9qb2JfbGlzdGVuZXJzIChKT0JfTkFNRSBWQVJDSEFSKDgwKSBOT1QgTlVMTCwgSk9CX0dST1VQIFZBUkNIQVIoODApIE5PVCBOVUxMLCBKT0JfTElTVEVORVIgVkFSQ0hBUig4MCkgTk9UIE5VTEwsIFBSSU1BUlkgS0VZIChKT0JfTkFNRSxKT0JfR1JPVVAsSk9CX0xJU1RFTkVSKSwgRk9SRUlHTiBLRVkgKEpPQl9OQU1FLEpPQl9HUk9VUCkgUkVGRVJFTkNFUyBRUlRaX0pPQl9ERVRBSUxTKEpPQl9OQU1FLEpPQl9HUk9VUCkpCi1DUkVBVEUgVEFCTEUgcXJ0el90cmlnZ2VycyAoVFJJR0dFUl9OQU1FIFZBUkNIQVIoODApIE5PVCBOVUxMLCBUUklHR0VSX0dST1VQIFZBUkNIQVIoODApIE5PVCBOVUxMLCBKT0JfTkFNRSBWQVJDSEFSKDgwKSBOT1QgTlVMTCwgSk9CX0dST1VQIFZBUkNIQVIoODApIE5PVCBOVUxMLCBJU19WT0xBVElMRSBWQVJDSEFSKDEpIE5PVCBOVUxMLCBERVNDUklQVElPTiBWQVJDSEFSKDEyMCkgTlVMTCwgTkVYVF9GSVJFX1RJTUUgTlVNRVJJQygxMykgTlVMTCwgUFJFVl9GSVJFX1RJTUUgTlVNRVJJQygxMykgTlVMTCwgVFJJR0dFUl9TVEFURSBWQVJDSEFSKDE2KSBOT1QgTlVMTCwgVFJJR0dFUl9UWVBFIFZBUkNIQVIoOCkgTk9UIE5VTEwsIFNUQVJUX1RJTUUgTlVNRVJJQygxMykgTk9UIE5VTEwsIEVORF9USU1FIE5VTUVSSUMoMTMpIE5VTEwsIENBTEVOREFSX05BTUUgVkFSQ0hBUig4MCkgTlVMTCwgTUlTRklSRV9JTlNUUiBOVU1FUklDKDIpIE5VTEwsIEpPQl9EQVRBIEJJTkFSWSBOVUxMLCBQUklNQVJZIEtFWSAoVFJJR0dFUl9OQU1FLFRSSUdHRVJfR1JPVVApLCBGT1JFSUdOIEtFWSAoSk9CX05BTUUsSk9CX0dST1VQKSBSRUZFUkVOQ0VTIFFSVFpfSk9CX0RFVEFJTFMoSk9CX05BTUUsSk9CX0dST1VQKSkKLUNSRUFURSBUQUJMRSBxcnR6X3NpbXBsZV90cmlnZ2VycyAoVFJJR0dFUl9OQU1FIFZBUkNIQVIoODApIE5PVCBOVUxMLCBUUklHR0VSX0dST1VQIFZBUkNIQVIoODApIE5PVCBOVUxMLCBSRVBFQVRfQ09VTlQgTlVNRVJJQyg3KSBOT1QgTlVMTCwgUkVQRUFUX0lOVEVSVkFMIE5VTUVSSUMoMTIpIE5PVCBOVUxMLCBUSU1FU19UUklHR0VSRUQgTlVNRVJJQyg3KSBOT1QgTlVMTCwgUFJJTUFSWSBLRVkgKFRSSUdHRVJfTkFNRSxUUklHR0VSX0dST1VQKSwgRk9SRUlHTiBLRVkgKFRSSUdHRVJfTkFNRSxUUklHR0VSX0dST1VQKSBSRUZFUkVOQ0VTIFFSVFpfVFJJR0dFUlMoVFJJR0dFUl9OQU1FLFRSSUdHRVJfR1JPVVApKQotQ1JFQVRFIFRBQkxFIHFydHpfY3Jvbl90cmlnZ2VycyAoVFJJR0dFUl9OQU1FIFZBUkNIQVIoODApIE5PVCBOVUxMLCBUUklHR0VSX0dST1VQIFZBUkNIQVIoODApIE5PVCBOVUxMLCBDUk9OX0VYUFJFU1NJT04gVkFSQ0hBUig4MCkgTk9UIE5VTEwsIFRJTUVfWk9ORV9JRCBWQVJDSEFSKDgwKSwgUFJJTUFSWSBLRVkgKFRSSUdHRVJfTkFNRSxUUklHR0VSX0dST1VQKSwgRk9SRUlHTiBLRVkgKFRSSUdHRVJfTkFNRSxUUklHR0VSX0dST1VQKSBSRUZFUkVOQ0VTIFFSVFpfVFJJR0dFUlMoVFJJR0dFUl9OQU1FLFRSSUdHRVJfR1JPVVApKQotQ1JFQVRFIFRBQkxFIHFydHpfYmxvYl90cmlnZ2VycyAoVFJJR0dFUl9OQU1FIFZBUkNIQVIoODApIE5PVCBOVUxMLCBUUklHR0VSX0dST1VQIFZBUkNIQVIoODApIE5PVCBOVUxMLCBCTE9CX0RBVEEgQklOQVJZIE5VTEwsIFBSSU1BUlkgS0VZIChUUklHR0VSX05BTUUsVFJJR0dFUl9HUk9VUCksIEZPUkVJR04gS0VZIChUUklHR0VSX05BTUUsVFJJR0dFUl9HUk9VUCkgUkVGRVJFTkNFUyBRUlRaX1RSSUdHRVJTKFRSSUdHRVJfTkFNRSxUUklHR0VSX0dST1VQKSkKLUNSRUFURSBUQUJMRSBxcnR6X3RyaWdnZXJfbGlzdGVuZXJzIChUUklHR0VSX05BTUUgVkFSQ0hBUig4MCkgTk9UIE5VTEwsIFRSSUdHRVJfR1JPVVAgVkFSQ0hBUig4MCkgTk9UIE5VTEwsIFRSSUdHRVJfTElTVEVORVIgVkFSQ0hBUig4MCkgTk9UIE5VTEwsIFBSSU1BUlkgS0VZIChUUklHR0VSX05BTUUsVFJJR0dFUl9HUk9VUCxUUklHR0VSX0xJU1RFTkVSKSwgRk9SRUlHTiBLRVkgKFRSSUdHRVJfTkFNRSxUUklHR0VSX0dST1VQKSBSRUZFUkVOQ0VTIFFSVFpfVFJJR0dFUlMoVFJJR0dFUl9OQU1FLFRSSUdHRVJfR1JPVVApKQotQ1JFQVRFIFRBQkxFIHFydHpfY2FsZW5kYXJzIChDQUxFTkRBUl9OQU1FIFZBUkNIQVIoODApIE5PVCBOVUxMLCBDQUxFTkRBUiBCSU5BUlkgTk9UIE5VTEwsIFBSSU1BUlkgS0VZIChDQUxFTkRBUl9OQU1FKSkKLUNSRUFURSBUQUJMRSBxcnR6X3BhdXNlZF90cmlnZ2VyX2dycHMgKFRSSUdHRVJfR1JPVVAgVkFSQ0hBUig4MCkgTk9UIE5VTEwsIFBSSU1BUlkgS0VZIChUUklHR0VSX0dST1VQKSkKLUNSRUFURSBUQUJMRSBxcnR6X2ZpcmVkX3RyaWdnZXJzIChFTlRSWV9JRCBWQVJDSEFSKDk1KSBOT1QgTlVMTCwgVFJJR0dFUl9OQU1FIFZBUkNIQVIoODApIE5PVCBOVUxMLCBUUklHR0VSX0dST1VQIFZBUkNIQVIoODApIE5PVCBOVUxMLCBJU19WT0xBVElMRSBWQVJDSEFSKDEpIE5PVCBOVUxMLCBJTlNUQU5DRV9OQU1FIFZBUkNIQVIoODApIE5PVCBOVUxMLCBGSVJFRF9USU1FIE5VTUVSSUMoMTMpIE5PVCBOVUxMLCBTVEFURSBWQVJDSEFSKDE2KSBOT1QgTlVMTCwgSk9CX05BTUUgVkFSQ0hBUig4MCkgTlVMTCwgSk9CX0dST1VQIFZBUkNIQVIoODApIE5VTEwsIElTX1NUQVRFRlVMIFZBUkNIQVIoMSkgTlVMTCwgUkVRVUVTVFNfUkVDT1ZFUlkgVkFSQ0hBUigxKSBOVUxMLCBQUklNQVJZIEtFWSAoRU5UUllfSUQpKQotQ1JFQVRFIFRBQkxFIHFydHpfc2NoZWR1bGVyX3N0YXRlIChJTlNUQU5DRV9OQU1FIFZBUkNIQVIoODApIE5PVCBOVUxMLCBMQVNUX0NIRUNLSU5fVElNRSBOVU1FUklDKDEzKSBOT1QgTlVMTCwgQ0hFQ0tJTl9JTlRFUlZBTCBOVU1FUklDKDEzKSBOT1QgTlVMTCwgUkVDT1ZFUkVSIFZBUkNIQVIoODApIE5VTEwsIFBSSU1BUlkgS0VZIChJTlNUQU5DRV9OQU1FKSkKLUNSRUFURSBUQUJMRSBxcnR6X2xvY2tzIChMT0NLX05BTUUgVkFSQ0hBUig0MCkgTk9UIE5VTEwsIFBSSU1BUlkgS0VZIChMT0NLX05BTUUpKQotCi1JTlNFUlQgSU5UTyBxcnR6X2xvY2tzIHZhbHVlcygnVFJJR0dFUl9BQ0NFU1MnKQotSU5TRVJUIElOVE8gcXJ0el9sb2NrcyB2YWx1ZXMoJ0pPQl9BQ0NFU1MnKQotSU5TRVJUIElOVE8gcXJ0el9sb2NrcyB2YWx1ZXMoJ0NBTEVOREFSX0FDQ0VTUycpCi1JTlNFUlQgSU5UTyBxcnR6X2xvY2tzIHZhbHVlcygnU1RBVEVfQUNDRVNTJykKLUlOU0VSVCBJTlRPIHFydHpfbG9ja3MgdmFsdWVzKCdNSVNGSVJFX0FDQ0VTUycpCi0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9lbnRpdGllcy9jYXRhbG9nLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvV0VCLUlORi9lbnRpdGllcy9jYXRhbG9nLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmN2IzZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvZW50aXRpZXMvY2F0YWxvZy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQotPHhzbDpvdXRwdXQgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPiAgICAKLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgPHhzbDpjb3B5PgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gIDwveHNsOmNvcHk+Ci08IS0tIEluc2VydCBuZXcgY2F0YWxvZ3MgLS0+Ci08L3hzbDp0ZW1wbGF0ZT4KLSAgIAotPC94c2w6c3R5bGVzaGVldD4gCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvZW50aXRpZXMvd2ViLWFwcF8yXzMuZHRkIGIvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL2VudGl0aWVzL3dlYi1hcHBfMl8zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczMzYwNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYvZW50aXRpZXMvd2ViLWFwcF8yXzMuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MyArMCwwIEBACi08IS0tDQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sDQotOTAxIFNhbiBBbnRvbmlvIFJvYWQsDQotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4NCi1BbGwgcmlnaHRzIHJlc2VydmVkLg0KLQ0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgcmVsYXRpbmcgdG8NCi10ZWNobm9sb2d5IGVtYm9kaWVkIGluIHRoZSBwcm9kdWN0IHRoYXQgaXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuDQotSW4gcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsIHByb3BlcnR5DQotcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMgbGlzdGVkIGF0DQotaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgcGF0ZW50cyBvcg0KLXBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUgVS5TLiBhbmQgaW4gb3RoZXIgY291bnRyaWVzLg0KLQ0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSBwcm9kdWN0IHRvIHdoaWNoIGl0IHBlcnRhaW5zIGFyZSBkaXN0cmlidXRlZA0KLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQNCi1kZWNvbXBpbGF0aW9uLiAgVGhpcyBkb2N1bWVudCBtYXkgYmUgcmVwcm9kdWNlZCBhbmQgZGlzdHJpYnV0ZWQgYnV0IG1heQ0KLW5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzDQotbGljZW5zb3JzLCBpZiBhbnkuDQotDQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZA0KLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4NCi0NCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgdGhlIFN1biBsb2dvLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhDQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGFuZCAgYW5kDQotRW50ZXJwcmlzZSBKYXZhQmVhbnMgYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bg0KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLg0KLQ0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvDQotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4NCi0NCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQNCi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkgSU1QTElFRA0KLVdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SDQotTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVCBUTyBUSEUgRVhURU5UIFRIQVQgU1VDSA0KLURJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkgSU5WQUxJRC4NCi0NCi0NCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQotDQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sDQotOTAxIFNhbiBBbnRvbmlvIFJvYWQsDQotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBFJ3RhdHMtVW5pcy4NCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLg0KLQ0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gYSBsZXMgZHJvaXRzIGRlIHByb3ByaWUndGUnIGludGVsbGVjdHVlbHMNCi1yZWxhdGFudHMgYWAgbGEgdGVjaG5vbG9naWUgaW5jb3Jwb3JlJ2UgZGFucyBsZSBwcm9kdWl0IHF1aSBlc3QgZGUnY3JpdA0KLWRhbnMgY2UgZG9jdW1lbnQuIEVuIHBhcnRpY3VsaWVyLCBldCBzYW5zIGxhIGxpbWl0YXRpb24sIGNlcyBkcm9pdHMgZGUNCi1wcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzIHBldXZlbnQgaW5jbHVyZSB1biBvdSBwbHVzIGRlcyBicmV2ZXRzDQotYW1lJ3JpY2FpbnMgZSdudW1lJ3JlJ3MgYWAgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgZXQgdW4gb3UgbGVzDQotYnJldmV0cyBwbHVzIHN1cHBsZSdtZW50YWlyZXMgb3UgbGVzIGFwcGxpY2F0aW9ucyBkZSBicmV2ZXQgZW4gYXR0ZW50ZQ0KLWRhbnMgbGVzIEUndGF0cy1VbmlzIGV0IGRhbnMgbGVzIGF1dHJlcyBwYXlzLg0KLQ0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScNCi1hdmVjIGRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYQ0KLWRpc3RyaWJ1dGlvbiwgZXQgbGEgZGUnY29tcGlsYXRpb24uICBDZSBkb2N1bWVudGlvbiBhc3NvY2llIG4gcGV1dA0KLWVedHJlIHJlcHJvZHVpdGUgZXQgZGlzdHJpYnVlciwgcGFyIHF1ZWxxdWUgbW95ZW4gcXVlIGNlIHNvaXQsIHNhbnMNCi1sJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyBiYWlsbGV1cnMgZGUNCi1saWNlbmNlLCBsZSBjYXMgZSdjaGUnYW50Lg0KLQ0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llDQotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldA0KLWxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uDQotDQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIGxlIGxvZ28gU3VuLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhDQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGV0ICBhbmQNCi1FbnRlcnByaXNlIEphdmFCZWFucyBzb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzDQotZGUncG9zZSdlcyBkZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFJ3RhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzDQotcGF5cy4NCi0NCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0UnVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsDQotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVA0KLUVYQ0xVRVMsIERBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUw0KLU5PVEFNTUVOVCBUT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQQ0KLUwnQVBUSVRVREUgQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFDQotQ09OVFJFRkFDLE9OLg0KLS0tPg0KLQ0KLTwhLS0NCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgU2VydmxldCAyLjMgZGVwbG95bWVudCBkZXNjcmlwdG9yLg0KLUFsbCBTZXJ2bGV0IDIuMyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5jbHVkZSBhIERPQ1RZUEUNCi1vZiB0aGUgZm9sbG93aW5nIGZvcm06DQotDQotICA8IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMNCi0JIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiINCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+DQotDQotLS0+DQotDQotPCEtLQ0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yDQotZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuDQotDQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlDQotICBpbiB0aGUgZGF0YSBtYXkgYmUgaWdub3JlZC4NCi0NCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMNCi0gIGNhc2Ugc2Vuc2l0aXZlLg0KLQ0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQ0KLSAgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90IHN0YXJ0aW5nIHdpdGggIi8iKQ0KLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLg0KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5DQotICBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZQ0KLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQ0KLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuDQotLS0+DQotDQotDQotPCEtLQ0KLVRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3INCi1hIHdlYiBhcHBsaWNhdGlvbi4NCi0tLT4NCi08IUVMRU1FTlQgd2ViLWFwcCAoaWNvbj8sIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywgZGlzdHJpYnV0YWJsZT8sDQotY29udGV4dC1wYXJhbSosIGZpbHRlciosIGZpbHRlci1tYXBwaW5nKiwgbGlzdGVuZXIqLCBzZXJ2bGV0KiwNCi1zZXJ2bGV0LW1hcHBpbmcqLCBzZXNzaW9uLWNvbmZpZz8sIG1pbWUtbWFwcGluZyosIHdlbGNvbWUtZmlsZS1saXN0PywNCi1lcnJvci1wYWdlKiwgdGFnbGliKiwgcmVzb3VyY2UtZW52LXJlZiosIHJlc291cmNlLXJlZiosIHNlY3VyaXR5LWNvbnN0cmFpbnQqLA0KLWxvZ2luLWNvbmZpZz8sIHNlY3VyaXR5LXJvbGUqLCBlbnYtZW50cnkqLCBlamItcmVmKiwgIGVqYi1sb2NhbC1yZWYqKT4NCi0NCi08IS0tDQotVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZA0KLWJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lDQotdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQgdG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlDQotc2VjdXJpdHktcm9sZSBlbGVtZW50cyBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUNCi10aGUgc3BlY2lhbGx5IHJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcg0KLWluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiIGFuZA0KLXJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbCByb2xlcy4NCi1JZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcyB0byB0aGUgcG9ydGlvbiBvZg0KLXRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZSBjb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuDQotVGhlIGNvbnRhaW5lciBtYXRjaGVzIHJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nDQotYWNjZXNzLg0KLQ0KLQ0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQNCi0tLT4NCi08IUVMRU1FTlQgYXV0aC1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSopPg0KLQ0KLTwhLS0NCi1UaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24NCi1tZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbg0KLWNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZCB1c2luZyB0aGUgY29uZmlndXJlZA0KLW1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlICJCQVNJQyIsICJESUdFU1QiLA0KLSJGT1JNIiwgb3IgIkNMSUVOVC1DRVJUIi4NCi0NCi1Vc2VkIGluOiBsb2dpbi1jb25maWcNCi0tLT4NCi08IUVMRU1FTlQgYXV0aC1tZXRob2QgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYg0KLWFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLS0tPg0KLTwhRUxFTUVOVCBjb250ZXh0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4NCi0NCi08IS0tDQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50DQotZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0DQotdGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZg0KLXRoZSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzDQotdXNlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uIHdhciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24NCi13aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLg0KLQ0KLVVzZWQgaW46IGF1dGgtY29uc3RyYWludCwgY29udGV4dC1wYXJhbSwgZWpiLWxvY2FsLXJlZiwgZWpiLXJlZiwNCi1lbnYtZW50cnksIGZpbHRlciwgaW5pdC1wYXJhbSwgcmVzb3VyY2UtZW52LXJlZiwgcmVzb3VyY2UtcmVmLCBydW4tYXMsDQotc2VjdXJpdHktcm9sZSwgc2VjdXJpdHktcm9sZS1yZWYsIHNlcnZsZXQsIHVzZXItZGF0YS1jb25zdHJhaW50LA0KLXdlYi1hcHAsIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uDQotLS0+DQotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlDQotZGlzcGxheWVkIGJ5IHRvb2xzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuDQotDQotVXNlZCBpbjogZmlsdGVyLCBzZWN1cml0eS1jb25zdHJhaW50LCBzZXJ2bGV0LCB3ZWItYXBwDQotDQotRXhhbXBsZToNCi0NCi08ZGlzcGxheS1uYW1lPkVtcGxveWVlIFNlbGYgU2VydmljZTwvZGlzcGxheS1uYW1lPg0KLS0tPg0KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24NCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IsIGluZGljYXRlcyB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzDQotcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0DQotY29udGFpbmVyDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLS0tPg0KLTwhRUxFTUVOVCBkaXN0cmlidXRhYmxlIEVNUFRZPg0KLQ0KLTwhLS0NCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYNCi1lbGVtZW50cyB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4NCi1lbnRlcnByaXNlIGJlYW4uDQotDQotVGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgY29tcG9zZWQgb2YgYQ0KLXBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQ0KLWJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldCBiZWFuIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbQ0KLXRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgd2FyIGZpbGUNCi1jb250YWluaW5nIHRoZSB3ZWIgYXBwbGljYXRpb24gdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLg0KLVRoaXMgYWxsb3dzIG11bHRpcGxlIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZSBlamItbmFtZSB0byBiZQ0KLXVuaXF1ZWx5IGlkZW50aWZpZWQuDQotDQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZg0KLQ0KLUV4YW1wbGVzOg0KLQ0KLQk8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPg0KLQ0KLQk8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+DQotDQotLS0+DQotPCFFTEVNRU5UIGVqYi1saW5rICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGVqYi1sb2NhbC1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8NCi1hbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6DQotDQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24NCi0JLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbg0KLQkgIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuDQotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuDQotCS0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQNCi0JICBlbnRlcnByaXNlIGJlYW4NCi0JLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkDQotCSAgZW50ZXJwcmlzZSBiZWFuDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLS0tPg0KLTwhRUxFTUVOVCBlamItbG9jYWwtcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLA0KLQkJbG9jYWwtaG9tZSwgbG9jYWwsIGVqYi1saW5rPyk+DQotDQotPCEtLQ0KLVRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvDQotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOg0KLQ0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uDQotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mDQotCSAgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbg0KLQktIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbg0KLQktIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZA0KLQkgIGVudGVycHJpc2UgYmVhbg0KLQktIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQNCi0JICBlbnRlcnByaXNlIGJlYW4NCi0NCi1Vc2VkIGluOiB3ZWItYXBwDQotLS0+DQotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsDQotCQlob21lLCByZW1vdGUsIGVqYi1saW5rPyk+DQotDQotPCEtLQ0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGUNCi1FSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMNCi1yZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUNCi13aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4NCi0NCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuDQotDQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZg0KLQ0KLUV4YW1wbGU6DQotDQotPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPg0KLS0tPg0KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlDQotcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uDQotDQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6DQotDQotCTxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+DQotCTxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPg0KLQ0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYNCi0tLT4NCi08IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzDQotZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbA0KLWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbA0KLXZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZSBzdXBwbGllZA0KLWR1cmluZyBkZXBsb3ltZW50Lg0KLS0tPg0KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS12YWx1ZT8sDQotZW52LWVudHJ5LXR5cGUpPg0KLQ0KLTwhLS0NCi1UaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYiBhcHBsaWNhdGlvbnMncw0KLWVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlDQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLg0KLQ0KLUV4YW1wbGU6DQotDQotPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+DQotDQotVXNlZCBpbjogZW52LWVudHJ5DQotLS0+DQotPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YNCi10aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MNCi1jb2RlLg0KLQ0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6DQotDQotCWphdmEubGFuZy5Cb29sZWFuDQotCWphdmEubGFuZy5CeXRlDQotCWphdmEubGFuZy5DaGFyYWN0ZXINCi0JamF2YS5sYW5nLlN0cmluZw0KLQlqYXZhLmxhbmcuU2hvcnQNCi0JamF2YS5sYW5nLkludGVnZXINCi0JamF2YS5sYW5nLkxvbmcNCi0JamF2YS5sYW5nLkZsb2F0DQotCWphdmEubGFuZy5Eb3VibGUNCi0NCi1Vc2VkIGluOiBlbnYtZW50cnkNCi0tLT4NCi08IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MNCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlDQotY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nDQotcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwgYSBzaW5nbGUgY2hhcmFjdGVyLg0KLQ0KLUV4YW1wbGU6DQotDQotPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4NCi0NCi1Vc2VkIGluOiBlbnYtZW50cnkNCi0tLT4NCi08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0DQotDQotVXNlZCBpbjogZXJyb3ItcGFnZQ0KLS0tPg0KLTwhRUxFTUVOVCBlcnJvci1jb2RlICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlDQotb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLS0tPg0KLTwhRUxFTUVOVCBlcnJvci1wYWdlICgoZXJyb3ItY29kZSB8IGV4Y2VwdGlvbi10eXBlKSwgbG9jYXRpb24pPg0KLQ0KLTwhLS0NCi1UaGUgZXhjZXB0aW9uIHR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhDQotSmF2YSBleGNlcHRpb24gdHlwZS4NCi0NCi1Vc2VkIGluOiBlcnJvci1wYWdlDQotLS0+DQotPCFFTEVNRU5UIGV4Y2VwdGlvbi10eXBlICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4NCi1leHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiDQotDQotVXNlZCBpbjogbWltZS1tYXBwaW5nDQotLS0+DQotPCFFTEVNRU5UIGV4dGVuc2lvbiAoI1BDREFUQSk+DQotDQotPCEtLQ0KLURlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvDQotZWl0aGVyIGEgc2VydmxldCBvciBhIFVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZw0KLXRoZSBmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUNCi1pbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQNCi1ydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4NCi0NCi1Vc2VkIGluOiB3ZWItYXBwDQotLS0+DQotPCFFTEVNRU5UIGZpbHRlciAoaWNvbj8sIGZpbHRlci1uYW1lLCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sDQotZmlsdGVyLWNsYXNzLCBpbml0LXBhcmFtKik+DQotDQotPCEtLQ0KLVRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuDQotDQotVXNlZCBpbjogZmlsdGVyDQotLS0+DQotPCFFTEVNRU5UIGZpbHRlci1jbGFzcyAoI1BDREFUQSk+DQotDQotPCEtLQ0KLURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZQ0KLWNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMNCi10byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlDQotcmVxdWVzdCBVUkkgdG8gYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycw0KLXRvIGFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbiBzZXJ2bGV0LW5hbWUsDQotb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoDQotc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluDQotd2hpY2ggZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQ0KLXNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZQ0KLXZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSA8ZmlsdGVyLW5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlDQotPGZpbHRlcj4gZGVjbGFyYXRpb25zIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLS0tPg0KLTwhRUxFTUVOVCBmaWx0ZXItbWFwcGluZyAoZmlsdGVyLW5hbWUsICh1cmwtcGF0dGVybiB8IHNlcnZsZXQtbmFtZSkpPg0KLQ0KLTwhLS0NCi1UaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmlsdGVyLg0KLUVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLg0KLQ0KLVVzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcNCi0tLT4NCi08IUVMRU1FTlQgZmlsdGVyLW5hbWUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHANCi13aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsDQotY2FuIGJlIGZvdW5kLiBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQNCi1yZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLg0KLQ0KLVVzZWQgaW46IGZvcm0tbG9naW4tY29uZmlnDQotLS0+DQotPCFFTEVNRU5UIGZvcm0tZXJyb3ItcGFnZSAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSBmb3JtLWxvZ2luLWNvbmZpZyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yIHBhZ2VzDQotdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uDQotaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLg0KLQ0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZw0KLS0tPg0KLTwhRUxFTUVOVCBmb3JtLWxvZ2luLWNvbmZpZyAoZm9ybS1sb2dpbi1wYWdlLCBmb3JtLWVycm9yLXBhZ2UpPg0KLQ0KLTwhLS0NCi1UaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHANCi13aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQuIFRoZSBwYXRoDQotYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuDQotDQotVXNlZCBpbjogZm9ybS1sb2dpbi1jb25maWcNCi0tLT4NCi08IUVMRU1FTlQgZm9ybS1sb2dpbi1wYWdlICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UNCi1iZWFuJ3MgaG9tZSBpbnRlcmZhY2UuDQotDQotVXNlZCBpbjogZWpiLXJlZg0KLQ0KLUV4YW1wbGU6DQotDQotPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+DQotLS0+DQotPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikuDQotDQotVXNlZCBpbjogd2ViLXJlc291cmNlLWNvbGxlY3Rpb24NCi0tLT4NCi08IUVMRU1FTlQgaHR0cC1tZXRob2QgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdA0KLXNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2VzDQotdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEgR1VJIHRvb2wuDQotDQotVXNlZCBpbjogZmlsdGVyLCBzZXJ2bGV0LCB3ZWItYXBwDQotLS0+DQotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+DQotDQotPCEtLQ0KLVRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4NCi1pbml0aWFsaXphdGlvbiBwYXJhbSBvZiB0aGUgc2VydmxldA0KLQ0KLVVzZWQgaW46IGZpbHRlciwgc2VydmxldA0KLS0tPg0KLTwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4NCi0NCi08IS0tDQotVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlIHdpdGhpbg0KLXRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuDQotDQotVXNlZCBpbjogc2VydmxldA0KLS0tPg0KLTwhRUxFTUVOVCBqc3AtZmlsZSAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlDQotY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQ0KLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MNCi13YXIgZmlsZS4NCi0NCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0Lg0KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLg0KLQ0KLVVzZWQgaW46IGljb24NCi0NCi1FeGFtcGxlOg0KLQ0KLTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4NCi0tLT4NCi08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSBsaXN0ZW5lciBlbGVtZW50IGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYg0KLWFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLS0tPg0KLTwhRUxFTUVOVCBsaXN0ZW5lciAobGlzdGVuZXItY2xhc3MpPg0KLQ0KLTwhLS0NCi1UaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlDQotcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxpc3RlbmVyIGNsYXNzLg0KLQ0KLQ0KLVVzZWQgaW46IGxpc3RlbmVyDQotLS0+DQotPCFFTEVNRU5UIGxpc3RlbmVyLWNsYXNzICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUNCi1sb2FkZWQgKGluc3RhbnRpYXRlZCBhbmQgaGF2ZSBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXANCi1vZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YNCi10aGVzZSBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaA0KLXRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZSBpcyBhIG5lZ2F0aXZlIGludGVnZXIsDQotb3IgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZQ0KLXNlcnZsZXQgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUgaW50ZWdlcg0KLW9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZCBpbml0aWFsaXplIHRoZSBzZXJ2bGV0IGFzIHRoZQ0KLWFwcGxpY2F0aW9uIGlzIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQNCi1zZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBzZXJ2bGV0cw0KLW1hcmtlZCB3aXRoIGhpZ2hlciBpbnRlZ2Vycy4gVGhlIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlcg0KLW9mIGxvYWRpbmcgb2Ygc2VydmxldHMgd2l0aCB0aGUgc2FtZSBsb2FkLW9uLXN0YXJ0LXVwIHZhbHVlLg0KLQ0KLVVzZWQgaW46IHNlcnZsZXQNCi0tLT4NCi08IUVMRU1FTlQgbG9hZC1vbi1zdGFydHVwICgjUENEQVRBKT4NCi0NCi08IS0tDQotDQotVGhlIGxvY2FsIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQ0KLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4NCi0NCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmDQotDQotLS0+DQotPCFFTEVNRU5UIGxvY2FsICgjUENEQVRBKT4NCi0NCi08IS0tDQotDQotVGhlIGxvY2FsLWhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlDQotZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZSBpbnRlcmZhY2UuDQotDQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZg0KLS0tPg0KLTwhRUxFTUVOVCBsb2NhbC1ob21lICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgd2ViDQotYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mDQotdGhlIGxvY2F0aW9uIG11c3QgaGF2ZSBhIGxlYWRpbmcgYC8nLg0KLQ0KLVVzZWQgaW46IGVycm9yLXBhZ2UNCi0tLT4NCi08IUVMRU1FTlQgbG9jYXRpb24gKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uDQotbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yDQotdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbg0KLW1lY2hhbmlzbS4NCi0NCi1Vc2VkIGluOiB3ZWItYXBwDQotLS0+DQotPCFFTEVNRU5UIGxvZ2luLWNvbmZpZyAoYXV0aC1tZXRob2Q/LCByZWFsbS1uYW1lPywgZm9ybS1sb2dpbi1jb25maWc/KT4NCi0NCi08IS0tDQotVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uDQotYW5kIGEgbWltZSB0eXBlLg0KLQ0KLVVzZWQgaW46IHdlYi1hcHANCi0tLT4NCi08IUVMRU1FTlQgbWltZS1tYXBwaW5nIChleHRlbnNpb24sIG1pbWUtdHlwZSk+DQotDQotPCEtLQ0KLVRoZSBtaW1lLXR5cGUgZWxlbWVudCBjb250YWlucyBhIGRlZmluZWQgbWltZSB0eXBlLiBleGFtcGxlOg0KLSJ0ZXh0L3BsYWluIg0KLQ0KLVVzZWQgaW46IG1pbWUtbWFwcGluZw0KLS0tPg0KLTwhRUxFTUVOVCBtaW1lLXR5cGUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLiBFYWNoIHBhcmFtZXRlcg0KLW5hbWUgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4NCi0NCi0NCi1Vc2VkIGluOiBjb250ZXh0LXBhcmFtLCBpbml0LXBhcmFtDQotLS0+DQotPCFFTEVNRU5UIHBhcmFtLW5hbWUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuDQotDQotVXNlZCBpbjogY29udGV4dC1wYXJhbSwgaW5pdC1wYXJhbQ0KLS0tPg0KLTwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQDQotQmFzaWMgYXV0aG9yaXphdGlvbi4NCi0NCi1Vc2VkIGluOiBsb2dpbi1jb25maWcNCi0tLT4NCi08IUVMRU1FTlQgcmVhbG0tbmFtZSAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UNCi1iZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4NCi0NCi1Vc2VkIGluOiBlamItcmVmDQotDQotRXhhbXBsZToNCi0NCi08cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4NCi0tLT4NCi08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlIHNpZ25zDQotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyDQotd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9uIGJlaGFsZiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJbiB0aGUNCi1sYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlDQotRGVwbG95ZXIuDQotDQotVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoNCi0NCi0JPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4NCi0JPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+DQotDQotVXNlZCBpbjogcmVzb3VyY2UtcmVmDQotLS0+DQotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXINCi1jb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlDQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLg0KLQ0KLVVzZWQgaW46IHJlc291cmNlLXJlZg0KLS0tPg0KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZA0KLXRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUNCi1zaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlDQotdHdvIGZvbGxvd2luZzoNCi0NCi0JPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+DQotCTxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+DQotDQotVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLg0KLQ0KLVVzZWQgaW46IHJlc291cmNlLXJlZg0KLS0tPg0KLTwhRUxFTUVOVCByZXMtc2hhcmluZy1zY29wZSAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlDQotaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UNCi1leHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuDQotDQotVXNlZCBpbjogcmVzb3VyY2UtcmVmDQotLS0+DQotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MNCi1yZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZQ0KLWluIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsDQotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuDQotaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkNCi10aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLQ0KLUV4YW1wbGU6DQotDQotPHJlc291cmNlLWVudi1yZWY+DQotICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4NCi0gICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4NCi08L3Jlc291cmNlLWVudi1yZWY+DQotLS0+DQotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYgKGRlc2NyaXB0aW9uPywgcmVzb3VyY2UtZW52LXJlZi1uYW1lLA0KLQkJcmVzb3VyY2UtZW52LXJlZi10eXBlKT4NCi0NCi08IS0tDQotVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlDQotZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbg0KLXRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQ0KLWphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLg0KLQ0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYNCi0tLT4NCi08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi1uYW1lICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIHJlc291cmNlDQotZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YQ0KLWxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZS4NCi0NCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmDQotLS0+DQotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtdHlwZSAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MNCi1yZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsDQotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwNCi10aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZQ0KLWV4cGVjdGVkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24NCi0oQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlDQotc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlIChTaGFyZWFibGUgb3INCi1VbnNoYXJlYWJsZSkuDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLQ0KLUV4YW1wbGU6DQotDQotICAgIDxyZXNvdXJjZS1yZWY+DQotCTxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+DQotCTxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+DQotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPg0KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4NCi0gICAgPC9yZXNvdXJjZS1yZWY+DQotLS0+DQotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCwNCi0JCXJlcy1zaGFyaW5nLXNjb3BlPyk+DQotDQotPCEtLQ0KLVRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlDQotcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMNCi1kZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLg0KLQ0KLVVzZWQgaW46IHNlY3VyaXR5LXJvbGUtcmVmDQotLS0+DQotPCFFTEVNRU5UIHJvbGUtbGluayAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuDQotDQotVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLg0KLQ0KLVVzZWQgaW46IGF1dGgtY29uc3RyYWludCwgcnVuLWFzLCBzZWN1cml0eS1yb2xlLCBzZWN1cml0eS1yb2xlLXJlZg0KLS0tPg0KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgcnVuLWFzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlDQotZXhlY3V0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQNCi10aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuDQotDQotVXNlZCBpbjogc2VydmxldA0KLS0tPg0KLTwhRUxFTUVOVCBydW4tYXMgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4NCi0NCi08IS0tDQotVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eQ0KLWNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLS0tPg0KLTwhRUxFTUVOVCBzZWN1cml0eS1jb25zdHJhaW50IChkaXNwbGF5LW5hbWU/LCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbissDQotYXV0aC1jb25zdHJhaW50PywgdXNlci1kYXRhLWNvbnN0cmFpbnQ/KT4NCi0NCi08IS0tDQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5DQotcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlDQotc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLQ0KLUV4YW1wbGU6DQotDQotICAgIDxzZWN1cml0eS1yb2xlPg0KLQk8ZGVzY3JpcHRpb24+DQotCSAgICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQNCi0JICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4NCi0JPC9kZXNjcmlwdGlvbj4NCi0JPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPg0KLSAgICA8L3NlY3VyaXR5LXJvbGU+DQotLS0+DQotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4NCi0NCi08IS0tDQotVGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdXJpdHkNCi1yb2xlIHJlZmVyZW5jZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzDQotb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSwNCi1hbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZSBzZWN1cml0eSByb2xlIGlzIG5vdA0KLXNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuDQotDQotVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZCBhcyB0aGUNCi1wYXJhbWV0ZXIgdG8gdGhlIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2QNCi1vciB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLg0KLQ0KLVVzZWQgaW46IHNlcnZsZXQNCi0NCi0tLT4NCi08IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbms/KT4NCi0NCi08IS0tDQotVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhDQotc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcw0KLXByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kIGxvYWRlZC4NCi0NCi1Vc2VkIGluOiB3ZWItYXBwDQotLS0+DQotPCFFTEVNRU5UIHNlcnZsZXQgKGljb24/LCBzZXJ2bGV0LW5hbWUsIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywNCi0oc2VydmxldC1jbGFzc3xqc3AtZmlsZSksIGluaXQtcGFyYW0qLCBsb2FkLW9uLXN0YXJ0dXA/LCBydW4tYXM/LCBzZWN1cml0eS1yb2xlLXJlZiopPg0KLQ0KLTwhLS0NCi1UaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQ0KLW9mIHRoZSBzZXJ2bGV0Lg0KLQ0KLVVzZWQgaW46IHNlcnZsZXQNCi0tLT4NCi08IUVMRU1FTlQgc2VydmxldC1jbGFzcyAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmxldA0KLWFuZCBhIHVybCBwYXR0ZXJuDQotDQotVXNlZCBpbjogd2ViLWFwcA0KLS0tPg0KLTwhRUxFTUVOVCBzZXJ2bGV0LW1hcHBpbmcgKHNlcnZsZXQtbmFtZSwgdXJsLXBhdHRlcm4pPg0KLQ0KLTwhLS0NCi1UaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQ0KLXNlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4NCi0NCi1Vc2VkIGluOiBmaWx0ZXItbWFwcGluZywgc2VydmxldCwgc2VydmxldC1tYXBwaW5nDQotLS0+DQotPCFFTEVNRU5UIHNlcnZsZXQtbmFtZSAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSBzZXNzaW9uLWNvbmZpZyBlbGVtZW50IGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycyBmb3INCi10aGlzIHdlYiBhcHBsaWNhdGlvbi4NCi0NCi1Vc2VkIGluOiB3ZWItYXBwDQotLS0+DQotPCFFTEVNRU5UIHNlc3Npb24tY29uZmlnIChzZXNzaW9uLXRpbWVvdXQ/KT4NCi0NCi08IS0tDQotVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0DQotaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUNCi1zcGVjaWZpZWQgdGltZW91dCBtdXN0IGJlIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLg0KLUlmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzIHRoZSBkZWZhdWx0DQotYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUgb3V0Lg0KLQ0KLVVzZWQgaW46IHNlc3Npb24tY29uZmlnDQotLS0+DQotPCFFTEVNRU5UIHNlc3Npb24tdGltZW91dCAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlDQotY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQ0KLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MNCi13YXIgZmlsZS4NCi0NCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0Lg0KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLg0KLQ0KLVVzZWQgaW46IGljb24NCi0NCi1FeGFtcGxlOg0KLQ0KLTxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4NCi0tLT4NCi08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5Lg0KLQ0KLVVzZWQgaW46IHdlYi1hcHANCi0tLT4NCi08IUVMRU1FTlQgdGFnbGliICh0YWdsaWItdXJpLCB0YWdsaWItbG9jYXRpb24pPg0KLQ0KLTwhLS0NCi10aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIChhcyBhIHJlc291cmNlDQotcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnDQotTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4NCi0NCi1Vc2VkIGluOiB0YWdsaWINCi0tLT4NCi08IUVMRU1FTlQgdGFnbGliLWxvY2F0aW9uICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkksIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbg0KLW9mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYg0KLUFwcGxpY2F0aW9uLg0KLQ0KLVVzZWQgaW46IHRhZ2xpYg0KLS0tPg0KLTwhRUxFTUVOVCB0YWdsaWItdXJpICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbg0KLWJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcg0KLUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueQ0KLXRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uDQotcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4NCi1zdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMNCi10aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGENCi1mYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mDQotdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcg0KLUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4NCi0NCi1Vc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludA0KLS0tPg0KLTwhRUxFTUVOVCB0cmFuc3BvcnQtZ3VhcmFudGVlICgjUENEQVRBKT4NCi0NCi08IS0tDQotVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0DQotZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZSBTZXJ2bGV0IEFQSQ0KLVNwZWNpZmljYXRpb24uDQotDQotVXNlZCBpbjogZmlsdGVyLW1hcHBpbmcsIHNlcnZsZXQtbWFwcGluZywgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24NCi0tLT4NCi08IUVMRU1FTlQgdXJsLXBhdHRlcm4gKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhDQotY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZSBwcm90ZWN0ZWQuDQotDQotVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludA0KLS0tPg0KLTwhRUxFTUVOVCB1c2VyLWRhdGEtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCB0cmFuc3BvcnQtZ3VhcmFudGVlKT4NCi0NCi08IS0tDQotVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldA0KLW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViDQotYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmIG5vIEhUVFAgbWV0aG9kcw0KLWFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUA0KLW1ldGhvZHMuDQotDQotVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludA0KLS0tPg0KLTwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiAod2ViLXJlc291cmNlLW5hbWUsIGRlc2NyaXB0aW9uPywNCi11cmwtcGF0dGVybiosIGh0dHAtbWV0aG9kKik+DQotDQotPCEtLQ0KLVRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiByZXNvdXJjZQ0KLWNvbGxlY3Rpb24uDQotDQotVXNlZCBpbjogd2ViLXJlc291cmNlLWNvbGxlY3Rpb24NCi0tLT4NCi08IUVMRU1FTlQgd2ViLXJlc291cmNlLW5hbWUgKCNQQ0RBVEEpPg0KLQ0KLTwhLS0NCi1UaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZSBhcyBhIGRlZmF1bHQNCi13ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbA0KLQ0KLVVzZWQgaW46IHdlbGNvbWUtZmlsZS1saXN0DQotLS0+DQotPCFFTEVNRU5UIHdlbGNvbWUtZmlsZSAoI1BDREFUQSk+DQotDQotPCEtLQ0KLVRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZSBmaWxlcw0KLWVsZW1lbnRzLg0KLQ0KLVVzZWQgaW46IHdlYi1hcHANCi0tLT4NCi08IUVMRU1FTlQgd2VsY29tZS1maWxlLWxpc3QgKHdlbGNvbWUtZmlsZSspPg0KLQ0KLTwhLS0NCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQNCi1pbmZvcm1hdGlvbiAoaS5lLiwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50DQotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhDQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2wtc3BlY2lmaWMgZmlsZXMgdG8gdGhlDQotaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4NCi0NCi1Ub29scyBhcmUgbm90IGFsbG93ZWQgdG8gYWRkIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW50byB0aGUNCi1zdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuDQotLS0+DQotDQotPCFBVFRMSVNUIGF1dGgtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgYXV0aC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGNvbnRleHQtcGFyYW0gaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGRpc3RyaWJ1dGFibGUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBlamItbG9jYWwtcmVmIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgZW52LWVudHJ5LXR5cGUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgZXJyb3ItY29kZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgZXhjZXB0aW9uLXR5cGUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGV4dGVuc2lvbiBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgZmlsdGVyIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBmaWx0ZXItY2xhc3MgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGZpbHRlci1tYXBwaW5nIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBmaWx0ZXItbmFtZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgZm9ybS1lcnJvci1wYWdlIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBmb3JtLWxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgZm9ybS1sb2dpbi1wYWdlIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBodHRwLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgaW5pdC1wYXJhbSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QganNwLWZpbGUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGxpc3RlbmVyIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBsaXN0ZW5lci1jbGFzcyBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgbG9hZC1vbi1zdGFydHVwIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBsb2NhbCBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgbG9jYWwtaG9tZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgbG9jYXRpb24gaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIGxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgbWltZS1tYXBwaW5nIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBtaW1lLXR5cGUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHBhcmFtLW5hbWUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCByZWFsbS1uYW1lIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHJlcy1zaGFyaW5nLXNjb3BlIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZiBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHJlc291cmNlLXJlZiBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1Qgcm9sZS1saW5rIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHJ1bi1hcyBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1Qgc2VjdXJpdHktY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1Qgc2VjdXJpdHktcm9sZS1yZWYgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHNlcnZsZXQgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHNlcnZsZXQtY2xhc3MgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHNlcnZsZXQtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1Qgc2VydmxldC1uYW1lIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBzZXNzaW9uLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1Qgc2Vzc2lvbi10aW1lb3V0IGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHRhZ2xpYi1sb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgdGFnbGliLXVyaSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgdHJhbnNwb3J0LWd1YXJhbnRlZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1QgdXJsLXBhdHRlcm4gaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHVzZXItZGF0YS1jb25zdHJhaW50IGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCB3ZWItYXBwIGlkIElEICNJTVBMSUVEPg0KLTwhQVRUTElTVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1Qgd2ViLXJlc291cmNlLW5hbWUgaWQgSUQgI0lNUExJRUQ+DQotPCFBVFRMSVNUIHdlbGNvbWUtZmlsZSBpZCBJRCAjSU1QTElFRD4NCi08IUFUVExJU1Qgd2VsY29tZS1maWxlLWxpc3QgaWQgSUQgI0lNUExJRUQ+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9XRUItSU5GL3hjb25mL2x1Y2VuZTIueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYveGNvbmYvbHVjZW5lMi54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4Y2VjYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL1dFQi1JTkYveGNvbmYvbHVjZW5lMi54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08Y29tcG9uZW50cz4KLSAgPCEtLSBJbmNsdWRlIGRlcGVuZGVuY2llcyAtLT4KLSAgPGluY2x1ZGUgc3JjPSJjb250ZXh0Oi8vV0VCLUlORi94Y29uZi9jb2Nvb24teHNwLnhjb25mIi8+Ci0KLSAgPCEtLSBJbmNsdWRlIHJvbGVzIC0tPgotICA8aW5jbHVkZSBzcmM9InJlc291cmNlOi8vb3JnL2FwYWNoZS9jb2Nvb24vY29tcG9uZW50cy9zZWFyY2gvbHVjZW5lMi5yb2xlcyIvPgotCi0gIDwhLS0gU2VhcmNoOgotICAgIFRoZXNlIGFyZSB0aGUgY29tcG9uZW50cyB0aGF0IGhhbmRsZSB0aGUgc2VhcmNoLiAKLSAgICAKLSAgIC0tPgotCTxhbmFseXplcl9tYW5hZ2VyIGxvZ2dlcj0iY29yZS5zZWFyY2guYW5hbHl6ZXJfbWFuYWdlciI+Ci0JCTxhbmFseXplciBpZD0ic3RhbmRhcmQiIGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zdGFuZGFyZC5TdGFuZGFyZEFuYWx5emVyIi8+Ci0JCTxhbmFseXplciBpZD0ic3RvcHdvcmRfZW4iIGNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5hbmFseXplci5Db25maWd1cmFibGVTdG9wd29yZEFuYWx5emVyIiBjb25maWdmaWxlPSJjb250ZXh0Oi8vV0VCLUlORi9hbmFseXplci9zdG9wd29yZC9FbmdsaXNoX2VuLnhtbCIgY2hlY2t1cGRhdGU9InRydWUiLz4KLQkJPGFuYWx5emVyIGlkPSJzdG9wd29yZF9mciIgY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmFuYWx5emVyLkNvbmZpZ3VyYWJsZVN0b3B3b3JkQW5hbHl6ZXIiIGNvbmZpZ2ZpbGU9ImNvbnRleHQ6Ly9XRUItSU5GL2FuYWx5emVyL3N0b3B3b3JkL0ZyZW5jaF9mci54bWwiIGNoZWNrdXBkYXRlPSJ0cnVlIi8+Ci0JCTxhbmFseXplciBpZD0iYW5hbHl6ZXJfcmVzZWFyY2giIGNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLnNlYXJjaC5hbmFseXplci5Db25maWd1cmFibGVQZXJGaWVsZEFuYWx5emVyIiBjb25maWdmaWxlPSJjb250ZXh0Oi8vV0VCLUlORi9hbmFseXplci9wZXJmaWVsZGNvbmYueG1sIiBjaGVja3VwZGF0ZT0iZmFsc2UiLz4KLQk8L2FuYWx5emVyX21hbmFnZXI+Ci0JCi0JPGluZGV4X21hbmFnZXIgbG9nZ2VyPSJjb3JlLnNlYXJjaC5pbmRleF9tYW5hZ2VyIj4KLQkJCi0JCTxpbmRleGVyIHJvbGU9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VhcmNoLmNvbXBvbmVudHMuSW5kZXhlci9kZWZhdWx0IiAvPgotCQkKLQkJPCEtLSBBTEwgaW5kZXhlcyAoQkUgQ0FSRUZVTDogCUNoYW5nZSB0aGUgZGlyZWN0b3J5IGF0dHJpYnV0ZSkgCQktLT4KLQkJPGluZGV4ZXM+Ci0JCQotCQkJPCEtLQotCQkJaWQgYXR0cmlidXRlIDogdGhlIGluZGV4IGlkIAotCQkJZGVmYXVsdEFuYWx5emVyOiB0aGUgaWQgb2YgdGhlIGRlZmF1bHQgYW5hbHl6ZXIgKHJlZ2lzdGVyZWQgaW4gQW5hbHl6ZXJNYW5hZ2VyKQotCQkJZGlyZWN0b3J5OiB0aGUgbG9jYXRpb24gb2YgdGhlIHBoeXNpY2FsIGluZGV4IAotCQkJLS0+Ci0JCQk8aW5kZXggaWQ9InJlc2VhcmNoIiBhbmFseXplcj0iYW5hbHl6ZXJfcmVzZWFyY2giIGRpcmVjdG9yeT0iZDpcXGluZGV4Ij4KLQkJCQk8c3RydWN0dXJlPgotCQkJCQk8IS0tCi0JCQkJCXR5cGUgdGV4dDogIHRva2VuaXplZCAsIGluZGV4ZWQgICAod2l0aCB0aGUgYWRkaXRpb25hbCBhdHRyaWJ1dGUgInN0b3JlVGV4dCIgIDogc3RvcmVkLyB1bnN0b3JlZCkKLQkJCQkJdHlwZSBrZXl3b3JkOiAgbm8gdG9rZW5pemVkICwgaW5kZXhlZCwgc3RvcmVkCi0JCQkJCXR5cGUgZGF0ZSA9IHR5cGUga2V5d29yZCAgYnV0IGZvciBzcGVjaWZpYyBkYXRlIHR5cGUKLQkJCQkJLS0+Ci0JCQkJCTxmaWVsZCBpZD0idGl0bGUiIHR5cGU9InRleHQiIHN0b3JldGV4dD0idHJ1ZSIvPgotCQkJCQk8ZmllbGQgaWQ9ImF1dGhvciIgdHlwZT0idGV4dCIvPgotCQkJCQk8ZmllbGQgaWQ9ImRlc2NyaXB0aW9uX2ZyIiB0eXBlPSJ0ZXh0IiBzdG9yZXRleHQ9InRydWUiLz4KLQkJCQkJPGZpZWxkIGlkPSJkZXNjcmlwdGlvbl9lbiIgdHlwZT0idGV4dCIgc3RvcmV0ZXh0PSJ0cnVlIi8+Ci0JCQkJCTxmaWVsZCBpZD0iZGF0ZSIgdHlwZT0iZGF0ZSIgZGF0ZWZvcm1hdD0ieXl5eS1NTS1kZCIvPiAKLQkJCQkJPGZpZWxkIGlkPSJzdWJqZWN0IiB0eXBlPSJrZXl3b3JkIi8+Ci0JCQkJCTxmaWVsZCBpZD0ibGV2ZWwiIHR5cGU9ImtleXdvcmQiLz4gCi0JCQkJCTxmaWVsZCBpZD0idHlwZSIgdHlwZT0ia2V5d29yZCIgLz4KLQkJCQkJPGZpZWxkIGlkPSJmb3JtYXQiIHR5cGU9ImtleXdvcmQiIC8+Ci0JCQkJCTxmaWVsZCBpZD0idG9waWMiIHR5cGU9ImtleXdvcmQiIC8+Ci0JCQkJPC9zdHJ1Y3R1cmU+Ci0JCQk8L2luZGV4PgotCQkJCi0JCQk8IS0tIFNUQU5EQVJEIEhUTUwgSU5ERVggIC0tPgotCQkJPGluZGV4IGlkPSJIVE1MIiBhbmFseXplcj0ic3RvcHdvcmRfZW4iIGRpcmVjdG9yeT0iZDpcXGluZGV4MiIgPgotCQkJCTxzdHJ1Y3R1cmU+Ci0JCQkJCTxmaWVsZCBpZD0idXJsIiB0eXBlPSJrZXl3b3JkIiAvPgotCQkJCQk8ZmllbGQgaWQ9InRpdGxlIiB0eXBlPSJ0ZXh0IiBzdG9yZXRleHQ9InRydWUiLz4KLQkJCQkJPGZpZWxkIGlkPSJib2R5IiB0eXBlPSJ0ZXh0IiBzdG9yZXRleHQ9ImZhbHNlIi8+Ci0JCQkJPC9zdHJ1Y3R1cmU+Ci0JCQk8L2luZGV4PgotCQk8L2luZGV4ZXM+Ci0JPC9pbmRleF9tYW5hZ2VyPgotCi08IS0tIGRlZmF1bHQgaW5kZXhlciBjb21wb25lbnQgLS0+CQotCTxkZWZhdWx0X2luZGV4ZXIgbG9nZ2VyPSJjb3JlLnNlYXJjaC5kZWZhdWx0X2luZGV4ZXIiPgotCQk8IS0tIG51bWJlciBvZiBsdWNlbmUgZG9jdW1lbnRzIGluIHRoZSBidWZmZXIgLS0+Ci0JCTxidWZmZXJzaXplPjIwMDwvYnVmZmVyc2l6ZT4KLQk8L2RlZmF1bHRfaW5kZXhlcj4KLQkKLTwhLS0gcGFyYWxsZWwgaW5kZXhlciBjb21wb25lbnQgLS0+CQkKLQk8cGFyYWxsZWxfaW5kZXhlciBsb2dnZXI9ImNvcmUuc2VhcmNoLnBhcmFsbGVsX2luZGV4ZXIiPgotCQk8IS0tIG51bWJlciBvZiB0aHJlYWQgKG5vcm1hbHkgPSBudW1iZXIgb2YgQ1BVcykgLS0+Ci0JCTxudW10aHJlYWQ+MjwvbnVtdGhyZWFkPgotCTwvcGFyYWxsZWxfaW5kZXhlcj4KLQkKLQkKLTwvY29tcG9uZW50cz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvZXJyb3IueG1hcCBiL3RydW5rL3NyYy93ZWJhcHAvZXJyb3IueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwODEyOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2Vycm9yLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDxtYXA6cmVzb3VyY2VzPgotICAgIDxtYXA6cmVzb3VyY2UgbmFtZT0ic3R5bGUtY21zLXBhZ2UiPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+ICAgICAgCi0gICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdmFsdWU9IntyZXF1ZXN0OmxvY2FsZX0iLz4KLSAgICAgIDwvbWFwOnRyYW5zZm9ybT4gICAgCi0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC91dGlsL3BhZ2UyeGh0bWwueHNsIi8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJwcm94eSIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJjb250ZXh0Oi8vbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsIi8+Ci0gICAgPC9tYXA6cmVzb3VyY2U+Ci0gIDwvbWFwOnJlc291cmNlcz4KLSAgCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioqIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJub3RpZnlpbmciLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvZXhjZXB0aW9uL2dlbmVyaWMueHNsIi8+Ci0gICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0ic3R5bGUtY21zLXBhZ2UiIC8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2wiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieGh0bWwiIHN0YXR1cy1jb2RlPSI1MDAiIC8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgPC9tYXA6cGlwZWxpbmVzPgotICAKLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2dsb2JhbC1zaXRlbWFwLnhtYXAgYi90cnVuay9zcmMvd2ViYXBwL2dsb2JhbC1zaXRlbWFwLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWIxODguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9nbG9iYWwtc2l0ZW1hcC54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLSAgICAKLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0KLSAgPG1hcDpyZXNvdXJjZXM+Ci0KLSAgICA8bWFwOnJlc291cmNlIG5hbWU9InN0eWxlLWNtcy1wYWdlIj4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPiAgICAgIAotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm0+ICAgIAotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9wYWdlMnhodG1sLnhzbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icHJveHkiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iY29udGV4dDovL2xlbnlhL3hzbHQvdXRpbC9zdHJpcF9uYW1lc3BhY2VzLnhzbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvcHJldHR5cHJpbnRpbmcveHNsdC94bWwybmljZXhtbC54c2wiLz4KLSAgICA8L21hcDpyZXNvdXJjZT4gIAotCi0gICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJpMThuIj4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPgotICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHZhbHVlPSJ7cmVxdWVzdDpsb2NhbGV9Ii8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgPC9tYXA6cmVzb3VyY2U+Ci0KLSAgICA8IS0tIGRvIHByb3h5IHRyYW5zZm9ybWF0aW9uIG9uIGNzcyBmaWxlcyBmb3IgdXJsKCcnKSBsaW5rcyAtLT4KLSAgICA8bWFwOnJlc291cmNlIG5hbWU9InByb3h5LWNzcyI+Ci0gICAgICA8bWFwOmFjdCB0eXBlPSJyZXNvdXJjZS1leGlzdHMiCi0gICAgICAgIHNyYz0ie3VybH0ueG1sIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9InsuLi91cmx9LnhtbCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvcmVzb3VyY2VzL2Nzcy9jc3MueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJyb290IiB2YWx1ZT0iL3twYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS97cGFnZS1lbnZlbG9wZTphcmVhfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0icHJlcGFyZS1wcm94eS1jc3MiLz4KLSAgICAgIDwvbWFwOmFjdD4KLSAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0idGV4dCIgc3JjPSJ7dXJsfS5jc3MiLz4KLSAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0icHJlcGFyZS1wcm94eS1jc3MiLz4KLSAgICA8L21hcDpyZXNvdXJjZT4KLQotICAgIDwhLS0gCi0gICAgICBjaGFwZXJvbiBtYWdpYzogcGFyc2UgY3NzIGZpbGVzLCBjb252ZXJ0IHVybCgnJykgbGlua3MgaW50byB4bWwgc25pcHBldHMsIGZlZWQgdGhlbQotICAgICAgdG8gdGhlIHN0YW5kYXJkIHByb3h5IHRyYW5zZm9ybWVyLCB0aGVuIGNvbnZlcnQgdGhlIGludGVybWVkaWF0ZSB4bWwgYmFjayB0byB2YWxpZCBjc3MuCi0gICAgLS0+Ci0gICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJwcmVwYXJlLXByb3h5LWNzcyI+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJwYXR0ZXJuIgotICAgICAgICBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY2hhcGVyb24vZ3JhbW1hcnMvbGluay54bGV4Ii8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybQotICAgICAgICBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY2hhcGVyb24vc3R5bGVzaGVldHMvcGF0dGVybi10by1saW5rLnhzbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icHJveHkiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtCi0gICAgICAgIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9jaGFwZXJvbi9zdHlsZXNoZWV0cy9hLXRvLXR4dC54c2wiLz4KLSAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InRleHQiIG1pbWUtdHlwZT0idGV4dC9jc3MiLz4KLSAgICA8L21hcDpyZXNvdXJjZT4KLQotICA8L21hcDpyZXNvdXJjZXM+Ci0KLQotCi0gIDxtYXA6cGlwZWxpbmVzPgotICAKLSAgICA8bWFwOmNvbXBvbmVudC1jb25maWd1cmF0aW9ucz4KLSAgICAgIDxnbG9iYWwtdmFyaWFibGVzPgotICAgICAgICA8IS0tIAotICAgICAgICAgIHBpcGVsaW5lIGV4cGlyYXRpb24gdGltZSAoZ292ZXJucyB0aGUgc2V0dGluZyBvZiAiZXhwaXJlcyIgaGVhZGVycyBmb3IgYnJvd3Nlci1zaWRlCi0gICAgICAgICAgY2FjaGluZyksIHNlZSBodHRwOi8vY29jb29uLmFwYWNoZS5vcmcvMi4xL3VzZXJkb2NzL2NvbmNlcHRzL2NhY2hpbmcuaHRtbAotICAgICAgICAtLT4KLSAgICAgICAgPHBpcGVsaW5lLWV4cGlyYXRpb24+bm93PC9waXBlbGluZS1leHBpcmF0aW9uPgotICAgICAgPC9nbG9iYWwtdmFyaWFibGVzPgotICAgIDwvbWFwOmNvbXBvbmVudC1jb25maWd1cmF0aW9ucz4KLSAgCi0gICAgPCEtLSBjcmVhdGUgYSBsaXN0IG9mIHB1YmxpY2F0aW9ucyBmb3IgdGhlIGdsb2JhbCB3ZWxjb21lIHBhZ2U6IC0tPiAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iYWdncmVnYXRlLXB1YmxpY2F0aW9ucyI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0iZGlyZWN0b3J5IiBzcmM9ImxlbnlhL3B1YnMiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJsZW55YS94c2x0L3V0aWwvYWdncmVnYXRlLXB1YmxpY2F0aW9ucy54c2wiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0ieGluY2x1ZGUiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLQotICAgIDwhLS0gRklYTUU6IHRoaXMgc2hvdWxkIGdvIGludG8gYSBjZm9ybXMgc3VwcG9ydCBtb2R1bGUgLS0+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJjZm9ybXMvYWpheC8qKiI+Ci0gICAgICAgIDxtYXA6cmVhZCBzcmM9InJlc291cmNlOi8vb3JnL2FwYWNoZS9jb2Nvb24vYWpheC9yZXNvdXJjZXMvezF9Ii8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4gICAKLSAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJjZm9ybXMvZG9qby8qKiI+Ci0gICAgICAgIDxtYXA6cmVhZCBzcmM9InJlc291cmNlOi8vb3JnL2FwYWNoZS9jb2Nvb24vZG9qby9yZXNvdXJjZXMvezF9Ii8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4gCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iY2Zvcm1zL2Zvcm1zLyoqIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0icmVzb3VyY2U6Ly9vcmcvYXBhY2hlL2NvY29vbi9mb3Jtcy9yZXNvdXJjZXMvezF9Ii8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLQotCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDwhLS0gc2VydmUgImxlbnlhLyIgcmVzb3VyY2VzIChHVUkgYW5kIHV0aWxpdGllcykgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImxlbnlhLyoqIj4KLSAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSJsZW55YSIgc3JjPSJsZW55YS9sZW55YS54bWFwIiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIiBwYXNzLXRocm91Z2g9InRydWUiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gICAgPCEtLSBNZW51IGdlbmVyYXRpb246IC0tPgotICAgIDxtYXA6cGlwZWxpbmUgaW50ZXJuYWwtb25seT0idHJ1ZSI+Ci0KLSAgICAgIDwhLS0gR2VuZXJhdGUgYSBtZXRhLXN0eWxlc2hlZXQgdGhhdCBhZGRzIHRoZSBMZW55YSBHVUkgbWVudSB0byBwYWdlcyAtLT4KLSAgICAgIDwhLS0gbGVueWEtcGFnZS97cHVibGljYXRpb24taWR9L3thcmVhfS8uLi4gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImxlbnlhLXBhZ2UvKi8qLyoqIj4KLSAgICAgICAgPCEtLSBubyBtZW51IGZvciByZXZpc2lvbnMgLS0+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVxdWVzdC1wYXJhbWV0ZXIiIHBhdHRlcm49ImxlbnlhLnJldmlzaW9uIj4KLSAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0ibGVueWEveHNsdC91dGlsL2lkZW50aXR5LnhzbCIvPgotICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgPCEtLSBmb3IgZXZlcnl0aGluZyBlbHNlOiAtLT4gCi0gICAgICAgIDxtYXA6YWdncmVnYXRlIGVsZW1lbnQ9Im1lbnUiIG5zPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiPgotICAgICAgICAgIDxtYXA6cGFydCBzcmM9ImNvY29vbjovbWVudS14bWwvezF9L3syfS97M30iIHN0cmlwLXJvb3Q9InRydWUiLz4KLSAgICAgICAgICA8bWFwOnBhcnQgc3JjPSJjb2Nvb246L21lbnUteG1sL21vZHVsZXMvezF9L3syfS54bWwiIHN0cmlwLXJvb3Q9InRydWUiLz4KLSAgICAgICAgPC9tYXA6YWdncmVnYXRlPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImxlbnlhL3hzbHQvbWVudS9tZXJnZS1tZW51cy54c2wiLz4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJsZW55YS94c2x0L21lbnUvZmlsdGVyLW1lbnUueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ0YWJHcm91cCIgdmFsdWU9Int1c2VjYXNlOnRhYkdyb3VwOntyZXF1ZXN0LXBhcmFtOmxlbnlhLnVzZWNhc2V9fSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDwhLS0gRGlzYWJsZSBtZW51IGl0ZW1zIGFjY29yZGluZyB0byB1c2VjYXNlIHBvbGljaWVzIC0tPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJ1c2VjYXNlbWVudSIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9tZW51L21lbnViYXIyeGh0bWwueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbmlkIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9InsyfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50dXJsIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXJsfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50aWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVzZXJpZCIgdmFsdWU9InthY2Nlc3MtY29udHJvbDp1c2VyLWlkfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InNlcnZlcnRpbWUiIHZhbHVlPSJ7ZGF0ZS1pMThuOmN1cnJlbnREYXRlfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IndvcmtmbG93c3RhdGUiIHZhbHVlPSJ7d29ya2Zsb3c6c3RhdGV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iaXNsaXZlIiB2YWx1ZT0ie3dvcmtmbG93OnZhcmlhYmxlLmlzX2xpdmV9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlY2FzZSIgdmFsdWU9IntyZXF1ZXN0LXBhcmFtOmxlbnlhLnVzZWNhc2V9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idGFiR3JvdXAiIHZhbHVlPSJ7dXNlY2FzZTp0YWJHcm91cDp7cmVxdWVzdC1wYXJhbTpsZW55YS51c2VjYXNlfX0iLz4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJuZXdNZXNzYWdlcyIgdmFsdWU9IntpbmJveDpuZXdNZXNzYWdlQ291bnR9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpjYWxsIHJlc291cmNlPSJpMThuIi8+Ci0gICAgICAgIDwhLS0gR2VuZXJhdGUgdGhlIG1ldGEtc3R5bGVzaGVldCAtLT4KLSAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvbWVudS9tZW51MnhzbHQueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJsaWNhdGlvbmlkIiB2YWx1ZT0iezF9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9InsyfSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50dXJsIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6ZG9jdW1lbnQtdXJsfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLQotICAgICAgPCEtLSBjb2xsZWN0IHRoZSBtZW51IGl0ZW1zIGZvciBhbGwgbW9kdWxlcyB1c2VkIGluIHRoZSBwdWJsaWNhdGlvbiAtLT4KLSAgICAgIDwhLS0gbWVudS14bWwvbW9kdWxlcy97cHViLWlkfS97YXJlYX0ueG1sIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJtZW51LXhtbC9tb2R1bGVzLyovKi54bWwiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iYWdncmVnYXRlLWZhbGxiYWNrOi8vY29uZmlnL3B1YmxpY2F0aW9uLnhtbCIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImxlbnlhL3hzbHQvbW9kdWxlcy9tb2R1bGVzMnhpbmNsdWRlLnhzbCI+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iYXJlYSIgdmFsdWU9InsyfSIvPgotICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InhpbmNsdWRlIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gIAotICAgICAgPCEtLSBxdWVyeSBtZW51IGl0ZW1zIGZyb20gbW9kdWxlcyAodXNlZCBieSB0aGUgeGluY2x1ZGUgYWJvdmUpIC0tPgotICAgICAgPCEtLSBtZW51LXhtbC9tb2R1bGUve2FyZWF9L3ttb2R1bGUtaWR9LnhtbCAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0ibWVudS14bWwvbW9kdWxlLyovKi54bWwiPgotICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJyZXNvdXJjZS1leGlzdHMiPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvezJ9L21lbnVzLnhtYXAiPgotICAgICAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSJtZW51LXhtbC9tb2R1bGUvezF9LyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvezJ9L21lbnVzLnhtYXAiIGNoZWNrLXJlbG9hZD0idHJ1ZSIgcmVsb2FkLW1ldGhvZD0ic3luY2hyb24iIHBhc3MtdGhyb3VnaD0idHJ1ZSIvPgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgPG1hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImxlbnlhL2NvbnRlbnQvbWVudXMvbGl2ZS54c3AiLz4KLSAgICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDwhLS0gZ2xvYmFsIGFkbWluIG1lbnUgaXRlbXMgLS0+Ci0gICAgICA8IS0tIEZJWE1FOiB0aGlzIGlzIGFjdHVhbGx5IGluZGVwZW5kZW50IGZyb20gdGhlIHB1YmxpY2F0aW9uLWlkISAtLT4KLSAgICAgIDwhLS0gbWVudS14bWwve3B1YmxpY2F0aW9uLWlkfS9hZG1pbi8uLi4gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im1lbnUteG1sLyovYWRtaW4vKioiIGludGVybmFsLW9ubHk9InRydWUiPgotICAgICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InNlcnZlcnBhZ2VzIiBzcmM9ImxlbnlhL2NvbnRlbnQvbWVudXMvYWRtaW4ueHNwIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDwhLS0gaW5jbHVkZSBwdWJsaWNhdGlvbi1zcGVjaWZpYyBtZW51cyAtLT4KLSAgICAgIDwhLS0gbWVudS14bWwve3B1YmxpY2F0aW9uLWlkfS8uLi4gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im1lbnUteG1sLyovKioiIGludGVybmFsLW9ubHk9InRydWUiPgotICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9Im1lbnUteG1sL3sxfS8iIHNyYz0ie2ZhbGxiYWNrOm1lbnVzLnhtYXB9IiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIiBwYXNzLXRocm91Z2g9InRydWUiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIEZJWE1FOiB0aGlzIGlzIGN1cnJlbnRseSB1bnVzZWQgLS0+Ci0gICAgICA8IS0tIEFjY2VzcyBDb250cm9sIFBvbGljaWVzIC0tPgotPCEtLQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqL3BvbGljaWVzLyoqIj4KLSAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSJ7MX0vcG9saWNpZXMiIHNyYz0ibGVueWEvcHVicy97MX0vcG9saWNpZXMtc2l0ZW1hcC54bWFwIiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIiBwYXNzLXRocm91Z2g9InRydWUiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotLS0+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0KLQotICAgIDwhLS0gTW9kdWxlIHJlcXVlc3RzIC0tPgotICAgIAotICAgIDwhLS0gYW4gZXh0cmEgaGFuZGxlciBmb3IgaW50ZXJuYWwgbW9kdWxlIHJlcXVlc3RzIHRvIGF2b2lkIHRoZSByZXNvdXJjZS1leGlzdHMgY2hlY2sgCi0gICAgICAgICBpbiB0aGUgZXh0ZXJuYWwgcmVxdWVzdHMgbWF0Y2hlcgotICAgICAgICAgRklYTUU6IGlzIHRoZSBvdmVyaGVhZCByZWR1Y3Rpb24gd29ydGggdGhlIGV4dHJhIGNvbXBsaWNhdGlvbj8KLSAgICAgICAgIEZJWE1FOiBkb2Vzbid0IHRoaXMgbWVhbiB0aGF0IGludGVybmFsIHJlcXVlc3RzIGFyZW4ndCBzZXJ2ZWQgc3RhdGljYWxseSAoc2VlIGJlbG93KSBhbmQKLSAgICAgICAgIHJlc291cmNlcyBtaWdodCBub3QgZXZlbiBiZSBhdmFpbGFibGUgdG8gaW50ZXJuYWwgcmVxdWVzdHMgaWYgdGhlIG1vZHVsZSBzaXRlbWFwIGRvZXNuJ3QKLSAgICAgICAgIGhhbmRsZSB0aGVtPwotICAgIC0tPgotICAgIDxtYXA6cGlwZWxpbmUgaW50ZXJuYWwtb25seT0idHJ1ZSI+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im1vZHVsZXMvKi8qKiI+Ci0gICAgICAgIDxtYXA6bW91bnQgdXJpLXByZWZpeD0ibW9kdWxlcy97MX0vIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97MX0vc2l0ZW1hcC54bWFwIiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi9tb2R1bGVzLyovKioiPgotICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9InsxfS9tb2R1bGVzL3syfS8iIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3syfS9zaXRlbWFwLnhtYXAiIGNoZWNrLXJlbG9hZD0idHJ1ZSIgcmVsb2FkLW1ldGhvZD0ic3luY2hyb24iLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0KLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im1vZHVsZXMvKi8qKiI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPCEtLSByZXNvdXJjZSBleGlzdHMgLSBzZXJ2ZSBzdGF0aWNhbGx5IC0tPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvezF9L3Jlc291cmNlcy97Mn0iPgotICAgICAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSJtb2R1bGVzLyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZS1yZXNvdXJjZXMueG1hcCIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIgcGFzcy10aHJvdWdoPSJ0cnVlIi8+Ci0gICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICA8IS0tIHJlc291cmNlIGRvZXNuJ3QgZXhpc3Qgb3Igbm90IGhhbmRsZWQgYnkgbGVueWEvbW9kdWxlLXJlc291cmNlcy54bWFwIAotICAgICAgICAgICAgIC0gZGVsZWdhdGUgdG8gbW9kdWxlIC0tPgotICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9Im1vZHVsZXMvezF9LyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvezF9L3NpdGVtYXAueG1hcCIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDwhLS0gUHVibGljYXRpb24gc3BlY2lmaWMgTW9kdWxlIHJlcXVlc3RzIC0tPgotICAgICAgPCEtLSBOT1RFOiB0aGUgdXNlIG9mIHB1YmxpY2F0aW9uLXNwZWNpZmljIG1vZHVsZXMgaXMgZGlzY291cmFnZWQsIHNpbmNlIGFsbCBtb2R1bGVzIGFyZSBhY3R1YWxseSBpbiBvbmUgZ2xvYmFsIHNjb3BlLi4gLS0+Ci0gICAgICA8IS0tIHtwdWJsaWNhdGlvbi1pZH0vbW9kdWxlcy97bW9kdWxlLWlkfS8uLi4gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovbW9kdWxlcy8qLyoqIj4KLSAgICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzIj4KLSAgICAgICAgICA8IS0tIHJlc291cmNlIGV4aXN0cyAtIHNlcnZlIHN0YXRpY2FsbHkgLS0+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Mn0vcmVzb3VyY2VzL3szfSI+Ci0gICAgICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9InsxfS9tb2R1bGVzLyIgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZS1yZXNvdXJjZXMueG1hcCIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIgcGFzcy10aHJvdWdoPSJ0cnVlIi8+Ci0gICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgICA8IS0tIHJlc291cmNlIGRvZXNuJ3QgZXhpc3Qgb3Igbm90IGhhbmRsZWQgYnkgbGVueWEvbW9kdWxlLXJlc291cmNlcy54bWFwIAotICAgICAgICAgICAgIC0gZGVsZWdhdGUgdG8gbW9kdWxlIC0tPgotICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9InsxfS9tb2R1bGVzL3syfS8iIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3syfS9zaXRlbWFwLnhtYXAiIGNoZWNrLXJlbG9hZD0idHJ1ZSIgcmVsb2FkLW1ldGhvZD0ic3luY2hyb24iLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0KLSAgICA8IS0tIEludGVybmFsIHVzZWNhc2VzIC0tPgotICAgIDwhLS0gCi0gICAgICAgV2UgbWF0Y2ggaW50ZXJuYWwgcmVxdWVzdHMgdG8gdGhlIHB1YmxpY2F0aW9uIHNpdGVtYXAgZWFybHkgdG8gYXZvaWQgdGhlCi0gICAgICAgdGltZS1jb25zdW1pbmcgcmVzb3VyY2UtZXhpc3RzIG9wZXJhdGlvbnMgaW4gdGhlIHN1YnNlcXVlbnQgcGlwZWxpbmVzCi0gICAgICAgYmVmb3JlIHRoZSBmaW5hbCBwdWJsaWNhdGlvbiBtYXRjaGVyIGlzIHJlYWNoZWQuCi0gICAgLS0+Ci0gICAgPG1hcDpwaXBlbGluZSBpbnRlcm5hbC1vbmx5PSJ0cnVlIj4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qKiI+Ci0gICAgICAgIDxtYXA6bW91bnQgdXJpLXByZWZpeD0iezF9IiBzcmM9ImxlbnlhL3B1YnMvezF9L3NpdGVtYXAueG1hcCIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8IS0tIGVudGVyIGEgbW9kdWxlIHZpYSByZXF1ZXN0IHBhcmFtZXRlciAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVxdWVzdC1wYXJhbWV0ZXIiIHBhdHRlcm49ImxlbnlhLm1vZHVsZSI+Ci0gICAgICAgIDxtYXA6bW91bnQgdXJpLXByZWZpeD0iIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97MX0vc2l0ZW1hcC54bWFwIiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgICAgPCEtLSBkZWxlZ2F0ZSB1c2VjYXNlcyB0byB0aGUgdXNlY2FzZSBzaXRlbWFwIC0tPgotICAgICAgPG1hcDptYXRjaCB0eXBlPSJ1c2VjYXNlIiBwYXR0ZXJuPSIqIj4KLSAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSIiIHNyYz0ibGVueWEvdXNlY2FzZS54bWFwIiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gICAgPG1hcDpwaXBlbGluZT4KLQotICAgICAgPCEtLSB0aGUgTGVueWEgd2VsY29tZSBwYWdlIHdpdGggYSBsaXN0IG9mIGF2YWlsYWJsZSBwdWJsaWNhdGlvbnMgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImluZGV4Lmh0bWwiPgotICAgICAgICA8bWFwOmFnZ3JlZ2F0ZSBlbGVtZW50PSJhZ2dyZWdhdGlvbi13cmFwcGVyIiBsYWJlbD0iYWdncmVnYXRlIj4KLSAgICAgICAgICA8bWFwOnBhcnQgc3JjPSJjb2Nvb246L2FnZ3JlZ2F0ZS1wdWJsaWNhdGlvbnMiLz4KLSAgICAgICAgICA8bWFwOnBhcnQgc3JjPSJsZW55YS9jb250ZW50L3dlbGNvbWUueG1sIi8+Ci0gICAgICAgICAgPG1hcDpwYXJ0IHNyYz0icmVhZG1lLnhtbCIvPgotICAgICAgICA8L21hcDphZ2dyZWdhdGU+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0ibGVueWEveHNsdC91dGlsL3dlbGNvbWUueHNsIi8+Ci0gICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0ic3R5bGUtY21zLXBhZ2UiLz4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIGFueSByb290LWxldmVsIHJlcXVlc3QgaXMgZGlyZWN0ZWQgdG8gdGhlIHdlbGNvbWUgcGFnZSAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKiI+Ci0gICAgICAgIDxtYXA6cmVkaXJlY3QtdG8gdXJpPSJ7cHJveHk6L2luZGV4Lmh0bWx9Ii8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgICAgPCEtLSBGSVhNRTogdGhpcyBpcyBhcHBhcmVudGx5IFdlYkRBVi1yZWxhdGVkLiBEb2VzIGl0IGhhdmUgdG8gYmUgaGVyZSwgYW5kIHdoYXQgZG9lcyBpdCBkbz8gLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioiPgotICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJyZXF1ZXN0LW1ldGhvZCI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9IlBST1BGSU5EIj4KLSAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgdHlwZT0iZmlsZSIgc3JjPSJjb250ZXh0Oi8vbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbCIvPgotICAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvd2ViZGF2L3hzbHQvaW5pdC54c2wiPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwdWJpZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfSIvPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB2YWx1ZT0ie3JlcXVlc3Q6Y29udGV4dFBhdGh9Ii8+Ci0gICAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiIHN0YXR1cy1jb2RlPSIyMDciLz4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICAgIDxtYXA6d2hlbiB0ZXN0PSJPUFRJT05TIj4KLSAgICAgICAgICAgIDxtYXA6bW91bnQgdXJpLXByZWZpeD0iIiBzcmM9IntmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvd2ViZGF2L3NpdGVtYXAueG1hcH0iIGNoZWNrLXJlbG9hZD0idHJ1ZSIgcmVsb2FkLW1ldGhvZD0ic3luY2hyb24iLz4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICA8L21hcDptYXRjaD4gCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfS8iPgotICAgICAgICA8bWFwOnNlbGVjdCB0eXBlPSJyZXF1ZXN0LW1ldGhvZCI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9IlBST1BGSU5EIj4KLSAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJmaWxlIiBzcmM9ImNvbnRleHQ6Ly9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIi8+Ci0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy93ZWJkYXYveHNsdC9pbml0LnhzbCI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InB1YmlkIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9Ii8+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHZhbHVlPSJ7cmVxdWVzdDpjb250ZXh0UGF0aH0iLz4gICAgICAgICAgICAKLSAgICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIgc3RhdHVzLWNvZGU9IjIwNyIvPgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9Ik9QVElPTlMiPgotICAgICAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSIiIHNyYz0ie2ZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy93ZWJkYXYvc2l0ZW1hcC54bWFwfSIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgIDwvbWFwOnNlbGVjdD4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIHJlZGlyZWN0IHB1YmxpY2F0aW9uIHJvb3QgcmVxdWVzdHMgdG8gdGhlIHB1YmxpY2F0aW9uJ3Mgd2VsY29tZSBwYWdlIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyI+Ci0gICAgICAgIDxtYXA6cmVkaXJlY3QtdG8gdXJpPSJ7cHJveHk6L2ludHJvZHVjdGlvbi5odG1sfSIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovaW5kZXguaHRtbCI+Ci0gICAgICAgIDxtYXA6cmVkaXJlY3QtdG8gdXJpPSJ7cHJveHk6L2ludHJvZHVjdGlvbi5odG1sfSIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgIDwhLS0gZ2VuZXJhdGUgd2VsY29tZSBwYWdlcyBmb3IgZWFjaCBwdWJsaWNhdGlvbiB3aXRoIGFuIGFnZ3JlZ2F0aW9uIG9mIHJlbGV2YW50IFJFQURNRXMgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovaW50cm9kdWN0aW9uLmh0bWwiPgotICAgICAgICA8bWFwOmFnZ3JlZ2F0ZSBlbGVtZW50PSJhZ2dyZWdhdGlvbi13cmFwcGVyIj4KLSAgICAgICAgICA8bWFwOnBhcnQgc3JjPSJhZ2dyZWdhdGUtZmFsbGJhY2s6Ly9yZWFkbWUueG1sIi8+Ci0gICAgICAgICAgPG1hcDpwYXJ0IHNyYz0ibGVueWEvcHVicy97MX0vY29uZmlnL3B1YmxpY2F0aW9uLnhtbCIvPgotICAgICAgICA8L21hcDphZ2dyZWdhdGU+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0ibGVueWEveHNsdC91dGlsL2ludHJvZHVjdGlvbi54c2wiLz4KLSAgICAgICAgPG1hcDpjYWxsIHJlc291cmNlPSJzdHlsZS1jbXMtcGFnZSIvPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSAvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotICAKLSAgICA8IS0tIGFuIGV4dHJhIGhhbmRsZXIgZm9yIGludGVybmFsIHB1YmxpY2F0aW9uIHJlcXVlc3RzIHRvIGF2b2lkIHRoZSByZXNvdXJjZS1leGlzdHMgY2hlY2sgCi0gICAgICAgICBpbiB0aGUgZXh0ZXJuYWwgcmVxdWVzdHMgbWF0Y2hlciAtLT4KLSAgICA8IS0tIEZJWE1FOiBzZWUgY29tbWVudHMgZm9yIGludGVybmFsIG1vZHVsZSByZXF1ZXN0IG1hdGNoZXIgYWJvdmUuIC0tPgotICAgIDxtYXA6cGlwZWxpbmUgaW50ZXJuYWwtb25seT0idHJ1ZSI+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKioiPgotICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9InsxfSIgc3JjPSJ7ZmFsbGJhY2s6c2l0ZW1hcC54bWFwfSIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0KLSAgICA8bWFwOnBpcGVsaW5lPgotCi0gICAgICA8IS0tIFJlc291cmNlcyAtLT4KLSAgICAgIDwhLS0gRklYTUU6IGRvZXNuJ3QgdGhpcyBjcmVhdGUgYSBoZWZ0eSBvdmVyaGVhZCBmb3IgYWxsIHB1YmxpY2F0aW9uIGRvY3VtZW50cz8gLS0+Ci0gICAgICA8IS0tIHtwdWJsaWNhdGlvbi1pZH0ve2FyZWF9L3tmaWxlfSAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qLyoqIj4KLSAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzLWVuaGFuY2VkIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJmYWxsYmFjazovL3Jlc291cmNlcy97Mn0vezN9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idHlwZSIgdmFsdWU9ImZpbGUiLz4KLSAgICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9IiIgc3JjPSJ7ZmFsbGJhY2s6bGVueWEvcmVzb3VyY2VzLnhtYXB9IiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+Ci0gICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgPCEtLSBGSVhNRTogcGxlYXNlIGRvY3VtZW50IHRoZSAic2hhcmVkIiByZXNvdXJjZXMgY29uY2VwdC4gT3IgbWF5YmUgd2UgY2FuIGRpdGNoIGl0PyAtLT4KLSAgICAgICAgPG1hcDphY3QgdHlwZT0icmVzb3VyY2UtZXhpc3RzLWVuaGFuY2VkIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvezN9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idHlwZSIgdmFsdWU9ImZpbGUiLz4KLSAgICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9IiIgc3JjPSJ7ZmFsbGJhY2s6bGVueWEvcmVzb3VyY2VzLXNoYXJlZC54bWFwfSIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPgotICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDwhLS0gQW5jZXN0b3JzIHJlc291cmNlcywgY3NzLCBqcywgZXRjLi4uIC0tPgotICAgICAgICA8IS0tIHtwdWJsaWNhdGlvbi1pZH0ve2FyZWF9L3tmaWxlbmFtZX0uaW5oZXJpdGVkLntleHRlbnRpb259IC0tPgotICAgICAgICA8IS0tIEZJWE1FOiB3aGF0IGlzIHRoaXMgbWVjaGFuaXNtIHVzZWQgZm9yPyBwbGVhc2UgZG9jdW1lbnQgb3IgcHJvdmlkZSBhIHBvaW50ZXIgdG8gZXhpc3RpbmcgZG9jcyAtLT4KLSAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovKiouaW5oZXJpdGVkLioiPgotICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc291cmNlLWV4aXN0cy1lbmhhbmNlZCI+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJ0ZW1wbGF0ZS1mYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvezN9Lns0fSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idHlwZSIgdmFsdWU9ImZpbGUiLz4KLSAgICAgICAgICAgIDxtYXA6bW91bnQgdXJpLXByZWZpeD0iIiBzcmM9IntmYWxsYmFjazpsZW55YS9yZXNvdXJjZXMtc2hhcmVkLnhtYXB9IiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+Ci0gICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgIDwhLS0gZGVsZWdhdGUgcHVibGljYXRpb24gcmVxdWVzdHMgdG8gdGhlIHB1YmxpY2F0aW9uIHNpdGVtYXAgLS0+Ci0gICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qKiI+Ci0gICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icGFyYW1ldGVyIj4KLSAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlci1zZWxlY3Rvci10ZXN0IiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6cHVibGljYXRpb24taWR9Ii8+Ci0gICAgICAgICA8bWFwOndoZW4gdGVzdD0iIj4KLSAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJqeCIgc3JjPSJsZW55YS9jb250ZW50L2V4Y2VwdGlvbi9wdWJsaWNhdGlvbi1kb2VzLW5vdC1leGlzdC5qeCI+Ci0gICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHVibGljYXRpb25JZCIgdmFsdWU9InsxfSIvPgotICAgICAgICAgICA8L21hcDpnZW5lcmF0ZT4KLSAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+Ci0gICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0ie3JlcXVlc3Q6bG9jYWxlfSI+PC9tYXA6cGFyYW1ldGVyPgotICAgICAgICAgICA8L21hcDp0cmFuc2Zvcm0+Ci0gICAgICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0ic3R5bGUtY21zLXBhZ2UiLz4KLSAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgc3RhdHVzLWNvZGU9IjQwNCIgLz4KLSAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSJ7MX0iIHNyYz0ie2ZhbGxiYWNrOnNpdGVtYXAueG1hcH0iIGNoZWNrLXJlbG9hZD0idHJ1ZSIgcmVsb2FkLW1ldGhvZD0ic3luY2hyb24iLz4KLSAgICAgICAgIDwvbWFwOm90aGVyd2lzZT4KLSAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgIDwvbWFwOm1hdGNoPgotICAgPC9tYXA6cGlwZWxpbmU+Ci0KLTwvbWFwOnBpcGVsaW5lcz4KLQotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvamNyLXJlcG9zaXRvcnkvamFhcy5jb25maWcgYi90cnVuay9zcmMvd2ViYXBwL2pjci1yZXBvc2l0b3J5L2phYXMuY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzczYjIwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvamNyLXJlcG9zaXRvcnkvamFhcy5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUphY2tyYWJiaXQgewotICAgb3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuc2VjdXJpdHkuU2ltcGxlTG9naW5Nb2R1bGUgcmVxdWlyZWQgYW5vbnltb3VzSWQ9Im1pY2hpIjsKLX07CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2pjci1yZXBvc2l0b3J5L3JlcG9zaXRvcnkueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9qY3ItcmVwb3NpdG9yeS9yZXBvc2l0b3J5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYWNjMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2pjci1yZXBvc2l0b3J5L3JlcG9zaXRvcnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPFJlcG9zaXRvcnk+Ci0gICAgPEZpbGVTeXN0ZW0gY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLmZzLmxvY2FsLkxvY2FsRmlsZVN5c3RlbSI+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iJHtyZXAuaG9tZX0vcmVwb3NpdG9yeSIvPgotICAgIDwvRmlsZVN5c3RlbT4KLSAgICA8U2VjdXJpdHkgYXBwTmFtZT0iSmFja3JhYmJpdCI+Ci0gICAgICAgIDxBY2Nlc3NNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5zZWN1cml0eS5TaW1wbGVBY2Nlc3NNYW5hZ2VyIi8+Ci0gICAgPC9TZWN1cml0eT4KLSAgICA8V29ya3NwYWNlcyByb290UGF0aD0iJHtyZXAuaG9tZX0vd29ya3NwYWNlcyIgZGVmYXVsdFdvcmtzcGFjZT0iZGVmYXVsdCIgLz4KLSAgICA8V29ya3NwYWNlIG5hbWU9IiR7d3NwLm5hbWV9Ij4KLSAgICAgICAgPEZpbGVTeXN0ZW0gY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLmZzLmxvY2FsLkxvY2FsRmlsZVN5c3RlbSI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9IiR7d3NwLmhvbWV9Ii8+Ci0gICAgICAgIDwvRmlsZVN5c3RlbT4KLSAgICAgICAgPFBlcnNpc3RlbmNlTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuc3RhdGUueG1sLlhNTFBlcnNpc3RlbmNlTWFuYWdlciIgLz4KLSAgICAgICAgPFNlYXJjaEluZGV4IGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5xdWVyeS5sdWNlbmUuU2VhcmNoSW5kZXgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSIke3dzcC5ob21lfS9pbmRleCIvPgotICAgICAgICA8L1NlYXJjaEluZGV4PgotICAgIDwvV29ya3NwYWNlPgotICAgIDxWZXJzaW9uaW5nIHJvb3RQYXRoPSIke3JlcC5ob21lfS92ZXJzaW9ucyI+Ci0gICAgICAgIDxGaWxlU3lzdGVtIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5mcy5sb2NhbC5Mb2NhbEZpbGVTeXN0ZW0iPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSIke3JlcC5ob21lfS92ZXJzaW9ucyIvPgotICAgICAgICA8L0ZpbGVTeXN0ZW0+Ci0gICAgICAgIDxQZXJzaXN0ZW5jZU1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLnN0YXRlLnhtbC5YTUxQZXJzaXN0ZW5jZU1hbmFnZXIiIC8+Ci0gICAgPC9WZXJzaW9uaW5nPgotPC9SZXBvc2l0b3J5PiAgIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9qY3ItcmVwb3NpdG9yeS9yZXBvc2l0b3J5L3dvcmtzcGFjZXMvZGVmYXVsdC93b3Jrc3BhY2UueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9qY3ItcmVwb3NpdG9yeS9yZXBvc2l0b3J5L3dvcmtzcGFjZXMvZGVmYXVsdC93b3Jrc3BhY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGJmOWYyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvamNyLXJlcG9zaXRvcnkvcmVwb3NpdG9yeS93b3Jrc3BhY2VzL2RlZmF1bHQvd29ya3NwYWNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08V29ya3NwYWNlIG5hbWU9ImRlZmF1bHQiPgotICAgICAgICA8RmlsZVN5c3RlbSBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuZnMubG9jYWwuTG9jYWxGaWxlU3lzdGVtIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iJHt3c3AuaG9tZX0iLz4KLSAgICAgICAgPC9GaWxlU3lzdGVtPgotICAgICAgICA8UGVyc2lzdGVuY2VNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5zdGF0ZS54bWwuWE1MUGVyc2lzdGVuY2VNYW5hZ2VyIi8+Ci0gICAgICAgIDxTZWFyY2hJbmRleCBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUucXVlcnkubHVjZW5lLlNlYXJjaEluZGV4Ij4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iJHt3c3AuaG9tZX0vaW5kZXgiLz4KLSAgICAgICAgPC9TZWFyY2hJbmRleD4KLSAgICA8L1dvcmtzcGFjZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEucHJvcGVydGllcy54bWwgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhLnByb3BlcnRpZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM2YmNkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEucHJvcGVydGllcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb3BlcnRpZXM+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwdWJzLmRlZmF1bHQuYXV0aG9yIiB2YWx1ZT0idGhlIExlbnlhIGNvbW11bml0eSIvPgotPC9wcm9wZXJ0aWVzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jaGFwZXJvbi9ncmFtbWFycy9saW5rLnhsZXggYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NoYXBlcm9uL2dyYW1tYXJzL2xpbmsueGxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwZDc3OC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NoYXBlcm9uL2dyYW1tYXJzL2xpbmsueGxleAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxsZXhpY29uIHhtbG5zPSJodHRwOi8vY2hhcGVyb24uc291cmNlZm9yZ2UubmV0L3NjaGVtYS9sZXhpY29uLzEuMCI+Ci0gPCEtLSAoKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpPyAtLT4KLSA8bGV4ZW1lIHN5bWJvbD0ibGluayI+Ci0gIDxjb25jYXQ+Ci0gICA8Y29uY2F0IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgPGNzdHJpbmcgY29udGVudD0iXCIvPgotICAgPC9jb25jYXQ+Ci0gICA8Z3JvdXA+Ci0gICA8Y29uY2F0PgotICAgIDxjY2xhc3MgbWF4T2NjdXJzPSIqIj4KLSAgICAgPGNpbnRlcnZhbCBtaW49IkEiIG1heD0iWiIvPgotICAgICA8Y2ludGVydmFsIG1pbj0iYSIgbWF4PSJ6Ii8+Ci0gICAgPC9jY2xhc3M+Ci0gICAgPGNzdHJpbmcgY29udGVudD0iOiIvPgotICAgIDxjc3RyaW5nIGNvbnRlbnQ9Ii8iLz4KLSAgIDwvY29uY2F0PgotIAotICAgPGNvbmNhdCBtaW5PY2N1cnM9IjAiPgotICAgIDxjc3RyaW5nIGNvbnRlbnQ9Ii8iLz4KLSAgICA8Y2NsYXNzIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIqIj4KLSAgICAgPGNpbnRlcnZhbCBtaW49IkEiIG1heD0iWiIvPgotICAgICA8Y2ludGVydmFsIG1pbj0iYSIgbWF4PSJ6Ii8+Ci0gICAgIDxjaW50ZXJ2YWwgbWluPSIwIiBtYXg9IjkiLz4KLSAgICAgPGNzZXQgY29udGVudD0iLl8tOiIvPgotICAgIDwvY2NsYXNzPgotICAgPC9jb25jYXQ+Ci0gCi0gICA8Y2NsYXNzIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIqIj4KLSAgICA8Y2ludGVydmFsIG1pbj0iQSIgbWF4PSJaIi8+Ci0gICAgPGNpbnRlcnZhbCBtaW49ImEiIG1heD0ieiIvPgotICAgIDxjaW50ZXJ2YWwgbWluPSIwIiBtYXg9IjkiLz4KLSAgICA8Y3NldCBjb250ZW50PSIuXy06LyIvPgotICAgPC9jY2xhc3M+Ci0KLSAgIDxjb25jYXQgbWluT2NjdXJzPSIwIj4KLSAgICA8Y3N0cmluZyBjb250ZW50PSI/Ii8+Ci0gICAgPGNjbGFzcyBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iKiI+Ci0gICAgIDxjaW50ZXJ2YWwgbWluPSJBIiBtYXg9IloiLz4KLSAgICAgPGNpbnRlcnZhbCBtaW49ImEiIG1heD0ieiIvPgotICAgICA8Y2ludGVydmFsIG1pbj0iMCIgbWF4PSI5Ii8+Ci0gICAgIDxjc2V0IGNvbnRlbnQ9Ii5fLTovPyIvPgotICAgIDwvY2NsYXNzPgotICAgPC9jb25jYXQ+Ci0KLSAgIDxjb25jYXQgbWluT2NjdXJzPSIwIj4KLSAgICA8Y3N0cmluZyBjb250ZW50PSIjIi8+Ci0gICAgPGNjbGFzcyBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iKiI+Ci0gICAgIDxjaW50ZXJ2YWwgbWluPSJBIiBtYXg9IloiLz4KLSAgICAgPGNpbnRlcnZhbCBtaW49ImEiIG1heD0ieiIvPgotICAgICA8Y2ludGVydmFsIG1pbj0iMCIgbWF4PSI5Ii8+Ci0gICAgIDxjc2V0IGNvbnRlbnQ9Ii5fLTovPyMiLz4KLSAgICA8L2NjbGFzcz4KLSAgIDwvY29uY2F0PgotICAgPC9ncm91cD4KLSAgPC9jb25jYXQ+Ci0gPC9sZXhlbWU+Ci0KLSA8bGV4ZW1lIHN5bWJvbD0iY3NzdXJsIj4KLSAgPGNvbmNhdD4KLSAgICAgIDxncm91cD4KLSAgICAgICA8Y29uY2F0PgotICAgICAgICA8Y3N0cmluZyBjb250ZW50PSJ1Ii8+Ci0gICAgICAgIDxjc3RyaW5nIGNvbnRlbnQ9InIiLz4KLSAgICAgICAgPGNzdHJpbmcgY29udGVudD0ibCIvPgotICAgICAgIDwvY29uY2F0PgotICAgICAKLSAgICAgICA8Y29uY2F0IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIqIj4KLSAgICAgICAgPGNzdHJpbmcgY29udGVudD0iICIvPgotICAgICAgIDwvY29uY2F0PgotICAgIAotICAgICAgIDxjb25jYXQ+Ci0gICAgICAgIDxjc3RyaW5nIGNvbnRlbnQ9IigiLz4KLSAgICAgICA8L2NvbmNhdD4KLSAgICAgICAKLSAgICAgICA8Y29uY2F0IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIqIj4KLSAgICAgICAgPGNzdHJpbmcgY29udGVudD0iICIvPgotICAgICAgIDwvY29uY2F0PgotICAgICAgIAotICAgICAgIDxjb25jYXQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8Y3N0cmluZyBjb250ZW50PSInIi8+Ci0gICAgICAgPC9jb25jYXQ+Ci0gICAgICA8L2dyb3VwPgotICAgICAgCi0gICAgICA8Z3JvdXA+Ci0gICAgICAgPGNvbmNhdCBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8Y3N0cmluZyBjb250ZW50PSIvIi8+Ci0gICAgICAgIDxjY2xhc3MgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IioiPgotICAgICAgICAgPGNpbnRlcnZhbCBtaW49IkEiIG1heD0iWiIvPgotICAgICAgICAgPGNpbnRlcnZhbCBtaW49ImEiIG1heD0ieiIvPgotICAgICAgICAgPGNpbnRlcnZhbCBtaW49IjAiIG1heD0iOSIvPgotICAgICAgICAgPGNzZXQgY29udGVudD0iLl8tOiIvPgotICAgICAgICA8L2NjbGFzcz4KLSAgICAgICA8L2NvbmNhdD4KLSAgICAgCi0gICAgICAgPGNjbGFzcyBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iKiI+Ci0gICAgICAgIDxjaW50ZXJ2YWwgbWluPSJBIiBtYXg9IloiLz4KLSAgICAgICAgPGNpbnRlcnZhbCBtaW49ImEiIG1heD0ieiIvPgotICAgICAgICA8Y2ludGVydmFsIG1pbj0iMCIgbWF4PSI5Ii8+Ci0gICAgICAgIDxjc2V0IGNvbnRlbnQ9Ii5fLTovIi8+Ci0gICAgICAgPC9jY2xhc3M+Ci0gICAgCi0gICAgICAgPGNvbmNhdCBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8Y3N0cmluZyBjb250ZW50PSI/Ii8+Ci0gICAgICAgIDxjY2xhc3MgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IioiPgotICAgICAgICAgPGNpbnRlcnZhbCBtaW49IkEiIG1heD0iWiIvPgotICAgICAgICAgPGNpbnRlcnZhbCBtaW49ImEiIG1heD0ieiIvPgotICAgICAgICAgPGNpbnRlcnZhbCBtaW49IjAiIG1heD0iOSIvPgotICAgICAgICAgPGNzZXQgY29udGVudD0iLl8tOi8/Ii8+Ci0gICAgICAgIDwvY2NsYXNzPgotICAgICAgIDwvY29uY2F0PgotICAgIAotICAgICAgIDxjb25jYXQgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPGNzdHJpbmcgY29udGVudD0iIyIvPgotICAgICAgICA8Y2NsYXNzIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIqIj4KLSAgICAgICAgIDxjaW50ZXJ2YWwgbWluPSJBIiBtYXg9IloiLz4KLSAgICAgICAgIDxjaW50ZXJ2YWwgbWluPSJhIiBtYXg9InoiLz4KLSAgICAgICAgIDxjaW50ZXJ2YWwgbWluPSIwIiBtYXg9IjkiLz4KLSAgICAgICAgIDxjc2V0IGNvbnRlbnQ9Ii5fLTovPyMiLz4KLSAgICAgICAgPC9jY2xhc3M+Ci0gICAgICAgPC9jb25jYXQ+Ci0gICAgICA8L2dyb3VwPgotICAgICAgCi0gICAgICA8Z3JvdXA+Ci0gICAgICAgPGNvbmNhdCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDxjc3RyaW5nIGNvbnRlbnQ9IiciLz4KLSAgICAgICA8L2NvbmNhdD4gICAKLSAgICAKLSAgICAgICA8Y29uY2F0IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIqIj4KLSAgICAgICAgPGNzdHJpbmcgY29udGVudD0iICIvPgotICAgICAgIDwvY29uY2F0PgotICAgIAotICAgICAgIDxjb25jYXQ+Ci0gICAgICAgIDxjc3RyaW5nIGNvbnRlbnQ9IikiLz4KLSAgICAgICA8L2NvbmNhdD4gICAKLSAgICAgIDwvZ3JvdXA+Ci0gICAgICAKLSAgPC9jb25jYXQ+Ci0gPC9sZXhlbWU+Ci0gCi0gPGxleGVtZSBzeW1ib2w9ImVtYWlsIj4KLSAgPGNvbmNhdD4KLSAgIDxjb25jYXQ+Ci0gICAgPGNvbmNhdCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgIDxjc3RyaW5nIGNvbnRlbnQ9IlwiLz4KLSAgICA8L2NvbmNhdD4KLSAgICA8Z3JvdXA+Ci0gICAgIDxjY2xhc3MgbWF4T2NjdXJzPSIqIj4KLSAgICAgIDxjaW50ZXJ2YWwgbWluPSJBIiBtYXg9IloiLz4KLSAgICAgIDxjaW50ZXJ2YWwgbWluPSJhIiBtYXg9InoiLz4KLSAgICAgIDxjaW50ZXJ2YWwgbWluPSIwIiBtYXg9IjkiLz4KLSAgICAgIDxjc2V0IGNvbnRlbnQ9Ii5fLToiLz4KLSAgICAgPC9jY2xhc3M+Ci0gICAgPC9ncm91cD4KLSAgICA8Y3N0cmluZyBjb250ZW50PSJAIi8+Ci0gICAgPGdyb3VwPgotICAgICA8Y2NsYXNzIG1heE9jY3Vycz0iKiI+Ci0gICAgICA8Y2ludGVydmFsIG1pbj0iQSIgbWF4PSJaIi8+Ci0gICAgICA8Y2ludGVydmFsIG1pbj0iYSIgbWF4PSJ6Ii8+Ci0gICAgICA8Y2ludGVydmFsIG1pbj0iMCIgbWF4PSI5Ii8+Ci0gICAgICA8Y3NldCBjb250ZW50PSIuXy06Ii8+Ci0gICAgIDwvY2NsYXNzPgotICAgIDwvZ3JvdXA+Ci0gICA8L2NvbmNhdD4KLSAgPC9jb25jYXQ+Ci0gPC9sZXhlbWU+Ci08L2xleGljb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jaGFwZXJvbi9zdHlsZXNoZWV0cy9hLXRvLXR4dC54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NoYXBlcm9uL3N0eWxlc2hlZXRzL2EtdG8tdHh0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwY2ExMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NoYXBlcm9uL3N0eWxlc2hlZXRzL2EtdG8tdHh0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDphIj4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnwqfHRleHQoKXxwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkiIHByaW9yaXR5PSItMSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnwqfHRleHQoKXxwcm9jZXNzaW5nLWluc3RydWN0aW9uKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jaGFwZXJvbi9zdHlsZXNoZWV0cy9wYXR0ZXJuLXRvLWxpbmsueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jaGFwZXJvbi9zdHlsZXNoZWV0cy9wYXR0ZXJuLXRvLWxpbmsueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzhlMWRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY2hhcGVyb24vc3R5bGVzaGVldHMvcGF0dGVybi10by1saW5rLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM6bGV4PSJodHRwOi8vY2hhcGVyb24uc291cmNlZm9yZ2UubmV0L3NjaGVtYS9sZXhlbWVzLzIuMCIKLSAgICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxleDpsZXhlbWVbQHN5bWJvbD0nbGluayddIj4KLSAgICA8eHNsOmNob29zZT4KLTwhLS0gaXQgaXMgcG9zc2libGUgdG8gZGlzYWJsZSBsaW5rIHdyaXRpbmcgYnkgcHJlZml4aW5nIGJ5ICdcJyAtLT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoIHN0YXJ0cy13aXRoKCBAdGV4dCwgJ1wnKSApIj48eGh0bWw6YSBocmVmPSJ7QHRleHR9Ij4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0ZXh0Ii8+PC94aHRtbDphPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibGV4Omdyb3VwWzJdIi8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGV4OmxleGVtZVtAc3ltYm9sPSdlbWFpbCddIj4KLSAgICA8eHNsOmNob29zZT4KLTwhLS0gaXQgaXMgcG9zc2libGUgdG8gZGlzYWJsZSBsaW5rIHdyaXRpbmcgYnkgcHJlZml4aW5nIGJ5ICdcJyAtLT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoIHN0YXJ0cy13aXRoKCBAdGV4dCwgJ1wnKSApIj48eGh0bWw6YSBocmVmPSJtYWlsdG86e0B0ZXh0fSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsZXg6Z3JvdXBbMl0iLz4gYXQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxleDpncm91cFszXSIvPjwveGh0bWw6YT4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxleDpncm91cFsyXSIvPkA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibGV4Omdyb3VwWzNdIi8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGV4OmxleGVtZVtAc3ltYm9sPSdjc3N1cmwnXSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxleDpncm91cFsyXSIvPjx4aHRtbDphIGhyZWY9IntsZXg6Z3JvdXBbM119Ii8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxleDpncm91cFs0XSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8Knx0ZXh0KCl8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIiBwcmlvcml0eT0iLTEiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8Knx0ZXh0KCl8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZGF0ZS1pMThuLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZGF0ZS1pMThuLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmUxMDFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL2RhdGUtaTE4bi54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZGF0ZS1pMThuJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9ImRhdGUtaTE4biIgbG9nZ2VyPSJjb3JlLm1vZHVsZXMuaW5wdXQiIGNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuRGF0ZUlucHV0TW9kdWxlIj4NCi0gICAgICA8Zm9ybWF0Pnl5eXktTU0tZGQgSEg6bW06c3MgWjwvZm9ybWF0Pg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZGF0ZS1pc284NjAxLXJmYzgyMi54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL2RhdGUtaXNvODYwMS1yZmM4MjIueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYzgxODQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZGF0ZS1pc284NjAxLXJmYzgyMi54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZGF0ZS1pc284NjAxLXJmYzgyMiddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJkYXRlLWlzbzg2MDEtcmZjODIyIiBsb2dnZXI9ImNvcmUubW9kdWxlcy5pbnB1dCIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuRGF0ZUNvbnZlcnRlck1vZHVsZSI+DQotICAgICAgPHNyYy1wYXR0ZXJuPnl5eXktTU0tZGQgSEg6bW06c3MgWjwvc3JjLXBhdHRlcm4+DQotICAgICAgPHBhdHRlcm4+RUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyBaPC9wYXR0ZXJuPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZGVmYXVsdHMueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9kZWZhdWx0cy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczMjcyMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9kZWZhdWx0cy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZGVmYXVsdHMnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iZGVmYXVsdHMiIGNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuRGVmYXVsdHNNb2R1bGUiPg0KLSAgICAgIDx2YWx1ZXM+DQotICAgICAgICA8c2tpbj5sZW55YS1zaXRlPC9za2luPg0KLSAgICAgIDwvdmFsdWVzPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZG9jLWluZm8ueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9kb2MtaW5mby54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhYzU4YS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9kb2MtaW5mby54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZG9jLWluZm8nXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbG9nZ2VyPSJzaXRlbWFwLm1vZHVsZXMuaW5wdXQuZG9jLWluZm8iIG5hbWU9ImRvYy1pbmZvIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LkRvY3VtZW50SW5mb01vZHVsZSIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9kb2N1bWVudC11cmwueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9kb2N1bWVudC11cmwueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTQ4YmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZG9jdW1lbnQtdXJsLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL2lucHV0LW1vZHVsZXMiIHVubGVzcz0iL2NvY29vbi9pbnB1dC1tb2R1bGVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdkb2N1bWVudC11cmwnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbG9nZ2VyPSJjb3JlLm1vZHVsZXMuaW5wdXQuZG9jdW1lbnQtdXJsIiBuYW1lPSJkb2N1bWVudC11cmwiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuRG9jdW1lbnRVUkxNb2R1bGUiLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZHVibGluY29yZS54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL2R1YmxpbmNvcmUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjM1OTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZHVibGluY29yZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZHVibGluY29yZSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBsb2dnZXI9InNpdGVtYXAubW9kdWxlcy5pbnB1dC5kdWJsaW5jb3JlIiBuYW1lPSJkdWJsaW5jb3JlIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0Lk1ldGFEYXRhTW9kdWxlIg0KLSAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvZmFsbGJhY2sueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9mYWxsYmFjay54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmZTY5OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9mYWxsYmFjay54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZmFsbGJhY2snXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbG9nZ2VyPSJjb3JlLm1vZHVsZXMuaW5wdXQuZmFsbGJhY2siIG5hbWU9ImZhbGxiYWNrIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LlB1YmxpY2F0aW9uVGVtcGxhdGVGYWxsYmFja01vZHVsZSI+DQotICAgICAgPGRpcmVjdG9yeSBzcmM9ImNvbnRleHQ6Ly8vbGVueWEiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL2ZvcnJlc3QueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9mb3JyZXN0Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmZhODFlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL2ZvcnJlc3QueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcyIgdW5sZXNzPSIvY29jb29uL2lucHV0LW1vZHVsZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2ZvcnJlc3QnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbG9nZ2VyPSJjb3JlLm1vZHVsZXMuaW5wdXQiIG5hbWU9ImZvcnJlc3QiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5DaGFpbk1ldGFNb2R1bGUiPg0KLSAgICAgIDxpbnB1dC1tb2R1bGUgbmFtZT0icmVxdWVzdC1wYXJhbSIvPg0KLSAgICAgIDxpbnB1dC1tb2R1bGUgbmFtZT0icmVxdWVzdC1hdHRyIi8+DQotICAgICAgPGlucHV0LW1vZHVsZSBuYW1lPSJzZXNzaW9uLWF0dHIiLz4NCi0gICAgICA8aW5wdXQtbW9kdWxlIG5hbWU9ImRlZmF1bHRzIi8+DQotICAgICAgPGlucHV0LW1vZHVsZSBuYW1lPSJwYWdlLWVudmVsb3BlIi8+DQotICAgICAgPGlucHV0LW1vZHVsZSBuYW1lPSJhY2Nlc3MtY29udHJvbCIvPg0KLSAgICA8L2NvbXBvbmVudC1pbnN0YW5jZT4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvcGFnZS1lbnZlbG9wZS54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL3BhZ2UtZW52ZWxvcGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTJlZDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL2lucHV0LW1vZHVsZXMvcGFnZS1lbnZlbG9wZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9pbnB1dC1tb2R1bGVzIiB1bmxlc3M9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAncGFnZS1lbnZlbG9wZSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBsb2dnZXI9InNpdGVtYXAubW9kdWxlcy5pbnB1dC5wYWdlLWVudmVsb3BlIiBuYW1lPSJwYWdlLWVudmVsb3BlIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LlBhZ2VFbnZlbG9wZU1vZHVsZSIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9yZWFscGF0aC54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL3JlYWxwYXRoLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ0MjIxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL3JlYWxwYXRoLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL2lucHV0LW1vZHVsZXMiIHVubGVzcz0iL2NvY29vbi9pbnB1dC1tb2R1bGVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdyZWFscGF0aCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZQ0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5jb21wb25lbnRzLm1vZHVsZXMuaW5wdXQuUmVhbFBhdGhNb2R1bGUiDQotICAgICAgbG9nZ2VyPSJjb3JlLm1vZHVsZXMuaW5wdXQiIG5hbWU9InJlYWxwYXRoIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL3Jlc291cmNlLWV4aXN0cy54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL3Jlc291cmNlLWV4aXN0cy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyOWRlMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9yZXNvdXJjZS1leGlzdHMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcyIgdW5sZXNzPSIvY29jb29uL2lucHV0LW1vZHVsZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2RvY3VtZW50LXVybCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBsb2dnZXI9ImNvcmUubW9kdWxlcy5pbnB1dC5yZXNvdXJjZWV4aXN0cyIgbmFtZT0icmVzb3VyY2UtZXhpc3RzIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5tb2R1bGVzLmlucHV0LlJlc291cmNlRXhpc3RzTW9kdWxlIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL3Jlc291cmNlLXR5cGUueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvaW5wdXQtbW9kdWxlcy9yZXNvdXJjZS10eXBlLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODJhMjU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9pbnB1dC1tb2R1bGVzL3Jlc291cmNlLXR5cGUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vaW5wdXQtbW9kdWxlcyIgdW5sZXNzPSIvY29jb29uL2lucHV0LW1vZHVsZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3Jlc291cmNlLXR5cGUnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0icmVzb3VyY2UtdHlwZSIgbG9nZ2VyPSJzaXRlbWFwLm1vZHVsZXMuaW5wdXQucmVzb3VyY2UtdHlwZSINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMubW9kdWxlcy5pbnB1dC5SZXNvdXJjZVR5cGVNb2R1bGUiLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21ldGFkYXRhL2RjLWVsZW1lbnRzLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21ldGFkYXRhL2RjLWVsZW1lbnRzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjJiZjA3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9tZXRhZGF0YS9kYy1lbGVtZW50cy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vbWV0YS1kYXRhIg0KLSAgICB1bmxlc3M9Ii9jb2Nvb24vbWV0YS1kYXRhL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuQ29uZmlndXJhYmxlRWxlbWVudFNldCI+DQotICAgICAgPGVsZW1lbnQgbmFtZT0idGl0bGUiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjcmVhdG9yIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0ic3ViamVjdCIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iY29udHJpYnV0b3IiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJkYXRlIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0idHlwZSIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZvcm1hdCIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlkZW50aWZpZXIiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzb3VyY2UiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJsYW5ndWFnZSIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9InJlbGF0aW9uIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iY292ZXJhZ2UiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJyaWdodHMiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgPC9jb21wb25lbnQtaW5zdGFuY2U+DQotICA8L3hjb25mPg0KLSAgDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21ldGFkYXRhL2RjLXRlcm1zLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21ldGFkYXRhL2RjLXRlcm1zLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdiZGIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9tZXRhZGF0YS9kYy10ZXJtcy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICANCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vbWV0YS1kYXRhIg0KLSAgICB1bmxlc3M9Ii9jb2Nvb24vbWV0YS1kYXRhL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICdodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIG5hbWU9Imh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8iDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLkNvbmZpZ3VyYWJsZUVsZW1lbnRTZXQiPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFic3RyYWN0IiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iYWNjZXNzUmlnaHRzIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iYWx0ZXJuYXRpdmUiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJhdWRpZW5jZSIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImF2YWlsYWJsZSIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImJpYmxpb2dyYXBoaWNDaXRhdGlvbiIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNvbmZvcm1zVG8iIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjcmVhdGVkIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iZGF0ZUFjY2VwdGVkIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iZGF0ZUNvcHlyaWdodGVkIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iZGF0ZVN1Ym1pdHRlZCIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVkdWNhdGlvbkxldmVsIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW50IiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iaGFzRm9ybWF0IiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iaGFzUGFydCIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9Imhhc1ZlcnNpb24iIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJpc0Zvcm1hdE9mIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iaXNQYXJ0T2YiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJpc1JlZmVyZW5jZWRCeSIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlzUmVwbGFjZWRCeSIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlzUmVxdWlyZWRCeSIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9Imlzc3VlZCIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlzVmVyc2lvbk9mIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0ibGljZW5zZSIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9Im1lZGlhdG9yIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0ibWVkaXVtIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0ibW9kaWZpZWQiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VzIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0icmVwbGFjZXMiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1aXJlcyIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9InJpZ2h0c0hvbGRlciIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9InNwYXRpYWwiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ0YWJsZU9mQ29udGVudHMiIG11bHRpcGxlPSJmYWxzZSIgZWRpdGFibGU9InRydWUiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgbXVsdGlwbGU9ImZhbHNlIiBlZGl0YWJsZT0idHJ1ZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9InZhbGlkIiBtdWx0aXBsZT0iZmFsc2UiIGVkaXRhYmxlPSJ0cnVlIi8+DQotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCi0gIA0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9tZXRhZGF0YS9kb2N1bWVudC54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9tZXRhZGF0YS9kb2N1bWVudC54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwMTI0MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvbWV0YWRhdGEvZG9jdW1lbnQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICANCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9tZXRhLWRhdGEiDQotICAgIHVubGVzcz0iL2NvY29vbi9tZXRhLWRhdGEvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ2h0dHA6Ly9hcGFjaGUub3JnL2xlbnlhL21ldGFkYXRhL2RvY3VtZW50LzEuMCddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBuYW1lPSJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tZXRhZGF0YS9kb2N1bWVudC8xLjAiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLkNvbmZpZ3VyYWJsZUVsZW1lbnRTZXQiPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9InJlc291cmNlVHlwZSIgbXVsdGlwbGU9ImZhbHNlIi8+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iY29udGVudFR5cGUiIG11bHRpcGxlPSJmYWxzZSIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9Im1pbWVUeXBlIiBtdWx0aXBsZT0iZmFsc2UiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJleHBpcmVzIiBtdWx0aXBsZT0iZmFsc2UiLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIG11bHRpcGxlPSJmYWxzZSIvPgotICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgPC94Y29uZj4NCi0gIA0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL2NvbnRleHR1dGlsaXR5Lnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2MvY29udGV4dHV0aWxpdHkueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDU3NzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2MvY29udGV4dHV0aWxpdHkueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmNvbXBvbmVudHMuY29udGV4dC5Db250ZXh0VXRpbGl0eSddIj4NCi0gICAgPGNvbXBvbmVudCByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uY29tcG9uZW50cy5jb250ZXh0LkNvbnRleHRVdGlsaXR5Ig0KLSAgICAgIGxvZ2dlcj0ibGVueWEuY29jb29uLmNvbXBvbmVudHMiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5jb21wb25lbnRzLmNvbnRleHQuQ29udGV4dFV0aWxpdHkiLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2MvZG9jdW1lbnQtYnVpbGRlcnMueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvbWlzYy9kb2N1bWVudC1idWlsZGVycy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyYzA3NS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvbWlzYy9kb2N1bWVudC1idWlsZGVycy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL2RvY3VtZW50LWJ1aWxkZXJzIj4NCi0gICAgPGRvY3VtZW50LWJ1aWxkZXJzPg0KLSAgICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0iZGVmYXVsdCIgbG9nZ2VyPSJsZW55YS5wdWJsaWNhdGlvbiINCi0gICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5EZWZhdWx0RG9jdW1lbnRCdWlsZGVyIi8+DQotICAgIDwvZG9jdW1lbnQtYnVpbGRlcnM+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL2RvY3VtZW50ZmFjdG9yeWJ1aWxkZXIueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvbWlzYy9kb2N1bWVudGZhY3RvcnlidWlsZGVyLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTcxMGFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL2RvY3VtZW50ZmFjdG9yeWJ1aWxkZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24uRG9jdW1lbnRGYWN0b3J5QnVpbGRlciddIj4NCi0gICAgPGNvbXBvbmVudCByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaWNhdGlvbi5Eb2N1bWVudEZhY3RvcnlCdWlsZGVyIg0KLSAgICAgIGxvZ2dlcj0ibGVueWEuY29jb29uLmNvbXBvbmVudHMiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50RmFjdG9yeUJ1aWxkZXJJbXBsIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL2xlbnlhLXJvbGVzLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2MvbGVueWEtcm9sZXMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NTI0MDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2MvbGVueWEtcm9sZXMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iDQotICAgICAgICAgdW5sZXNzPSIvY29jb29uL0B1c2VyLXJvbGVzIg0KLSAgICAgICAgIGFkZC1hdHRyaWJ1dGU9InVzZXItcm9sZXMiDQotICAgICAgICAgdmFsdWU9Ii9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9sZW55YS5yb2xlcyIvPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL21ldGFkYXRhcmVnaXN0cnkueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvbWlzYy9tZXRhZGF0YXJlZ2lzdHJ5Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTY4MmZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL21ldGFkYXRhcmVnaXN0cnkueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMubWV0YWRhdGEuTWV0YURhdGFSZWdpc3RyeSddIj4NCi0gICAgPGNvbXBvbmVudCByb2xlPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5tZXRhZGF0YS5NZXRhRGF0YVJlZ2lzdHJ5Ig0KLSAgICAgIGxvZ2dlcj0ibGVueWEuY29jb29uLmNvbXBvbmVudHMiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLm1ldGFkYXRhLk1ldGFEYXRhUmVnaXN0cnlJbXBsIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL3NoYXJlZC1pdGVtLXN0b3JlLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2Mvc2hhcmVkLWl0ZW0tc3RvcmUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDU0NTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2Mvc2hhcmVkLWl0ZW0tc3RvcmUueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TaGFyZWRJdGVtU3RvcmUnXSI+DQotICAgIDxjb21wb25lbnQgcm9sZT0ib3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TaGFyZWRJdGVtU3RvcmUiDQotICAgICAgbG9nZ2VyPSJsZW55YS5jb2Nvb24uY29tcG9uZW50cyINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5TaGFyZWRJdGVtU3RvcmVJbXBsIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL3NpdGUtbWFuYWdlcnMueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvbWlzYy9zaXRlLW1hbmFnZXJzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDUxM2IzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL3NpdGUtbWFuYWdlcnMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9zaXRlLW1hbmFnZXJzIj4NCi0gICAgPHNpdGUtbWFuYWdlcnMvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvbWlzYy9zdG9yZS1qYW5pdG9yLW1lbW9yeS54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL3N0b3JlLWphbml0b3ItbWVtb3J5Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjcxMzlhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL3N0b3JlLWphbml0b3ItbWVtb3J5Lnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLQ0KLTwhLS0gaW5jcmVhc2UgdGhlIGZyZWUgbWVtb3J5IHRvIHByZXZlbnQgb3V0IG9mIG1lbW9yeSBlcnJvcnMgLS0+DQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24vc3RvcmUtamFuaXRvciINCi0gICAgcmVtb3ZlPSIvY29jb29uL3N0b3JlLWphbml0b3IvcGFyYW1ldGVyW0BuYW1lID0gJ2ZyZWVtZW1vcnknXSINCi0gICAgdW5sZXNzPSIvY29jb29uL3N0b3JlLWphbml0b3IvcGFyYW1ldGVyW0BuYW1lID0gJ2ZyZWVtZW1vcnknIGFuZCBAdmFsdWUgPSAnMTAwMDAwMDAnXSI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZnJlZW1lbW9yeSIgdmFsdWU9IjEwMDAwMDAwIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9taXNjL3V1aWQtZ2VuZXJhdG9yLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2MvdXVpZC1nZW5lcmF0b3IueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NWMzNzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL21pc2MvdXVpZC1nZW5lcmF0b3IueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5sZW55YS5jbXMucmVwb3NpdG9yeS5VVUlER2VuZXJhdG9yJ10iPg0KLSAgICA8Y29tcG9uZW50IHJvbGU9Im9yZy5hcGFjaGUubGVueWEuY21zLnJlcG9zaXRvcnkuVVVJREdlbmVyYXRvciINCi0gICAgICBsb2dnZXI9ImxlbnlhLmNvY29vbi5jb21wb25lbnRzIg0KLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5yZXBvc2l0b3J5LkF4aXNVVUlER2VuZXJhdG9yIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9wcmVwYXJlL21ldGFkYXRhLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3ByZXBhcmUvbWV0YWRhdGEueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Njk2ZTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3ByZXBhcmUvbWV0YWRhdGEueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbi9tZXRhLWRhdGEiPg0KLSAgICA8bWV0YS1kYXRhLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3ByZXBhcmUvcmVzb3VyY2UtdHlwZXMueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvcHJlcGFyZS9yZXNvdXJjZS10eXBlcy54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1N2RiMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvcHJlcGFyZS9yZXNvdXJjZS10eXBlcy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL3Jlc291cmNlLXR5cGVzIj4NCi0gICAgPHJlc291cmNlLXR5cGVzLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3ByZXBhcmUvdGVtcGxhdGUtaW5zdGFudGlhdG9ycy54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9wcmVwYXJlL3RlbXBsYXRlLWluc3RhbnRpYXRvcnMueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODEwZTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3ByZXBhcmUvdGVtcGxhdGUtaW5zdGFudGlhdG9ycy54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbiIgdW5sZXNzPSIvY29jb29uL3RlbXBsYXRlLWluc3RhbnRpYXRvcnMiPg0KLSAgICA8dGVtcGxhdGUtaW5zdGFudGlhdG9ycy8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zY2hlZHVsZXIvYWRkX2RhdGFzb3VyY2VzX2VsZW1lbnQueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc2NoZWR1bGVyL2FkZF9kYXRhc291cmNlc19lbGVtZW50Lnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjZiNzEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zY2hlZHVsZXIvYWRkX2RhdGFzb3VyY2VzX2VsZW1lbnQueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSBUaGlzIGZpbGUgY3JlYXRlcyBhbiBlbXB0eSA8ZGF0YXNvdXJjZXMvPiBlbGVtZW50IGluIGNvY29vbi54Y29uZi4NCi0gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuYWJsZSBzdWJzZXF1ZW50IHhwYXRjaCBmaWxlcyAobGlrZSBkYXRhc291cmNlcy54Y29uZikNCi0gIHRvIHBhdGNoIGRhdGFzb3VyY2UgZW50cmllcyBpbnRvIHRoaXMgZWxlbWVudC4gU2VlIGJ1ZyA0MzU4MSBmb3IgYQ0KLSAgZGlzY3Vzc2lvbi9leHBsYW5hdGlvbi4gDQotICBUaGUgbmFtZSBvZiB0aGlzIGZpbGUgaGFzIHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaW4gYmVmb3JlICJkYXRhc291cmNlcy54Y29uZiIuDQotLS0+DQotICANCi08eGNvbmYgeHBhdGg9Ii9jb2Nvb24iDQotICB1bmxlc3M9ImRhdGFzb3VyY2VzIg0KLSAgaW5zZXJ0LWJlZm9yZT0iL2NvY29vbi9oc3FsZGItc2VydmVyIgotICBpZi1wcm9wPSJwYXRjaC53ZWJhcHAiPg0KLSAgPGRhdGFzb3VyY2VzPg0KLSAgPC9kYXRhc291cmNlcz4NCi08L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zY2hlZHVsZXIvZGF0YXNvdXJjZXMueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc2NoZWR1bGVyL2RhdGFzb3VyY2VzLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZjOGMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zY2hlZHVsZXIvZGF0YXNvdXJjZXMueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHhjb25mIHhwYXRoPSIvY29jb29uL2RhdGFzb3VyY2VzIg0KLSAgICB1bmxlc3M9Ii9jb2Nvb24vZGF0YXNvdXJjZXMvamRiY1tAbmFtZSA9ICdMZW55YVNjaGVkdWxlciddIgotICAgIGlmLXByb3A9InBhdGNoLndlYmFwcCI+Ci0gIDxqZGJjIGxvZ2dlcj0iY29yZS5kYXRhc291cmNlcy5sZW55YS5zY2hlZHVsZXIiIG5hbWU9IkxlbnlhU2NoZWR1bGVyIj4NCi0gICAgPHBvb2wtY29udHJvbGxlciBtYXg9IjEwIiBtaW49IjUiPg0KLSAgICAgIDwhLS0gdXNlIGN1c3RvbSBrZWVwLWFsaXZlIHF1ZXJ5IGJlY2F1c2UgSFNRTCBkb2VzIG5vdCBhY2NlcHQgJ1NFTEVDVCAxJyAtLT4NCi0gICAgICA8a2VlcC1hbGl2ZT5TRUxFQ1QgMSBGUk9NIFFSVFpfTE9DS1M8L2tlZXAtYWxpdmU+DQotICAgIDwvcG9vbC1jb250cm9sbGVyPg0KLSAgICA8ZGJ1cmw+amRiYzpoc3FsZGI6aHNxbDovL2xvY2FsaG9zdDo5MDAyL2NvY29vbmRiPC9kYnVybD4NCi0gICAgPHVzZXI+c2E8L3VzZXI+DQotICAgIDxwYXNzd29yZC8+DQotICA8L2pkYmM+DQotPC94Y29uZj4NCi0gDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NjaGVkdWxlci9zY2hlZHVsZXIueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc2NoZWR1bGVyL3NjaGVkdWxlci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3OWZkOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc2NoZWR1bGVyL3NjaGVkdWxlci54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotICA8IS0tDQotICBUaGUgc2NoZWR1bGVyIGhhcyB0byBiZSBhZGRlZCBhZnRlciB0aGUgSFNRTERCIHNlcnZlciB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YXNvdXJjZXMgYXJlIGF2YWlsYWJsZS4NCi0gIC0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uIg0KLSAgICByZW1vdmU9Ii9jb2Nvb24vY29tcG9uZW50W0Byb2xlID0gJ29yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuY3Jvbi5Kb2JTY2hlZHVsZXInXSINCi0gICAgaW5zZXJ0LWFmdGVyPSIvY29jb29uL2hzcWxkYi1zZXJ2ZXIiDQotICAgIHVubGVzcz0iL2NvY29vbi9jb21wb25lbnRbQHJvbGUgPSAnb3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5jcm9uLkpvYlNjaGVkdWxlciddW3N0b3JlL2RhdGFzb3VyY2UgPSAnTGVueWFTY2hlZHVsZXInXSINCi0gICAgaWYtcHJvcD0icGF0Y2gud2ViYXBwIj4NCi0gICAgDQotICAgIDxjb21wb25lbnQgY2xhc3M9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuY3Jvbi5Db2Nvb25RdWFydHpKb2JTY2hlZHVsZXIiIGxvZ2dlcj0iY3JvbiIgcm9sZT0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5jcm9uLkpvYlNjaGVkdWxlciI+DQotICAgICAgPCEtLSsNCi0gICAgICAgIHwgRGVmaW5pdGlvbnMgZm9yIGEgdGhyZWFkIHBvb2wgdXNlZCB0byBzY2hlZHVsZSBqb2JzDQotICAgICAgICArLS0+DQotICAgICAgPHRocmVhZC1wb29sPg0KLSAgICAgICAgPCEtLSsNCi0gICAgICAgICAgfCBTaG91bGQgd2UgcXVldWUgdXAgZXhlY3V0aW9uIHJlcXVlc3RzIGlmIHRoZSBwb29sIGlzIGJ1c3k/DQotICAgICAgICAgIHwgRGVmYXVsdHMgdG8gZmFsc2UNCi0gICAgICAgICAgKy0tPg0KLSAgICAgICAgPHVzZS1xdWV1ZWluZz5mYWxzZTwvdXNlLXF1ZXVlaW5nPg0KLSAgICAgICAgDQotICAgICAgICA8IS0tKw0KLSAgICAgICAgICB8IEhvdyBiaWcgc2hvdWxkIHRoZSBxdWV1ZSBiZS4NCi0gICAgICAgICAgfCBEZWZhdWx0cyB0byB1bmxpbWl0ZWQgc2l6ZSAoPDAgPT0gZGVmYXVsdCkNCi0gICAgICAgICAgKy0tPg0KLSAgICAgICAgPHF1ZXVlLXNpemU+LTE8L3F1ZXVlLXNpemU+DQotICAgICAgICANCi0gICAgICAgIDwhLS0rDQotICAgICAgICAgIHwgVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcG9vbC4NCi0gICAgICAgICAgfCBEZWZhdWx0cyB0byBJbnRlZ2VyLk1BWF9WQUxVRSAoPDAgPT0gZGVmYXVsdCkNCi0gICAgICAgICAgKy0tPg0KLSAgICAgICAgPG1heC1wb29sLXNpemU+LTE8L21heC1wb29sLXNpemU+DQotICAgICAgICANCi0gICAgICAgIDwhLS0rDQotICAgICAgICAgIHwgVGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgcG9vbC4NCi0gICAgICAgICAgfCBEZWZhdWx0cyB0byAxICg8MCA9PSBkZWZhdWx0KQ0KLSAgICAgICAgICArLS0+DQotICAgICAgICA8bWluLXBvb2wtc2l6ZT4xPC9taW4tcG9vbC1zaXplPg0KLSAgICAgICAgDQotICAgICAgICA8IS0tKw0KLSAgICAgICAgICB8IEhvdyBsb25nIHdpbGwgYW4gaWRsZSB0aHJlYWQgYmUga2VwdCBiZWZvcmUgaXQgd2lsbCBiZSBkaXNjYXJkZWQuDQotICAgICAgICAgIHwgRGVmYXVsdHMgdG8gNjAwMDBtcyAoPDAgPT0gZGVmYXVsdCkNCi0gICAgICAgICAgKy0tPg0KLSAgICAgICAgPGtlZXAtYWxpdmUtdGltZS1tcz42MDAwMDwva2VlcC1hbGl2ZS10aW1lLW1zPg0KLSAgICAgICAgDQotICAgICAgICA8IS0tKw0KLSAgICAgICAgICB8IFdoaWNoIGJsb2NraW5nIHBvbGljeSBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWF4aW11bSBwb29sDQotICAgICAgICAgIHwgc2l6ZSBhbmQgcXVldWUgc2l6ZSBpcyBib3VuZGVkOg0KLSAgICAgICAgICB8IFJ1bjogICAgICAgICAgIChkZWZhdWx0KSBUaGUgdGhyZWFkIG1ha2luZyB0aGUgZXhlY3V0ZQ0KLSAgICAgICAgICB8ICAgICAgICAgICAgICAgIHJlcXVlc3QgcnVucyB0aGUgdGFzayBpdHNlbGYuIFRoaXMgcG9saWN5DQotICAgICAgICAgIHwgICAgICAgICAgICAgICAgaGVscHMgZ3VhcmQgYWdhaW5zdCBsb2NrdXAuDQotICAgICAgICAgIHwgV2FpdDogICAgICAgICAgV2FpdCB1bnRpbCBhIHRocmVhZCBiZWNvbWVzIGF2YWlsYWJsZS4NCi0gICAgICAgICAgfCBBYm9ydDogICAgICAgICBUaHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24NCi0gICAgICAgICAgfCBEaXNjYXJkOiAgICAgICBUaHJvdyBhd2F5IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIHJldHVybi4NCi0gICAgICAgICAgfCBEaXNjYXJkT2xkZXN0OiBUaHJvdyBhd2F5IHRoZSBvbGRlc3QgcmVxdWVzdCBhbmQgcmV0dXJuLg0KLSAgICAgICAgICArLS0+DQotICAgICAgICA8YmxvY2stcG9saWN5PlJVTjwvYmxvY2stcG9saWN5Pg0KLSAgICAgICAgDQotICAgICAgICA8IS0tKw0KLSAgICAgICAgICB8IFNob3VsZCBxdWV1ZWQgYW5kIHJ1bm5pbmcgam9icyBiZSBnaXZlbiBhIGNoYW5jZSB0byBmaW5pc2hlZA0KLSAgICAgICAgICB8IG9uIHN5c3RlbSBzaHV0ZG93bi4gRGVmYXVsdHMgdG8gdHJ1ZQ0KLSAgICAgICAgICArLS0+DQotICAgICAgICA8c2h1dGRvd24tZ3JhY2VmdWw+dHJ1ZTwvc2h1dGRvd24tZ3JhY2VmdWw+DQotICAgICAgICANCi0gICAgICAgIDwhLS0rDQotICAgICAgICAgIHwgVGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciBydW5uaW5nIGpvYnMgdG8gY29tcGxldGUuDQotICAgICAgICAgIHwgRGVmYXVsdHMgdG8gdW5saW1pdGVkIHRpbWUgKDwwID09IGRlZmF1bHQpDQotICAgICAgICAgICstLT4NCi0gICAgICAgIDxzaHV0ZG93bi13YWl0LXRpbWUtbXM+NTAwMDwvc2h1dGRvd24td2FpdC10aW1lLW1zPg0KLSAgICAgIDwvdGhyZWFkLXBvb2w+DQotICAgICAgDQotICAgICAgPHRyaWdnZXJzLz4NCi0gICAgICANCi0gICAgICA8IS0tKw0KLSAgICAgICAgfCBEZWZpbml0aW9uIG9mIHRoZSBKb2JTdG9yZS4NCi0gICAgICAgIHwgU3RvcmUgdHlwZSBjYW4gYmUgb25lIG9mICJyYW0iIChkZWZhdWx0KSwgInR4Iiwgb3IgImNtdCIuDQotICAgICAgICB8DQotICAgICAgICB8ICJ0eCIgYW5kICJjbXQiIHN0b3JlcyByZXF1aXJlIGRhdGFzb3VyY2UgY29uZmlndXJhdGlvbi4NCi0gICAgICAgIHwgKEF0dHJpYnV0ZXMgZGVsZWdhdGUgYW5kIHByb3ZpZGVyIGFyZSBvcHRpb25hbCkNCi0gICAgICAgICstLT4NCi0gICAgICA8c3RvcmUgZGVsZWdhdGU9Im9yZy5xdWFydHouaW1wbC5qZGJjam9ic3RvcmUuU3RkSkRCQ0RlbGVnYXRlIiB0eXBlPSJ0eCI+DQotICAgICAgICA8ZGF0YXNvdXJjZSBwcm92aWRlcj0iZXhjYWxpYnVyIj5MZW55YVNjaGVkdWxlcjwvZGF0YXNvdXJjZT4NCi0gICAgICA8L3N0b3JlPg0KLSAgICAgIA0KLSAgICA8L2NvbXBvbmVudD4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1mYWN0b3JpZXMvYWdncmVnYXRlLWZhbGxiYWNrLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1mYWN0b3JpZXMvYWdncmVnYXRlLWZhbGxiYWNrLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJhOTFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zb3VyY2UtZmFjdG9yaWVzL2FnZ3JlZ2F0ZS1mYWxsYmFjay54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9zb3VyY2UtZmFjdG9yaWVzIg0KLSAgICB1bmxlc3M9Ii9jb2Nvb24vc291cmNlLWZhY3Rvcmllcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnYWdncmVnYXRlLWZhbGxiYWNrJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLkFnZ3JlZ2F0aW5nRmFsbGJhY2tTb3VyY2VGYWN0b3J5Ig0KLSAgICAgIGxvZ2dlcj0ibGVueWEuc291cmNlLmFnZ3JlZ2F0ZWZhbGxiYWNrIiBuYW1lPSJhZ2dyZWdhdGUtZmFsbGJhY2siLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1mYWN0b3JpZXMvZmFsbGJhY2sueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlLWZhY3Rvcmllcy9mYWxsYmFjay54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhZjA4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlLWZhY3Rvcmllcy9mYWxsYmFjay54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9zb3VyY2UtZmFjdG9yaWVzIiB1bmxlc3M9Ii9jb2Nvb24vc291cmNlLWZhY3Rvcmllcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnZmFsbGJhY2snXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuRmFsbGJhY2tTb3VyY2VGYWN0b3J5IiBsb2dnZXI9ImxlbnlhLnNvdXJjZS5mYWxsYmFjayIgbmFtZT0iZmFsbGJhY2siLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1mYWN0b3JpZXMvbGVueWEueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlLWZhY3Rvcmllcy9sZW55YS54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4MTkzZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlLWZhY3Rvcmllcy9sZW55YS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9zb3VyY2UtZmFjdG9yaWVzIiB1bmxlc3M9Ii9jb2Nvb24vc291cmNlLWZhY3Rvcmllcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnbGVueWEnXSI+DQotICAgIDxjb21wb25lbnQtaW5zdGFuY2UgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5zb3VyY2UuTGVueWFTb3VyY2VGYWN0b3J5IiBsb2dnZXI9ImxlbnlhLnNvdXJjZS5sZW55YSIgbmFtZT0ibGVueWEiIHNjaGVtZT0iY29udGV4dDoiLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1mYWN0b3JpZXMvc2l0ZS54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zb3VyY2UtZmFjdG9yaWVzL3NpdGUueGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDI0YWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1mYWN0b3JpZXMvc2l0ZS54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9zb3VyY2UtZmFjdG9yaWVzIiB1bmxlc3M9Ii9jb2Nvb24vc291cmNlLWZhY3Rvcmllcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnc2l0ZSddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5TaXRlU291cmNlRmFjdG9yeSIgbG9nZ2VyPSJsZW55YS5zb3VyY2Uuc2l0ZSIgbmFtZT0ic2l0ZSIgc2NoZW1lPSJzaXRlOiIvPg0KLSAgPC94Y29uZj4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvc291cmNlLWZhY3Rvcmllcy90ZW1wbGF0ZS1mYWxsYmFjay54Y29uZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zb3VyY2UtZmFjdG9yaWVzL3RlbXBsYXRlLWZhbGxiYWNrLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzFiYmU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zb3VyY2UtZmFjdG9yaWVzL3RlbXBsYXRlLWZhbGxiYWNrLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiB1c2VjYXNlcy13b3JrZmxvdy1kZWFjdGl2YXRlLnhjb25mIDM0ODU0NyAyMDA1LTExLTIzIDIwOjEzOjAxWiBjaGVzdG51dCAkIC0tPg0KLTwhLS0NCi0gICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHB1YmxpY2F0aW9uIHNwZWNpZmljIHVzZS1jYXNlcw0KLS0tPg0KLQ0KLSAgPHhjb25mIHhwYXRoPSIvY29jb29uL3NvdXJjZS1mYWN0b3JpZXMiIHVubGVzcz0iL2NvY29vbi9zb3VyY2UtZmFjdG9yaWVzL2NvbXBvbmVudC1pbnN0YW5jZVtAbmFtZSA9ICd0ZW1wbGF0ZS1mYWxsYmFjayddIj4NCi0gICAgPGNvbXBvbmVudC1pbnN0YW5jZSBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLnNvdXJjZS5UZW1wbGF0ZUZhbGxiYWNrU291cmNlRmFjdG9yeSIgbG9nZ2VyPSJsZW55YS5zb3VyY2UudGVtcGxhdGVmYWxsYmFjayIgbmFtZT0idGVtcGxhdGUtZmFsbGJhY2siLz4NCi0gIDwveGNvbmY+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1mYWN0b3JpZXMvemlwLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvY29jb29uLXhjb25mL3NvdXJjZS1mYWN0b3JpZXMvemlwLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJlNjY5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi9zb3VyY2UtZmFjdG9yaWVzL3ppcC54Y29uZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogdXNlY2FzZXMtd29ya2Zsb3ctZGVhY3RpdmF0ZS54Y29uZiAzNDg1NDcgMjAwNS0xMS0yMyAyMDoxMzowMVogY2hlc3RudXQgJCAtLT4NCi08IS0tDQotICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBzcGVjaWZpYyB1c2UtY2FzZXMNCi0tLT4NCi0NCi0gIDx4Y29uZiB4cGF0aD0iL2NvY29vbi9zb3VyY2UtZmFjdG9yaWVzIiB1bmxlc3M9Ii9jb2Nvb24vc291cmNlLWZhY3Rvcmllcy9jb21wb25lbnQtaW5zdGFuY2VbQG5hbWUgPSAnemlwJ10iPg0KLSAgICA8Y29tcG9uZW50LWluc3RhbmNlIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uc291cmNlLlppcFNvdXJjZUZhY3RvcnkiIGxvZ2dlcj0ibGVueWEuc291cmNlLnppcCIgbmFtZT0iemlwIi8+DQotICA8L3hjb25mPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy92ZXJzaW9uaW5nL3VzZWNhc2Utcm9sbGJhY2sueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9jb2Nvb24teGNvbmYvdXNlY2FzZXMvdmVyc2lvbmluZy91c2VjYXNlLXJvbGxiYWNrLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjAwYzI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL2NvY29vbi14Y29uZi91c2VjYXNlcy92ZXJzaW9uaW5nL3VzZWNhc2Utcm9sbGJhY2sueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHVzZWNhc2VzLXdvcmtmbG93LWRlYWN0aXZhdGUueGNvbmYgMzQ4NTQ3IDIwMDUtMTEtMjMgMjA6MTM6MDFaIGNoZXN0bnV0ICQgLS0+DQotPCEtLQ0KLSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gc3BlY2lmaWMgdXNlLWNhc2VzDQotLS0+DQotDQotICA8IS0tIHRlbXBvcmFyaWx5IGNvbW1lbnRlZCBvdXQgLS0+DQotICA8eGNvbmYgeHBhdGg9Ii9jb2Nvb24iIHVubGVzcz0iL2NvY29vbiI+DQotICA8L3hjb25mPg0KLTwhLS0NCi0gICAgPHhjb25mIHhwYXRoPSIvY29jb29uL3VzZWNhc2VzIiB1bmxlc3M9Ii9jb2Nvb24vdXNlY2FzZXMvY29tcG9uZW50LWluc3RhbmNlW0BuYW1lID0gJ3JvbGxiYWNrJ10iPg0KLSAgICAgIDxjb21wb25lbnQtaW5zdGFuY2UgbmFtZT0icm9sbGJhY2siIGxvZ2dlcj0ibGVueWEucHVibGljYXRpb24iDQotICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuc2l0ZS51c2VjYXNlcy5Sb2xsYmFjayI+DQotICAgICAgICA8dHJhbnNhY3Rpb24gcG9saWN5PSJwZXNzaW1pc3RpYyIvPg0KLSAgICAgICAgPGV4aXQgdXNlY2FzZT0idGFiLnJldmlzaW9ucyIvPg0KLSAgICAgIDwvY29tcG9uZW50LWluc3RhbmNlPg0KLSAgICA8L3hjb25mPg0KLS0tPiAgICANCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9wYXJhbWV0ZXJzL2RlZmF1bHQueHNwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvcGFyYW1ldGVycy9kZWZhdWx0LnhzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5NTA4Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9wYXJhbWV0ZXJzL2RlZmF1bHQueHNwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPCEtLSBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyICJ2YWx1ZSIgYXMgVVJJIHBhcmFtZXRlci4gLS0+Ci0KLTx4c3A6cGFnZQotICBsYW5ndWFnZT0iamF2YSIKLSAgeG1sbnM6eHNwPSJodHRwOi8vYXBhY2hlLm9yZy94c3AiICAKLT4KLSAgICAgICAKLTxwYXJhbWV0ZXIgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91cmktcGFyYW1ldGVycy8xLjAiPjx4c3A6ZXhwcj5wYXJhbWV0ZXJzLmdldFBhcmFtZXRlcigidmFsdWUiLCAiIik8L3hzcDpleHByPjwvcGFyYW1ldGVyPgotICAgICAgIAotPC94c3A6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3JjL3JldmlzaW9uLWNvbnRyb2xsZXIueGNvbmYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9yYy9yZXZpc2lvbi1jb250cm9sbGVyLnhjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzhlMTYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3JjL3JldmlzaW9uLWNvbnRyb2xsZXIueGNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxyY21sPgotICA8cmNtbERpcmVjdG9yeSBocmVmPSJjb250ZW50L3JjbWwiLz4KLSAgPGJhY2t1cERpcmVjdG9yeSBocmVmPSJjb250ZW50L3JjYmFrIi8+Ci08L3JjbWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zY2hlZHVsZXIvc2NoZWR1bGVyLnhjb25mIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2NoZWR1bGVyL3NjaGVkdWxlci54Y29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkMjE3My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zY2hlZHVsZXIvc2NoZWR1bGVyLnhjb25mCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08c2NoZWR1bGVyPgotCi0gIDxqb2JzPgotICAgIDxqb2IgdHlwZT0icHVibGlzaCIgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLnNjaGVkdWxlci5QdWJsaXNoaW5nSm9iIj4KLSAgICAgIDx0aXRsZT5QdWJsaXNoPC90aXRsZT4KLSAgICAgIDxwYXJhbWV0ZXJzPgotICAgICAgICA8cHVibGlzaGVyIGNsYXNzPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5wdWJsaXNoaW5nLkRlZmF1bHRGaWxlUHVibGlzaGVyIi8+Ci0gICAgICA8L3BhcmFtZXRlcnM+Ci0gICAgPC9qb2I+Ci0gIDwvam9icz4KLSAgCi0gIDx0cmlnZ2Vycz4KLSAgICA8dHJpZ2dlciB0eXBlPSJjcm9uIiBjbGFzcz0ib3JnLnF1YXJ0ei5Dcm9uVHJpZ2dlciI+Ci0gICAgICA8dGl0bGU+UmVndWxhcjwvdGl0bGU+Ci0gICAgPC90cmlnZ2VyPgotICAgIDx0cmlnZ2VyIHR5cGU9ImRhdGUiIGNsYXNzPSJvcmcucXVhcnR6LlNpbXBsZVRyaWdnZXIiPgotICAgICAgPHRpdGxlPk9uY2U8L3RpdGxlPgotICAgIDwvdHJpZ2dlcj4KLSAgICA8dHJpZ2dlciB0eXBlPSJhbmRyZWFzIiBjbGFzcz0ib3JnLnF1YXJ0ei5BbmRyZWFzVHJpZ2dlciI+Ci0gICAgICA8dGl0bGU+QW5kcmVhczwvdGl0bGU+Ci0gICAgPC90cmlnZ2VyPgotICA8L3RyaWdnZXJzPgotICAKLTwvc2NoZWR1bGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3NpdGVtYXAvYWN0aW9ucy54bWFwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2l0ZW1hcC9hY3Rpb25zLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MGQ5YzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2l0ZW1hcC9hY3Rpb25zLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gJElkOiBhY3Rpb25zLnhtYXAgMjgwMDYwIDIwMDUtMDktMTEgMDE6NTY6MzFaIGNoZXN0bnV0ICQgIC0tPgotCi08eG1hcCB4cGF0aD0iL3NpdGVtYXAvY29tcG9uZW50cy9hY3Rpb25zIiB1bmxlc3M9Ii9zaXRlbWFwL2NvbXBvbmVudHMvYWN0aW9ucy9hY3Rpb25bQG5hbWUgPSAnbGFuZ3VhZ2UtZXhpc3RzJ10iIAotICB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0gICA8bWFwOmFjdGlvbiBuYW1lPSJsYW5ndWFnZS1leGlzdHMiIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC5hY3Rpb24ubGFuZ3VhZ2UtZXhpc3RzIiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5hY3RpbmcuTGFuZ3VhZ2VFeGlzdHNBY3Rpb24iLz4KLSAgIDxtYXA6YWN0aW9uIG5hbWU9InJlcXVlc3QtcGFyYW1ldGVyLWV4aXN0cyIgbG9nZ2VyPSJzaXRlbWFwLmFjdGlvbi5yZXF1ZXN0UGFyYW1ldGVyRXhpc3RzIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLmFjdGluZy5SZXF1ZXN0UGFyYW1ldGVyRXhpc3RzQWN0aW9uIiAvPgotICAgPG1hcDphY3Rpb24gbmFtZT0icmVzZXJ2ZWQtY2hlY2tpbiIgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uYWN0aW5nLlJlc2VydmVkQ2hlY2tpbkFjdGlvbiIgbG9nZ2VyPSJzaXRlbWFwLmFjdGlvbi5yZXNlcnZlZC1jaGVja2luIi8+Ci0gICA8bWFwOmFjdGlvbiBuYW1lPSJyZXNlcnZlZC1jaGVja291dCIgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uYWN0aW5nLlJlc2VydmVkQ2hlY2tvdXRBY3Rpb24iIGxvZ2dlcj0ic2l0ZW1hcC5hY3Rpb24ucmVzZXJ2ZWQtY2hlY2tvdXQiLz4KLSAgIDxtYXA6YWN0aW9uIG5hbWU9InJlc2VydmVkLWNoZWNrb3V0LXRlc3QiIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZy5SZXNlcnZlZENoZWNrb3V0VGVzdEFjdGlvbiIgbG9nZ2VyPSJzaXRlbWFwLmFjdGlvbi5yZXNlcnZlZC1jaGVja291dC10ZXN0Ii8+Ci0gICA8bWFwOmFjdGlvbiBuYW1lPSJkaXNjb3Zlci1jaGVja291dCIgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24uYWN0aW5nLkRpc2NvdmVyQ2hlY2tvdXRBY3Rpb24iIGxvZ2dlcj0ic2l0ZW1hcC5hY3Rpb24uZGlzY292ZXItY2hlY2tvdXQiLz4KLSAgIDxtYXA6YWN0aW9uIG5hbWU9InNldC1oZWFkZXIiIGxvZ2dlcj0ic2l0ZW1hcC5hY3Rpb24uc2V0LWhlYWRlciIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5hY3RpbmcuSHR0cEhlYWRlckFjdGlvbiIvPgotICAgPG1hcDphY3Rpb24gbmFtZT0icmVzb3VyY2UtZXhpc3RzIiBsb2dnZXI9InNpdGVtYXAuYWN0aW9uLnJlc291cmNlLWV4aXN0cyIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5hY3RpbmcuUmVzb3VyY2VFeGlzdHNBY3Rpb24iLz4KLSAgIDxtYXA6YWN0aW9uIG5hbWU9InJlc291cmNlLWV4aXN0cy1lbmhhbmNlZCIgbG9nZ2VyPSJzaXRlbWFwLmFjdGlvbi5yZXNvdXJjZS1leGlzdHMtZW5oYW5jZWQiIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmFjdGluZy5SZXNvdXJjZUV4aXN0c0FjdGlvbiIvPgotICAgPG1hcDphY3Rpb24gbmFtZT0ic2Vzc2lvbi1wcm9wYWdhdG9yIiBsb2dnZXI9InNpdGVtYXAuYWN0aW9uLnNlc3Npb24tcHJvcGFnYXRvciIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5hY3RpbmcuU2Vzc2lvblByb3BhZ2F0b3JBY3Rpb24iLz4KLTwveG1hcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL2NvbW1lbnRzLnhtYXAgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL2NvbW1lbnRzLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMGM3MDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2l0ZW1hcC9jb21tZW50cy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx4bWFwIHhwYXRoPSIvc2l0ZW1hcCIgdW5sZXNzPSJub3QoLy9jb21tZW50KCkpIiByZW1vdmU9Ii8vY29tbWVudCgpIi8+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2l0ZW1hcC9leGNlcHRpb25zZWxlY3Rvci54bWFwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2l0ZW1hcC9leGNlcHRpb25zZWxlY3Rvci54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGZmMDMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3NpdGVtYXAvZXhjZXB0aW9uc2VsZWN0b3IueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08eG1hcCB4cGF0aD0iL3NpdGVtYXAvY29tcG9uZW50cy9zZWxlY3RvcnMvc2VsZWN0b3JbQG5hbWUgPSAnZXhjZXB0aW9uJ10iIA0KLSAgICAgIHVubGVzcz0iL3NpdGVtYXAvY29tcG9uZW50cy9zZWxlY3RvcnMvc2VsZWN0b3JbQG5hbWUgPSAnZXhjZXB0aW9uJ10vZXhjZXB0aW9uW0BuYW1lID0gJ3NheC1wYXJzaW5nJ10iDQotICAgICAgaW5zZXJ0LWJlZm9yZT0iL3NpdGVtYXAvY29tcG9uZW50cy9zZWxlY3RvcnMvc2VsZWN0b3JbQG5hbWUgPSAnZXhjZXB0aW9uJ10vZXhjZXB0aW9uW0BjbGFzcyA9ICdqYXZhLmxhbmcuVGhyb3dhYmxlJ10iPg0KLSAgICA8ZXhjZXB0aW9uIGNsYXNzPSJvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbiIgbmFtZT0ic2F4LXBhcnNpbmciLz4NCi0gICAgPGV4Y2VwdGlvbiBjbGFzcz0ib3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIiBuYW1lPSJzYXgiIHVucm9sbD0idHJ1ZSIvPg0KLSAgICA8ZXhjZXB0aW9uIGNsYXNzPSJvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0aW9uIiBuYW1lPSJwcm9jZXNzaW5nIiB1bnJvbGw9InRydWUiLz4NCi08L3htYXA+ICAgICAgDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2l0ZW1hcC9nZW5lcmF0b3JzLnhtYXAgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL2dlbmVyYXRvcnMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NmFiMi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL2dlbmVyYXRvcnMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08eG1hcCB4cGF0aD0iL3NpdGVtYXAvY29tcG9uZW50cy9nZW5lcmF0b3JzIiANCi0gIHVubGVzcz0iL3NpdGVtYXAvY29tcG9uZW50cy9nZW5lcmF0b3JzL2dlbmVyYXRvcltAbmFtZSA9ICdsZW55YU1ldGFEYXRhJ10iDQotICB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+DQotDQotICA8bWFwOmdlbmVyYXRvciBsYWJlbD0iY29udGVudCIgbG9nZ2VyPSJzaXRlbWFwLmdlbmVyYXRvci5sZW55YU1ldGFEYXRhIg0KLSAgICBuYW1lPSJsZW55YU1ldGFEYXRhIiBwb29sLW1heD0iMTYiDQotICAgIHNyYz0ib3JnLmFwYWNoZS5sZW55YS5jbXMuY29jb29uLmdlbmVyYXRpb24uTGVueWFNZXRhRGF0YUdlbmVyYXRvciIvPgotICAgIAotICA8bWFwOmdlbmVyYXRvciBsYWJlbD0iY29udGVudCIgbG9nZ2VyPSJzaXRlbWFwLmdlbmVyYXRvci5zZXNzaW9uYXR0ciIKLSAgICBuYW1lPSJzZXNzaW9uLWF0dHIiIHBvb2wtbWF4PSIxNiIKLSAgICBzcmM9Im9yZy5hcGFjaGUuY29jb29uLmdlbmVyYXRpb24uU2Vzc2lvbkF0dHJpYnV0ZUdlbmVyYXRvciIvPg0KLSAgDQotPC94bWFwPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3NpdGVtYXAvbWF0Y2hlcnMueG1hcCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3NpdGVtYXAvbWF0Y2hlcnMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmZDg1Ny4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL21hdGNoZXJzLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHhtYXAgeHBhdGg9Ii9zaXRlbWFwL2NvbXBvbmVudHMvbWF0Y2hlcnMiIHVubGVzcz0iL3NpdGVtYXAvY29tcG9uZW50cy9tYXRjaGVycy9tYXRjaGVyW0BuYW1lID0gJ3VzZWNhc2UnXSINCi0gIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4NCi0gICAgIDxtYXA6bWF0Y2hlciBuYW1lPSJhZ2VudC1tYXRjaCIgbG9nZ2VyPSJzaXRlbWFwLm1hdGNoZXIucmVmZXJlci1tYXRjaCIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5tYXRjaGluZy5XaWxkY2FyZEhlYWRlck1hdGNoZXIiPg0KLSAgICAgICAgPGhlYWRlci1uYW1lPlVzZXItQWdlbnQ8L2hlYWRlci1uYW1lPg0KLSAgICA8L21hcDptYXRjaGVyPg0KLSAgICA8bWFwOm1hdGNoZXIgbmFtZT0idXNlY2FzZSIgbG9nZ2VyPSJzaXRlbWFwLm1hdGNoZXIudXNlY2FzZSIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5tYXRjaGluZy5XaWxkY2FyZFJlcXVlc3RQYXJhbWV0ZXJNYXRjaGVyIj4NCi0gICAgICA8cGFyYW1ldGVyLW5hbWU+bGVueWEudXNlY2FzZTwvcGFyYW1ldGVyLW5hbWU+DQotICAgIDwvbWFwOm1hdGNoZXI+DQotICAgIDxtYXA6bWF0Y2hlciBuYW1lPSJzdGVwIiBsb2dnZXI9InNpdGVtYXAubWF0Y2hlci5zdGVwIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLm1hdGNoaW5nLldpbGRjYXJkUmVxdWVzdFBhcmFtZXRlck1hdGNoZXIiPg0KLSAgICAgIDxwYXJhbWV0ZXItbmFtZT5sZW55YS5zdGVwPC9wYXJhbWV0ZXItbmFtZT4NCi0gICAgPC9tYXA6bWF0Y2hlcj4NCi0gICAgPG1hcDptYXRjaGVyIG5hbWU9InJlZ2lzdGVyZWQtdXNlY2FzZSIgbG9nZ2VyPSJzaXRlbWFwLm1hdGNoZXIucmVnaXN0ZXJlZC11c2VjYXNlIiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi5tYXRjaGluZy5Vc2VjYXNlUmVnaXN0cmF0aW9uTWF0Y2hlciIvPg0KLTwveG1hcD4gICAgICANCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL3BpcGVsaW5lcy54bWFwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2l0ZW1hcC9waXBlbGluZXMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliMDUzYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL3BpcGVsaW5lcy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08eG1hcCByZW1vdmU9Ii9zaXRlbWFwL3BpcGVsaW5lcyINCi0gICAgICB1bmxlc3M9Ii9zaXRlbWFwL3BpcGVsaW5lcy9waXBlbGluZS9tYXRjaFtAcGF0dGVybiA9ICdsZW55YS1zY3JlZW4ueHNsJ10iDQotICAgICAgeHBhdGg9Ii9zaXRlbWFwIg0KLSAgICAgIGluc2VydC1hZnRlcj0iL3NpdGVtYXAvcmVzb3VyY2VzIg0KLSAgICAgIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBQaXBlbGluZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLQ0KLSAgPG1hcDpwaXBlbGluZXM+DQotDQotICAgIDwhLS0gSTE4TiAgLS0+DQotICAgIDxtYXA6cGlwZWxpbmU+DQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJpMThuLWNhdGFsb2d1ZS8qKiI+DQotICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9IiIgc3JjPSJsZW55YS9pMThuLnhtYXAiIGNoZWNrLXJlbG9hZD0idHJ1ZSIgcmVsb2FkLW1ldGhvZD0ic3luY2hyb24iLz4NCi0gICAgICA8L21hcDptYXRjaD4NCi0gICAgPC9tYXA6cGlwZWxpbmU+DQotDQotICAgIDxtYXA6cGlwZWxpbmU+DQotICAgIA0KLSAgICA8IS0tIExlbnlhIEdVSSBzY3JlZW4gLS0+DQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJsZW55YS1zY3JlZW4ueHNsIj4NCi0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9wYWdlMnhodG1sLnhzbCIvPg0KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+DQotICAgICAgPC9tYXA6bWF0Y2g+DQotICAgICAgDQotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJhYy5sb2dpbiIgdHlwZT0idXNlY2FzZSI+DQotICAgICAgICA8bWFwOm1vdW50IHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdXNlY2FzZS54bWFwIiB1cmktcHJlZml4PSIiIGNoZWNrLXJlbG9hZD0ieWVzIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPg0KLSAgICAgIDwvbWFwOm1hdGNoPg0KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iYWMubG9nb3V0IiB0eXBlPSJ1c2VjYXNlIj4NCi0gICAgICAgIDxtYXA6bW91bnQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvdXNlY2FzZS91c2VjYXNlLnhtYXAiIHVyaS1wcmVmaXg9IiIgY2hlY2stcmVsb2FkPSJ5ZXMiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+DQotICAgICAgPC9tYXA6bWF0Y2g+DQotDQotICAgIDwhLS0gZmF2aWNvbiAtLT4NCi0gICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJmYXZpY29uLmljbyI+DQotICAgICAgPG1hcDpyZWFkIG1pbWUtdHlwZT0iaW1hZ2UveC1pY29uIiBzcmM9ImxlbnlhL3Jlc291cmNlcy9pbWFnZXMvbGVueWEuaWNvIi8+DQotICAgIDwvbWFwOm1hdGNoPg0KLSAgICA8L21hcDpwaXBlbGluZT4NCi0NCi0gICAgPG1hcDpwaXBlbGluZSBpbnRlcm5hbC1vbmx5PSJ0cnVlIj4NCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioqIj4NCi0gICAgICAgIDxtYXA6bW91bnQgdXJpLXByZWZpeD0iIiBzcmM9Imdsb2JhbC1zaXRlbWFwLnhtYXAiIGNoZWNrLXJlbG9hZD0idHJ1ZSIgcmVsb2FkLW1ldGhvZD0ic3luY2hyb24iLz4NCi0gICAgICA8L21hcDptYXRjaD4NCi0gICAgPC9tYXA6cGlwZWxpbmU+DQotICAgICAgDQotICAgIDxtYXA6cGlwZWxpbmU+DQotCi0gICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKiI+Ci0gICAgICAKLSAgICAgIDwhLS0gcmVkaXJlY3QgdG8gU1NMIGlmIHRoZSBwb2xpY3kgcmVxdWlyZXMgdGhpcyAtLT4KLSAgICAgIDxtYXA6YWN0IHR5cGU9InNzbC1yZWRpcmVjdCI+Ci0gICAgICAgIDxtYXA6cmVkaXJlY3QtdG8gdXJpPSJ7cmVkaXJlY3RVcml9IiBzZXNzaW9uPSJ0cnVlIi8+Ci0gICAgICA8L21hcDphY3Q+Ci0gICAgICANCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Iiovd2ViZGF2KioiPg0KLSAgICAgICAgPG1hcDphY3QgdHlwZT0iYXV0aG9yaXplciI+DQotICAgICAgICAgICAgPG1hcDptb3VudCBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIiBzcmM9Imdsb2JhbC1zaXRlbWFwLnhtYXAiIHVyaS1wcmVmaXg9IiIvPiANCi0gICAgICAgIDwvbWFwOmFjdD4NCi0gICAgICAgIDxtYXA6YWN0IHR5cGU9ImF1dGhlbnRpY2F0b3IiPg0KLSAgICAgICAgICA8bWFwOmFjdCB0eXBlPSJhdXRob3JpemVyIj4NCi0gICAgICAgICAgICA8bWFwOm1vdW50IHVyaS1wcmVmaXg9IiIgc3JjPSJnbG9iYWwtc2l0ZW1hcC54bWFwIiBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIi8+IA0KLSAgICAgICAgICA8L21hcDphY3Q+DQotICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InNldC1oZWFkZXIiPg0KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9IldXVy1BdXRoZW50aWNhdGUiIHZhbHVlPSJCYXNpYyBSZWFsbT1sZW55YSIgLz4NCi0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29udGV4dDovL2xlbnlhL2NvbnRlbnQvdXRpbC9lbXB0eS54bWwiIC8+DQotICAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvZXhjZXB0aW9uL2ZvcmJpZGRlbi54c2wiPg0KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZG9jdW1lbnRpZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXV1aWR9Ii8+DQotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJkb2N1bWVudHVybCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXVybH0iLz4NCi0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImFyZWEiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTphcmVhfSIvPg0KLSAgICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4NCi0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4aHRtbCIgc3RhdHVzLWNvZGU9IjQwMSIvPg0KLSAgICAgICAgICA8L21hcDphY3Q+DQotICAgICAgICA8L21hcDphY3Q+DQotICAgICAgICA8bWFwOmFjdCB0eXBlPSJzZXQtaGVhZGVyIj4NCi0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iV1dXLUF1dGhlbnRpY2F0ZSIgdmFsdWU9IkJhc2ljIFJlYWxtPWxlbnlhIiAvPg0KLSAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iY29udGV4dDovL2xlbnlhL2NvbnRlbnQvdXRpbC9lbXB0eS54bWwiIC8+DQotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L2V4Y2VwdGlvbi9mb3JiaWRkZW4ueHNsIj4NCi0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50aWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSIvPg0KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZG9jdW1lbnR1cmwiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11cmx9Ii8+DQotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJhcmVhIiB2YWx1ZT0ie3BhZ2UtZW52ZWxvcGU6YXJlYX0iLz4NCi0gICAgICAgICAgPC9tYXA6dHJhbnNmb3JtPg0KLSAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4aHRtbCIgc3RhdHVzLWNvZGU9IjQwMSIvPg0KLSAgICAgICAgPC9tYXA6YWN0Pg0KLSAgICAgIDwvbWFwOm1hdGNoPg0KLSAgICAgIDxtYXA6YWN0IHR5cGU9ImF1dGhvcml6ZXIiPg0KLSAgICAgICAgPG1hcDptb3VudCB1cmktcHJlZml4PSIiIHNyYz0iZ2xvYmFsLXNpdGVtYXAueG1hcCIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPg0KLSAgICAgIDwvbWFwOmFjdD4NCi0gICAgICA8bWFwOnJlZGlyZWN0LXRvIHNlc3Npb249InRydWUiIHVyaT0ie3Byb3h5Oi97MX19P2xlbnlhLnVzZWNhc2U9YWMubG9naW4mYW1wO3JlZmVycmVyUXVlcnlTdHJpbmc9e3VybC1lbmNvZGU6e3JlcXVlc3Q6cXVlcnlTdHJpbmd9fSIvPiAgICAgICAgCi0gICAgPC9tYXA6bWF0Y2g+DQotDQotICAgIDwvbWFwOnBpcGVsaW5lPg0KLQ0KLSAgICA8IS0tIHRoaXMgaXMgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciAtLT4NCi0gICAgPG1hcDpoYW5kbGUtZXJyb3JzPgotICAgICAgPG1hcDptb3VudCBzcmM9IntmYWxsYmFjazplcnJvci54bWFwfSIgY2hlY2stcmVsb2FkPSJ0cnVlIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIgdXJpLXByZWZpeD0iIi8+Ci0gICAgPC9tYXA6aGFuZGxlLWVycm9ycz4gICAgDQotICAgIA0KLSAgPC9tYXA6cGlwZWxpbmVzPjwveG1hcD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL3Jlc291cmNlcy54bWFwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb25maWcvc2l0ZW1hcC9yZXNvdXJjZXMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiZmIyMy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL3Jlc291cmNlcy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx4bWFwIHVubGVzcz0iL3NpdGVtYXAvcmVzb3VyY2VzL3Jlc291cmNlW0BuYW1lID0gJ3N0eWxlLWNtcy1wYWdlJ10iDQotICByZW1vdmU9Ii9zaXRlbWFwL3Jlc291cmNlcyINCi0gIHhwYXRoPSIvc2l0ZW1hcCINCi0gIGluc2VydC1hZnRlcj0iL3NpdGVtYXAvdmlld3MiDQotICB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+DQotICANCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZXNvdXJjZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLQ0KLSAgPG1hcDpyZXNvdXJjZXM+DQotICAgIDxtYXA6cmVzb3VyY2UgbmFtZT0ic3R5bGUtY21zLXBhZ2UiPg0KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9ImkxOG4iPiAgICAgIA0KLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0ie3JlcXVlc3Q6bG9jYWxlfSIvPg0KLSAgICAgIDwvbWFwOnRyYW5zZm9ybT4gICAgDQotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9wYWdlMnhodG1sLnhzbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icHJveHkiLz4NCi0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvbnRleHQ6Ly9sZW55YS94c2x0L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2wiLz4NCi0gICAgPC9tYXA6cmVzb3VyY2U+DQotICA8L21hcDpyZXNvdXJjZXM+DQotDQotPC94bWFwPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3NpdGVtYXAvc2VyaWFsaXplcnMueG1hcCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3NpdGVtYXAvc2VyaWFsaXplcnMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NDk1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL3NlcmlhbGl6ZXJzLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHhtYXAgcmVtb3ZlPSIvc2l0ZW1hcC9jb21wb25lbnRzL3NlcmlhbGl6ZXJzIg0KLSAgdW5sZXNzPSIvc2l0ZW1hcC9jb21wb25lbnRzL3NlcmlhbGl6ZXJzL3NlcmlhbGl6ZXJbQG5hbWUgPSAncGF0Y2gtdGVzdCddIg0KLSAgeHBhdGg9Ii9zaXRlbWFwL2NvbXBvbmVudHMiDQotICBpbnNlcnQtYWZ0ZXI9Ii9zaXRlbWFwL2NvbXBvbmVudHMvdHJhbnNmb3JtZXJzIg0KLSAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPg0KLSAgDQotICA8bWFwOnNlcmlhbGl6ZXJzIGRlZmF1bHQ9InhodG1sIj4NCi0NCi0gICAgPCEtLSB0aGlzIGRlY2xhcmF0aW9uIGlzIGp1c3QgdG8gdGVzdCBpZiB0aGUgcGF0Y2ggaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIC0tPg0KLSAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0icGF0Y2gtdGVzdCIgIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZXJpYWxpemVycy5IVE1MU2VyaWFsaXplciIvPg0KLQ0KLSAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0iaHRtbCIgbG9nZ2VyPSJzaXRlbWFwLnNlcmlhbGl6ZXIuaHRtbCIgbWltZS10eXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIHBvb2wtZ3Jvdz0iNCIgcG9vbC1tYXg9IjMyIiANCi0gICAgcG9vbC1taW49IjQiIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uY29tcG9uZW50cy5zZXJpYWxpemVycy5IVE1MU2VyaWFsaXplciI+DQotICAgICAgPGRvY3R5cGUtZGVmYXVsdD5sb29zZTwvZG9jdHlwZS1kZWZhdWx0Pg0KLSAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+DQotICAgIDwvbWFwOnNlcmlhbGl6ZXI+DQotICAgIA0KLSAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0iaHRtbC1uby1kdGQiIGxvZ2dlcj0ic2l0ZW1hcC5zZXJpYWxpemVyLmh0bWwtbm8tZHRkIiBtaW1lLXR5cGU9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgcG9vbC1ncm93PSI0IiBwb29sLW1heD0iMzIiIHBvb2wtbWluPSI0IiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uSFRNTFNlcmlhbGl6ZXIiPg0KLSAgICAgIDxidWZmZXItc2l6ZT4xMDI0PC9idWZmZXItc2l6ZT4NCi0gICAgPC9tYXA6c2VyaWFsaXplcj4NCi0gICAgDQotICAgIDxtYXA6c2VyaWFsaXplciBuYW1lPSJodG1sbm9pIiBsb2dnZXI9InNpdGVtYXAuc2VyaWFsaXplci5odG1sbm9pIiBtaW1lLXR5cGU9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgcG9vbC1ncm93PSI0IiBwb29sLW1heD0iMzIiIHBvb2wtbWluPSI0IiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uSFRNTFNlcmlhbGl6ZXIiPiANCi0gICAgICA8aW5kZW50Pm5vPC9pbmRlbnQ+DQotICAgICAgPGRvY3R5cGUtcHVibGljPi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOPC9kb2N0eXBlLXB1YmxpYz4NCi0gICAgICA8ZG9jdHlwZS1zeXN0ZW0+aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkPC9kb2N0eXBlLXN5c3RlbT4NCi0gICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPg0KLSAgICA8L21hcDpzZXJpYWxpemVyPg0KLSAgICANCi0gICAgPG1hcDpzZXJpYWxpemVyIG5hbWU9InhodG1sIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uWE1MU2VyaWFsaXplciIgbWltZS10eXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGxvZ2dlcj0ic2l0ZW1hcC5zZXJpYWxpemVyLnhodG1sIiBwb29sLWdyb3c9IjIiIHBvb2wtbWF4PSI2NCIgcG9vbC1taW49IjIiPiANCi0gICAgICA8ZG9jdHlwZS1wdWJsaWM+LS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU48L2RvY3R5cGUtcHVibGljPg0KLSAgICAgIDxkb2N0eXBlLXN5c3RlbT5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkPC9kb2N0eXBlLXN5c3RlbT4NCi0gICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPg0KLSAgICA8L21hcDpzZXJpYWxpemVyPg0KLSAgICANCi0gICAgPG1hcDpzZXJpYWxpemVyIG5hbWU9InhtbCIgbG9nZ2VyPSJzaXRlbWFwLnNlcmlhbGl6ZXIueG1sIiBtaW1lLXR5cGU9InRleHQveG1sOyBjaGFyc2V0PXV0Zi04IiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMuc2VyaWFsaXplcnMuWE1MU2VyaWFsaXplciI+DQotICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+DQotICAgIDwvbWFwOnNlcmlhbGl6ZXI+DQotICAgIA0KLSAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0ibGlua3MiIGxvZ2dlcj0ic2l0ZW1hcC5zZXJpYWxpemVyLmxpbmtzIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uTGlua1NlcmlhbGl6ZXIiLz4NCi0gICAgDQotICAgIDxtYXA6c2VyaWFsaXplciBuYW1lPSJ3bWwiIGxvZ2dlcj0ic2l0ZW1hcC5zZXJpYWxpemVyLndtbCIgbWltZS10eXBlPSJ0ZXh0L3ZuZC53YXAud21sIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uWE1MU2VyaWFsaXplciI+DQotICAgICA8ZG9jdHlwZS1wdWJsaWM+LS8vV0FQRk9SVU0vL0RURCBXTUwgMS4xLy9FTjwvZG9jdHlwZS1wdWJsaWM+DQotICAgICA8ZG9jdHlwZS1zeXN0ZW0+aHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbF8xLjEueG1sPC9kb2N0eXBlLXN5c3RlbT4NCi0gICAgIDxlbmNvZGluZz5BU0NJSTwvZW5jb2Rpbmc+DQotICAgICA8b21pdC14bWwtZGVjbGFyYXRpb24+eWVzPC9vbWl0LXhtbC1kZWNsYXJhdGlvbj4NCi0gICAgPC9tYXA6c2VyaWFsaXplcj4NCi0NCi0gICAgPG1hcDpzZXJpYWxpemVyIG5hbWU9InRleHQiIGxvZ2dlcj0ic2l0ZW1hcC5zZXJpYWxpemVyLnRleHQiIG1pbWUtdHlwZT0idGV4dC9wbGFpbiIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5zZXJpYWxpemF0aW9uLlRleHRTZXJpYWxpemVyIj4NCi0gICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPg0KLSAgICA8L21hcDpzZXJpYWxpemVyPg0KLQ0KLSAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0iZm8ycGRmIiBsb2dnZXI9InNpdGVtYXAuc2VyaWFsaXplci5mbzJwZGYiIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vcGRmIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uRk9QU2VyaWFsaXplciIvPg0KLSAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0iZm8ycHMiIGxvZ2dlcj0ic2l0ZW1hcC5zZXJpYWxpemVyLmZvMnBzIiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQiIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uc2VyaWFsaXphdGlvbi5GT1BTZXJpYWxpemVyIi8+DQotICAgIDxtYXA6c2VyaWFsaXplciBuYW1lPSJmbzJwY2wiIGxvZ2dlcj0ic2l0ZW1hcC5zZXJpYWxpemVyLmZvMnBjbCIgbWltZS10eXBlPSJ2bmQuaHAtUENMIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uRk9QU2VyaWFsaXplciIvPg0KLSAgICA8bWFwOnNlcmlhbGl6ZXIgbmFtZT0ic3ZneG1sIiBsb2dnZXI9InNpdGVtYXAuc2VyaWFsaXplci5zdmd4bWwiIG1pbWUtdHlwZT0iaW1hZ2Uvc3ZnLXhtbCIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5zZXJpYWxpemF0aW9uLlhNTFNlcmlhbGl6ZXIiPg0KLSAgICAgIDxkb2N0eXBlLXB1YmxpYz4tLy9XM0MvL0RURCBTVkcgMjAwMDAzMDMgU3R5bGFibGUvL0VOPC9kb2N0eXBlLXB1YmxpYz4NCi0gICAgICA8ZG9jdHlwZS1zeXN0ZW0+aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC8wMy9XRC1TVkctMjAwMDAzMDMvPC9kb2N0eXBlLXN5c3RlbT4NCi0gICAgPC9tYXA6c2VyaWFsaXplcj4NCi0gICAgPG1hcDpzZXJpYWxpemVyIG5hbWU9InN2ZzJqcGVnIiBsb2dnZXI9InNpdGVtYXAuc2VyaWFsaXplci5zdmcycG5nIiBtaW1lLXR5cGU9ImltYWdlL2pwZWciIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24uc2VyaWFsaXphdGlvbi5TVkdTZXJpYWxpemVyIj4NCi0gICAgICA8cGFyYW1ldGVyIG5hbWU9InF1YWxpdHkiIHR5cGU9ImZsb2F0IiB2YWx1ZT0iMC45Ii8+DQotICAgIDwvbWFwOnNlcmlhbGl6ZXI+DQotICAgIDxtYXA6c2VyaWFsaXplciBuYW1lPSJzdmcycG5nIiBsb2dnZXI9InNpdGVtYXAuc2VyaWFsaXplci5zdmcycG5nIiBtaW1lLXR5cGU9ImltYWdlL3BuZyIgc3JjPSJvcmcuYXBhY2hlLmNvY29vbi5zZXJpYWxpemF0aW9uLlNWR1NlcmlhbGl6ZXIiLz4NCi0gICAgPG1hcDpzZXJpYWxpemVyIG5hbWU9InN2ZzJ0aWZmIiBsb2dnZXI9InNpdGVtYXAuc2VyaWFsaXplci5zdmcydGlmZiIgbWltZS10eXBlPSJpbWFnZS90aWZmIiBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnNlcmlhbGl6YXRpb24uU1ZHU2VyaWFsaXplciIvPg0KLQ0KLSAgPC9tYXA6c2VyaWFsaXplcnM+PC94bWFwPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3NpdGVtYXAvdHJhbnNmb3JtZXJzLnhtYXAgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbmZpZy9zaXRlbWFwL3RyYW5zZm9ybWVycy54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDNlNmMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29uZmlnL3NpdGVtYXAvdHJhbnNmb3JtZXJzLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHhtYXAgeHBhdGg9Ii9zaXRlbWFwL2NvbXBvbmVudHMvdHJhbnNmb3JtZXJzIiANCi0gIHVubGVzcz0iL3NpdGVtYXAvY29tcG9uZW50cy90cmFuc2Zvcm1lcnMvdHJhbnNmb3JtZXJbQG5hbWUgPSAnbGluay1yZXdyaXRlJ10iDQotICB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+DQotICANCi0gICAgPG1hcDp0cmFuc2Zvcm1lciBuYW1lPSJtZXRhRGF0YSIgbG9nZ2VyPSJsZW55YS5zaXRlbWFwLnRyYW5zZm9ybWVyLm1ldGFEYXRhIiBzcmM9Im9yZy5hcGFjaGUubGVueWEuY21zLmNvY29vbi50cmFuc2Zvcm1hdGlvbi5NZXRhRGF0YVRyYW5zZm9ybWVyIi8+DQotICAgIDxtYXA6dHJhbnNmb3JtZXIgbmFtZT0iaTE4biIgbG9nZ2VyPSJzaXRlbWFwLnRyYW5zZm9ybWVyLmkxOG4iIHNyYz0ib3JnLmFwYWNoZS5jb2Nvb24udHJhbnNmb3JtYXRpb24uSTE4blRyYW5zZm9ybWVyIj4NCi0gICAgICA8Y2F0YWxvZ3VlcyBkZWZhdWx0PSJjbXN1aSI+DQotICAgICAgICAgPGNhdGFsb2d1ZSBpZD0iY21zdWkiIG5hbWU9ImNtc3VpIiBsb2NhdGlvbj0iY29jb29uOi8vaTE4bi1jYXRhbG9ndWUvIi8+DQotICAgICAgIDwvY2F0YWxvZ3Vlcz4NCi0gICAgICAgPHVudHJhbnNsYXRlZC10ZXh0PnVudHJhbnNsYXRlZDwvdW50cmFuc2xhdGVkLXRleHQ+DQotICAgICAgIDxjYWNoZS1hdC1zdGFydHVwPnRydWU8L2NhY2hlLWF0LXN0YXJ0dXA+DQotICAgIDwvbWFwOnRyYW5zZm9ybWVyPg0KLSAgICA8bWFwOnRyYW5zZm9ybWVyIG5hbWU9InBhdHRlcm4iIA0KLSAgICAgICBzcmM9Im9yZy5hcGFjaGUuY29jb29uLnRyYW5zZm9ybWF0aW9uLlBhdHRlcm5UcmFuc2Zvcm1lciIgDQotICAgICAgIGxvZ2dlcj0ic2l0ZW1hcC50cmFuc2Zvcm1lci5wYXR0ZXJuIj4NCi0gICAgICAgPHBhcmFtZXRlciBuYW1lPSJncm91cHMiIHZhbHVlPSJ0cnVlIi8+DQotICAgIDwvbWFwOnRyYW5zZm9ybWVyPg0KLTwveG1hcD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvYWJvdXQueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L2Fib3V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzNmExOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvYWJvdXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHBhZ2U6cGFnZQotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICA+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGgyPkFwYWNoZSBMZW55YSBAbGVueWEudmVyc2lvbkAgKFJldmlzaW9uOiBAbGVueWEucmV2aXNpb25AKTwvaDI+Ci0gICAgPHA+Ci0gICAgICBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSBpbmRpdmlkdWFscwotICAgICAgb24gYmVoYWxmIG9mIHRoZSA8YnIgLz48YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4uCi0gICAgPC9wPgotICAgIDxwPgotICAgICAgQXBhY2hlIExlbnlhIGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCi0gICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4sIAotICAgICAgPGEgaHJlZj0iaHR0cDovL3czYy5vcmciPlczQzwvYT4sIGFuZCAKLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zZi5uZXQvcHJvamVjdHMvd2Vic3BoaW54Ij5XZWJTUEhJTlg8L2E+LgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgPC9wPgotICAgIDxmb3JtIGlkPSJmb3JtLWFib3V0LWJhY2siPgotICAgICAgPHA+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJCYWNrIiBvbkNsaWNrPSJoaXN0b3J5LmdvKC0xKSIgbmFtZT0iaW5wdXQtYmFjayIgaTE4bjphdHRyPSJ2YWx1ZSIvPgotICAgICAgPC9wPgotICAgIDwvZm9ybT4JCQotICA8L3BhZ2U6Ym9keT4KLTwvcGFnZTpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L2V4Y2VwdGlvbi9kb2N1bWVudC1kb2VzLW5vdC1leGlzdC54c3AgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvZXhjZXB0aW9uL2RvY3VtZW50LWRvZXMtbm90LWV4aXN0LnhzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyNTI1Zi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvZXhjZXB0aW9uL2RvY3VtZW50LWRvZXMtbm90LWV4aXN0LnhzcAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eHNwOnBhZ2UgCi0gIGxhbmd1YWdlPSJqYXZhIiAKLSAgeG1sbnM6eHNwPSJodHRwOi8vYXBhY2hlLm9yZy94c3AiCi0gIHhtbG5zOmlucHV0PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24veHNwL2lucHV0LzEuMCIKLSAgPgotICAKLSAgPHhzcDpzdHJ1Y3R1cmU+Ci0gICAgPHhzcDppbmNsdWRlPm9yZy5hcGFjaGUubGVueWEuY21zLnB1YmxpY2F0aW9uLkRvY3VtZW50PC94c3A6aW5jbHVkZT4KLSAgICA8eHNwOmluY2x1ZGU+b3JnLmFwYWNoZS5sZW55YS5jbXMucHVibGljYXRpb24udXRpbC5Eb2N1bWVudExhbmd1YWdlc0hlbHBlcjwveHNwOmluY2x1ZGU+Ci0gICAgPHhzcDppbmNsdWRlPm9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5zZXJ2aWNlLldyYXBwZXJTZXJ2aWNlTWFuYWdlcjwveHNwOmluY2x1ZGU+Ci0gIDwveHNwOnN0cnVjdHVyZT4KLSAgCi0gIDxtaXNzaW5nLWxhbmd1YWdlPgotICAgIAotICAgIDx4c3A6bG9naWM+Ci0gICAgICBEb2N1bWVudExhbmd1YWdlc0hlbHBlciBoZWxwZXIgPSBuZXcgRG9jdW1lbnRMYW5ndWFnZXNIZWxwZXIoCi0gICAgICAgIG9iamVjdE1vZGVsLCBuZXcgV3JhcHBlclNlcnZpY2VNYW5hZ2VyKHRoaXMubWFuYWdlcikpOwotICAgIDwveHNwOmxvZ2ljPgotICAgIAotICAgIDxjdXJyZW50LWxhbmd1YWdlPjx4c3A6ZXhwcj5oZWxwZXIuZ2V0TGFuZ3VhZ2UoKTwveHNwOmV4cHI+PC9jdXJyZW50LWxhbmd1YWdlPgotICAgIDxhdmFpbGFibGUtbGFuZ3VhZ2VzPgotICAgICAgPHhzcDpsb2dpYz4KLSAgICAgICAgU3RyaW5nW10gYXZhaWxhYmxlTGFuZ3VhZ2VzID0gaGVscGVyLmdldExhbmd1YWdlcygpOwotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IGF2YWlsYWJsZUxhbmd1YWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIGxhbmd1YWdlID0gYXZhaWxhYmxlTGFuZ3VhZ2VzW2ldOwotICAgICAgICAgIDx4c3A6Y29udGVudD4KLSAgICAgICAgICAgIDxhdmFpbGFibGUtbGFuZ3VhZ2U+Ci0gICAgICAgICAgICAgIDxsYW5ndWFnZT48eHNwOmV4cHI+bGFuZ3VhZ2U8L3hzcDpleHByPjwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICAgIDx1cmw+PHhzcDpleHByPmhlbHBlci5nZXRVcmwobGFuZ3VhZ2UpPC94c3A6ZXhwcj48L3VybD4KLSAgICAgICAgICAgIDwvYXZhaWxhYmxlLWxhbmd1YWdlPgotICAgICAgICAgIDwveHNwOmNvbnRlbnQ+Ci0gICAgICAgIH0KLSAgICAgIDwveHNwOmxvZ2ljPgotICAgIDwvYXZhaWxhYmxlLWxhbmd1YWdlcz4KLSAgICAKLSAgPC9taXNzaW5nLWxhbmd1YWdlPgotPC94c3A6cGFnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvZXhjZXB0aW9uL3B1YmxpY2F0aW9uLWRvZXMtbm90LWV4aXN0Lmp4IGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L2V4Y2VwdGlvbi9wdWJsaWNhdGlvbi1kb2VzLW5vdC1leGlzdC5qeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0YTk4Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvZXhjZXB0aW9uL3B1YmxpY2F0aW9uLWRvZXMtbm90LWV4aXN0Lmp4CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxqeDp0ZW1wbGF0ZSB4bWxuczpqeD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3RlbXBsYXRlcy9qeC8xLjAiPgotICAKLSAgPHBhZ2U6cGFnZQotICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLSAgICAKLSAgICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0PnB1YmxpY2F0aW9uLWRvZXMtbm90LWV4aXN0PC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICAgIAotICAgIDxwYWdlOmJvZHk+Ci0gICAgICA8cD4KLSAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgIDxpMThuOnRleHQ+cHVibGljYXRpb24tLi4uLWRvZXMtbm90LWV4aXN0PC9pMThuOnRleHQ+Ci0gICAgICAgICAgPGp4OnNldCB2YXI9InJlcXVlc3RVcmkiIHZhbHVlPSIke2NvY29vbi5yZXF1ZXN0LnJlcXVlc3RVUkl9Ii8+Ci0gICAgICAgICAgPGp4OnNldCB2YXI9ImNvbnRleHRQYXRoIiB2YWx1ZT0iJHtjb2Nvb24ucmVxdWVzdC5jb250ZXh0UGF0aH0iLz4KLSAgICAgICAgICA8ang6c2V0IHZhcj0ic25pcHBldHMiIHZhbHVlPSIke3JlcXVlc3RVcmkuc3Vic3RyaW5nKGNvbnRleHRQYXRoLmxlbmd0aCgpKS5zcGxpdCgnLycpfSIvPgotICAgICAgICAgIDxpMThuOnBhcmFtPjxqeDpvdXQgdmFsdWU9IiR7c25pcHBldHNbMV19Ii8+PC9pMThuOnBhcmFtPgotICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIDxhIGhyZWY9Ii9pbmRleC5odG1sIj48aTE4bjp0ZXh0PkJhY2s8L2kxOG46dGV4dD48L2E+Ci0gICAgICA8L3A+Ci0gICAgPC9wYWdlOmJvZHk+Ci0gICAgCi0gIDwvcGFnZTpwYWdlPgotICAKLTwvang6dGVtcGxhdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L2ludHJvZHVjdGlvbi54bWwgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvaW50cm9kdWN0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxYTQ0ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvaW50cm9kdWN0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxwYWdlOnBhZ2UgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCI+Ci0gIDxwYWdlOnRpdGxlPkFwYWNoZSBMZW55YSBAbGVueWEudmVyc2lvbkAgKFJldmlzaW9uOkBsZW55YS5yZXZpc2lvbkApPC9wYWdlOnRpdGxlPgotICA8cGFnZTpib2R5PgotICAKLSAgICA8ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBjbGFzcz0ibGVueWEtZnJvbnRwYWdlIj4KLSAgICAKLSAgICAgIDxoMj5XZWxjb21lIHRvIEFwYWNoZSBMZW55YTwvaDI+Ci0gICAgICA8cD4KLSAgICAgICAgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCBBcGFjaGUgTGVueWEgCi0gICAgICAgIDxzdHJvbmc+QGxlbnlhLnZlcnNpb25APC9zdHJvbmc+IChSZXZpc2lvbjogQGxlbnlhLnJldmlzaW9uQCkuCi0gICAgICAgIFRvIHN0YXJ0LCBjbGljayBvbiBhbnkgb2YgdGhlIHB1YmxpY2F0aW9ucyBvbiB0aGUgbGVmdCwgb3IgY3JlYXRlCi0gICAgICAgIGEgbmV3IHB1YmxpY2F0aW9uLgotICAgICAgPC9wPgotICAgIAotICAgICAgPGgzPkFib3V0PC9oMz4KLSAgICAgIDxwPgotICAgICAgICA8YSBocmVmPSJodHRwOi8vbGVueWEuYXBhY2hlLm9yZyI+QXBhY2hlIExlbnlhPC9hPiBpcyBhIEphdmEtYmFzZWQKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZyI+b3Blbi1zb3VyY2U8L2E+IENvbnRlbnQgTWFuYWdlbWVudCAKLSAgICAgICAgU3lzdGVtLiBJdCBpcyBiYXNlZCBvbiBvcGVuIHN0YW5kYXJkcyBzdWNoIGFzIAotICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczYy5vcmcvWE1MLyI+WE1MPC9hPiBhbmQgCi0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzNjLm9yZy9UUi94c2x0Ij5YU0xUPC9hPi4gSXQgaXMgYmFzZWQgb24KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NvY29vbi5hcGFjaGUub3JnIj5BcGFjaGUgQ29jb29uPC9hPi4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICBMZW55YSBpcyBhIGNvbW11bml0eSBwcm9qZWN0IGFuZCBpcyBiZWluZyBkZXZlbG9wZWQgdW5kZXIgdGhlIGFlZ2lzIG9mIHRoZSAKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRik8L2E+LiAKLSAgICAgICAgWW91IGFyZSB3ZWxjb21lIHRvIGpvaW4gb3VyIG1haWxpbmcgbGlzdHMgYW5kIGNvbnRyaWJ1dGUhCi0gICAgICA8L3A+Ci0gICAgICAKLSAgICAgIDxoMz5GZWF0dXJlczwvaDM+Ci0gICAgICA8dWw+Ci0gICAgICAgIDxsaT5zdXBwb3J0cyBtdWx0aS1saW5ndWFsIHdlYnNpdGVzPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgIGluY2x1ZGVzIHNldmVyYWwgY2xpZW50LXNpZGUgY29udGVudCBlZGl0b3JzLCBtYW55IG9mIHRoZW0KLSAgICAgICAgICBXWVNJV1lHCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT5hbGxvd3MgZm9yIGNvbXBsZXggd29ya2Zsb3dzIChlZGl0L3N1Ym1pdC9yZXZpZXcvcHVibGlzaCk8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgYWxsb3dzIGZvciBhcmJpdHJhcnkgb3V0cHV0LCBkb2VzIG5vdCBpbXBvc2Ugc3RhbmRhcmQgbGF5b3V0cyBvciAKLSAgICAgICAgICB0ZWNobmlxdWVzIChzdWNoIGFzIEhUTUwgdGFibGVzKSBvbiB0aGUgdXNlcgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgcHJvdmlkZXMgcmV2aXNpb24gY29udHJvbCwgb2xkIHBhZ2UgdmVyc2lvbnMgY2FuIGJlIHZpZXdlZCBhbmQgcmVzdG9yZWQKLSAgICAgICAgICBpZiBuZWNlc3NhcnkKLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgIHBvd2VyZnVsIFhNTCBwcm9jZXNzaW5nIGNhcGFiaWxpdGllcyB0aGFua3MgdG8gdGhlIHVuZGVybHlpbmcgQ29jb29uCi0gICAgICAgICAgZW5naW5lCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4uLi48L2xpPgotICAgICAgPC91bD4KLSAgICA8L2Rpdj4KLSAgCi0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvbWVudXMvYWRtaW4ueHNwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L21lbnVzL2FkbWluLnhzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3NGFiNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvbWVudXMvYWRtaW4ueHNwCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTx4c3A6cGFnZSAKLSAgICBsYW5ndWFnZT0iamF2YSIgCi0gICAgeG1sbnM6eHNwPSJodHRwOi8vYXBhY2hlLm9yZy94c3AiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgICB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL21lbnViYXIvMS4wIgotICAgIHhtbG5zOnVjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiCi0+Ci0KLTxtZW51PgotCi0gIDxtZW51cz4KLSAgICA8bWVudSBpMThuOmF0dHI9Im5hbWUiIG5hbWU9IkZpbGUiPgotICAgICAgPGJsb2NrPgotICAgICAgICA8aXRlbSB1Yzp1c2VjYXNlPSJhYy5sb2dvdXQiIGhyZWY9Ij8iPjxpMThuOnRleHQ+TG9nb3V0PC9pMThuOnRleHQ+PC9pdGVtPgotICAgICAgPC9ibG9jaz4KLSAgICA8L21lbnU+Ci0gIDwvbWVudXM+Ci0KLTwvbWVudT4KLQotPC94c3A6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC9tZW51cy9saXZlLnhzcCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC9tZW51cy9saXZlLnhzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhODkzZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvbWVudXMvbGl2ZS54c3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzcDpwYWdlIAotICBsYW5ndWFnZT0iamF2YSIgCi0gIHhtbG5zOnhzcD0iaHR0cDovL2FwYWNoZS5vcmcveHNwIgotPgotCi08bWVudT4KLQotPC9tZW51PgotCi08L3hzcDpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L3JjL2ZpbGVSZXNlcnZlZENoZWNrSW5FeGNlcHRpb24ueHNwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L3JjL2ZpbGVSZXNlcnZlZENoZWNrSW5FeGNlcHRpb24ueHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzRhZjQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC9yYy9maWxlUmVzZXJ2ZWRDaGVja0luRXhjZXB0aW9uLnhzcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eHNwOnBhZ2UgbGFuZ3VhZ2U9ImphdmEiIHhtbG5zOnhzcD0iaHR0cDovL2FwYWNoZS5vcmcveHNwIj4KLQotPHJjOmV4Y2VwdGlvbiB4bWxuczpyYz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3JjLzEuMCI+Ci0gIDx4c3A6bG9naWM+Ci0gICAgU3RyaW5nIGZpbGVuYW1lPXBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCJmaWxlbmFtZSIsIm51bGwiKTsKLSAgICBTdHJpbmcgY2hlY2tUeXBlPXBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCJjaGVja1R5cGUiLCJudWxsIik7Ci0gICAgU3RyaW5nIHVzZXI9cGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoInVzZXIiLCJudWxsIik7Ci0gICAgU3RyaW5nIGRhdGU9cGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoImRhdGUiLCJudWxsIik7Ci0gIDwveHNwOmxvZ2ljPgotICA8cmM6ZmlsZS1yZXNlcnZlZC1jaGVja2luLWV4Y2VwdGlvbj4KLSAgICA8cmM6ZmlsZW5hbWU+PHhzcDpleHByPmZpbGVuYW1lPC94c3A6ZXhwcj48L3JjOmZpbGVuYW1lPgotICAgIDxyYzpjaGVja1R5cGU+PHhzcDpleHByPmNoZWNrVHlwZTwveHNwOmV4cHI+PC9yYzpjaGVja1R5cGU+Ci0gICAgPHJjOnVzZXI+PHhzcDpleHByPnVzZXI8L3hzcDpleHByPjwvcmM6dXNlcj4KLSAgICA8cmM6ZGF0ZT48eHNwOmV4cHI+ZGF0ZTwveHNwOmV4cHI+PC9yYzpkYXRlPgotICA8L3JjOmZpbGUtcmVzZXJ2ZWQtY2hlY2tpbi1leGNlcHRpb24+Ci08L3JjOmV4Y2VwdGlvbj4KLQotPC94c3A6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC9yYy9maWxlUmVzZXJ2ZWRDaGVja091dEV4Y2VwdGlvbi54c3AgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvcmMvZmlsZVJlc2VydmVkQ2hlY2tPdXRFeGNlcHRpb24ueHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ5YmViLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC9yYy9maWxlUmVzZXJ2ZWRDaGVja091dEV4Y2VwdGlvbi54c3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzcDpwYWdlIGxhbmd1YWdlPSJqYXZhIiB4bWxuczp4c3A9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcCI+Ci0KLTxyYzpleGNlcHRpb24geG1sbnM6cmM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9yYy8xLjAiPgotICA8eHNwOmxvZ2ljPgotICAgIFN0cmluZyB1c2VyPXBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKCJ1c2VyIiwibnVsbCIpOwotICAgIFN0cmluZyBmaWxlbmFtZT1wYXJhbWV0ZXJzLmdldFBhcmFtZXRlcigiZmlsZW5hbWUiLCJudWxsIik7Ci0gICAgU3RyaW5nIGRhdGU9cGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoImRhdGUiLCJudWxsIik7Ci0gIDwveHNwOmxvZ2ljPgotICA8cmM6ZmlsZS1yZXNlcnZlZC1jaGVja291dC1leGNlcHRpb24+Ci0gICAgPHJjOmZpbGVuYW1lPjx4c3A6ZXhwcj5maWxlbmFtZTwveHNwOmV4cHI+PC9yYzpmaWxlbmFtZT4KLSAgICA8cmM6dXNlcj48eHNwOmV4cHI+dXNlcjwveHNwOmV4cHI+PC9yYzp1c2VyPgotICAgIDxyYzpkYXRlPjx4c3A6ZXhwcj5kYXRlPC94c3A6ZXhwcj48L3JjOmRhdGU+Ci0gIDwvcmM6ZmlsZS1yZXNlcnZlZC1jaGVja291dC1leGNlcHRpb24+Ci08L3JjOmV4Y2VwdGlvbj4KLQotPC94c3A6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC9yYy9nZW5lcmljRXhjZXB0aW9uLnhzcCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC9yYy9nZW5lcmljRXhjZXB0aW9uLnhzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxOGRhZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvcmMvZ2VuZXJpY0V4Y2VwdGlvbi54c3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzcDpwYWdlIGxhbmd1YWdlPSJqYXZhIiB4bWxuczp4c3A9Imh0dHA6Ly9hcGFjaGUub3JnL3hzcCI+Ci0KLTxyYzpleGNlcHRpb24geG1sbnM6cmM9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9yYy8xLjAiPgotICA8eHNwOmxvZ2ljPgotICAgIFN0cmluZyBmaWxlbmFtZT1wYXJhbWV0ZXJzLmdldFBhcmFtZXRlcigiZmlsZW5hbWUiLCJudWxsIik7Ci0gIDwveHNwOmxvZ2ljPgotICA8cmM6Z2VuZXJpYy1leGNlcHRpb24+Ci0gICAgPHJjOmZpbGVuYW1lPjx4c3A6ZXhwcj5maWxlbmFtZTwveHNwOmV4cHI+PC9yYzpmaWxlbmFtZT4KLSAgICA8cmM6bWVzc2FnZT48eHNwOmV4cHI+cGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIoIm1lc3NhZ2UiLCJudWxsIik8L3hzcDpleHByPjwvcmM6bWVzc2FnZT4KLSAgPC9yYzpnZW5lcmljLWV4Y2VwdGlvbj4KLTwvcmM6ZXhjZXB0aW9uPgotCi08L3hzcDpwYWdlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9jb250ZW50L3V0aWwvZW1wdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQwMjRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC91dGlsL2VtcHR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPCEtLSBUaGlzIGlzIGEgc2ltcGxlIHhtbCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGlwZWxpbmVzIHdoZXJlIGFsbCB0aGUgLS0+Ci08IS0tIHdvcmsgaXMgZG9uZSBpbiB0aGUgeHNsIGFuZCB0aGV5IGp1c3QgbmVlZCBhIGR1bW15IHhtbCB0byBzdGFydCB0aGUgLS0+Ci08IS0tIHBpcGVsaW5lLiAtLT4KLQotICA8ZW1wdHk+PC9lbXB0eT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC93ZWxjb21lLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvY29udGVudC93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyYTBlMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL2NvbnRlbnQvd2VsY29tZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IGludHJvZHVjdGlvbi54bWwgNDczODYxIDIwMDYtMTEtMTIgMDM6NTE6MTRaIGdyZWdvciAkIC0tPgotCi08cGFnZTpwYWdlIAotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLT4KLSAgPHBhZ2U6dGl0bGU+QXBhY2hlIExlbnlhIEBsZW55YS52ZXJzaW9uQCAoUmV2aXNpb246QGxlbnlhLnJldmlzaW9uQCk8L3BhZ2U6dGl0bGU+Ci0gIDxwYWdlOmJvZHk+Ci0gIAotICAgIDxoMT5XZWxjb21lIHRvIEFwYWNoZSBMZW55YTwvaDE+Ci0gICAgPHA+Ci0gICAgICBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIEFwYWNoZSBMZW55YSAKLSAgICAgIDxzdHJvbmc+QGxlbnlhLnZlcnNpb25APC9zdHJvbmc+IChSZXZpc2lvbjogQGxlbnlhLnJldmlzaW9uQCkuCi0gICAgICBUbyBzdGFydCwgY2xpY2sgb24gYW55IG9mIHRoZSBwdWJsaWNhdGlvbnMgb24gdGhlIGxlZnQsIG9yIGNyZWF0ZQotICAgICAgYSBuZXcgcHVibGljYXRpb24uCi0gICAgPC9wPgotICAKLSAgICA8aDI+QWJvdXQ8L2gyPgotICAgIDxwPgotICAgICAgPGEgaHJlZj0iaHR0cDovL2xlbnlhLmFwYWNoZS5vcmciPkFwYWNoZSBMZW55YTwvYT4gaXMgYSBKYXZhLWJhc2VkCi0gICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnIj5vcGVuLXNvdXJjZTwvYT4gQ29udGVudCBNYW5hZ2VtZW50IAotICAgICAgU3lzdGVtLiBJdCBpcyBiYXNlZCBvbiBvcGVuIHN0YW5kYXJkcyBzdWNoIGFzIAotICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53M2Mub3JnL1hNTC8iPlhNTDwvYT4gYW5kIAotICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53M2Mub3JnL1RSL3hzbHQiPlhTTFQ8L2E+LiBJdCBpcyBiYXNlZCBvbgotICAgICAgPGEgaHJlZj0iaHR0cDovL2NvY29vbi5hcGFjaGUub3JnIj5BcGFjaGUgQ29jb29uPC9hPi4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICBMZW55YSBpcyBhIGNvbW11bml0eSBwcm9qZWN0IGFuZCBpcyBiZWluZyBkZXZlbG9wZWQgdW5kZXIgdGhlIGFlZ2lzIG9mIHRoZSAKLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpPC9hPi4gCi0gICAgICBZb3UgYXJlIHdlbGNvbWUgdG8gam9pbiBvdXIgbWFpbGluZyBsaXN0cyBhbmQgY29udHJpYnV0ZSEKLSAgICA8L3A+Ci0gICAgCi0gICAgPGgyPkZlYXR1cmVzPC9oMj4KLSAgICA8dWw+Ci0gICAgICA8bGk+c3VwcG9ydHMgbXVsdGktbGluZ3VhbCB3ZWJzaXRlczwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIGluY2x1ZGVzIHNldmVyYWwgY2xpZW50LXNpZGUgY29udGVudCBlZGl0b3JzLCBtYW55IG9mIHRoZW0KLSAgICAgICAgV1lTSVdZRwotICAgICAgPC9saT4KLSAgICAgIDxsaT5hbGxvd3MgZm9yIGNvbXBsZXggd29ya2Zsb3dzIChlZGl0L3N1Ym1pdC9yZXZpZXcvcHVibGlzaCk8L2xpPgotICAgICAgPGxpPgotICAgICAgICBhbGxvd3MgZm9yIGFyYml0cmFyeSBvdXRwdXQsIGRvZXMgbm90IGltcG9zZSBzdGFuZGFyZCBsYXlvdXRzIG9yIAotICAgICAgICB0ZWNobmlxdWVzIChzdWNoIGFzIEhUTUwgdGFibGVzKSBvbiB0aGUgdXNlcgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgcHJvdmlkZXMgcmV2aXNpb24gY29udHJvbCwgb2xkIHBhZ2UgdmVyc2lvbnMgY2FuIGJlIHZpZXdlZCBhbmQgcmVzdG9yZWQKLSAgICAgICAgaWYgbmVjZXNzYXJ5Ci0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICBwb3dlcmZ1bCBYTUwgcHJvY2Vzc2luZyBjYXBhYmlsaXRpZXMgdGhhbmtzIHRvIHRoZSB1bmRlcmx5aW5nIENvY29vbgotICAgICAgICBlbmdpbmUKLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Li4uPC9saT4KLSAgICA8L3VsPgotICAKLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvaTE4bi54bWFwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9pMThuLnhtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjODc3MjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9pMThuLnhtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTwhLS0KLSAgVGhpcyBzaXRlbWFwcyBwcm92aWRlcyBmYWxsYmFjayBtZXNzYWdlIGNhdGFsb2d1ZXMgYW5kIGNhdGFsb2d1ZSBtZXJnaW5nLgotICBUaGUgcmVhc29uIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoaXMgc2l0ZW1hcCBpcyBtYWlubHkgdG8gYXZvaWQgZW5kbGVzcyBsb29wcyBjYXVzZWQgYnkgbW91bnRzCi0gIGluIHNpdGVtYXAueG1hcCBhbmQgZ2xvYmFsLXNpdGVtYXAueG1hcC4KLS0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICAKLSAgPG1hcDpyZXNvdXJjZXM+Ci0gICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJzZXJpYWxpemVDYXRhbG9ndWUiPgotICAgICAgPG1hcDpzZWxlY3QgdHlwZT0icGFyYW1ldGVyIj4KLSAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyLXNlbGVjdG9yLXRlc3QiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTppcy1wdWJsaWNhdGlvbn0iLz4KLSAgICAgICAgPG1hcDp3aGVuIHRlc3Q9InRydWUiPgotICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0icmVzb3VyY2VzL2kxOG4vbW9kdWxlczJ4aW5jbHVkZS54c2wiPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHViSWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0iLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNhdGFsb2d1ZSIgdmFsdWU9IntjYXRhbG9ndWV9Ii8+Ci0gICAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8L21hcDp3aGVuPgotICAgICAgPC9tYXA6c2VsZWN0PgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0ieGluY2x1ZGUiLz4KLSAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgIDwvbWFwOnJlc291cmNlPgotICA8L21hcDpyZXNvdXJjZXM+Ci0gIAotICA8bWFwOnBpcGVsaW5lcz4KLSAgICAKLSAgICA8bWFwOnBpcGVsaW5lIHR5cGU9ImNhY2hpbmciPgotICAgICAgCi0gICAgICA8IS0tIGkxOG4tY2F0YWxvZ3VlL21vZHVsZS97bW9kdWxlLWlkfS97Y2F0YWxvZ3VlfS0tPiAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iaTE4bi1jYXRhbG9ndWUvbW9kdWxlLyovKiI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImFnZ3JlZ2F0ZS1mYWxsYmFjazovL2xlbnlhL21vZHVsZXMvezF9L3Jlc291cmNlcy9pMThuL3syfSI+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iYWdncmVnYXRlLWZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97MX0vcmVzb3VyY2VzL2kxOG4vezJ9Ii8+Ci0gICAgICAgICAgPC9tYXA6d2hlbj4KLSAgICAgICAgICA8IS0tIE1vZHVsZXMgYXJlIG5vdCByZXF1aXJlZCB0byBjb250YWluIGEgY2F0YWxvZ3VlLiAtLT4KLSAgICAgICAgICA8bWFwOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJyZXNvdXJjZXMvaTE4bi9lbXB0eUNhdGFsb2d1ZS54bWwiLz4KLSAgICAgICAgICA8L21hcDpvdGhlcndpc2U+Ci0gICAgICAgIDwvbWFwOnNlbGVjdD4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJpMThuLWNhdGFsb2d1ZS8qKiI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImFnZ3JlZ2F0ZS1mYWxsYmFjazovL2xlbnlhL3Jlc291cmNlcy9pMThuL3sxfSI+Ci0gICAgICAgICAgICA8bWFwOmdlbmVyYXRlIHNyYz0iYWdncmVnYXRlLWZhbGxiYWNrOi8vbGVueWEvcmVzb3VyY2VzL2kxOG4vezF9Ii8+Ci0gICAgICAgICAgICA8bWFwOmNhbGwgcmVzb3VyY2U9InNlcmlhbGl6ZUNhdGFsb2d1ZSI+Ci0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImNhdGFsb2d1ZSIgdmFsdWU9InsxfSIvPgotICAgICAgICAgICAgPC9tYXA6Y2FsbD4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICAgIDwhLS0gV2UgZG9uJ3QgcmV0dXJuIGFuIGVtcHR5IGNhdGFsb2d1ZSwgb3RoZXJ3aXNlIHRoZSBmYWxsYmFjayBmcm9tICJlbl91cyIgdG8gImVuIiB3b3VsZG4ndCBiZSB0cmlnZ2VyZWQuIC0tPgotICAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPiAgCi0gIDwvbWFwOnBpcGVsaW5lcz4KLSAgCi08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9sZW55YS54bWFwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9sZW55YS54bWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI4NjVhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvbGVueWEueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICAKLSAgPG1hcDpyZXNvdXJjZXM+Ci0gICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJwcm94eS1jc3MiPgotICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJ0ZXh0IiBzcmM9Int1cmx9LmNzcyIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icGF0dGVybiIgc3JjPSJmYWxsYmFjazovL2xlbnlhL2NoYXBlcm9uL2dyYW1tYXJzL2xpbmsueGxleCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL2NoYXBlcm9uL3N0eWxlc2hlZXRzL3BhdHRlcm4tdG8tbGluay54c2wiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ii8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY2hhcGVyb24vc3R5bGVzaGVldHMvYS10by10eHQueHNsIi8+Ci0gICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ0ZXh0IiBtaW1lLXR5cGU9InRleHQvY3NzIi8+Ci0gICAgPC9tYXA6cmVzb3VyY2U+Ci0gIDwvbWFwOnJlc291cmNlcz4KLSAgCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgICA8IS0tIGVuYWJsZSBjbGllbnQgc2lkZSBjYWNoaW5nIG9mIHJlc291cmNlcyAtLT4KLSAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImV4cGlyZXMiIHZhbHVlPSJ7Z2xvYmFsOnBpcGVsaW5lLWV4cGlyYXRpb259Ii8+Ci0gICAgICAKLSAgICAgIDwhLS0gTGVueWEgQ29yZSAtLT4KLSAgICAgIAotICAgICAgPCEtLSBtYXRjaGVzIGxlbnlhLyoqLmpzIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKi5qcyI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9InJlc291cmNlcy97MX0ueG1sIj4KLSAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJyZXNvdXJjZXMvezF9LnhtbCIvPgotICAgICAgICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+ICAgICAgCi0gICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdmFsdWU9IntyZXF1ZXN0OmxvY2FsZX0iLz4KLSAgICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4gICAgCi0gICAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9InJlc291cmNlcy9qYXZhc2NyaXB0L2phdmFzY3JpcHQueHNsIi8+Ci0gICAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ0ZXh0IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIvPgotICAgICAgICAgIDwvbWFwOndoZW4+Ci0gICAgICAgICAgPG1hcDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJyZXNvdXJjZXMvezF9LmpzIiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIgLz4KLSAgICAgICAgICA8L21hcDpvdGhlcndpc2U+Ci0gICAgICAgIDwvbWFwOnNlbGVjdD4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IioqLnJuZyI+Ci0gICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJyZXNvdXJjZXMvezF9LnJuZyIvPgotICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9InhzbHQvcmVzb3VyY2VzL3RyYW5zbGF0ZS1ybmctaW5jbHVkZXMueHNsIi8+Ci0gICAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InhtbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iY3NzLyoqLmNzcyI+Ci0gICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0icHJveHktY3NzIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJyZXNvdXJjZXMvY3NzL3sxfSIvPgotICAgICAgICA8L21hcDpjYWxsPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gICAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDwhLS0gZW5hYmxlIGNsaWVudCBzaWRlIGNhY2hpbmcgb2YgcmVzb3VyY2VzIC0tPgotICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0iZXhwaXJlcyIgdmFsdWU9ImFjY2VzcyBwbHVzIDIgaG91cnMiLz4KLSAgICAgIAotICAgICAgPCEtLSBtYXRjaGVzIGxlbnlhLyoqLmpwZyAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKiouanBnIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0icmVzb3VyY2VzL3sxfS5qcGciIG1pbWUtdHlwZT0iaW1hZ2UvanBlZyIgLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIG1hdGNoZXMgbGVueWEvKiouZ2lmIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqKi5naWYiPgotICAgICAgICA8bWFwOnJlYWQgc3JjPSJyZXNvdXJjZXMvezF9LmdpZiIgbWltZS10eXBlPSJpbWFnZS9naWYiIC8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSBtYXRjaGVzIGxlbnlhLyoqLnBuZyAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKioucG5nIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0icmVzb3VyY2VzL3sxfS5wbmciIG1pbWUtdHlwZT0iaW1hZ2UvcG5nIiAvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0gbWF0Y2hlcyBsZW55YS8qKi5leHQgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImltYWdlcy8qKi4qIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0icmVzb3VyY2VzL2ltYWdlcy97MX0uezJ9IiBtaW1lLXR5cGU9ImltYWdlL3syfSIgLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgIDwvbWFwOnBpcGVsaW5lPgotICAgIAotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9tb2R1bGUtcmVzb3VyY2VzLnhtYXAgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL21vZHVsZS1yZXNvdXJjZXMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3NzExNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL21vZHVsZS1yZXNvdXJjZXMueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHJlc291cmNlcy1zaGFyZWQueG1hcCAzNDk1ODggMjAwNS0xMS0yOSAwMjowNzo0NFogY2hlc3RudXQgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDxtYXA6Y29tcG9uZW50cz4KLSAgICA8bWFwOnRyYW5zZm9ybWVycyBkZWZhdWx0PSJ4c2x0Ij4KLSAgICAgIDwhLS0gdGVtcG9yYXJ5IGZpeCBmb3IgYnhlLiBzaG91bGQgYmUgcmVjb25zaWRlcmVkIC0tPgotICAgICAgPG1hcDp0cmFuc2Zvcm1lciBuYW1lPSJwcm94eS1ybmciIGxvZ2dlcj0ibGVueWEuc2l0ZW1hcC50cmFuc2Zvcm1lci5wcm94eSIKLSAgICAgICAgc3JjPSJvcmcuYXBhY2hlLmxlbnlhLmNtcy5jb2Nvb24udHJhbnNmb3JtYXRpb24uUHJveHlUcmFuc2Zvcm1lciI+Ci0gICAgICAgIDx0cmFuc2Zvcm0gbmFtZXNwYWNlPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzEuMCIgZWxlbWVudD0iaW5jbHVkZSIgYXR0cmlidXRlPSJocmVmIi8+Ci0gICAgICA8L21hcDp0cmFuc2Zvcm1lcj4KLSAgICA8L21hcDp0cmFuc2Zvcm1lcnM+Ci0gIDwvbWFwOmNvbXBvbmVudHM+Ci0KLSAgPG1hcDpyZXNvdXJjZXM+Ci0gICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJwcm94eS1jc3MiPgotICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJ0ZXh0IiBzcmM9Int1cmx9LmNzcyIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icGF0dGVybiIgc3JjPSJmYWxsYmFjazovL2xlbnlhL2NoYXBlcm9uL2dyYW1tYXJzL2xpbmsueGxleCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL2NoYXBlcm9uL3N0eWxlc2hlZXRzL3BhdHRlcm4tdG8tbGluay54c2wiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ii8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY2hhcGVyb24vc3R5bGVzaGVldHMvYS10by10eHQueHNsIi8+Ci0gICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ0ZXh0IiBtaW1lLXR5cGU9InRleHQvY3NzIi8+Ci0gICAgPC9tYXA6cmVzb3VyY2U+Ci0gIDwvbWFwOnJlc291cmNlcz4KLSAgCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgIDxtYXA6cGlwZWxpbmUgaW50ZXJuYWwtb25seT0idHJ1ZSI+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKiouKiI+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikocm5nKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICA8L21hcDptYXRjaD4KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgCi0gICAgICA8IS0tIG1hdGNoZXMgbW9kdWxlcy8qLyoqLmNzcyAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qKi5jc3MiPgotICAgICAgICA8IS0tIE9ubHkgY2FsbGVkIGlmIGEgezN9LmNzcyBleGlzdHMgYmVjYXVzZSBvZiByZXNvdXJjZS1leGlzdHMtZW5oYW5jZWQgYmVmb3JlIC0tPgotICAgICAgICA8bWFwOmNhbGwgcmVzb3VyY2U9InByb3h5LWNzcyI+Ci0gICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVybCIgdmFsdWU9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97MX0vcmVzb3VyY2VzL3syfSIvPgotICAgICAgICAgPC9tYXA6Y2FsbD4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIG1hdGNoZXMgbW9kdWxlcy8qLyoqLmpzIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyoqLmpzIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3sxfS9yZXNvdXJjZXMvezJ9LmpzIiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIgLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKioueHNsIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3sxfS9yZXNvdXJjZXMvezJ9LnhzbCIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94c2x0K3htbCIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0gbWF0Y2hlcyBtb2R1bGVzLyovKiouKiAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qKi4qIj4KLSAgICAgICAgCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoaHRtbHxIVE1MfGh0bXxIVE0pJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0idGV4dC9odG1sIi8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPiAKLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKSh4bWwpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0idGV4dC94bWwiLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+ICAgICAgICAKLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShybmcpJCI+Ci0gICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iLz4KLSAgICAgICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9yZXNvdXJjZXMvdHJhbnNsYXRlLXJuZy1pbmNsdWRlcy54c2wiPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHVibGljYXRpb25pZCIgdmFsdWU9IntwYWdlLWVudmVsb3BlOnB1YmxpY2F0aW9uLWlkfSIvPgotICAgICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJwcm94eS1ybmciLz4KLSAgICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoanBnfEpQR3xKcGd8anBlZ3xKcGVnfEpQRUcpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iaW1hZ2UvanBlZyIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKGdpZnxHSUZ8R2lmKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImltYWdlL2dpZiIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikocG5nfFBOR3xQbmcpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iaW1hZ2UvcG5nIiAvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKSh0YXJcLmd6fHRneikkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3suLi8xfS9yZXNvdXJjZXMvey4uLzJ9LnsuLi8zfSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94LWd0YXIiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHBkZnxQREZ8UGRmKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3BkZiI+Ci0gICAgICAgICAgICA8IS0tIFRPRE86IGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9eG1sLWNvY29vbi1kZXYmYW1wO209MTEyNDk2MjU1MjA3NzMzJmFtcDt3PTIgLS0+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJieXRlLXJhbmdlcyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgICAgPC9tYXA6cmVhZD4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoZG9jfERPQ3xEb2N8ZG90fERPVHxEb3QpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vbXN3b3JkIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikocnRmfFJURnxSdGYpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vcnRmIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikodHh0fFRYVHxUeHR8YXNjfEFTQ3xBc2N8YXNjaWl8QVNDSUl8QXNjaWkpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0idGV4dC9wbGFpbiIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHhsc3xYTFN8WGxzfHhsdHxYTFR8WGx0KSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHBwdHxQUFR8UHB0fHBvdHxQT1R8UG90KSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiAvPgotICAgICAgICA8L21hcDptYXRjaD4gIAotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHN3ZnxTV0Z8U3dmKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikodGlmfFRJRnxUaWYpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iaW1hZ2UvdGlmZiIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKGVwc3xFUFN8RXBzKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPiAgCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikobTN1fE0zVXxNM3UpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veC1tcGVndXJsIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoa2FyfEtBUnxLYXJ8bWlkfE1JRHxNaWQpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iYXVkaW8vbWlkaSIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoc21mfFNNRnxTbWYpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5tYXRoIiAvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShtcDN8TVAzfE1wMykkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3suLi8xfS9yZXNvdXJjZXMvey4uLzJ9LnsuLi8zfSIgbWltZS10eXBlPSJhdWRpby9tcGVnIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoc3dhfFNXQXxTd2EpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iYXVkaW8veC1zd2EiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPiAKLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShtcGd8TVBHfE1wZ3xtcHZ8TVBWfE1wdnxtcDR8TVA0fE1wNCkkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3suLi8xfS9yZXNvdXJjZXMvey4uLzJ9LnsuLi8zfSIgbWltZS10eXBlPSJ2aWRlby9tcGVnIiAvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShtb3Z8TU9WfE1vdikkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3suLi8xfS9yZXNvdXJjZXMvey4uLzJ9LnsuLi8zfSIgbWltZS10eXBlPSJ2aWRlby9xdWlja3RpbWUiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKGJpbnxCSU58QmlufGhxeHxIUVh8SHF4KSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MCIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoc2VhfFNFQXxTZWEpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vc2VhIiAvPgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShzaXR8U0lUfFNpdCkkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3suLi8xfS9yZXNvdXJjZXMvey4uLzJ9LnsuLi8zfSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXQiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHppcHxaSVB8WmlwKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL2xlbnlhL21vZHVsZXMvey4uLzF9L3Jlc291cmNlcy97Li4vMn0uey4uLzN9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3ppcCIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikocGN0fFBDVHxQY3R8am14fEpNWHxKbXh8amNsfEpDTHxKY2x8cXp8UVp8UXp8amJjfEpCQ3xKYmN8am10fEpNVHxKbXR8Y2ZnfENGR3xDZmcpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy97Li4vMX0vcmVzb3VyY2VzL3suLi8yfS57Li4vM30iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veC1tcy13b3JkIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIG1hdGNoZXMgcHViLWlkL2FyZWEvKipmYXZpY29uLmljbyAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qKmZhdmljb24uaWNvIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3sxfS9yZXNvdXJjZXMvezJ9ZmF2aWNvbi5pY28iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vaWNvIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLQotICAgIDwvbWFwOnBpcGVsaW5lPgotICA8L21hcDpwaXBlbGluZXM+Ci08L21hcDpzaXRlbWFwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMtc2hhcmVkLnhtYXAgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy1zaGFyZWQueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiNTIxNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy1zaGFyZWQueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08bWFwOnNpdGVtYXAgeG1sbnM6bWFwPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc2l0ZW1hcC8xLjAiPgotICAKLSAgPG1hcDpyZXNvdXJjZXM+Ci0gICAgPG1hcDpyZXNvdXJjZSBuYW1lPSJwcm94eS1jc3MiPgotICAgICAgPG1hcDpnZW5lcmF0ZSB0eXBlPSJ0ZXh0IiBzcmM9Int1cmx9LmNzcyIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icGF0dGVybiIgc3JjPSJmYWxsYmFjazovL2xlbnlhL2NoYXBlcm9uL2dyYW1tYXJzL2xpbmsueGxleCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL2NoYXBlcm9uL3N0eWxlc2hlZXRzL3BhdHRlcm4tdG8tbGluay54c2wiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHR5cGU9InByb3h5Ii8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY2hhcGVyb24vc3R5bGVzaGVldHMvYS10by10eHQueHNsIi8+Ci0gICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ0ZXh0IiBtaW1lLXR5cGU9InRleHQvY3NzIi8+Ci0gICAgPC9tYXA6cmVzb3VyY2U+Ci0gIDwvbWFwOnJlc291cmNlcz4KLSAgCi0gIDxtYXA6cGlwZWxpbmVzPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmU+Ci0gICAgICA8IS0tIGVuYWJsZSBjbGllbnQgc2lkZSBjYWNoaW5nIG9mIHJlc291cmNlcyAtLT4KLSAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImV4cGlyZXMiIHZhbHVlPSJ7Z2xvYmFsOnBpcGVsaW5lLWV4cGlyYXRpb259Ii8+Ci0gICAgICAKLSAgICAgIDwhLS0gTGVueWEgUHVibGljYXRpb25zIC0tPgotICAgICAgCi0gICAgICA8IS0tIG9ubHkgbG9vayBmb3IgaW5oZXJpdGVkIGNzcyBleDogZGVmYXVsdC5jc3MgLT4gQGltcG9ydCB1cmwoZGVmYXVsdC5pbmhlcml0ZWQuY3NzKTsgLS0+Ci0gICAgICA8IS0tIG1hdGNoZXMgcHViLWlkL2FyZWEvY3NzLyouaW5oZXJpdGVkLmNzcyAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qL2Nzcy8qLmluaGVyaXRlZC5jc3MiPgotICAgICAgICAgPG1hcDpjYWxsIHJlc291cmNlPSJwcm94eS1jc3MiPgotICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJ0ZW1wbGF0ZS1mYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvY3NzL3szfSIvPgotICAgICAgICAgPC9tYXA6Y2FsbD4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIG1hdGNoZXMgcHViLWlkL2FyZWEvY3NzLyouY3NzIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovY3NzLyouY3NzIj4KLSAgICAgICAgPG1hcDpjYWxsIHJlc291cmNlPSJwcm94eS1jc3MiPgotICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1cmwiIHZhbHVlPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvY3NzL3szfSIvPgotICAgICAgICAgPC9tYXA6Y2FsbD4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIG1hdGNoZXMgcHViLWlkL2FyZWEvamF2YXNjcmlwdC8qKi5pbmhlcml0ZWQuanMgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKi9qYXZhc2NyaXB0LyoqLmluaGVyaXRlZC5qcyI+Ci0gICAgICAgIDxtYXA6cmVhZCBzcmM9InRlbXBsYXRlLWZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC9qYXZhc2NyaXB0L3szfS5qcyIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiIC8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgICAgPCEtLSBtYXRjaGVzIHB1Yi1pZC9hcmVhL2phdmFzY3JpcHQvKiouanMgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKi9qYXZhc2NyaXB0LyoqLmpzIj4KLSAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvc2hhcmVkL2phdmFzY3JpcHQvezN9LmpzIiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIgLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICA8IS0tIG1hdGNoZXMgcHViLWlkL2FyZWEvKiouKiAtLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qLyoqLioiPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKGpwZ3xKUEd8SnBnfGpwZWd8SnBlZ3xKUEVHKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJpbWFnZS9qcGVnIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoZ2lmfEdJRnxHaWYpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImltYWdlL2dpZiIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikocG5nfFBOR3xQbmcpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImltYWdlL3BuZyIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikodGFyXC5nenx0Z3opJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtZ3RhciIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikocGRmfFBERnxQZGYpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3BkZiI+Ci0gICAgICAgICAgICA8IS0tIFRPRE86IGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9eG1sLWNvY29vbi1kZXYmYW1wO209MTEyNDk2MjU1MjA3NzMzJmFtcDt3PTIgLS0+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJieXRlLXJhbmdlcyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgICAgPC9tYXA6cmVhZD4KLSAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoZG9jfERPQ3xEb2N8ZG90fERPVHxEb3QpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL21zd29yZCIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHJ0ZnxSVEZ8UnRmKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi9ydGYiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPiAKLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKSh0eHR8VFhUfFR4dHxhc2N8QVNDfEFzY3xhc2NpaXxBU0NJSXxBc2NpaSkkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvc2hhcmVkL3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0idGV4dC9wbGFpbiIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHhsc3xYTFN8WGxzfHhsdHxYTFR8WGx0KSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPiAKLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShwcHR8UFBUfFBwdHxwb3R8UE9UfFBvdCkkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvc2hhcmVkL3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPiAgCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoc3dmfFNXRnxTd2YpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikodGlmfFRJRnxUaWYpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImltYWdlL3RpZmYiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPiAKLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShlcHN8RVBTfEVwcykkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvc2hhcmVkL3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vcG9zdHNjcmlwdCIgLz4KLSAgICAgICAgPC9tYXA6bWF0Y2g+ICAKLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShtM3V8TTNVfE0zdSkkIj4gCi0gICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvc2hhcmVkL3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veC1tcGVndXJsIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoa2FyfEtBUnxLYXJ8bWlkfE1JRHxNaWQpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImF1ZGlvL21pZGkiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHNtZnxTTUZ8U21mKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGgiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKG1wM3xNUDN8TXAzKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhdWRpby9tcGVnIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoc3dhfFNXQXxTd2EpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImF1ZGlvL3gtc3dhIiAvPgotICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikobXBnfE1QR3xNcGd8bXB2fE1QVnxNcHZ8bXA0fE1QNHxNcDQpJCI+IAotICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9InZpZGVvL21wZWciIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKG1vdnxNT1Z8TW92KSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJ2aWRlby9xdWlja3RpbWUiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKGJpbnxCSU58QmlufGhxeHxIUVh8SHF4KSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHNlYXxTRUF8U2VhKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi9zZWEiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHNpdHxTSVR8U2l0KSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXQiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHppcHxaSVB8WmlwKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi96aXAiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHBjdHxQQ1R8UGN0fGpteHxKTVh8Sm14fGpjbHxKQ0x8SmNsfHF6fFFafFF6fGpiY3xKQkN8SmJjfGptdHxKTVR8Sm10fGNmZ3xDRkd8Q2ZnKSQiPiAKLSAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9zaGFyZWQvey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94LW1zLXdvcmQiIC8+Ci0gICAgICAgIDwvbWFwOm1hdGNoPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICAgIDwhLS0gbWF0Y2hlcyBwdWItaWQvYXJlYS8qKmZhdmljb24uaWNvIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovKipmYXZpY29uLmljbyI+Ci0gICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3NoYXJlZC9mYXZpY29uLmljbyIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi9pY28iLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gIDwvbWFwOnBpcGVsaW5lcz4KLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy54bWFwIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmNDEzMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy54bWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxtYXA6c2l0ZW1hcCB4bWxuczptYXA9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zaXRlbWFwLzEuMCI+Ci0gIAotICA8bWFwOnJlc291cmNlcz4KLSAgICA8bWFwOnJlc291cmNlIG5hbWU9InByb3h5LWNzcyI+Ci0gICAgICA8bWFwOmdlbmVyYXRlIHR5cGU9InRleHQiIHNyYz0ie3VybH0uY3NzIi8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSB0eXBlPSJwYXR0ZXJuIiBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY2hhcGVyb24vZ3JhbW1hcnMvbGluay54bGV4Ii8+Ci0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImZhbGxiYWNrOi8vbGVueWEvY2hhcGVyb24vc3R5bGVzaGVldHMvcGF0dGVybi10by1saW5rLnhzbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0icHJveHkiLz4KLSAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9jaGFwZXJvbi9zdHlsZXNoZWV0cy9hLXRvLXR4dC54c2wiLz4KLSAgICAgIDxtYXA6c2VyaWFsaXplIHR5cGU9InRleHQiIG1pbWUtdHlwZT0idGV4dC9jc3MiLz4KLSAgICA8L21hcDpyZXNvdXJjZT4KLSAgPC9tYXA6cmVzb3VyY2VzPgotICAKLSAgPG1hcDpwaXBlbGluZXM+Ci0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImV4cGlyZXMiIHZhbHVlPSJ7Z2xvYmFsOnBpcGVsaW5lLWV4cGlyYXRpb259Ii8+Ci0gICAgICAKLSAgICAgIDwhLS0gTGVueWEgUHVibGljYXRpb25zIC0tPiAgICAgIAotICAgICAgICAgIDwhLS0gbWF0Y2hlcyBwdWItaWQvYXJlYS9jc3MvKi5jc3MgLS0+Ci0gICAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovY3NzLyouY3NzIj4KLSAgICAgICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0icHJveHktY3NzIj4KLSAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgIHZhbHVlPSJmYWxsYmFjazovL3Jlc291cmNlcy9jc3MvezN9Ii8+Ci0gICAgICAgICAgICA8L21hcDpjYWxsPgotICAgICAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICAgICAgPCEtLSBtYXRjaGVzIHB1Yi1pZC9hcmVhL2phdmFzY3JpcHQvKiouanMgLS0+Ci0gICAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSIqLyovamF2YXNjcmlwdC8qKi5qcyI+Ci0gICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy9qYXZhc2NyaXB0L3szfS5qcyIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiIC8+Ci0gICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICAgICAgICA8IS0tIG1hdGNoZXMgcHViLWlkL2FyZWEvKiouKiAtLT4KLSAgICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49IiovKi8qKi4qIj4KLSAgICAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShqcGd8SlBHfEpwZ3xqcGVnfEpwZWd8SlBFRykkIj4gCi0gICAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3suLi8yfS97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImltYWdlL2pwZWciIC8+Ci0gICAgICAgICAgIDwvbWFwOm1hdGNoPiAKLSAgICAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShnaWZ8R0lGfEdpZikkIj4gCi0gICAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3suLi8yfS97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImltYWdlL2dpZiIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikocG5nfFBOR3xQbmcpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJpbWFnZS9wbmciIC8+Ci0gICAgICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHRhclwuZ3p8dGd6KSQiPiAKLSAgICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvey4uLzJ9L3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veC1ndGFyIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShwZGZ8UERGfFBkZikkIj4gCi0gICAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3suLi8yfS97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3BkZiI+Ci0gICAgICAgICAgICAgICAgPCEtLSBUT0RPOiBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPXhtbC1jb2Nvb24tZGV2JmFtcDttPTExMjQ5NjI1NTIwNzczMyZhbXA7dz0yIC0tPgotICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImJ5dGUtcmFuZ2VzIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9tYXA6cmVhZD4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoZG9jfERPQ3xEb2N8ZG90fERPVHxEb3QpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi9tc3dvcmQiIC8+Ci0gICAgICAgICAgIDwvbWFwOm1hdGNoPiAKLSAgICAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShydGZ8UlRGfFJ0ZikkIj4gCi0gICAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3suLi8yfS97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3J0ZiIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHR4dHxUWFR8VHh0fGFzY3xBU0N8QXNjfGFzY2lpfEFTQ0lJfEFzY2lpKSQiPiAKLSAgICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvey4uLzJ9L3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0idGV4dC9wbGFpbiIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHhsc3xYTFN8WGxzfHhsdHxYTFR8WGx0KSQiPiAKLSAgICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvey4uLzJ9L3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikocHB0fFBQVHxQcHR8cG90fFBPVHxQb3QpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+ICAKLSAgICAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShzd2Z8U1dGfFN3ZikkIj4gCi0gICAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3suLi8yfS97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikodGlmfFRJRnxUaWYpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJpbWFnZS90aWZmIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoZXBzfEVQU3xFcHMpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0IiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4gIAotICAgICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKG0zdXxNM1V8TTN1KSQiPiAKLSAgICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvey4uLzJ9L3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24veC1tcGVndXJsIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoa2FyfEtBUnxLYXJ8bWlkfE1JRHxNaWQpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhdWRpby9taWRpIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShzbWZ8U01GfFNtZikkIj4gCi0gICAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3suLi8yfS97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aCIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikobXAzfE1QM3xNcDMpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhdWRpby9tcGVnIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4gCi0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoc3dhfFNXQXxTd2EpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhdWRpby94LXN3YSIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+IAotICAgICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKG1wZ3xNUEd8TXBnfG1wdnxNUFZ8TXB2fG1wNHxNUDR8TXA0KSQiPiAKLSAgICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvey4uLzJ9L3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0idmlkZW8vbXBlZyIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikobW92fE1PVnxNb3YpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJ2aWRlby9xdWlja3RpbWUiIC8+Ci0gICAgICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKGJpbnxCSU58QmlufGhxeHxIUVh8SHF4KSQiPiAKLSAgICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvey4uLzJ9L3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShzZWF8U0VBfFNlYSkkIj4gCi0gICAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3suLi8yfS97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3NlYSIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAgICAgIDxtYXA6bWF0Y2ggdHlwZT0icmVnZXhwIiBwYXR0ZXJuPSIoLipcLikoc2l0fFNJVHxTaXQpJCI+IAotICAgICAgICAgICAgICA8bWFwOnJlYWQgc3JjPSJmYWxsYmFjazovL3Jlc291cmNlcy97Li4vMn0vey4uLzN9LnsuLi80fSIgbWltZS10eXBlPSJhcHBsaWNhdGlvbi94LXN0dWZmaXQiIC8+Ci0gICAgICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InJlZ2V4cCIgcGF0dGVybj0iKC4qXC4pKHppcHxaSVB8WmlwKSQiPiAKLSAgICAgICAgICAgICAgPG1hcDpyZWFkIHNyYz0iZmFsbGJhY2s6Ly9yZXNvdXJjZXMvey4uLzJ9L3suLi8zfS57Li4vNH0iIG1pbWUtdHlwZT0iYXBwbGljYXRpb24vemlwIiAvPgotICAgICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdleHAiIHBhdHRlcm49IiguKlwuKShwY3R8UENUfFBjdHxqbXh8Sk1YfEpteHxqY2x8SkNMfEpjbHxxenxRWnxRenxqYmN8SkJDfEpiY3xqbXR8Sk1UfEptdHxjZmd8Q0ZHfENmZykkIj4gCi0gICAgICAgICAgICAgIDxtYXA6cmVhZCBzcmM9ImZhbGxiYWNrOi8vcmVzb3VyY2VzL3suLi8yfS97Li4vM30uey4uLzR9IiBtaW1lLXR5cGU9ImFwcGxpY2F0aW9uL3gtbXMtd29yZCIgLz4KLSAgICAgICAgICAgPC9tYXA6bWF0Y2g+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgPC9tYXA6bWF0Y2g+Ci0KLSAgICA8L21hcDpwaXBlbGluZT4KLSAgPC9tYXA6cGlwZWxpbmVzPgotPC9tYXA6c2l0ZW1hcD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy9hZG1pbi5jc3MgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9jc3MvYWRtaW4uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2FlNzgwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy9hZG1pbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLUBpbXBvcnQgdXJsKGRlZmF1bHQuY3NzKTsKLUBpbXBvcnQgdXJsKG5hdmlnYXRpb24uY3NzKTsKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy9hbnRsb2cuY3NzIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL2FudGxvZy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOWZkMzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL2FudGxvZy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLSAgICAubGVueWEtYW50LWJhbm5lcmNlbGwgewotICAgICAgYm9yZGVyOiAwcHg7Ci0gICAgICBwYWRkaW5nOiAwcHg7Ci0gICAgfQotICAgIAotICAgIHRhYmxlLmxlbnlhLWFudC1zdGF0dXMgewotICAgICAgZm9udDpib2xkIDgwJSBhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6IzUyNUQ3NjsKLSAgICAgIGNvbG9yOiNmZmZmZmY7Ci0gICAgfQotICAgIAotICAgIHRhYmxlLmxlbnlhLWFudC1sb2cgdHIgdGQsCi0gICAgdGFibGUubGVueWEtYW50LWxvZyB0ciB0aCB7Ci0gICAgICBmb250LXNpemU6IDgwJTsKLSAgICB9Ci0gICAgLmxlbnlhLWFudC1lcnJvciB7Ci0gICAgICBjb2xvcjpyZWQ7Ci0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLSAgICB9Ci0gICAgLmxlbnlhLWFudC13YXJuIHsKLSAgICAgIGNvbG9yOm1hcm9vbjsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwotICAgIH0KLSAgICAubGVueWEtYW50LWluZm8gewotICAgICAgY29sb3I6Z3JheTsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwotICAgIH0KLSAgICAubGVueWEtYW50LWRlYnVnewotICAgICAgY29sb3I6Z3JheTsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwotICAgIH0KLSAgICAubGVueWEtYW50LWZhaWxlZCB7Ci0gICAgICBmb250LXNpemU6ODAlOwotICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmVkOwotICAgICAgY29sb3I6I0ZGRkZGRjsKLSAgICAgIGZvbnQtd2VpZ2h0OiBib2xkCi0gICAgfQotICAgIC5sZW55YS1hbnQtY29tcGxldGUgewotICAgICAgZm9udC1zaXplOjgwJTsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6ICM1MjVENzY7Ci0gICAgICBjb2xvcjojRkZGRkZGOwotICAgICAgZm9udC13ZWlnaHQ6IGJvbGQKLSAgICB9Ci0gICAgCi0gICAgLmxlbnlhLWFudC1hIHRkIHsgCi0gICAgICBiYWNrZ3JvdW5kOiAjZWZlZmVmOwotICAgICAgY29sb3I6IGJsYWNrOwotICAgIH0KLSAgICAKLSAgICAubGVueWEtYW50LWIgdGQgeyAKLSAgICAgIGJhY2tncm91bmQ6ICNmZmY7Ci0gICAgICBjb2xvcjogYmxhY2s7Ci0gICAgfQotICAgIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL2JveGVzLmNzcyBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy9ib3hlcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDc3MGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL2JveGVzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0gIGRpdi5sZW55YS1ib3ggewotICBiYWNrZ3JvdW5kOiB1cmwoJy9tb2R1bGVzL3N2Zy90YWItdG9wTGVmdC01LURERENDRi1DQ0NDQ0MucG5nJykgbGVmdCB0b3Agbm8tcmVwZWF0OwotICB3aWR0aDogYXV0bzsKLSAgbWF4LXdpZHRoOiAxMDAlOwotICBmb250LXNpemU6IHNtYWxsOwotICBtYXJnaW4tYm90dG9tOiAxMHB4OwotICB9Ci0gIAotICBkaXYubGVueWEtYm94LXRpdGxlIHsKLSAgYmFja2dyb3VuZDogdXJsKCcvbW9kdWxlcy9zdmcvdGFiLXRvcFJpZ2h0LTUtREREQ0NGLUNDQ0NDQy5wbmcnKSByaWdodCB0b3Agbm8tcmVwZWF0OwotICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI0NDQ0NDQzsKLSAgY29sb3I6IEJsYWNrOwotICBmb250LXdlaWdodDogYm9sZDsKLSAgcGFkZGluZzogMnB4IDEwcHg7Ci0gIHdoaXRlLXNwYWNlOiBub3dyYXA7Ci0gIH0KLSAgCi0gIGRpdi5sZW55YS1ib3gtYm9keSB7Ci0gIH0KLSAgCi0gIGRpdi5sZW55YS1ib3gtY29udGVudCB7Ci0gIHBhZGRpbmc6IDEwcHg7Ci0gIGNvbG9yOiBCbGFjazsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjRFOTsKLSAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCAjQ0NDQ0NDOwotICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCAjQ0NDQ0NDOwotICB9Ci0gIAotICBkaXYubGVueWEtYm94LWJvdHRvbSB7Ci0gIGJhY2tncm91bmQ6IHVybCgnL21vZHVsZXMvc3ZnL3RhYi1ib3R0b21MZWZ0LTUtRjVGNEU5LUNDQ0NDQy5wbmcnKSBsZWZ0IGJvdHRvbSBuby1yZXBlYXQ7Ci0gIH0KLSAgCi0gIGRpdi5sZW55YS1ib3gtYm90dG9tLWNvbnRlbnQgewotICBiYWNrZ3JvdW5kOiB1cmwoJy9tb2R1bGVzL3N2Zy90YWItYm90dG9tUmlnaHQtNS1GNUY0RTktQ0NDQ0NDLnBuZycpIHJpZ2h0IGJvdHRvbSBuby1yZXBlYXQ7Ci0gIGhlaWdodDogNXB4OwotICB9Ci0gIAotICBzcGFuLnN3aXRjaCB7Ci0gIHdpZHRoOiAyZW07Ci0gIGN1cnNvcjogcG9pbnRlcjsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjRFOTsKLSAgYm9yZGVyOiBzb2xpZCAxcHggI0NDQ0NDQzsKLSAgY29sb3I6IEJsYWNrOwotICB9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9jc3MvZGVmYXVsdC5jc3MgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9jc3MvZGVmYXVsdC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTA3ZjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL2RlZmF1bHQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotQGltcG9ydCB1cmwoYW50bG9nLmNzcyk7Ci1AaW1wb3J0IHVybChmb3Jtcy5jc3MpOwotQGltcG9ydCB1cmwodGFibGVzLmNzcyk7Ci1AaW1wb3J0IHVybChtZW51LmNzcyk7Ci1AaW1wb3J0IHVybCh0YWJzLmNzcyk7Ci1AaW1wb3J0IHVybChib3hlcy5jc3MpOwotICAKLWJvZHkgewotICAgIG1hcmdpbjogMHB4OwotICAgIHBhZGRpbmc6IDBweDsKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsKLX0KLQotaDEgewotICAgIGZvbnQtc2l6ZTogMTUwJTsKLSAgICBwYWRkaW5nOiAwcHg7Ci0gICAgbWFyZ2luOiAwcHg7Ci19Ci0KLWgyIHsgZm9udC1zaXplOiAxMjAlOyB9Ci1oMyB7IGZvbnQtc2l6ZTogMTEwJTsgfQotaDQgeyBmb250LXNpemU6IDEwMCU7IH0KLWg1IHsgZm9udC1zaXplOiA5MCU7IH0KLWg2IHsgZm9udC1zaXplOiA4MCU7IH0KLQotcCB7Ci0gICAgZm9udC1zaXplOiBzbWFsbDsKLX0KLQotbGkgewotICAgIGZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLWNvZGUsIHNvdXJjZSB7Ci0gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLSAgICBmb250LXNpemU6IDEwMCU7Ci19Ci0KLXNvdXJjZSB7Ci0gICAgcGFkZGluZzogMWVtOwotICAgIGJhY2tncm91bmQtY29sb3I6ICNGNUY0RTk7Ci0gICAgY29sb3I6IGJsYWNrOwotfQotCi1oMSBjb2RlLCBoMiBjb2RlLCBoMyBjb2RlLCBoNCBjb2RlIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDEzMCU7IC8qIGhhY2shIHRoZSAiZm9udC1zaXplOnNtYWxsIiBpbiB0aGUgb3RoZXIgZWxlbWVudHMgbmVlZHMgdG8gZ28uICovCi19Ci0KLS5sZW55YS1oZWFkZXIgewotICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207Ci0gICAgcGFkZGluZy1sZWZ0OiAzMHB4OwotICAgIGJhY2tncm91bmQtY29sb3I6IFdoaXRlOwotICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjQjFCMUIxOwotICAgIGNvbG9yOiBibGFjazsKLX0KLQotLmxlbnlhLWJvZHkgewotICAgIHdpZHRoOiAxMDAlOwotICAgIGhlaWdodDogMTAwJTsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNEU5OwotICAgIGNvbG9yOiBibGFjazsKLX0KLQotLmxlbnlhLXByb2plY3QtbG9nbyB7Ci0gICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKLSAgICB0ZXh0LWFsaWduOiByaWdodDsKLSAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI0IxQjFCMTsKLX0KLQotdGQubGVueWEtY29udGVudCB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogV2hpdGU7Ci0gICAgcGFkZGluZzogMzBweDsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIGNvbG9yOiBibGFjazsKLX0KLQotdGQubGVueWEtc2lkZWJhciB7Ci0gICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggI0IxQjFCMTsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIHdpZHRoOiAyMCU7Ci19Ci0KLXRkLmxlbnlhLWZyb250cGFnZSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogV2hpdGU7Ci0gICAgcGFkZGluZzogMzBweDsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIGNvbG9yOiBibGFjazsKLX0KLQotLmxlbnlhLXBhZ2UtdGl0bGUgewotICAgIGZvbnQtc2l6ZTogMTMwJTsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2LmxlbnlhLWVycm9yIHsKLSAgICBwYWRkaW5nOiA1cHg7Ci0gICAgbWFyZ2luOiA1cHggMHB4OwotICAgIGJhY2tncm91bmQtY29sb3I6ICNGRjk5OTk7Ci19Ci0KLS5sZW55YS1wYWdlLXN1YnRpdGxlIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTVGNUY4OwotICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjQjFCMUIxOwotICAgIGZvbnQtc2l6ZTogNzAlOwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIHRleHQtYWxpZ246IHJpZ2h0OwotICAgIHBhZGRpbmc6IDVweDsKLSAgICBjb2xvcjogYmxhY2s7Ci19Ci0KLS5sZW55YS1wdWJsaWNhdGlvbi1pdGVtLCAubGVueWEtcHVibGljYXRpb24taXRlbS1jcmVhdGVwdWJsaWNhdGlvbiB7Ci0gICAgcGFkZGluZzogMHB4IDEwcHg7Ci0gICAgbWFyZ2luOiAyMHB4IDBweDsKLX0KLQotLmxlbnlhLXB1YmxpY2F0aW9uLWl0ZW0gewotICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjREREQ0NGOwotfQotCi0ubGVueWEtcHVibGljYXRpb24taXRlbS1jcmVhdGVwdWJsaWNhdGlvbiB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMmVtOwotfQotCi0ubGVueWEtc2lkZWJhciBhIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5sZW55YS1zaWRlYmFyIHVsIHsKLSAgICBtYXJnaW46IDEwcHggMHB4OwotICAgIHBhZGRpbmc6IDEwcHggMHB4IDEwcHggMjBweDsKLSAgICBsaXN0LXN0eWxlOiBub25lOwotfQotCi0ubGVueWEtc2lkZWJhciBsaSB7Ci0gICAgcGFkZGluZzogMHB4OwotICAgIG1hcmdpbjogM3B4IDBweDsKLSAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI0RERENDRjsKLX0KLQotLmxlbnlhLXNpZGViYXItaGVhZGluZyB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNTAlOwotICAgIGNvbG9yOiBXaGl0ZTsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREREQ0NGOwotICAgIHBhZGRpbmc6IDBweCAxMHB4IDVweCAxMHB4OwotfQotCi0ubGVueWEtYWRtaW4tcmVxdWlyZWQgewotCWNvbG9yOiBSZWQ7Ci19Ci0ubGVueWEtbm8tYm9yZGVyewotICBib3JkZXI6IG5vbmU7Ci19Ci0KLWEuc29ydEFycm93IHsKLSAgY29sb3I6IGJsYWNrOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIGZvbnQtc2l6ZTogOHB0OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy9mb3Jtcy5jc3MgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9jc3MvZm9ybXMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwYWUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy9mb3Jtcy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotZm9ybSB7Ci0JbWFyZ2luOiAwcHg7Ci0JcGFkZGluZzogMHB4OwotfQotCi10ZC5sZW55YS1lbnRyeS1jYXB0aW9uIHsKLQl0ZXh0LWFsaWduOiByaWdodDsKLQljb2xvcjogIzYwNjA2MDsKLQliYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLX0KLQotdGQubGVueWEtZW50cnktY2FwdGlvbiBoMnsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgZm9udC1zaXplOiBtZWRpdW07Ci19Ci0KLS5sZW55YS1mb3JtLWVsZW1lbnQgewotICAgIHdpZHRoOiAzMDBweDsKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsKLX0KLQotLmxlbnlhLWZvcm0tZWxlbWVudC1uYXJyb3cgewotICAgIHdpZHRoOiAxNTBweDsKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsKLX0KLQotLmxlbnlhLWZvcm0tZWxlbWVudC12ZXJ5bmFycm93IHsKLSAgICB3aWR0aDogMTAwcHg7Ci0gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7Ci19Ci0KLS5sZW55YS1mb3JtLW1lc3NhZ2UtZXJyb3IgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGNvbG9yOiByZWQ7Ci0JYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci19Ci0KLS5sZW55YS1mb3JtLW1lc3NhZ2Utc3VjY2VzcyB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgY29sb3I6IG5hdnk7Ci0JYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci19Ci0KLXRleHRhcmVhIHsKLSAgICBmb250LXNpemU6IHNtYWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy9pZTZoYWNrc29ubHkuY3NzIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL2llNmhhY2tzb25seS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMWMyNTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL2llNmhhY2tzb25seS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLyogaW50ZXJuZXQgZXhwbG9yZXIgNiBoYWNrcwotICAgdGhlIGhhY2tzIHdvcmsgYXJvdW5kIHRoZSBxdWlya3MgbW9kZQotICAgaXQgaXMgaW4gZWZmZWN0IGJlY2F1c2UgaWUgNiBtaXNpbnRlcnByZXRzIAotICAgdGhlIHhtbCBkZWNsYXJhdGlvbiAqLwotICAgCi0vKiBmb250IHNpemUgZml4ZXMgKi8gICAKLSNsZW55YS1pbmZvLXRyZWVjYW52YXMgc3BhbiB7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLX0KLQotLmxlbnlhLXRhYnMsCi0ubGVueWEtdGFibGluaywKLS5sZW55YS10YWJsaW5rLWFjdGl2ZSwKLS5sZW55YS10YWIsIAotLmxlbnlhLXRhYi1zaXRldHJlZSwKLXRhYmxlLmxlbnlhLXRhYmxlLW5vYm9yZGVyIHRkLCAKLXRhYmxlLmxlbnlhLXRhYmxlLW5vYm9yZGVyIHRoLAotdGFibGUubGVueWEtdGFibGUtbGlzdCB0aCwgCi10YWJsZS5sZW55YS10YWJsZS1saXN0IHRkLCAKLXRhYmxlLmxlbnlhLXRhYmxlLWxpc3Qtbm9ib3JkZXIgdGgsIAotdGFibGUubGVueWEtdGFibGUtbGlzdC1ub2JvcmRlciB0ZCwKLWRpdi5sZW55YS1ib3gsCi1wLAotLmxlbnlhLWJvZHkgcCwKLWxpIHsKLSAgZm9udC1zaXplOiB4LXNtYWxsOwotfQotCi0ubGVueWEtdGFiIGgxLCAKLS5sZW55YS10YWItc2l0ZXRyZWUgaDEgewotICBmb250LXNpemU6IHNtYWxsOwotfQotCi0vKiBoYWNrcyBmb3IgdGhlIGJyb2tlbiBib3ggbW9kZWwgKi8KLSNjb250ZW50YmxvY2sxLmxlbnlhLXRhYiB7Ci0gIG1hcmdpbi1sZWZ0OiAxNjBweDsKLX0KLQotLmxlbnlhLXRhYnMgewotICB3aWR0aDogMTYwcHg7Ci19Ci0KLS8qIGZpeCBmb3Igc29tZSBtYWxwb3NpdGlvbmVkIHN2ZyByb3VuZGVkIGNvcm5lcnMgKGJvdHRvbSByaWdodCkgKi8KLWRpdi5sZW55YS1ib3gtYm90dG9tIHsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotICByaWdodDogMnB4OwotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggYm90dG9tOwotfQotCi0jY29udGVudGJsb2NrMSBkaXYubGVueWEtYm94LWJvdHRvbSB7Ci0gIHJpZ2h0OiAwOwotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGJvdHRvbTsgCi19Ci0KLS8qIGllIDYgZG9lcyBub3QgdW5kZXJzdGFuZCBtaW4td2lkdGgsIHRoaXMgaXMgYSB3b3JrYXJvdW5kIAotICAgc29ycnkgZm9yIG5vdCBiZWVpbmcgc3RhbmRhcmRzIGNvbXBsaWFudCBoZXJlIAotICAgcG9zc2libHkgdGhpcyBoYWNrIG5lZWRzIHRoZSBxdWlya3MgbW9kZSAqLwotLmxlbnlhLXRhYiwgLmxlbnlhLXRhYi1zaXRldHJlZSB7Ci0gIGhlaWdodDogZXhwcmVzc2lvbihib2R5Lm9mZnNldEhlaWdodD4xMDA/JzQwMCc6J2F1dG8nKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9jc3MvbWVudS5jc3MgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9jc3MvbWVudS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWE5MDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL21lbnUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1ib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB9Ci0KLSNsZW55YS1tZW51cyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB6LWluZGV4OiAyOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiA1N3B4OyBiYWNrZ3JvdW5kOiB1cmwoL2xlbnlhL21lbnUvaW1hZ2VzL21lbnUtYmFja2dyb3VuZC5naWYpIDAgMCByZXBlYXQteDsgfQotCi0jbGVueWEtbG9nbyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMzsgd2lkdGg6IDkwcHg7IGhlaWdodDogMjVweDsgdG9wOiAzMXB4OyBsZWZ0OiAxMDAlOyBtYXJnaW4tbGVmdDogLTkwcHg7IH0KLQotI2xlbnlhLWNtc2JvZHkgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyB0b3A6IDU3cHg7IGxlZnQ6IDBweDsgei1pbmRleDogMTsgfQotCi0jbGVueWEtYXJlYXMgeyBmbG9hdDogbGVmdDsgaGVpZ2h0OiAyNXB4OyBtYXJnaW46IDVweCAwIDAgMTBweDsgfQotCi0jbGVueWEtaW5mbyB7IGZsb2F0OiByaWdodDsgaGVpZ2h0OiAyMHB4OyBtYXJnaW46IDlweCAxMHB4IDAgMDsgZm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBsaW5lLWhlaWdodDogMTsgfQotCi0jbGVueWEtb3B0aW9ucyB7IHBhZGRpbmc6IDlweCAwIDAgMjdweDsgY2xlYXI6IGJvdGg7IGhlaWdodDogMzFweDsgZm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBsaW5lLWhlaWdodDogMTsgfQotCi0jbGVueWEtb3B0aW9ucyB1bCB7IGxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQotCi0jbGVueWEtb3B0aW9ucyB1bCBsaSB7IGZsb2F0OiBsZWZ0OyB3aWR0aDogODVweDsgfQotCi0jbGVueWEtb3B0aW9ucyB1bCBsaSwgI2xlbnlhLW9wdGlvbnMgdWwgbGkgYSB7IGRpc3BsYXk6IGJsb2NrOyBjb2xvcjogIzMzMzsgZm9udC1zaXplOiAxMnB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkOyBjdXJzb3I6IHBvaW50ZXI7IH0KLQotI2xlbnlhLW9wdGlvbnMgdWwgbGkgdWwgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTJlbTsgdG9wOiA1NnB4OyBib3JkZXI6IDFweCBzb2xpZCAjYzZjNmM1OyBiYWNrZ3JvdW5kOiAjZjFmMWYxOyBwYWRkaW5nOiA3cHg7IHZpc2liaWxpdHk6IGhpZGRlbjsgfQotCi0jbGVueWEtb3B0aW9ucyB1bCBsaSB1bCNtZW51MSB7IGxlZnQ6IDIwcHg7IH0KLQotI2xlbnlhLW9wdGlvbnMgdWwgbGkgdWwjbWVudTIgeyBsZWZ0OiAxMDVweDsgfQotCi0jbGVueWEtb3B0aW9ucyB1bCBsaSB1bCNtZW51MyB7IGxlZnQ6IDE5MHB4OyB9Ci0KLSNsZW55YS1vcHRpb25zIHVsIGxpIHVsI21lbnU0IHsgbGVmdDogMjc1cHg7IH0KLQotI2xlbnlhLW9wdGlvbnMgdWwgbGkgdWwjbWVudTUgeyBsZWZ0OiAzNjBweDsgfQotCi0jbGVueWEtb3B0aW9ucyB1bCBsaSB1bCNtZW51NiB7IGxlZnQ6IDQ0NXB4OyB9Ci0KLSNsZW55YS1vcHRpb25zIHVsIGxpIHVsIGxpIHsgd2lkdGg6IDEyZW07IH0KLQotI2xlbnlhLW9wdGlvbnMgdWwgbGkgdWwgbGkubGVueWEtbWVudS1zZXBhcmF0b3IgeyBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNjNmM1YzU7IG1hcmdpbjogNHB4IDA7IGZvbnQtc2l6ZTogMXB4OyBoZWlnaHQ6IDJweDsgd2lkdGg6IDk1JTsgfQotCi0jbGVueWEtb3B0aW9ucyB1bCBsaSB1bCBsaSB7IHBhZGRpbmc6IDA7IH0KLQotI2xlbnlhLW9wdGlvbnMgdWwgbGkgdWwgbGkuZGlzYWJsZWQgeyBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiAjOTk5OyBjdXJzb3I6IGRlZmF1bHQ7IH0KLSNsZW55YS1vcHRpb25zIGxpLmRpc2FibGVkIGEgeyBjb2xvcjogIzk5OTsgY3Vyc29yOiBkZWZhdWx0OyB9Ci0gIAotI2xlbnlhLW9wdGlvbnMgdWwgbGkuZGlzYWJsZWQgeyBjdXJzb3I6IGRlZmF1bHQ7IGNvbG9yOiAjOTk5OyB9Ci0KLSNsZW55YS1vcHRpb25zIHVsIGxpIHVsIGxpIGEgewotICBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHBhZGRpbmc6IDJweCAwIDJweCAycHg7IG1hcmdpbi1sZWZ0OiAxMXB4OwotfQotI2xlbnlhLW9wdGlvbnMgdWwgbGkgdWwgbGkgYSBpbWcgeyBib3JkZXI6IG5vbmU7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0KLQotI2xlbnlhLW9wdGlvbnMgdWwgbGkgdWwgbGkgYTpob3ZlciB7IGJhY2tncm91bmQ6ICNmZmY7IH0KLQotI2luZm8tbWVzc2FnZXMgYSB7ICBjb2xvcjogI2ZmZjsgfQotCi0jaW5mby1tZXNzYWdlcyBhOnZpc2l0ZWQgeyAgY29sb3I6ICNmZmY7IH0KLQotI2xlbnlhLWFyZWFzIHVsIHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB9Ci0KLSNsZW55YS1hcmVhcyB1bCBsaSB7IGxpc3Qtc3R5bGU6IG5vbmU7IGZsb2F0OiBsZWZ0OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiAwIDFweCAwIDA7IH0KLQotI2xlbnlhLWFyZWFzIHVsIGxpIGEgeyBjb2xvcjogIzQ1NDY0NjsgZGlzcGxheTogYmxvY2s7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA5cHggOXB4IDAgOXB4OyBoZWlnaHQ6IDE2cHggIWltcG9ydGFudDsgaGVpZ2h0IC8qKi86IDI1cHg7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQotCi0jbGVueWEtYXJlYXMgdWwgbGkgYSBzcGFuIHsgZm9udDogYm9sZCAxMHB4LzEuMCBBcmlhbCwgVmVyZGFuYSwgc2Fucy1zZXJpZjsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgdmVydGljYWwtYWxpZ246IHRvcDsgfQotCi0jbGVueWEtYXJlYXMgdWwgbGkuYXJlYS1hY3RpdmUgYSB7IGNvbG9yOiAjMzk3NWIzOyBiYWNrZ3JvdW5kOiB1cmwoL2xlbnlhL21lbnUvaW1hZ2VzL2FjdGl2ZS5naWYpIDAgMCByZXBlYXQteDsgfQotCi0jbGVueWEtYXJlYXMgdWwgbGkuYXJlYS1pbmFjdGl2ZSBhIHsgYmFja2dyb3VuZDogdXJsKC9sZW55YS9tZW51L2ltYWdlcy9pbmFjdGl2ZS5naWYpIDAgMCByZXBlYXQteDsgfQotCi0jbGVueWEtYXJlYXMgdWwgbGkuYXJlYS1pbmFjdGl2ZSBhOmhvdmVyIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjVweDsgfQotCi0jbGVueWEtaW5mbyB1bCB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQotCi0jbGVueWEtaW5mbyB1bCBsaSB7IGxpc3Qtc3R5bGU6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBmbG9hdDogbGVmdDsgZm9udC1zaXplOiAxMXB4OyBjb2xvcjogI2ZmZjsgcGFkZGluZzogMCA1cHg7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNmZmY7IH0KLQotI2xlbnlhLWluZm8gdWwgbGkjaW5mby10aW1lIHsgYm9yZGVyOiAwOyB9Ci0KLSNwYWdlIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfQotCi0jbGVueWFNZW51UGxhY2Vob2xkZXIgewotICAgIGJhY2tncm91bmQ6IHVybCgnL21vZHVsZXMvbWVudWJhci9pbWFnZXMvaW5kaWNhdG9yLmdpZicpIDIwcHggMjBweCBuby1yZXBlYXQ7Ci0gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjNmM2YzU7Ci0gICAgaGVpZ2h0OiA1N3B4OwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL25hdmlnYXRpb24uY3NzIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL25hdmlnYXRpb24uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI2MDNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy9uYXZpZ2F0aW9uLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vKiBtZW51ICovCi0KLSNtZW51IHsKLQltYXJnaW46IDIwcHggMHB4OwotfQotCi0jbWVudSBhIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSNtZW51IGE6aG92ZXIgewotICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0jbWVudSAubWVudWJsb2NrLTEgewotICAgIHBhZGRpbmc6IDVweCAwcHggNXB4IDIwcHg7Ci0gICAgbGlzdC1zdHlsZTogbm9uZTsKLX0KLQotI21lbnUgLm1lbnVibG9jay1zZWxlY3RlZC0xIHsKLSAgICBwYWRkaW5nOiA1cHggMHB4IDVweCAyMHB4OwotICAgIGxpc3Qtc3R5bGU6IG5vbmU7Ci19Ci0KLSNtZW51IC5tZW51YmxvY2stMSBhIHsgY29sb3I6ICM5MDkwOTA7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O30KLSNtZW51IC5tZW51YmxvY2stMSBhOnZpc2l0ZWQgeyB9Ci0KLSNtZW51IC5tZW51YmxvY2stMSAubWVudWJsb2NrLTIgeyBkaXNwbGF5OiBub25lOyB9Ci0KLSNtZW51IC5tZW51YmxvY2stc2VsZWN0ZWQtMSAubWVudWl0ZW0tMSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0KLSNtZW51IC5tZW51aXRlbS0xIHsKLSAgICBwYWRkaW5nOiAwcHg7Ci0gICAgbWFyZ2luOiAzcHggMHB4OwotICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjREREQ0NGOwotfQotCi0jbWVudSAubWVudWl0ZW0tMiB7IHBhZGRpbmctbGVmdDogMjBweDsgcGFkZGluZy10b3A6IDJweDsgcGFkZGluZy1ib3R0b206IDJweDsgZm9udC1zaXplOiA3MCU7IH0KLSNtZW51IC5tZW51aXRlbS0yIGEgeyBjb2xvcjogIzkwOTBDMDsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7fQotI21lbnUgLm1lbnVpdGVtLTMgeyBwYWRkaW5nLWxlZnQ6IDMwcHg7IHBhZGRpbmctcmlnaHQ6IC41ZW07IHBhZGRpbmctdG9wOiAuMmVtOyBwYWRkaW5nLWJvdHRvbTogLjJlbTsgZm9udC1zaXplOiA2MCU7IH0KLQotI21lbnUgLm1lbnVpdGVtLXNlbGVjdGVkLTEgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgIHBhZGRpbmc6IDBweDsKLSAgICBtYXJnaW46IDNweCAwcHg7Ci0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNERERDQ0Y7Ci19Ci0KLSNtZW51IC5tZW51aXRlbS1zZWxlY3RlZC0yIHsgcGFkZGluZy1sZWZ0OiAyMHB4OyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b206IDJweDsgZm9udC1zaXplOiA3MCU7IH0KLSNtZW51IC5tZW51aXRlbS1zZWxlY3RlZC0zIHsgcGFkZGluZy1sZWZ0OiAzMHB4OyBmb250LXNpemU6IDYwJTsgcGFkZGluZy1yaWdodDogLjVlbTsgcGFkZGluZy10b3A6IC4yZW07IHBhZGRpbmctYm90dG9tOiAuMmVtOyB9Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy90YWJsZXMuY3NzIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL3RhYmxlcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzRlNmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL3RhYmxlcy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0qIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0qIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0qICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0qIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXRhYmxlLmxlbnlhLXRhYmxlIHsKLQljb2xvcjogQmxhY2s7Ci0JYmFja2dyb3VuZC1jb2xvcjogV2hpdGU7Ci0JYm9yZGVyLXNwYWNpbmc6IDBweDsKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotfQotCi10YWJsZS5sZW55YS10YWJsZS1ub2JvcmRlciB7Ci0JYm9yZGVyOiAwcHg7Ci0JYm9yZGVyLXNwYWNpbmc6IDBweDsKLX0KLQotdGFibGUubGVueWEtdGFibGUgdGggewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjREREQ0NGOwotCWJvcmRlcjogc29saWQgMXB4ICNDQ0NDQ0M7Ci0JY29sb3I6IEJsYWNrOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmc6IDNweCAxMHB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci0JdmVydGljYWwtYWxpZ246IHRvcDsKLQlmb250LXNpemU6IHNtYWxsOwotfQotCi10YWJsZS5sZW55YS10YWJsZSB0ZCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGNUY0RTk7Ci0JYm9yZGVyOiBzb2xpZCAxcHggI0NDQ0NDQzsKLQlwYWRkaW5nOiAzcHggMTBweDsKLQlmb250LXNpemU6IHNtYWxsOwotCWNvbG9yOiBCbGFjazsKLX0KLQotdGFibGUubGVueWEtdGFibGUtbm9ib3JkZXIgdGQsIHRhYmxlLmxlbnlhLXRhYmxlLW5vYm9yZGVyIHRoIHsKLQlib3JkZXI6IDBweDsKLQlwYWRkaW5nOiAzcHggMTBweDsKLQlmb250LXNpemU6IHNtYWxsOwotfQotCi10YWJsZS5sZW55YS10YWJsZS1ub2JvcmRlciB0aCB7Ci0gIHZlcnRpY2FsLWFsaWduOiB0b3A7Ci0gIHRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLXRhYmxlLmxlbnlhLXRhYmxlLW5vYm9yZGVyLW5vcGFkZGluZyB0ZCB7Ci0JYm9yZGVyOiAwcHg7Ci0JcGFkZGluZzogMHB4OwotCWZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLXRhYmxlLmxlbnlhLXRhYmxlLW5vYm9yZGVyLW5vcGFkZGluZyB0aCB7Ci0JZm9udC1zaXplOiBzbWFsbDsKLX0KLQotdGFibGUubGVueWEtdGFibGUtbGlzdCB7Ci0gIGJvcmRlcjogMnB4IHNvbGlkICNDQ0NDQ0M7Ci0JYm9yZGVyLXNwYWNpbmc6IDBweDsKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotfQotCi10YWJsZS5sZW55YS10YWJsZS1saXN0IHRoLAotdGFibGUubGVueWEtdGFibGUtbGlzdCB0ZCwKLXRhYmxlLmxlbnlhLXRhYmxlLWxpc3Qtbm9ib3JkZXIgdGgsCi10YWJsZS5sZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIHRkIHsKLSAgdGV4dC1hbGlnbjogbGVmdDsKLSAgdmVydGljYWwtYWxpZ246IHRvcDsKLSAgcGFkZGluZzogMnB4IDJlbSAycHggNXB4OwotICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI0NDQ0NDQzsKLQlmb250LXNpemU6IHNtYWxsOwotfQotCi10YWJsZS5sZW55YS10YWJsZS1saXN0IHRoIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0RERENDRjsKLSAgY29sb3I6IEJsYWNrOwotfQotCi10YWJsZS5sZW55YS10YWJsZS1saXN0IHRyLmhpZ2hsaWdodCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNERERDQ0Y7Ci0gIGNvbG9yOiBCbGFjazsKLX0KLQotdGFibGUubGVueWEtdGFibGUtbGlzdCBhLAotdGFibGUubGVueWEtdGFibGUtbGlzdC1ub2JvcmRlciBhIHsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi10YWJsZS5sZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIHsKLQlib3JkZXItc3BhY2luZzogMHB4OwotCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci19Ci0KLXRhYmxlLmxlbnlhLXRhYmxlLWxpc3Qtbm9ib3JkZXIgdGggewotICBmb250LXdlaWdodDogbm9ybWFsOwotICBjb2xvcjogIzk5OTk5OTsKLX0KLQotdGFibGUubGVueWEtdGFibGUtbGlzdC1ub2JvcmRlciB0ZCB7Ci0gIGJvcmRlci1ib3R0b206IG5vbmU7Ci19Ci0KLXRhYmxlLmxlbnlhLXRhYmxlLWxpc3Qtbm9ib3JkZXIgdGQuYm9yZGVyIHsKLSAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNDQ0NDQ0M7Ci19Ci0KLXRhYmxlLmxlbnlhLXRhYmxlLWxpc3Qtbm9ib3JkZXIgdGgsCi10YWJsZS5sZW55YS10YWJsZS1saXN0LW5vYm9yZGVyIHRkIHsKLSAgcGFkZGluZy1sZWZ0OiAwcHg7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL3RhYnMuY3NzIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL3RhYnMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDI5Njk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy90YWJzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS8qIFN0eWxlcyBmb3IgdGFicyBpbiBTaXRlIC8gTWV0YSBBcmVhICovCi0KLS5sZW55YS10YWIsIC5sZW55YS10YWItc2l0ZXRyZWUgewotICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiBzbWFsbDsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjRFOTsgCi0gIGNvbG9yOiBibGFjazsKLSAgYm9yZGVyOiBzb2xpZCAxcHggI0NDQ0NDQzsKLSAgdmVydGljYWwtYWxpZ246IHRvcDsKLSAgcGFkZGluZzogMCAyMHB4IDIwcHggMjBweDsKLSAgd2lkdGg6IGluaGVyaXQ7Ci0gIG1pbi1oZWlnaHQ6IDQwMHB4OwotfQotCi0ubGVueWEtdGFiIGgxLCAubGVueWEtdGFiLXNpdGV0cmVlIGgxIHsKLSAgZm9udC1zaXplOiBtZWRpdW07Ci0gIG1hcmdpbi1ib3R0b206IDEwcHg7Ci0gIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjQ0NDQ0NDOwotICBwYWRkaW5nOiAxMHB4IDBweCA1cHggMHB4OwotfQotCi0ubGVueWEtdGFiIGgyLCAubGVueWEtdGFiLXNpdGV0cmVlIGgyIHsKLSAgZm9udC1zaXplOiBtZWRpdW07Ci19Ci0gIAotI2NvbnRlbnRibG9jazEubGVueWEtdGFiLXNpdGV0cmVlIHsKLSAgcG9zaXRpb246IGFic29sdXRlOwotICBsZWZ0OiAzMHB4OwotICBtYXJnaW4tbGVmdDogNDEwcHg7IAotfQotICAKLSNjb250ZW50YmxvY2sxLmxlbnlhLXRhYiB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgbGVmdDogMzBweDsKLSAgbWFyZ2luLWxlZnQ6IDE0MHB4OyAKLX0KLQotI2NvbnRlbnRibG9jazEgLmxlbnlhLWJveCB7Ci0gIGRpc3BsYXk6IHJlbGF0aXZlOwotfQotCi0ubGVueWEtdGFicyB7Ci0gIGZsb2F0OiBsZWZ0OwotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICB3aWR0aDogMTQwcHg7Ci19Ci0KLSNsZW55YS1pbmZvLXRyZWVjYW52YXMgLmxlbnlhLXRhYnMgewotICB3aWR0aDogMjAwcHg7IAotfQotCi0jbGVueWEtaW5mby10cmVlY2FudmFzIC5sZW55YS10YWJsaW5rLAotI2xlbnlhLWluZm8tdHJlZWNhbnZhcyAubGVueWEtdGFibGluay1hY3RpdmUgewotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGxlZnQ6IDBweDsKLSAgdG9wOiAxcHg7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW46IDBlbSAuNWVtIDBlbSAwZW07Ci0gIHBhZGRpbmc6IDBlbSAuNWVtOwotICBib3JkZXI6IHNvbGlkIDFweCAjQ0NDQ0NDOwotfQotCi0jbGVueWEtaW5mby10cmVlY2FudmFzIC5sZW55YS10YWJsaW5rIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0RERENDRjsKLX0KLQotI2xlbnlhLWluZm8tdHJlZWNhbnZhcyAubGVueWEtdGFibGluazpob3ZlciB7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotI2xlbnlhLWluZm8tdHJlZWNhbnZhcyAubGVueWEtdGFibGluay1hY3RpdmUgewotICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI0Y1RjRFOTsKLX0KLQotLmxlbnlhLXRhYmxpbmssIC5sZW55YS10YWJsaW5rLWFjdGl2ZSB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgbGVmdDogMXB4OwotICBmb250LXNpemU6IHNtYWxsOwotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luLWJvdHRvbTogLjJlbTsKLSAgcGFkZGluZzogLjJlbSAxZW0gLjJlbSAuM2VtOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIGJvcmRlcjogc29saWQgMXB4ICNDQ0NDQ0M7Ci0gIGJvcmRlci1yaWdodDogbm9uZTsKLX0KLQotLmxlbnlhLXRhYmxpbmsgewotICBjb2xvcjogIzY2NjY2NjsKLSAgYm9yZGVyOiBzb2xpZCAxcHggd2hpdGU7IAotICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCAjQ0NDQ0NDOwotICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLX0KLQotLmxlbnlhLXRhYmxpbms6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmxlbnlhLXRhYmxpbmstYWN0aXZlIHsKLSAgY29sb3I6IGJsYWNrOwotICBmb250LXdlaWdodDogbm9ybWFsOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNEU5OyAKLSAgei1pbmRleDogMTsKLX0KLQotI2xlbnlhLWluZm8tYm9keSB7Ci0gIHBhZGRpbmc6IDIwcHg7Ci19Ci0KLSNsZW55YS1pbmZvLXRyZWVjYW52YXMgewotICBmb250LXNpemU6IDExcHg7Ci0gIGZsb2F0OiBsZWZ0OwotICBwYWRkaW5nLXJpZ2h0OiAyMHB4OwotICB3aWR0aDogMjUwcHg7Ci19Ci0gIAotI2xlbnlhLWluZm8tdHJlZSB7Ci0gIGNsZWFyOiBsZWZ0OwotICBwYWRkaW5nOiAxMHB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNEU5OyAKLSAgYm9yZGVyOiBzb2xpZCAxcHggI0NDQ0NDQzsKLSAgZm9udC1mYW1pbHk6IHZlcmRhbmEsaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICBjb2xvcjogYmxhY2s7ICAKLX0KLQotI2xlbnlhLWluZm8tdHJlZSBzcGFuIHsKLSAgY29sb3I6ICMzMzMzMzM7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgY3Vyc29yOiBwb2ludGVyOwotICAvKiBmbG9hdDogbGVmdDsgKi8KLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbi1sZWZ0OiAyMnB4OwotfQotCi0jbGVueWEtaW5mby10cmVlIGRpdiB7Ci19Ci0KLSNsZW55YS1pbmZvLXRyZWVjYW52YXMgLmxlbnlhLWluZm8tcm9vdCB7IGN1cnNvcjogZGVmYXVsdDsgfQotI2xlbnlhLWluZm8tdHJlZWNhbnZhcyAubGVueWEtaW5mby1hcmVhIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLSNsZW55YS1pbmZvLXRyZWVjYW52YXMgLmxlbnlhLWluZm8tbm9sYW5ndWFnZSB7IGNvbG9yOiAjQUFBQUFBOyB9Ci0jbGVueWEtaW5mby10cmVlY2FudmFzIC5sZW55YS1pbmZvLWN1dCB7IGNvbG9yOiAjRkZBQUFBOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLSNsZW55YS1pbmZvLXRyZWVjYW52YXMgLmxlbnlhLWluZm8tY3V0IGltZyB7IG9wYWNpdHk6IC4yOyB9Ci0jbGVueWEtaW5mby10cmVlY2FudmFzIC5sZW55YS1pbmZvLXByb3RlY3RlZCB7IGNvbG9yOiAjQ0MzMzMzOyB9Ci0jbGVueWEtaW5mby10cmVlY2FudmFzIHNwYW46aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotI2xlbnlhLWluZm8tdHJlZWNhbnZhcyBzcGFuLmxlbnlhLWluZm8tcm9vdDpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQotCi0jbGVueWEtaW5mby10cmVlIHRhYmxlIHsgCi0gIGJvcmRlci1zcGFjaW5nOiAwcHg7Ci0gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci19Ci0KLSNsZW55YS1pbmZvLXRyZWUgdGQgewotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICBtYXJnaW46IDBweDsKLSAgcGFkZGluZzogMHB4OyAKLX0KLQotI2xlbnlhLWluZm8tdHJlZSB0ZC5sZW55YS1pbmZvLWxhYmVsLXRkIHsKLSAgdmVydGljYWwtYWxpZ246IHRvcDsKLSAgbWFyZ2luOiAwcHg7Ci0gIHBhZGRpbmc6IDBweCAwcHggMHB4IDJweDsgCi19Ci0KLSNsZW55YS1pbmZvLXRyZWVjYW52YXMgLnRyZWVub2RlX2ljb24gewotICBmbG9hdDogbGVmdDsKLSAgcGFkZGluZy1yaWdodDogNXB4OwotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNEU5OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0jbGVueWEtaW5mby10cmVlY2FudmFzIC5zZWxlY3RlZF9ub2RlIHNwYW4geyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjIxLCAyMjAsIDIwNyk7IH0KLSNsZW55YS1pbmZvLXRyZWVjYW52YXMgLnRyZWVub2RlX3NpZ24geyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBwYWRkaW5nOiAwcHg7IH0KLQotI2xlbnlhLWluZm8tY29udGVudCB7Ci0gIGNsZWFyOiBib3RoOwotICBmbG9hdDogbGVmdDsKLS8qICBtYXJnaW46IDBweCAyMHB4OyAqLwotICBmb250LXNpemU6IHNtYWxsOwotfQotCi0ubGVueWFUYWJUaXRsZSwgLmxlbnlhVGFiVGl0bGVBY3RpdmUgewotICBmbG9hdDogbGVmdDsKLSAgbWFyZ2luOiAwIC41ZW0gMCAwOwotfQotCi0ubGVueWFUYWJUaXRsZUFjdGl2ZSB7Ci0gIGJhY2tncm91bmQ6IHVybCgnL21vZHVsZXMvc3ZnL3RhYi10b3BMZWZ0LTUtREREQ0NGLURERENDRi5wbmcnKSBsZWZ0IHRvcCBuby1yZXBlYXQ7Ci19Ci0KLS5sZW55YVRhYlRpdGxlQWN0aXZlIGEgewotICBiYWNrZ3JvdW5kOiB1cmwoJy9tb2R1bGVzL3N2Zy90YWItdG9wUmlnaHQtNS1ERERDQ0YtREREQ0NGLnBuZycpIHJpZ2h0IHRvcCBuby1yZXBlYXQ7Ci19Ci0KLS5sZW55YVRhYlRpdGxlIGEsIC5sZW55YVRhYlRpdGxlQWN0aXZlIGEgewotICBwYWRkaW5nOiAuMWVtIC43ZW0gLjFlbSAuN2VtOwotICBkaXNwbGF5OiBibG9jazsKLX0KLQotLmxlbnlhVGFiVGl0bGUgewotICBjdXJzb3I6IHBvaW50ZXI7Ci0gIGJhY2tncm91bmQ6IHVybCgnL21vZHVsZXMvc3ZnL3RhYi10b3BMZWZ0LTUtQkJCQkJCLUJCQkJCQi5wbmcnKSBsZWZ0IHRvcCBuby1yZXBlYXQ7Ci19Ci0KLS5sZW55YVRhYlRpdGxlIGEgewotICBiYWNrZ3JvdW5kOiB1cmwoJy9tb2R1bGVzL3N2Zy90YWItdG9wUmlnaHQtNS1CQkJCQkItQkJCQkJCLnBuZycpIHJpZ2h0IHRvcCBuby1yZXBlYXQ7Ci19Ci0KLQotLmxlbnlhVGFiQm9keSB7Ci0gIGRpc3BsYXk6IG5vbmU7Ci19Ci0gIAotLmxlbnlhVGFiQm9keUFjdGl2ZSB7Ci0gIGNsZWFyOiBib3RoOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjREREQ0NGOwotICBtYXJnaW46IDAgMCAxZW0gMDsKLSAgcGFkZGluZzogMWVtIC43ZW07Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL3h1bG1lbnUuY3NzIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvY3NzL3h1bG1lbnUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDA3ZGI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2Nzcy94dWxtZW51LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxjc3MgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICANCi1AbmFtZXNwYWNlIHVybCgiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9rZXltYXN0ZXIvZ2F0ZWtlZXBlci90aGVyZS5pcy5vbmx5Lnh1bCIpOw0KLQ0KLTwhLS0NCi0gICAgQGltcG9ydCB1cmwoImNocm9tZTovL2dsb2JhbC9za2luLyIpOw0KLS0tPg0KLQ0KLXdpbmRvdyB7ICANCi0gDQotfQ0KLQ0KLSNsZW55YS14dWwtbWVudWJhciB2Ym94IHsNCi0gYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsNCi19DQotDQotI2xlbnlhLWluZm8geyANCi0gZmxvYXQ6IHJpZ2h0OyANCi0gbWFyZ2luOiA5cHggMTBweCAwcHggMHB4Ow0KLSBmb250LXNpemU6IDExcHg7IA0KLSBmb250LWZhbWlseTogQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyANCi0gbGluZS1oZWlnaHQ6IDE7IA0KLX0NCi0NCi10YWJib3ggew0KLSBwYWRkaW5nLXRvcDogM3B4Ow0KLSBiYWNrZ3JvdW5kLWNvbG9yOiAjYWJhYmFiOw0KLSBjb2xvcjogI2ZmZmZmZjsNCi19DQotDQotdGFiIHsgDQotIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQotIGZvbnQ6IGJvbGQgMTBweC8xLjAgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IA0KLX0NCi0NCi10YWJzIHsNCi0gDQotIG1hcmdpbi1sZWZ0OiAzcHg7DQotfQ0KLQ0KLWRlc2NyaXB0aW9uIHsNCi0gDQotfQ0KLQ0KLQ0KLTwvY3NzPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWkueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTlhZmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08Y2F0YWxvZ3VlIHhtbDpsYW5nPSJlbiIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotCi0gIDwhLS0gY29tbW9uIHVzZWQgd29yZHMgLS0+Ci0gIDxtZXNzYWdlIGtleT0iU2F2ZSI+U2F2ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdWJtaXQiPlN1Ym1pdDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDYW5jZWwiPkNhbmNlbDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUiPkRlbGV0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOT1RFIj5Ob3RlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5vIHJlZmVyZXIiPk5vIHJlZmVyZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVmZXJlciI+UmVmZXJlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFWENFUFRJT04iPkVYQ0VQVElPTjwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IlVzZXIiPlVzZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGl2ZSI+bGl2ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJub3QgbGl2ZSI+bm90IGxpdmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYXV0aG9yaW5nIj5hdXRob3Jpbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXV0aG9yaW5nIj5BdXRob3Jpbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmV2aWV3Ij5yZXZpZXc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXNlciI+dXNlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VycyI+VXNlcnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZ3JvdXAiPmdyb3VwPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIj5Hcm91cDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cHMiPkdyb3VwczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBJRCI+R3JvdXAgSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iWWVzIj5ZZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8iPk5vPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOYW1lIj5OYW1lPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkZ1bGwgTmFtZSI+RnVsbCBOYW1lPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlcXVpcmVkIGZpZWxkcyI+cmVxdWlyZWQgZmllbGRzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNlYXJjaCI+U2VhcmNoPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkhvbWUiPkhvbWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGl0bGUiPlRpdGxlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikxhc3QgbW9kaWZpZWQiPkxhc3QmIzE2MDttb2RpZmllZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJPdmVydmlldyI+T3ZlcnZpZXc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sZSI+Um9sZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWaWV3Ij5WaWV3PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFzc2V0cyI+QXNzZXRzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InRydWUiPnllczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmYWxzZSI+bm88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIj5SZW5hbWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW9kaWZ5Ij5Nb2RpZnk8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnQiPkRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRhdGUiPkRhdGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQmFjayI+QmFjazwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQiPkFkZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDcmVhdGUiPkNyZWF0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjcmVhdGUtZG9jdW1lbnQiPkNyZWF0ZSB0aGlzIGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBBcmNoaXZlIj5BcmNoaXZlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRyYXNoIj5UcmFzaDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaXNoZXIiPlB1Ymxpc2hlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOYXZpZ2F0aW9uIFRpdGxlIj5OYXZpZ2F0aW9uIFRpdGxlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0b3IiPkNyZWF0b3I8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTGFuZ3VhZ2UiPkxhbmd1YWdlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1YmplY3QiPlN1YmplY3Q8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmlnaHRzIj5SaWdodHM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU2VsZWN0IEZpbGUiPlNlbGVjdCBGaWxlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InNlbGVjdC1vYmplY3QiPlNlbGVjdCB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0Ij5JbnNlcnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEZpbGUiPkluc2VydCBGaWxlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVwbG9hZC13aXRoLWludmFsaWQtZXh0ZW5zaW9uIj5Zb3UgdHJpZWQgdG8gdXBsb2FkIGEgZmlsZSB3aXRoIGFuIGludmFsaWQgZXh0ZW5zaW9uLiBWYWxpZCBleHRlbnNpb25zIGFyZXswfS4gTm90ZSB0aGF0IGV4dGVuc2lvbnMgbmVlZCB0byBiZSBpbiBsb3dlcmNhc2UuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVwbG9hZC13aXRoLW1pc3NpbmctdGl0bGUiPllvdSB0cmllZCB0byB1cGxvYWQgYSBmaWxlIHdpdGhvdXQgYSB0aXRsZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmlsZW5hbWUtZm9ybWF0LWV4Y2VwdGlvbiI+VGhlIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB5b3UgYXJlIHRyeWluZyB0byB1cGxvYWQgZWl0aGVyIGhhcyBubyBleHRlbnNpb24sIG9yIGNvbnRhaW5zIGNoYXJhY3RlcnMgd2hpY2ggYXJlIG5vdCBhbGxvd2VkLCBzdWNoIGFzIHNwYWNlcyBvciB1bWxhdXRzLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDcmVhdGlvbiBEYXRlIj5DcmVhdGlvbiBEYXRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkZpbGUgU2l6ZSI+RmlsZSBTaXplPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkltYWdlIj5JbWFnZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMaW5rIj5MaW5rPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNhcHRpb24iPkNhcHRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSGVpZ2h0Ij5IZWlnaHQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV2lkdGgiPldpZHRoPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFsbCByaWdodHMgcmVzZXJ2ZWQiPkFsbCByaWdodHMgcmVzZXJ2ZWQuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InNob3ciPiYjMTYwOysmIzE2MDs8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iaGlkZSI+JiMxNjA7LSYjMTYwOzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaWNhdGlvbiI+UHVibGljYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGljYXRpb25zIj5QdWJsaWNhdGlvbnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iLi4uIFB1YmxpY2F0aW9uIj57MH0gUHVibGljYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGhpcyBQdWJsaWNhdGlvbiI+VGhpcyYjMTYwO1B1YmxpY2F0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkxvZ2luIGFzIEVkaXRvciI+TG9naW4mIzE2MDtmb3ImIzE2MDthdXRob3Jpbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTGl2ZSBWaWV3Ij5MaXZlJiMxNjA7VmlldzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJPdGhlciBQdWJsaWNhdGlvbnMiPk90aGVyJiMxNjA7UHVibGljYXRpb25zPC9tZXNzYWdlPgotICAKLQotICA8IS0tIHB1Ymxpc2ggc2NyZWVuIC0tPiAgICAgCi0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCI+UHVibGlzaDwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IlNvdXJjZSBGaWxlKHMpIj5Tb3VyY2UgRmlsZShzKTwvbWVzc2FnZT4KLQotICA8IS0tIGxvZ2luIHNjcmVlbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJsb2dpbi10by1wdWIiPkxvZ2luIHRvIHRoZSB7MH0gUHVibGljYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9naW4iPkxvZ2luPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhc3N3b3JkIj5QYXNzd29yZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VybmFtZSI+VXNlcm5hbWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXV0aGVudGljYXRpb24gZmFpbGVkIj5BdXRoZW50aWNhdGlvbiBmYWlsZWQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEtYWxpY2UiPlRyeSB1c2VyIHswfSBhbmQgcGFzc3dvcmQgezF9IChlZGl0b3IpLCBvciB1c2VyIHsyfSBhbmQgcGFzc3dvcmQgezN9IChyZXZpZXdlcik8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEiPlRyeSB1c2VyIHswfSBhbmQgcGFzc3dvcmQgezF9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFjY2VzcyBEZW5pZWQiPkFjY2VzcyBEZW5pZWQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXNlci1ub3QtYXV0aG9yaXplZCI+VGhlIHVzZXIgJ3swfScgaXMgbm90IGF1dGhvcml6ZWQgdG8gYWNjZXNzIHRoZSBwYWdlICd7MX0nLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJoYXZlLWFub3RoZXItYWNjb3VudCI+SWYgeW91IGhhdmUgYW5vdGhlciB1c2VyIGFjY291bnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcml2aWxlZ2VzLCBwbGVhc2UgcHJvdmlkZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGJlbG93LjwvbWVzc2FnZT4KLQotICA8IS0tIGxvZ291dCBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0ibG9nb3V0LWZyb20tcHViIj5Mb2dvdXQgZnJvbSB0aGUgezB9IFB1YmxpY2F0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IllvdXIgSGlzdG9yeSI+WW91ciBIaXN0b3J5PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkxvZ2luIHRvIEF1dGhvcmluZyBBcmVhIj5Mb2dpbiB0byBBdXRob3JpbmcgQXJlYTwvbWVzc2FnZT4KLQotICA8IS0tIGNtcyBtZW51IC0tPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBEb2N1bWVudCI+TmV3IERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyAuLi4gRG9jdW1lbnQiPk5ldyB7MH0gRG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IExhbmd1YWdlIFZlcnNpb24iPk5ldyBMYW5ndWFnZSBWZXJzaW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlbW92ZSBMYW5ndWFnZSBWZXJzaW9uIj5SZW1vdmUgTGFuZ3VhZ2UgVmVyc2lvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlIj5GaWxlPC9tZXNzYWdlPiAgCi0gIDxtZXNzYWdlIGtleT0iRWRpdCI+RWRpdDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXb3JrZmxvdyI+V29ya2Zsb3c8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVhY3RpdmF0ZSI+RGVhY3RpdmF0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZSI+U2NoZWR1bGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29weSI+Q29weTwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IlBhc3RlIj5QYXN0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDdXQiPkN1dDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIZWxwIj5IZWxwPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlYnVnIj5EZWJ1ZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUiPkRlbGV0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBcmNoaXZlIj5BcmNoaXZlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlc3RvcmUiPlJlc3RvcmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW92ZSBVcCI+TW92ZSBVcDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNb3ZlIERvd24iPk1vdmUgRG93bjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2dvdXQiPkxvZ291dDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWaWV3IFRhc2sgTG9ncyI+VmlldyBUYXNrIExvZ3M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3VwcG9ydCI+U3VwcG9ydDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN5c3RlbSBEb2N1bWVudGF0aW9uIj5TeXN0ZW0gRG9jdW1lbnRhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIERvY3VtZW50YXRpb24iPlVzZXIgRG9jdW1lbnRhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBYm91dCBBcGFjaGUgTGVueWEiPkFib3V0IEFwYWNoZSBMZW55YTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBcGFjaGUgTGVueWEgSG9tZXBhZ2UiPkFwYWNoZSBMZW55YSBIb21lcGFnZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXaXRoIEt1cHUiPgotICAgIDx4aHRtbDphYmJyIHRpdGxlPSJXaGF0JiMxNjA7WW91JiMxNjA7U2VlJiMxNjA7SXMmIzE2MDtXaGF0JiMxNjA7WW91JiMxNjA7R2V0Ij5XWVNJV1lHPC94aHRtbDphYmJyPiYjMTYwO0VkaXRvciYjMTYwOyhLdXB1KQotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV2l0aCBCWEUiPgotICAgIDx4aHRtbDphYmJyIHRpdGxlPSJXaGF0JiMxNjA7WW91JiMxNjA7U2VlJiMxNjA7SXMmIzE2MDtXaGF0JiMxNjA7WW91JiMxNjA7R2V0Ij5XWVNJV1lHPC94aHRtbDphYmJyPiYjMTYwO0VkaXRvciYjMTYwOyhCWEUpCi0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXaXRoIG9uZSBGb3JtIj5XaXRoIG9uZSBGb3JtPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldpdGggRm9ybXMiPldpdGggRm9ybXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBNZXRhZGF0YSI+RWRpdCYjMTYwO01ldGFkYXRhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTmF2aWdhdGlvbiBUaXRsZSI+RWRpdCYjMTYwO05hdmlnYXRpb24mIzE2MDtUaXRsZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWaXNpYmxlIGluIE5hdmlnYXRpb24iPlZpc2libGUgaW4gTmF2aWdhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUgVVJMIj5SZW5hbWUmIzE2MDtVUkw8L21lc3NhZ2U+Ci0gIAotICA8IS0tIGNtcyB0YWJzIC0tPgotICA8bWVzc2FnZSBrZXk9IlNlcnZlciBUaW1lIj5TZXJ2ZXIgVGltZTwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IldvcmtmbG93IFN0YXRlIj5Xb3JrZmxvdyBTdGF0ZTwvbWVzc2FnZT4KLQotICA8IS0tIEFkbWluaXN0cmF0aW9uIHRhYiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJBZG1pbmlzdHJhdGlvbiI+QWRtaW5pc3RyYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVhbGx5LWRlbGV0ZT8iPlJlYWxseSBkZWxldGUgezB9PzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoZSB0cmFzaCA/Ij5EbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoZSB0cmFzaCA/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3QiPkRlbGV0ZSB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVsZXRlLW9iamVjdD8iPkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgezB9PzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQYXNzd2QiPlBhc3N3ZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTd2l0Y2ggVXNlciI+U3dpdGNoIFVzZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIFRyYXNoIj5EZWxldGUgVHJhc2g8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29jb29uIGFuZCBTZXJ2ZXIgU3RhdHVzIj5Db2Nvb24gYW5kIFNlcnZlciBTdGF0dXM8L21lc3NhZ2U+Ci0gIAotICAgIDwhLS0gR3JvdXAgQWRtaW5pc3RyYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0iUHJvZmlsZSI+UHJvZmlsZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNZW1iZXJzIj5NZW1iZXJzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlcyI+SVAmIzE2MDtSYW5nZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBQcm9maWxlIj5FZGl0IFByb2ZpbGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBNZW1iZXJzIj5FZGl0IE1lbWJlcnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAgQWRtaW5pc3RyYXRpb24iPkdyb3VwIEFkbWluaXN0cmF0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCBHcm91cCI+QWRkIEdyb3VwPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIERhdGEiPkdyb3VwIERhdGE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZ3JvdXBfbm9fc3VjaF9lbnRyeSI+VGhlIGdyb3VwIHswfSBkb2VzIG5vdCBleGlzdC48L21lc3NhZ2U+Ci0KLSAgICA8IS0tIFVzZXIgQWRtaW5pc3RyYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBEYXRhIj5Vc2VyJiMxNjA7RGF0YTwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkNNUyBVc2VyIElEIj5DTVMmIzE2MDtVc2VyJiMxNjA7SUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTERBUCBJRCI+TERBUCYjMTYwO0lEPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNvbmZpcm0gcGFzc3dvcmQiPkNvbmZpcm0mIzE2MDtwYXNzd29yZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgVXNlciI+QWRkIFVzZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBBZG1pbmlzdHJhdGlvbiI+VXNlciBBZG1pbmlzdHJhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIERldGFpbHMiPlVzZXIgRGV0YWlsczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBbGwgR3JvdXBzIj5BbGwgR3JvdXBzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgR3JvdXBzIj5Vc2VyIEdyb3VwczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBBZmZpbGlhdGlvbiI+R3JvdXAgQWZmaWxpYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2hhbmdlIFBhc3N3b3JkIj5DaGFuZ2UgUGFzc3dvcmQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBHcm91cCBBZmZpbGlhdGlvbiI+RWRpdCBHcm91cCBBZmZpbGlhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ1c2VyX25vX3N1Y2hfdXNlciI+VGhlIHVzZXIgezB9IGRvZXMgbm90IGV4aXN0LjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZGFwX25vX3N1Y2hfdXNlciI+VGhlIHVzZXIgezB9IGRvZXMgbm90IGV4aXN0IGluIHRoZSBMREFQIGRpcmVjdG9yeS48L21lc3NhZ2U+Ci0KLSAgICA8IS0tIFVzZXIgVHlwZXMgLS0+Ci0gIDxtZXNzYWdlIGtleT0iTERBUCBVc2VyIj5MREFQIFVzZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9jYWwgVXNlciI+Q01TIFVzZXI8L21lc3NhZ2U+Ci0gIAotICAgIDwhLS0gUm9sZSBBZG1pbmlzdHJhdGlvbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJyb2xlX25vX3N1Y2hfcm9sZSI+VGhlIHJvbGUgezB9IGRvZXMgbm90IGV4aXN0LjwvbWVzc2FnZT4KLQotICAgIDwhLS0gSVAgUmFuZ2UgQWRtaW5pc3RyYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UiPklQJiMxNjA7UmFuZ2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgSUQiPklQJiMxNjA7UmFuZ2UmIzE2MDtJRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXR3b3JrIEFkZHJlc3MiPk5ldHdvcmsmIzE2MDtBZGRyZXNzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1Ym5ldCBNYXNrIj5TdWJuZXQmIzE2MDtNYXNrPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIEFkbWluaXN0cmF0aW9uIj5JUCYjMTYwO1JhbmdlJiMxNjA7QWRtaW5pc3RyYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWRkIElQIFJhbmdlIj5BZGQmIzE2MDtJUCYjMTYwO1JhbmdlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIFByb2ZpbGUiPklQJiMxNjA7UmFuZ2UmIzE2MDtQcm9maWxlPC9tZXNzYWdlPgotICAKLSAgPCEtLSBTaXRlIE92ZXJ2aWV3IC0tPgotICA8bWVzc2FnZSBrZXk9ImZpbHRlclJlc291cmNlVHlwZSI+UmVzb3VyY2UgVHlwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmaWx0ZXJXb3JrZmxvd1N0YXRlIj5Xb3JrZmxvdyBTdGF0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmaWx0ZXJMYW5ndWFnZSI+TGFuZ3VhZ2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmlsdGVyTGFzdE1vZGlmaWVkIj5MYXN0IE1vZGlmaWNhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmaWx0ZXJEb2N1bWVudElkIj5Eb2N1bWVudCBJRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJrZXlSZXNvdXJjZVR5cGUiPlJlc291cmNlIFR5cGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ia2V5V29ya2Zsb3dTdGF0ZSI+V29ya2Zsb3cgU3RhdGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ia2V5TGFuZ3VhZ2UiPkxhbmd1YWdlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleUxhc3RNb2RpZmllZCI+TGFzdCBNb2RpZmllZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJrZXlQYXRoIj5QYXRoPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleUNoZWNrZWRPdXQiPkNoZWNrZWQgT3V0IEJ5PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVwZGF0ZSI+VXBkYXRlPC9tZXNzYWdlPgotICAKLSAgPCEtLSBTaXRlIHRhYiAoaW5mbyBzY3JlZW5zKSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJBdmFpbGFibGUgTGFuZ3VhZ2VzIj5BdmFpbGFibGUgTGFuZ3VhZ2VzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoaXMgZG9jdW1lbnQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGxhbmd1YWdlLiI+VGhpcyBkb2N1bWVudCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgbGFuZ3VhZ2UuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvY3VtZW50IElEIj5Eb2N1bWVudCBJRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWZXJzaW9ucyI+VmVyc2lvbnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU1NMIEVuY3J5cHRpb24iPlNTTCYjMTYwO0VuY3J5cHRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sbGJhY2sgdG8gdGhpcyB2ZXJzaW9uIj5Sb2xsYmFjayB0byB0aGlzIHZlcnNpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQUMgQXJjaGl2ZSI+QUMmIzE2MDtBcmNoaXZlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFDIFRyYXNoIj5BQyYjMTYwO1RyYXNoPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFDIEF1dGgiPkFDJiMxNjA7QXV0aDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBQyBMaXZlIj5BQyYjMTYwO0xpdmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU2NoZWR1bGVyIj5TY2hlZHVsZXI8L21lc3NhZ2U+Ci0KLSAgICA8IS0tIEluZm8gc2NyZWVuIGFjdGlvbnMtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgTmF2aWdhdGlvbiBUaXRsZSI+TmV3IE5hdmlnYXRpb24gVGl0bGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIERvY3VtZW50Ij5SZW5hbWUgRG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IERvY3VtZW50IElEIj5OZXcgRG9jdW1lbnQgSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gd2hpdGVzcGFjZSwgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzIj5ObyB3aGl0ZXNwYWNlLCBubyBzcGVjaWFsIGNoYXJhY3RlcnM8L21lc3NhZ2U+Ci0gICAgICA8IS0tIFNjaGVkdWxlciAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJObyBhY3RpdmUgam9icyI+Tm8gYWN0aXZlIGpvYnMuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBqb2IgZGF0ZSBoYXMgZXhwaXJlZCI+VGhlIGpvYiBkYXRlIGhhcyBleHBpcmVkLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjaGVjayB0aGUgbG9nIGZpbGVzIj5jaGVjayB0aGUgbG9nIGZpbGVzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRhc2siPlRhc2s8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGF5Ij5EYXk8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGltZSI+VGltZTwvbWVzc2FnZT4KLQotICAgICAgPCEtLSBEZWFjdGl2YXRlIGFuZCBkZWxldGUgLS0+Ci0gIDxtZXNzYWdlIGtleT0iZG9jcy1oYXZlLWxpbmtzLXRvLWRvYyI+VGhlIGZvbGxvd2luZyBkb2N1bWVudHMgaGF2ZSBsaW5rcyB0byB0aGlzIGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlbGV0ZSBEb2N1bWVudCI+RGVsZXRlIERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1kb2MiPkRlbGV0ZSBkb2N1bWVudCB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY2Fubm90LWRlYWN0aXZhdGUtdW5sZXNzLWNoaWxkcmVuLWRlYWN0aXZhdGVkIj5UaGlzIGRvY3VtZW50IGNhbm5vdCBiZSBkZWFjdGl2YXRlZCB1bmxlc3MgdGhlIGZvbGxvd2luZyBjaGlsZCBkb2N1bWVudHMgYXJlIGRlYWN0aXZhdGVkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1sYW5ndWFnZS12ZXJzaW9ucz8iPkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgYWxsIGxhbmd1YWdlIHZlcnNpb25zIG9mIHRoZSBkb2N1bWVudCB7MH0/PC9tZXNzYWdlPiAgICAgIAotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1kb2MtbGl2ZSI+Q2Fubm90IGRlbGV0ZSBiZWNhdXNlIGRvY3VtZW50IHswfSBpcyBsaXZlITwvbWVzc2FnZT4KLQotICAgICAgPCEtLSBBcmNoaXZlIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IkFyY2hpdmUgRG9jdW1lbnQiPkFyY2hpdmUgRG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYXJjaGl2ZS1kb2MiPkFyY2hpdmUgZG9jdW1lbnQgezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImFyY2hpdmUtZG9jPyI+RG8geW91IHJlYWxseSB3YW50IHRvIGFyY2hpdmUgdGhlIGRvY3VtZW50IHswfT88L21lc3NhZ2U+Ci0gICAgICA8IS0tIFJlc3RvcmUgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUmVzdG9yZSBEb2N1bWVudCI+UmVzdG9yZSBEb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXN0b3JlLWRvYyI+UmVzdG9yZSBkb2N1bWVudCB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVzdG9yZS1kb2M/Ij5EbyB5b3UgcmVhbGx5IHdhbnQgdG8gcmVzdG9yZSB0aGUgZG9jdW1lbnQgezB9PzwvbWVzc2FnZT4KLSAgICAgIDwhLS0gUmVuYW1lIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+UmVuYW1lIERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlbmFtZS1kb2MiPlJlbmFtZSBkb2N1bWVudCB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVuYW1lLWxhYmVsLWRvYyI+Q2hhbmdlIG5hdmlnYXRpb24gdGl0bGUgb2YgZG9jdW1lbnQgezB9PC9tZXNzYWdlPgotICAgICAgPCEtLSBDb3B5IGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IkNvcHkgRG9jdW1lbnQiPkNvcHkgRG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY29weS1kb2MtdG8tY2xpcD8iPgotICAgIERvIHlvdSB3YW50IHRvIGNvcHkgdGhlIGRvY3VtZW50IDx4aHRtbDpxPnswfTwveGh0bWw6cT4gYW5kIGl0cyBkZXNjZW5kYW50cyB0byB0aGUgY2xpcGJvYXJkPwotICAgIFlvdSBjYW4gcGFzdGUgdGhlIHN1YnRyZWUgbGF0ZXIgYXQgdGhlIGxvY2F0aW9uIG9mIHlvdXIgY2hvb3NpbmcuCi0gIDwvbWVzc2FnZT4KLSAgICAgIDwhLS0gUGFzdGUgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUGFzdGUgRG9jdW1lbnQiPlBhc3RlIERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InBhc3RlLWRvYy1mcm9tLWNsaXA/Ij5EbyB5b3Ugd2FudCB0byBwYXN0ZSB0aGUgZG9jdW1lbnQgPHhodG1sOnE+ezB9PC94aHRtbDpxPiBmcm9tIHRoZSBjbGlwYm9hcmQ/PC9tZXNzYWdlPgotCi0gICAgICA8IS0tIEN1dCBkb2N1bWVudCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDdXQgRG9jdW1lbnQiPkN1dCBEb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjdXQtZG9jLXRvLWNsaXA/Ij4KLSAgICBEbyB5b3Ugd2FudCB0byBjdXQgdGhlIGRvY3VtZW50IDx4aHRtbDpxPnswfTwveGh0bWw6cT4gYW5kIGl0cyBkZXNjZW5kYW50cyBhbmQgbW92ZSBpdCB0byB0aGUgY2xpcGJvYXJkPwotICAgIFlvdSBjYW4gcGFzdGUgdGhlIHN1YnRyZWUgbGF0ZXIgYXQgdGhlIGxvY2F0aW9uIG9mIHlvdXIgY2hvb3NpbmcuCi0gIDwvbWVzc2FnZT4KLQotICA8IS0tIFdvcmtmbG93ICAtLT4gCi0gIDxtZXNzYWdlIGtleT0iVmFsdWUiPlZhbHVlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkV2ZW50Ij5FdmVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWYXJpYWJsZXMiPlZhcmlhYmxlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIaXN0b3J5Ij5IaXN0b3J5PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN0YXRlIj5TdGF0ZTwvbWVzc2FnZT4gICAKLSAgPG1lc3NhZ2Uga2V5PSJJUCBBZGRyZXNzIj5JUCBBZGRyZXNzPC9tZXNzYWdlPiAgIAotICA8bWVzc2FnZSBrZXk9ImVkaXQiPmVkaXQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic3VibWl0Ij5zdWJtaXQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVqZWN0Ij5yZWplY3Q8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icHVibGlzaCI+cHVibGlzaDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZWxldGUiPmRlbGV0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlIj5hcmNoaXZlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlc3RvcmUiPnJlc3RvcmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3Itd29ya2Zsb3ctZG9jdW1lbnQiPlRoZSBldmVudCB7MH0gaXMgbm90IGV4ZWN1dGFibGUgb24gZG9jdW1lbnQgInsxfSI8L21lc3NhZ2U+Ci0gIAotICA8IS0tIE5vdGlmaWNhdGlvbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJub3RpZmljYXRpb24tbWVzc2FnZSI+TGVueWEgTm90aWZpY2F0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRvY3VtZW50LXB1Ymxpc2hlZCI+QSBkb2N1bWVudCB5b3Ugc3VibWl0dGVkIHdhcyBwdWJsaXNoZWQ6IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2N1bWVudC1zdWJtaXR0ZWQiPkEgZG9jdW1lbnQgaGFzIGJlZW4gc3VibWl0dGVkIGZvciB5b3UgdG8gcmV2aWV3OiB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZG9jdW1lbnQtcmVqZWN0ZWQiPkEgZG9jdW1lbnQgeW91IHN1Ym1pdHRlZCB3YXMgcmVqZWN0ZWQgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uOiB7MH0sIHsxfTwvbWVzc2FnZT4KLSAgCi0gIDwhLS0gYXJlYXMgLS0+Ci0gIDxtZXNzYWdlIGtleT0iYXV0aG9yaW5nLWFyZWEiPkF1dGhvcmluZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsaXZlLWFyZWEiPkxpdmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYXJjaGl2ZS1hcmVhIj5BcmNoaXZlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InRyYXNoLWFyZWEiPlRyYXNoPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InN0YWdpbmctYXJlYSI+U3RhZ2luZzwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gYXNzZXQgIC0tPiAKLSAgPG1lc3NhZ2Uga2V5PSJOZXcgQXNzZXQiPk5ldyBBc3NldDwvbWVzc2FnZT4KLSAgCi0gIDwhLS0gSW5mbyBtZXRhIC0tPgotICA8bWVzc2FnZSBrZXk9IkN1c3RvbSBtZXRhZGF0YSI+Q3VzdG9tIG1ldGFkYXRhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNob3cgY3VzdG9tIG1ldGFkYXRhIj5TaG93IGN1c3RvbSBtZXRhZGF0YTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIaWRlIGN1c3RvbSBtZXRhZGF0YSI+SGlkZSBjdXN0b20gbWV0YWRhdGE8L21lc3NhZ2U+Ci0gIAotICA8IS0tIEluZm8gUkMgIC0tPiAKLSAgPG1lc3NhZ2Uga2V5PSJDdXJyZW50IFZlcnNpb24iPkN1cnJlbnQgVmVyc2lvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSb2xsYmFjayB0byB0aGlzIHJldmlzaW9uIj5Sb2xsYmFjayB0byB0aGlzIHJldmlzaW9uPC9tZXNzYWdlPgotCi0gIDwhLS0gSW5mbyBBQyAgLS0+IAotICA8bWVzc2FnZSBrZXk9IlNTTCBFbmNyeXB0aW9uIj5TU0wmIzE2MDtFbmNyeXB0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFjY2VzcyBPYmplY3QiPkFjY2VzcyYjMTYwO09iamVjdDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ2aXNpdCI+dmlzaXQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmV2aWV3ZXIiPnJldmlld2VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImVkaXRvciI+ZWRpdG9yPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImFkbWluIj5hZG1pbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ3b3JsZCI+d29ybGQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idGhlIHdvcmxkIj50aGUgd29ybGQ8L21lc3NhZ2U+Ci0gIAotICA8IS0tIFNjaGVkdWxlciAtLT4gCi0gIDxtZXNzYWdlIGtleT0iTmV3IGpvYiI+TmV3JiMxNjA7am9iPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFjdGl2ZSBqb2JzIj5BY3RpdmUmIzE2MDtqb2JzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlB1Ymxpc2ggYW5kIEV4cG9ydCI+UHVibGlzaCBhbmQmIzE2MDtFeHBvcnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZG9jLWhhcy1saW5rcy10by11bnB1Ymxpc2hlZCI+VGhpcyBkb2N1bWVudCBoYXMgbGlua3MgdG8gdGhlIGZvbGxvd2luZyB1bnB1Ymxpc2hlZCBkb2N1bWVudHM6PC9tZXNzYWdlPgotCi0gIDwhLS0gTmV3IERvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlBsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGNhdXNlcyBvZiB0aGUgZXhjZXB0aW9uIj5QbGVhc2UgY2hlY2sgdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBjYXVzZXMgb2YgdGhlIGV4Y2VwdGlvbi48L21lc3NhZ2U+ICAgCi0gIDxtZXNzYWdlIGtleT0iZXhjZXB0aW9uLmNhdXNlLmNyZWF0ZWRvYy53aGl0ZXNwYWNlLWluLWlkIj5UaGUgaWQgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSB3aGl0ZXNwYWNlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJleGNlcHRpb24uY2F1c2UuY3JlYXRlZG9jLmlkLWluLXVzZSI+VGhlIGlkIGlzIGFscmVhZHkgaW4gdXNlPC9tZXNzYWdlPiAgIAotICA8bWVzc2FnZSBrZXk9ImZhaWxtZXNzYWdlLmNyZWF0ZWRvYy5pbnZhbGlkZm9ybWF0Ij5QbGVhc2UgZW50ZXIgYSB2YWxpZCB2YWx1ZSBpbiB0aGUgSUQgZmllbGQuIEEtWiwgYS16LCAwLTkgb3IgLSBhcmUgdmFsaWQgY2hhcmFjdGVycy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmFpbG1lc3NhZ2UuY3JlYXRlZG9jLnJlcXVpcmVkIj5QbGVhc2UgaW5wdXQgYWxsIHJlcXVpcmVkICgqKSAgdmFsdWVzLjwvbWVzc2FnZT4KLQotICA8IS0tIEFzc2V0IFVwbG9hZC9JbnNlcnQgRGlhbG9nIC0tPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmFzc2V0dXBsb2FkLnN1YnRpdGxlIj5BZGQgdG8gQXNzZXQgTGlicmFyeTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBc3NldCBMaWJyYXJ5Ij5Bc3NldCBMaWJyYXJ5PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5vIGFzc2V0cyBhdmFpbGFibGUiPk5vIGFzc2V0cyBhdmFpbGFibGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEFzc2V0Ij5JbnNlcnQgQXNzZXQ8L21lc3NhZ2U+Ci0gIAotICA8IS0tIEltYWdlIFVwbG9hZC9JbnNlcnQgRGlhbG9nIC0tPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLnRpdGxlIj5JbnNlcnQgSW1hZ2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuaW1hZ2V1cGxvYWQuc2VsZWN0aW1hZ2UubGFiZWwiPlNlbGVjdCBJbWFnZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5pbmZvLm5vaW1hZ2VzIj5ObyBpbWFnZXMgYXZhaWxhYmxlLjwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLmxpbmtzLmhpbnQiPkV4dGVybmFsIGxpbmtzIGhhdmUgdG8gc3RhcnQgd2l0aCAnaHR0cDovLycsIGludGVybmFsIGxpbmtzIGhhdmUgdG8gc3RhcnQgd2l0aCAnLyc8L21lc3NhZ2U+ICAKLQotICA8IS0tIFJldmlzaW9uIENvbnRyb2xsZXIgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUmVhc29uIj5SZWFzb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRmlsZW5hbWUiPkZpbGUgbmFtZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5yYy5ub2NoZWNrb3V0Ij5SZXNvdXJjZSBjb3VsZCBub3QgYmUgY2hlY2tlZCBvdXQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEucmMuY2hlY2tlZG91dGFscmVhZHkiPlRoZSByZXNvdXJjZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgb3V0IGJ5IGFub3RoZXIgdXNlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5yYy5ub2NoZWNraW4iPlJlc291cmNlIGNvdWxkIG5vdCBiZSBjaGVja2VkIGluPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkdlbmVyaWMgRXhjZXB0aW9uIj5HZW5lcmljIEV4Y2VwdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDaGVjayB0aGUgbG9nIGZpbGVzLiI+Q2hlY2sgdGhlIGxvZyBmaWxlcy48L21lc3NhZ2U+Ci0gIAotICA8IS0tCi0gIFB1YmxpY2F0aW9uIHRlbXBsYXRpbmcuIENhbid0IGdvIGluIHRoZSBtb2R1bGUgeWV0LCBzaW5jZSBtb2R1bGUKLSAgaTE4biBpcyBvbmx5IHN1cHBvcnRlZCBpbiBwdWJsaWNhdGlvbnMuCi0gIC0tPgotICA8bWVzc2FnZSBrZXk9ImNyZWF0ZS1wdWJsaWNhdGlvbiI+Q3JlYXRlIHB1YmxpY2F0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSBQdWJsaWNhdGlvbiBmcm9tIFRlbXBsYXRlIj5DcmVhdGUgUHVibGljYXRpb24gZnJvbSBUZW1wbGF0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaWNhdGlvbiBJRCI+UHVibGljYXRpb24gSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGljYXRpb24gTmFtZSI+UHVibGljYXRpb24gTmFtZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUZW1wbGF0ZSI+VGVtcGxhdGU8L21lc3NhZ2U+Ci0gIAotICA8IS0tIEVycm9yIG1lc3NhZ2VzIG9mIGEgZ2VuZXJhbCBuYXR1cmUgLS0+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItZG9jdW1lbnQtZm9ybSI+RG9jdW1lbnQgaXMgbm90IHdlbGwtZm9ybWVkOiB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItdmFsaWRhdGlvbiI+U2NoZW1hIHZhbGlkYXRpb24gZmFpbGVkOiB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItbWlzc2luZy1sYW5ndWFnZSI+VGhlIHJlcXVlc3RlZCBkb2N1bWVudCBpcyBub3QgYXZhaWxhYmxlIGZvciBsYW5ndWFnZTogezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImVycm9yLWRvY3VtZW50LWV4aXN0YW5jZS1zaG9ydCI+RG9jdW1lbnQgZG9lcyBub3QgZXhpc3Q8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItZG9jdW1lbnQtZXhpc3RhbmNlIj5UaGUgcmVxdWVzdGVkIGRvY3VtZW50IHswfSBkb2VzIG5vdCBleGlzdC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItZ2VuZXJpYyI+QW4gZXJyb3Igb2NjdXJlZC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItNDA0Ij40MDQ6IFBhZ2Ugbm90IGZvdW5kPC9tZXNzYWdlPgotICAKLSAgPG1lc3NhZ2Uga2V5PSJwdWJsaWNhdGlvbi1kb2VzLW5vdC1leGlzdCI+VGhlIHB1YmxpY2F0aW9uIGRvZXMgbm90IGV4aXN0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InB1YmxpY2F0aW9uLS4uLi1kb2VzLW5vdC1leGlzdCI+VGhlIHB1YmxpY2F0aW9uIHdpdGggdGhlIElEICJ7MH0iIGRvZXMgbm90IGV4aXN0LjwvbWVzc2FnZT4KLSAgCi0gIDxtZXNzYWdlIGtleT0iY29uZmlndXJlLWNvbnRlbnQtcmVwb3NpdG9yeSI+Ci0gICAgPHhodG1sOnN0cm9uZz5Ob3RlOjwveGh0bWw6c3Ryb25nPiBNYWtlIHN1cmUgdGhhdCB5b3VyIGNvbnRlbnQgcmVwb3NpdG9yeQotICAgIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5IHdpdGhpbiA8eGh0bWw6Y29kZT4kUFVCX0hPTUUvY29uZmlnLyhsb2NhbC4pcHVibGljYXRpb24ueG1sPC94aHRtbDpjb2RlPi4KLSAgPC9tZXNzYWdlPgotICAKLSAgPCEtLSBEb2N1bWVudCBtZXRhIGRhdGEgLS0+Ci0gIDxtZXNzYWdlIGtleT0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvZG9jdW1lbnQvMS4wIj5Eb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjb250ZW50VHlwZSI+Q29udGVudCB0eXBlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImV4cGlyZXMiPkV4cGlyZXMgYWZ0ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXh0ZW5zaW9uIj5FeHRlbnNpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibWltZVR5cGUiPk1JTUUgdHlwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXNvdXJjZVR5cGUiPlJlc291cmNlIHR5cGU8L21lc3NhZ2U+Ci0gIAotPC9jYXRhbG9ndWU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2RlLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWM4MGVjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZGUiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLQotICA8IS0tIGNvbW1vbiB1c2VkIHdvcmRzIC0tPgotICA8bWVzc2FnZSBrZXk9IlNhdmUiPlNwZWljaGVybjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdWJtaXQiPkVpbnJlaWNoZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2FuY2VsIj5BYmJyZWNoZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIj5Mw7ZzY2hlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOT1RFIj5IaW53ZWlzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5vIHJlZmVyZXIiPktlaW5lIFLDvGNrdmVyd2Vpc2VpdGU8L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJSZWZlcmVyIj5Sw7xja3ZlcndlaXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRVhDRVBUSU9OIj5BVVNOQUhNRTwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IlVzZXIiPkJlbnV0emVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxpdmUiPmxpdmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm90IGxpdmUiPm5pY2h0IGxpdmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYXV0aG9yaW5nIj5CZWFyYmVpdHVuZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBdXRob3JpbmciPkJlYXJiZWl0dW5nPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJldmlldyI+RnJlaWdhYmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJhc2giPlBhcGllcmtvcmI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYXJjaGl2ZSI+QXJjaGl2PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVzZXIiPkJlbnV0emVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXJzIj5CZW51dHplcjwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IlVzZXIgUHJvZmlsZSI+QmVudXR6ZXJwcm9maWw8L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IFVzZXIgUHJvZmlsZSI+QmVudXR6ZXJwcm9maWwgYmVhcmJlaXRlbjwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IkRlZmF1bHQgTWVudSBMb2NhbGUiPkJldm9yenVndGUgTWVuw7wtU3ByYWNoZTwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IkRlZmF1bHQgRG9jdW1lbnQgTG9jYWxlIj5CZXZvcnp1Z3RlIERva3VtZW50ZW4tU3ByYWNoZTwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIFByb2ZpbGUiPkdydXBwZW5wcm9maWw8L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IEdyb3VwIFByb2ZpbGUiPkdydXBwZW5wcm9maWwgYmVhcmJlaXRlbjwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9Imdyb3VwIj5HcnVwcGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAiPkdydXBwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cHMiPkdydXBwZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAgSUQiPkdydXBwZW4tSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iWWVzIj5KYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyI+TmVpbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZXNjcmlwdGlvbiI+QmVzY2hyZWlidW5nPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5hbWUiPk5hbWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRnVsbCBOYW1lIj5Wb3ItJiMxNjA7dW5kJiMxNjA7TmFjaG5hbWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVxdWlyZWQgZmllbGRzIj5QZmxpY2h0ZmVsZGVyPC9tZXNzYWdlPiAKLSAgPG1lc3NhZ2Uga2V5PSJTZWFyY2giPlN1Y2hlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkhvbWUiPlN0YXJ0c2VpdGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGl0bGUiPlRpdGVsPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikxhc3QgbW9kaWZpZWQiPkxldHp0ZSYjMTYwO8OEbmRlcnVuZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJPdmVydmlldyI+w5xiZXJzaWNodDwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IlJldmlzaW9ucyI+UmV2aXNpb25lbjwvbWVzc2FnZT4gIAotICA8bWVzc2FnZSBrZXk9IlJvbGUiPlJvbGxlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZpZXciPkFuemVpZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFzc2V0cyI+QW5sYWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ0cnVlIj5qYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmYWxzZSI+bmVpbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUiPlVtYmVuZW5uZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW9kaWZ5Ij7DhG5kZXJuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvY3VtZW50Ij5Eb2t1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEYXRlIj5EYXR1bTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJCYWNrIj5adXLDvGNrPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCI+SGluenVmw7xnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ3JlYXRlIj5FcnN0ZWxsZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY3JlYXRlLWRvY3VtZW50Ij5EaWVzZXMgRG9rdW1lbnQgZXJzdGVsbGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBBcmNoaXZlIj5BcmNoaXY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVHJhc2giPlBhcGllcmtvcmI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGlzaGVyIj5IZXJhdXNnZWJlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOYXZpZ2F0aW9uIFRpdGxlIj5OYXZpZ2F0aW9uc3RpdGVsPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0b3IiPkVyc3RlbGxlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMYW5ndWFnZSI+U3ByYWNoZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdWJqZWN0Ij5CZXRyaWZmdDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSaWdodHMiPlJlY2h0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTZWxlY3QgRmlsZSI+RGF0ZWkgd8OkaGxlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzZWxlY3Qtb2JqZWN0Ij57MH0mIzE2MDthdXN3w6RobGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCI+RWluZsO8Z2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBGaWxlIj5EYXRlaSBlaW5mw7xnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXBsb2FkLXdpdGgtaW52YWxpZC1leHRlbnNpb24iPkVzIGTDvHJmZW4gbnVyIERhdGVpZW4gbWl0IGZvbGdlbmRlbiBFbmR1bmdlbiBob2NoZ2VsYWRlbiB3ZXJkZW57MH0uIERpZSBFbmR1bmcgbXVzcyB6dWRlbSBrbGVpbiBnZXNjaHJpZWJlbiBzZWluLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ1cGxvYWQtd2l0aC1taXNzaW5nLXRpdGxlIj5EYXRlaWVuIG3DvHNzZW4gZWluZW4gVGl0ZWwgaGFiZW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZpbGVuYW1lLWZvcm1hdC1leGNlcHRpb24iPkRlciBOYW1lIGRlciBnZXfDpGhsdGVuIERhdGVpIGVudGjDpGx0IFVtbGF1dGUsIExlZXJ6ZWljaGVuLCB1bmVybGF1YnRlIFplaWNoZW4gb2RlciBiZXNpdHp0IGtlaW5lIGfDvGx0aWdlIEVuZHVuZy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ3JlYXRpb24gRGF0ZSI+RXJzdGVsbGRhdHVtPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkZpbGUgU2l6ZSI+RGF0ZWlncsO2c3NlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkltYWdlIj5CaWxkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkxpbmsiPlZlcndlaXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2FwdGlvbiI+w5xiZXJzY2hyaWZ0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFsbCByaWdodHMgcmVzZXJ2ZWQiPkFsbGUgUmVjaHRlIHZvcmJlaGFsdGVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzaG93Ij4mIzE2MDsrJiMxNjA7PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImhpZGUiPiYjMTYwOy0mIzE2MDs8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSGVpZ2h0Ij5Iw7ZoZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXaWR0aCI+QnJlaXRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlB1YmxpY2F0aW9uIj5QdWJsaWthdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaWNhdGlvbnMiPlB1Ymxpa2F0aW9uZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iLi4uIFB1YmxpY2F0aW9uIj57MH0tUHVibGlrYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGhpcyBQdWJsaWNhdGlvbiI+RGllc2UmIzE2MDtQdWJsaWthdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2dpbiBhcyBFZGl0b3IiPkltJiMxNjA7U3lzdGVtJiMxNjA7YW5tZWxkZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTGl2ZSBWaWV3Ij5MaXZlLUFuc2ljaHQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iT3RoZXIgUHVibGljYXRpb25zIj5BbmRlcmUmIzE2MDtQdWJsaWthdGlvbmVuPC9tZXNzYWdlPgotICAKLQotICA8IS0tIHB1Ymxpc2ggc2NyZWVuIC0tPiAKLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaXNoIj5WZXLDtmZmZW50bGljaGVuPC9tZXNzYWdlPiAgICAKLSAgPG1lc3NhZ2Uga2V5PSJTb3VyY2UgRmlsZShzKSI+UXVlbGxkYXRlaShlbik8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icHVibGlzaCBjb21wbGV0ZSBzdWJ0cmVlIj5kZW4gZ2VzYW10ZW4gVGVpbGJhdW0gdmVyw7ZmZmVudGxpY2hlbjwvbWVzc2FnZT4KLSAgIAotICA8IS0tIGxvZ24gc2NyZWVuIC0tPiAgICAgICAgCi0gIDxtZXNzYWdlIGtleT0ibG9naW4tdG8tcHViIj5Bbm1lbGRlbiBhbiBkZXIgezB9LVB1Ymxpa2F0aW9uPC9tZXNzYWdlPiAgICAKLSAgPG1lc3NhZ2Uga2V5PSJMb2dpbiI+QW5tZWxkZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGFzc3dvcmQiPlBhc3N3b3J0PC9tZXNzYWdlPiAgICAKLSAgPG1lc3NhZ2Uga2V5PSJVc2VybmFtZSI+QmVudXR6ZXJuYW1lPC9tZXNzYWdlPiAgICAgICAgICAgICAgICAKLSAgPG1lc3NhZ2Uga2V5PSJBdXRoZW50aWNhdGlvbiBmYWlsZWQiPkFubWVsZHVuZyBpc3QgZmVobGdlc2NobGFnZW48L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJ0cnktdXNlci1sZW55YS1hbGljZSI+VmVyc3VjaGVuIFNpZSBCZW51dHplcm5hbWUgezB9IHVuZCBQYXNzd29ydCB7MX0gKEJlYXJiZWl0ZXIpLCBvZGVyIEJlbnV0emVybmFtZSB7Mn0gdW5kIFBhc3N3b3J0IHszfSAoUHLDvGZlcik8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEiPlZlcnN1Y2hlbiBTaWUgQmVudXR6ZXJuYW1lIHswfSB1bmQgUGFzc3dvcnQgezF9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFjY2VzcyBEZW5pZWQiPlp1Z3JpZmYgdmVyd2VpZ2VydDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ1c2VyLW5vdC1hdXRob3JpemVkIj5EZXIgQmVudXR6ZXIgJ3swfScgaXN0IG5pY2h0IGJlcmVjaHRpZ3QsIGF1ZiBkaWUgU2VpdGUgJ3sxfScgenV6dWdyZWlmZW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImhhdmUtYW5vdGhlci1hY2NvdW50Ij5XZW5uIFNpZSBlaW4gd2VpdGVyZXMgQmVudXR6ZXJrb250byBtaXQgZGVuIGVudHNwcmVjaGVuZGVuIEJlcmVjaHRpZ3VuZ2VuIGhhYmVuLCBnZWJlbiBTaWUgYml0dGUgQmVudXR6ZXJuYW1lbiB1bmQgUGFzc3dvcnQgdW50ZW4gZWluLjwvbWVzc2FnZT4KLQotICA8IS0tIGxvZ291dCBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0ibG9nb3V0LWZyb20tcHViIj5BYm1lbGRlbiB2b24gZGVyIHswfSBQdWJsaWthdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJZb3VyIEhpc3RvcnkiPklociBWZXJsYXVmPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkxvZ2luIHRvIEF1dGhvcmluZyBBcmVhIj5BbiBBdXRvcmVuYmVyZWljaCBhbm1lbGRlbjwvbWVzc2FnZT4KLQotICA8IS0tIGNtcyBtZW51IC0tPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBEb2N1bWVudCI+TmV1ZXMgRG9rdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IC4uLiBEb2N1bWVudCI+TmV1ZXMgezB9LURva3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBMYW5ndWFnZSBWZXJzaW9uIj5OZXVlIFNwcmFjaHZlcnNpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVtb3ZlIExhbmd1YWdlIFZlcnNpb24iPlNwcmFjaHZlcnNpb24gbMO2c2NoZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRmlsZSI+RGF0ZWk8L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJFZGl0Ij5CZWFyYmVpdGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldvcmtmbG93Ij5BcmJlaXRzZmx1c3M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVhY3RpdmF0ZSI+RGVha3RpdmllcmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNjaGVkdWxlIj5aZWl0c3RldWVydW5nPC9tZXNzYWdlPiAgCi0gIDxtZXNzYWdlIGtleT0iQ29weSI+S29waWVyZW48L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJQYXN0ZSI+RWluZsO8Z2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkN1dCI+QXVzc2NobmVpZGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkhlbHAiPkhpbGZlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlYnVnIj5EZWJ1ZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUiPkzDtnNjaGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFyY2hpdmUiPkFyY2hpdmllcmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlc3RvcmUiPldpZWRlcmhlcnN0ZWxsZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW92ZSBVcCI+TmFjaCBvYmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1vdmUgRG93biI+TmFjaCB1bnRlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2dvdXQiPkFibWVsZGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZpZXcgVGFzayBMb2dzIj5BdWZnYWJlbmJlcmljaHRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1cHBvcnQiPlN1cHBvcnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnRhdGlvbiI+RG9rdW1lbnRhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTeXN0ZW0gRG9jdW1lbnRhdGlvbiI+U3lzdGVtZG9rdW1lbnRhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIERvY3VtZW50YXRpb24iPkJlbnV0emVyZG9rdW1lbnRhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBYm91dCBBcGFjaGUgTGVueWEiPsOcYmVyIEFwYWNoZSBMZW55YTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBcGFjaGUgTGVueWEgSG9tZXBhZ2UiPkFwYWNoZSBMZW55YSBTdGFydHNlaXRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldpdGggS3VwdSI+Ci0gICAgPHhodG1sOmFiYnIgdGl0bGU9IldoYXQmIzE2MDtZb3UmIzE2MDtTZWUmIzE2MDtJcyYjMTYwO1doYXQmIzE2MDtZb3UmIzE2MDtHZXQiPldZU0lXWUc8L3hodG1sOmFiYnI+LUVkaXRvciYjMTYwOyhLdXB1KQotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV2l0aCBCWEUiPgotICAgIDx4aHRtbDphYmJyIHRpdGxlPSJXaGF0JiMxNjA7WW91JiMxNjA7U2VlJiMxNjA7SXMmIzE2MDtXaGF0JiMxNjA7WW91JiMxNjA7R2V0Ij5XWVNJV1lHPC94aHRtbDphYmJyPi1FZGl0b3ImIzE2MDsoQlhFKQotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV2l0aCBvbmUgRm9ybSI+TWl0IEZvcm11bGFyZWRpdG9yPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldpdGggRm9ybXMiPk1pdCBGb3Jtd2l6YXJkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTWV0YWRhdGEiPk1ldGFkYXRlbiBiZWFyYmVpdGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTmF2aWdhdGlvbiBUaXRsZSI+TmF2aWdhdGlvbnN0aXRlbCBiZWFyYmVpdGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZpc2libGUgaW4gTmF2aWdhdGlvbiI+U2ljaHRiYXIgaW4gTmF2aWdhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUgVVJMIj5VUkwmIzE2MDt1bWJlbmVubmVuPC9tZXNzYWdlPgotCi0gIDwhLS0gY21zIHRhYnMgLS0+Ci0gIDxtZXNzYWdlIGtleT0iU2VydmVyIFRpbWUiPlNlcnZlcnplaXQ8L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJXb3JrZmxvdyBTdGF0ZSI+U3RhdHVzPC9tZXNzYWdlPgotCi0gIDwhLS0gQWRtaW5pc3RyYXRpb24gdGFiIC0tPgotICA8bWVzc2FnZSBrZXk9IkFkbWluaXN0cmF0aW9uIj5BZG1pbmlzdHJhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWFsbHktZGVsZXRlPyI+ezB9IHdpcmtsaWNoIGzDtnNjaGVuID88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGUgdHJhc2ggPyI+V29sbGVuIFNpZSBkZW4gUGFwaWVya29yYiB3aXJrbGljaCBsZWVyZW4gPzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZWxldGUtb2JqZWN0Ij57MH0gbMO2c2NoZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVsZXRlLW9iamVjdD8iPldvbGxlbiBTaWUgezB9IHdpcmtsaWNoIGzDtnNjaGVuID88L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJQYXNzd2QiPlBhc3N3b3J0IMOkbmRlcm48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3dpdGNoIFVzZXIiPkJlbnV0emVyIHdlY2hzZWxuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlbGV0ZSBUcmFzaCI+UGFwaWVya29yYiBsZWVyZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29jb29uIGFuZCBTZXJ2ZXIgU3RhdHVzIj5Db2Nvb24tIHVuZCBTZXJ2ZXJzdGF0dXM8L21lc3NhZ2U+Ci0gIAotICAgIDwhLS0gR3JvdXAgQWRtaW5pc3RyYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0iUHJvZmlsZSI+UHJvZmlsPC9tZXNzYWdlPiAgCi0gIDxtZXNzYWdlIGtleT0iTWVtYmVycyI+TWl0Z2xpZWRlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZXMiPklQJiMxNjA7QmVyZWljaGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBQcm9maWxlIj5Qcm9maWwmIzE2MDvDpG5kZXJuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTWVtYmVycyI+TWl0Z2xpZWRlciYjMTYwO2JlYXJiZWl0ZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAgQWRtaW5pc3RyYXRpb24iPkdydXBwZW5hZG1pbmlzdHJhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgR3JvdXAiPkdydXBwZSBoaW56dWbDvGdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBEYXRhIj5HcnVwcGVuZGV0YWlsczwvbWVzc2FnZT4KLSAgCi0gICAgPCEtLSBVc2VyIEFkbWluaXN0cmF0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgRGF0YSI+QmVudXR6ZXJkZXRhaWxzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgSUQiPkJlbnV0emVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNNUyBVc2VyIElEIj5DTVMmIzE2MDtCZW51dHplcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMREFQIElEIj5MREFQJiMxNjA7SUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29uZmlybSBwYXNzd29yZCI+UGFzc3dvcnQmIzE2MDtiZXN0w6R0aWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgVXNlciI+QmVudXR6ZXIgaGluenVmw7xnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBBZG1pbmlzdHJhdGlvbiI+QmVudXR6ZXJhZG1pbmlzdHJhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIERldGFpbHMiPkJlbnV0emVyZGV0YWlsczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBbGwgR3JvdXBzIj5BbGxlIEdydXBwZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBHcm91cHMiPkJlbnV0emVyZ3J1cHBlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBBZmZpbGlhdGlvbiI+R3J1cHBlbm1pdGdsaWVkc2NoYWZ0ZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2hhbmdlIFBhc3N3b3JkIj5QYXNzd29ydCDDpG5kZXJuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik9sZCBQYXNzd29yZCI+QmVzdGVoZW5kZXMgUGFzc3dvcnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IFBhc3N3b3JkIj5OZXVlcyBQYXNzd29ydDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDb25maXJtIFBhc3N3b3JkIj5QYXNzd29ydCBiZXN0w6R0aWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IEdyb3VwIEFmZmlsaWF0aW9uIj5NaXRnbGllZHNjaGFmdGVuIMOkbmRlcm48L21lc3NhZ2U+Ci0gIAotICA8IS0tIElQIFJhbmdlIEFkbWluaXN0cmF0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIj5JUC1CZXJlaWNoPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIElEIj5JUC1CZXJlaWNocy1JRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXR3b3JrIEFkZHJlc3MiPklQLUFkcmVzc2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3VibmV0IE1hc2siPk5ldHp3ZXJrbWFza2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgQWRtaW5pc3RyYXRpb24iPklQIEFkbWluaXN0cmF0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCBJUCBSYW5nZSI+SVAtQmVyZWljaCYjMTYwO2hpbnp1ZsO8Z2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIFByb2ZpbGUiPklQLUJlcmVpY2hzLVByb2ZpbDwvbWVzc2FnZT4KLQotICA8IS0tIFVzZXIgVHlwZXMgLS0+Ci0gIDxtZXNzYWdlIGtleT0iTERBUCBVc2VyIj5MREFQIFVzZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9jYWwgVXNlciI+Q01TIFVzZXI8L21lc3NhZ2U+Ci0KLSAgPCEtLSBTaXRlIE92ZXJ2aWV3IC0tPgotICA8bWVzc2FnZSBrZXk9Ii0gYWxsIC0iPi0gYWxsZSAtPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZpbHRlclJlc291cmNlVHlwZSI+UmVzc291cmNlLVR5cDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmaWx0ZXJXb3JrZmxvd1N0YXRlIj5Xb3JrZmxvdy1TdGF0dXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmlsdGVyTGFuZ3VhZ2UiPlNwcmFjaGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmlsdGVyTGFzdE1vZGlmaWVkIj5MZXR6dGUgw4RuZGVydW5nPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZpbHRlckRvY3VtZW50SWQiPkRva3VtZW50LUlEPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleVJlc291cmNlVHlwZSI+UmVzc291cmNlLVR5cDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJrZXlXb3JrZmxvd1N0YXRlIj5Xb3JrZmxvdy1TdGF0dXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ia2V5TGFuZ3VhZ2UiPlNwcmFjaGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ia2V5TGFzdE1vZGlmaWVkIj5MZXR6dGUgw4RuZGVydW5nPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleURvY3VtZW50SWQiPlBmYWQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ia2V5Q2hlY2tlZE91dCI+QXVzZ2VjaGVja3Qgdm9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVwZGF0ZSI+QWt0dWFsaXNpZXJlbjwvbWVzc2FnZT4KLSAgICAKLSAgICA8IS0tIFNpdGUgdGFiIChpbmZvIHNjcmVlbnMpIC0tPgotICA8bWVzc2FnZSBrZXk9IkF2YWlsYWJsZSBMYW5ndWFnZXMiPlZlcmbDvGdiYXJlIFNwcmFjaGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoaXMgZG9jdW1lbnQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGxhbmd1YWdlLiI+RGFzIERva3VtZW50IGlzdCBpbiBkZXIgZ2V3w7xuc2NodGVuIFNwcmFjaGUgbmljaHQgdm9yaGFuZGVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEb2N1bWVudCBJRCI+RG9rdW1lbnQgSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmVyc2lvbnMiPlZlcnNpb25lbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTU0wgRW5jcnlwdGlvbiI+U1NMLVZlcnNjaGzDvHNzZWx1bmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sbGJhY2sgdG8gdGhpcyB2ZXJzaW9uIj5adSBkaWVzZXIgVmVyc2lvbiB6dXLDvGNrc2V0emVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFDIEFyY2hpdmUiPlJlY2h0ZSYjMTYwO0FyY2hpdjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBQyBUcmFzaCI+UmVjaHRlJiMxNjA7UGFwaWVya29yYjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBQyBBdXRoIj5SZWNodGUmIzE2MDtCZWFyYi48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQUMgTGl2ZSI+UmVjaHRlJiMxNjA7TGl2ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZXIiPlplaXRzdGV1ZXJ1bmc8L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIHNjcmVlbiBhY3Rpb25zLS0+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IE5hdmlnYXRpb24gVGl0bGUiPk5ldWVyIE5hdmlnYXRpb25zdGl0ZWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVuYW1lLWRvY3VtZW50Ij5Eb2t1bWVudCB7MH0gdW1iZW5lbm5lbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgRG9jdW1lbnQgSUQiPk5ldWUgRG9rdW1lbnQgSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gd2hpdGVzcGFjZSwgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzIj5LZWluZSBMZWVyLSBvZGVyIFNvbmRlcnplaWNoZW48L21lc3NhZ2U+Ci0KLSAgICAgIDwhLS0gU2NoZWR1bGVyIC0tPgotICA8bWVzc2FnZSBrZXk9Ik5vIGFjdGl2ZSBqb2JzIj5LZWluZSBha3RpdmVuIEF1ZmdhYmVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgam9iIGRhdGUgaGFzIGV4cGlyZWQiPkRhcyBEYXR1bSBkZXIgQXVmZ2FiZSBpc3QgYWJnZWxhdWZlbi48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY2hlY2sgdGhlIGxvZyBmaWxlcyI+Qml0dGUgw7xiZXJwcsO8ZmVuIFNpZSBkaWUgTG9nLURhdGVpZW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRhc2siPkF1ZmdhYmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGF5Ij5UYWc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGltZSI+WmVpdDwvbWVzc2FnZT4KLSAgICAgIDwhLS0gRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIC0tPgotICA8bWVzc2FnZSBrZXk9ImRvY3MtaGF2ZS1saW5rcy10by1kb2MiPkZvbGdlbmRlIERva3VtZW50ZSB2ZXJ3ZWlzZW4gYXVmIGRpZXNlcyBEb2t1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUgRG9jdW1lbnQiPkRva3VtZW50IGzDtnNjaGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNhbm5vdC1kZWFjdGl2YXRlLXVubGVzcy1jaGlsZHJlbi1kZWFjdGl2YXRlZCI+RGllc2VzIERva3VtZW50IGthbm4gZXJzdCBkZWFrdGl2aWVydCB3ZXJkZW4sIHdlbm4gYWxsZSB1bnRlcmdlb3JkbmV0ZW4gRG9rdW1lbnRlIGRlYWt0aXZpZXJ0IHdvcmRlbiBzaW5kLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZWxldGUtbGFuZ3VhZ2UtdmVyc2lvbnM/Ij5Xb2xsZW4gU2llIHdpcmtsaWNoIGFsbGUgU3ByYWNodmVyc2lvbmVuIGRlcyBEb2t1bWVudHMgezB9IGzDtnNjaGVuPzwvbWVzc2FnZT4KLSAgCi0gICAgICA8IS0tIEFyY2hpdmUgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQXJjaGl2ZSBEb2N1bWVudCI+RG9rdW1lbnQgYXJjaGl2aWVyZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYXJjaGl2ZS1kb2MiPkRva3VtZW50IHswfSBhcmNoaXZpZXJlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYz8iPldvbGxlbiBTaWUgZGFzIERva3VtZW50IHswfSB3aXJrbGljaCBhcmNoaXZpZXJlbj88L21lc3NhZ2U+Ci0gICAgICA8IS0tIFJlc3RvcmUgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUmVzdG9yZSBEb2N1bWVudCI+RG9rdW1lbnQgd2llZGVyaGVyc3RlbGxlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXN0b3JlLWRvYyI+RG9rdW1lbnQgezB9IHdpZWRlcmhlcnN0ZWxsZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVzdG9yZS1kb2M/Ij5Xb2xsZW4gU2llIGRhcyBEb2t1bWVudCB7MH0gd2lya2xpY2ggd2llZGVyaGVyc3RlbGxlbj88L21lc3NhZ2U+Ci0gICAgICA8IS0tUmVuYW1lIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+RG9rdW1lbnQgdW1iZW5lbm5lbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZW5hbWUtZG9jIj5Eb2t1bWVudCB7MH0gdW1iZW5lbm5lbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZW5hbWUtbGFiZWwtZG9jIj5OYXZpZ2F0aW9uc3RpdGVsIGRlcyBEb2t1bWVudHMgezB9IMOkbmRlcm48L21lc3NhZ2U+Ci0gICAgICA8IS0tIENvcHkgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQ29weSBEb2N1bWVudCI+RG9rdW1lbnQga29waWVyZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY29weS1kb2MiPkRva3VtZW50IGtvcGllcmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNvcHktZG9jLXRvLWNsaXA/Ij4KLSAgICBXb2xsZW4gU2llIGRhcyBEb2t1bWVudCA8eGh0bWw6cT57MH08L3hodG1sOnE+IHVuZCBkaWUgdW50ZXJnZW9yZG5ldGVuIERva3VtZW50ZSBpbiBkaWUgWndpc2NoZW5hYmxhZ2Uga29waWVyZW4/Ci0gICAgU2llIGvDtm5uZW4gZGVuIFRlaWxiYXVtIHNww6R0ZXIgYW4gZ2V3w7xuc2NodGVyIFN0ZWxsZSBlaW5mw7xnZW4uCi0gIDwvbWVzc2FnZT4KLSAgICAgIDwhLS0gUGFzdGUgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUGFzdGUgRG9jdW1lbnQiPkRva3VtZW50IGVpbmbDvGdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJwYXN0ZS1kb2MtZnJvbS1jbGlwPyI+V29sbGVuIFNpZSBkYXMgRG9rdW1lbnQgPHhodG1sOnE+ezB9PC94aHRtbDpxPiBhdXMgZGVyIFp3aXNjaGVuYWJsYWdlIGVpbmbDvGdlbj88L21lc3NhZ2U+Ci0gICAgICA8IS0tIEN1dCBkb2N1bWVudCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDdXQgRG9jdW1lbnQiPkRva3VtZW50IGF1c3NjaG5laWRlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjdXQtZG9jLXRvLWNsaXA/Ij4KLSAgICBXb2xsZW4gU2llIGRhcyBEb2t1bWVudCA8eGh0bWw6cT57MH08L3hodG1sOnE+IHVuZCBkaWUgdW50ZXJnZW9yZG5ldGVuIERva3VtZW50ZSBhdXNzY2huZWlkZW4gdW5kIGluIGRpZSBad2lzY2hlbmFibGFnZSB2ZXJzY2hpZWJlbj8KLSAgICBTaWUga8O2bm5lbiBkZW4gVGVpbGJhdW0gc3DDpHRlciBhbiBnZXfDvG5zY2h0ZXIgU3RlbGxlIGVpbmbDvGdlbi4KLSAgPC9tZXNzYWdlPgotCi0gIDwhLS0gSW5mbyB3b3JrZmxvdyAgLS0+IAotICA8bWVzc2FnZSBrZXk9IlZhbHVlIj5XZXJ0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkV2ZW50Ij5FcmVpZ25pczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWYXJpYWJsZXMiPlZhcmlhYmxlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIaXN0b3J5Ij5WZXJsYXVmPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN0YXRlIj5TdGF0dXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgQWRkcmVzcyI+SVAgQWRyZXNzZTwvbWVzc2FnZT4gICAKLSAgPG1lc3NhZ2Uga2V5PSJlZGl0Ij5iZWFyYmVpdGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InN1Ym1pdCI+ZWlucmVpY2hlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWplY3QiPmFibGVobmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InB1Ymxpc2giPnZlcsO2ZmZlbnRsaWNoZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVhY3RpdmF0ZSI+ZGVha3RpdmllcmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZSI+bMO2c2NoZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVzdG9yZSI+d2llZGVyaGVyc3RlbGxlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci13b3JrZmxvdy1kb2N1bWVudCI+RGFzIEVyZWlnbmlzIHswfSBrYW5uIG5pY2h0IGF1ZiBkYXMgRG9rdW1lbnQgInsxfSIgYW5nZXdhbmR0IHdlcmRlbi48L21lc3NhZ2U+Ci0gICAgCi0gIDwhLS0gTm90aWZpY2F0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9Im5vdGlmaWNhdGlvbi1tZXNzYWdlIj5MZW55YS1CZW5hY2hyaWNodGlndW5nPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vdGlmeS1zdWJtaXR0ZXIiPkJlbmFjaHJpY2h0aWd1bmcgYW4gZGVuIGVpbnJlaWNoZW5kZW4gTnV0emVyIHNlbmRlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2N1bWVudC1wdWJsaXNoZWQiPkVpbiB2b24gSWhuZW4gZWluZ2VyZWljaHRlcyBEb2t1bWVudCB3dXJkZSBwdWJsaXppZXJ0OiB7MH08L21lc3NhZ2U+Ci0gIAotICA8IS0tIGFyZWFzIC0tPgotICA8bWVzc2FnZSBrZXk9ImF1dGhvcmluZy1hcmVhIj5CZWFyYmVpdHVuZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsaXZlLWFyZWEiPkxpdmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYXJjaGl2ZS1hcmVhIj5BcmNoaXY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJhc2gtYXJlYSI+UGFwaWVya29yYjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzdGFnaW5nLWFyZWEiPlN0YWdpbmc8L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIGFzc2V0ICAtLT4gCi0gIDxtZXNzYWdlIGtleT0iTmV3IEFzc2V0Ij5OZXVlIEFubGFnZTwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gUkMgIC0tPiAKLSAgPG1lc3NhZ2Uga2V5PSJDdXJyZW50IFZlcnNpb24iPkFrdHVlbGxlIFZlcnNpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sbGJhY2sgdG8gdGhpcyByZXZpc2lvbiI+WnUgZGllc2VyIFZlcnNpb24genVyw7xja3NldHplbjwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gQUMgIC0tPiAKLSAgPG1lc3NhZ2Uga2V5PSJBY2Nlc3MgT2JqZWN0Ij5adWdyaWZmc29iamVrdDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbmhlcml0ZWQgUmlnaHRzIj5HZWVyYnRlJiMxNjA7UmVjaHRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InZpc2l0Ij5iZXN1Y2hlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXZpZXdlciI+UHLDvGZlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlZGl0b3IiPkJlYXJiZWl0ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYWRtaW4iPkFkbWluPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IndvcmxkIj5XZWx0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InRoZSB3b3JsZCI+RGllIFdlbHQ8L21lc3NhZ2U+Ci0KLSAgPCEtLSBTY2hlZHVsZXIgLS0+IAotICA8bWVzc2FnZSBrZXk9Ik5ldyBqb2IiPk5ldWVyJiMxNjA7Sm9iPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFjdGl2ZSBqb2JzIj5Ba3RpdmUgQXVmZ2FiZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCBhbmQgRXhwb3J0Ij5WZXLDtmZmZW50bGljaGVuIHVuZCYjMTYwO2V4cG9ydGllcmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRvYy1oYXMtbGlua3MtdG8tdW5wdWJsaXNoZWQiPkRpZXNlcyBEb2t1bWVudCBoYXQgUmVmZXJlbnplbiBhdWYgZm9sZ2VuZGUgdW52ZXLDtmZmZW50bGljaHRlIERva3VtZW50ZTo8L21lc3NhZ2U+Ci0KLSAgPCEtLSBOZXcgRG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUGxlYXNlIGNoZWNrIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgY2F1c2VzIG9mIHRoZSBleGNlcHRpb24iPkJpdHRlIMO8YmVycHLDvGZlbiBTaWUgZm9sZ2VuZGUgVXJzYWNoZW4gZsO8ciBkaWUgQXVzbmFobWUuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhcmVudCBJRCI+w5xiZXJnZXJvZG5ldGUgSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXhjZXB0aW9uLmNhdXNlLmNyZWF0ZWRvYy53aGl0ZXNwYWNlLWluLWlkIj5EaWUgSUQgZGFyZiBrZWluZSBMZWVyemVpY2hlbiBlbnRoYWx0ZW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImV4Y2VwdGlvbi5jYXVzZS5jcmVhdGVkb2MuaWQtaW4tdXNlIj5EaWUgSUQgaXN0IHNjaG9uIHZlcmdlYmVuLjwvbWVzc2FnZT4gICAKLSAgICA8bWVzc2FnZSBrZXk9ImZhaWxtZXNzYWdlLmNyZWF0ZWRvYy5pbnZhbGlkZm9ybWF0Ij5CaXR0ZSBnZWJlbiBzaWUgZWluZW4gZ8O8bHRpZ2VuIFdlcnQgZsO8ciAiSUQiIGVpbi4gR8O8bHRpZ2UgWmVpY2hlbiBzaW5kIEEtWiwgYS16LCAwLTkgb2RlciAtPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIGtleT0iZmFpbG1lc3NhZ2UuY3JlYXRlZG9jLnJlcXVpcmVkIj5CaXR0ZSBmw7xsbGVuIFNpZSBhbGxlIFBmbGljaGZlbGRlciAoKikgYXVzLi48L21lc3NhZ2U+Ci0KLSAgPCEtLSBBc3NldCBVcGxvYWQvSW5zZXJ0IERpYWxvZyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5hc3NldHVwbG9hZC5zdWJ0aXRsZSI+WnVyIEJpYmxpb3RoZWsgaGluenVmw7xnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXNzZXQgTGlicmFyeSI+T2JqZWt0YmlibGlvdGhlazwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyBhc3NldHMgYXZhaWxhYmxlIj5LZWluZSBPYmpla3RlIHZlcmbDvGdiYXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuYXNzZXR1cGxvYWQudGl0bGUiPk9iamVrdCBlaW5mw7xnZW48L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbWFnZSBVcGxvYWQvSW5zZXJ0IERpYWxvZyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC50aXRsZSI+QmlsZCBlaW5mw7xnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuaW1hZ2V1cGxvYWQuc2VsZWN0aW1hZ2UubGFiZWwiPkJpbGQgYXVzd8OkaGxlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5pbmZvLm5vaW1hZ2VzIj5LZWluZSBCaWxkZXIgdmVyZsO8Z2Jhci48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuaW1hZ2V1cGxvYWQubGlua3MuaGludCI+RXh0ZXJuZSBWZXJ3ZWlzZSBtw7xzc2VuIG1pdCAnaHR0cDovLycgdW5kIGludGVybmUgVmVyd2Vpc2UgbWl0ICcvJyBiZWdpbm5lbi48L21lc3NhZ2U+ICAKLQotICA8IS0tIFJldmlzaW9uIENvbnRyb2xsZXIgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUmVhc29uIj5HcnVuZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlbmFtZSI+RGF0ZWluYW1lPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tvdXQiPlJlc291cmNlIGtvbm50ZSBuaWNodCBhdXNnZWNoZWNrdCB3ZXJkZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEucmMuY2hlY2tlZG91dGFscmVhZHkiPkRpZSBSZXNzb3VyY2Ugd3VyZGUgYmVyZWl0cyB2b24gamVtYW5kIGFuZGVycyBhdXNnZWNoZWNrdC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEucmMubm9jaGVja2luIj5SZXNvdXJjZSBrb25udGUgbmljaHQgZWluZ2VjaGVja3Qgd2VyZGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkdlbmVyaWMgRXhjZXB0aW9uIj5BbGxnZW1laW5lciBGZWhsZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2hlY2sgdGhlIGxvZyBmaWxlcy4iPsOcYmVycHLDvGZlbiBTaWUgZGllIExvZ2RhdGVpLjwvbWVzc2FnZT4KLSAgCi0gIDwhLS0gUHVibGljYXRpb24gaW50cm9kdWN0aW9uIHBhZ2UgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGljYXRpb24gcHJvcGVydGllcyI+RWlnZW5zY2hhZnRlbiBkZXIgUHVibGlrYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXZhaWxhYmxlIGxhbmd1YWdlcyI+VmVyZsO8Z2JhcmUgU3ByYWNoZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXZhaWxhYmxlIHJlc291cmNlIHR5cGVzIj5WZXJmw7xnYmFyZSBSZXNzb3VyY2UtVHlwZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVxdWlyZWQgTGVueWEgdmVyc2lvbiI+QmVuw7Z0aWd0ZSBMZW55YS1WZXJzaW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlcXVpcmVkIExlbnlhIHJldmlzaW9uIj5CZW7DtnRpZ3RlIExlbnlhLVJldmlzaW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlcXVpcmVkIENvY29vbiB2ZXJzaW9uIj5CZW7DtnRpZ3RlIENvY29vbi1WZXJzaW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1vZHVsZXMgdXNlZCI+VmVyd2VuZGV0ZSBNb2R1bGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGVtcGxhdGVzIHVzZWQiPlZlcndlbmRldGUgVGVtcGxhdGVzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkluaGVyaXRlZDogc2VlIHRlbXBsYXRlIHB1YmxpY2F0aW9uIj5WZXJlcmJ0OiBTaWVoZSBUZW1wbGF0ZS1QdWJsaWthdGlvbjwvbWVzc2FnZT4KLSAgCi0gIDwhLS0KLSAgICBQdWJsaWNhdGlvbiB0ZW1wbGF0aW5nLiBDYW4ndCBnbyBpbiB0aGUgbW9kdWxlIHlldCwgc2luY2UgbW9kdWxlCi0gICAgaTE4biBpcyBvbmx5IHN1cHBvcnRlZCBpbiBwdWJsaWNhdGlvbnMuCi0gIC0tPgotICA8bWVzc2FnZSBrZXk9ImNyZWF0ZS1wdWJsaWNhdGlvbiI+UHVibGlrYXRpb24gZXJzdGVsbGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSBQdWJsaWNhdGlvbiBmcm9tIFRlbXBsYXRlIj5QdWJsaWthdGlvbiB2b24gZWluZXIgVm9ybGFnZSBlcnN0ZWxsZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGljYXRpb24gSUQiPlB1Ymxpa2F0aW9ucy1JRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaWNhdGlvbiBOYW1lIj5OYW1lIGRlciBQdWJsaWthdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUZW1wbGF0ZSI+Vm9ybGFnZTwvbWVzc2FnZT4KLSAgCi0gIDwhLS0gRXJyb3IgbWVzc2FnZXMgb2YgYSBnZW5lcmFsIG5hdHVyZSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci1kb2N1bWVudC1mb3JtIj5Eb2t1bWVudCBpc3QgbmljaHQgd29obGdlZm9ybXQ6IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci12YWxpZGF0aW9uIj5TY2hlbWEgVmFsaWRpZXJ1bmcgc2NobHVnIGZlaGw6IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci1taXNzaW5nLWxhbmd1YWdlIj5EYXMgYW5nZWZvcmRlcnRlIERva3VtZW50IGlzdCBuaWNodCB2ZXJmw7xnYmFyIGluIGRlciBTcHJhY2hlOiB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItZG9jdW1lbnQtZXhpc3RhbmNlLXNob3J0Ij5Eb2t1bWVudCBleGlzdGllcnQgbmljaHQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItZG9jdW1lbnQtZXhpc3RhbmNlIj5EYXMgYW5nZWZvcmRlcnRlIERva3VtZW50IHswfSBleGlzdGllcnQgbmljaHQuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImVycm9yLWdlbmVyaWMiPkVpbiBGZWhsZXIgaXN0IGF1ZmdldHJldGVuLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci00MDQiPjQwNDogU2VpdGUgbmljaHQgZ2VmdW5kZW48L21lc3NhZ2U+Ci0gIAotICA8bWVzc2FnZSBrZXk9InB1YmxpY2F0aW9uLWRvZXMtbm90LWV4aXN0Ij5EaWUgUHVibGlrYXRpb24gZXhpc3RpZXJ0IG5pY2h0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InB1YmxpY2F0aW9uLS4uLi1kb2VzLW5vdC1leGlzdCI+RGllIFB1Ymxpa2F0aW9uIG1pdCBkZXIgSUQgInswfSIgZXhpc3RpZXJ0IG5pY2h0LjwvbWVzc2FnZT4KLSAgCi0gIDxtZXNzYWdlIGtleT0iY29uZmlndXJlLWNvbnRlbnQtcmVwb3NpdG9yeSI+Ci0gICAgPHhodG1sOnN0cm9uZz5IaW53ZWlzOjwveGh0bWw6c3Ryb25nPiDDnGJlcnByw7xmZW4gU2llLCBvYiBkYXMgQ29udGVudC1SZXBvc2l0b3J5Ci0gICAgaW4gPHhodG1sOmNvZGU+JFBVQl9IT01FL2NvbmZpZy8obG9jYWwuKXB1YmxpY2F0aW9uLnhtbDwveGh0bWw6Y29kZT4gcmljaHRpZyBrb25maWd1cmllcnQgaXN0LgotICA8L21lc3NhZ2U+Ci0KLSAgPCEtLSBEb2N1bWVudCBtZXRhIGRhdGEgLS0+Ci0gIDxtZXNzYWdlIGtleT0iaHR0cDovL2FwYWNoZS5vcmcvbGVueWEvbWV0YWRhdGEvZG9jdW1lbnQvMS4wIj5Eb2t1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjb250ZW50VHlwZSI+SW5oYWx0c3R5cDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJleHBpcmVzIj5Mw6R1ZnQgYWIgbmFjaDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJleHRlbnNpb24iPkVuZHVuZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJtaW1lVHlwZSI+TUlNRS1UeXBlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlc291cmNlVHlwZSI+UmVzc291cmNlbi1UeXA8L21lc3NhZ2U+Ci0gIAotPC9jYXRhbG9ndWU+Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZXMueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMWMyODAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9lcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgJElkJAotCi0gIEB0cmFuc2xhdG9ycwotCVNhbHZhZG9yIENvYnJlcm8gPHNhbHZhZG9yX2NvYnJlcm9famltZW5leiBhdCBkbXItY29uc3VsdGluZyBkb3QgY29tPgotCURhdmlkIFBpbmVsbyA8ZGF2aWQgZG90IHBpbmVsbyBhdCBqdW50YWRlYW5kYWx1Y2lhIGRvdCBlcz4KLQlUaG9yc3RlbiBTY2hlcmxlciA8dGhvcnN0ZW4gYXQgYXBhY2hlIGRvdCBvcmc+Ci0gIEouIENheWV0YW5vIERlbGdhZG8gPGpjZGVsZ2FkbyBhdCBpbmdlbmlhIGRvdCBlcz4KLQotLS0+Ci0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImVzIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0KLSAgPCEtLSBjb21tb24gdXNlZCB3b3JkcyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJTYXZlIj5HdWFyZGFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1Ym1pdCI+QWNlcHRhcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDYW5jZWwiPkNhbmNlbGFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlbGV0ZSI+Qm9ycmFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5PVEUiPk5vdGE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gcmVmZXJlciI+U2luIHJlZmVyZW5jaWE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVmZXJlciI+UmVmZXJlbmNpYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFWENFUFRJT04iPkVYQ0VQQ0nDk048L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciI+VXN1YXJpbzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsaXZlIj5wcm9kdWNjacOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJub3QiPm5vPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImF1dGhvcmluZyI+ZWRpY2nDs248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXV0aG9yaW5nIj5FZGljacOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXZpZXciPlJldmlzacOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ1c2VyIj51c3VhcmlvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXJzIj5Vc3VhcmlvczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJncm91cCI+Z3J1cG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAiPkdydXBvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwcyI+R3J1cG9zPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIElEIj5JRCBHcnVwbzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJZZXMiPlPDrTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyI+Tm88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVzY3JpcHRpb24iPkRlc2NyaXBjacOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOYW1lIj5Ob21icmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRnVsbCBOYW1lIj5Ob21icmUmIzE2MDtjb21wbGV0bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXF1aXJlZCBmaWVsZHMiPmNhbXBvcyYjMTYwO3JlcXVlcmlkb3M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU2VhcmNoIj5CdXNjYXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSG9tZSI+SW5pY2lvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRpdGxlIj5Uw610dWxvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikxhc3QgbW9kaWZpZWQiPsOabHRpbWEgbW9kaWZpY2FjacOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJPdmVydmlldyI+R2VuZXJhbDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSb2xlIj5Sb2w8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmlldyI+VmVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFzc2V0cyI+QWN0aXZvczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ0cnVlIj5zw608L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmFsc2UiPm5vPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlbmFtZSI+UmVub21icmFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1vZGlmeSI+TW9kaWZpY2FyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvY3VtZW50Ij5Eb2N1bWVudG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGF0ZSI+RmVjaGE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQmFjayI+QXRyw6FzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCI+QcOxYWRpcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDcmVhdGUiPkNyZWFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNyZWF0ZS1kb2N1bWVudCI+Q3JlYXIgZG9jdW1lbnRvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBBcmNoaXZlIj5FbCYjMTYwO0FyY2hpdm88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVHJhc2giPlBhcGVsZXJhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlB1Ymxpc2hlciI+RWRpdG9yPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5hdmlnYXRpb24gVGl0bGUiPlTDrXR1bG8mIzE2MDtkZSYjMTYwO2xhJiMxNjA7TmF2ZWdhY2nDs248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ3JlYXRvciI+QXV0b3I8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTGFuZ3VhZ2UiPklkaW9tYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdWJqZWN0Ij5UZW1hPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJpZ2h0cyI+UGVybWlzb3M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU2VsZWN0IEZpbGUiPlNlbGVjY2lvbmUgZmljaGVybzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzZWxlY3Qtb2JqZWN0Ij5TZWxlY2Npb25lIHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQiPkluc2VydGFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBGaWxlIj5JbnNlcnRhciYjMTYwO2FyY2hpdm88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXBsb2FkLXdpdGgtaW52YWxpZC1leHRlbnNpb24iPkludGVudMOzJiMxNjA7Y2FyZ2FyJiMxNjA7dW4mIzE2MDthcmNoaXZvJiMxNjA7Y29uJiMxNjA7dW5hJiMxNjA7ZXh0ZW5zacOzbiYjMTYwO25vJiMxNjA7dsOhbGlkYS4mIzE2MDtFeHRlbnNpb25lcyYjMTYwO3bDoWxpZGFzJiMxNjA7c29uJiMxNjA7ezB9LiYjMTYwOyBOb3RhOiYjMTYwO0xhcyYjMTYwO2V4dGVuc2lvbmVzJiMxNjA7ZGViZW4mIzE2MDtlc2NyaWJpcnNlJiMxNjA7ZW4mIzE2MDttaW7DunNjdWxhcy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXBsb2FkLXdpdGgtbWlzc2luZy10aXRsZSI+VHJhdMOzJiMxNjA7ZGUmIzE2MDtjYXJnYXImIzE2MDt1biYjMTYwO2FyY2hpdm8mIzE2MDtzaW4mIzE2MDt0w610dWxvLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmaWxlbmFtZS1mb3JtYXQtZXhjZXB0aW9uIj5FbCYjMTYwO25vbWJyZSYjMTYwO2RlbCYjMTYwO2FyY2hpdm8mIzE2MDtxdWUmIzE2MDtlc3TDoSYjMTYwO2ludGVudGFuZG8mIzE2MDtjYXJnYXImIzE2MDtubyYjMTYwO3RpZW5lJiMxNjA7ZXh0ZW5zacOzbiYjMTYwO28mIzE2MDtjb250aWVuZSYjMTYwO2NhcmFjdGVyZXMmIzE2MDtubyYjMTYwO3Blcm1pdGlkb3MsJiMxNjA7dGFsZXMmIzE2MDtjb21vJiMxNjA7c3BhY2lvcyYjMTYwO28mIzE2MDtsZXRyYXMmIzE2MDtjb24mIzE2MDthY2VudG9zLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDcmVhdGlvbiBEYXRlIj5GZWNoYSYjMTYwO2RlJiMxNjA7Y3JlYWNpw7NuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkZpbGUgU2l6ZSI+VGFtYcOxbyYjMTYwO2RlbCYjMTYwO2ZpY2hlcm88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW1hZ2UiPkltYWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMaW5rIj5FbmxhY2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2FwdGlvbiI+U3VidMOtdHVsbzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIZWlnaHQiPkFsdHVyYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXaWR0aCI+QW5jaHVyYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBbGwgcmlnaHRzIHJlc2VydmVkIj5Ub2RvcyBsb3MgZGVyZWNob3MgcmVzZXJ2YWRvcy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic2hvdyI+VmVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImhpZGUiPk9jdWx0YXI8L21lc3NhZ2U+Ci0KLSAgPCEtLSBzdWJtaXQgc2NyZWVuIC0tPgotICA8bWVzc2FnZSBrZXk9InN1Ym1pdC1mb3ItYXBwcm92YWwiPkVudmlhciYjMTYwO3swfSYjMTYwO3BhcmEmIzE2MDtzdSYjMTYwO2Fwcm9iYWNpw7NuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InN1Ym1pdC1mb3ItYXBwcm92YWw/Ij7Cv0Rlc2VhJiMxNjA7ZW52aWFyJiMxNjA7ezB9JiMxNjA7cGFyYSYjMTYwO3N1JiMxNjA7YXByb2JhY2nDs24/PC9tZXNzYWdlPgotCi0gIDwhLS0gcHVibGlzaCBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCI+UHVibGljYXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU291cmNlIEZpbGUocykiPkFyY2hpdm8ocykmIzE2MDtGdWVudGU8L21lc3NhZ2U+Ci0KLSAgPCEtLSBsb2dpbiBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0ibG9naW4tdG8tcHViIj5FbnRyYXImIzE2MDthJiMxNjA7bGEmIzE2MDtwdWJsaWNhY2nDs24mIzE2MDt7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9naW4iPkNvbmV4acOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQYXNzd29yZCI+Q29udHJhc2XDsWE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlcm5hbWUiPk5vbWJyZSYjMTYwO2RlJiMxNjA7dXN1YXJpbzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBdXRoZW50aWNhdGlvbiBmYWlsZWQiPkVycm9yJiMxNjA7ZW4mIzE2MDtsYSYjMTYwO2F1dGVudGlmaWNhY2nDs248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEtYWxpY2UiPlBydWViZSBjb24gdXN1YXJpbyB7MH0geSBjb250cmFzZcOxYSB7MX0gKGVkaXRvcikgbyB1c3VhcmlvIHsyfSB5IGNvbnRyYXNlw7FhIHszfSAocmV2aXNvcik8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEiPlBydWViZSBjb24gdXN1YXJpbyB7MH0geSBjb250cmFzZcOxYSB7MX08L21lc3NhZ2U+Ci0gIAotICA8IS0tIGxvZ291dCBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0ibG9nb3V0LWZyb20tcHViIj5TYWxpciYjMTYwO2RlJiMxNjA7bGEmIzE2MDtQdWJsaWNhY2nDs24mIzE2MDt7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iWW91ciBIaXN0b3J5Ij5TdSYjMTYwO0hpc3RvcmlhbDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2dpbiB0byBBdXRob3JpbmcgQXJlYSI+RW50cmFyJiMxNjA7ZW4mIzE2MDtsYSYjMTYwO1pvbmEmIzE2MDtkZSYjMTYwO0VkaWNpw7NuPC9tZXNzYWdlPgotCi0gIDwhLS0gcmVqZWN0IHNjcmVlbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJSZWplY3QiPlJlY2hhemFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlamVjdC1kb2MiPlJlY2hhemFyIGRvY3VtZW50byB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVqZWN0LWRvYz8iPsK/RGVzZWEgcmVjaGF6YXImIzE2MDtlbCYjMTYwO2RvY3VtZW50byYjMTYwO3swfT88L21lc3NhZ2U+Ci0KLSAgPCEtLSBjbXMgbWVudSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgRG9jdW1lbnQiPk51ZXZvJiMxNjA7ZG9jdW1lbnRvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyAuLi4gRG9jdW1lbnQiPk51ZXZvJiMxNjA7ZG9jdW1lbnRvIHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgTGFuZ3VhZ2UgVmVyc2lvbiI+TnVldmEmIzE2MDt2ZXJzacOzbiYjMTYwO2RlJiMxNjA7aWRpb21hPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlbW92ZSBMYW5ndWFnZSBWZXJzaW9uIj5FbGltaW5hciYjMTYwO3ZlcnNpw7NuJiMxNjA7ZGUmIzE2MDtpZGlvbWE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRmlsZSI+QXJjaGl2bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0Ij5FZGl0YXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV29ya2Zsb3ciPkZsdWpvIGRlIHRyYWJham88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVhY3RpdmF0ZSI+RGVzYWN0aXZhcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZSI+UHJvZ3JhbWFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNvcHkiPkNvcGlhcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQYXN0ZSI+UGVnYXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ3V0Ij5Db3J0YXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSGVscCI+QXl1ZGE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVidWciPkRlcHVyYXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIj5Cb3JyYXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXJjaGl2ZSI+QXJjaGl2YXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVzdG9yZSI+UmVjdXBlcmFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1vdmUgVXAiPlN1YmlyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1vdmUgRG93biI+QmFqYXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9nb3V0Ij5TYWxpcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWaWV3IFRhc2sgTG9ncyI+VmVyJiMxNjA7Yml0w6Fjb3JhJiMxNjA7ZGUmIzE2MDt0YXJlYXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3VwcG9ydCI+U29wb3J0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTeXN0ZW0gRG9jdW1lbnRhdGlvbiI+RG9jdW1lbnRhY2nDs24mIzE2MDtkZWwmIzE2MDtzaXN0ZW1hPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgRG9jdW1lbnRhdGlvbiI+RG9jdW1lbnRhY2nDs24mIzE2MDtkZSYjMTYwO3VzdWFyaW88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWJvdXQgQXBhY2hlIExlbnlhIj5BY2VyY2EmIzE2MDtkZSYjMTYwO0FwYWNoZSYjMTYwO0xlbnlhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFwYWNoZSBMZW55YSBIb21lcGFnZSI+UMOhZ2luYSYjMTYwO3ByaW5jaXBhbCYjMTYwO2RlJiMxNjA7QXBhY2hlJiMxNjA7TGVueWE8L21lc3NhZ2U+Ci0gPG1lc3NhZ2Uga2V5PSJFZGl0IHdpdGggS3VwdSI+Ci0gICAgPHhodG1sOmFiYnIgdGl0bGU9IldoYXQmIzE2MDtZb3UmIzE2MDtTZWUmIzE2MDtJcyYjMTYwO1doYXQmIzE2MDtZb3UmIzE2MDtHZXQiPldZU0lXWUc8L3hodG1sOmFiYnI+JiMxNjA7RWRpdG9yJiMxNjA7KEt1cHUpCi0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IHdpdGggQlhFIj4KLSAgICA8eGh0bWw6YWJiciB0aXRsZT0iV2hhdCYjMTYwO1lvdSYjMTYwO1NlZSYjMTYwO0lzJiMxNjA7V2hhdCYjMTYwO1lvdSYjMTYwO0dldCI+V1lTSVdZRzwveGh0bWw6YWJicj4mIzE2MDtFZGl0b3ImIzE2MDsoQlhFKQotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIG9uZSBGb3JtIj5FZGl0YXImIzE2MDtjb24mIzE2MDtmb3JtdWxhcmlvJiMxNjA7w5puaWNvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgd2l0aCBGb3JtcyI+RWRpdGFyJiMxNjA7Y29uJiMxNjA7Zm9ybXVsYXJpb3M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBNZXRhZGF0YSI+RWRpdGFyJiMxNjA7TWV0YWRhdG9zPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTmF2aWdhdGlvbiBUaXRsZSI+RWRpdGFyJiMxNjA7dMOtdHVsbyYjMTYwO2RlJiMxNjA7bmF2ZWdhY2nDs248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmlzaWJsZSBpbiBOYXZpZ2F0aW9uIj5WaXNpYmxlJiMxNjA7ZW4mIzE2MDtsYSYjMTYwO05hdmVnYWNpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIFVSTCI+UmVub21icmFyJiMxNjA7VVJMPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvd25sb2FkIE9EVCI+RGVzY2FyZ2FyJiMxNjA7IERvY3VtZW50byBPcGVuT2ZmaWNlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVwbG9hZCBPRFQiPkVudmlhciYjMTYwO0RvY3VtZW50byBPcGVuT2ZmaWNlPC9tZXNzYWdlPgotCi0KLSAgPCEtLSBjbXMgdGFicyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJTZXJ2ZXIgVGltZSI+SG9yYSYjMTYwO2RlbCYjMTYwO3NlcnZpZG9yPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldvcmtmbG93IFN0YXRlIj5Fc3RhZG8mIzE2MDtkZWwmIzE2MDtmbHVqbyBkZSB0cmFiYWpvPC9tZXNzYWdlPgotCi0gIDwhLS0gQWRtaW5pc3RyYXRpb24gdGFiIC0tPgotICA8bWVzc2FnZSBrZXk9IkFkbWluaXN0cmF0aW9uIj5BZG1pbmlzdHJhY2nDs248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVhbGx5LWRlbGV0ZT8iPsK/UmVhbG1lbnRlIGRlc2VhIGJvcnJhciYjMTYwO3swfT88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGUgdHJhc2ggPyI+wr9TZWd1cm8mIzE2MDtxdWUmIzE2MDtkZXNlYSYjMTYwO3ZhY2lhciYjMTYwO2xhJiMxNjA7cGFwZWxlcmE/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3QiPsK/Qm9ycmFyJiMxNjA7ezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3Q/Ij4mIzE5MTtSZWFsbWVudGUgcXVpZXJlIGJvcnJhciB7MH0/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhc3N3ZCI+Q29udHJhc2XDsWE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3dpdGNoIFVzZXIiPkNhbWJpYXImIzE2MDt1c3VhcmlvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlbGV0ZSBUcmFzaCI+VmFjaWFyJiMxNjA7cGFwZWxlcmE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29jb29uIGFuZCBTZXJ2ZXIgU3RhdHVzIj5Fc3RhZG8mIzE2MDtkZSYjMTYwO0NvY29vbiYjMTYwO3kmIzE2MDtkZWwmIzE2MDtTZXJ2aWRvcjwvbWVzc2FnZT4KLQotICAgIDwhLS0gR3JvdXAgQWRtaW5pc3RyYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0iUHJvZmlsZSI+UGVyZmlsPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1lbWJlcnMiPk1pZW1icm9zPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlcyI+UmFuZ29zJiMxNjA7ZGUgSVA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBQcm9maWxlIj5FZGl0YXImIzE2MDtQZXJmaWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBNZW1iZXJzIj5FZGl0YXImIzE2MDtNaWVtYnJvczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBBZG1pbmlzdHJhdGlvbiI+QWRtaW5pc3RyYWNpw7NuIGRlIGdydXBvczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgR3JvdXAiPkHDsWFkaXImIzE2MDtHcnVwbzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBEYXRhIj5EYXRvcyYjMTYwO2RlbCYjMTYwO0dydXBvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Imdyb3VwX25vX3N1Y2hfZW50cnkiPkVsIGdydXBvIHswfSBubyBleGlzdGUuPC9tZXNzYWdlPgotCi0gICAgPCEtLSBVc2VyIEFkbWluaXN0cmF0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgRGF0YSI+RGF0b3MmIzE2MDtkZWwmIzE2MDtVc3VhcmlvPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iQ01TIFVzZXIgSUQiPklEJiMxNjA7ZGVsJiMxNjA7VXN1YXJpbyYjMTYwO2RlJiMxNjA7Q01TPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkxEQVAgSUQiPklEJiMxNjA7TERBUDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDb25maXJtIHBhc3N3b3JkIj5Db25maXJtZSYjMTYwO2NvbnRyYXNlw7FhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCBVc2VyIj5Bw7FhZGlyIFVzdWFyaW88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBBZG1pbmlzdHJhdGlvbiI+QWRtaW5pc3RyYWNpw7NuIGRlbCBVc3VhcmlvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgRGV0YWlscyI+RGV0YWxsZXMgZGVsIFVzdWFyaW88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWxsIEdyb3VwcyI+VG9kb3MgbG9zIEdydXBvczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIEdyb3VwcyI+R3J1cG9zIGRlbCBVc3VhcmlvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIEFmZmlsaWF0aW9uIj5BZmlsaWFjacOzbiBhIHVuIEdydXBvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNoYW5nZSBQYXNzd29yZCI+Q2FtYmlhciBDb250cmFzZcOxYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IEdyb3VwIEFmZmlsaWF0aW9uIj5FZGl0YXIgQWZpbGlhY2nDs24gZGUgR3J1cG88L21lc3NhZ2U+Ci0gPG1lc3NhZ2Uga2V5PSJ1c2VyX25vX3N1Y2hfdXNlciI+RWwgdXN1YXJpbyB7MH0gbm8gZXhpc3RlLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZGFwX25vX3N1Y2hfdXNlciI+RWwgdXN1YXJpbyB7MH0gbm8gZXhpc3RlIGVuIGVsIGRpcmVjdG9yaW8gTERBUC48L21lc3NhZ2U+Ci0KLSAgICA8IS0tIFVzZXIgVHlwZXMgLS0+Ci0gIDxtZXNzYWdlIGtleT0iTERBUCBVc2VyIj5Vc3VhcmlvIExEQVA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9jYWwgVXNlciI+VXN1YXJpbyBDTVM8L21lc3NhZ2U+Ci0KLSAgICA8IS0tIFJvbGUgQWRtaW5pc3RyYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0icm9sZV9ub19zdWNoX3JvbGUiPk5vIGV4aXN0ZSBlbCByb2wgezB9LjwvbWVzc2FnZT4KLQotICAgIDwhLS0gSVAgUmFuZ2UgQWRtaW5pc3RyYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UiPlJhbmdvJiMxNjA7ZGUgSVA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgSUQiPklEJiMxNjA7ZGVsJiMxNjA7cmFuZ28mIzE2MDtkZSBJUDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXR3b3JrIEFkZHJlc3MiPkRpcmVjY2nDs24mIzE2MDtkZSYjMTYwO3JlZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdWJuZXQgTWFzayI+TcOhc2NhcmEmIzE2MDtkZSYjMTYwO2xhJiMxNjA7c3VicmVkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIEFkbWluaXN0cmF0aW9uIj5BZG1pbmlzdHJhY2nDs24mIzE2MDtkZWwmIzE2MDtSYW5nbyYjMTYwO0lQPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCBJUCBSYW5nZSI+QcOxYWRpciYjMTYwO3JhbmdvJiMxNjA7ZGUgSVA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgUHJvZmlsZSI+UGVyZmlsJiMxNjA7ZGVsJiMxNjA7cmFuZ28mIzE2MDtkZSBJUDwvbWVzc2FnZT4KLQotICA8IS0tIFNpdGUgT3ZlcnZpZXcgLS0+Ci0gIDxtZXNzYWdlIGtleT0iZmlsdGVyUmVzb3VyY2VUeXBlIj5UaXBvIGRlIFJlY3Vyc288L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmlsdGVyV29ya2Zsb3dTdGF0ZSI+RXN0YWRvIGRlIGZsdWpvIGRlIHRyYWJham88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmlsdGVyTGFuZ3VhZ2UiPklkaW9tYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmaWx0ZXJMYXN0TW9kaWZpZWQiPlVsdGltYSBtb2RpZmljYWNpw7NuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZpbHRlckRvY3VtZW50SWQiPklkZW50aWZpY2F0aXZvIGRlIGRvY3VtZW50bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJrZXlSZXNvdXJjZVR5cGUiPlRpcG8gZGUgUmVjdXJzbzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJrZXlXb3JrZmxvd1N0YXRlIj5Fc3RhZG8gZGUgZmx1am8gZGUgdHJhYmFqbzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMaXZlIj5FbiBwcm9kdWNjacOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJrZXlMYW5ndWFnZSI+SWRpb21hPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleUxhc3RNb2RpZmllZCI+VWx0aW1hIG1vZGlmaWNhY2nDs248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ia2V5UGF0aCI+SWRlbnRpZmljYXRpdm8gZGUgZG9jdW1lbnRvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleUNoZWNrZWRPdXQiPlJldmlzYWRvIHBvcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVcGRhdGUiPkFjdHVhbGl6YTwvbWVzc2FnZT4KLQotICA8IS0tIFNpdGUgdGFiIChpbmZvIHNjcmVlbnMpIC0tPgotICA8bWVzc2FnZSBrZXk9IkF2YWlsYWJsZSBMYW5ndWFnZXMiPklkaW9tYXMgRGlzcG9uaWJsZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGhpcyBkb2N1bWVudCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgbGFuZ3VhZ2UuIj5Fc3RlIGRvY3VtZW50byBubyBzZSBlbmN1ZW50cmEgZGlzcG9uaWJsZSBlbiBlc3RlIGlkaW9tYS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnQgSUQiPklEIGRlbCBEb2N1bWVudG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmVyc2lvbnMiPlZlcnNpb25lczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTU0wgRW5jcnlwdGlvbiI+Q2lmcmFkbyYjMTYwO1NTTDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSb2xsYmFjayB0byB0aGlzIHZlcnNpb24iPkRlc2hhY2VyIGhhc3RhIGVzdGEgdmVyc2nDs248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQUMgQXJjaGl2ZSI+QXJjaGl2byYjMTYwO0FDPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFDIFRyYXNoIj5QYXBlbGVyYSYjMTYwO0FDPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFDIEF1dGgiPkVkaWNpw7NuJiMxNjA7QUM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQUMgTGl2ZSI+UHJvZHVjY2nDs24mIzE2MDtBQzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZXIiPlBsYW5pZmljYWRvcjwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gc2NyZWVuIGFjdGlvbnMtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgTmF2aWdhdGlvbiBUaXRsZSI+TnVldm8gdMOtdHVsbyBkZSBuYXZlZ2FjacOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUgRG9jdW1lbnQiPlJlbm9tYnJhciBEb2N1bWVudG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IERvY3VtZW50IElEIj5OdWV2byBJRCBkZSBEb2N1bWVudG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gd2hpdGVzcGFjZSwgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzIj5ObyBzZSBwZXJtaXRlbiBlc3BhY2lvcyBlbiBibGFuY28gbmkgY2FyYWN0ZXJlcyBlc3BlY2lhbGVzPC9tZXNzYWdlPgotCi0gIDwhLS0gU2NoZWR1bGVyIC0tPgotICA8bWVzc2FnZSBrZXk9Ik5vIGFjdGl2ZSBqb2JzIj5ObyBoYXkgdGFyZWFzIGFjdGl2YXMuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBqb2IgZGF0ZSBoYXMgZXhwaXJlZCI+TGEgZmVjaGEgZGUgbGEgdGFyZWEgaGEgZXhwaXJhZG8uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNoZWNrIHRoZSBsb2cgZmlsZXMiPmNvbXBydWViZSBsb3MgYXJjaGl2b3MgZGUgYml0w6Fjb3JhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRhc2siPlRhcmVhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRheSI+RMOtYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaW1lIj5Ib3JhPC9tZXNzYWdlPgotCi0gIDwhLS0gRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIC0tPgotICA8bWVzc2FnZSBrZXk9ImRvY3MtaGF2ZS1saW5rcy10by1kb2MiPkxvcyBzaWd1aWVudGVzIGRvY3VtZW50b3MgdGllbmVuIGVubGFjZXMgYSBlc3RlIGRvY3VtZW50bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWFjdGl2YXRlIERvY3VtZW50Ij5EZXNhY3RpdmFyIERvY3VtZW50bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkZWFjdGl2YXRlLWRvYyI+RGVzYWN0aXZhciBEb2N1bWVudG8gezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlYWN0aXZhdGUtZG9jPyI+wr9TZWd1cm8gcXVlIGRlc2VhIGRlc2FjdGl2YXIgZWwgZG9jdW1lbnRvIHswfT88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIERvY3VtZW50Ij5Cb3JyYXIgRG9jdW1lbnRvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1kb2MiPkJvcnJhciBEb2N1bWVudG8gezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNhbm5vdC1kZWFjdGl2YXRlLXVubGVzcy1jaGlsZHJlbi1kZWFjdGl2YXRlZCI+Tm8gc2UgcHVlZGUgZGVzYWN0aXZhciBlc3RlIGRvY3VtZW50byBhIG1lbm9zIHF1ZSBsb3MgZG9jdW1lbnRvcyBoaWpvcyBzaWd1aWVudGVzIHNlYW4gZGVzYWN0aXZhZG9zPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1sYW5ndWFnZS12ZXJzaW9ucz8iPsK/RGVzZWEgcmVhbG1lbnRlIGJvcnJhciB0b2RhcyBsYXMgdmVyc2lvbmVzIGVuIGRpZmVyZW50ZXMgaWRpb21hIHMgZGVsIGRvY3VtZW50byB7MH0/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1kb2MtbGl2ZSI+Tm8gcHVlZG8gYm9ycmFyIGVsIGRvY3VtZW50byB7MH0gcG9ycXVlIGVzdMOhIGVuIHByb2R1Y2Npw7NuITwvbWVzc2FnZT4KLQotICAgICAgPCEtLSBBcmNoaXZlIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IkFyY2hpdmUgRG9jdW1lbnQiPkFyY2hpdmFyIERvY3VtZW50bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYyI+QXJjaGl2YXIgZG9jdW1lbnRvIHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYz8iPsK/UXVpZXJlIHJlYWxtZW50ZSBhcmNoaXZhciBlbCBkb2N1bWVudG8gezB9PzwvbWVzc2FnZT4KLSAgICAgIDwhLS0gUmVuYW1lIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+UmVub21icmFyIERvY3VtZW50bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZW5hbWUtZG9jIj5SZW5vbWJyYXIgRG9jdW1lbnRvIHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZW5hbWUtbGFiZWwtZG9jIj5DYW1iaWFyIGVsIHTDrXR1bG8gZGUgbmF2ZWdhY2nDs24gZGVsIGRvY3VtZW50byB7MH08L21lc3NhZ2U+Ci0gICAgICA8IS0tIENvcHkgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQ29weSBEb2N1bWVudCI+Q29waWFyIERvY3VtZW50bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjb3B5LWRvYy10by1jbGlwPyI+wr9TZWd1cm8gcXVlIGRlc2VhIGNvcGlhciBlbCBkb2N1bWVudG8gPHhodG1sOnE+ezB9PC94aHRtbDpxPiBhbCBwb3J0YXBhcGVsZXM/IE3DoXMgdGFyZGUgcHVlZGUgcGVnYXIgZWwgZG9jdW1lbnRvIGVuIGVsIGx1Z2FyIHF1ZSBlbGlqYS48L21lc3NhZ2U+Ci0gICAgICA8IS0tIFBhc3RlIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlBhc3RlIERvY3VtZW50Ij5QZWdhciBEb2N1bWVudG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icGFzdGUtZG9jLWZyb20tY2xpcD8iPsK/U2VndXJvIHF1ZSBkZXNlYSBwZWdhciBlbCBkb2N1bWVudG8gPHhodG1sOnE+ezB9PC94aHRtbDpxPiBkZXNkZSBlbCBwb3J0YXBhcGVsZXM/PC9tZXNzYWdlPgotCi0gICAgICA8IS0tIEN1dCBkb2N1bWVudCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDdXQgRG9jdW1lbnQiPkNvcnRhciBEb2N1bWVudG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY3V0LWRvYyI+Q29ydGFyIGRvY3VtZW50byB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY3V0LWRvYy10by1jbGlwPyI+wr9TZWd1cm8gcXVlIGRlc2VhIGNvcnRhciBlbCBkb2N1bWVudG8gezB9IHkgbW92ZXJsbyBhbCBwb3J0YXBhcGVsZXM/IE3DoXMgdGFyZGUgcHVlZGUgcGVnYXIgZWwgZG9jdW1lbnRvIGVuIGVsIGx1Z2FyIHF1ZSBlbGlqYS48L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIEFzc2V0IC0tPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBJbWFnZSI+SW5zZXJ0YXIgaW1hZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBBc3NldCI+SW5zZXJ0YXIgYWN0aXZvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFzc2V0IFVwbG9hZCI+Q2FyZ2FyIGFjdGl2bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgYSBuZXcgSW1hZ2UiPkluc2VydGFyIG51ZXZhIGltYWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVcGxvYWQgYW4gQXNzZXQiPkNhcmdhciB1biBhY3Rpdm88L21lc3NhZ2U+Ci0KLSAgPCEtLSBXb3JrZmxvdyAgLS0+Ci0gIDxtZXNzYWdlIGtleT0iVmFsdWUiPlZhbG9yPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkV2ZW50Ij5FdmVudG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmFyaWFibGVzIj5WYXJpYWJsZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSGlzdG9yeSI+SGlzdG9yaWFsPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN0YXRlIj5Fc3RhZG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgQWRkcmVzcyI+RGlyZWNjacOzbiBJUDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlZGl0Ij5lZGl0YXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic3VibWl0Ij5lbnZpYXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVqZWN0Ij5yZWNoYXphcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJwdWJsaXNoIj5wdWJsaWNhcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci13b3JrZmxvdy1kb2N1bWVudCI+RWwgZXZlbnRvICB7MH0gbm8gZXMgZWplY3V0YWJsZSBlbiBlbCBkb2N1bWVudG8gInsxfSI8L21lc3NhZ2U+Ci0KLSAgPCEtLSBOb3RpZmljYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0ibm90aWZpY2F0aW9uLW1lc3NhZ2UiPk5vdGlmaWNhY2nDs248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm90aWZ5LXN1Ym1pdHRlciI+bm90aWZpY2FyIGFsIHJlbWl0ZW50ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2N1bWVudC1wdWJsaXNoZWQiPlNlIGhhIHB1YmxpY2FkbyB1biBkb2N1bWVudG8gcmVtaXRpZG8gcG9yIHVzdGVkOiB7MH08L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIGFzc2V0ICAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgQXNzZXQiPk51ZXZvIGFjdGl2bzwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gbWV0YSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDdXN0b20gbWV0YWRhdGEiPk1ldGFkYXRvcyBwZXJzb25hbGl6YWRvczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTaG93IGN1c3RvbSBtZXRhZGF0YSI+TXVlc3RyYSBtZXRhZGF0b3MgcGVyc29uYWxpemFkb3M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSGlkZSBjdXN0b20gbWV0YWRhdGEiPk9jdWx0YSBtZXRhZGF0b3MgcGVyc29uYWxpemFkb3M8L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIFJDICAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDdXJyZW50IFZlcnNpb24iPlZlcnNpw7NuIEFjdHVhbDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSb2xsYmFjayB0byB0aGlzIHJldmlzaW9uIj5EZXNoYWNlciBoYXN0YSBlc3RhIHJldmlzacOzbjwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gQUMgIC0tPgotICA8bWVzc2FnZSBrZXk9IlNTTCBFbmNyeXB0aW9uIj5DaWZyYWRvJiMxNjA7U1NMPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFjY2VzcyBPYmplY3QiPkFjY2VkZXImIzE2MDthbCYjMTYwO09iamVjdG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idmlzaXQiPnZpc2l0YW50ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXZpZXdlciI+cmV2aXNvcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlZGl0b3IiPmVkaXRvcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhZG1pbiI+YWRtaW5pc3RyYWRvcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ3b3JsZCI+dG9kb3M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idGhlIHdvcmxkIj50b2RvczwvbWVzc2FnZT4KLQotICA8IS0tIFNjaGVkdWxlciAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgam9iIj5OdWV2YSB0YXJlYTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBY3RpdmUgam9icyI+VGFyZWFzIGFjdGl2YXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCBhbmQgRXhwb3J0Ij5QdWJsaWNhciYjMTYwO3kmIzE2MDtleHBvcnRhcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2MtaGFzLWxpbmtzLXRvLXVucHVibGlzaGVkIj5Fc3RlIGRvY3VtZW50byB0aWVuZSBlbmxhY2VzIGEgbG9zIHNpZ3VpZW50ZXMgZG9jdW1lbnRvcyBzaW4gcHVibGljYXI6PC9tZXNzYWdlPgotCi0gIDwhLS0gTmV3IERvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlBsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGNhdXNlcyBvZiB0aGUgZXhjZXB0aW9uIj5Qb3IgZmF2b3IsIGNvbXBydWViZSBsYXMgc2lndWllbnRlcyBwb3NpYmxlcyBjYXVzYXMgZGUgbGEgZXhjZXBjacOzbi48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXhjZXB0aW9uLmNhdXNlLmNyZWF0ZWRvYy53aGl0ZXNwYWNlLWluLWlkIj5ObyBzZSBwZXJtaXRlbiBlc3BhY2lvcyBlbiBibGFuY28gZW4gZWwgSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXhjZXB0aW9uLmNhdXNlLmNyZWF0ZWRvYy5pZC1pbi11c2UiPkVsIElEIHlhIGVzdMOhIHNpZW5kbyB1dGlsaXphZG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmFpbG1lc3NhZ2UuY3JlYXRlZG9jLmludmFsaWRmb3JtYXQiPlBvciBmYXZvciwgaW50cm9kdWNlIHVuIHZhbG9yIHbDoWxpZG8gZW4gZWwgY2FtcG8gSUQuIEEtWiwgYS16LCAwLTkgbyAtIHNvbiBjYXJhY3RlcmVzIHbDoWxpZG9zLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmYWlsbWVzc2FnZS5jcmVhdGVkb2MucmVxdWlyZWQiPlBvciBmYXZvciwgaW50cm9kdXpjYSB0b2RvcyBsb3MgdmFsb3JlcyBvYmxpZ2F0b3Jpb3MgKCopLjwvbWVzc2FnZT4KLQotICA8IS0tIEFzc2V0IFVwbG9hZC9JbnNlcnQgRGlhbG9nIC0tPgotICA8bWVzc2FnZSBrZXk9IkFkZCB0byBBc3NldCBMaWJyYXJ5Ij5Bw7FhZGlyIGxpYnJlcsOtYSBkZSBhY3Rpdm9zPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFzc2V0IExpYnJhcnkiPkxpYnJlciYjMjM3O2EgZGUgYWN0aXZvczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyBhc3NldHMgYXZhaWxhYmxlIj5ObyBoYXkgYWN0aXZvcyBkaXNwb25pYmxlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgQXNzZXQiPkluc2VydGFyIGFjdGl2bzwvbWVzc2FnZT4KLQotICAgIDwhLS0gSW1hZ2UgVXBsb2FkL0luc2VydCBEaWFsb2cgLS0+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuaW1hZ2V1cGxvYWQudGl0bGUiPkluc2VydGFyIGltYWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5zZWxlY3RpbWFnZS5sYWJlbCI+RWxlZ2lyIEltYWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5pbmZvLm5vaW1hZ2VzIj5ObyBoYXkgaW3DoWdlbmVzIGRpc3BvbmlibGVzLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5saW5rcy5oaW50Ij5Mb3MgZW5sYWNlcyBleHRlcm5vcyBkZWJlbiBjb21lbnphciBjb24gJ2h0dHA6Ly8nLCBsb3MgZW5sYWNlcyBpbnRlcm5vcyBkZWJlbiBjb21lbnphciBjb24gJy8nPC9tZXNzYWdlPgotCi0gIDwhLS0gUmV2aXNpb24gQ29udHJvbGxlciAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJSZWFzb24iPlJhesOzbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlbmFtZSI+Tm9tYnJlIGRlIGFyY2hpdm88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEucmMubm9jaGVja291dCI+Tm8gc2UgcHVlZGUgb2J0ZW5lciBlbCByZWN1cnNvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLmNoZWNrZWRvdXRhbHJlYWR5Ij5PdHJvIHVzdWFyaW8gZXN0w6EgdHJhYmFqYW5kbyBlbiBlbCByZWN1cnNvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tpbiI+Tm8gc2UgcHVlZGUgZW52aWFyIGVsIHJlY3Vyc288L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR2VuZXJpYyBFeGNlcHRpb24iPkV4Y2VwY2nDs24gR2Vuw6lyaWNhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNoZWNrIHRoZSBsb2cgZmlsZXMuIj5SZXZpc2UgbG9zIGFyY2hpdm9zIGRlIGJpdMOhY29yYS48L21lc3NhZ2U+Ci0KLSAgPCEtLSBFcnJvciBtZXNzYWdlcyBvZiBhIGdlbmVyYWwgbmF0dXJlIC0tPgotICA8bWVzc2FnZSBrZXk9ImVycm9yLWRvY3VtZW50LWZvcm0iPkVsIGRvY3VtZW50byBubyBlc3TDoSBiaWVuIGZvcm1hZG86IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci12YWxpZGF0aW9uIj5MYSB2YWxpZGFjacOzbiBkZWwgZXNxdWVtYSBmYWxsw7M6IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci1taXNzaW5nLWxhbmd1YWdlIj5FbCBkb2N1bWVudG8gc29saWNpdGFkbyBubyBlc3TDoSBkaXNwb25pYmxlIHBhcmEgZWwgaWRpb21hOiB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItZG9jdW1lbnQtZXhpc3RhbmNlIj5FbCBkb2N1bWVudG8gc29saWNpdGFkbyB7MH0gY29uIGRvY3VtZW50by1pZCB7MX0gbm8gZXhpc3RlLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci1nZW5lcmljIj5PY3VycmnDsyB1biBlcnJvci48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItNDA0Ij40MDQ6IFDDoWdpbmEgbm8gZW5jb250cmFkYTwvbWVzc2FnZT4KLSAgPCEtLS5vZHQudXBsb2FkIC0tPgotICA8bWVzc2FnZSBrZXk9IlVwbG9hZCBvZHQiPkVudmlhciBEb2N1bWVudG8gT3Blbk9mZmljZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIRUFEU1VQOiI+QXRlbmNpw7NuOjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgZXhpc3RpbmcgZG9jdW1lbnQgd2lsbCBiZSBvdmVyd3JpdHRlbiEiPkVsIGRvY3VtZW50byBleGlzdGVudGUgc2Vyw6Egc29icmVzY3JpdG88L21lc3NhZ2U+Ci0KLTwvY2F0YWxvZ3VlPgotCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2ZyLnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZnIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRkODhjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfZnIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gCi0JJElkJCAKLQlAdHJhbnNsYXRvcnMgT2xpdmllciBMYW5nZSA8d2lyZSBhdCBwZXRpdC1hdGVsaWVyIGRvdCBjaD4KLQktLT4KLQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0iZnIiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLQotICA8IS0tIGNvbW1vbiB1c2VkIHdvcmRzIC0tPgotICA8bWVzc2FnZSBrZXk9IlNhdmUiPkVucmVnaXN0cmVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1Ym1pdCI+U291bWV0dHJlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNhbmNlbCI+QW5udWxlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUiPlN1cHByaW1lcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOT1RFIj5Ob3RlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5vIHJlZmVyZXIiPlBhcyBkZSByw6lmw6lyZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlZmVyZXIiPlLDqWbDqXJlbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRVhDRVBUSU9OIj5FWENFUFRJT048L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciI+VXRpbGlzYXRldXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTGl2ZSI+RW4gbGlnbmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGl2ZSI+ZW4gbGlnbmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibm90Ij5wYXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYXV0aG9yaW5nIj5yw6lkYWN0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkF1dGhvcmluZyI+UsOpZGFjdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXZpZXciPnLDqXZpc2VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVzZXIiPnV0aWxpc2F0ZXVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXJzIj5VdGlsaXNhdGV1cnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZ3JvdXAiPmdyb3VwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCI+R3JvdXBlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwcyI+R3JvdXBlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBJRCI+SUQgR3JvdXBlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlllcyI+T3VpPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5vIj5Ob248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVzY3JpcHRpb24iPkRlc2NyaXB0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5hbWUiPk5vbTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGdWxsIE5hbWUiPk5vbSBjb21wbGV0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlcXVpcmVkIGZpZWxkcyI+Q2hhbXBzIG9ibGlnYXRvaXJlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTZWFyY2giPlJlY2hlcmNoZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSG9tZSI+QWNjdWVpbDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaXRsZSI+VGl0cmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTGFzdCBtb2RpZmllZCI+RGVybmnDqHJlJiMxNjA7bWlzZSYjMTYwO8OgJiMxNjA7am91cjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJPdmVydmlldyI+UsOpc3Vtw6k8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sZSI+UiYjMjQ0O2xlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZpZXciPlZ1ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBc3NldHMiPkFjdGlmczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ0cnVlIj5vdWk8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmFsc2UiPm5vbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUiPlJlbm9tbWVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1vZGlmeSI+TW9kaWZpZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnQiPkRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRhdGUiPkRhdGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQmFjayI+UmV0b3VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCI+QWpvdXRlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDcmVhdGUiPkNyw6llcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGUgQXJjaGl2ZSI+QXJjaGl2ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUcmFzaCI+Q29yYmVpbGxlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlB1Ymxpc2hlciI+RWRpdGV1cjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOYXZpZ2F0aW9uIFRpdGxlIj5UaXRyZSBuYXZpZ2F0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0b3IiPkNyw6lhdGV1cjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMYW5ndWFnZSI+TGFuZ3VlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1YmplY3QiPlN1amV0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJpZ2h0cyI+RHJvaXRzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNlbGVjdCBGaWxlIj5Tw6lsZWN0aW9ubmV6IHVuIGZpY2hpZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic2VsZWN0LW9iamVjdCI+U8OpbGVjdGlvbm5leiB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0Ij5JbnPDqXJlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgRmlsZSI+SW5zw6lyZXIgdW4gZmljaGllcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ1cGxvYWQtd2l0aC1pbnZhbGlkLWV4dGVuc2lvbiI+Vm91cyBhdmV6IHRlbnTDqSBkZSBjaGFyZ2VyIHVuIGZpY2hpZXIgYXZlYyB1bmUgZXh0ZW5zaW9uIGludmFsaWRlLiBMZXMgZXh0ZW5zaW9ucyB2YWxpZGVzIHNvbnR7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmlsZW5hbWUtZm9ybWF0LWV4Y2VwdGlvbiI+TGUgbm9tIGR1IGZpY2hpZXIgcXVlIHZvdXMgdGVudGV6IGRlIGNoYXJnZXIgbidhIHNvaXQgcGFzIGQnZXh0ZW5zaW9uLCBzb2l0IGNvbnRpZW50IGRlcyBjYXJhY3TDqHJlcyBxdWkgbmUgc29udCBwYXMgYXV0b3Jpc8OpcywgdGVscyBxdWUgZGVzIGVzcGFjZXMgb3UgZGVzIGNhcmFjdMOocmVzIGFjY2VudHXDqXMuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0aW9uIERhdGUiPkRhdGUgZGUgY3LDqWF0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkZpbGUgU2l6ZSI+VGFpbGxlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkltYWdlIj5JbWFnZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMaW5rIj5MaWVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNhcHRpb24iPkzDqWdlbmRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkhlaWdodCI+SGF1dGV1cjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXaWR0aCI+TGFyZ2V1cjwvbWVzc2FnZT4KLQotICA8IS0tIHN1Ym1pdCBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0ic3VibWl0LWZvci1hcHByb3ZhbCI+U291bWV0dHJlIHswfSBwb3VyIGFwcHJvYmF0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InN1Ym1pdC1mb3ItYXBwcm92YWw/Ij5Wb3VsZXotdm91cyBzb3VtZXR0cmUgezB9IHBvdXIgYXBwcm9iYXRpb24/PC9tZXNzYWdlPgotCi0gIDwhLS0gcHVibGlzaCBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCI+UHVibGllcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTb3VyY2UgRmlsZShzKSI+RmljaGllcihzKSBzb3VyY2Uocyk8L21lc3NhZ2U+Ci0KLSAgPCEtLSBsb2dpbiBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0ibG9naW4tdG8tcHViIj5DT05ORVhJT04gw6AgbGEgcHVibGljYXRpb24gezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkxvZ2luIj5TZSBjb25uZWN0ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGFzc3dvcmQiPk1vdCBkZSBwYXNzZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VybmFtZSI+VXRpbGlzYXRldXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXV0aGVudGljYXRpb24gZmFpbGVkIj5MJ2F1dGhlbnRpZmljYXRpb24gYSDDqWNob3XDqTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ0cnktdXNlci1sZW55YSI+RXNzYXlleiBsJ3V0aWxpc2F0ZXVyIHswfSBldCBsZSBtb3QgZGUgcGFzc2UgezF9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InRyeS11c2VyLWxlbnlhLWFsaWNlIj5Fc3NheWV6IGwndXRpbGlzYXRldXIgezB9IGV0IGxlIG1vdCBkZSBwYXNzZSB7MX0gKMOpZGl0ZXVyKSBvdSBsJ3V0aWxpc2F0ZXVyIHsyfSBldCBsZSBtb3QgZGUgcGFzc2UgezN9IChyw6l2aXNldXIpPC9tZXNzYWdlPgotICAKLSAgPCEtLSBsb2dvdXQgc2NyZWVuIC0tPgotICA8bWVzc2FnZSBrZXk9ImxvZ291dC1mcm9tLXB1YiI+REVDT05ORVhJT04gZGUgbGEgcHVibGljYXRpb24gezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IllvdXIgSGlzdG9yeSI+Vm90cmUgaGlzdG9yaXF1ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2dpbiB0byBBdXRob3JpbmcgQXJlYSI+U2UgY29ubmVjdGVyIMOgIGwnZXNwYWNlIGRlIHLDqWRhY3Rpb248L21lc3NhZ2U+Ci0KLSAgPCEtLSByZWplY3Qgc2NyZWVuIC0tPgotICA8bWVzc2FnZSBrZXk9IlJlamVjdCI+UmVqZXRlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWplY3QtZG9jPyI+Vm91bGV6LXZvdXMgcmVqZXRlciBsZSBkb2N1bWVudCB7MH0/PC9tZXNzYWdlPgotCi0gIDwhLS0gY21zIG1lbnUgLS0+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IERvY3VtZW50Ij5Ob3V2ZWF1IGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyAuLi4gRG9jdW1lbnQiPk5vdXZlYXUgZG9jdW1lbnQgezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBMYW5ndWFnZSBWZXJzaW9uIj5Ob3V2ZWxsZSB0cmFkdWN0aW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlbW92ZSBMYW5ndWFnZSBWZXJzaW9uIj5TdXBwcmltZXIgbGEgdHJhZHVjdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlIj5GaWNoaWVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQiPkVkaXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV29ya2Zsb3ciPldvcmtmbG93PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlYWN0aXZhdGUiPkTDqXNhY3RpdmVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNjaGVkdWxlIj5BZ2VuZGVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNvcHkiPkNvcGllcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQYXN0ZSI+Q29sbGVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkN1dCI+Q291cGVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkhlbHAiPkFpZGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVidWciPkTDqWJvZ2FnZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUiPkVmZmFjZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXJjaGl2ZSI+QXJjaGl2ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVzdG9yZSI+UmVzdGF1cmVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1vdmUgVXAiPkTDqXBsYWNlciB2ZXJzIGxlIGhhdXQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW92ZSBEb3duIj5Ew6lwbGFjZXIgdmVycyBsZSBiYXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9nb3V0Ij5TZSBkw6ljb25uZWN0ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmlldyBUYXNrIExvZ3MiPkNvbnN1bHRlciBsZSBqb3VybmFsPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1cHBvcnQiPlN1cHBvcnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3lzdGVtIERvY3VtZW50YXRpb24iPkRvY3VtZW50YXRpb24gc3lzdMOobWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBEb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uIHV0aWxpc2F0ZXVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFib3V0IEFwYWNoZSBMZW55YSI+QSBwcm9wb3MgZGUgQXBhY2hlIExlbnlhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFwYWNoZSBMZW55YSBIb21lcGFnZSI+QWNjdWVpbCBkZSBBcGFjaGUgTGVueWE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIEt1cHUiPlLDqWRhY3RldXImIzE2MDs8eGh0bWw6YWJicgotICAgIHRpdGxlPSJXaGF0JiMxNjA7WW91JiMxNjA7U2VlJiMxNjA7SXMmIzE2MDtXaGF0JiMxNjA7WW91JiMxNjA7R2V0Ij5XWVNJV1lHPC94aHRtbDphYmJyPiYjMTYwOyhLdXB1KQotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIEJYRSI+UsOpZGFjdGV1ciYjMTYwOzx4aHRtbDphYmJyCi0gICAgdGl0bGU9IldoYXQmIzE2MDtZb3UmIzE2MDtTZWUmIzE2MDtJcyYjMTYwO1doYXQmIzE2MDtZb3UmIzE2MDtHZXQiPldZU0lXWUc8L3hodG1sOmFiYnI+JiMxNjA7KEJYRSkKLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgd2l0aCBvbmUgRm9ybSI+UsOpZGFjdGV1ciYjMTYwO0RlJiMxNjA7U291cmNlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgd2l0aCBGb3JtcyI+UsOpZGFjdGV1ciYjMTYwO0RlJiMxNjA7Rm9ybWVzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTWV0YWRhdGEiPkVkaXRlciYjMTYwO2xlcyYjMTYwO23DqXRhLWRvbm7DqWVzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTmF2aWdhdGlvbiBUaXRsZSI+RWRpdGVyJiMxNjA7bGUmIzE2MDt0aXRyZSYjMTYwO2RlJiMxNjA7bmF2aWdhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUgVVJMIj5SZW5vbW1lciYjMTYwO1VSTDwvbWVzc2FnZT4KLQotICA8IS0tIGNtcyB0YWJzIC0tPgotICA8bWVzc2FnZSBrZXk9IlNlcnZlciBUaW1lIj5Ib3JvZGF0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXb3JrZmxvdyBTdGF0ZSI+U3RhdHV0PC9tZXNzYWdlPgotCi0gIDwhLS0gQWRtaW5pc3RyYXRpb24gdGFiIC0tPgotICA8bWVzc2FnZSBrZXk9IkFkbWluaXN0cmF0aW9uIj5BZG1pbmlzdHJhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWFsbHktZGVsZXRlPyI+RWZmYWNlciB7MH0/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhlIHRyYXNoID8iPlZvdWxlei12b3VzIHZyYWltZW50IHZpZGVyIGxhIGNvcmJlaWxsZSA/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3QiPkVmZmFjZXIgezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3Q/Ij5Wb3VsZXotdm91cyB2cmFpbWVudCBlZmZhY2VyIHswfT88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGFzc3dkIj5Nb3QgZGUgcGFzc2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3dpdGNoIFVzZXIiPkNoYW5nZXIgZCd1dGlsaXNhdGV1cjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUgVHJhc2giPlZpZGVyIGxhIGNvcmJlaWxsZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDb2Nvb24gYW5kIFNlcnZlciBTdGF0dXMiPlN0YXR1dCBkdSBzZXJ2ZXVyIGV0JiMxNjA7ZGUmIzE2MDtDb2Nvb248L21lc3NhZ2U+Ci0KLSAgICA8IS0tIEdyb3VwIEFkbWluaXN0cmF0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IlByb2ZpbGUiPlByb2ZpbDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNZW1iZXJzIj5NZW1icmVzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlcyI+UGxhZ2VzJiMxNjA7SVA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgR3JvdXBzIj5Hcm91cGVzIGRlIHBsYWdlcyYjMTYwO0lQPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgUHJvZmlsZSI+RWRpdGVyIGxlIHByb2ZpbDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IE1lbWJlcnMiPkVkaXRlciBsZXMgbWVtYnJlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBBZG1pbmlzdHJhdGlvbiI+QWRtaW5pc3RyYXRpb24gZGVzIGdyb3VwZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWRkIEdyb3VwIj5Bam91dGVyIHVuIGdyb3VwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBEYXRhIj5Ew6l0YWlsIGR1IGdyb3VwZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJncm91cF9ub19zdWNoX2VudHJ5Ij5MZSBncm91cGUgezB9IG4nZXhpc3RlIHBhcy48L21lc3NhZ2U+Ci0KLSAgICA8IS0tIFVzZXIgQWRtaW5pc3RyYXRpb24gLS0+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBEYXRhIj5Ew6l0YWlsJiMxNjA7ZGUmIzE2MDtsJ3V0aWxpc2F0ZXVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgSUQiPklEJiMxNjA7dXRpbGlzYXRldXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ01TIFVzZXIgSUQiPklEJiMxNjA7dXRpbGlzYXRldXImIzE2MDtDTVM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTERBUCBJRCI+SUQmIzE2MDtMREFQPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNvbmZpcm0gcGFzc3dvcmQiPkNvbmZpcm1leiYjMTYwO2xlJiMxNjA7bW90JiMxNjA7ZGUmIzE2MDtwYXNzZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgVXNlciI+Tm91dmVsIHV0aWxpc2F0ZXVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgQWRtaW5pc3RyYXRpb24iPkFkbWluaXN0cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBEZXRhaWxzIj5Ew6l0YWlsIGRlcyB1dGlsaXNhdGV1cnM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWxsIEdyb3VwcyI+VG91cyBsZXMgZ3JvdXBlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIEdyb3VwcyI+R3JvdXBlcyBkJ3V0aWxpc2F0ZXVyczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBBZmZpbGlhdGlvbiI+QWZmaWxpYXRpb24gYXV4IGdyb3VwZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2hhbmdlIFBhc3N3b3JkIj5DaGFuZ2VyIGxlIG1vdCBkZSBwYXNzZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IEdyb3VwIEFmZmlsaWF0aW9uIj5FZGl0ZXIgbCdhZmZpbGlhdGlvbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ1c2VyX25vX3N1Y2hfdXNlciI+TCd1dGlsaXNhdGV1ciB7MH0gbidleGlzdGUgcGFzLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZGFwX25vX3N1Y2hfdXNlciI+TCd1dGlsaXNhdGV1ciB7MH0gbmUgZmlndXJlIHBhcyBkYW5zIGwnYW5udWFpcmUgTERBUC48L21lc3NhZ2U+Ci0KLSAgICA8IS0tIElQIFJhbmdlIEFkbWluaXN0cmF0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIj5QbGFnZSYjMTYwO0lQPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIElEIj5JRCYjMTYwO2RlJiMxNjA7cGxhZ2UmIzE2MDtJUDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXR3b3JrIEFkZHJlc3MiPkFkcmVzc2UmIzE2MDtyw6lzZWF1PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1Ym5ldCBNYXNrIj5NYXNxdWUmIzE2MDtkZSYjMTYwO3NvdXMtcsOpc2VhdTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSBBZG1pbmlzdHJhdGlvbiI+QWRtaW5pc3RyZXImIzE2MDtwbGFnZSYjMTYwO0lQPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCBJUCBSYW5nZSI+QWpvdXRlciYjMTYwO3VuZSYjMTYwO3BsYWdlJiMxNjA7SVA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgUHJvZmlsZSI+UHJvZmlsJiMxNjA7ZGUmIzE2MDtwbGFnZSYjMTYwO0lQPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iZmlsdGVyUmVzb3VyY2VUeXBlIj5UeXBlIGRlIHJlc291cmNlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZpbHRlcldvcmtmbG93U3RhdGUiPlN0YXR1dDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmaWx0ZXJMYW5ndWFnZSI+TGFuZ3VlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZpbHRlckxhc3RNb2RpZmllZCI+RGVybmnDqHJlJiMxNjA7bWlzZSYjMTYwO8OgJiMxNjA7am91cjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmaWx0ZXJEb2N1bWVudElkIj5JRCBkdSBkb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJrZXlSZXNvdXJjZVR5cGUiPlR5cGUgZGUgcmVzb3VyY2U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ia2V5V29ya2Zsb3dTdGF0ZSI+U3RhdHV0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleUxhbmd1YWdlIj5MYW5ndWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ia2V5TGFzdE1vZGlmaWVkIj5EZXJuacOocmUmIzE2MDttaXNlJiMxNjA7w6AmIzE2MDtqb3VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleVBhdGgiPklEIGR1IGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImtleUNoZWNrZWRPdXQiPkV4dHJhaXQgcGFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVwZGF0ZSI+QWN0dWFsaXNhdGlvbjwvbWVzc2FnZT4KLQotICA8IS0tIFNpdGUgdGFiIChpbmZvIHNjcmVlbnMpIC0tPgotICA8bWVzc2FnZSBrZXk9IkF2YWlsYWJsZSBMYW5ndWFnZXMiPkxhbmd1ZXMgZGlzcG9uaWJsZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGhpcyBkb2N1bWVudCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgbGFuZ3VhZ2UuIj5DZSBkb2N1bWVudCBuJ2VzdCBwYXMgZGlzcG9uaWJsZSBkYW5zIGNldHRlIGxhbmd1ZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnQgSUQiPklEIGR1IGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZlcnNpb25zIj5WZXJzaW9uczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTU0wgRW5jcnlwdGlvbiI+RW5jcnB5dGFnZSYjMTYwO1NTTDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSb2xsYmFjayB0byB0aGlzIHZlcnNpb24iPlJlc3RhdXJlciBjZXR0ZSB2ZXJzaW9uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFDIEFyY2hpdmUiPkFyY2hpdmUmIzE2MDtDQTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBQyBUcmFzaCI+Q29yYmVpbGxlJiMxNjA7Q0E8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQUMgQXV0aCI+Q0EmIzE2MDthdXRoLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBQyBMaXZlIj5DQSYjMTYwO2VuJiMxNjA7bGlnbmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU2NoZWR1bGVyIj5FY2jDqWFuY2llcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNZXRhIj5Nw6l0YTwvbWVzc2FnZT4KLQotICAgIDwhLS0gSW5mbyBzY3JlZW4gYWN0aW9ucy0tPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBOYXZpZ2F0aW9uIFRpdGxlIj5Ob3V2ZWF1IHRpdHJlIGRlIG5hdmlnYXRpb248L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIERvY3VtZW50Ij5SZW5vbW1lciBkb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgRG9jdW1lbnQgSUQiPk5vdXZlbCBJRCBkZSBkb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyB3aGl0ZXNwYWNlLCBubyBzcGVjaWFsIGNoYXJhY3RlcnMiPlBhcyBkJ2VzcGFjZXMsIHBhcyBkZSBjYXJhY3TDqHJlcyBzcMOpY2lhdXg8L21lc3NhZ2U+Ci0gICAgICA8IS0tIFNjaGVkdWxlciAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJObyBhY3RpdmUgam9icyI+UGFzIGRlIHTDomNoZSBhY3RpdmUuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBqb2IgZGF0ZSBoYXMgZXhwaXJlZCI+TGEgZGF0ZSBkZSBsYSB0w6JjaGUgZXN0IMOpY2h1ZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY2hlY2sgdGhlIGxvZyBmaWxlcyI+Q29uc3VsdGV6IGxlcyBqb3VybmF1eCBkJ2V4w6ljdXRpb24gKGxvZ2ZpbGVzKTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUYXNrIj5Uw6JjaGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGF5Ij5Kb3VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRpbWUiPkhldXJlPC9tZXNzYWdlPgotICAgICAgPCEtLSBEZWFjdGl2YXRlIGFuZCBkZWxldGUgLS0+Ci0gIDxtZXNzYWdlIGtleT0iZG9jcy1oYXZlLWxpbmtzLXRvLWRvYyI+TGVzIGRvY3VtZW50cyBzdWl2YW50cyBvbnQgZGVzIGxpZW5zIHF1aSByw6lmw6lyZW5jZW50IGNlIGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlYWN0aXZhdGUgRG9jdW1lbnQiPkTDqXNhY3RpdmVyIGxlIGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlYWN0aXZhdGUtZG9jIj5Ew6lzYWN0aXZlciBsZSBkb2N1bWVudCB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVhY3RpdmF0ZS1kb2M/Ij5Wb3VsZXotdm91cyB2cmFpbWVudCBkw6lzYWN0aXZlciBsZSBkb2N1bWVudCB7MH0/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlbGV0ZSBEb2N1bWVudCI+U3VwcHJpbWVyIGxlIGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1kb2MiPlN1cHByaW1lciBsZSBkb2N1bWVudCB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY2Fubm90LWRlYWN0aXZhdGUtdW5sZXNzLWNoaWxkcmVuLWRlYWN0aXZhdGVkIj5DZSBkb2N1bWVudCBuZSBwZXV0IHBhcyAmIzIzNDt0cmUgZMOpc2FjdGl2w6kgdGFudCBxdWUgbGVzIGRvY3VtZW50cyBzdWJvcmRvbm7DqXMgc3VpdmFudHMgbidhdXJvbnQgcGFzIMOpdMOpIMOpZ2FsZW1lbnQgZMOpc2FjdGl2w6lzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1sYW5ndWFnZS12ZXJzaW9ucz8iPlZvdWxlei12b3VzIHZyYWltZW50IHN1cHByaW1lciB0b3V0ZXMgbGVzIHRyYWR1Y3Rpb25zIGR1IGRvY3VtZW50IHswfT88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVsZXRlLWRvYy1saXZlIj5MZSBkb2N1bWVudCB7MH0gbmUgcGV1dCAmIzIzNDt0cmUgc3VwcHJpbcOpLCBjYXIgaWwgZXN0IGVuIGxpZ25lITwvbWVzc2FnZT4KLSAgICAgIDwhLS0gQXJjaGl2ZSBkb2N1bWVudCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJBcmNoaXZlIERvY3VtZW50Ij5BcmNoaXZlciBsZSBkb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYyI+QXJjaGl2ZXIgbGUgZG9jdW1lbnQgezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImFyY2hpdmUtZG9jPyI+Vm91bGV6LXZvdXMgdnJhaW1lbnQgYXJjaGl2ZXIgbGUgZG9jdW1lbnQgezB9PzwvbWVzc2FnZT4KLSAgICAgIDwhLS0gUmVuYW1lIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+UmVub21tZXIgbGUgZG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVuYW1lLWRvYyI+UmVub21tZXIgbGUgZG9jdW1lbnQgezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlbmFtZS1sYWJlbC1kb2MiPkNoYW5nZXIgbGUgdGl0cmUgZGUgbmF2aWdhdGlvbiBkdSBkb2N1bWVudCB7MH08L21lc3NhZ2U+Ci0gICAgICA8IS0tIENvcHkgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQ29weSBEb2N1bWVudCI+Q29waWVyIGxlIGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNvcHktZG9jLXRvLWNsaXA/Ij5Wb3VsZXotdm91cyBjb3BpZXIgbGUgZG9jdW1lbnQgPHhodG1sOnE+ezB9PC94aHRtbDpxPiB2ZXJzIGxlIHByZXNzZS1wYXBpZXJzPyBWb3VzIHBvdXJyZXogbGUgY29sbGVyIHVsdMOpcmlldXJlbWVudCDDoCBsJ2VuZHJvaXQgZGUgdm90cmUgY2hvaXguPC9tZXNzYWdlPgotICAgICAgPCEtLSBQYXN0ZSBkb2N1bWVudCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJQYXN0ZSBEb2N1bWVudCI+Q29sbGVyIGxlIGRvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InBhc3RlLWRvYy1mcm9tLWNsaXA/Ij5Wb3VsZXotdm91cyBjb2xsZXIgbGUgZG9jdW1lbnQgPHhodG1sOnE+ezB9PC94aHRtbDpxPiDDoCBwYXJ0aXIgZHUgcHJlc3NlLXBhcGllcnM/PC9tZXNzYWdlPgotICAgICAgPCEtLSBDdXQgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQ3V0IERvY3VtZW50Ij5Db3VwZXIgbGUgZG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY3V0LWRvYyI+Q291cGVyIGxlIGRvY3VtZW50IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjdXQtZG9jLXRvLWNsaXA/Ij5Wb3VsZXotdm91cyBjb3VwZXIgbGUgZG9jdW1lbnQgezB9IHZlcnMgbGUgcHJlc3NlLXBhcGllcnM/IFZvdXMgcG91cnJleiBsZSBjb2xsZXIgdWx0w6lyaWV1cmVtZW50IMOgIGwnZW5kcm9pdCBkZSB2b3RyZSBjaG9peC48L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIEFzc2V0IC0tPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBJbWFnZSI+SW5zw6lyZXIgdW5lIEltYWdlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBBc3NldCI+SW5zw6lyZXIgdW4gQWN0aWY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXNzZXQgVXBsb2FkIj5Uw6lsw6ljaGFyZ2VyIHVuIEFjdGlmPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBhIG5ldyBJbWFnZSI+SW5zw6lyZXIgdW5lIG5vdXYuIEltYWdlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVwbG9hZCBhbiBBc3NldCI+VMOpbMOpY2hhcmdlciB1biBBY3RpZjwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gd29ya2Zsb3cgIC0tPgotICA8bWVzc2FnZSBrZXk9IlZhbHVlIj5WYWxldXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRXZlbnQiPkV2w6luZW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmFyaWFibGVzIj5WYXJpYWJsZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSGlzdG9yeSI+SGlzdG9yaXF1ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdGF0ZSI+U3RhdHV0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIEFkZHJlc3MiPkFkcmVzc2UgSVA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZWRpdCI+w6lkaXRlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzdWJtaXQiPnNvdW1ldHRyZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWplY3QiPnJlamV0ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icHVibGlzaCI+cHVibGllcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci13b3JrZmxvdy1kb2N1bWVudCI+TCfDqXbDqW5lbWVudCB7MH0gbidlc3QgcGFzIGV4w6ljdXRhYmxlIHBvdXIgbGUgZG9jdW1lbnQgInsxfSI8L21lc3NhZ2U+Ci0KLSA8IS0tIE5vdGlmaWNhdGlvbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJub3RpZmljYXRpb24tbWVzc2FnZSI+Tm90aWZpY2F0aW9uIGRlIExlbnlhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vdGlmeS1zdWJtaXR0ZXIiPk5vdGlmaWVyIGxlIHNvdW1ldHRldXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZG9jdW1lbnQtcHVibGlzaGVkIj5VbiBkb2N1bWVudCBxdWUgdm91cyBhdmV6IHNvdW1pcyBwb3VyIGFwcHJvYmF0aW9uIGEgw6l0w6kgcHVibGnDqTogezB9PC9tZXNzYWdlPgotCi0gIDwhLS0gSW5mbyBhc3NldCAgLS0+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IEFzc2V0Ij5Ob3V2ZWwgQWN0aWY8L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIFJDICAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDdXJyZW50IFZlcnNpb24iPlZlcnNpb24gYWN0dWVsbGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sbGJhY2sgdG8gdGhpcyByZXZpc2lvbiI+UmVzdGF1cmVyIGNldHRlIHZlcnNpb248L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIEFDICAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJTU0wgRW5jcnlwdGlvbiI+Q2hpZmZyZW1lbnQmIzE2MDtTU0w8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWNjZXNzIE9iamVjdCI+T2JqZXQmIzE2MDtkJ2FjY8OoczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbmhlcml0ZWQgUmlnaHRzIj5Ecm9pdHMgaMOpcml0w6lzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InZpc2l0Ij52aXNpdGVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJldmlld2VyIj5yw6l2aXNldXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZWRpdG9yIj7DqWRpdGV1cjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhZG1pbiI+YWRtaW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IndvcmxkIj5tb25kZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ0aGUgd29ybGQiPmxlIG1vbmRlPC9tZXNzYWdlPgotCi0gIDwhLS0gU2NoZWR1bGVyIC0tPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBqb2IiPk5vdXZlbGxlJiMxNjA7dMOiY2hlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFjdGl2ZSBqb2JzIj5Uw6JjaGVzJiMxNjA7YWN0aXZlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaXNoIGFuZCBFeHBvcnQiPlB1YmxpZXIgZXQmIzE2MDtFeHBvcnRlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2MtaGFzLWxpbmtzLXRvLXVucHVibGlzaGVkIj5DZSBkb2N1bWVudCBwb3Nzw6hkZSBkZXMgbGllbnMgcXVpIHLDqWbDqXJlbmNlbnQgbGVzIGRvY3VtZW50cyBub24tcHVibGnDqXMgc3VpdmFudHM6PC9tZXNzYWdlPgotCi0gIDwhLS0gTmV3IERvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlBsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGNhdXNlcyBvZiB0aGUgZXhjZXB0aW9uIj5WZXVpbGxleiBleGFtaW5lciBsZXMgY2F1c2VzIHBvc3NpYmxlcyBzdWl2YW50ZXMgZGUgY2V0dGUgZXhjZXB0aW9uLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJleGNlcHRpb24uY2F1c2UuY3JlYXRlZG9jLndoaXRlc3BhY2UtaW4taWQiPkwnaWRlbnRpZmljYXRldXIgKElEKSBuZSBwZXV0IHBhcyBjb21wb3J0ZXIgZGUgY2FyYWN0w6hyZXMgZCdlc3BhY2VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImV4Y2VwdGlvbi5jYXVzZS5jcmVhdGVkb2MuaWQtaW4tdXNlIj5MJ2lkZW50aWZpY2F0ZXVyIChJRCkgZXN0IGTDqWrDoCB1dGlsaXPDqTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmYWlsbWVzc2FnZS5jcmVhdGVkb2MuaW52YWxpZGZvcm1hdCI+VmV1aWxsZXogZW50cmVyIHVuZSB2YWxldXIgdmFsaWRlIGRhbnMgbGUgY2hhbXAgZGUgbCdpZGVudGlmaWNhdGV1ciAoSUQpLiBMZXMgY2FyYWN0w6hyZXMgQS1aLCBhLXosIDAtOSBvdSAtIHNvbnQgdmFsaWRlcy48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZmFpbG1lc3NhZ2UuY3JlYXRlZG9jLnJlcXVpcmVkIj5WZXVpbGxleiByZW5zZWlnbmVyIHRvdXMgbGVzIGNoYW1wcyBvYmxpZ2F0b2lyZXMgKCopLjwvbWVzc2FnZT4KLQotICA8IS0tIEFzc2V0IFVwbG9hZC9JbnNlcnQgRGlhbG9nIC0tPgotICA8bWVzc2FnZSBrZXk9IkFkZCB0byBBc3NldCBMaWJyYXJ5Ij5Bam91dGVyIMOgIGxhIGxpYnJhaXJpZSBkZXMgYWN0aWZzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFzc2V0IExpYnJhcnkiPkxpYnJhaXJpZSBkZXMgYWN0aWZzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5vIGFzc2V0cyBhdmFpbGFibGUiPlBhcyBkJ2FjdGlmcyBkaXNwb25pYmxlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgQXNzZXQiPkFqb3V0ZXIgdW4gYWN0aWY8L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbWFnZSBVcGxvYWQvSW5zZXJ0IERpYWxvZyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC50aXRsZSI+SW5zw6lyZXIgdW5lIEltYWdlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLnNlbGVjdGltYWdlLmxhYmVsIj5Tw6lsZWN0aW9ubmVyIHVuZSBJbWFnZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5pbmZvLm5vaW1hZ2VzIj5BdWN1bmUgaW1hZ2UgZGlzcG9uaWJsZS48L21lc3NhZ2U+ICAKLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5saW5rcy5oaW50Ij5MZXMgbGllbnMgZXh0ZXJuZXMgZG9pdmVudCBjb21tZW5jZXIgcGFyICdodHRwOi8vJywgbGVzIGxpZW5zIGludGVybmVzIGRvaXZlbnQgY29tbWVuY2VyIHBhciAnLyc8L21lc3NhZ2U+ICAKLQotICA8IS0tIFJldmlzaW9uIENvbnRyb2xsZXIgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUmVhc29uIj5DYXVzZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlbmFtZSI+Tm9tIGR1IGZpY2hpZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEucmMubm9jaGVja291dCI+TGEgcmVzb3VyY2UgbmUgcGV1dCBwYXMgJiMyMzQ7dHJlIGV4dHJhaXRlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLmNoZWNrZWRvdXRhbHJlYWR5Ij5MYSByZXNvdXJjZSBhIGTDqWrDoCDDqXTDqSBleHRyYWl0ZSBwYXIgdW4gYXV0cmUgdXRpbGlzYXRldXIuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tpbiI+TGEgcmVzb3VyY2UgbmUgcGV1dCBwYXMgJiMyMzQ7dHJlIGVucmVnaXN0csOpZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHZW5lcmljIEV4Y2VwdGlvbiI+RXhjZXB0aW9uIGfDqW7DqXJpcXVlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNoZWNrIHRoZSBsb2cgZmlsZXMuIj5Db25zdWx0ZXogbGVzIGpvdXJuYXV4IGQnZXjDqWN1dGlvbiAobG9nIGZpbGVzKS48L21lc3NhZ2U+Ci0KLSAgPCEtLSBFcnJvciBtZXNzYWdlcyBvZiBhIGdlbmVyYWwgbmF0dXJlIC0tPgotICA8bWVzc2FnZSBrZXk9ImVycm9yLWRvY3VtZW50LWZvcm0iPkxlIGRvY3VtZW50IG4nZXN0IHBhcyBiaWVuIGZvcm3DqTogezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImVycm9yLXZhbGlkYXRpb24iPkxhIHZhbGlkYXRpb24gYXZlYyBsZSBzY2jDqW1hIGEgw6ljaG91w6k6IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci1taXNzaW5nLWxhbmd1YWdlIj5MZSBkb2N1bWVudCBkZW1hbmTDqSBuJ2VzdCBwYXMgZGlzcG9uaWJsZSBwb3VyIGxhIGxhbmd1ZTogezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImVycm9yLWRvY3VtZW50LWV4aXN0YW5jZS1zaG9ydCI+TGUgZG91bWVudCBuJ2V4aXN0ZSBwYXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItZG9jdW1lbnQtZXhpc3RhbmNlIj5MZSBkb2N1bWVudCBkZW1hbmTDqSB7MH0gYXZlYyBjb21tZSBpZCB7MX0gbidleGlzdGUgcGFzLjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJlcnJvci1nZW5lcmljIj5VbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZS48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZXJyb3ItNDA0Ij40MDQ6IFBhZ2Ugbm9uIHRyb3V2w6llPC9tZXNzYWdlPgotCi08L2NhdGFsb2d1ZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfaXQueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9pdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjIzYzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9pdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIAotICAkSWQkIAotICBAdHJhbnNsYXRvcnMgR2lhbXBhb2xvIFRyYXBhc3NvICA8dHJhcG8gYXQgdHJhcG8gZG90IGl0PgotLS0+Ci0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9Iml0IiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0JPCEtLSBjb21tb24gdXNlZCB3b3JkcyAtLT4KLQk8bWVzc2FnZSBrZXk9IlNhdmUiPlNhbHZhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iU3VibWl0Ij5Tb3R0b3Bvbmk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJDYW5jZWwiPkFubnVsbGE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJEZWxldGUiPkNhbmNlbGxhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iTk9URSI+Tm90YTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Ik5vIHJlZmVyZXIiPk5lc3N1bmEgcGFnaW5hIGRpIHByb3ZlbmllbnphPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iUmVmZXJlciI+UGFnaW5hIGRpIHByb3ZlbmllbnphPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRVhDRVBUSU9OIj5FQ0NFWlpJT05FPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iVXNlciI+VXRlbnRlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0ibGl2ZSI+cHViYmxpY2F0bzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Im5vdCI+bm9uPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iYXV0aG9yaW5nIj5jb21wb3NpemlvbmU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBdXRob3JpbmciPkNvbXBvc2l6aW9uZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9InJldmlldyI+cmV2aXNpb25lPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0idXNlciI+dXRlbnRlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iVXNlcnMiPlV0ZW50aTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Imdyb3VwIj5ncnVwcG88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJHcm91cCI+R3J1cHBvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iR3JvdXBzIj5HcnVwcGk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJHcm91cCBJRCI+SUQgR3J1cHBvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iWWVzIj5Tw6w8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJObyI+Tm88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJEZXNjcmlwdGlvbiI+RGVzY3JpemlvbmU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJOYW1lIj5Ob21lPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRnVsbCBOYW1lIj5Ob21lIENvbXBsZXRvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0icmVxdWlyZWQgZmllbGRzIj5jYW1waSByaWNoaWVzdGk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJTZWFyY2giPkNlcmNhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iSG9tZSI+SG9tZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlRpdGxlIj5UaXRvbG88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJMYXN0IG1vZGlmaWVkIj5VbHRpbWEmIzE2MDttb2RpZmljYTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Ik92ZXJ2aWV3Ij5WaXN0YSBnZW5lcmFsZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlJvbGUiPlJ1b2xvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iVmlldyI+VmVkaTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkFzc2V0cyI+Umlzb3JzZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9InRydWUiPnPDrDwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9ImZhbHNlIj5ubzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlJlbmFtZSI+Umlub21pbmE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJNb2RpZnkiPk1vZGlmaWNhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRG9jdW1lbnQiPkRvY3VtZW50bzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkRhdGUiPkRhdGE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJCYWNrIj5JbmRpZXRybzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkFkZCI+QWdnaXVuZ2k8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJDcmVhdGUiPkNyZWE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJUaGUgQXJjaGl2ZSI+QXJjaGl2aW88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJUcmFzaCI+Q2VzdGlubzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlB1Ymxpc2hlciI+RWRpdG9yZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Ik5hdmlnYXRpb24gVGl0bGUiPlRpdG9sbyBkaSBOYXZpZ2F6aW9uZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkNyZWF0b3IiPkNyZWF0b3JlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iTGFuZ3VhZ2UiPkxpbmd1YTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlN1YmplY3QiPkFyZ29tZW50bzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlJpZ2h0cyI+RGlyaXR0aTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlNlbGVjdCBGaWxlIj5TZWxlemlvbmEgRmlsZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9InNlbGVjdC1vYmplY3QiPlNlbGV6aW9uYSB7MH08L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJJbnNlcnQiPkluc2VyaXNjaTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Ikluc2VydCBGaWxlIj5JbnNlcmlzY2kgRmlsZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9InVwbG9hZC13aXRoLWludmFsaWQtZXh0ZW5zaW9uIj5IYWkgcHJvdmF0byBhIGludmlhcmUgdW4gZmlsZSBjb24gdW5hIGVzdGVuc2lvbmUgbm9uIHZhbGlkYS4gTGUgZXN0ZW5zaW9uaSB2YWxpZGUgc29ubyB7MH08L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJmaWxlbmFtZS1mb3JtYXQtZXhjZXB0aW9uIj5JbCBub21lIGRlbCBmaWxlIGNoZSBzdGFpIGNlcmNhbmRvIGRpIHRyYXNmZXJpcmUgbm9uIGhhIGVzdGVuc2lvbmkgbyBjb250aWVuZSBjYXJhdHRlcmkgbm9uIGFtbWVzc2kgY29tZSBzcGF6aSBlIGxldHRlcmUgYWNjZW50YXRlLjwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkNyZWF0aW9uIERhdGUiPkRhdGEgY3JlYXppb25lPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRmlsZSBTaXplIj5EaW1lbnNpb25lIEZpbGU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJJbWFnZSI+SW1tYWdpbmU8L21lc3NhZ2U+Ci0JPCEtLSBzdWJtaXQgc2NyZWVuIC0tPgotCTxtZXNzYWdlIGtleT0ic3VibWl0LWZvci1hcHByb3ZhbCI+UHJvcG9uaSB7MH0gcGVyIGxhIHB1YmJsaWNhemlvbmU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJzdWJtaXQtZm9yLWFwcHJvdmFsPyI+VnVvaSBwcm9wb3JyZSB7MH0gcGVyIGxhIHB1YmJsaWNhemlvbmU/PC9tZXNzYWdlPgotCTwhLS0gcHVibGlzaCBzY3JlZW4gLS0+Ci0JPG1lc3NhZ2Uga2V5PSJQdWJsaXNoIj5QdWJibGljYTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlNvdXJjZSBGaWxlKHMpIj5GaWxlIHNvcmdlbnRlL2k8L21lc3NhZ2U+Ci0JPCEtLSBsb2dpbiBzY3JlZW4gLS0+Ci0JPG1lc3NhZ2Uga2V5PSJsb2dpbi10by1wdWIiPkxvZ2luIG5lbGxhIFB1YmJsaWNhemlvbmUgezB9PC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iTG9naW4iPkxvZ2luPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iUGFzc3dvcmQiPlBhc3N3b3JkPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iVXNlcm5hbWUiPk5vbWUgdXRlbnRlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iQXV0aGVudGljYXRpb24gZmFpbGVkIj5BdXRlbnRpY2F6aW9uZSBmYWxsaXRhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEtYWxpY2UiPlByb3ZhIHV0ZW50ZSB7MH0gZSBwYXNzd29yZCB7MX0gKGVkaXRvcmUpIG8gdXRlbnRlIHsyfSBlIHBhc3N3b3JkIHszfSAocmV2aXNvcmUpPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InRyeS11c2VyLWxlbnlhIj5Qcm92YSB1dGVudGUgezB9IGUgcGFzc3dvcmQgezF9PC9tZXNzYWdlPgotICA8IS0tIGxvZ291dCBzY3JlZW4gLS0+Ci0JPG1lc3NhZ2Uga2V5PSJsb2dvdXQtZnJvbS1wdWIiPkxvZ291dCBkYWxsYSBQdWJibGljYXppb25lIHswfTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IllvdXIgSGlzdG9yeSI+TGUgdHVlIG1vZGlmaWNoZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkxvZ2luIHRvIEF1dGhvcmluZyBBcmVhIj5Mb2dpbiBuZWxsJ2FyZWEgQXV0aG9yaW5nPC9tZXNzYWdlPgotCTwhLS0gcmVqZWN0IHNjcmVlbiAtLT4KLQk8bWVzc2FnZSBrZXk9IlJlamVjdCI+UmVzcGluZ2k8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJyZWplY3QtZG9jPyI+VnVvaSByZXNwaW5nZXJlIGlsIGRvY3VtZW50byB7MH0/PC9tZXNzYWdlPgotCTwhLS0gY21zIG1lbnUgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJOZXcgRG9jdW1lbnQiPk51b3ZvIERvY3VtZW50bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgLi4uIERvY3VtZW50Ij5OdW92byBEb2N1bWVudG8gezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBMYW5ndWFnZSBWZXJzaW9uIj5OdW92YSBMaW5ndWE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJSZW1vdmUgTGFuZ3VhZ2UgVmVyc2lvbiI+UmltdW92aSBMaW5ndWE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJGaWxlIj5GaWxlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRWRpdCI+TW9kaWZpY2E8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJXb3JrZmxvdyI+V29ya2Zsb3c8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJEZWFjdGl2YXRlIj5EaXNhdHRpdmE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZSI+UGlhbmlmaWNhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iQ29weSI+Q29waWE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJQYXN0ZSI+SW5jb2xsYTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkN1dCI+VGFnbGlhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iSGVscCI+SGVscDwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkRlYnVnIj5EZWJ1ZzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkRlbGV0ZSI+Q2FuY2VsbGE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBcmNoaXZlIj5BcmNoaXZpYTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlJlc3RvcmUiPlJpcHJpc3RpbmE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJNb3ZlIFVwIj5TcG9zdGEgaW4gQWx0bzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Ik1vdmUgRG93biI+U3Bvc3RhIGluIEJhc3NvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iTG9nb3V0Ij5Mb2dvdXQ8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJWaWV3IFRhc2sgTG9ncyI+TW9zdHJhIExvZyBkZWxsZSBBdHRpdml0w6A8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJTdXBwb3J0Ij5TdXBwb3J0bzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlN5c3RlbSBEb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF6aW9uZSBkaSBTaXN0ZW1hPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iVXNlciBEb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF6aW9uZSBVdGVudGU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBYm91dCBBcGFjaGUgTGVueWEiPkluZm9ybWF6aW9uaSBzdSBBcGFjaGUgTGVueWE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBcGFjaGUgTGVueWEgSG9tZXBhZ2UiPkhvbWVwYWdlIGRpIEFwYWNoZSBMZW55YSA8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJFZGl0IHdpdGggRXBveiI+TW9kaWZpY2EgY29uIEt1cHU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJFZGl0IHdpdGggQlhFIj5Nb2RpZmljYSBjb24gQlhFPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIG9uZSBGb3JtIj5Nb2RpZmljYSBjb24gdW5hIEZvcm08L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJFZGl0IHdpdGggRm9ybXMiPk1vZGlmaWNhIGNvbiBGb3JtczwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkVkaXQgTWV0YWRhdGEiPk1vZGlmaWNhJiMxNjA7TWV0YWRhdGk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJFZGl0IE5hdmlnYXRpb24gVGl0bGUiPk1vZGlmaWNhJiMxNjA7VGl0b2xvJiMxNjA7TmF2aWdhemlvbmU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJSZW5hbWUgVVJMIj5SaW5vbWluYSYjMTYwO1VSTDwvbWVzc2FnZT4KLQk8IS0tIGNtcyB0YWJzIC0tPgotCTxtZXNzYWdlIGtleT0iU2VydmVyIFRpbWUiPk9yYSBTZXJ2ZXI8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJXb3JrZmxvdyBTdGF0ZSI+U3RhdG8gV29ya2Zsb3c8L21lc3NhZ2U+Ci0JPCEtLSBBZG1pbmlzdHJhdGlvbiB0YWIgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJBZG1pbmlzdHJhdGlvbiI+QW1taW5pc3RyYXppb25lPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0icmVhbGx5LWRlbGV0ZT8iPlZ1b2kgZGF2dmVybyBjYW5jZWxsYXJlIHswfT88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoZSB0cmFzaCA/Ij5TdnVvdGFyZSBpbCBjZXN0aW5vPzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3QiPkNhbmNlbGxhIHswfTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3Q/Ij5WdW9pIGRhdnZlcm8gY2FuY2VsbGFyZSB7MH0/PC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iUGFzc3dkIj5QYXNzd2Q8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJTd2l0Y2ggVXNlciI+Q2FtYmlhIFV0ZW50ZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkRlbGV0ZSBUcmFzaCI+U3Z1b3RhIENlc3Rpbm88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJDb2Nvb24gYW5kIFNlcnZlciBTdGF0dXMiPlN0YXRvIENvY29vbiBlIFNlcnZlcjwvbWVzc2FnZT4KLQk8IS0tIEdyb3VwIEFkbWluaXN0cmF0aW9uIC0tPgotCTxtZXNzYWdlIGtleT0iUHJvZmlsZSI+UHJvZmlsbzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Ik1lbWJlcnMiPk1lbWJyaTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IklQIFJhbmdlcyI+SW50ZXJ2YWxsaSYjMTYwO0lQPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRWRpdCBQcm9maWxlIj5Nb2RpZmljYSBQcm9maWxvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRWRpdCBNZW1iZXJzIj5Nb2RpZmljYSBNZW1icmk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJHcm91cCBBZG1pbmlzdHJhdGlvbiI+QW1taW5pc3RyYXppb25lIEdydXBwbzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkFkZCBHcm91cCI+QWdnaXVuZ2kgR3J1cHBvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iR3JvdXAgRGF0YSI+RGF0aSBHcnVwcG88L21lc3NhZ2U+Ci0JPCEtLSBVc2VyIEFkbWluaXN0cmF0aW9uIC0tPgotCTxtZXNzYWdlIGtleT0iVXNlciBEYXRhIj5EYXRpJiMxNjA7VXRlbnRlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iQ01TIFVzZXIgSUQiPklEJiMxNjA7VXRlbnRlJiMxNjA7Q01TPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iTERBUCBJRCI+SUQmIzE2MDtMREFQPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iQ29uZmlybSBwYXNzd29yZCI+Q29uZmVybWEmIzE2MDtwYXNzd29yZDwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkFkZCBVc2VyIj5BZ2dpdW5naSBVdGVudGU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJVc2VyIEFkbWluaXN0cmF0aW9uIj5BbW1pbmlzdHJhemlvbmUgVXRlbnRlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iVXNlciBEZXRhaWxzIj5EZXR0YWdsaSBVdGVudGU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBbGwgR3JvdXBzIj5UdXR0aSBpIEdydXBwaTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlVzZXIgR3JvdXBzIj5HcnVwcGkgVXRlbnRlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iR3JvdXAgQWZmaWxpYXRpb24iPkdydXBwaSBkaSBBcHBhcnRlbmVuemE8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJDaGFuZ2UgUGFzc3dvcmQiPkNhbWJpYSBQYXNzd29yZDwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkVkaXQgR3JvdXAgQWZmaWxpYXRpb24iPk1vZGlmaWNhIEdydXBwaSBkaSBBcHBhcnRlbmVuemE8L21lc3NhZ2U+Ci0JPCEtLSBJUCBSYW5nZSBBZG1pbmlzdHJhdGlvbiAtLT4KLQk8bWVzc2FnZSBrZXk9IklQIFJhbmdlIj5JbnRlcnZhbGxvJiMxNjA7SVA8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSBJRCI+SUQmIzE2MDtJbnRlcnZhbGxvJiMxNjA7SVA8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJOZXR3b3JrIEFkZHJlc3MiPkluZGlyaXp6byYjMTYwO2RpIFJldGU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJTdWJuZXQgTWFzayI+U3VibmV0JiMxNjA7TWFzazwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IklQIFJhbmdlIEFkbWluaXN0cmF0aW9uIj5BbW1pbmlzdHJhemlvbmUmIzE2MDtJbnRlcnZhbGxpJiMxNjA7SVA8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBZGQgSVAgUmFuZ2UiPkFnZ2l1bmdpJiMxNjA7SW50ZXJ2YWxsbyYjMTYwO0lQPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgUHJvZmlsZSI+UHJvZmlsbyYjMTYwO0ludGVydmFsbG8mIzE2MDtJUDwvbWVzc2FnZT4KLQk8IS0tIFNpdGUgdGFiIChpbmZvIHNjcmVlbnMpIC0tPgotCTxtZXNzYWdlIGtleT0iQXZhaWxhYmxlIExhbmd1YWdlcyI+TGluZ3VlIERpc3BvbmliaWxpPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iVGhpcyBkb2N1bWVudCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgbGFuZ3VhZ2UuIj5RdWVzdG8gZG9jdW1lbnRvIG5vbiDDqCBkaXNwb25pYmlsZSBpbiBxdWVzdGEgbGluZ3VhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRG9jdW1lbnQgSUQiPklEIERvY3VtZW50bzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlZlcnNpb25zIj5WZXJzaW9uaTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlNTTCBFbmNyeXB0aW9uIj5Db2RpZmljYSYjMTYwO1NTTDwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlJvbGxiYWNrIHRvIHRoaXMgdmVyc2lvbiI+UmlwcmlzdGluYSBxdWVzdGEgdmVyc2lvbmU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBQyBBcmNoaXZlIj5BcmNoaXZpbyYjMTYwO0FDPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iQUMgVHJhc2giPkNlc3Rpbm8mIzE2MDtBQzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkFDIEF1dGgiPkFDJiMxNjA7QXV0aDwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkFDIExpdmUiPkFDJiMxNjA7TGl2ZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlNjaGVkdWxlciI+U2NoZWR1bGVyPC9tZXNzYWdlPgotCTwhLS0gSW5mbyBzY3JlZW4gYWN0aW9ucy0tPgotCTxtZXNzYWdlIGtleT0iTmV3IE5hdmlnYXRpb24gVGl0bGUiPk51b3ZvIFRpdG9sbyBOYXZpZ2F6aW9uZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+Umlub21pbmEgRG9jdW1lbnRvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iTmV3IERvY3VtZW50IElEIj5OdW92byBJRCBEb2N1bWVudG88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJObyB3aGl0ZXNwYWNlLCBubyBzcGVjaWFsIGNoYXJhY3RlcnMiPk5pZW50ZSBzcGF6aSwgbmllbnRlIGNhcmF0dGVyaSBzcGVjaWFsaTwvbWVzc2FnZT4KLQk8IS0tIFNjaGVkdWxlciAtLT4KLQk8bWVzc2FnZSBrZXk9Ik5vIGFjdGl2ZSBqb2JzIj5OZXNzdW4gam9iIGF0dGl2by48L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJUaGUgam9iIGRhdGUgaGFzIGV4cGlyZWQiPkxhIGRhdGEgZGVsIGpvYiDDqCBzY2FkdXRhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iY2hlY2sgdGhlIGxvZyBmaWxlcyI+Y29udHJvbGxhcmUgaSBmaWxlIGRpIGxvZzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlRhc2siPlRhc2s8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJEYXkiPkdpb3JubzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlRpbWUiPk9yYTwvbWVzc2FnZT4KLQk8IS0tIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSAtLT4KLQk8bWVzc2FnZSBrZXk9ImRvY3MtaGF2ZS1saW5rcy10by1kb2MiPkkgc2VndWVudGkgZG9jdW1lbnRpIGhhbm5vIGxpbmsgc3UgcXVlc3RvIGRvY3VtZW50bzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkRlYWN0aXZhdGUgRG9jdW1lbnQiPkRpc2F0dGl2YSBEb2N1bWVudG88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJkZWFjdGl2YXRlLWRvYyI+RGlzYXR0aXZhIGRvY3VtZW50byB7MH08L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJkZWFjdGl2YXRlLWRvYz8iPlZ1b2kgdmVyYW1lbnRlIGRpc2F0dGl2YXJlIGlsIGRvY3VtZW50byB7MH0/PC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRGVsZXRlIERvY3VtZW50Ij5DYW5jZWxsYSBEb2N1bWVudG88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJkZWxldGUtZG9jIj5DYW5jZWxsYSBkb2N1bWVudG8gezB9PC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iY2Fubm90LWRlYWN0aXZhdGUtdW5sZXNzLWNoaWxkcmVuLWRlYWN0aXZhdGVkIj5RdWVzdG8gZG9jdW1lbnRvIG5vbiBwdcOyIGVzc2VyZSBkaXNhdHRpdmF0byBzZSBpIGRvY3VtZW50aSBmaWdsaSBub24gc29ubyBkaXNhdHRpdmF0aTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9ImRlbGV0ZS1sYW5ndWFnZS12ZXJzaW9ucz8iPlZ1b2kgdmVyYW1lbnRlIGNhbmNlbGxhcmUgdHV0dGUgbGUgbGluZ3VlIGRlbCBkb2N1bWVudG8gezB9PzwvbWVzc2FnZT4KLQk8IS0tIEFyY2hpdmUgZG9jdW1lbnQgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJBcmNoaXZlIERvY3VtZW50Ij5BcmNoaXZpYSBEb2N1bWVudG88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYyI+QXJjaGl2aWEgZG9jdW1lbnRvIHswfTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9ImFyY2hpdmUtZG9jPyI+VnVvaSB2ZXJhbWVudGUgYXJjaGl2aWFyZSBpbCBkb2N1bWVudG8gezB9PzwvbWVzc2FnZT4KLQk8IS0tIFJlbmFtZSBkb2N1bWVudCAtLT4KLQk8bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+Umlub21pbmEgRG9jdW1lbnRvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0icmVuYW1lLWRvYyI+Umlub21pbmEgZG9jdW1lbnRvIHswfTwvbWVzc2FnZT4KLQk8IS0tIENvcHkgZG9jdW1lbnQgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJDb3B5IERvY3VtZW50Ij5Db3BpYSBEb2N1bWVudG88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY29weS1kb2MtdG8tY2xpcD8iPlZ1b2kgY29waWFyZSBpbCBkb2N1bWVudG8gPHhodG1sOnE+ezB9PC94aHRtbDpxPiBuZWdsaSBhcHB1bnRpPyBQdW9pIGluY29sbGFyZSBzdWNjZXNzaXZhbWVudGUgaWwgZG9jdW1lbnRvIGluIHVuJ2FsdHJhIHBvc2l6aW9uZS48L21lc3NhZ2U+Ci0JPCEtLSBQYXN0ZSBkb2N1bWVudCAtLT4KLQk8bWVzc2FnZSBrZXk9IlBhc3RlIERvY3VtZW50Ij5JbmNvbGxhIERvY3VtZW50bzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJwYXN0ZS1kb2MtZnJvbS1jbGlwPyI+VnVvaSBpbmNvbGxhcmUgaWwgZG9jdW1lbnRvIDwveGh0bWw6cT57MH08L21lc3NhZ2U+IGRhZ2xpIGFwcHVudGk/PC9tZXNzYWdlPgotCTwhLS0gQ3V0IGRvY3VtZW50IC0tPgotCTxtZXNzYWdlIGtleT0iQ3V0IERvY3VtZW50Ij5UYWdsaWEgRG9jdW1lbnRvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImN1dC1kb2MtdG8tY2xpcD8iPlZ1b2kgdGFnbGlhcmUgaWwgZG9jdW1lbnRvIDx4aHRtbDpxPnswfTwveGh0bWw6cT4gYW5kIG11b3ZlcmxvIG5lZ2xpIGFwcHVudGk/IFB1b2kgaW5jb2xsYXJlIHN1Y2Nlc3NpdmFtZW50ZSBpbCBkb2N1bWVudG8gaW4gdW4nYWx0cmEgcG9zaXppb25lLjwvbWVzc2FnZT4KLQk8IS0tIEluZm8gQXNzZXQgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJJbnNlcnQgSW1hZ2UiPkluc2VyaXNjaSBJbW1hZ2luZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9Ikluc2VydCBBc3NldCI+SW5zZXJpc2NpIFJpc29yc2E8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBc3NldCBVcGxvYWQiPkludmlhIFJpc29yc2E8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJJbnNlcnQgYSBuZXcgSW1hZ2UiPkluc2VyaXNjaSB1bmEgbnVvdmEgSW1tYWdpbmU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJVcGxvYWQgYW4gQXNzZXQiPkludmlhIHVuYSBSaXNvcnNhPC9tZXNzYWdlPgotCTwhLS0gSW5mbyB3b3JrZmxvdyAgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJWYWx1ZSI+VmFsb3JlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iRXZlbnQiPkV2ZW50bzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IlZhcmlhYmxlcyI+VmFyaWFiaWxpPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iSGlzdG9yeSI+U3RvcmlhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iU3RhdGUiPlN0YXRvPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iSVAgQWRkcmVzcyI+SW5kaXJpenpvIElQPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iZWRpdCI+bW9kaWZpY2E8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJzdWJtaXQiPnNvdHRvcG9uaTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9InJlamVjdCI+cmVzcGluZ2k8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJwdWJsaXNoIj5wdWJsaWNhPC9tZXNzYWdlPgotCTwhLS0gSW5mbyBhc3NldCAgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJOZXcgQXNzZXQiPk51b3ZhIFJpc29yc2E8L21lc3NhZ2U+Ci0JPCEtLSBJbmZvIFJDICAtLT4KLQk8bWVzc2FnZSBrZXk9IkN1cnJlbnQgVmVyc2lvbiI+VmVyc2lvbmUgQ29ycmVudGU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJSb2xsYmFjayB0byB0aGlzIHJldmlzaW9uIj5SaXByaXN0aW5hIHF1ZXN0YSB2ZXJzaW9uZTwvbWVzc2FnZT4KLQk8IS0tIEluZm8gQUMgIC0tPgotCTxtZXNzYWdlIGtleT0iU1NMIEVuY3J5cHRpb24iPkNvZGlmaWNhJiMxNjA7U1NMPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iQWNjZXNzIE9iamVjdCI+QWNjZXNzJiMxNjA7T2JqZWN0PC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0idmlzaXQiPnZpc2l0YTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9InJldmlld2VyIj5yZXZpc29yZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9ImVkaXRvciI+ZWRpdG9yZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9ImFkbWluIj5hbW1pbmlzdHJhdG9yZTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IndvcmxkIj5tb25kbzwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9InRoZSB3b3JsZCI+aWwgbW9uZG88L21lc3NhZ2U+Ci0JPCEtLSBTY2hlZHVsZXIgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJOZXcgam9iIj5OdW92byYjMTYwO2pvYjwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9IkFjdGl2ZSBqb2JzIj5Kb2ImIzE2MDthdHRpdmk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJQdWJsaXNoIGFuZCBFeHBvcnQiPlB1YmJsaWNhIGUmIzE2MDtFc3BvcnRhPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iZG9jLWhhcy1saW5rcy10by11bnB1Ymxpc2hlZCI+UXVlc3RvIGRvY3VtZW50byBoYSBsaW5rIGFpIHNlZ3VlbnRpIGRvY3VtZW50aSBub24gcHViYmxpY2F0aTo8L21lc3NhZ2U+Ci0JPCEtLSBOZXcgRG9jdW1lbnQgLS0+Ci0JPG1lc3NhZ2Uga2V5PSJQbGVhc2UgY2hlY2sgdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBjYXVzZXMgb2YgdGhlIGV4Y2VwdGlvbiI+Q29udHJvbGxhcmUgcGVyIGZhdm9yZSBsZSBwb3NzaWJpbGkgY2F1c2UgZGVsbCdlY2NlemlvbmU8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJleGNlcHRpb24uY2F1c2UuY3JlYXRlZG9jLndoaXRlc3BhY2UtaW4taWQiPkwnSUQgbm9uIHB1w7IgYXZlcmUgc3Bhemk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJleGNlcHRpb24uY2F1c2UuY3JlYXRlZG9jLmlkLWluLXVzZSI+UXVlc3RvIElEIMOoIGdpw6AgdXNhdG88L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJmYWlsbWVzc2FnZS5jcmVhdGVkb2MuaW52YWxpZGZvcm1hdCI+SW5zZXJpcmUgdW4gdGVzdG8gdmFsaWRvIG5lbCBjYW1wbyBJRC4gQS1aLCBhLXosIDAtOSBvIC0gc29ubyBjYXJhdHRlcmkgdmFsaWRpLjwvbWVzc2FnZT4KLQk8bWVzc2FnZSBrZXk9ImZhaWxtZXNzYWdlLmNyZWF0ZWRvYy5yZXF1aXJlZCI+UmllbXBpcmUgdHV0dGkgaSBjYW1waSBvYmJsaWdhdG9yaSAoc29ubyBzZWduYXRpIGNvbiAqKS48L21lc3NhZ2U+Ci0JPCEtLSBBc3NldCBVcGxvYWQvSW5zZXJ0IERpYWxvZyAtLT4KLQk8bWVzc2FnZSBrZXk9IkFkZCB0byBBc3NldCBMaWJyYXJ5Ij5BZ2dpdW5naSBhbGxhIExpYnJlcmlhIFJpc29yc2U8L21lc3NhZ2U+Ci0JPG1lc3NhZ2Uga2V5PSJBc3NldCBMaWJyYXJ5Ij5MaWJyZXJpYSBSaXNvcnNlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iTm8gYXNzZXRzIGF2YWlsYWJsZSI+TmVzc3VuYSByaXNvcnNhIGRpc3BvbmliaWxlPC9tZXNzYWdlPgotCTxtZXNzYWdlIGtleT0iSW5zZXJ0IEFzc2V0Ij5JbnNlcmlzY2kgUmlzb3JzYTwvbWVzc2FnZT4KLTwvY2F0YWxvZ3VlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9qYS54bWwgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2phLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyM2MzYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX2phLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9ImphIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0KLSAgPCEtLSBjb21tb24gdXNlZCB3b3JkcyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJTYXZlIj7kv53lrZg8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3VibWl0Ij7pgIHkv6E8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2FuY2VsIj7jgq3jg6Pjg7Pjgrvjg6s8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIj7liYrpmaQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTk9URSI+77yc5rOo77yePC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5vIHJlZmVyZXIiPuWPgueFp+eEoeOBlzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZWZlcmVyIj7lj4Lnhac8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRVhDRVBUSU9OIj7kvovlpJY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciI+44Om44O844K2PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxpdmUiPuODqeOCpOODljwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJub3QiPm5vdDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhdXRob3JpbmciPuOCquODvOOCteODquODs+OCsDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBdXRob3JpbmciPuOCquODvOOCteODquODs+OCsDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXZpZXciPuODrOODk+ODpeODvDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ1c2VyIj7jg6bjg7zjgrY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlcnMiPuODpuODvOOCtue+pDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJncm91cCI+44Kw44Or44O844OXPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIj7jgrDjg6vjg7zjg5c8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXBzIj7jgrDjg6vjg7zjg5fnvqQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAgSUQiPuOCsOODq+ODvOODlyBJRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJZZXMiPuOBr+OBhDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyI+44GE44GE44GIPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlc2NyaXB0aW9uIj7oqqzmmI48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTmFtZSI+5ZCN5YmNPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkZ1bGwgTmFtZSI+44OV44Or44ON44O844OgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlcXVpcmVkIGZpZWxkcyI+5b+F6aCI44OV44Kj44O844Or44OJPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNlYXJjaCI+5qSc57SiPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkhvbWUiPuODm+ODvOODoDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaXRsZSI+44K/44Kk44OI44OrPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikxhc3QgbW9kaWZpZWQiPuacgOe1guabtOaWsOaXpTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJPdmVydmlldyI+5qaC6KaBPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJvbGUiPuODreODvOODqzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWaWV3Ij7jg5Pjg6Xjg7w8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXNzZXRzIj7jgqLjgrvjg4Pjg4g8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJ1ZSI+44Gv44GEPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZhbHNlIj7jgYTjgYTjgYg8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIj7lkI3liY3lpInmm7Q8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW9kaWZ5Ij7kv67mraM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnQiPuODieOCreODpeODoeODs+ODiDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEYXRlIj7ml6Xku5g8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQmFjayI+5oi744KLPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCI+6L+95YqgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSI+5L2c5oiQPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBBcmNoaXZlIj7jgqLjg7zjgqvjgqTjg5Y8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVHJhc2giPuOCtOODn+eusTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaXNoZXIiPueZuuihjOiAhTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOYXZpZ2F0aW9uIFRpdGxlIj7jg4rjg5PjgrLjg7zjgrfjg6fjg7Pjgr/jgqTjg4jjg6s8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ3JlYXRvciI+5L2c5oiQ6ICFPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikxhbmd1YWdlIj7oqIDoqp48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3ViamVjdCI+6aGM5ZCNPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJpZ2h0cyI+5qip5YipPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNlbGVjdCBGaWxlIj7jg5XjgqHjgqTjg6vpgbjmip48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic2VsZWN0LW9iamVjdCI+ezB9IOOBrumBuOaKnjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQiPuaMv+WFpTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgRmlsZSI+44OV44Kh44Kk44Or5oy/5YWlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVwbG9hZC13aXRoLWludmFsaWQtZXh0ZW5zaW9uIj7mi6HlvLXlrZDjga7mraPjgZfjgY/jgarjgYTjg5XjgqHjgqTjg6vjgpLjgqLjg4Pjg5fjg63jg7zjg4njgZfjgojjgYbjgajjgZfjgb7jgZfjgZ/jgILmraPjgZfjgYTmi6HlvLXlrZDjga8gezB9IOOBp+OBmeOAguaLoeW8teWtkOWQjeOBr+Wwj+aWh+WtlyhhLGIsYywuLi7vvInjgavjgZfjgabjgY/jgaDjgZXjgYQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idXBsb2FkLXdpdGgtbWlzc2luZy10aXRsZSI+44K/44Kk44OI44Or44Gu54Sh44GE44OV44Kh44Kk44Or44KS44Ki44OD44OX44Ot44O844OJ44GX44KI44GG44Go44GX44G+44GX44GfPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZpbGVuYW1lLWZvcm1hdC1leGNlcHRpb24iPuOCouODg+ODl+ODreODvOODieOBl+OCiOOBhuOBqOOBl+OBn+ODleOCoeOCpOODq+OBruWQjeWJjeOBq+aLoeW8teWtkOOBjOOBquOBhOOBi+aIluOBhOOBr+WNiuinkuOCueODmuODvOOCueOChOOCpuODoOODqeOCpuODiOOBqOOBhOOBo+OBn+S9v+eUqOS4jeWPr+iDveOBquaWh+Wtl+OBjOWQq+OBvuOCjOOBpuOBhOOBvuOBmTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDcmVhdGlvbiBEYXRlIj7kvZzmiJDml6U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRmlsZSBTaXplIj7jg5XjgqHjgqTjg6vjgrXjgqTjgro8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW1hZ2UiPuOCpOODoeODvOOCuDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMaW5rIj7jg6rjg7Pjgq88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2FwdGlvbiI+44Kt44Oj44OX44K344On44OzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFsbCByaWdodHMgcmVzZXJ2ZWQiPkFsbCByaWdodHMgcmVzZXJ2ZWQuPC9tZXNzYWdlPgotCi0gIDwhLS0gc3VibWl0IHNjcmVlbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJzdWJtaXQtZm9yLWFwcHJvdmFsIj7mib/oqo3nlKjjgasgezB9IOOCkumAgeS/oTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJzdWJtaXQtZm9yLWFwcHJvdmFsPyI+5om/6KqN55So44GrIHswfSDjgpLpgIHkv6HjgZfjgb7jgZnjgYvvvJ88L21lc3NhZ2U+Ci0KLSAgPCEtLSBwdWJsaXNoIHNjcmVlbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaXNoIj7jg5Hjg5bjg6rjg4Pjgrfjg6U8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU291cmNlIEZpbGUocykiPuOCveODvOOCueODleOCoeOCpOODqzwvbWVzc2FnZT4KLQotICA8IS0tIGxvZ2luIHNjcmVlbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJsb2dpbi10by1wdWIiPnswfSDjg5Hjg5bjg6rjgrHjg7zjgrfjg6fjg7Pjgbjjga7jg63jgrDjgqTjg7M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9naW4iPuODreOCsOOCpOODszwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQYXNzd29yZCI+44OR44K544Ov44O844OJPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXJuYW1lIj7jg6bjg7zjgrblkI08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXV0aGVudGljYXRpb24gZmFpbGVkIj7oqo3oqLzlpLHmlZc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEtYWxpY2UiPuODpuODvOOCtiB7MH0g44Gu44OR44K544Ov44O844OJIHsxfSDvvIjnt6jpm4bogIXvvInjgIHjgYLjgovjgYTjga/jgIHjg6bjg7zjgrYgezJ9IOOBruODkeOCueODr+ODvOODiSB7M30g77yI44Os44OT44Ol44Ki44O877yJ44KS5L2/44Gj44Gm44GP44Gg44GV44GEPC9tZXNzYWdlPgotICAKLSAgPCEtLSBsb2dvdXQgc2NyZWVuIC0tPgotICA8bWVzc2FnZSBrZXk9ImxvZ291dC1mcm9tLXB1YiI+ezB9IOODkeODluODquOCseODvOOCt+ODp+ODs+OBi+OCieOBruODreOCsOOCouOCpuODiDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJZb3VyIEhpc3RvcnkiPuWxpeattDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2dpbiB0byBBdXRob3JpbmcgQXJlYSI+44Kq44O844K144Oq44Oz44Kw44Ko44Oq44Ki44G444Gu44Ot44Kw44Kk44OzPC9tZXNzYWdlPgotCi0gIDwhLS0gcmVqZWN0IHNjcmVlbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJSZWplY3QiPuaLkuWQpjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWplY3QtZG9jPyI+44OJ44Kt44Ol44Oh44Oz44OIIHswfSDjgpLmi5LlkKbjgZfjgb7jgZnjgYvvvJ88L21lc3NhZ2U+Ci0KLSAgPCEtLSBjbXMgbWVudSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgRG9jdW1lbnQiPuaWsOimj+ODieOCreODpeODoeODs+ODiDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgLi4uIERvY3VtZW50Ij7mlrDopo/jg4njgq3jg6Xjg6Hjg7Pjg4ggezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBMYW5ndWFnZSBWZXJzaW9uIj7mlrDopo/oqIDoqp7jg5Djg7zjgrjjg6fjg7M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVtb3ZlIExhbmd1YWdlIFZlcnNpb24iPuiogOiqnuODkOODvOOCuOODp+ODs+OBruWJiumZpDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlIj7jg5XjgqHjgqTjg6s8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCI+57eo6ZuGPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldvcmtmbG93Ij7jg6/jg7zjgq/jg5Xjg63jg7w8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVhY3RpdmF0ZSI+44Ki44Kv44OG44Kj44OZ44O844OI6Kej6ZmkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNjaGVkdWxlIj7jgrnjgrHjgrjjg6Xjg7zjg6s8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29weSI+44Kz44OU44O8PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhc3RlIj7osrzjgorku5jjgZE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ3V0Ij7liIfjgorlj5bjgoo8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSGVscCI+44OY44Or44OXPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlYnVnIj7jg4fjg5Djg4PjgrA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIj7liYrpmaQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXJjaGl2ZSI+44Ki44O844Kr44Kk44OWPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlc3RvcmUiPuODquOCueODiOOCojwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNb3ZlIFVwIj7kuIrjgbg8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW92ZSBEb3duIj7kuIvjgbg8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTG9nb3V0Ij7jg63jgrDjgqLjgqbjg4g8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmlldyBUYXNrIExvZ3MiPlZpZXcgVGFzayBMb2dzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1cHBvcnQiPuOCteODneODvOODiDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTeXN0ZW0gRG9jdW1lbnRhdGlvbiI+44K344K544OG44Og44OJ44Kt44Ol44Oh44Oz44OIPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgRG9jdW1lbnRhdGlvbiI+44Om44O844K244OJ44Kt44Ol44Oh44Oz44OIPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFib3V0IEFwYWNoZSBMZW55YSI+QXBhY2hlIExlbnlhIOOBq+OBpOOBhOOBpjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBcGFjaGUgTGVueWEgSG9tZXBhZ2UiPkFwYWNoZSBMZW55YSDjg5vjg7zjg6Djg5rjg7zjgrg8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIEt1cHUiPgotICAgIDx4aHRtbDphYmJyIHRpdGxlPSJXaGF0JiMxNjA7WW91JiMxNjA7U2VlJiMxNjA7SXMmIzE2MDtXaGF0JiMxNjA7WW91JiMxNjA7R2V0Ij5XWVNJV1lHPC94aHRtbDphYmJyPiYjMTYwO0VkaXRvciYjMTYwOyhLdXB1KQotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIEJYRSI+Ci0gICAgPHhodG1sOmFiYnIgdGl0bGU9IldoYXQmIzE2MDtZb3UmIzE2MDtTZWUmIzE2MDtJcyYjMTYwO1doYXQmIzE2MDtZb3UmIzE2MDtHZXQiPldZU0lXWUc8L3hodG1sOmFiYnI+JiMxNjA7RWRpdG9yJiMxNjA7KEJYRSkKLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgd2l0aCBvbmUgRm9ybSI+44K944O844K544Ko44OH44Kj44K/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgd2l0aCBGb3JtcyI+44OV44Kp44O844Og44Ko44OH44Kj44K/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTWV0YWRhdGEiPuODoeOCv+ODh+ODvOOCv+OBrue3qOmbhjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IE5hdmlnYXRpb24gVGl0bGUiPuODiuODk+OCsuODvOOCt+ODp+ODs+OCv+OCpOODiOODq+OBrue3qOmbhjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUgVVJMIj5VUkzjga7lpInmm7Q8L21lc3NhZ2U+Ci0KLSAgPCEtLSBjbXMgdGFicyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJTZXJ2ZXIgVGltZSI+44K144O844OQ5pmC6ZaTPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IldvcmtmbG93IFN0YXRlIj7jg6/jg7zjgq/jg5Xjg63jg7znirbmhYs8L21lc3NhZ2U+Ci0KLSAgPCEtLSBBZG1pbmlzdHJhdGlvbiB0YWIgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQWRtaW5pc3RyYXRpb24iPueuoeeQhjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWFsbHktZGVsZXRlPyI+5pys5b2T44GrIHswfSDjgpLliYrpmaTjgZfjgb7jgZnjgYvvvJ88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGUgdHJhc2ggPyI+5pys5b2T44Gr44K044Of566x44KS5YmK6Zmk44GX44G+44GZ44GL77yfPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3QiPnswfSDjga7liYrpmaQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVsZXRlLW9iamVjdD8iPuacrOW9k+OBqyB7MH0g44KS5YmK6Zmk44GX44G+44GZ44GL77yfPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhc3N3ZCI+44OR44K544Ov44O844OJPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN3aXRjaCBVc2VyIj7jg6bjg7zjgrbliIfmm788L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIFRyYXNoIj7jgrTjg5/nrrHjga7liYrpmaQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29jb29uIGFuZCBTZXJ2ZXIgU3RhdHVzIj5Db2Nvb27vvI9TZXJ2ZXLjga7jgrnjg4bjg7zjgr/jgrk8L21lc3NhZ2U+Ci0KLSAgICA8IS0tIEdyb3VwIEFkbWluaXN0cmF0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IlByb2ZpbGUiPuODl+ODreODleOCo+ODvOODqzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJNZW1iZXJzIj7jg6Hjg7Pjg5Djg7w8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2VzIj5JUOevhOWbsjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IFByb2ZpbGUiPuODl+ODreODleOCo+ODvOODq+e3qOmbhjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IE1lbWJlcnMiPuODoeODs+ODkOODvOe3qOmbhjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBBZG1pbmlzdHJhdGlvbiI+44Kw44Or44O844OX566h55CGPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCBHcm91cCI+44Kw44Or44O844OX6L+95YqgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIERhdGEiPuOCsOODq+ODvOODl+ODh+ODvOOCvzwvbWVzc2FnZT4KLQotICAgIDwhLS0gVXNlciBBZG1pbmlzdHJhdGlvbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIERhdGEiPuODpuODvOOCtuODh+ODvOOCvzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDTVMgVXNlciBJRCI+Q01T44Om44O844K2SUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTERBUCBJRCI+TERBUCYjMTYwO0lEPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNvbmZpcm0gcGFzc3dvcmQiPuODkeOCueODr+ODvOODieeiuuiqjTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgVXNlciI+44Om44O844K26L+95YqgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgQWRtaW5pc3RyYXRpb24iPuODpuODvOOCtueuoeeQhjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIERldGFpbHMiPuODpuODvOOCtuips+e0sDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBbGwgR3JvdXBzIj7jgZnjgbnjgabjga7jgrDjg6vjg7zjg5c8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBHcm91cHMiPuODpuODvOOCtuOCsOODq+ODvOODlzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBBZmZpbGlhdGlvbiI+44Kw44Or44O844OX44Ki44OV44Kj44Oq44Ko44O844OIPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNoYW5nZSBQYXNzd29yZCI+44OR44K544Ov44O844OJ5aSJ5pu0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgR3JvdXAgQWZmaWxpYXRpb24iPuOCsOODq+ODvOODl+OCouODleOCo+ODquOCqOODvOODiOOBrue3qOmbhjwvbWVzc2FnZT4KLQotICAgIDwhLS0gVXNlciBUeXBlcyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJMREFQIFVzZXIiPkxEQVAg44Om44O844K2PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkxvY2FsIFVzZXIiPkNNUyDjg6bjg7zjgrY8L21lc3NhZ2U+Ci0KLSAgICA8IS0tIElQIFJhbmdlIEFkbWluaXN0cmF0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIj5JUOevhOWbsjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSBJRCI+SVDnr4Tlm7JJRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXR3b3JrIEFkZHJlc3MiPuODjeODg+ODiOODr+ODvOOCr+OCouODieODrOOCuTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdWJuZXQgTWFzayI+44K144OW44ON44OD44OI44Oe44K544KvPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIEFkbWluaXN0cmF0aW9uIj5JUOevhOWbsueuoeeQhjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgSVAgUmFuZ2UiPklQ56+E5Zuy44Gu6L+95YqgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIFByb2ZpbGUiPklQ56+E5Zuy44Gu44OX44Ot44OV44Kj44O844OrPC9tZXNzYWdlPgotCi0gIDwhLS0gU2l0ZSB0YWIgKGluZm8gc2NyZWVucykgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQXZhaWxhYmxlIExhbmd1YWdlcyI+5Yip55So5Y+v6IO96KiA6KqePC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoaXMgZG9jdW1lbnQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGxhbmd1YWdlLiI+44GT44Gu44OJ44Kt44Ol44Oh44Oz44OI44Gn5oyH5a6a44Gu6KiA6Kqe44Gv5a++5b+c44GX44Gm44GE44G+44Gb44KTPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvY3VtZW50IElEIj7jg4njgq3jg6Xjg6Hjg7Pjg4hJRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJWZXJzaW9ucyI+44OQ44O844K444On44OzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNTTCBFbmNyeXB0aW9uIj5TU0zmmpflj7fljJY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sbGJhY2sgdG8gdGhpcyB2ZXJzaW9uIj7jgZPjga7jg5Djg7zjgrjjg6fjg7Pjgbjjg63jg7zjg6vjg5Djg4Pjgq88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQUMgQXJjaGl2ZSI+QUPjgqLjg7zjgqvjgqTjg5Y8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQUMgVHJhc2giPkFD44K044Of566xPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFDIEF1dGgiPkFDJiMxNjA7QXV0aDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBQyBMaXZlIj5BQyYjMTYwO0xpdmU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU2NoZWR1bGVyIj7jgrnjgrHjgrjjg6Xjg7zjg6k8L21lc3NhZ2U+Ci0KLSAgICA8IS0tIEluZm8gc2NyZWVuIGFjdGlvbnMtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgTmF2aWdhdGlvbiBUaXRsZSI+5paw6KaP44OK44OT44Ky44O844K344On44Oz44K/44Kk44OI44OrPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+44OJ44Kt44Ol44Oh44Oz44OI44Gu5ZCN5YmN5aSJ5pu0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBEb2N1bWVudCBJRCI+5paw6KaP44OJ44Kt44Ol44Oh44Oz44OISUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gd2hpdGVzcGFjZSwgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzIj7nqbrnmb3nhKHjgZfnibnmrormloflrZfnhKHjgZc8L21lc3NhZ2U+Ci0gICAgICA8IS0tIFNjaGVkdWxlciAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJObyBhY3RpdmUgam9icyI+5pyJ5Yq544Gq44K444On44OW54Sh44GXPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBqb2IgZGF0ZSBoYXMgZXhwaXJlZCI+44GT44Gu44K444On44OW44Gv5pyJ5Yq55pyf6ZmQ5YiH44KM44Gn44GZPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNoZWNrIHRoZSBsb2cgZmlsZXMiPuODreOCsOODleOCoeOCpOODq+OBrueiuuiqjTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUYXNrIj7jgr/jgrnjgq88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGF5Ij5EYXk8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGltZSI+VGltZTwvbWVzc2FnZT4KLSAgICAgIDwhLS0gRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIC0tPgotICA8bWVzc2FnZSBrZXk9ImRvY3MtaGF2ZS1saW5rcy10by1kb2MiPuS7peS4i+OBruODieOCreODpeODoeODs+ODiOOBq+OBr+OBk+OBruODieOCreODpeODoeODs+ODiOOBuOOBruODquODs+OCr+OBjOOBguOCiuOBvuOBmTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWFjdGl2YXRlIERvY3VtZW50Ij7jg4njgq3jg6Xjg6Hjg7Pjg4jjga7jgqLjgq/jg4bjgqPjg5njg7zjg4jop6PpmaQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVhY3RpdmF0ZS1kb2MiPuODieOCreODpeODoeODs+ODiCB7MH0g44Gu44Ki44Kv44OG44Kj44OZ44O844OI6Kej6ZmkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlYWN0aXZhdGUtZG9jPyI+5pys5b2T44Gr44OJ44Kt44Ol44Oh44Oz44OIIHswfSDjga7jgqLjgq/jg4bjgqPjg5njg7zjg4jjgpLop6PpmaTjgZfjgb7jgZnjgYvvvJ88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIERvY3VtZW50Ij7jg4njgq3jg6Xjg6Hjg7Pjg4jjga7liYrpmaQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVsZXRlLWRvYyI+44OJ44Kt44Ol44Oh44Oz44OIIHswfSDjga7liYrpmaQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY2Fubm90LWRlYWN0aXZhdGUtdW5sZXNzLWNoaWxkcmVuLWRlYWN0aXZhdGVkIj7ku6XkuIvjga7lrZDjg4njgq3jg6Xjg6Hjg7Pjg4jjgYzjgqLjgq/jg4bjgqPjg5njg7zjg4jop6PpmaTnirbmhYvjgafjgarjgZHjgozjgbDjgIHjgZPjga7jg4njgq3jg6Xjg6Hjg7Pjg4jjga7jgqLjgq/jg4bjgqPjg5njg7zjg4jjgpLop6PpmaTjgafjgY3jgb7jgZvjgpM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVsZXRlLWxhbmd1YWdlLXZlcnNpb25zPyI+5pys5b2T44Gr44OJ44Kt44Ol44Oh44Oz44OIIHswfSDjga7jgZnjgbnjgabjga7oqIDoqp7jg5Djg7zjgrjjg6fjg7PjgpLliYrpmaTjgZfjgabjgoLjgojjgo3jgZfjgYTjgafjgZnjgYvvvJ88L21lc3NhZ2U+Ci0gICAgICA8IS0tIEFyY2hpdmUgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQXJjaGl2ZSBEb2N1bWVudCI+44OJ44Kt44Ol44Oh44Oz44OI44Gu44Ki44O844Kr44Kk44OWPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImFyY2hpdmUtZG9jIj7jg4njgq3jg6Xjg6Hjg7Pjg4ggezB9IOOBruOCouODvOOCq+OCpOODljwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYz8iPuacrOW9k+OBq+ODieOCreODpeODoeODs+ODiCB7MH0g44KS44Ki44O844Kr44Kk44OW44GX44G+44GZ44GL77yfPC9tZXNzYWdlPgotICAgICAgPCEtLSBSZW5hbWUgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIERvY3VtZW50Ij7jg4njgq3jg6Xjg6Hjg7Pjg4jjga7lkI3liY3lpInmm7Q8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmVuYW1lLWRvYyI+44OJ44Kt44Ol44Oh44Oz44OIIHswfSDjga7lkI3liY3lpInmm7Q8L21lc3NhZ2U+Ci0gICAgICA8IS0tIENvcHkgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQ29weSBEb2N1bWVudCI+44OJ44Kt44Ol44Oh44Oz44OI44Gu44Kz44OU44O8PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNvcHktZG9jLXRvLWNsaXA/Ij7jg4njgq3jg6Xjg6Hjg7Pjg4ggezB9IOOCkuOCs+ODlOODvOOBl+OCr+ODquODg+ODl+ODnOODvOODieOBq+enu+WLleOBleOBm+OBvuOBmeOBi++8nyDjgYrlpb3jgb/jga7loLTmiYDjgavlvozjgafosrzjgorku5jjgZHjgpLjgZnjgovjgZPjgajjgYzlh7rmnaXjgb7jgZk8L21lc3NhZ2U+Ci0gICAgICA8IS0tIFBhc3RlIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IlBhc3RlIERvY3VtZW50Ij7jg4njgq3jg6Xjg6Hjg7Pjg4jjga7osrzjgorku5jjgZE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icGFzdGUtZG9jLWZyb20tY2xpcD8iPuOCr+ODquODg+ODl+ODnOODvOODieOBi+OCieODieOCreODpeODoeODs+ODiCB7MH0g44KS6LK844KK5LuY44GR44GX44G+44GZ44GL77yfPC9tZXNzYWdlPgotICAgICAgPCEtLSBDdXQgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQ3V0IERvY3VtZW50Ij7jg4njgq3jg6Xjg6Hjg7Pjg4jjga7liIfjgorlj5bjgoo8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY3V0LWRvYy10by1jbGlwPyI+44OJ44Kt44Ol44Oh44Oz44OIIHswfSDjgpLliIfjgorlj5bjgorjgq/jg6rjg4Pjg5fjg5zjg7zjg4njgavnp7vli5XjgZXjgZvjgb7jgZnjgYvvvJ8g44GK5aW944G/44Gu5aC05omA44Gr5b6M44Gn6LK844KK5LuY44GR44KS44GZ44KL44GT44Go44GM5Ye65p2l44G+44GZPC9tZXNzYWdlPgotICAgIDwhLS1DaGFuZ2UgdmlzaWJpbGl0eSBpbiBuYXZpZ2F0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IkNoYW5nZSI+5aSJ5pu0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNoYW5nZSBEb2N1bWVudCB2aXNpYmxpdHkgaW4gbmF2aWdhdGlvbiI+44OK44OT44Ky44O844K344On44Oz44Gn44Gu44OJ44Kt44Ol44Oh44Oz44OI44Gu5Y+v6KaW5oCn44Gu5aSJ5pu0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZpc2liaWxpdHkgaW4gbmF2aWdhdGlvbiI+44OK44OT44Ky44O844K344On44Oz44Gn44Gu5Y+v6KaW5oCnPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InZpc2libGUiPuWPr+imljwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJoaWRkZW4iPuS4jeWPr+imljwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gQXNzZXQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEltYWdlIj7jgqTjg6Hjg7zjgrjjga7mjL/lhaU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEFzc2V0Ij7jgqLjgrvjg4Pjg4jjga7mjL/lhaU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXNzZXQgVXBsb2FkIj7jgqLjgrvjg4Pjg4jjga7jgqLjg4Pjg5fjg63jg7zjg4k8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IGEgbmV3IEltYWdlIj7mlrDopo/jgqTjg6Hjg7zjgrjjga7mjL/lhaU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXBsb2FkIGFuIEFzc2V0Ij7jgqLjgrvjg4Pjg4jjga7jgqLjg4Pjg5fjg63jg7zjg4k8L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIHdvcmtmbG93ICAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJWYWx1ZSI+5YCkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkV2ZW50Ij7jgqTjg5njg7Pjg4g8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVmFyaWFibGVzIj7lpInmlbA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSGlzdG9yeSI+5bGl5q20PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN0YXRlIj7nirbms4E8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgQWRkcmVzcyI+SVDjgqLjg4njg6zjgrk8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZWRpdCI+57eo6ZuGPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InN1Ym1pdCI+6YCB5L+hPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlamVjdCI+5ouS5ZCmPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InB1Ymxpc2giPuODkeODluODquODg+OCt+ODpTwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gYXNzZXQgIC0tPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBBc3NldCI+5paw6KaP44Ki44K744OD44OIPC9tZXNzYWdlPgotCi0gIDwhLS0gSW5mbyBSQyAgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQ3VycmVudCBWZXJzaW9uIj7nj77lnKjjga7jg5Djg7zjgrjjg6fjg7M8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sbGJhY2sgdG8gdGhpcyByZXZpc2lvbiI+44GT44Gu44Oq44OT44K444On44Oz44Gr44Ot44O844Or44OQ44OD44KvPC9tZXNzYWdlPgotCi0gIDwhLS0gSW5mbyBBQyAgLS0+Ci0gIDxtZXNzYWdlIGtleT0iU1NMIEVuY3J5cHRpb24iPlNTTCDmmpflj7fljJY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWNjZXNzIE9iamVjdCI+QWNjZXNzJiMxNjA7T2JqZWN0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InZpc2l0Ij7oqKrllY88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0icmV2aWV3ZXIiPnJldmlld2VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImVkaXRvciI+57eo6ZuG6ICFPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImFkbWluIj7nrqHnkIbogIU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0id29ybGQiPuS4lueVjDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ0aGUgd29ybGQiPuS4lueVjDwvbWVzc2FnZT4KLQotICA8IS0tIFNjaGVkdWxlciAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgam9iIj7mlrDopo/jgrjjg6fjg5Y8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQWN0aXZlIGpvYnMiPuacieWKueOBquOCuOODp+ODljwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaXNoIGFuZCBFeHBvcnQiPuODkeODluODquODg+OCt+ODpe+8j+OCqOOCr+OCueODneODvOODiDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2MtaGFzLWxpbmtzLXRvLXVucHVibGlzaGVkIj7jgZPjga7jg4njgq3jg6Xjg6Hjg7Pjg4jjgavjga/ku6XkuIvjga7jg5Hjg5bjg6rjg4Pjgrfjg6XjgZXjgozjgabjgYTjgarjgYTjg4njgq3jg6Xjg6Hjg7Pjg4jjgbjjga7jg6rjg7Pjgq/jgYzlkKvjgb7jgozjgabjgYTjgb7jgZnvvJo8L21lc3NhZ2U+Ci0KLSAgPCEtLSBOZXcgRG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUGxlYXNlIGNoZWNrIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgY2F1c2VzIG9mIHRoZSBleGNlcHRpb24iPuS+i+WkluOBjOeZuueUn+OBl+OBvuOBl+OBn++8muS7peS4i+OBruWPr+iDveaAp+OBjOOBguOCiuOBvuOBmeOBruOBp+eiuuiqjeOBl+OBpuOBj+OBoOOBleOBhDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJleGNlcHRpb24uY2F1c2UuY3JlYXRlZG9jLndoaXRlc3BhY2UtaW4taWQiPklEIOOBq+epuueZveaWh+Wtl+OCkuWQq+OCgeOCi+OBk+OBqOOBr+WHuuadpeOBvuOBm+OCkzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJleGNlcHRpb24uY2F1c2UuY3JlYXRlZG9jLmlkLWluLXVzZSI+44GT44GuIElEIOOBr+aXouOBq+S9v+OCj+OCjOOBpuOBhOOBvuOBmTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmYWlsbWVzc2FnZS5jcmVhdGVkb2MuaW52YWxpZGZvcm1hdCI+SUQg44OV44Kj44O844Or44OJ44Gr44GvIOato+OBl+OBhOaWh+Wtl+OCkuWFpeOCjOOBpuOBj+OBoOOBleOBhO+8miBBLVosIGEteiwgMC05IOOBguOCi+OBhOOBryAtIOOBruOBv+OBjOWIqeeUqOWPr+iDveOBp+OBmTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJmYWlsbWVzc2FnZS5jcmVhdGVkb2MucmVxdWlyZWQiPuW/hemgiOmgheebriAoKikg44Gu5YCk44KS44GZ44G544Gm5rqA44Gf44GX44Gm44GP44Gg44GV44GEPC9tZXNzYWdlPgotCi0gIDwhLS0gQXNzZXQgVXBsb2FkL0luc2VydCBEaWFsb2cgLS0+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuYXNzZXR1cGxvYWQuc3VidGl0bGUiPuOCouOCu+ODg+ODiOODqeOCpOODluODqeODquOBuOOBrui/veWKoDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBc3NldCBMaWJyYXJ5Ij7jgqLjgrvjg4Pjg4jjg6njgqTjg5bjg6njg6o8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gYXNzZXRzIGF2YWlsYWJsZSI+44Ki44K744OD44OI44Gv5Yip55So5LiN5Y+v6IO944Gn44GZPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBBc3NldCI+44Ki44K744OD44OI44Gu5oy/5YWlPC9tZXNzYWdlPgotCi0gIDwhLS0gSW1hZ2UgVXBsb2FkL0luc2VydCBEaWFsb2cgLS0+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuaW1hZ2V1cGxvYWQudGl0bGUiPuOCpOODoeODvOOCuOOBruaMv+WFpTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5zZWxlY3RpbWFnZS5sYWJlbCI+44Kk44Oh44O844K444Gu6YG45oqePC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLmluZm8ubm9pbWFnZXMiPuOCpOODoeODvOOCuOOBr+WIqeeUqOS4jeWPr+iDveOBp+OBmTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5saW5rcy5oaW50Ij7lpJbpg6jjg6rjgr3jg7zjgrnjgbjjga7jg6rjg7Pjgq/jga8gJ2h0dHA6Ly8nIOOBi+OCieWni+OCgeOAgeWGhemDqOODquOCveODvOOCueOBuOOBryAnLycg44GL44KJ5aeL44KB44KL44KI44GG44Gr44GX44Gm44GP44Gg44GV44GEPC9tZXNzYWdlPgotCi0gIDwhLS0gUmV2aXNpb24gQ29udHJvbGxlciAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJSZWFzb24iPueQhueUsTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlbmFtZSI+44OV44Kh44Kk44Or5ZCNPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tvdXQiPuODquOCveODvOOCueOBjOODgeOCp+ODg+OCr+OCouOCpuODiO+8iGNoZWNrIG91dO+8ieOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBnzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5yYy5jaGVja2Vkb3V0YWxyZWFkeSI+44GT44Gu44Oq44K944O844K544Gv5pei44Gr5LuW44Gu44Om44O844K244GM44OB44Kn44OD44Kv44Ki44Km44OI44GX44Gm44GE44G+44GZPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tpbiI+44Oq44K944O844K544KS44OB44Kn44OD44Kv44Kk44Oz44Gn44GN44G+44Gb44KT44Gn44GX44GfPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkdlbmVyaWMgRXhjZXB0aW9uIj7kuIDoiKznmoTkvovlpJY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2hlY2sgdGhlIGxvZyBmaWxlcy4iPuODreOCsOODleOCoeOCpOODq+OCkueiuuiqjeOBl+OBpuOBj+OBoOOBleOBhDwvbWVzc2FnZT4KLTwvY2F0YWxvZ3VlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9ubC54bWwgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX25sLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllOGVlYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX25sLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTxjYXRhbG9ndWUgeG1sOmxhbmc9Im5sIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0KLSAgPCEtLSBjb21tb24gdXNlZCB3b3JkcyAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJTYXZlIj5PcHNsYWFuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlN1Ym1pdCI+VmVyc3R1dXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2FuY2VsIj5BZmJyZWtlbjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkRlbGV0ZSI+VmVyd2lqZGVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5PVEUiPkxldCBPcDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJObyByZWZlcmVyIj5HZWVuIHRlcnVndmVyd2lqemluZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZWZlcmVyIj5UZXJ1Z3Zlcndpanppbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRVhDRVBUSU9OIj5FWENFUFRJRTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIj5HZWJydWlrZXI8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJsaXZlIj5saXZlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Im5vdCI+bmlldDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhdXRob3JpbmciPnNjaHJpanZlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBdXRob3JpbmciPlNjaHJpanZlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXZpZXciPmNvbnRyb2xlPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVzZXIiPmdlYnJ1aWtlcjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IlVzZXJzIj5HZWJydWlrZXJzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Imdyb3VwIj5ncm9lcDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCI+R3JvZXA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXBzIj5Hcm9lcGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIElEIj5Hcm9lcCBJRDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJZZXMiPkphPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iTm8iPk5lZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZXNjcmlwdGlvbiI+QmVzY2hyaWp2aW5nPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5hbWUiPk5hYW08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRnVsbCBOYW1lIj5Wb2xsZWRpZ2UgbmFhbTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXF1aXJlZCBmaWVsZHMiPnZlcnBsaWNodGUgdmVsZGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlNlYXJjaCI+Wm9lazwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkhvbWUiPlN0YXJ0cGFnaW5hPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRpdGxlIj5UaXRlbDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMYXN0IG1vZGlmaWVkIj5MYWF0c3RlJiMxNjA7d2lqemlnaW5nPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik92ZXJ2aWV3Ij5PdmVyemljaHQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sZSI+Um9sPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZpZXciPkFhbnppY2h0PC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iQXNzZXRzIj5PbmRlcmRlbGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InRydWUiPmphPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZhbHNlIj5uZWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIj5IZXJub2VtZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW9kaWZ5Ij5WZXJhbmRlcmVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvY3VtZW50Ij5Eb2N1bWVudDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkRhdGUiPkRhdHVtPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkJhY2siPlRlcnVnPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCI+VG9ldm9lZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSI+TWFrZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVGhlIEFyY2hpdmUiPkhldCBBcmNoaWVmPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRyYXNoIj5QcnVsbGVuYmFrPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iUHVibGlzaGVyIj5FaWdlbmFhcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOYXZpZ2F0aW9uIFRpdGxlIj5OYXZpZ2F0aWUgVGl0ZWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ3JlYXRvciI+TWFrZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTGFuZ3VhZ2UiPlRhYWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3ViamVjdCI+T25kZXJ3ZXJwPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlJpZ2h0cyI+UmVjaHRlbjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IlNlbGVjdCBGaWxlIj5LaWVzIEJlc3RhbmQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic2VsZWN0LW9iamVjdCI+S2llcyB7MH08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0Ij5Ub2V2b2VnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEZpbGUiPkJlc3RhbmQgdG9ldm9lZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVwbG9hZC13aXRoLWludmFsaWQtZXh0ZW5zaW9uIj5VIGhlZWZ0IGdlcHJvYmVlcmQgZWVuIGJlc3RhbmQgbWV0IGVlbiBvbmp1aXN0ZSBleHRlbnRpZSB0b2UgdGUgdm9lZ2VuLiAgSnVpc3RlIGV4dGVudGllcyB6aWpuezB9LiAgTWVyayBvcCBkYXQgZXh0ZW50aWVzIG1ldCBrbGVpbmUgbGV0dGVycyBtb2V0ZW4gd29yZGVuIGdlc2NocmV2ZW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InVwbG9hZC13aXRoLW1pc3NpbmctdGl0bGUiPlUgaGVlZnQgZ2Vwcm9iZWVyZCBlZW4gYmVzdGFuZCB6b25kZXIgZWVuIHRpdGVsIHRvZSB0ZSB2b2VnZW4uPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iZmlsZW5hbWUtZm9ybWF0LWV4Y2VwdGlvbiI+RGUgYmVzdGFuZHNuYWFtIHZhbiBoZXQgYmVzdGFuZCBkYXQgdSBwcm9iZWVydCB0b2UgdGUgdm9lZ2VuIGhlZWZ0IGdlZW4gZXh0ZW50aWUgb2YgYmV2YXQga2FyYWt0ZXJzIGRpZSBuaWV0IHppam4gdG9lZ2VzdGFhbiB6b2FscyBzcGF0aWVzIG9mIHRyZW1hJ3MuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNyZWF0aW9uIERhdGUiPkFhbm1hYWsgZGF0dW08L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRmlsZSBTaXplIj5CZXN0YW5kcyBvbXZhbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSW1hZ2UiPkFmYmVlbGRpbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTGluayI+VmVyd2lqemluZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDYXB0aW9uIj5PbmRlcnNjaHJpZnQ8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJBbGwgcmlnaHRzIHJlc2VydmVkIj5BbGxlIHJlY2h0ZW4gdm9vcmJlaG91ZGVuLjwvbWVzc2FnZT4KLQotICA8IS0tIHN1Ym1pdCBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0ic3VibWl0LWZvci1hcHByb3ZhbCI+QmllZCB7MH0gYWFuIHZvb3IgZ29lZGtldXJpbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ic3VibWl0LWZvci1hcHByb3ZhbD8iPldpbHQgdSB7MH0gYWFuYmllZGVuIHZvb3IgZ29lZGtldXJpbmc/PC9tZXNzYWdlPgotCi0gIDwhLS0gcHVibGlzaCBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCI+UHVibGljZWVyPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iU291cmNlIEZpbGUocykiPkJyb24gQmVzdGFuZChlbik8L21lc3NhZ2U+Ci0KLSAgPCEtLSBsb2dpbiBzY3JlZW4gLS0+Ci0gIDxtZXNzYWdlIGtleT0ibG9naW4tdG8tcHViIj5BYW5tZWxkZW4gdm9vciBkZSB7MH0gUHVibGljYXRpZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2dpbiI+SW5sb2dnZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUGFzc3dvcmQiPldhY2h0d29vcmQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlcm5hbWUiPkdlYnJ1aWtlcnNuYWFtPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iQXV0aGVudGljYXRpb24gZmFpbGVkIj5BdXRoZW50aWNhdGllIG1pc2x1a3Q8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEtYWxpY2UiPlByb2JlZXIgZ2VicnVpa2VyIHswfSBtZXQgd2FjaHR3b29yZCB7MX0gKGF1dGV1ciksIG9mIGdlYnJ1aWtlciB7Mn0gZW4gd2FjaHR3b29yZCB7M30gKHJldmlld2VyKTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ0cnktdXNlci1sZW55YSI+UHJvYmVlciBnZWJydWlrZXIgezB9IG1ldCB3YWNodHdvb3JkIHsxfTwvbWVzc2FnZT4KLSAgCi0gIDwhLS0gbG9nb3V0IHNjcmVlbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJsb2dvdXQtZnJvbS1wdWIiPkFmbWVsZGVuIHZvb3IgZGUgezB9IFB1YmxpY2F0aWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iWW91ciBIaXN0b3J5Ij5VdyBoaXN0b3JpZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2dpbiB0byBBdXRob3JpbmcgQXJlYSI+SW5sb2dnZW4gaW4gaGV0IHNjaHJpamYgb25kZXJkZWVsPC9tZXNzYWdlPgotCi0gIDwhLS0gcmVqZWN0IHNjcmVlbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJSZWplY3QiPkFmd2lqemVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlamVjdC1kb2M/Ij5XaWx0IHUgaGV0IGRvY3VtZW50IHswfSBhZndpanplbj88L21lc3NhZ2U+Ci0KLSAgPCEtLSBjbXMgbWVudSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgRG9jdW1lbnQiPk5pZXV3IERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyAuLi4gRG9jdW1lbnQiPk5pZXV3IHswfSBEb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgTGFuZ3VhZ2UgVmVyc2lvbiI+TmlldXdlIHRhYWwgdmVyc2llPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iUmVtb3ZlIExhbmd1YWdlIFZlcnNpb24iPlZlcndpamRlciB0YWFsIHZlcnNpZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlIj5CZXN0YW5kPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQiPldpanppZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXb3JrZmxvdyI+V29ya2Zsb3c8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVhY3RpdmF0ZSI+RGVhY3RpdmF0ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZSI+U2NoZWR1bGU8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJDb3B5Ij5Lb3BpZWVyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlBhc3RlIj5QbGFra2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkN1dCI+S25pcHBlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIZWxwIj5IZWxwPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRlYnVnIj5EZWJ1ZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUiPlZlcndpamRlcjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkFyY2hpdmUiPkFyY2hpdmVlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSZXN0b3JlIj5IZXJzdGVsPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik1vdmUgVXAiPlZlcnBsYWF0cyBvbWhvb2c8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTW92ZSBEb3duIj5WZXJwbGFhdHMgb21sYWFnPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkxvZ291dCI+VWl0bG9nZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZpZXcgVGFzayBMb2dzIj5CZWtpamsgdGFhayBsb2dzPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iU3VwcG9ydCI+T25kZXJzdGV1bmluZzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTeXN0ZW0gRG9jdW1lbnRhdGlvbiI+U3lzdGVlbSYjMTYwO0RvY3VtZW50YXRpZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIERvY3VtZW50YXRpb24iPkdlYnJ1aWtlcnMgRG9jdW1lbnRhdGllPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFib3V0IEFwYWNoZSBMZW55YSI+T3ZlciBBcGFjaGUgTGVueWE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQXBhY2hlIExlbnlhIEhvbWVwYWdlIj5BcGFjaGUgTGVueWEgU3RhcnRwYWdpbmE8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iV2lqemlnIG1ldCBLdXB1Ij4KLQotICAgIDx4aHRtbDphYmJyIHRpdGxlPSJXaGF0JiMxNjA7WW91JiMxNjA7U2VlJiMxNjA7SXMmIzE2MDtBbGwmIzE2MDtZb3UmIzE2MDtHZXQiPldZU0lXWUc8L3hodG1sOmFiYnI+JiMxNjA7RWRpdG9yJiMxNjA7KEt1cHUpCi0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJXaWp6aWcgbWV0IEJYRSI+Ci0gICAgPHhodG1sOmFiYnIgdGl0bGU9IldoYXQmIzE2MDtZb3UmIzE2MDtTZWUmIzE2MDtJcyYjMTYwO0FsbCYjMTYwO1lvdSYjMTYwO0dldCI+V1lTSVdZRzwveGh0bWw6YWJicj4mIzE2MDtFZGl0b3ImIzE2MDsoQlhFKQotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIG9uZSBGb3JtIj5Ccm9uY29kZSYjMTYwO0VkaXRvcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IHdpdGggRm9ybXMiPkZvcm11bGllciYjMTYwO0VkaXRvcjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkVkaXQgTWV0YWRhdGEiPldpanppZyYjMTYwO01ldGFkYXRhPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgTmF2aWdhdGlvbiBUaXRsZSI+V2lqemlnJiMxNjA7TmF2aWdhdGllJiMxNjA7VGl0ZWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIFVSTCI+SGVybm9lbSYjMTYwO1VSTDwvbWVzc2FnZT4KLQotICA8IS0tIGNtcyB0YWJzIC0tPgotICA8bWVzc2FnZSBrZXk9IlNlcnZlciBUaW1lIj5TZXJ2ZXIgVGlqZDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IldvcmtmbG93IFN0YXRlIj5Xb3JrZmxvdyBTdGF0dXM8L21lc3NhZ2U+Ci0KLSAgPCEtLSBBZG1pbmlzdHJhdGlvbiB0YWIgLS0+Ci0gIDxtZXNzYWdlIGtleT0iQWRtaW5pc3RyYXRpb24iPkJlaGVlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZWFsbHktZGVsZXRlPyI+ezB9IGVjaHQgdmVyd2lqZGVyZW4/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhlIHRyYXNoID8iPldlZXQgdSB6ZWtlciBkYXQgdSBkZSBwcnVsbGVuYmFrIHdpbHQgbGVnZW4/PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3QiPlZlcndpamRlciB7MH08L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJkZWxldGUtb2JqZWN0PyI+V2VldCB1IHpla2VyIGRhdCB1IHswfSB3aWx0IHZlcndpamRlcmVuPzwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJQYXNzd2QiPldhY2h0d29vcmQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU3dpdGNoIFVzZXIiPlZhbiBnZWJydWlrZXIgd2lzc2VsZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIFRyYXNoIj5QcnVsbGVuYmFrIGxlZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkNvY29vbiBhbmQgU2VydmVyIFN0YXR1cyI+U3RhdHVzIHZhbiBDb2Nvb24gZW4gZGUgU2VydmVyPC9tZXNzYWdlPgotCi0gICAgPCEtLSBHcm91cCBBZG1pbmlzdHJhdGlvbiAtLT4KLQotICA8bWVzc2FnZSBrZXk9IlByb2ZpbGUiPlByb2ZpZWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTWVtYmVycyI+TGVkZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2VzIj5JUCYjMTYwO0JlcmVpa2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgUHJvZmlsZSI+V2lqemlnIFByb2ZpZWw8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRWRpdCBNZW1iZXJzIj5XaWp6aWcgTGVkZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAgQWRtaW5pc3RyYXRpb24iPkdyb2VwIEJlaGVlcjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkFkZCBHcm91cCI+R3JvZXAgVG9ldm9lZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIERhdGEiPkdyb2VwIEdlZ2V2ZW5zPC9tZXNzYWdlPgotCi0gICAgPCEtLSBVc2VyIEFkbWluaXN0cmF0aW9uIC0tPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgRGF0YSI+R2VicnVpa2VyJiMxNjA7R2VnZXZlbnM8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJDTVMgVXNlciBJRCI+Q01TJiMxNjA7R2VicnVpa2VyJiMxNjA7SUQ8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJMREFQIElEIj5MREFQJiMxNjA7SUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ29uZmlybSBwYXNzd29yZCI+QmV2ZXN0aWcmIzE2MDt3YWNodHdvb3JkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFkZCBVc2VyIj5HZWJydWlrZXIgdG9ldm9lZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVzZXIgQWRtaW5pc3RyYXRpb24iPkdlYnJ1aWtlciBCZWhlZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iVXNlciBEZXRhaWxzIj5HZWJydWlrZXIgRGV0YWlsczwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkFsbCBHcm91cHMiPkFsbGUgR3JvZXBlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIEdyb3VwcyI+R2VicnVpa2VyIEdyb2VwZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iR3JvdXAgQWZmaWxpYXRpb24iPkdyb3VwIFRvZXdpanppbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQ2hhbmdlIFBhc3N3b3JkIj5WZXJhbmRlciBXYWNodHdvb3JkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkVkaXQgR3JvdXAgQWZmaWxpYXRpb24iPldpanppZyBncm9lcCB0b2V3aWp6aW5nPC9tZXNzYWdlPgotCi0gICAgPCEtLSBVc2VyIFR5cGVzIC0tPgotCi0gIDxtZXNzYWdlIGtleT0iTERBUCBVc2VyIj5MREFQIEdlYnJ1aWtlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJMb2NhbCBVc2VyIj5DTVMgR2VicnVpa2VyPC9tZXNzYWdlPgotCi0gICAgPCEtLSBJUCBSYW5nZSBBZG1pbmlzdHJhdGlvbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSI+SVAmIzE2MDtCZXJlaWs8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgSUQiPklQJiMxNjA7QmVyZWlrJiMxNjA7SUQ8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJOZXR3b3JrIEFkZHJlc3MiPk5ldHdlcmsmIzE2MDtBZHJlczwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdWJuZXQgTWFzayI+U3VibmV0JiMxNjA7TWFza2VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIEFkbWluaXN0cmF0aW9uIj5JUCYjMTYwO0JlcmVpayYjMTYwO0JlaGVlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgSVAgUmFuZ2UiPklQJiMxNjA7UmFuZ2UmIzE2MDtUb2V2b2VnZW48L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSBQcm9maWxlIj5JUCYjMTYwO0JlcmVpayYjMTYwO1Byb2ZpZWw8L21lc3NhZ2U+Ci0KLSAgPCEtLSBTaXRlIHRhYiAoaW5mbyBzY3JlZW5zKSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJBdmFpbGFibGUgTGFuZ3VhZ2VzIj5CZXNjaGlrYmFyZSBUYWxlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJUaGlzIGRvY3VtZW50IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBsYW5ndWFnZS4iPkRpdCBkb2N1bWVudCBpcyBuaWV0IGJlc2NoaWtiYWFyIGluIGRlemUgdGFhbC48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRG9jdW1lbnQgSUQiPkRvY3VtZW50IElEPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iVmVyc2lvbnMiPlZlcnNpZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iU1NMIEVuY3J5cHRpb24iPlNTTCYjMTYwO0VuY3J5cHRpZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJSb2xsYmFjayB0byB0aGlzIHZlcnNpb24iPkhlcnN0ZWwgbmFhciBkZXplIHZlcnNpZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBQyBBcmNoaXZlIj5BQyYjMTYwO0FyY2hpZWY8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iQUMgVHJhc2giPkFDJiMxNjA7UHJ1bGxlbmJhazwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkFDIEF1dGgiPkFDJiMxNjA7QXV0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFDIExpdmUiPkFDJiMxNjA7TGl2ZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZXIiPlNjaGVkdWxlcjwvbWVzc2FnZT4KLQotICAgIDwhLS0gSW5mbyBzY3JlZW4gYWN0aW9ucy0tPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBOYXZpZ2F0aW9uIFRpdGxlIj5OaWV1d2UgTmF2aWdhdGllIFRpdGVsPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIERvY3VtZW50Ij5IZXJub2VtIERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBEb2N1bWVudCBJRCI+TmlldXcgRG9jdW1lbnQgSUQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gd2hpdGVzcGFjZSwgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzIj5HZWVuIHdpdHJ1aW10ZSwgZ2VlbiBzcGVjaWFsZSBrYXJha3RlcnM8L21lc3NhZ2U+Ci0gICAgICA8IS0tIFNjaGVkdWxlciAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJObyBhY3RpdmUgam9icyI+R2VlbiBhY3RpZXZlIG9wZHJhY2h0ZW4uPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRoZSBqb2IgZGF0ZSBoYXMgZXhwaXJlZCI+RGUgb3BkcmFjaHQgZGF0dW0gaXMgdmVybG9wZW4uPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iY2hlY2sgdGhlIGxvZyBmaWxlcyI+Y29udHJvbGVlciBkZSBsb2cgYmVzdGFuZGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRhc2siPk9wZHJhY2h0PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkRheSI+RGFnPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlRpbWUiPlRpamQ8L21lc3NhZ2U+Ci0gICAgICA8IS0tIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJkb2NzLWhhdmUtbGlua3MtdG8tZG9jIj5EZSB2b2xnZW5kZSBkb2N1bWVudGVuIGhlYmJlbiBlZW4gbGluayBuYWFyIGRpdCBkb2N1bWVudDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkRlYWN0aXZhdGUgRG9jdW1lbnQiPkRlYWN0aXZlZXIgRG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVhY3RpdmF0ZS1kb2MiPkRlYWN0aXZlZXIgZG9jdW1lbnQgezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImRlYWN0aXZhdGUtZG9jPyI+V2lsdCB1IGVjaHQgaGV0IGRvY3VtZW50IHswfSBkZWFjdGl2ZXJlbj88L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIERvY3VtZW50Ij5WZXJ3aWpkZXIgRG9jdW1lbnQ8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZGVsZXRlLWRvYyI+VmVyd2lqZGVyIGRvY3VtZW50IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJjYW5ub3QtZGVhY3RpdmF0ZS11bmxlc3MtY2hpbGRyZW4tZGVhY3RpdmF0ZWQiPkRpdCBkb2N1bWVudCBrYW4gbmlldCB3b3JkZW4gZ2VkZWFjdGl2ZWVyZCB2b29yZGF0IGRlIHZvbGdlbmRlIGtpbmQgZG9jdW1lbnRlbiB3b3JkZW4gZ2VkZWFjdGl2ZWVyZDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1sYW5ndWFnZS12ZXJzaW9ucz8iPldpbHQgdSBlY2h0IGFsbCB0YWFsIHZlcnNpZXMgdmFuIGhldCBkb2N1bWVudCB7MH0gdmVyd2lqZGVyZW4/PC9tZXNzYWdlPgotICAgICAgPCEtLSBBcmNoaXZlIGRvY3VtZW50IC0tPgotICA8bWVzc2FnZSBrZXk9IkFyY2hpdmUgRG9jdW1lbnQiPkFyY2hpdmVlciBEb2N1bWVudDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYyI+QXJjaGl2ZWVyIGRvY3VtZW50IHswfTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYz8iPldpbHQgdSBlY2h0IGhldCBkb2N1bWVudCB7MH0gYXJjaGl2ZXJlbj88L21lc3NhZ2U+Ci0gICAgICA8IS0tIFJlbmFtZSBkb2N1bWVudCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUgRG9jdW1lbnQiPkhlcm5vZW0gRG9jdW1lbnQ8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJyZW5hbWUtZG9jIj5IZXJub2VtIGRvY3VtZW50IHswfTwvbWVzc2FnZT4KLSAgICAgIDwhLS0gQ29weSBkb2N1bWVudCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDb3B5IERvY3VtZW50Ij5Lb3BpZWVyIERvY3VtZW50PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImNvcHktZG9jLXRvLWNsaXA/Ij5XaWx0IHUgaGV0IGRvY3VtZW50IDx4aHRtbDpxPnswfTwveGh0bWw6cT4ga29waWVyZW4gbmFhciBoZXQgY2xpcGJvYXJkPyBVIGthbiBoZXQgZG9jdW1lbnQgbGF0ZXIgcGxha2tlbiBvcCBlZW4gbG9rYXRpZSBuYWFyIGtldXplLjwvbWVzc2FnZT4KLSAgICAgIDwhLS0gUGFzdGUgZG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUGFzdGUgRG9jdW1lbnQiPkRvY3VtZW50IFBsYWtrZW48L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJwYXN0ZS1kb2MtZnJvbS1jbGlwPyI+V2lsdCB1IGhldCBkb2N1bWVudCA8eGh0bWw6cT57MH08L3hodG1sOnE+IHBsYWtrZW4gdmFuYWYgaGV0IGNsaXBib2FyZD88L21lc3NhZ2U+Ci0gICAgICA8IS0tIEN1dCBkb2N1bWVudCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDdXQgRG9jdW1lbnQiPkRvY3VtZW50IEtuaXBwZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iY3V0LWRvYy10by1jbGlwPyI+V2lsdCB1IGhldCBkb2N1bWVudCA8eGh0bWw6cT57MH08L3hodG1sOnE+IGtuaXBwZW4gZW4gdmVycGxhYXRzZW4gbmFhciBoZXQgY2xpcGJvYXJkPyBVIGt1bnQgaGV0IGRvY3VtZW50IGxhdGVyIHBsYWtrZW4gb3AgZWVuIGxva2F0aWUgbmFhciBrZXV6ZS48L21lc3NhZ2U+Ci0KLSAgICA8IS0tQ2hhbmdlIHZpc2liaWxpdHkgaW4gbmF2aWdhdGlvbiAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJDaGFuZ2UiPkFhbnBhc3NlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJDaGFuZ2UgRG9jdW1lbnQgdmlzaWJsaXR5IGluIG5hdmlnYXRpb24iPlZlcmFuZGVyIGRlIGRvY3VtZW50IHppY2h0YmFhcmhlaWQgaW4gZGUgbmF2aWdhdGllPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZpc2liaWxpdHkgaW4gbmF2aWdhdGlvbiI+WmljaHRiYWFyaGVpZCBpbiBuYXZpZ2F0aWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idmlzaWJsZSI+emljaHRiYWFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImhpZGRlbiI+dmVyYm9yZ2VuPC9tZXNzYWdlPgotCi0gIDwhLS0gSW5mbyBBc3NldCAtLT4KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgSW1hZ2UiPkFmYmVlbGRpbmcgVG9ldm9lZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBBc3NldCI+T25kZXJkZWVsIFRvZXZvZWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBc3NldCBVcGxvYWQiPk9uZGVyZGVlbCBJbmxhZGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBhIG5ldyBJbWFnZSI+TmlldXdlIEFmYmVlbGRpbmcgVG9ldm9lZ2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlVwbG9hZCBhbiBBc3NldCI+SW5sYWRlbiB2YW4gZWVuIE9uZGVyZGVlbDwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gd29ya2Zsb3cgIC0tPgotICA8bWVzc2FnZSBrZXk9IlZhbHVlIj5XYWFyZGU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iRXZlbnQiPkdlYmV1cnRlbmlzPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IlZhcmlhYmxlcyI+VmFyaWFiZWxlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJIaXN0b3J5Ij5IaXN0b3JpZTwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJTdGF0ZSI+U3RhdHVzPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0iSVAgQWRkcmVzcyI+SVAgQWRyZXM8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZWRpdCI+d2lqemlnPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InN1Ym1pdCI+YWFuYmllZGVuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9InJlamVjdCI+d2lqcyBhZjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJwdWJsaXNoIj5wdWJsaWNlZXI8L21lc3NhZ2U+Ci0KLSAgPCEtLSBJbmZvIGFzc2V0ICAtLT4KLQotICA8bWVzc2FnZSBrZXk9Ik5ldyBBc3NldCI+TmV3IE9uZGVyZGVlbDwvbWVzc2FnZT4KLQotICA8IS0tIEluZm8gUkMgIC0tPgotICA8bWVzc2FnZSBrZXk9IkN1cnJlbnQgVmVyc2lvbiI+SHVpZGlnZSBWZXJzaWU8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUm9sbGJhY2sgdG8gdGhpcyByZXZpc2lvbiI+S2VlciB0ZXJ1ZyBuYWFyIGRlemUgdmVyc2llPC9tZXNzYWdlPgotCi0gIDwhLS0gSW5mbyBBQyAgLS0+Ci0gIDxtZXNzYWdlIGtleT0iU1NMIEVuY3J5cHRpb24iPlNTTCYjMTYwO0VuY3J5cHRpZTwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9IkFjY2VzcyBPYmplY3QiPkJlbmFkZXImIzE2MDtPYmpla3Q8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0idmlzaXQiPmJlem9lazwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJyZXZpZXdlciI+cmV2aWV3ZXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iZWRpdG9yIj5hdXRldXI8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iYWRtaW4iPmJlaGVlcjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJ3b3JsZCI+d2VyZWxkPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIGtleT0idGhlIHdvcmxkIj5kZSB3ZXJlbGQ8L21lc3NhZ2U+Ci0KLSAgPCEtLSBTY2hlZHVsZXIgLS0+Ci0gIDxtZXNzYWdlIGtleT0iTmV3IGpvYiI+TmlldXcmIzE2MDtvcGRyYWNodDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJBY3RpdmUgam9icyI+QWN0aWV2ZSYjMTYwO29wZHJhY2h0ZW48L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCBhbmQgRXhwb3J0Ij5QdWJsaXNlZXIgZW4mIzE2MDtFeHBvcnQ8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJkb2MtaGFzLWxpbmtzLXRvLXVucHVibGlzaGVkIj5EaXQgZG9jdW1lbnQgaGVlZnQgbGlua3MgbmFhciBkZSB2b2xnZW5kZSBuaWV0IGdlcHVibGljZWVyZGUgZG9jdW1lbnRlbjo8L21lc3NhZ2U+Ci0KLSAgPCEtLSBOZXcgRG9jdW1lbnQgLS0+Ci0gIDxtZXNzYWdlIGtleT0iUGxlYXNlIGNoZWNrIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgY2F1c2VzIG9mIHRoZSBleGNlcHRpb24iPkNvbnRyb2xlZXIgYXViIGRlIHZvbGdlbmRlIG1vZ2VsaWprZSBvb3J6YWtlbiB2YW4gZGUgZXhjZXB0aWUuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImV4Y2VwdGlvbi5jYXVzZS5jcmVhdGVkb2Mud2hpdGVzcGFjZS1pbi1pZCI+SGV0IGlzIG5pZXQgdG9lZ2VzdGFhbiBvbSB3aXRydWltdGUgaW4gZGUgaWQgdGUgZ2VicnVpa2VuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImV4Y2VwdGlvbi5jYXVzZS5jcmVhdGVkb2MuaWQtaW4tdXNlIj5EZSBpZCBpcyBhbCBpbiBnZWJydWlrPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImZhaWxtZXNzYWdlLmNyZWF0ZWRvYy5pbnZhbGlkZm9ybWF0Ij5WdWwgYXViIGVlbiB2YWxpZGUgd2FhcmRlIHZvb3IgaGV0IElEIHZlbGQgaW4uIEEtWiwgYS16LCAwLTkgb2YgLSB6aWpuIHZhbGlkZSBjaGFyYWN0ZXJzLjwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBrZXk9ImZhaWxtZXNzYWdlLmNyZWF0ZWRvYy5yZXF1aXJlZCI+QXViIGFsbCB2ZXJwbGljaHRlIHZlbGRlbiAoKikgaW52dWxsZW4uPC9tZXNzYWdlPgotCi0gIDwhLS0gQXNzZXQgVXBsb2FkL0luc2VydCBEaWFsb2cgLS0+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuYXNzZXR1cGxvYWQuc3VidGl0bGUiPlZvZWcgdG9lIGFhbiBPbmRlcmRlbGVuIGJpYmxpb3RoZWVrPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9IkFzc2V0IExpYnJhcnkiPk9uZGVyZGVsZW4gQmlibGlvdGhlZWs8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0iTm8gYXNzZXRzIGF2YWlsYWJsZSI+R2VlbiBPbmRlcmRlbGVuIGJlc2NoaWtiYWFyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ikluc2VydCBBc3NldCI+T25kZXJkZWVsIHRvZXZvZWdlbjwvbWVzc2FnZT4KLQotICA8IS0tIEltYWdlIFVwbG9hZC9JbnNlcnQgRGlhbG9nIC0tPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLnRpdGxlIj5BZmJlZWxkaW5nIFRvZXZvZWdlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5zZWxlY3RpbWFnZS5sYWJlbCI+U2VsZWN0ZWVyIEFmYmVlbGRpbmc8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIGtleT0ibGVueWEuaW1hZ2V1cGxvYWQuaW5mby5ub2ltYWdlcyI+R2VlbiBhZmJlZWxkaW5nZW4gYmVzY2hpa2JhYXIuPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLmxpbmtzLmhpbnQiPkV4dGVybmUgbGlua3MgbW9ldGVuIGJlZ2lubmVuIG1ldCAnaHR0cDovLycsIGludGVybmUgbGlua3MgbW9ldGVuIGJlZ2lubmVuIG1ldCAnLyc8L21lc3NhZ2U+Ci0KLSAgPCEtLSBSZXZpc2lvbiBDb250cm9sbGVyIC0tPgotCi0gIDxtZXNzYWdlIGtleT0iUmVhc29uIj5SZWRlbjwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJGaWxlbmFtZSI+QmVzdGFuZHNuYWFtPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tvdXQiPk1pZGRlbCBrb24gbmlldCB3b3JkZW4gdWl0Z2VjaGVja2VkPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLmNoZWNrZWRvdXRhbHJlYWR5Ij5IZXQgbWlkZGVsIGlzIGluIGJld2Vya2luZyBkb29yIGVlbiBhbmRlcmUgZ2VicnVpa2VyPC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tpbiI+TWlkZGVsIGtvbiBuaWV0IHdvcmRlbiBpbmdlY2hlY2tlZDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2Uga2V5PSJHZW5lcmljIEV4Y2VwdGlvbiI+QWxnZW1lbmUgRXhjZXB0aWU8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2Uga2V5PSJDaGVjayB0aGUgbG9nIGZpbGVzLiI+Q29udHJvbGVlciBkZSBsb2cgYmVzdGFuZGVuLjwvbWVzc2FnZT4KLTwvY2F0YWxvZ3VlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfcHQueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9wdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWVhZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9jbXN1aV9wdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotICAkSWQ6IGNtc3VpX3B0LnhtbCAxMTE2NzYgMjAwNS0wNi0xNSAyMzo1MDo0M1ogZ3JlZ29yICQNCi0NCi0gICBAdHJhbnNsYXRvcnMgUm9sYW5kbyBJc2lkb3JvIDxybGkgYXQgdW5pbm92YSBkb3QgcHQ+DQotDQotLS0+DQotDQotPGNhdGFsb2d1ZSB4bWw6bGFuZz0icHQiIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0NCi0gIDwhLS0gY29tbW9uIHVzZWQgd29yZHMgLS0+DQotICA8bWVzc2FnZSBrZXk9IlNhdmUiPkd1YXJkYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlN1Ym1pdCI+U3VibWV0ZXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkNhbmNlbCI+Q2FuY2VsYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkRlbGV0ZSI+RWxpbWluYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ik5PVEUiPk5vdGE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ik5vIHJlZmVyZXIiPlNlbSByZWZlcsOqbmNpYTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iUmVmZXJlciI+UmVmZXLDqm5jaWE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkVYQ0VQVElPTiI+RVhDRVDDh8ODTzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iVXNlciI+VXRpbGl6YWRvcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0ibGl2ZSI+cHJvZHXDp8OjbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0ibm90Ij5uw6NvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJhdXRob3JpbmciPmVkacOnw6NvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJBdXRob3JpbmciPkVkacOnw6NvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJyZXZpZXciPlJldmlzw6NvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ1c2VyIj51dGlsaXphZG9yPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJVc2VycyI+VXRpbGl6YWRvcmVzPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJncm91cCI+Z3J1cG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIj5HcnVwbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iR3JvdXBzIj5HcnVwb3M8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ikdyb3VwIElEIj5JRCBHcnVwbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iWWVzIj5TaW08L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ik5vIj5Ow6NvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJEZXNjcmlwdGlvbiI+RGVzY3Jpw6fDo288L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ik5hbWUiPk5vbWU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkZ1bGwgTmFtZSI+Tm9tZSBjb21wbGV0bzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0icmVxdWlyZWQgZmllbGRzIj5jYW1wb3MgbmVjZXNzw6FyaW9zPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJTZWFyY2giPlByb2N1cmFyPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJIb21lIj5JbsOtY2lvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJUaXRsZSI+VMOtdHVsbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iTGFzdCBtb2RpZmllZCI+w5psdGltYSBtb2RpZmljYcOnw6NvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJPdmVydmlldyI+R2VyYWw8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlJvbGUiPlJvbDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iVmlldyI+VmVyPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJBc3NldHMiPkFjdGl2b3M8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InRydWUiPnZlcmRhZGU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImZhbHNlIj5mYWxzbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIj5SZW5vbWVhcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iTW9kaWZ5Ij5Nb2RpZmljYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkRvY3VtZW50Ij5Eb2N1bWVudG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkRhdGUiPkRhdGE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkJhY2siPkF0csOhczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQWRkIj5BZGljaW9uYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkNyZWF0ZSI+Q3JpYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlRoZSBBcmNoaXZlIj5PJiMxNjA7QXJxdWlpdm88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlRyYXNoIj5SZWNpY2xhZ2VtPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJQdWJsaXNoZXIiPkVkaXRvcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iTmF2aWdhdGlvbiBUaXRsZSI+VMOtdHVsbyBkZSBOYXZlZ2HDp8OjbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQ3JlYXRvciI+QXV0b3I8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ikxhbmd1YWdlIj5JZGlvbWE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlN1YmplY3QiPlRlbWE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlJpZ2h0cyI+UGVybWlzc8O1ZXM8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlNlbGVjdCBGaWxlIj5TZWxlY2Npb25lIGZpY2hlaXJvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJzZWxlY3Qtb2JqZWN0Ij5TZWxlY2Npb25lIHswfTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0Ij5JbnNlcmlyPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJJbnNlcnQgRmlsZSI+SW5zZXJpciYjMTYwO2ZpY2hlaXJvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ1cGxvYWQtd2l0aC1pbnZhbGlkLWV4dGVuc2lvbiI+VGVudG91IGFkaWNpb25hciB1bSBmaWNoZWlybyBjb20gdW1hIGV4dGVuc8OjbyBpbnbDoWxpZGEuIEFzIGV4dGVuc8O1ZXMgdsOhbGlkYXMgc8OjbyB7MH08L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InVwbG9hZC13aXRoLW1pc3NpbmctdGl0bGUiPlRlbnRvdSBhZGljaW9uYXIgdW0gZmljaGVpcm8gc2VtIHTDrXR1bG8uPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJmaWxlbmFtZS1mb3JtYXQtZXhjZXB0aW9uIj5PIG5vbWUgZG8gZmljaGVpcm8gcXVlIGVzdMOhIGEgdGVudGFyIGFkaWNpb25hciBuw6NvIHRlbSBleHRlbnPDo28gb3UgY29udMOpbSBjYXJhY3TDqXJlcyBuw6NvIHBlcm1pdGlkb3MuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJDcmVhdGlvbiBEYXRlIj5EYXRhIGRlIGNyaWHDp8OjbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iRmlsZSBTaXplIj5UYW1hbmhvIGRvIGZpY2hlaXJvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJJbWFnZSI+SW1hZ2VtPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJMaW5rIj5MaW5rPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJDYXB0aW9uIj5TdWJ0w610dWxvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJBbGwgcmlnaHRzIHJlc2VydmVkIj5Ub2RvcyBvcyBkaXJlaXRvcyByZXNlcnZhZG9zLjwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gc3VibWl0IHNjcmVlbiAtLT4NCi0gIDxtZXNzYWdlIGtleT0ic3VibWl0LWZvci1hcHByb3ZhbCI+U3VibWV0ZXIgezB9IHBhcmEgYXByb3Zhw6fDo288L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InN1Ym1pdC1mb3ItYXBwcm92YWw/Ij5EZXNlamEgc3VibWV0ZXIgezB9IHBhcmEgYXByb3Zhw6fDo28/PC9tZXNzYWdlPg0KLQ0KLSAgPCEtLSBwdWJsaXNoIHNjcmVlbiAtLT4NCi0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCI+UHVibGljYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlNvdXJjZSBGaWxlKHMpIj5GaWNoZWlybyhzKSBGb250ZTwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gbG9naW4gc2NyZWVuIC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJsb2dpbi10by1wdWIiPkFjZWRlciDDoCBwdWJsaWNhw6fDo28gezB9PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJMb2dpbiI+TG9naW48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlBhc3N3b3JkIj5QYXNzd29yZDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iVXNlcm5hbWUiPk5vbWUgZG8gdXRpbGl6YWRvcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQXV0aGVudGljYXRpb24gZmFpbGVkIj5FcnJvIG5hIGF1dGVudGljYcOnw6NvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJ0cnktdXNlci1sZW55YS1hbGljZSI+VGVudGUgY29tIHV0aWxpemFkb3IgezB9IGUgcGFzc3dvcmQgezF9IChlZGl0b3IpIG91IHV0aWxpemFkb3IgezJ9IGUgcGFzc3dvcmQgezN9IChyZXZpc29yKTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEiPlRlbnRlIGNvbSB1dGlsaXphZG9yIHswfSBlIHBhc3N3b3JkIHsxfTwvbWVzc2FnZT4KLSAgDQotICA8IS0tIGxvZ291dCBzY3JlZW4gLS0+DQotICA8bWVzc2FnZSBrZXk9ImxvZ291dC1mcm9tLXB1YiI+U2FpciBkYSBwdWJsaWNhw6fDo28gezB9PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJZb3VyIEhpc3RvcnkiPk8gc2V1IGhpc3RvcmlhbDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iTG9naW4gdG8gQXV0aG9yaW5nIEFyZWEiPkFjZWRlciDDoCDDoHJlYSBkZSBlZGnDp8OjbzwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gcmVqZWN0IHNjcmVlbiAtLT4NCi0gIDxtZXNzYWdlIGtleT0iUmVqZWN0Ij5SZWplaXRhcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0icmVqZWN0LWRvYz8iPkRlc2VqYSByZWplaXRhciBvIGRvY3VtZW50byB7MH0/PC9tZXNzYWdlPg0KLQ0KLSAgPCEtLSBjbXMgbWVudSAtLT4NCi0gIDxtZXNzYWdlIGtleT0iTmV3IERvY3VtZW50Ij5Ob3ZvIGRvY3VtZW50bzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iTmV3IC4uLiBEb2N1bWVudCI+Tm92byBkb2N1bWVudG8gezB9PC9tZXNzYWdlPgotICA8bWVzc2FnZSBrZXk9Ik5ldyBMYW5ndWFnZSBWZXJzaW9uIj5Ob3ZhIHZlcnPDo28gZGUgaWRpb21hPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJSZW1vdmUgTGFuZ3VhZ2UgVmVyc2lvbiI+RWxpbWluYXIgdmVyc8OjbyBkZSBpZGlvbWE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkZpbGUiPkZpY2hlaXJvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0Ij5FZGl0YXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IldvcmtmbG93Ij5Xb3JrZmxvdzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iRGVhY3RpdmF0ZSI+RGVzYWN0aXZhcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iU2NoZWR1bGUiPkNhbGVuZMOhcmlvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJDb3B5Ij5Db3BpYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlBhc3RlIj5Db2xhcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQ3V0Ij5Db3J0YXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkhlbHAiPkFqdWRhPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJEZWJ1ZyI+RGVidWc8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkRlbGV0ZSI+RWxpbWluYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkFyY2hpdmUiPkFycXVpdmFyPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJSZXN0b3JlIj5SZWN1cGVyYXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9Ik1vdmUgVXAiPk1vdmVyIHBhcmEgY2ltYTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iTW92ZSBEb3duIj5Nb3ZlciBwYXJhIGJhaXhvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJMb2dvdXQiPlNhaXI8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlZpZXcgVGFzayBMb2dzIj5WZXIgcmVnaXN0b3MgZGUgdGFyZWZhczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iU3VwcG9ydCI+U3Vwb3J0ZTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iU3lzdGVtIERvY3VtZW50YXRpb24iPkRvY3VtZW50YcOnw6NvIGRvIHNpc3RlbWE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlVzZXIgRG9jdW1lbnRhdGlvbiI+RG9jdW1lbnRhw6fDo28gZG8gdXRpbGl6YWRvcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQWJvdXQgQXBhY2hlIExlbnlhIj5Tb2JyZSBvIEFwYWNoZUxlbnlhPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJBcGFjaGUgTGVueWEgSG9tZXBhZ2UiPkhvbWVwYWdlIGRvIEFwYWNoZSBMZW55YTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIEt1cHUiPg0KLSAgICBFZGl0b3ImIzE2MDs8eGh0bWw6YWJiciB0aXRsZT0iV2hhdCYjMTYwO1lvdSYjMTYwO1NlZSYjMTYwO0lzJiMxNjA7V2hhdCYjMTYwO1lvdSYjMTYwO0dldCI+V1lTSVdZRzwveGh0bWw6YWJicj4mIzE2MDsoS3VwdSkNCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIEJYRSI+DQotICAgIEVkaXRvciYjMTYwOzx4aHRtbDphYmJyIHRpdGxlPSJXaGF0JiMxNjA7WW91JiMxNjA7U2VlJiMxNjA7SXMmIzE2MDtXaGF0JiMxNjA7WW91JiMxNjA7R2V0Ij5XWVNJV1lHPC94aHRtbDphYmJyPiYjMTYwOyhCWEUpDQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkVkaXQgd2l0aCBvbmUgRm9ybSI+RWRpdG9yJiMxNjA7ZGUmIzE2MDtjw7NkaWdvJiMxNjA7Zm9udGU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkVkaXQgd2l0aCBGb3JtcyI+RWRpdG9yJiMxNjA7Rm9ybXM8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkVkaXQgTWV0YWRhdGEiPkVkaXRhciYjMTYwO01ldGFkYXRhPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IE5hdmlnYXRpb24gVGl0bGUiPkVkaXRhciYjMTYwO3TDrXR1bG8mIzE2MDtkZSYjMTYwO25hdmVnYcOnw6NvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJSZW5hbWUgVVJMIj5SZW5vbWVhciYjMTYwO1VSTDwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gY21zIHRhYnMgLS0+DQotICA8bWVzc2FnZSBrZXk9IlNlcnZlciBUaW1lIj5Ib3JhIGRvIHNlcnZpZG9yPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJXb3JrZmxvdyBTdGF0ZSI+RXN0YWRvIGRvIHdvcmtmbG93PC9tZXNzYWdlPg0KLQ0KLSAgPCEtLSBBZG1pbmlzdHJhdGlvbiB0YWIgLS0+DQotICA8bWVzc2FnZSBrZXk9IkFkbWluaXN0cmF0aW9uIj5BZG1pbmlzdHJhw6fDo288L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InJlYWxseS1kZWxldGU/Ij5EZXNlamEgO3JlYWxtZW50ZSBlbGltaW5hciB7MH0/PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoZSB0cmFzaCA/Ij5EZXNlamEgcmVhbG1lbnRlIGVzdmF6aWFyIGEgcmVjaWNsYWdlbT88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3QiPkVsaW1pbmFyIHswfT88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1vYmplY3Q/Ij5EZXNlamEgcmVhbG1lbnRlIGVsaW1pbmFyIHswfT88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlBhc3N3ZCI+UGFzc3dvcmQ8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlN3aXRjaCBVc2VyIj5NdWRhciYjMTYwO2RlJiMxNjA7dXRpbGl6YWRvcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iRGVsZXRlIFRyYXNoIj5Fc3ZhemlhciYjMTYwO3JlY2ljbGFnZW08L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkNvY29vbiBhbmQgU2VydmVyIFN0YXR1cyI+RXN0YWRvJiMxNjA7ZG8mIzE2MDtTZXJ2aWRvciYjMTYwO2UmIzE2MDtkbyYjMTYwO0NvY29vbjwvbWVzc2FnZT4NCi0NCi0gICAgPCEtLSBHcm91cCBBZG1pbmlzdHJhdGlvbiAtLT4NCi0gIDxtZXNzYWdlIGtleT0iUHJvZmlsZSI+UGVyZmlsPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJNZW1iZXJzIj5NZW1icm9zPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZXMiPkludGVydmFsb3MmIzE2MDtJUDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iRWRpdCBQcm9maWxlIj5FZGl0YXImIzE2MDtQZXJmaWw8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkVkaXQgTWVtYmVycyI+RWRpdGFyJiMxNjA7TWVtYnJvczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iR3JvdXAgQWRtaW5pc3RyYXRpb24iPkFkbWluaXN0cmHDp8OjbyYjMTYwO2RlJiMxNjA7Z3J1cG9zPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgR3JvdXAiPkFkaWNpb25hciYjMTYwO0dydXBvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBEYXRhIj5EYWRvcyYjMTYwO2RvJiMxNjA7R3J1cG88L21lc3NhZ2U+DQotDQotICAgIDwhLS0gVXNlciBBZG1pbmlzdHJhdGlvbiAtLT4NCi0gIDxtZXNzYWdlIGtleT0iVXNlciBEYXRhIj5EYWRvcyYjMTYwO2RvJiMxNjA7VXRpbGl6YWRvcjwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIGtleT0iQ01TIFVzZXIgSUQiPklEJiMxNjA7ZG8mIzE2MDtVdGlsaXphZG9yJiMxNjA7ZG8mIzE2MDtDTVM8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkxEQVAgSUQiPklEJiMxNjA7ZGUmIzE2MDtMREFQPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJDb25maXJtIHBhc3N3b3JkIj5Db25maXJtZSYjMTYwO3Bhc3N3b3JkPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgVXNlciI+QWRpY2lvbmFyIFV0aWxpemFkb3I8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlVzZXIgQWRtaW5pc3RyYXRpb24iPkFkbWluaXN0cmHDp8OjbyBkbyBVdGlsaXphZG9yPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJVc2VyIERldGFpbHMiPkRldGFsaGVzIGRvIFV0aWxpemFkb3I8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkFsbCBHcm91cHMiPlRvZG9zIG9zIEdydXBvczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iVXNlciBHcm91cHMiPkdydXBvcyBkbyBVdGlsaXphZG9yPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJHcm91cCBBZmZpbGlhdGlvbiI+QWZpbGlhw6fDo28gYSB1bSBHcnVwbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQ2hhbmdlIFBhc3N3b3JkIj5BbHRlcmFyIFBhc3N3b3JkPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJFZGl0IEdyb3VwIEFmZmlsaWF0aW9uIj5FZGl0YXIgQWZpbGlhw6fDo28gZGUgR3J1cG88L21lc3NhZ2U+DQotDQotICAgIDwhLS0gSVAgUmFuZ2UgQWRtaW5pc3RyYXRpb24gLS0+DQotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIj5JbnRlcnZhbG8mIzE2MDtJUDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgSUQiPklEJiMxNjA7ZG8mIzE2MDtJbnRlcnZhbG8mIzE2MDtJUDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iTmV0d29yayBBZGRyZXNzIj5FbmRlcmXDp28mIzE2MDtkZSYjMTYwO3JlZGU8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlN1Ym5ldCBNYXNrIj5Nw6FzY2FyYSYjMTYwO2RhJiMxNjA7c3VicmVkZTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgQWRtaW5pc3RyYXRpb24iPkFkbWluaXN0cmHDp8OjbyYjMTYwO2RvJiMxNjA7aW50ZXJ2YWxvJiMxNjA7SVA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkFkZCBJUCBSYW5nZSI+QWRpY2lvbmFyJiMxNjA7aW50ZXJ2YWxvJiMxNjA7SVA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IklQIFJhbmdlIFByb2ZpbGUiPlBlcmZpbCYjMTYwO2RvJiMxNjA7aW50ZXJ2YWxvJiMxNjA7SVA8L21lc3NhZ2U+DQotDQotICA8IS0tIFNpdGUgdGFiIChpbmZvIHNjcmVlbnMpIC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJBdmFpbGFibGUgTGFuZ3VhZ2VzIj5JZGlvbWFzIERpc3BvbsOtdmVpczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iVGhpcyBkb2N1bWVudCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgbGFuZ3VhZ2UuIj5Fc3RlIGRvY3VtZW50byBuw6NvIHNlIGVuY29udHJhIGRpc3BvbsOtdmVsIG5vIGlkaW9tYSBzZWxlY2Npb25hZG8uPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJEb2N1bWVudCBJRCI+SUQgZG8gRG9jdW1lbnRvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJWZXJzaW9ucyI+VmVyc8O1ZXM8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlNTTCBFbmNyeXB0aW9uIj5DaWZyYWdlbSYjMTYwO1NTTDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iUm9sbGJhY2sgdG8gdGhpcyB2ZXJzaW9uIj5Sb2xsYmFjayBwYXJhIHZlcnPDo28gYW50ZXJpb3I8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkFDIEFyY2hpdmUiPkFycXVpdm8mIzE2MDtBQzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQUMgVHJhc2giPlJlY2ljbGFnZW0mIzE2MDtBQzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQUMgQXV0aCI+RWRpw6fDo28mIzE2MDtBQzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQUMgTGl2ZSI+UHJvZHXDp8OjbyYjMTYwO0FDPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZXIiPkNhbGVuZMOhcmlvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJJbmhlcml0ZWQgUmlnaHRzIj5QZXJtaXNzw7VlcyBoZXJkYWRhczwvbWVzc2FnZT4NCi0NCi0gICAgPCEtLSBJbmZvIHNjcmVlbiBhY3Rpb25zLS0+DQotICA8bWVzc2FnZSBrZXk9Ik5ldyBOYXZpZ2F0aW9uIFRpdGxlIj5Ob3ZvIHTDrXR1bG8gZGUgbmF2ZWdhw6fDo288L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+UmVub21lYXIgRG9jdW1lbnRvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgRG9jdW1lbnQgSUQiPk5vdm8gSUQgZG8gRG9jdW1lbnRvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJObyB3aGl0ZXNwYWNlLCBubyBzcGVjaWFsIGNoYXJhY3RlcnMiPk7Do28gc8OjbyBwZXJtaXRpZG9zIGVzcGHDp29zIGVtIGJyYW5jbyBuZW0gY2FyYWN0w6lyZXMgZXNwZWNpYWlzPC9tZXNzYWdlPg0KLSAgICAgIDwhLS0gU2NoZWR1bGVyIC0tPg0KLTxtZXNzYWdlIGtleT0iTm8gYWN0aXZlIGpvYnMiPk7Do28gaMOhIHRhcmVmYXMgYWN0aXZhcy48L21lc3NhZ2U+DQotICAgPG1lc3NhZ2Uga2V5PSJUaGUgam9iIGRhdGUgaGFzIGV4cGlyZWQiPkEgZGF0YSBkYSB0YXJlZmEgZXhwaXJvdS48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImNoZWNrIHRoZSBsb2cgZmlsZXMiPnZlcmlmaXF1ZSBvcyBmaWNoZWlyb3MgZGUgbG9nPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJUYXNrIj5UYXJlZmE8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkRheSI+RGlhPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJUaW1lIj5Ib3JhPC9tZXNzYWdlPg0KLSAgICAgIDwhLS0gRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJkb2NzLWhhdmUtbGlua3MtdG8tZG9jIj5PcyBzZWd1aW50ZXMgZG9jdW1lbnRvcyB0w6ptIGxpbmtzIHBhcmEgZXN0ZSBkb2N1bWVudG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkRlYWN0aXZhdGUgRG9jdW1lbnQiPkRlc2FjdGl2YXIgRG9jdW1lbnRvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJkZWFjdGl2YXRlLWRvYyI+RGVzYWN0aXZhciBEb2N1bWVudG8gezB9PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJkZWFjdGl2YXRlLWRvYz8iPkRlc2VqYSByZWFsbWVudGUgZGVzYWN0aXZhciBvIGRvY3VtZW50byB7MH0/PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJEZWxldGUgRG9jdW1lbnQiPkVsaW1pbmFyIERvY3VtZW50bzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iZGVsZXRlLWRvYyI+RWxpbWluYXIgZG9jdW1lbnRvIHswfTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iY2Fubm90LWRlYWN0aXZhdGUtdW5sZXNzLWNoaWxkcmVuLWRlYWN0aXZhdGVkIj5Ow6NvIMOpIHBvc3PDrXZlbCBkZXNhY3RpdmFyIGVzdGUgZG9jdW1lbnRvIGEgbWVub3MgcXVlIG9zIHNlZ3VpbnRlcyBkb2N1bWVudG9zIGRlc2NlbmRlbnRlcyBzZWphbSBkZXNhY3RpdmFkb3M8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImRlbGV0ZS1sYW5ndWFnZS12ZXJzaW9ucz8iPkRlc2VqYSByZWFsbWVudGUgZWxpbWluYXIgdG9kYXMgYXMgdmVyc8O1ZXMgZXhpc3RlbnRlcyBlbSBkaWZlcmVudGVzIGlkaW9tYXMgZG8gZG9jdW1lbnRvIHswfT88L21lc3NhZ2U+DQotICAgICAgPCEtLSBBcmNoaXZlIGRvY3VtZW50IC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJBcmNoaXZlIERvY3VtZW50Ij5BcnF1aXZhciBEb2N1bWVudG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImFyY2hpdmUtZG9jIj5BcnF1aXZhciBkb2N1bWVudG8gezB9PC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYz8iPkRlc2VqYSByZWFsbWVudGUgYXJxdWl2YXIgbyBkb2N1bWVudG8gezB9PzwvbWVzc2FnZT4NCi0gICAgICA8IS0tIFJlbmFtZSBkb2N1bWVudCAtLT4NCi0gIDxtZXNzYWdlIGtleT0iUmVuYW1lIERvY3VtZW50Ij5SZW5vbWVhciBEb2N1bWVudG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InJlbmFtZS1kb2MiPlJlbm9tZWFyIERvY3VtZW50byB7MH08L21lc3NhZ2U+DQotICAgICAgPCEtLSBDb3B5IGRvY3VtZW50IC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJDb3B5IERvY3VtZW50Ij5Db3BpYXIgRG9jdW1lbnRvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJjb3B5LWRvYy10by1jbGlwPyI+RGVzZWphIHJlYWxtZW50ZSBjb3BpYXIgbyBkb2N1bWVudG8gPHhodG1sOnE+ezB9PC94aHRtbDpxPiBwYXJhIG8gY2xpcGJvYXJkPyBNYWlzIHRhcmRlIHBvZGVyw6EgY29sYXIgbyBkb2N1bWVudG8gbnVtYSBsb2NhbGl6YcOnw6NvIGVzY29saGlkYSBwb3Igc2kuPC9tZXNzYWdlPg0KLSAgICAgIDwhLS0gUGFzdGUgZG9jdW1lbnQgLS0+DQotICA8bWVzc2FnZSBrZXk9IlBhc3RlIERvY3VtZW50Ij5Db2xhciBEb2N1bWVudG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InBhc3RlLWRvYy1mcm9tLWNsaXA/Ij5EZXNlamEgcmVhbG1lbnRlIGNvbGFyIG8gZG9jdW1lbnRvIDx4aHRtbDpxPnswfTwveGh0bWw6cT4gZG8gY2xpcGJvYXJkPzwvbWVzc2FnZT4NCi0gICAgICA8IS0tIEN1dCBkb2N1bWVudCAtLT4NCi0gIDxtZXNzYWdlIGtleT0iQ3V0IERvY3VtZW50Ij5Db3J0YXIgRG9jdW1lbnRvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJjdXQtZG9jLXRvLWNsaXA/Ij5EZXNlamEgcmVhbG1lbnRlIGNvcnRhciBvIGRvY3VtZW50byA8eGh0bWw6cT57MH08L3hodG1sOnE+IGUgbW92w6otbG8gcGFyYSBvIGNsaXBib2FyZD8gTWFpcyB0YXJkZSBwb2RlcsOhIGNvbGFyIG8gZG9jdW1lbnRvIG51bWEgbG9jYWxpemHDp8OjbyBlc2NvbGhpZGEgcG9yIHNpLjwvbWVzc2FnZT4NCi0gICAgPCEtLUNoYW5nZSB2aXNpYmlsaXR5IGluIG5hdmlnYXRpb24gLS0+DQotICA8bWVzc2FnZSBrZXk9IkNoYW5nZSI+QWx0ZXJhcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQ2hhbmdlIERvY3VtZW50IHZpc2libGl0eSBpbiBuYXZpZ2F0aW9uIj5BbHRlcmFyIGEgdmlzaWJpbGlkYWRlIGRvIGRvY3VtZW50byBuYSBuYXZlZ2HDp8OjbzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iVmlzaWJpbGl0eSBpbiBuYXZpZ2F0aW9uIj5WaXNpYmlsaWRhZGUgbmEgbmF2ZWdhw6fDo288L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9InZpc2libGUiPnZpc8OtdmVsPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJoaWRkZW4iPm9jdWx0bzwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gSW5mbyBBc3NldCAtLT4NCi0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEltYWdlIj5JbnNlcmlyIEltYWdlbTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEFzc2V0Ij5JbnNlcmlyIE9iamVjdG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkFzc2V0IFVwbG9hZCI+QWRpw6fDo28gZGUgYWN0aXZvczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IGEgbmV3IEltYWdlIj5JbnNlcmlyIHVtYSBJbWFnZW08L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlVwbG9hZCBhbiBBc3NldCI+QWRpY2lvbmFyIHVtIGFjdGl2bzwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gSW5mbyB3b3JrZmxvdyAgLS0+DQotICA8bWVzc2FnZSBrZXk9IlZhbHVlIj5WYWxvcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iRXZlbnQiPkV2ZW50bzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iVmFyaWFibGVzIj5WYXJpw6F2ZWlzPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJIaXN0b3J5Ij5IaXN0b3JpYWw8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IlN0YXRlIj5Fc3RhZG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IklQIEFkZHJlc3MiPkVuZGVyZcOnbyBJUDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iZWRpdCI+ZWRpdGFyPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJzdWJtaXQiPnN1Ym1ldGVyPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJyZWplY3QiPnJlamVpdGFyPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJwdWJsaXNoIj5wdWJsaWNhcjwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gSW5mbyBhc3NldCAgLS0+DQotICA8bWVzc2FnZSBrZXk9Ik5ldyBBc3NldCI+Tm92byBBY3Rpdm88L21lc3NhZ2U+DQotDQotICA8IS0tIEluZm8gUkMgIC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJDdXJyZW50IFZlcnNpb24iPlZlcnPDo28gQWN0dWFsPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJSb2xsYmFjayB0byB0aGlzIHJldmlzaW9uIj5Sb2xsYmFjayBwYXJhIGVzdGEgcmV2aXPDo288L21lc3NhZ2U+DQotDQotICA8IS0tIEluZm8gQUMgIC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJTU0wgRW5jcnlwdGlvbiI+Q2lmcmFnZW0mIzE2MDtTU0w8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkFjY2VzcyBPYmplY3QiPkFjY2VzbyYjMTYwO2FvJiMxNjA7T2JqZWN0bzwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0idmlzaXQiPnZpc2l0YW50ZTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0icmV2aWV3ZXIiPnJldmlzb3I8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImVkaXRvciI+ZWRpdG9yPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJhZG1pbiI+YWRtaW48L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IndvcmxkIj50b2RvczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0idGhlIHdvcmxkIj50b2RvczwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gU2NoZWR1bGVyIC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJOZXcgam9iIj5Ob3ZhIHRhcmVmYTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQWN0aXZlIGpvYnMiPlRhcmVmYXMgYWN0aXZhczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iUHVibGlzaCBhbmQgRXhwb3J0Ij5QdWJsaWNhciYjMTYwO2UmIzE2MDtFeHBvcnRhcjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iZG9jLWhhcy1saW5rcy10by11bnB1Ymxpc2hlZCI+RXN0ZSBkb2N1bWVudG8gdGVtIGxpbmtzIHBhcmEgb3Mgc2VndWludGVzIGRvY3VtZW50b3MgbsOjbyBwdWJsaWNhZG9zOjwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gTmV3IERvY3VtZW50IC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJQbGVhc2UgY2hlY2sgdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBjYXVzZXMgb2YgdGhlIGV4Y2VwdGlvbiI+UG9yIGZhdm9yIGNvbXByb3ZlIGFzIHNlZ3VpbnRlcyBwb3Nzw612ZWlzIGNhdXNhcyBkYSBleGNlcMOnw6NvLjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iZXhjZXB0aW9uLmNhdXNlLmNyZWF0ZWRvYy53aGl0ZXNwYWNlLWluLWlkIj5Ow6NvIHPDo28gcGVybWl0aWRvcyBlc3Bhw6dvcyBlbSBicmFuY28gbm8gaWQ8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImV4Y2VwdGlvbi5jYXVzZS5jcmVhdGVkb2MuaWQtaW4tdXNlIj5PIGlkIGluc2VyaWRvIGrDoSBlc3TDoSBlbSB1dGlsaXphw6fDo288L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImZhaWxtZXNzYWdlLmNyZWF0ZWRvYy5pbnZhbGlkZm9ybWF0Ij5Qb3IgZmF2b3IgaW50cm9kdXphIHVtIHZhbG9yIHbDoWxpZG8gbm8gY2FtcG8gSUQuIEEtWiwgYS16LCAwLTkgb3UgLSBzw6NvIGNhcmFjdGVyZXMgdsOhbGlkb3MuPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJmYWlsbWVzc2FnZS5jcmVhdGVkb2MucmVxdWlyZWQiPlBvciBmYXZvciBpbnRyb2R1emEgdG9kb3Mgb3MgdmFsb3JlcyBvYnJpZ2F0w7NyaW9zICgqKS48L21lc3NhZ2U+DQotDQotICA8IS0tIEFzc2V0IFVwbG9hZC9JbnNlcnQgRGlhbG9nIC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJBZGQgdG8gQXNzZXQgTGlicmFyeSI+QWRpY2lvbmFyIMOgIGJpYmxpb3RlY2EgZGUgYWN0aXZvczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQXNzZXQgTGlicmFyeSI+QmlibGlvdGVjYSBkZSBhY3Rpdm9zPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJObyBhc3NldHMgYXZhaWxhYmxlIj5Ow6NvIGjDoSBhY3Rpdm9zIGRpc3BvbsOtdmVpczwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iSW5zZXJ0IEFzc2V0Ij5JbnNlcmlyIE9iamVjdG88L21lc3NhZ2U+DQotICA8IS0tIEltYWdlIFVwbG9hZC9JbnNlcnQgRGlhbG9nIC0tPg0KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC50aXRsZSI+SW5zZXJpciBJbWFnZW08L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLnNlbGVjdGltYWdlLmxhYmVsIj5TZWxlY2Npb25hciBJbWFnZW08L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLmluZm8ubm9pbWFnZXMiPk7Do28gaMOhIGltYWdlbnMgZGlzcG9uw612ZWlzLjwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0ibGVueWEuaW1hZ2V1cGxvYWQubGlua3MuaGludCI+T3MgbGlua3MgZXh0ZXJub3MgZGV2ZW0gY29tZcOnYXIgcG9yICdodHRwOi8vJywgb3MgbGlua3MgaW50ZXJub3MgZGV2ZW0gY29tZcOnYXIgcG9yICcvJzwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gUmV2aXNpb24gQ29udHJvbGxlciAtLT4NCi0gIDxtZXNzYWdlIGtleT0iUmVhc29uIj5SYXrDo288L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkZpbGVuYW1lIj5Ob21lIGRvIGZpY2hlaXJvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5yYy5ub2NoZWNrb3V0Ij5PIHJlY3Vyc28gbsOjbyBww7RkZSBzZXIgb2J0aWRvPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5yYy5jaGVja2Vkb3V0YWxyZWFkeSI+TyByZWN1cnNvIGrDoSBmb2kgb2J0aWRvIHBvciBvdXRybyB1dGlsaXphZG9yPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2Uga2V5PSJsZW55YS5yYy5ub2NoZWNraW4iPk8gcmVjdXJzbyBuw6NvIHDDtGRlIHNlciBkZXZvbHZpZG88L21lc3NhZ2U+DQotICA8bWVzc2FnZSBrZXk9IkdlbmVyaWMgRXhjZXB0aW9uIj5FeGNlcMOnw6NvIEdlbsOpcmljYTwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIGtleT0iQ2hlY2sgdGhlIGxvZyBmaWxlcy4iPlZlcmlmaWNhciBvcyBmaWNoZWlyb3MgZGUgbG9nLjwvbWVzc2FnZT4NCi08L2NhdGFsb2d1ZT4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pMThuL2Ntc3VpX3J1LnhtbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfcnUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDk2MjUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vY21zdWlfcnUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTwhLS0gJElkOiBjbXN1aS54bWwgMTI1NTM2IDIwMDUtMDEtMTggMTk6MDQ6MDlaIGdyZWdvciAkIC0tPg0KLTxjYXRhbG9ndWUgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJydSI+DQotPCEtLSBjb21tb24gdXNlZCB3b3JkcyAtLT4NCi08bWVzc2FnZSBrZXk9IlNhdmUiPtCh0L7RhdGA0LDQvdC40YLRjDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlN1Ym1pdCI+0J7RgtC/0YDQsNCy0LjRgtGMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iQ2FuY2VsIj7QntGC0LzQtdC90LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJEZWxldGUiPtCj0LTQsNC70LjRgtGMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTk9URSI+0JfQsNC80LXRgtC60LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJObyByZWZlcmVyIj7QndC10YIg0YHRgdGB0YvQu9C+0Lo8L21lc3NhZ2U+DQotDQotPG1lc3NhZ2Uga2V5PSJSZWZlcmVyIj7QodGB0YvQu9C60LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJFWENFUFRJT04iPtCY0KHQmtCb0K7Qp9CV0J3QmNCVPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iVXNlciI+0J/QvtC70YzQt9C+0LLQsNGC0LXQu9GMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTGl2ZSI+0J7Qv9GD0LHQu9C40LrQvtCy0LDQvdC90L7QtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkF1dGhvcmluZyI+0YDQsNC30YDQsNCx0L7RgtC60LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJub3QiPtC90LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJyZXZpZXciPtC+0YLQt9GL0LI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJ1c2VyIj7Qv9C+0LvRjNC30L7QstCw0YLQtdC70Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJVc2VycyI+0J/QvtC70YzQt9C+0LLQsNGC0LXQu9C4PC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0iZ3JvdXAiPtCz0YDRg9C/0L/QsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9Ikdyb3VwIj7Qk9GA0YPQv9C/0LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJHcm91cHMiPtCT0YDRg9C/0L/RizwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9Ikdyb3VwIElEIj7QmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQs9GA0YPQv9C/0Ys8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJZZXMiPtCU0LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJObyI+0J3QtdGCPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iRGVzY3JpcHRpb24iPtCe0L/QuNGB0LDQvdC40LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJOYW1lIj7QmNC80Y88L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJGdWxsIE5hbWUiPtCf0L7Qu9C90L7QtSDQuNC80Y88L21lc3NhZ2U+DQotDQotPG1lc3NhZ2Uga2V5PSJyZXF1aXJlZCBmaWVsZHMiPtC+0LHRj9C30LDRgtC10LvRjNC90YvQtSDQv9C+0LvRjzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlNlYXJjaCI+0J/QvtC40YHQujwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkhvbWUiPkhvbWU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJUaXRsZSI+0JfQsNCz0L7Qu9C+0LLQvtC6PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTGFzdCBtb2RpZmllZCI+0J/QvtGB0LvQtdC00L3QtdC1INC40LfQvNC10L3QtdC90LjQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9Ik92ZXJ2aWV3Ij7QntCx0LfQvtGAPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iUm9sZSI+0KDQvtC70Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJWaWV3Ij7QktC40LQ8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJBc3NldHMiPtCg0LXRgdGD0YDRgdGLPC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0idHJ1ZSI+0LTQsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImZhbHNlIj7QvdC10YI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJSZW5hbWUiPtCf0LXRgNC10LjQvNC10L3QvtCy0LDRgtGMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTW9kaWZ5Ij7QmNC30LzQtdC90LjRgtGMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iRG9jdW1lbnQiPtCU0L7QutGD0LzQtdC90YI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJEYXRlIj7QlNCw0YLQsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkJhY2siPtCd0LDQt9Cw0LQ8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJBZGQiPtCU0L7QsdCw0LLQuNGC0Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJDcmVhdGUiPtCh0L7Qt9C00LDRgtGMPC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0iVGhlIEFyY2hpdmUiPtCQ0YDRhdC40LI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJUcmFzaCI+0JrQvtGA0LfQuNC90LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJQdWJsaXNoZXIiPtCY0LfQtNCw0YLQtdC70Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJOYXZpZ2F0aW9uIFRpdGxlIj7QndCw0LLQuNCz0LDRhtC40L7QvdC90YvQuSDQt9Cw0LPQvtC70L7QstC+0Lo8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJDcmVhdG9yIj7QodC+0LfQtNCw0YLQtdC70Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJMYW5ndWFnZSI+0K/Qt9GL0Lo8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJTdWJqZWN0Ij7QotC10LzQsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlJpZ2h0cyI+0J/RgNCw0LLQsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlNlbGVjdCBGaWxlIj7QktGL0LHQtdGA0LjRgtC1INGE0LDQudC7PC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0ic2VsZWN0LW9iamVjdCI+0JLRi9Cx0LXRgNC40YLQtSB7MH08L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJJbnNlcnQiPtCS0YHRgtCw0LLQuNGC0Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJJbnNlcnQgRmlsZSI+0JLRgdGC0LDQstC40YLRjCDRhNCw0LnQuzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9InVwbG9hZC13aXRoLWludmFsaWQtZXh0ZW5zaW9uIj7QoyDQt9Cw0LPRgNGD0LbQsNC10LzQvtCz0L4g0YTQsNC50LvQsCAg0L3QtdC/0YDQsNCy0LjQu9GM0L3QvtC1INGA0LDRgdGI0LjRgNC10L3QuNC1LiDQn9GA0LDQstC40LvRjNC90YvQtSDRgNCw0YHRiNC40YDQtdC90LjRj3swfS4g0KDQsNGB0YjQuNGA0LXQvdC40LUg0LTQvtC70LbQvdC+INCx0YvRgtGMINCyINC90LjQttC90LXQvCDRgNC10LPQuNGB0YLRgNC1ICjQvNCw0LvQtdC90YzQutC40LzQuCDQsdGD0LrQstCw0LzQuCkuPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0idXBsb2FkLXdpdGgtbWlzc2luZy10aXRsZSI+0JfQsNCz0YDRg9C20LDQvNGL0Lkg0YTQsNC50Lsg0LHQtdC3INC90LDQt9Cy0LDQvdC40Y8uPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZmlsZW5hbWUtZm9ybWF0LWV4Y2VwdGlvbiI+0KMg0LfQsNCz0YDRg9C20LDQtdC80L7Qs9C+INGE0LDQudC70LAg0L3QtSDRg9C60LDQt9Cw0L3QviDRgNCw0YHRiNC40YDQtdC90LjQtSDQuNC70Lgg0LXQs9C+INC40LzRjyDRgdC+0LTQtdGA0LbQuNGCINC90LXQtNC+0L/Rg9GB0YLQuNC80YvQtSDRgdC40LzQstC+0LvRiywg0L3QsNC/0YDQuNC80LXRgCwg0L/RgNC+0LHQtdC70Ysg0LjQu9C4INGD0LzQu9GP0YPRgtGLLjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkNyZWF0aW9uIERhdGUiPtCU0LDRgtCwINGB0L7Qt9C00LDQvdC40Y88L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJGaWxlIFNpemUiPtCg0LDQt9C80LXRgCDRhNCw0LnQu9CwPC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0iSW1hZ2UiPtCY0LfQvtCx0YDQsNC20LXQvdC40LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJMaW5rIj7QodGB0YvQu9C60LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJDYXB0aW9uIj7QktGB0L/Qu9GL0LLQsNGO0YnQsNGPINC/0L7QtNGB0LrQsNC30LrQsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFsbCByaWdodHMgcmVzZXJ2ZWQiPtCS0YHQtSDQv9GA0LDQstCwINC30LDRidC40YnQtdC90YsuPC9tZXNzYWdlPg0KLTwhLS0gdXNlZCBhcyB0YWJzIG5hbWVzIEFORCBzdGF0ZXMgLS0+DQotPG1lc3NhZ2Uga2V5PSJsaXZlIj7QvtC/0YPQsdC70LjQutC+0LLQsNC90L48L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJhdXRob3JpbmciPtGA0LDQt9GA0LDQsdC+0YLQutCwPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iU2l0ZSI+0YHQsNC50YI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJhZG1pbiI+0LDQtNC80LjQvTwvbWVzc2FnZT4NCi0NCi08IS0tIHN0YXRlIC0tPg0KLTxtZXNzYWdlIGtleT0ibm90IGxpdmUiPtC90LXQvtC/0YPQsdC70LjQutC+0LLQsNC90L48L21lc3NhZ2U+DQotPCEtLSBzdWJtaXQgc2NyZWVuIC0tPg0KLTxtZXNzYWdlIGtleT0ic3VibWl0LWZvci1hcHByb3ZhbCI+0J7RgtC/0YDQsNCy0LjRgtGMIHswfSDQvdCwINGD0YLQstC10YDQttC00LXQvdC40LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJzdWJtaXQtZm9yLWFwcHJvdmFsPyI+0KXQvtGC0LjRgtC1INC+0YLQv9GA0LDQstC40YLRjCB7MH0g0L3QsCDRg9GC0LLQtdGA0LbQtNC10L3QuNC1PzwvbWVzc2FnZT4NCi08IS0tIHB1Ymxpc2ggc2NyZWVuIC0tPg0KLTxtZXNzYWdlIGtleT0iUHVibGlzaCI+0J7Qv9GD0LHQu9C40LrQvtCy0LDRgtGMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iU291cmNlIEZpbGUocykiPtCY0YHRhdC+0LTQvdGL0Lkg0YTQsNC50LsgKNC40LvQuCDRhNCw0LnQu9GLINC40YHRhdC+0LTQvdGL0LUpPC9tZXNzYWdlPg0KLTwhLS0gbG9naW4gc2NyZWVuIC0tPg0KLTxtZXNzYWdlIGtleT0ibG9naW4tdG8tcHViIj7QktC+0LnRgtC4INCyIHswfSDQv9GD0LHQu9C40LrQsNGG0LjRjjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkxvZ2luIj7Qm9C+0LPQuNC9PC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0iUGFzc3dvcmQiPtCf0LDRgNC+0LvRjDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlVzZXJuYW1lIj7QmNC80Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iQXV0aGVudGljYXRpb24gZmFpbGVkIj7QkNCy0YLQvtGA0LjQt9Cw0YbQuNGPINC/0YDQvtCy0LDQu9C40LvQsNGB0Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJ0cnktdXNlci1sZW55YS1hbGljZSI+0J/QvtC/0YDQvtCx0YPQudGC0LUg0LvQvtCz0LjQvSB7MH0g0Lgg0L/QsNGA0L7Qu9GMIHsxfSAo0YDQtdC00LDQutGC0L7RgCksINC40LvQuCDQu9C+0LPQuNC9IHsyfSDQuCDQv9Cw0YDQvtC70YwgezN9ICjQvtCx0L7Qt9GA0LXQstCw0YLQtdC70YwpPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0idHJ5LXVzZXItbGVueWEiPtCf0L7Qv9GA0L7QsdGD0LnRgtC1INC70L7Qs9C40L0gezB9INC4INC/0LDRgNC+0LvRjCB7MX08L21lc3NhZ2U+Ci08IS0tIGxvZ291dCBzY3JlZW4gLS0+DQotPG1lc3NhZ2Uga2V5PSJsb2dvdXQtZnJvbS1wdWIiPtCS0YvQudGC0Lgg0LjQtyB7MH0g0J/Rg9Cx0LvQuNC60LDRhtC40Lg8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJZb3VyIEhpc3RvcnkiPtCS0LDRiNCwINC40YHRgtC+0YDQuNGPPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTG9naW4gdG8gQXV0aG9yaW5nIEFyZWEiPtCS0L7QudGC0Lgg0LIg0LDQstGC0L7RgNGB0LrRg9GOINC30L7QvdGDPC9tZXNzYWdlPg0KLTwhLS0gcmVqZWN0IHNjcmVlbiAtLT4NCi08bWVzc2FnZSBrZXk9IlJlamVjdCI+0J7RgtC60LvQvtC90LjRgtGMPC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0icmVqZWN0LWRvYz8iPtCl0L7RgtC40YLQtSDQvtGC0LrQu9C+0L3QuNGC0Ywg0LTQvtC60YPQvNC10L3RgiB7MH0/PC9tZXNzYWdlPg0KLTwhLS0gY21zIG1lbnUgLS0+DQotPG1lc3NhZ2Uga2V5PSJOZXcgRG9jdW1lbnQiPtCd0L7QstGL0Lkg0LTQvtC60YPQvNC10L3RgjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9Ik5ldyAuLi4gRG9jdW1lbnQiPtCd0L7QstGL0LkgezB9INC00L7QutGD0LzQtdC90YI8L21lc3NhZ2U+Ci08bWVzc2FnZSBrZXk9Ik5ldyBMYW5ndWFnZSBWZXJzaW9uIj7QktC10YDRgdC40Y8g0L3QsCDQtNGA0YPQs9C+0Lwg0Y/Qt9GL0LrQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlJlbW92ZSBMYW5ndWFnZSBWZXJzaW9uIj7Qo9C00LDQu9C40YLRjCDQstC10YDRgdC40Y4g0L3QsCDQtNGA0YPQs9C+0Lwg0Y/Qt9GL0LrQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkZpbGUiPtCk0LDQudC7PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iRWRpdCI+0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJXb3JrZmxvdyI+0KLQtdGF0L/RgNC+0YbQtdGB0YE8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJEZWFjdGl2YXRlIj7QntGC0LrQu9GO0YfQuNGC0Yw8L21lc3NhZ2U+DQotDQotPG1lc3NhZ2Uga2V5PSJTY2hlZHVsZSI+0JPRgNCw0YTQuNC6PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iQ29weSI+0JrQvtC/0LjRgNC+0LLQsNGC0Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJQYXN0ZSI+0JLRgdGC0LDQstC40YLRjDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkN1dCI+0JLRi9GA0LXQt9Cw0YLRjDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkhlbHAiPtCf0L7QvNC+0YnRjDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkRlYnVnIj7QntGC0LvQsNC00LjRgtGMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iRGVsZXRlIj7Qo9C00LDQu9C40YLRjDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFyY2hpdmUiPtCQ0YDRhdC40LLQuNGA0L7QstCw0YLRjDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlJlc3RvcmUiPtCS0L7RgdGB0YLQsNC90L7QstC40YLRjDwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9Ik1vdmUgVXAiPtCh0LzQtdGB0YLQuNGC0Ywg0LLQstC10YDRhTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9Ik1vdmUgRG93biI+0KHQvNC10YHRgtC40YLRjCDQstC90LjQtzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkxvZ291dCI+0JLRi9GF0L7QtDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlZpZXcgVGFzayBMb2dzIj7Qn9C+0YHQvNC+0YLRgNC10YLRjCDQttGD0YDQvdCw0LvRiyDQt9Cw0LTQsNGHPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iU3VwcG9ydCI+0KLQtdGF0L/QvtC00LTQtdGA0LbQutCwPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iU3lzdGVtIERvY3VtZW50YXRpb24iPtCh0LjRgdGC0LXQvNC90LDRjyDQlNC+0LrRg9C80LXQvdGC0LDRhtC40Y88L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJVc2VyIERvY3VtZW50YXRpb24iPtCf0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQsNGPINC00L7QutGD0LzQtdC90YLQsNGG0LjRjzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFib3V0IEFwYWNoZSBMZW55YSI+0J4g0L/RgNC+0LXQutGC0LUgQXBhY2hlIExlbnlhPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iQXBhY2hlIExlbnlhIEhvbWVwYWdlIj7QodCw0LnRgiDQv9GA0L7QtdC60YLQsCBBcGFjaGUgTGVueWE8L21lc3NhZ2U+DQotDQotPG1lc3NhZ2Uga2V5PSJFZGl0IHdpdGggS3VwdSI+0KDQtdC00LDQutGC0L7RgCA8eGh0bWw6YWJiciB0aXRsZT0iV2hhdCBZb3UgU2VlIElzIFdoYXQgWW91IEdldCI+V1lTSVdZRzwveGh0bWw6YWJicj4gKEt1cHUpPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iRWRpdCB3aXRoIEJYRSI+0KDQtdC00LDQutGC0L7RgCA8eGh0bWw6YWJiciB0aXRsZT0iV2hhdCBZb3UgU2VlIElzIFdoYXQgWW91IEdldCI+V1lTSVdZRzwveGh0bWw6YWJicj4gKEJYRSk8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJFZGl0IHdpdGggb25lIEZvcm0iPtCg0LXQtNCw0LrRgtC+0YAg0LjRgdGF0L7QtNC90YvRhSDRgtC10LrRgdGC0L7QsjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkVkaXQgd2l0aCBGb3JtcyI+0KDQtdC00LDQutGC0L7RgCDRhNC+0YDQvDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkVkaXQgTWV0YWRhdGEiPtCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINC80LXRgtCw0LTQsNC90L3Ri9C1PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iRWRpdCBOYXZpZ2F0aW9uIFRpdGxlIj7QoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQvdCw0LLQuNCz0LDRhtC40L7QvdC90YvQuSDQt9Cw0LPQvtC70L7QstC+0Lo8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJSZW5hbWUgVVJMIj7Qn9C10YDQtdC40LzQtdC90L7QstCw0YLRjCBVUkw8L21lc3NhZ2U+DQotDQotPG1lc3NhZ2Uga2V5PSJDaGFuZ2Ugbm9kZSB2aXNpYmlsaXR5Ij7Qn9C10YDQtdC60LvRjtGH0LjRgtGMINCy0LjQtNC40LzQvtGB0YLRjDwvbWVzc2FnZT4NCi08IS0tIGNtcyB0YWJzIC0tPg0KLTxtZXNzYWdlIGtleT0iU2VydmVyIFRpbWUiPtCS0YDQtdC80Y8g0L3QsCDRgdC10YDQstC10YDQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IldvcmtmbG93IFN0YXRlIj7QodC+0YHRgtC+0Y/QvdC40LUg0YLQtdGF0L/RgNC+0YbQtdGB0YHQsDwvbWVzc2FnZT4NCi08IS0tIEFkbWluaXN0cmF0aW9uIHRhYiAtLT4NCi08bWVzc2FnZSBrZXk9IkFkbWluaXN0cmF0aW9uIj7QkNC00LzQuNC90LjRgdGC0YDQuNGA0L7QstCw0L3QuNC1PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0icmVhbGx5LWRlbGV0ZT8iPtCf0YDQsNCy0LTQsCDRg9C00LDQu9C40YLRjCB7MH0/PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGUgdHJhc2ggPyI+0JTQtdC50YHQstC40YLQtdC70YzQvdC+INGF0L7RgtC40YLQtSDRg9C00LDQu9C40YLRjCDQutC+0YDQt9C40L3RgyA/PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZGVsZXRlLW9iamVjdCI+0KPQtNCw0LvQuNGC0YwgezB9PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZGVsZXRlLW9iamVjdD8iPtCU0LXQudGB0LLQuNGC0LXQu9GM0L3QviDRhdC+0YLQuNGC0LUg0YPQtNCw0LvQuNGC0YwgezB9PzwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9IlBhc3N3ZCI+0J/QsNGA0L7Qu9GMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iU3dpdGNoIFVzZXIiPtCh0LzQtdC90LjRgtGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkRlbGV0ZSBUcmFzaCI+0KPQtNCw0LvQuNGC0Ywg0LrQvtGA0LfQuNC90YM8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJDb2Nvb24gYW5kIFNlcnZlciBTdGF0dXMiPkNvY29vbiBhbmQgU2VydmVyIFN0YXR1czwvbWVzc2FnZT4NCi08IS0tIEdyb3VwIEFkbWluaXN0cmF0aW9uIC0tPg0KLTxtZXNzYWdlIGtleT0iUHJvZmlsZSI+0J/QsNGA0LDQvNC10YLRgNGLPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTWVtYmVycyI+0KPRh9Cw0YHRgtC90LjQutC4PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iSVAgUmFuZ2VzIj7QlNC40LDQv9Cw0LfQvtC90YsgSVAt0LDQtNGA0LXRgdC+0LI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJFZGl0IFByb2ZpbGUiPtCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINC/0LDRgNCw0LzQtdGC0YDRizwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9IkVkaXQgTWVtYmVycyI+0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0YfQu9C10L3QvtCyPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iR3JvdXAgQWRtaW5pc3RyYXRpb24iPtCQ0LTQvNC40L3QuNGB0YLRgNC40YDQvtCy0LDQvdC40LUg0LPRgNGD0L/QvzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFkZCBHcm91cCI+0JTQvtCx0LDQstC40YLRjCDQs9GA0YPQv9C/0Ys8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJHcm91cCBEYXRhIj7QlNCw0L3QvdGL0LUg0LPRgNGD0L/Qv9GLPC9tZXNzYWdlPg0KLTwhLS0gVXNlciBBZG1pbmlzdHJhdGlvbiAtLT4NCi08bWVzc2FnZSBrZXk9IlVzZXIgRGF0YSI+0JTQsNC90L3Ri9C1INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkNNUyBVc2VyIElEIj7QmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y8gQ01TPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTERBUCBJRCI+0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAgTERBUDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkNvbmZpcm0gcGFzc3dvcmQiPtCf0L7QtNGC0LLQtdGA0LTQuNGC0Ywg0L/QsNGA0L7Qu9GMPC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0iQWRkIFVzZXIiPtCU0L7QsdCw0LLQuNGC0Ywg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iVXNlciBBZG1pbmlzdHJhdGlvbiI+0KPQv9GA0LDQstC70LXQvdC40LUg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GP0LzQuDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlVzZXIgRGV0YWlscyI+0JTQtdGC0LDQu9C4INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFsbCBHcm91cHMiPtCS0YHQtSDQs9GA0YPQv9C/0Ys8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJVc2VyIEdyb3VwcyI+0J/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LUg0LPRgNGD0L/Qv9GLPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iR3JvdXAgQWZmaWxpYXRpb24iPtCn0LvQtdC90YHRgtCy0L4g0LIg0LPRgNGD0L/Qv9C1PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iQ2hhbmdlIFBhc3N3b3JkIj7QodC80LXQvdC40YLRjCDQv9Cw0YDQvtC70Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJFZGl0IEdyb3VwIEFmZmlsaWF0aW9uIj7QoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDRh9C70LXQvdGB0YLQstC+INCyINCz0YDRg9C/0L/QtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlRoaXMgZ3JvdXAgYWxyZWFkeSBleGlzdHMuIj7QotCw0LrQsNGPINCz0YDRg9C/0L/QsCDRg9C20LUg0YHRg9GJ0LXRgdGC0LLRg9C10YIuPC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0iVGhpcyBpcyBub3QgYSB2YWxpZCBncm91cCBJRC4iPtCd0LXQutC+0YDRgNC10LrRgtC90YvQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQs9GA0YPQv9C/0YsuPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iVGhpcyB1c2VyIGFscmVhZHkgZXhpc3RzLiI+0KLQsNC60L7QuSDQv9C+0LvRjNC30L7QstCw0YLQtdC70Ywg0YPQttC1INGB0YPRidC10YHRgtCy0YPQtdGCLjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlRoaXMgaXMgbm90IGEgdmFsaWQgdXNlciBJRC4iPtCd0LXQutC+0YDRgNC10LrRgtC90YvQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCBDTVMg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPLjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlBsZWFzZSBlbnRlciBhbiBlLW1haWwgYWRkcmVzcy4iPtCS0LLQtdC00LjRgtC1INCw0LTRgNC10YEgZS1tYWlsLjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlRoaXMgTERBUCB1c2VyIElEIGRvZXMgbm90IGV4aXN0LiI+0KLQsNC60L7QuSDQv9C+0LvRjNC30L7QstCw0YLQtdC70YwgTERBUCDQvdC1INGB0YPRidC10YHRgtCy0YPRgtC1LjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlBhc3N3b3JkIGFuZCBjb25maXJtZWQgcGFzc3dvcmQgYXJlIG5vdCBlcXVhbC4iPtCf0LDRgNC+0LvRjCDQuCDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjQtSDQv9Cw0YDQvtC70Y8g0L3QtSDRgdC+0LLQv9Cw0LTQsNGO0YIuPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iVGhlIHBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3Qgc2l4IGNoYXJhY3RlcnMgbG9uZy4iPtCf0LDRgNC+0LvRjCDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LrQsNC6INC80LjQvdC40LzRg9C8IDYg0YHQuNC80LLQvtC70L7Qsi48L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJUaGUgcGFzc3dvcmQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBudW1iZXIuIj7Qn9Cw0YDQvtC70Ywg0LTQvtC70LbQtdC9INGB0L7QtNC10YDQttCw0YLRjCDQutCw0Log0LzQuNC90LjQvNGD0Lwg0L7QtNC90YMg0YbQuNGE0YDRgy48L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJZb3UgY2Fubm90IGNoYW5nZSB0aGUgcGFzc3dvcmQgb2YgdGhpcyB1c2VyLiI+0JLRiyDQvdC1INC80L7QttC10YLQtSDRgdC80LXQvdC40YLRjCDQv9Cw0YDQvtC70Ywg0LTQu9GPINGN0YLQvtCz0L4g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPLjwvbWVzc2FnZT4NCi0NCi08IS0tIFVzZXIgVHlwZXMgLS0+DQotPG1lc3NhZ2Uga2V5PSJMREFQIFVzZXIiPtCf0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCBMREFQPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTG9jYWwgVXNlciI+0JvQvtC60LDQu9GM0L3Ri9C5INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjDwvbWVzc2FnZT4NCi08IS0tIElQIFJhbmdlIEFkbWluaXN0cmF0aW9uIC0tPg0KLTxtZXNzYWdlIGtleT0iSVAgUmFuZ2UiPtCU0LjQsNC/0LDQt9C+0L0gSVAt0LDQtNGA0LXRgdC+0LI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSBJRCI+0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LTQuNCw0L/QsNC30L7QvdCwIElQLdCw0LTRgNC10YHQvtCyPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTmV0d29yayBBZGRyZXNzIj7QodC10YLQtdCy0L7QuSDQsNC00YDQtdGBPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iU3VibmV0IE1hc2siPtCc0LDRgdC60LAg0L/QvtC00YHQtdGC0Lg8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSBBZG1pbmlzdHJhdGlvbiI+0JDQtNC80LjQvdC40YHRgtGA0LjRgNC+0LLQsNC90LjQtSDQtNC40LDQv9Cw0LfQvtC90L7QsiBJUC3QsNC00YDQtdGB0L7QsjwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9IkFkZCBJUCBSYW5nZSI+0JTQvtCx0LDQstC40YLRjCDQtNC40LDQv9Cw0LfQvtC9IElQLdCw0LTRgNC10YHQvtCyPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iSVAgUmFuZ2UgUHJvZmlsZSI+0J3QsNGB0YLRgNC+0LnQutC4INC00LjQsNC/0LDQt9C+0L3QsCBJUC3QsNC00YDQtdGB0L7QsjwvbWVzc2FnZT4NCi08IS0tIFNpdGUgdGFiIChpbmZvIHNjcmVlbnMpIC0tPg0KLTxtZXNzYWdlIGtleT0iQXZhaWxhYmxlIExhbmd1YWdlcyI+0JTQvtGB0YLRg9C/0L3Ri9C1INGP0LfRi9C60Lg8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJUaGlzIGRvY3VtZW50IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBsYW5ndWFnZS4iPtCd0LAg0Y3RgtC+0Lwg0Y/Qt9GL0LrQtSDQtNC+0LrRg9C80LXQvdGCINC90LUg0LTQvtGB0YLRg9C/0LXQvS48L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJEb2N1bWVudCBJRCI+0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LTQvtC60YPQvNC10L3RgtCwPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iVmVyc2lvbnMiPtCS0LXRgNGB0LjQuDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlNTTCBFbmNyeXB0aW9uIj5TU0wg0YjQuNGE0YDQvtCy0LDQvdC40LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJSb2xsYmFjayB0byB0aGlzIHZlcnNpb24iPtCe0YLQutCw0YLQuNGC0YzRgdGPINC6INGN0YLQvtC5INCy0LXRgNGB0LjQuDwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9IkFDIEFyY2hpdmUiPkFDINCQ0YDRhdC40LLQsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFDIFRyYXNoIj5BQyDQmtC+0YDQt9C40L3RizwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFDIExpdmUiPkFDINCf0YDQvtGB0LzQvtGC0YDQsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFDIEF1dGgiPkFDINCg0LDQt9GA0LDQsdC+0YLQutC4PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iU2NoZWR1bGVyIj7Qn9C70LDQvdC40YDQvtCy0YnQuNC6PC9tZXNzYWdlPg0KLTwhLS0gSW5mbyBzY3JlZW4gYWN0aW9ucy0tPg0KLTxtZXNzYWdlIGtleT0iTmV3IE5hdmlnYXRpb24gVGl0bGUiPtCd0L7QstGL0Lkg0LfQsNCz0L7Qu9C+0LLQvtC6INC90LDQstC40LPQsNGG0LjQuDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlJlbmFtZSBEb2N1bWVudCI+0J/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0Ywg0LTQvtC60YPQvNC10L3RgjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9Ik5ldyBEb2N1bWVudCBJRCI+0J3QvtCy0YvQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQtNC+0LrRg9C80LXQvdGC0LA8L21lc3NhZ2U+DQotDQotPG1lc3NhZ2Uga2V5PSJObyB3aGl0ZXNwYWNlLCBubyBzcGVjaWFsIGNoYXJhY3RlcnMiPtCR0LXQtyDQv9GA0L7QsdC10LvQvtCyINC4INGB0L/QtdGG0YHQuNC80LLQvtC70L7QsjwvbWVzc2FnZT4NCi08IS0tIFNjaGVkdWxlciAtLT4NCi08bWVzc2FnZSBrZXk9Ik5vIGFjdGl2ZSBqb2JzIj7QndC10YIg0LDQutGC0LjQstC90YvRhSDQt9Cw0LTQsNC90LjQuS48L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJUaGUgam9iIGRhdGUgaGFzIGV4cGlyZWQiPtCX0LDQtNCw0L3QuNC1INC/0YDQvtGB0YDQvtGH0LXQvdC+LjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImNoZWNrIHRoZSBsb2cgZmlsZXMiPtC/0YDQvtCy0LXRgNC40YLRjCDRhNCw0LnQu9GLINC20YPRgNC90LDQu9C+0LI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJUYXNrIj7Ql9Cw0LTQsNC90LjQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkRheSI+0JTQtdC90Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJUaW1lIj7QktGA0LXQvNGPPC9tZXNzYWdlPg0KLTwhLS0gRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIC0tPg0KLTxtZXNzYWdlIGtleT0iZG9jcy1oYXZlLWxpbmtzLXRvLWRvYyI+0KHQu9C10LTRg9GO0YnQuNC1INC00L7QutGD0LzQtdC90YLRiyDRgdGB0YvQu9Cw0Y7RgtGB0Y8g0L3QsCDRjdGC0L7RgiDQtNC+0LrRg9C80LXQvdGCPC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0iRGVhY3RpdmF0ZSBEb2N1bWVudCI+0J7RgtC60LvRjtGH0LjRgtGMINC00L7QutGD0LzQtdC90YI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJkZWFjdGl2YXRlLWRvYyI+0J7RgtC60LvRjtGH0LjRgtGMINC00L7QutGD0LzQtdC90YIgezB9PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZGVhY3RpdmF0ZS1kb2M/Ij7QktGLINC00LXQudGB0YLQstC40YLQtdC70YzQvdC+INGF0L7RgtC40YLQtSDQvtGC0LrQu9GO0YfQuNGC0Ywg0LTQvtC60YPQvNC10L3RgiB7MH0/PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iRGVsZXRlIERvY3VtZW50Ij7Qo9C00LDQu9C40YLRjCDQtNC+0LrRg9C80LXQvdGCPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZGVsZXRlLWRvYyI+0KPQtNCw0LvQuNGC0Ywg0LTQvtC60YPQvNC10L3RgiB7MH08L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJjYW5ub3QtZGVhY3RpdmF0ZS11bmxlc3MtY2hpbGRyZW4tZGVhY3RpdmF0ZWQiPtCt0YLQvtGCINC00L7QutGD0LzQtdC90YIg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0YLQutC70YfQtdC9INC/0L7QutCwINGB0LvQtdC00YPRjtGJ0LjQtSDQtNC+0YfQtdGA0L3QuNC1INC00L7QutGD0LzQtdC90YLRiyDQvdC1INC+0YLQutC70Y7Rh9C10L3RizwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImRlbGV0ZS1sYW5ndWFnZS12ZXJzaW9ucz8iPtCS0Ysg0LTQtdC50YHRgtCy0LjRgtC10LvRjNC90L4g0YXQvtGC0LjRgtC1INGD0LTQsNC70LjRgtGMINCy0LXRgNGB0LjQuCDQtNC+0LrRg9C80LXQvdGC0LAgezB9INC90LAg0LLRgdC10YUg0Y/Qt9GL0LrQsNGFPzwvbWVzc2FnZT4NCi08IS0tIEFyY2hpdmUgZG9jdW1lbnQgLS0+DQotPG1lc3NhZ2Uga2V5PSJBcmNoaXZlIERvY3VtZW50Ij7QkNGA0YXQuNCy0LjRgNC+0LLQsNGC0Ywg0LTQvtC60YPQvNC10L3RgjwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9ImFyY2hpdmUtZG9jIj7QkNGA0YXQuNCy0LjRgNC+0LLQsNGC0Ywg0LTQvtC60YPQvNC10L3RgiB7MH08L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJhcmNoaXZlLWRvYz8iPtCS0Ysg0LTQtdC50YHRgtCy0LjRgtC10LvRjNC90L4g0YXQvtGC0LjRgtC1INC30LDQsNGA0YXQuNCy0LjRgNC+0LLQsNGC0Ywg0LTQvtC60YPQvNC10L3RgiB7MH0/PC9tZXNzYWdlPg0KLTwhLS0gUmVuYW1lIGRvY3VtZW50IC0tPg0KLTxtZXNzYWdlIGtleT0iUmVuYW1lIERvY3VtZW50Ij7Qn9C10YDQtdC40LzQtdC90L7QstCw0YLRjCDQtNC+0LrRg9C80LXQvdGCPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0icmVuYW1lLWRvYyI+0J/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0Ywg0LTQvtC60YPQvNC10L3RgiB7MH08L21lc3NhZ2U+DQotPCEtLSBDb3B5IGRvY3VtZW50IC0tPg0KLTxtZXNzYWdlIGtleT0iQ29weSBEb2N1bWVudCI+0JrQvtC/0LjRgNC+0LLQsNGC0Ywg0LTQvtC60YPQvNC10L3RgjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImNvcHktZG9jLXRvLWNsaXA/Ij7QpdC+0YLQuNGC0LUg0YHQutC+0L/QuNGA0L7QstCw0YLRjCDQtNC+0LrRg9C80LXQvdGCIDx4aHRtbDpxPnswfTwveGh0bWw6cT4g0JIg0LHRg9GE0LXRgCDQvtCx0LzQtdC90LA/INCh0LrQvtC/0LjRgNC+0LLQsNC90L3Ri9C5INC00L7QutGD0LzQtdC90YIg0LzQvtC20L3QviDQsdGD0LTQtdGCINCy0YHRgtCw0LLQuNGC0Ywg0L/QvtGB0LvQtSDQsiDQstGL0LHRgNCw0L3QvdC+0LUg0LzQtdGB0YLQvi48L21lc3NhZ2U+DQotPCEtLSBQYXN0ZSBkb2N1bWVudCAtLT4NCi0NCi08bWVzc2FnZSBrZXk9IlBhc3RlIERvY3VtZW50Ij7QktGB0YLQsNCy0LjRgtGMINC00L7QutGD0LzQtdC90YI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJwYXN0ZS1kb2MtZnJvbS1jbGlwPyI+0KXQvtGC0LjRgtC1INCy0YHRgtCw0LLQuNGC0Ywg0LTQvtC60YPQvNC10L3RgiA8eGh0bWw6cT57MH08L3hodG1sOnE+INC40Lcg0LHRg9GE0LXRgNCwINC+0LHQvNC10L3QsD88L21lc3NhZ2U+DQotPCEtLSBDdXQgZG9jdW1lbnQgLS0+DQotPG1lc3NhZ2Uga2V5PSJDdXQgRG9jdW1lbnQiPtCS0YvRgNC10LfQsNGC0Ywg0LTQvtC60YPQvNC10L3RgjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImN1dC1kb2MtdG8tY2xpcD8iPtCl0L7RgtC40YLQtSDQstGL0YDQtdC30LDRgtGMINC00L7QutGD0LzQtdC90YIgPHhodG1sOnE+ezB9PC94aHRtbDpxPiDQuCDQv9C10YDQtdC80LXRgdGC0LjRgtGMINC10LPQviDQsiDQsdGD0YTQtdGAINC+0LHQvNC10L3QsD8g0JLRi9GA0LXQt9Cw0L3QvdGL0Lkg0LTQvtC60YPQvNC10L3RgiDQvNC+0LbQvdC+INCx0YPQtNC10YIg0LLRgdGC0LDQstC40YLRjCDQv9C+0YHQu9C1INCyINCy0YvQsdGA0LDQvdC90L7QtSDQvNC10YHRgtC+LjwvbWVzc2FnZT4NCi08IS0tQ2hhbmdlIHZpc2liaWxpdHkgaW4gbmF2aWdhdGlvbiAtLT4NCi08bWVzc2FnZSBrZXk9IkNoYW5nZSI+0JjQt9C80LXQvdC40YLRjDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkNoYW5nZSBEb2N1bWVudCB2aXNpYmxpdHkgaW4gbmF2aWdhdGlvbiI+0JLRi9Cx0LXRgNC40YLQtSDQstC40LTQuNC80L7RgdGC0Ywg0LTQvtC60YPQvNC10L3RgtCwINCyINC90LDQstC40LPQsNGG0LjQuDwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9IlZpc2liaWxpdHkgaW4gbmF2aWdhdGlvbiI+0JLQuNC00LjQvNC+0YHRgtGMINCyINC90LDQstC40LPQsNGG0LjQuDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9InZpc2libGUiPtCy0LjQtNC40LzRi9C5PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iaGlkZGVuIj7RgdC60YDRi9GC0YvQuTwvbWVzc2FnZT4NCi08IS0tIEluZm8gQXNzZXQgLS0+DQotPG1lc3NhZ2Uga2V5PSJJbnNlcnQgSW1hZ2UiPtCS0YHRgtCw0LLQuNGC0Ywg0LjQt9C+0LHRgNCw0LbQtdC90LjQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9Ikluc2VydCBBc3NldCI+0JLRgdGC0LDQstC40YLRjCDRgNC10YHRg9GA0YE8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJBc3NldCBVcGxvYWQiPtCX0LDQs9GA0YPQt9C60LAg0YDQtdGB0YPRgNGB0LA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJJbnNlcnQgYSBuZXcgSW1hZ2UiPtCS0YHRgtCw0LLQuNGC0Ywg0L3QvtCy0L7QtSDQuNC30L7QsdGA0LDQttC10L3QuNC1PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iVXBsb2FkIGFuIEFzc2V0Ij7Ql9Cw0LPRgNGD0LfQuNGC0Ywg0YDQtdGB0YPRgNGBPC9tZXNzYWdlPg0KLQ0KLTwhLS0gSW5mbyB3b3JrZmxvdyAgLS0+DQotPG1lc3NhZ2Uga2V5PSJWYWx1ZSI+0JfQvdCw0YfQtdC90LjQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkV2ZW50Ij7QodC+0LHRi9GC0LjQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlZhcmlhYmxlcyI+0J/QtdGA0LXQvNC10L3QvdGL0LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJIaXN0b3J5Ij7QmNGB0YLQvtGA0LjRjzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlN0YXRlIj7QodC+0YHRgtC+0Y/QvdC40LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJJUCBBZGRyZXNzIj5JUCDQkNC00YDQtdGBPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZWRpdCI+0YDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Yw8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJzdWJtaXQiPtC+0YLQv9GA0LDQstC40YLRjDwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9InJlamVjdCI+0L7RgtC60LvQvtC90LjRgtGMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0icHVibGlzaCI+0L7Qv9GD0LHQu9C40LrQvtCy0LDRgtGMPC9tZXNzYWdlPg0KLTwhLS0gSW5mbyBhc3NldCAgLS0+DQotPG1lc3NhZ2Uga2V5PSJOZXcgQXNzZXQiPtCd0L7QstGL0Lkg0YDQtdGB0YPRgNGBPC9tZXNzYWdlPg0KLTwhLS0gSW5mbyBSQyAgLS0+DQotPG1lc3NhZ2Uga2V5PSJDdXJyZW50IFZlcnNpb24iPtCi0LXQutGD0YnQsNGPINCy0LXRgNGB0LjRjzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IlJvbGxiYWNrIHRvIHRoaXMgcmV2aXNpb24iPtCe0YLQutCw0YLQuNGC0YzRgdGPINC6INGN0YLQvtC5INCy0LXRgNGB0LjQuDwvbWVzc2FnZT4NCi08IS0tIEluZm8gQUMgIC0tPg0KLTxtZXNzYWdlIGtleT0iU1NMIEVuY3J5cHRpb24iPlNTTCDRiNC40YTRgNC+0LLQsNC90LjQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFjY2VzcyBPYmplY3QiPtCe0LHRitC10LrRgiDQtNC+0YHRgtGD0L/QsDwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9InZpc2l0Ij7Qv9C+0YHQtdGJ0LXQvdC40LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJyZXZpZXdlciI+0L7QsdC+0LfRgNC10LLQsNGC0LXQu9GMPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZWRpdG9yIj7RgNC10LTQsNC60YLQvtGAPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0id29ybGQiPndvcmxkPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0idGhlIHdvcmxkIj50aGUgd29ybGQ8L21lc3NhZ2U+DQotPCEtLSBTY2hlZHVsZXIgLS0+DQotPG1lc3NhZ2Uga2V5PSJOZXcgam9iIj7QndC+0LLQvtC1INC30LDQtNCw0L3QuNC1PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iQWN0aXZlIGpvYnMiPtCi0LXQutGD0YnQuNC1INC30LDQtNCw0L3QuNGPPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iUHVibGlzaCBhbmQgRXhwb3J0Ij7QntC/0YPQsdC70LjQutC+0LLQsNGC0Ywg0Lgg0Y3QutGB0L/QvtGA0YLQuNGA0L7QstCw0YLRjDwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9ImRvYy1oYXMtbGlua3MtdG8tdW5wdWJsaXNoZWQiPtCU0L7QutGD0LzQtdC90YIg0YHRgdGL0LvQsNC10YLRgdGPINC90LAg0YHQu9C10LTRg9GO0YnQuNC1INC90LXQvtC/0YPQsdC70LjQutC+0LLQsNC90L3Ri9C1INC00L7QutGD0LzQtdC90YLRizo8L21lc3NhZ2U+DQotPCEtLSBOZXcgRG9jdW1lbnQgLS0+DQotPG1lc3NhZ2Uga2V5PSJQbGVhc2UgY2hlY2sgdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBjYXVzZXMgb2YgdGhlIGV4Y2VwdGlvbiI+0J/RgNC+0LLQtdGA0YLRjNC1INGB0LvQtdC00YPRjtGJ0LjQtSDQv9GA0LjRh9C40L3RiyDQuNGB0LrQu9GO0YfQtdC90LjRjywg0L/QvtC20LDQu9GD0LnRgdGC0LAuPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZXhjZXB0aW9uLmNhdXNlLmNyZWF0ZWRvYy53aGl0ZXNwYWNlLWluLWlkIj7QmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQvdC1INC80L7QttC10YIg0YHQvtC00LXRgNC20LDRgtGMINC/0YDQvtCx0LXQu9C+0LI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJleGNlcHRpb24uY2F1c2UuY3JlYXRlZG9jLmlkLWluLXVzZSI+0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YPQttC1INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImZhaWxtZXNzYWdlLmNyZWF0ZWRvYy5pbnZhbGlkZm9ybWF0Ij7QktCy0LXQtNC40YLQtSDQv9C+0LbQsNC70YPQudGB0YLQsCDQtNC+0L/Rg9GB0YLQuNC80L7QtSDQt9C90LDRh9C10L3QuNC1INCyINC/0L7Qu9C1IElELiBBLVosIGEteiwgMC05INC40LvQuCAtINGB0L7RgdGC0LDQstC70Y/RjtGCINC00L7Qv9GD0YHRgtC40LzQvtC1INC30L3QsNGH0LXQvdC40LUuPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iZmFpbG1lc3NhZ2UuY3JlYXRlZG9jLnJlcXVpcmVkIj7Ql9Cw0L/QvtC70L3QuNGC0LUg0LLRgdC1INC+0LHRj9C30LDRgtC10LvRjNC90YvQtSAoKikg0L/QvtC70Y8g0L/QvtC20LDQu9GD0LnRgdGC0LAuPC9tZXNzYWdlPg0KLTwhLS0gQXNzZXQgVXBsb2FkL0luc2VydCBEaWFsb2cgLS0+DQotPG1lc3NhZ2Uga2V5PSJsZW55YS5hc3NldHVwbG9hZC5zdWJ0aXRsZSI+0J/QvtC/0L7Qu9C90LjRgtGMINCx0LjQsdC70LjQvtGC0LXQutGDINGA0LXRgdGD0YDRgdC+0LI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJBc3NldCBMaWJyYXJ5Ij7QkdC40LHQu9C40L7RgtC10LrQsCDRgNC10YHRg9GA0YHQvtCyPC9tZXNzYWdlPg0KLQ0KLTxtZXNzYWdlIGtleT0iTm8gYXNzZXRzIGF2YWlsYWJsZSI+0J3QtdGCINC00L7RgdGC0YPQv9C90YvRhSDRgNC10YHRg9GA0YHQvtCyPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iSW5zZXJ0IEFzc2V0Ij7QktGB0YLQsNCy0LjRgtGMINGA0LXRgdGD0YDRgTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImxlbnlhLmFzc2V0dXBsb2Eubm8uYXNzZXQuc2VsZWN0ZWQiPtCg0LXRgdGD0YDRgSDQvdC1INCy0YvQsdGA0LDQvS4g0JLRi9Cx0LXRgNC40YLQtSDRh9GC0L4t0L3QuNCx0YPQtNGMLjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLm5vLmltYWdlLnNlbGVjdGVkIj7QmNC30L7QsdGA0LDQttC10L3QuNC1INC90LUg0LLRi9Cx0YDQsNC90L4uINCS0YvQsdC10YDQuNGC0LUg0YfRgtC+LdC90LjQsdGD0LTRjC48L21lc3NhZ2U+DQotPCEtLSBJbWFnZSBVcGxvYWQvSW5zZXJ0IERpYWxvZyAtLT4NCi08bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLnRpdGxlIj7QktGB0YLQsNCy0LjRgtGMINC40LfQvtCx0YDQsNC20LXQvdC40LU8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJsZW55YS5pbWFnZXVwbG9hZC5zZWxlY3RpbWFnZS5sYWJlbCI+0JLRi9Cx0LXRgNC40YLQtSDQuNC30L7QsdGA0LDQttC10L3QuNC1PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0ibGVueWEuaW1hZ2V1cGxvYWQuaW5mby5ub2ltYWdlcyI+0J3QtdGCINC00L7RgdGC0YPQv9C90YvRhSDQuNC30L7QsdGA0LDQttC10L3QuNC5LjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImxlbnlhLmltYWdldXBsb2FkLmxpbmtzLmhpbnQiPtCS0L3QtdGI0L3QuNC1INGB0YHRi9C70LrQuCDQtNC+0LvQttC90Ysg0L3QsNGH0LjQvdCw0YLRjNGB0Y8g0YEgICdodHRwOi8vJywg0LAg0LLQvdGD0YLRgNC10L3QvdC40LUgJiMxNTE7INGBICAnLyc8L21lc3NhZ2U+DQotDQotPCEtLSBSZXZpc2lvbiBDb250cm9sbGVyIC0tPg0KLTxtZXNzYWdlIGtleT0iUmVhc29uIj7Qn9GA0LjRh9C40L3QsDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkZpbGVuYW1lIj7QpNCw0LnQuzwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tvdXQiPtCg0LXRgdGD0YDRgSDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0LjQt9Cy0LvQtdGH0ZHQvTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImxlbnlhLnJjLmNoZWNrZWRvdXRhbHJlYWR5Ij7QoNC10YHRg9GA0YEg0LHRi9C7INGD0LbQtSDQuNC30LvQstC10YfRkdC9INC00YDRg9Cz0LjQvCDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQvDwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9ImxlbnlhLnJjLm5vY2hlY2tpbiI+0KDQtdGD0YDRgSDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0LfQsNC/0LjRgdCw0L08L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJHZW5lcmljIEV4Y2VwdGlvbiI+0J7QsdGJ0LXQtSDQuNGB0LrQu9GO0YfQtdC90LjQtTwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkNoZWNrIHRoZSBsb2cgZmlsZXMuIj7Qn9GA0L7QstC10YDRjNGC0LUg0YTQsNC50LvRiyDQttGD0YDQvdCw0LvQvtCyLjwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9IlVzZXIgSUQiPtCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjzwvbWVzc2FnZT4NCi0NCi08bWVzc2FnZSBrZXk9InJlbmFtZS1kb2N1bWVudCI+0J/QtdGA0LXQuNC80LXQvdC+0LLQsNC90LjQtSDQtNC+0LrRg9C80LXQvdGC0LAgezB9PC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iSW5oZXJpdGVkIFJpZ2h0cyI+0KPQvdCw0YHQu9C10LTQvtCy0LDQvdC90YvQtSDQv9GA0LDQstCwPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iUGFyZW50IElEIj7QoNC+0LTQuNGC0LXQu9GM0YHQutC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YA8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJsZW55YS5hc3NldHVwbG9hZC50aXRsZSI+T2JqZWt0IGVpbmbDvGdlbjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IkFkZCB0byBBc3NldCBMaWJyYXJ5Ij7QlNC+0LHQsNCy0LjRgtGMINCyINCx0LjQsdC70LjQvtGC0LXQutGDINGA0LXRgdGD0YDRgdC+0LI8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJOZXcgZG9jdW1lbnQiPk5vdXZlYXUgZG9jdW1lbnQ8L21lc3NhZ2U+DQotPG1lc3NhZ2Uga2V5PSJJUCBSYW5nZSBHcm91cHMiPtCT0YDRg9C/0L/RiyBJUC3QsNC00YDQtdGB0L7QsjwvbWVzc2FnZT4NCi08bWVzc2FnZSBrZXk9IklQIFJhbmdlIE92ZXJ2aWV3Ij7QntCx0LfQvtGAIElQLdCw0LTRgNC10YHQvtCyPC9tZXNzYWdlPg0KLTxtZXNzYWdlIGtleT0iTWV0YSI+0JzQtdGC0LA8L21lc3NhZ2U+DQotDQotPG1lc3NhZ2Uga2V5PSJSZXNvdXJjZSBUeXBlIj7QotC40L8g0LTQvtC60YPQvNC10L3RgtCwPC9tZXNzYWdlPg0KLTwvY2F0YWxvZ3VlPg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vZW1wdHlDYXRhbG9ndWUueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9lbXB0eUNhdGFsb2d1ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YzM2NzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9lbXB0eUNhdGFsb2d1ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogY21zdWlfZGUueG1sIDQ0NjU0MiAyMDA2LTA5LTE1IDA4OjE0OjM5WiBhbmRyZWFzICQgLS0+DQotDQotPGNhdGFsb2d1ZS8+DQotDQotDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9tb2R1bGVzMnhpbmNsdWRlLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2kxOG4vbW9kdWxlczJ4aW5jbHVkZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDRkM2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaTE4bi9tb2R1bGVzMnhpbmNsdWRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIA0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHhpbmNsdWRlLnhzbCAxMjM0MTQgMjAwNC0xMi0yNyAxNDo1MjoyNFogZ3JlZ29yICQgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCINCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIg0KLSAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiDQotICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3B1YmxpY2F0aW9uLzEuMSINCi0gID4NCi0NCi0gIDx4c2w6cGFyYW0gbmFtZT0icHViSWQiLz4NCi0gIDx4c2w6cGFyYW0gbmFtZT0iY2F0YWxvZ3VlIi8+DQotDQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjYXRhbG9ndWUiPg0KLSAgICA8eHNsOmNvcHk+DQotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCp8bm9kZSgpIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJkb2N1bWVudCgnYWdncmVnYXRlLWZhbGxiYWNrOi8vY29uZmlnL3B1YmxpY2F0aW9uLnhtbCcpLyovbGVueWE6bW9kdWxlcy9sZW55YTptb2R1bGUiLz4NCi0gICAgPC94c2w6Y29weT4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGVueWE6bW9kdWxlIj4NCi0gICAgPHhzbDppZiB0ZXN0PSJub3QocHJlY2VkaW5nLXNpYmxpbmc6Om1vZHVsZVtAbmFtZSA9IGN1cnJlbnQoKS9AbmFtZV0pIj4NCi0gICAgICA8eGk6aW5jbHVkZSBocmVmPSJjb2Nvb246L2kxOG4tY2F0YWxvZ3VlL21vZHVsZS97QG5hbWV9L3skY2F0YWxvZ3VlfSINCi0gICAgICAgIHhwb2ludGVyPSJ4cG9pbnRlcigvY2F0YWxvZ3VlL21lc3NhZ2UpIi8+DQotICAgIDwveHNsOmlmPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotPC94c2w6c3R5bGVzaGVldD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvZGVsZXRlLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy9kZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTFjZjYwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy9kZWxldGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL2VkaXRvci9hZGQucG5nIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL2VkaXRvci9hZGQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmVkZTIwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy9lZGl0b3IvYWRkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy9lZGl0b3IvZGVsZXRlLnBuZyBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy9lZGl0b3IvZGVsZXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1N2ZkMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvZWRpdG9yL2RlbGV0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvZWRpdG9yL2VkaXQucG5nIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL2VkaXRvci9lZGl0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2ZjNhMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvZWRpdG9yL2VkaXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL2ljb25zL2VtcHR5LWljb24ucG5nIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL2ljb25zL2VtcHR5LWljb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQyOWI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy9pY29ucy9lbXB0eS1pY29uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy9pbnNlcnQuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL2luc2VydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTE5OTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL2luc2VydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvbGVueWEuaWNvIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL2xlbnlhLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNTYxYS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvbGVueWEuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3Byb2plY3QtbG9nby1zbWFsbC5wbmcgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvcHJvamVjdC1sb2dvLXNtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkZjQyNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvcHJvamVjdC1sb2dvLXNtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy9wcm9qZWN0LWxvZ28ucG5nIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3Byb2plY3QtbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDMxMDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3Byb2plY3QtbG9nby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS9jbG9zZWQtY29sbGVjdGlvbi1MLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL2Nsb3NlZC1jb2xsZWN0aW9uLUwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTc5OTNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL2Nsb3NlZC1jb2xsZWN0aW9uLUwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUvY2xvc2VkLWNvbGxlY3Rpb24tVC5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS9jbG9zZWQtY29sbGVjdGlvbi1ULmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NDRhYi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS9jbG9zZWQtY29sbGVjdGlvbi1ULmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL2VtcHR5LmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL2VtcHR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkNTIwZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS9lbXB0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS9ub24tY29sbGVjdGlvbi1MLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL25vbi1jb2xsZWN0aW9uLUwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzRhMGZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL25vbi1jb2xsZWN0aW9uLUwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUvbm9uLWNvbGxlY3Rpb24tVC5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS9ub24tY29sbGVjdGlvbi1ULmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyYTM5ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS9ub24tY29sbGVjdGlvbi1ULmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL29wZW5lZC1jb2xsZWN0aW9uLUwuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUvb3BlbmVkLWNvbGxlY3Rpb24tTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzUyYjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUvb3BlbmVkLWNvbGxlY3Rpb24tTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS9vcGVuZWQtY29sbGVjdGlvbi1ULmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL29wZW5lZC1jb2xsZWN0aW9uLVQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmZjMzk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy90cmVlL29wZW5lZC1jb2xsZWN0aW9uLVQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3RyZWUvdmVydGljYWwtbGluZS5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS92ZXJ0aWNhbC1saW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2ZjY1My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdHJlZS92ZXJ0aWNhbC1saW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy91dGlsL3BpeGVsLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy91dGlsL3BpeGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwOTY4NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdXRpbC9waXhlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdXRpbC91cGxvYWRhc3NldC5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9pbWFnZXMvdXRpbC91cGxvYWRhc3NldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjg1NWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3V0aWwvdXBsb2FkYXNzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3V0aWwvdXBsb2FkaW1hZ2UuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvaW1hZ2VzL3V0aWwvdXBsb2FkaW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTg5ZTY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2ltYWdlcy91dGlsL3VwbG9hZGltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2phdmFzY3JpcHQvamF2YXNjcmlwdC54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9qYXZhc2NyaXB0L2phdmFzY3JpcHQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdmODQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL2phdmFzY3JpcHQvamF2YXNjcmlwdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiDQotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQotICANCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJzY3JpcHQiPg0KLSAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLTwveHNsOnRlbXBsYXRlPg0KLSAgDQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9qYXZhc2NyaXB0L3ZhbGlkYXRpb24ueG1sIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvamF2YXNjcmlwdC92YWxpZGF0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwNjIwMS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9qYXZhc2NyaXB0L3ZhbGlkYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IGltYWdlLnhzbCA1NjA2MiAyMDA0LTEwLTMwIDE5OjIwOjA2WiBncmVnb3IgJCAtLT4NCi0NCi08c2NyaXB0IHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSINCi0gICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4gDQotDQotIC8qIGNoZWNrIGZpbGVzIHRvIGJlIHVwbG9hZGVkIGFnYWluc3QgYSBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMsIHJlcXVpcmVkIHRpdGxlIGFuZCBubyB3aGl0ZXNwYWNlIGluIGZpbGVuYW1lcyAqLw0KLSAgZnVuY3Rpb24gY2hlY2tfdXBsb2FkKGZpbGVpbnB1dCwgZXh0KSB7DQotICAgIHZhciBpID0gMDsNCi0gICAgdmFyIGRlbGltaXRlciA9ICcgJzsgDQotICAgIHZhciB0aGVmaWxlID0gZmlsZWlucHV0WyJwcm9wZXJ0aWVzLmFzc2V0LmRhdGEiXS52YWx1ZTsNCi0gICAgdmFyIHRpdGxlID0gZmlsZWlucHV0WyJwcm9wZXJ0aWVzLmFzc2V0LnRpdGxlIl0udmFsdWU7DQotICAgIGlmICh0aXRsZSA9PSAiIikgew0KLSAgICAgYWxlcnQoIjxpMThuOnRyYW5zbGF0ZT48aTE4bjp0ZXh0IGtleT0idXBsb2FkLXdpdGgtbWlzc2luZy10aXRsZSIvPjwvaTE4bjp0cmFuc2xhdGU+Iik7IA0KLSAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotICAgIHZhciBfdGVtcEFycmF5ID0gbmV3IEFycmF5KCk7DQotICAgIF90ZW1wQXJyYXkgPSBleHQuc3BsaXQoZGVsaW1pdGVyKTsNCi0gICAgZm9yKGkgaW4gX3RlbXBBcnJheSkgeyANCi0gICAgICBpZih0aGVmaWxlLmluZGV4T2YoJy4nICsgX3RlbXBBcnJheVtpXSkgIT0gLTEpIHsgLy8gZmlsZSBoYXMgb25lIG9mIHRoZSBhY2NlcHRlZCBleHRlbnNpb25zLiANCi0gICAgICAgICAgIHJldHVybiB0cnVlOyANCi0gICAgICB9IA0KLSAgICAgfSAvLyBmaWxlIGRvZXMgbm90IGhhdmUgb25lIG9mIHRoZSBhY2NlcHRlZCBleHRlbnNpb25zLiANCi0gICAgIGFsZXJ0KCI8aTE4bjp0cmFuc2xhdGU+PGkxOG46dGV4dCBrZXk9InVwbG9hZC13aXRoLWludmFsaWQtZXh0ZW5zaW9uIi8+PGkxOG46cGFyYW0+OlxuXG4iK2V4dCsiXG48L2kxOG46cGFyYW0+PC9pMThuOnRyYW5zbGF0ZT4iKTsgDQotICAgICByZXR1cm4gZmFsc2U7DQotICB9IA0KLWZ1bmN0aW9uIHZhbGlkUmVxdWlyZWQoZm9ybUZpZWxkLGZpZWxkTGFiZWwpDQotew0KLQl2YXIgcmVzdWx0ID0gdHJ1ZTsNCi0NCi0JaWYgKGZvcm1GaWVsZC52YWx1ZSA9PSAiIikNCi0Jew0KLQkJYWxlcnQoJzxpMThuOnRleHQga2V5PSJmYWlsbWVzc2FnZS5jcmVhdGVkb2MucmVxdWlyZWQiLz4nKTsNCi0JCWZvcm1GaWVsZC5mb2N1cygpOw0KLQkJcmVzdWx0ID0gZmFsc2U7DQotCX0NCi0JDQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLWZ1bmN0aW9uIHZhbGlkQ29udGVudChmb3JtRmllbGQsZmllbGRMYWJlbCkNCi17DQotCXZhciByZXN1bHQgPSB0cnVlOw0KLQkNCi0JaWYgKGZvcm1GaWVsZC52YWx1ZS5tYXRjaCgiW15hLXpBLVowLTlcXC1dKyIpKQ0KLQl7DQotCQlhbGVydCgnPGkxOG46dGV4dCBrZXk9ImZhaWxtZXNzYWdlLmNyZWF0ZWRvYy5pbnZhbGlkZm9ybWF0Ii8+Jyk7DQotCQlmb3JtRmllbGQuZm9jdXMoKTsNCi0JCXJlc3VsdCA9IGZhbHNlOw0KLQl9DQotCQ0KLQlyZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi1mdW5jdGlvbiBjaGVja19udW0ob2JqKSB7DQotICB2YXIgdmFsdWUgPSBwYXJzZUludChvYmoudmFsdWUpOw0KLSAgaWYgKHZhbHVlICZhbXA7JmFtcDsgMCAmbHQ7PSB2YWx1ZSAmYW1wOyZhbXA7IHZhbHVlICZsdDs9IDI1NSkgew0KLSAgb2JqLnZhbHVlID0gIiIgKyBwYXJzZUludChvYmoudmFsdWUpOw0KLSAgfQ0KLSAgZWxzZSB7DQotICAgIG9iai52YWx1ZSA9ICIwIjsNCi0gIH0NCi19DQotPC9zY3JpcHQ+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYWN0aXZlLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2FjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NWRlOGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2FkbWluX2FjdGl2ZS5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9hZG1pbl9hY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWNiMTI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2FkbWluX2FjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9hZG1pbl9hY3RpdmUucG5nIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYWRtaW5fYWN0aXZlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhOTgzNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9hZG1pbl9hY3RpdmUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYWRtaW5faW5hY3RpdmUuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYWRtaW5faW5hY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODYwYjQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2FkbWluX2luYWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2FwYWNoZS1sZW55YV9sb2dvX2JsYWNrLnBuZyBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2FwYWNoZS1sZW55YV9sb2dvX2JsYWNrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhNDJlZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9hcGFjaGUtbGVueWFfbG9nb19ibGFjay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9hdXRob3JpbmdfYWN0aXZlLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2F1dGhvcmluZ19hY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzJhYzY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2F1dGhvcmluZ19hY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYXV0aG9yaW5nX2luYWN0aXZlLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2F1dGhvcmluZ19pbmFjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNzhmMWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYXV0aG9yaW5nX2luYWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2JsYXVfYW5mYW5nLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2JsYXVfYW5mYW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjZDI5MS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9ibGF1X2FuZmFuZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9ibGF1X2FuZmFuZ19vYmVuLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2JsYXVfYW5mYW5nX29iZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODFmMGYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2JsYXVfYW5mYW5nX29iZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYm90dG9tYmcuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvYm90dG9tYmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQzYTAwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2JvdHRvbWJnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2NoZWNrZWQucG5nIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvY2hlY2tlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMTY4NWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvY2hlY2tlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9jaGVja2VkUGxhY2Vob2xkZXIucG5nIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvY2hlY2tlZFBsYWNlaG9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYmQ4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9jaGVja2VkUGxhY2Vob2xkZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZG90dGVkLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2RvdHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTZkYWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZG90dGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2VkaXQuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZWRpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZmM0MmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9maWxlLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI5MTk0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZnJhbWUtYmdfb2Jlbi5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9mcmFtZS1iZ19vYmVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmYWU1Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9mcmFtZS1iZ19vYmVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2dyYXUtYmcuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZ3JhdS1iZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMWNhNDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZ3JhdS1iZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9ncmF1LWJnMi5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9ncmF1LWJnMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2NjOTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZ3JhdS1iZzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZ3JhdS1iZzMuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvZ3JhdS1iZzMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhiNjEwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2dyYXUtYmczLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2dyYXUtYmc0LmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2dyYXUtYmc0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyNTY1MC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9ncmF1LWJnNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9ncmF1LmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2dyYXUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGM5Y2ZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2dyYXUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvaGVscC5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzMGU5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9oZWxwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2luYWN0aXZlLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2luYWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlNDIwOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9pbmFjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9pbmZvX2FjdGl2ZS5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9pbmZvX2FjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNWMxNjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvaW5mb19hY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvaW5mb19pbmFjdGl2ZS5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9pbmZvX2luYWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0OTBiZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9pbmZvX2luYWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2xlbnlhLWxvZ28uZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbGVueWEtbG9nby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjRhMzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbGVueWEtbG9nby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9sZW55YS5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9sZW55YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjkzYTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbGVueWEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbGVueWFfb2Jlbi5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9sZW55YV9vYmVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjZjUxOS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9sZW55YV9vYmVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2xlbnlhX29iZW5fMi5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9sZW55YV9vYmVuXzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWIxMTc4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL2xlbnlhX29iZW5fMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9sZW55YV91bnRlbi5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9sZW55YV91bnRlbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZTZmMDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbGVueWFfdW50ZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbGl2ZV9pbmFjdGl2ZS5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9saXZlX2luYWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhM2MzNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9saXZlX2luYWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL21lbnUtYmFja2dyb3VuZC5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9tZW51LWJhY2tncm91bmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDE5MDQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL21lbnUtYmFja2dyb3VuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9tZW51LWJnLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL21lbnUtYmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg5MzFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL21lbnUtYmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbWVudS1iZ18yLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL21lbnUtYmdfMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTE5MzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbWVudS1iZ18yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL21lbnUtYmdfYW5mYW5nLmdpZiBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL21lbnUtYmdfYW5mYW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiODg1My4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9tZW51LWJnX2FuZmFuZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9tZW51X2JnX2FuZmFuZzIuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvbWVudV9iZ19hbmZhbmcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmMDFlNi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9tZW51X2JnX2FuZmFuZzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvcGl4ZWwuZ2lmIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvcGl4ZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjA5Njg0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL3BpeGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL3NlYXJjaC5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9zZWFyY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNiNmIzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL3NlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9zdGFnaW5nX2FjdGl2ZS5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9zdGFnaW5nX2FjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTQzYzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvc3RhZ2luZ19hY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvc3RhZ2luZ19pbmFjdGl2ZS5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9zdGFnaW5nX2luYWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkYjA3ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy9zdGFnaW5nX2luYWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL3VuY2hlY2tlZC5wbmcgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy91bmNoZWNrZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjg5NjYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvaW1hZ2VzL3VuY2hlY2tlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy91bnRlbi5naWYgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9tZW51L2ltYWdlcy91bnRlbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMWEyZTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9pbWFnZXMvdW50ZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9tZW51LmpzIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvbWVudS9tZW51LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQ2ZmIwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL21lbnUvbWVudS5qcworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0qIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0qICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSoNCi0qICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0qDQotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLQ0KLXZhciBudW1iZXJPZk1lbnVzID0gNTsgLy8gY2hhbmdlIHRoaXMgaWYgeW91IGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIG1lbnVzDQotdmFyIGFjdGl2ZU1lbnUgPSBudWxsOyAvL2RlZmluZXMgd2hpY2ggbWVudSBpcyBjdXJyZW50bHkgb3Blbg0KLQ0KLS8vcnVucyBhdCBvbmxvYWQgb2Ygd2luZG93ICAgICAgICANCi1mdW5jdGlvbiBpbml0aWFsaXplKCkgew0KLSAgICB1c2VyRXZlbnRzSW5pdCgpOyAvL3NldCB1cCBhbGwgdXNlciBldmVudHMNCi19DQotDQotZnVuY3Rpb24gbWVudU92ZXIoKSB7DQotICAgIGRvY3VtZW50Lm9uY2xpY2sgPSBudWxsOw0KLSAgICBpZiAod2luZG93LmV2ZW50ICE9IG51bGwpIHdpbmRvdy5ldmVudC5jYW5jZWxCdWJibGU9dHJ1ZTsgLy8gSUUgcmVxdWlyZXMgdGhpcw0KLX0NCi0NCi1mdW5jdGlvbiBtZW51T3V0KCkgew0KLSAgICBkb2N1bWVudC5vbmNsaWNrID0gZXZlbnRIaWRlTWVudTsNCi0gICAgaWYgKHdpbmRvdy5ldmVudCAhPSBudWxsKSB3aW5kb3cuZXZlbnQuY2FuY2VsQnViYmxlPXRydWU7IC8vIElFIHJlcXVpcmVzIHRoaXMNCi19DQotDQotLy90dXJucyBvbiB0aGUgZGlzcGxheSBmb3IgbmF2IG1lbnVzDQotZnVuY3Rpb24gZXZlbnRTaG93TWVudShlKSB7DQotICAgIHZhciBvYmo7DQotICAgIGlmIChhY3RpdmVNZW51ICE9IG51bGwpIGV2ZW50SGlkZU1lbnUoKTsNCi0gICAgYWN0aXZlTWVudSA9ICJtZW51Iit0aGlzLmlkLnN1YnN0cmluZygzLHRoaXMuaWQubGVuZ3RoKQ0KLSAgICBvYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhY3RpdmVNZW51KTsNCi0gICAgaWYgKG9iaiAhPSBudWxsKSBvYmouc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsNCi0gICAgaWYgKGRvY3VtZW50LmFsbCkgZG9jdW1lbnQub25jbGljayA9IGV2ZW50SGlkZU1lbnU7IC8vIElFIHJlcXVpcmVzIHRoaXMNCi0gICAgaWYgKHdpbmRvdy5ldmVudCAhPSBudWxsKSB3aW5kb3cuZXZlbnQuY2FuY2VsQnViYmxlPXRydWU7IC8vIElFIHJlcXVpcmVzIHRoaXMNCi19DQotDQotLy9oaWRlcyBuYXYgbWVudXMgYW5kIHBvcCB1cHMNCi1mdW5jdGlvbiBldmVudEhpZGVNZW51KCkgew0KLSAgICB2YXIgb2JqOw0KLSAgICBkb2N1bWVudC5vbmNsaWNrID0gbnVsbDsNCi0gICAgaWYgKGFjdGl2ZU1lbnUgIT0gbnVsbCkgew0KLSAgICAgICAgb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlTWVudSk7DQotICAgICAgICBvYmouc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KLSAgICB9DQotfQ0KLQ0KLS8vbmF2IGV2ZW50cw0KLWZ1bmN0aW9uIHVzZXJFdmVudHNJbml0KCkgew0KLSAgICB2YXIgb2JqOw0KLSAgICB2YXIgaTsNCi0gICAgZm9yIChpPTE7IGkgPD0gbnVtYmVyT2ZNZW51czsgaSsrKSB7DQotCSAgICBvYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2IitpKTsNCi0JICAgIGlmIChvYmogIT0gbnVsbCkgew0KLQkJICAgIG9iai5vbmNsaWNrID0gZXZlbnRTaG93TWVudTsNCi0JICAgIH0NCi0JDQotCSAgICBvYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWVudSIraSk7DQotCSAgICBpZiAob2JqICE9IG51bGwpIHsNCi0JCSAgICBvYmoub25tb3VzZW92ZXIgPSBtZW51T3ZlcjsNCi0JCSAgICBvYmoub25tb3VzZW91dCA9IG1lbnVPdXQ7DQotCSAgICB9DQotICAgIH0NCi0gfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL3NjaGVtYXMvZHVibGluY29yZS9kdWJsaW5jb3JlLnJuZyBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL3NjaGVtYXMvZHVibGluY29yZS9kdWJsaW5jb3JlLnJuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2MzczMC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3Jlc291cmNlcy9zY2hlbWFzL2R1YmxpbmNvcmUvZHVibGluY29yZS5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogZHVibGluY29yZS5ybmcgNDI3MDIgMjAwNC0wMy0xMyAxMjozNDoxOFogZ3JlZ29yICQgLS0+Ci0gICAgCi08Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiCi0gICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCi0gICAgICAgICB4bWxuczpkY3Rlcm1zPSJodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvIgotICAgICAgICAgPgotCi08IS0tIER1YmxpbiBDb3JlIFNjaGVtYSAtLT4KLQotPGRlZmluZSBuYW1lPSJkdWJsaW5jb3JlIj4KLSAgPGludGVybGVhdmU+Ci0gICAgCi0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkYzp0aXRsZSI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGM6Y3JlYXRvciI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGM6c3ViamVjdCI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGM6ZGVzY3JpcHRpb24iPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjOnB1Ymxpc2hlciI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGM6Y29udHJpYnV0b3IiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjOmRhdGUiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjOnR5cGUiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjOmZvcm1hdCI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGM6aWRlbnRpZmllciI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGM6c291cmNlIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkYzpsYW5ndWFnZSI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGM6cmVsYXRpb24iPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjOmNvdmVyYWdlIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkYzpyaWdodHMiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgCi0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOmF1ZGllbmNlIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOmFsdGVybmF0aXZlIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOnRhYmxlT2ZDb250ZW50cyI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczphYnN0cmFjdCI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczpjcmVhdGVkIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOnZhbGlkIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOmF2YWlsYWJsZSI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczppc3N1ZWQiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6bW9kaWZpZWQiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6ZXh0ZW50Ij48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOm1lZGl1bSI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczppc1ZlcnNpb25PZiI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczpoYXNWZXJzaW9uIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOmlzUmVwbGFjZWRCeSI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczpyZXBsYWNlcyI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczppc1JlcXVpcmVkQnkiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6cmVxdWlyZXMiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6aXNQYXJ0T2YiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6aGFzUGFydCI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczppc1JlZmVyZW5jZWRCeSI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczpyZWZlcmVuY2VzIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOmlzRm9ybWF0T2YiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6aGFzRm9ybWF0Ij48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOmNvbmZvcm1zVG8iPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6c3BhdGlhbCI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczp0ZW1wb3JhbCI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczptZWRpYXRvciI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGVsZW1lbnQgbmFtZT0iZGN0ZXJtczpkYXRlQWNjZXB0ZWQiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6ZGF0ZUNvcHlyaWdodGVkIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOmRhdGVTdWJtaXR0ZWQiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6ZWR1Y2F0aW9uTGV2ZWwiPjx0ZXh0Lz48L2VsZW1lbnQ+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxlbGVtZW50IG5hbWU9ImRjdGVybXM6YWNjZXNzUmlnaHRzIj48dGV4dC8+PC9lbGVtZW50Pjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48ZWxlbWVudCBuYW1lPSJkY3Rlcm1zOmJpYmxpb2dyYXBoaWNDaXRhdGlvbiI+PHRleHQvPjwvZWxlbWVudD48L29wdGlvbmFsPgotICAKLSAgPC9pbnRlcmxlYXZlPgotPC9kZWZpbmU+Ci0KLTwvZ3JhbW1hcj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEvcmVzb3VyY2VzL3NjaGVtYXMvbGVueWEucm5nIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvc2NoZW1hcy9sZW55YS5ybmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjODgyNTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS9yZXNvdXJjZXMvc2NoZW1hcy9sZW55YS5ybmcKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbGVueWEucm5nIDE2MDk1OCAyMDA1LTA0LTExIDIxOjQwOjQ2WiBhbmRyZWFzICQgLS0+Ci0KLTxncmFtbWFyIG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgeG1sbnM9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMS4wIgotICAgICAgICAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wYWdlLWVudmVsb3BlLzEuMCIKLSAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKLSAgICAgICAgIHhtbG5zOmRjdGVybXM9Imh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8iCi0gICAgICAgICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgID4KLQotCi08aW5jbHVkZSBocmVmPSJkdWJsaW5jb3JlL2R1YmxpbmNvcmUucm5nIi8+Ci0KLQotPGRlZmluZSBuYW1lPSJsZW55YS5tZXRhIj4KLSAgPGVsZW1lbnQgbmFtZT0ibGVueWE6bWV0YSI+Ci0gICAgPHJlZiBuYW1lPSJkdWJsaW5jb3JlIi8+Ci0gIDwvZWxlbWVudD4KLTwvZGVmaW5lPgotCi0KLTxkZWZpbmUgbmFtZT0ibGVueWEuYXNzZXQiPgotICA8ZWxlbWVudCBuYW1lPSJsZW55YTphc3NldCI+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiPjxyZWYgbmFtZT0iVGV4dC5kYXRhdHlwZSIvPjwvYXR0cmlidXRlPgotICAgIDx0ZXh0Lz4KLSAgPC9lbGVtZW50PgotPC9kZWZpbmU+Ci0KLQotPCEtLSBuYW1lc3BhY2UgZHVtbXkgYXR0cmlidXRlcyAtLT4KLTxkZWZpbmUgbmFtZT0iZHVtbXkuYXR0bGlzdCI+Ci0gIDxvcHRpb25hbD48YXR0cmlidXRlIG5hbWU9ImR1bW15Ij48cmVmIG5hbWU9IlRleHQuZGF0YXR5cGUiLz48L2F0dHJpYnV0ZT48L29wdGlvbmFsPgotICA8b3B0aW9uYWw+PGF0dHJpYnV0ZSBuYW1lPSJkYzpkdW1teSI+PHJlZiBuYW1lPSJUZXh0LmRhdGF0eXBlIi8+PC9hdHRyaWJ1dGU+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxhdHRyaWJ1dGUgbmFtZT0iZGN0ZXJtczpkdW1teSI+PHJlZiBuYW1lPSJUZXh0LmRhdGF0eXBlIi8+PC9hdHRyaWJ1dGU+PC9vcHRpb25hbD4KLSAgPG9wdGlvbmFsPjxhdHRyaWJ1dGUgbmFtZT0ibGVueWE6ZHVtbXkiPjxyZWYgbmFtZT0iVGV4dC5kYXRhdHlwZSIvPjwvYXR0cmlidXRlPjwvb3B0aW9uYWw+Ci0gIDxvcHRpb25hbD48YXR0cmlidXRlIG5hbWU9InhodG1sOmR1bW15Ij48cmVmIG5hbWU9IlRleHQuZGF0YXR5cGUiLz48L2F0dHJpYnV0ZT48L29wdGlvbmFsPgotPC9kZWZpbmU+Ci0KLQotPC9ncmFtbWFyPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS91c2VjYXNlLnhtYXAgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3VzZWNhc2UueG1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyZDY0NC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3VzZWNhc2UueG1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogdXNlY2FzZS54bWFwIDQ1OTYzIDIwMDQtMDktMTMgMTA6MDU6NTZaIGFuZHJlYXMgJCAtLT4KLQotPG1hcDpzaXRlbWFwIHhtbG5zOm1hcD0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL3NpdGVtYXAvMS4wIj4KLSAgCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFZpZXdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8bWFwOnZpZXdzPgotICAgIDxtYXA6dmlldyBmcm9tLWxhYmVsPSJhZ2dyZWdhdGlvbiIgbmFtZT0iYWdncmVnYXRpb24iPgotICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgPC9tYXA6dmlldz4KLSAgICA8bWFwOnZpZXcgZnJvbS1sYWJlbD0ieHNwIiBuYW1lPSJ4c3AiPgotICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgPC9tYXA6dmlldz4KLSAgPC9tYXA6dmlld3M+Ci0gIAotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZXNvdXJjZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDxtYXA6cmVzb3VyY2VzPgotICAgIDxtYXA6cmVzb3VyY2UgbmFtZT0ic3R5bGUtY21zLXBhZ2UiPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gc3JjPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC9wYWdlMnhodG1sLnhzbCIvPgotICAgICAgPG1hcDp0cmFuc2Zvcm0gdHlwZT0iaTE4biI+Ci0gICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdmFsdWU9IntyZXF1ZXN0OmxvY2FsZX0iLz4KLSAgICAgIDwvbWFwOnRyYW5zZm9ybT4gICAgCi0gICAgICA8bWFwOnRyYW5zZm9ybSBzcmM9ImNvbnRleHQ6Ly9sZW55YS94c2x0L3V0aWwvc3RyaXBfbmFtZXNwYWNlcy54c2wiLz4KLSAgICA8L21hcDpyZXNvdXJjZT4KLSAgPC9tYXA6cmVzb3VyY2VzPgotICAKLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGlwZWxpbmVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8bWFwOnBpcGVsaW5lcz4KLSAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVXNlY2FzZXMgdGhhdCB1c2UgdGhlIFVzZWNhc2UgRnJhbWV3b3JrIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAKLSAgICA8bWFwOnBpcGVsaW5lPgotICAgICAgPG1hcDptYXRjaCB0eXBlPSJyZWdpc3RlcmVkLXVzZWNhc2UiPgotICAgICAgICA8bWFwOm1vdW50IHNyYz0iZmFsbGJhY2s6Ly9sZW55YS9tb2R1bGVzL3VzZWNhc2UvdXNlY2FzZS54bWFwIiB1cmktcHJlZml4PSIiIGNoZWNrLXJlbG9hZD0ieWVzIiByZWxvYWQtbWV0aG9kPSJzeW5jaHJvbiIvPgotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgPC9tYXA6cGlwZWxpbmU+Ci0gCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTm90aWZpY2F0aW9uIFBpcGVsaW5lcyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgCi0gICAgPG1hcDpwaXBlbGluZT4KLSAgICAgIAotICAgICAgPCEtLSBub3RpZmljYXRpb24ve3B1YmxpY2F0aW9uLWlkfS97dXNlY2FzZX0ueG1sIC0tPgotICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJub3RpZmljYXRpb24vKi8qLnhtbCI+Ci0gICAgICAgIDxtYXA6c2VsZWN0IHR5cGU9InJlc291cmNlLWV4aXN0cyI+Ci0gICAgICAgICAgPG1hcDp3aGVuIHRlc3Q9ImZhbGxiYWNrOi8vY29uZmlnL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24ueGNvbmYiPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImZhbGxiYWNrOi8vY29uZmlnL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24ueGNvbmYiLz4KLSAgICAgICAgICA8L21hcDp3aGVuPgotICAgICAgICAgIDxtYXA6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbmZpZy9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnhjb25mIi8+Ci0gICAgICAgICAgPC9tYXA6b3RoZXJ3aXNlPiAgICAgIAotICAgICAgICA8L21hcDpzZWxlY3Q+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24ybWVzc2FnZS54c2wiPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVzZWNhc2UiIHZhbHVlPSJ7Mn0iLz4KLSAgICAgICAgPC9tYXA6dHJhbnNmb3JtPgotICAgICAgICA8bWFwOnNlcmlhbGl6ZSB0eXBlPSJ4bWwiLz4KLSAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgCi0gICAgICA8IS0tIG5vdGlmaWNhdGlvbi97cHVibGljYXRpb24taWR9L3t1c2VjYXNlfS54c2wgLS0+Ci0gICAgICA8bWFwOm1hdGNoIHBhdHRlcm49Im5vdGlmaWNhdGlvbi8qLyoueHNsIj4KLSAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvY29vbjovbm90aWZpY2F0aW9uL3sxfS97Mn0ueG1sIi8+Ci0gICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L25vdGlmaWNhdGlvbi9tZXNzYWdlMnhzbHQueHNsIj4KLSAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ1c2VjYXNlIiB2YWx1ZT0iezJ9Ii8+Ci0gICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0ic2VydmVyLXVyaSIgdmFsdWU9Imh0dHA6Ly97cmVxdWVzdDpzZXJ2ZXJOYW1lfTp7cmVxdWVzdDpzZXJ2ZXJQb3J0fSIvPgotICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRvY3VtZW50LXVybCIgdmFsdWU9IntyZXF1ZXN0OmNvbnRleHRQYXRofS97cGFnZS1lbnZlbG9wZTpwdWJsaWNhdGlvbi1pZH0ve3BhZ2UtZW52ZWxvcGU6YXJlYX17cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11cmx9Ii8+Ci0gICAgICAgIDwvbWFwOnRyYW5zZm9ybT4KLSAgICAgICAgPG1hcDpzZXJpYWxpemUgdHlwZT0ieG1sIi8+Ci0gICAgICA8L21hcDptYXRjaD4KLSAgICAgIAotICAgIDwvbWFwOnBpcGVsaW5lPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVXNlY2FzZSBQaXBlbGluZXMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIAotICAgIDxtYXA6cGlwZWxpbmUgdHlwZT0ibm9uY2FjaGluZyI+Ci0gICAgICAKLSAgICAgIDwhLS0ge3B1YmxpY2F0aW9uLWlkfS97YXJlYX0ve3VyaX0tLT4KLSAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iKi8qLyoqIj4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gbW91bnQgcHVibGljYXRpb24tc3BlY2lmaWMgdXNlY2FzZSBzaXRlbWFwIC0tPgotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InVzZWNhc2UiIHBhdHRlcm49IioiPgotICAgICAgICAgIDxtYXA6YWN0IHNyYz0iZmFsbGJhY2s6Ly91c2VjYXNlLXsxfS54bWFwIiB0eXBlPSJyZXNvdXJjZS1leGlzdHMiPgotICAgICAgICAgICAgPG1hcDptb3VudCBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIiBzcmM9IntmYWxsYmFjazovL3VzZWNhc2Utey4uLzF9LnhtYXB9IiB1cmktcHJlZml4PSJ7Li4vLi4vMX0iLz4KLSAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAKLSAgICAgICAgPCEtLSBNb3VudCBzZXBhcmF0ZSB1c2VjYXNlIHNpdGVtYXAgaWYgaXQgZXhpc3RzLiAtLT4KLSAgICAgICAgPG1hcDptYXRjaCB0eXBlPSJ1c2VjYXNlIiBwYXR0ZXJuPSIqIj4KLSAgICAgICAgICA8bWFwOmFjdCBzcmM9InVzZWNhc2VzL3sxfS91c2VjYXNlLXsxfS54bWFwIiB0eXBlPSJyZXNvdXJjZS1leGlzdHMiPgotICAgICAgICAgICAgPG1hcDptb3VudCBjaGVjay1yZWxvYWQ9InRydWUiIHJlbG9hZC1tZXRob2Q9InN5bmNocm9uIiBzcmM9InVzZWNhc2VzL3suLi8xfS91c2VjYXNlLXsuLi8xfS54bWFwIiB1cmktcHJlZml4PSIiLz4KLSAgICAgICAgICA8L21hcDphY3Q+Ci0gICAgICAgIDwvbWFwOm1hdGNoPgotCi0gICAgICAgIAotICAgICAgICA8IS0tIENoZWNrT3V0IC0tPgotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImNoZWNrb3V0IiB0eXBlPSJ1c2VjYXNlIj4KLSAgICAgICAgICAKLSAgICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49ImNoZWNrb3V0IiB0eXBlPSJzdGVwIj4KLSAgICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc2VydmVkLWNoZWNrb3V0Ij4KLSAgICAgICAgICAgICAgPG1hcDpnZW5lcmF0ZSBzcmM9ImNvbnRlbnQvcmMve2V4Y2VwdGlvbn0ueHNwIiB0eXBlPSJzZXJ2ZXJwYWdlcyI+Ci0gICAgICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0idXNlciIgdmFsdWU9Int1c2VyfSIvPgotICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImZpbGVuYW1lIiB2YWx1ZT0ie2ZpbGVuYW1lfSIvPgotICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRhdGUiIHZhbHVlPSJ7ZGF0ZX0iLz4KLSAgICAgICAgICAgICAgPC9tYXA6Z2VuZXJhdGU+Ci0gICAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3JjL3Jjby1leGNlcHRpb24ueHNsIi8+Ci0gICAgICAgICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0ic3R5bGUtY21zLXBhZ2UiLz4KLSAgICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgLz4KLSAgICAgICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgICAgIDxtYXA6cmVkaXJlY3QtdG8gc2Vzc2lvbj0idHJ1ZSIgdXJpPSJ7cmVxdWVzdDpyZXF1ZXN0VVJJfSIvPgotICAgICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAgIAotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA8IS0tIENoZWNrSW4gLS0+Ci0gICAgICAgIDxtYXA6bWF0Y2ggcGF0dGVybj0iY2hlY2tpbiIgdHlwZT0idXNlY2FzZSI+Ci0gICAgICAgICAgCi0gICAgICAgICAgPG1hcDptYXRjaCBwYXR0ZXJuPSJjaGVja2luIiB0eXBlPSJzdGVwIj4KLSAgICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InJlc2VydmVkLWNoZWNraW4iPgotICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJiYWNrdXAiIHZhbHVlPSJ7cmVxdWVzdC1wYXJhbTpiYWNrdXB9Ii8+Ci0gICAgICAgICAgICAgIDxtYXA6Z2VuZXJhdGUgc3JjPSJjb250ZW50L3JjL3tleGNlcHRpb259LnhzcCIgdHlwZT0ic2VydmVycGFnZXMiPgotICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InVzZXIiIHZhbHVlPSJ7dXNlcn0iLz4KLSAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IntmaWxlbmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJjaGVja1R5cGUiIHZhbHVlPSJ7Y2hlY2tUeXBlfSIvPgotICAgICAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9ImRhdGUiIHZhbHVlPSJ7ZGF0ZX0iLz4KLSAgICAgICAgICAgICAgPC9tYXA6Z2VuZXJhdGU+Ci0gICAgICAgICAgICAgIDxtYXA6dHJhbnNmb3JtIHNyYz0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3JjL3Jjby1leGNlcHRpb24ueHNsIi8+Ci0gICAgICAgICAgICAgIDxtYXA6Y2FsbCByZXNvdXJjZT0ic3R5bGUtY21zLXBhZ2UiLz4KLSAgICAgICAgICAgICAgPG1hcDpzZXJpYWxpemUgLz4KLSAgICAgICAgICAgIDwvbWFwOmFjdD4KLSAgICAgICAgICAgIDxtYXA6cmVkaXJlY3QtdG8gc2Vzc2lvbj0idHJ1ZSIgdXJpPSJ7cmVxdWVzdDpyZXF1ZXN0VVJJfSIvPgotICAgICAgICAgIDwvbWFwOm1hdGNoPgotICAgICAgICAgIAotICAgICAgICA8L21hcDptYXRjaD4KLQotICAgICAgICA8IS0tIFRvIHVzZSB0aGlzIGNvZGUsIHlvdSBuZWVkIHRvIGFkZCB0aGUgbGVnYWN5IG1vZHVsZXMgdG8geW91ciBsb2NhbC5idWlsZC5wcm9wZXJ0aWVzLiAtLT4KLSAgICAgICAgPCEtLSBpbml0aWFsaXplIHRoZSB3b3JrZmxvdyAtLT4KLSAgICAgICAgPCEtLQotICAgICAgICA8bWFwOm1hdGNoIHR5cGU9InVzZWNhc2UiIHBhdHRlcm49ImluaXR3b3JrZmxvdyI+Ci0gICAgICAgICAgPG1hcDphY3QgdHlwZT0idGFzayI+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ0YXNrLWlkIiB2YWx1ZT0iYW50Ii8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJpbml0d29ya2Zsb3ciLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InByb3BlcnRpZXMuaW5pdHdvcmtmbG93LmRvY3VtZW50LXV1aWQiIHZhbHVlPSJ7cGFnZS1lbnZlbG9wZTpkb2N1bWVudC11dWlkfSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHJvcGVydGllcy5pbml0d29ya2Zsb3cuZG9jdW1lbnQtdHlwZSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LXR5cGV9Ii8+Ci0gICAgICAgICAgICA8bWFwOnBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0aWVzLmluaXR3b3JrZmxvdy5sYW5ndWFnZSIgdmFsdWU9IntwYWdlLWVudmVsb3BlOmRvY3VtZW50LWxhbmd1YWdlfSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHJvcGVydGllcy5pbml0d29ya2Zsb3cudXNlci1pZCIgdmFsdWU9InthY2Nlc3MtY29udHJvbDp1c2VyLWlkfSIvPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHJvcGVydGllcy5pbml0d29ya2Zsb3cubWFjaGluZS1pcCIgdmFsdWU9InthY2Nlc3MtY29udHJvbDppcC1hZGRyZXNzfSIvPgotICAgICAgICAgICAgPG1hcDpyZWRpcmVjdC10byBzZXNzaW9uPSJ0cnVlIiB1cmk9IntyZXF1ZXN0OnJlcXVlc3RVUkl9Ii8+Ci0gICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICA8L21hcDptYXRjaD4KLQotICAgICAgICA8bWFwOm1hdGNoIHBhdHRlcm49InRyYW5zaXRpb24iIHR5cGU9InVzZWNhc2UiPgotICAgICAgICAgIDxtYXA6YWN0IHR5cGU9InRhc2siPgotICAgICAgICAgICAgPG1hcDpwYXJhbWV0ZXIgbmFtZT0icHVibGljYXRpb24taWQiIHZhbHVlPSJ7Li4vMX0iLz4KLSAgICAgICAgICAgIDxtYXA6cGFyYW1ldGVyIG5hbWU9InRhc2staWQiIHZhbHVlPSJlbXB0eSIvPgotICAgICAgICAgICAgPG1hcDpyZWRpcmVjdC10byBzZXNzaW9uPSJ0cnVlIiB1cmk9IntyZXF1ZXN0OnJlcXVlc3RVUkl9Ii8+Ci0gICAgICAgICAgPC9tYXA6YWN0PgotICAgICAgICA8L21hcDptYXRjaD4KLSAgICAgICAgLS0+Ci0gICAgICAgIAotICAgICAgPC9tYXA6bWF0Y2g+Ci0gICAgICAKLSAgICA8L21hcDpwaXBlbGluZT4KLSAgICAKLSAgPC9tYXA6cGlwZWxpbmVzPgotICAKLTwvbWFwOnNpdGVtYXA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYWRtaW4vcGFnZTJ4aHRtbC54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYWRtaW4vcGFnZTJ4aHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTk3NDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2FkbWluL3BhZ2UyeGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQkgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0JICA+Ci0JICAKLQkgIAotPHhzbDpwYXJhbSBuYW1lPSJjb250ZXh0cHJlZml4Ii8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9jbXNib2R5Ij4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhZ2U6cGFnZS9wYWdlOnRpdGxlIi8+PC90aXRsZT4KLSAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLSAgICAgICAgICBocmVmPSJ7JGNvbnRleHRwcmVmaXh9L2xlbnlhL2Nzcy9hZG1pbi5jc3MiIHRpdGxlPSJhZG1pbiBjc3MiLz4KLSAgICAgIDwvaGVhZD4KLSAgICAgIDxib2R5PgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFnZTpwYWdlIj4KLSAgPHRhYmxlIGNsYXNzPSJsZW55YS1ib2R5IiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsZW55YS1zaWRlYmFyIj4KLSAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtc2lkZWJhci1oZWFkaW5nIj5BZG1pbmlzdHJhdGlvbjwvZGl2PgotICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIvY21zYm9keS94aHRtbDpkaXZbQGlkID0gJ21lbnUnXSIvPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0ibGVueWEtY29udGVudCI+Ci0gICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHgiPgotICAgICAgICAgIDxoMT48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InBhZ2U6dGl0bGUvbm9kZSgpIi8+PC9oMT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icGFnZTpib2R5L25vZGUoKSIvPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBkbyBub3QgY29weSBtZW51IC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6ZGl2W0BpZCA9ICdtZW51J10iLz4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICA8eHNsOmNvcHk+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgPC94c2w6Y29weT4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYWRtaW4vcm9vdC54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYWRtaW4vcm9vdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDNjYmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2FkbWluL3Jvb3QueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIiAKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICA+Ci0gIAotICA8eHNsOnBhcmFtIG5hbWU9ImNvbnRleHRwcmVmaXgiLz4KLQotICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgPGxpbmsgaHJlZj0ieyRjb250ZXh0cHJlZml4fS9sZW55YS9jc3MvZGVmYXVsdC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiLz4KLSAgICAgIDwvaGVhZD4KLQotICAgICAgPGJvZHk+Ci0gICAgICAgIDxkaXYgaWQ9ImxlbnlhLWluZm8tYm9keSI+Ci0gICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjgwJSI+Ci0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibGVueWEtaW5mby1jb250ZW50Ij4KLSAgICAgICAgICAgICAgICAgIDwhLS0gc3VwcG9ydCBib3RoIG9sZC1zdHlsZSB0YWJzIGFuZCBuZXctc3R5bGUgSlggdGFicyAtLT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iL3BhZ2U6cGFnZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0icGFnZTpwYWdlL25vZGUoKSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIqIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2FkbWluL3N0YXR1czJodG1sLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9hZG1pbi9zdGF0dXMyaHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjJkOWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2FkbWluL3N0YXR1czJodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0geG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0geG1sbnM6c3RhdHVzPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vc3RhdHVzLzIuMCI+Ci0gCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InN0YXR1czpzdGF0dXNpbmZvIj4KLSAgICA8ZGl2PgotICAgICAgPGgyPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3RhdHVzOmhvc3QiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0YXR1czpkYXRlIi8+PC9oMj4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L2Rpdj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic3RhdHVzOmdyb3VwIj4KLSAgICA8aDM+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdGF0dXM6bmFtZSIvPjwvaDM+Ci0gICAgPHVsPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ic3RhdHVzOnZhbHVlIi8+PC91bD4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InN0YXR1czpncm91cCIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdGF0dXM6dmFsdWUiPgotICAgIDxsaT4KLSAgICAgIDxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdGF0dXM6bmFtZSIvPjx4c2w6dGV4dD46IDwveHNsOnRleHQ+PC9zcGFuPiAgICAKLQotPCEtLQotICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgICAgICAgIDwvdWw+Ci0tLT4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoQHN0YXR1czpuYW1lLCdmcmVlJykgb3IgY29udGFpbnMoQHN0YXR1czpuYW1lLCd0b3RhbCcpIj4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3VmZml4Ij4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJieXRlcyIgc2VsZWN0PSJudW1iZXIoLikiLz4KLSAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L3hzbDp3aGVuPiAgICAgIAotICAgICAgICA8eHNsOndoZW4gdGVzdD0iY291bnQoc3RhdHVzOmxpbmUpICZsdDs9IDEiPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdGF0dXM6bGluZSIvPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICAgICAgICA8L3VsPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC9saT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic3RhdHVzOmxpbmUiPgotICAgIDxsaT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdWZmaXgiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImJ5dGVzIi8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPCEtLSBNb3JlIHRoYW4gNCBNQiAoPTQxOTQzMDQpIC0tPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRieXRlcyAmZ3Q7PSA0MTk0MzA0Ij4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0icm91bmQoJGJ5dGVzIGRpdiAxMDQ4NS43NikgZGl2IDEwMCIvPiBNQgotCQkJPC94c2w6d2hlbj4KLQkJCTwhLS0gTW9yZSB0aGFuIDQgS0IgKD00MDk2KSAtLT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkYnl0ZXMgJmd0OyA0MDk2Ij4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0icm91bmQoJGJ5dGVzIGRpdiAxMC4yNCkgZGl2IDEwMCIvPiBLQgotCQkJPC94c2w6d2hlbj4KLQkJCTwhLS0gTGVzcyAtLT4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYnl0ZXMiLz4gQgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2F1dGhvcmluZy9hZGRKYXZhU2NyaXB0LnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9hdXRob3JpbmcvYWRkSmF2YVNjcmlwdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwY2UxYjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2F1dGhvcmluZy9hZGRKYXZhU2NyaXB0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gPgotCi0gIDx4c2w6cGFyYW0gbmFtZT0ic2NyaXB0U1JDIi8+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm9kZSgpW2xvY2FsLW5hbWUoKT0naGVhZCddIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgPHhzbDppZiB0ZXN0PSIkc2NyaXB0U1JDIj4KLSAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyRzY3JpcHRTUkN9Ij4mIzE2MDs8L3NjcmlwdD4KLSAgICAgIDwveHNsOmlmPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDwhLS0gSWRlbnRpdHkgdHJhbnNmb3JtYXRpb24gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfCoiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+ICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2F1dGhvcmluZy9hZGRNZXRhRGF0YS54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYXV0aG9yaW5nL2FkZE1ldGFEYXRhLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0N2I4Ni4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYXV0aG9yaW5nL2FkZE1ldGFEYXRhLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCi0gIHhtbG5zOmRjdGVybXM9Imh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8iCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGh0bWwgZGN0ZXJtcyIKLSA+Ci0KLSAgPHhzbDpwYXJhbSBuYW1lPSJjcmVhdG9yIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotICA8eHNsOnBhcmFtIG5hbWU9InN1YmplY3QiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJsYW5ndWFnZSIvPgotICA8eHNsOnBhcmFtIG5hbWU9InB1Ymxpc2hlciIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImRhdGUiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJyaWdodHMiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYzpjcmVhdG9yWyRjcmVhdG9yIT0nJ10iPgotICAgIDxkYzpjcmVhdG9yPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjcmVhdG9yIi8+Ci0gICAgPC9kYzpjcmVhdG9yPgotICA8L3hzbDp0ZW1wbGF0ZT4gIAotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRjOnRpdGxlWyR0aXRsZSE9JyddIj4KLSAgICA8ZGM6dGl0bGU+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+Ci0gICAgPC9kYzp0aXRsZT4KLSAgPC94c2w6dGVtcGxhdGU+ICAKLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYzpkZXNjcmlwdGlvblskZGVzY3JpcHRpb24hPScnXSI+Ci0gICAgPGRjOmRlc2NyaXB0aW9uPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvbiIvPgotICAgIDwvZGM6ZGVzY3JpcHRpb24+Ci0gIDwveHNsOnRlbXBsYXRlPiAgCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGM6c3ViamVjdFskc3ViamVjdCE9JyddIj4KLSAgICA8ZGM6c3ViamVjdD4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3ViamVjdCIvPgotICAgIDwvZGM6c3ViamVjdD4KLSAgPC94c2w6dGVtcGxhdGU+ICAKLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYzpsYW5ndWFnZVskbGFuZ3VhZ2UhPScnXSI+Ci0gICAgPGRjOmxhbmd1YWdlPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsYW5ndWFnZSIvPgotICAgIDwvZGM6bGFuZ3VhZ2U+Ci0gIDwveHNsOnRlbXBsYXRlPiAgCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGM6cHVibGlzaGVyWyRwdWJsaXNoZXIhPScnXSI+Ci0gICAgPGRjOnB1Ymxpc2hlcj4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHVibGlzaGVyIi8+Ci0gICAgPC9kYzpwdWJsaXNoZXI+Ci0gIDwveHNsOnRlbXBsYXRlPiAgCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGM6ZGF0ZVskZGF0ZSE9JyddIj4KLSAgICA8ZGM6ZGF0ZT4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGF0ZSIvPgotICAgIDwvZGM6ZGF0ZT4KLSAgPC94c2w6dGVtcGxhdGU+ICAKLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYzpyaWdodHNbJHJpZ2h0cyE9JyddIj4KLSAgICA8ZGM6cmlnaHRzPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodHMiLz4KLSAgICA8L2RjOnJpZ2h0cz4KLSAgPC94c2w6dGVtcGxhdGU+ICAKLQotICA8IS0tIElkZW50aXR5IHRyYW5zZm9ybWF0aW9uIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnwqIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPiAgCi0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9hdXRob3JpbmcvYXNzZXQtdXBsb2FkLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9hdXRob3JpbmcvYXNzZXQtdXBsb2FkLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMDZhNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYXV0aG9yaW5nL2Fzc2V0LXVwbG9hZC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gICAgeG1sbnM6bGVueWEtaW5mbz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2luZm8vMS4wIgotICAgIHhtbG5zOndmPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvd29ya2Zsb3cvMS4wIgotICAgIHhtbG5zOnJjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcmMvMS4wIgotICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKLSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICAgIHhtbG5zOnVzZWNhc2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS91c2VjYXNlLzEuMCIKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ibGVueWEtaW5mbyB3ZiByYyBkYyB1c2VjYXNlIHBhZ2UgaTE4biIKLSAgICA+Ci0KLTx4c2w6cGFyYW0gbmFtZT0ibGVueWEudXNlY2FzZSIgc2VsZWN0PSInYXNzZXQnIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImxlbnlhLnN0ZXAiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZXJyb3IiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZXh0ZW5zaW9ucyIgc2VsZWN0PSInZG9jIGRvdCBydGYgdHh0IGFzYyBhc2NpaSB4bHMgeGx3IHhsdCBwcHQgcG90IGdpZiBqcGcgcG5nIHRpZiBlcHMgcGN0IG0zdSBrYXIgbWlkIHNtZiBtcDMgc3dhIG1wZyBtcHYgbXA0IG1vdiBiaW4gc2VhIGhxeCBzaXQgemlwIGpteCBqY2wgcXogamJjIGptdCBjZmcgcGRmJyIvPgotCi0gIDx4c2w6cGFyYW0gbmFtZT0iY29udGV4dHByZWZpeCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvbGVueWEtaW5mbzppbmZvIj4KLSAgPHBhZ2U6cGFnZT4KLSAgICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0IGtleT0ibGVueWEuYXNzZXR1cGxvYWQuc3VidGl0bGUiLz48L3BhZ2U6dGl0bGU+Ci0gICAgPHBhZ2U6Ym9keT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGVueWEtaW5mbzphc3NldHMiLz4KLSAgICA8L3BhZ2U6Ym9keT4KLSAgPC9wYWdlOnBhZ2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJsZW55YS1pbmZvOmFzc2V0cyI+Ci0gIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcmUtYm9keSIvPgotICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXBsb2FkLWZvcm0iLz4KLSAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImxpYnJhcnktZm9ybSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotT3ZlcnJpZGUgdGhpcyB0ZW1wbGF0ZSB0byBhZGQgc2NyaXB0cyBldGMuCi0tLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icHJlLWJvZHkiLz4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InVwbG9hZC1mb3JtIj4KLSAgPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLSAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtdGl0bGUiPjxpMThuOnRleHQga2V5PSJsZW55YS5hc3NldHVwbG9hZC5zdWJ0aXRsZSIvPjwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgIDxmb3JtIG5hbWU9ImZpbGVpbnB1dCIgaWQ9ImZpbGVpbnB1dCIgYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25zdWJtaXQ9InJldHVybiBjaGVja191cGxvYWQoZmlsZWlucHV0LCBleHQpIj4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEudXNlY2FzZSIgdmFsdWU9InskbGVueWEudXNlY2FzZX0iLz4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGVueWEuc3RlcCIgdmFsdWU9ImFzc2V0LXVwbG9hZCIvPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0YXNrLWlkIiB2YWx1ZT0iaW5zZXJ0LWFzc2V0Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InVwbG9hZHR5cGUiIHZhbHVlPSJhc3NldCIvPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwcm9wZXJ0aWVzLmFzc2V0LmRhdGUiIHZhbHVlPSJ7L2xlbnlhLWluZm86aW5mby9sZW55YS1pbmZvOmFzc2V0cy9sZW55YS1pbmZvOmRhdGV9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InByb3BlcnRpZXMuaW5zZXJ0LmFzc2V0LmRvY3VtZW50LXV1aWQiIHZhbHVlPSJ7L2xlbnlhLWluZm86aW5mby9sZW55YS1pbmZvOmFzc2V0cy9sZW55YS1pbmZvOmRvY3VtZW50LXV1aWR9Ii8+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InByb3BlcnRpZXMuaW5zZXJ0LmFzc2V0Lmxhbmd1YWdlIiB2YWx1ZT0iey9sZW55YS1pbmZvOmluZm8vbGVueWEtaW5mbzphc3NldHMvbGVueWEtaW5mbzpsYW5ndWFnZX0iLz4KLSAgICAgICAgPHRhYmxlIGNsYXNzPSJsZW55YS10YWJsZS1ub2JvcmRlciI+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkZXJyb3IgPSAndHJ1ZSciPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImxlbnlhLWZvcm0tY2FwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxlbnlhLWZvcm0tbWVzc2FnZS1lcnJvciI+PGkxOG4ga2V5PSJmaWxlbmFtZS1mb3JtYXQtZXhjZXB0aW9uIi8+PC9zcGFuPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWZvcm0tY2FwdGlvbiI+PGkxOG46dGV4dD5TZWxlY3QgRmlsZTwvaTE4bjp0ZXh0Pjo8L3RkPjx0ZD48aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0iZmlsZSIgbmFtZT0icHJvcGVydGllcy5hc3NldC5kYXRhIiAKLSAgICAgICAgICAgICAgICBvbmNoYW5nZT0iaW1hZ2VwcmV2aWV3KHRoaXMpIi8+PGJyLz4oPGkxOG46dGV4dD5ObyB3aGl0ZXNwYWNlLCBubyBzcGVjaWFsIGNoYXJhY3RlcnM8L2kxOG46dGV4dD4pPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj48dGQ+JiMxNjA7PC90ZD48L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZm9ybS1jYXB0aW9uIj48aTE4bjp0ZXh0PlRpdGxlPC9pMThuOnRleHQ+Kjo8L3RkPjx0ZD48aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIgbmFtZT0icHJvcGVydGllcy5hc3NldC50aXRsZSIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWZvcm0tY2FwdGlvbiI+PGkxOG46dGV4dD5DcmVhdG9yPC9pMThuOnRleHQ+OjwvdGQ+PHRkPjxpbnB1dCBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJwcm9wZXJ0aWVzLmFzc2V0LmNyZWF0b3IiIHZhbHVlPSJ7L2xlbnlhLWluZm86aW5mby9sZW55YS1pbmZvOmFzc2V0cy9sZW55YS1pbmZvOmNyZWF0b3J9Ii8+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZm9ybS1jYXB0aW9uIj48aTE4bjp0ZXh0PlJpZ2h0czwvaTE4bjp0ZXh0Pjo8L3RkPjx0ZD48aW5wdXQgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIgbmFtZT0icHJvcGVydGllcy5hc3NldC5yaWdodHMiIHZhbHVlPSJBbGwgcmlnaHRzIHJlc2VydmVkLiIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWZvcm0tY2FwdGlvbiI+PGkxOG46dGV4dD5QcmV2aWV3PC9pMThuOnRleHQ+OjwvdGQ+PHRkPjxpbWcgc3JjPSIiIGlkPSJwcmV2aWV3IiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuOyBoZWlnaHQ6IDEwMHB4OyIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+PHRkPiYjMTYwOzwvdGQ+PC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgaTE4bjphdHRyPSJ2YWx1ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQWRkIiBuYW1lPSJpbnB1dC1hZGQiLz4mIzE2MDsKLSAgICAgICAgICAgICAgPGlucHV0IGkxOG46YXR0cj0idmFsdWUiIHR5cGU9ImJ1dHRvbiIgb25DbGljaz0ibG9jYXRpb24uaHJlZj0namF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTsnOyIgdmFsdWU9IkNhbmNlbCIgbmFtZT0iaW5wdXQtY2FuY2VsIi8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvZGl2PgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJsaWJyYXJ5LWZvcm0iPgotICA8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+PGkxOG46dGV4dD5Bc3NldCBMaWJyYXJ5PC9pMThuOnRleHQ+PC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgPGZvcm0gbmFtZT0iYXNzZXRsaWJyYXJ5IiBpZD0iYXNzZXRsaWJyYXJ5IiBhY3Rpb249IiI+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KGxlbnlhLWluZm86YXNzZXQpIj4KLSAgICAgICAgICAgIDx0cj48dGQgY29sc3Bhbj0iNSIgY2xhc3M9ImxlbnlhLWZvcm0tY2FwdGlvbiI+PGkxOG46dGV4dD5ObyBhc3NldHMgYXZhaWxhYmxlPC9pMThuOnRleHQ+PC90ZD48L3RyPgotICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtZm9ybS1jYXB0aW9uIj48aTE4bjp0ZXh0PlRpdGxlPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+Ci0gICAgICAgICAgICAgIDxpbnB1dCBpZD0iYXNzZXRUaXRsZSIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCIgdHlwZT0idGV4dCIgbmFtZT0icHJvcGVydGllcy5pbnNlcnQuYXNzZXQudGl0bGUiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImFzc2V0U291cmNlIiBuYW1lPSJwcm9wZXJ0aWVzLmFzc2V0LmRhdGEiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImFzc2V0RXh0ZW50IiBuYW1lPSJleHRlbnQiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImxlbnlhLWluZm86YXNzZXQiLz4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQvPgotICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgotICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibGlicmFyeS1idXR0b25zIi8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvZGl2PgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGVueWEtaW5mbzphc3NldCI+Ci0gIDx0cj4KLSAgICA8dGQvPgotICAgIDx0ZD4KLSAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iYXNzZXQiCi0gICAgICAgIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhc3NldFRpdGxlJykudmFsdWUgPSAne2RjOnRpdGxlfSc7Ci0gICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhc3NldFNvdXJjZScpLnZhbHVlID0gJ3tkYzpzb3VyY2V9JzsKLSAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fzc2V0RXh0ZW50JykudmFsdWUgPSAne2RjOmV4dGVudH0nOyIvPgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImRjOmZvcm1hdCA9ICdpbWFnZS9qcGVnJyBvciBkYzpmb3JtYXQgPSAnaW1hZ2UvZ2lmJyBvciAgZGM6Zm9ybWF0ID0gJ2ltYWdlL3BuZyciPgotICAgICAgICAgICAgPGltZyBzcmM9InsuLi9sZW55YS1pbmZvOmRvY3VtZW50bm9kZWlkfS97ZGM6c291cmNlfSIgc3R5bGU9ImhlaWdodDogMzJweDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsiLz4mIzE2MDsKLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkYzp0aXRsZSIvPgotICAgIDwvdGQ+Ci0gICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkYzpleHRlbnQiLz4gS0I8L3RkPgotICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGM6ZGF0ZSIvPjwvdGQ+Ci0gIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImxpYnJhcnktYnV0dG9ucyIvPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYXV0aG9yaW5nL2VkaXQvYWRkU291cmNlVGFncy54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYXV0aG9yaW5nL2VkaXQvYWRkU291cmNlVGFncy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGMwZTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2F1dGhvcmluZy9lZGl0L2FkZFNvdXJjZVRhZ3MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBhZGRTb3VyY2VUYWdzLnhzbCA0MjcwMyAyMDA0LTAzLTEzIDEyOjU3OjUzWiBncmVnb3IgJCAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+DQotDQotPHhzbDpwYXJhbSBuYW1lPSJzb3VyY2UiLz4NCi0NCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4NCi0gIDxvcGVuPg0KLSAgPHNvdXJjZTp3cml0ZSB4bWxuczpzb3VyY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9zb3VyY2UvMS4wIj4NCi0gICAgPHNvdXJjZTpzb3VyY2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzb3VyY2UiLz48L3NvdXJjZTpzb3VyY2U+DQotICAgIDxzb3VyY2U6ZnJhZ21lbnQ+DQotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iLiIvPg0KLSAgICA8L3NvdXJjZTpmcmFnbWVudD4NCi0gIDwvc291cmNlOndyaXRlPg0KLSAgICA8Y29udGVudD4NCi0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIuIi8+DQotICAgIDwvY29udGVudD4NCi0gIDwvb3Blbj4NCi08L3hzbDp0ZW1wbGF0ZT4NCi0NCi08L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9hdXRob3JpbmcvZWRpdC9yZW1vdmVTb3VyY2VUYWdzLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9hdXRob3JpbmcvZWRpdC9yZW1vdmVTb3VyY2VUYWdzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyNjEwYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYXV0aG9yaW5nL2VkaXQvcmVtb3ZlU291cmNlVGFncy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSAkSWQ6IHJlbW92ZVNvdXJjZVRhZ3MueHNsIDQyNzAzIDIwMDQtMDMtMTMgMTI6NTc6NTNaIGdyZWdvciAkIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4NCi0NCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4NCi0gIDx4c2w6Y29weS1vZiBzZWxlY3Q9Ii9vcGVuL2NvbnRlbnQvKiIvPg0KLTwveHNsOnRlbXBsYXRlPg0KLQ0KLTwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2F1dGhvcmluZy9lZGl0L3JlcGxhY2UtcHJlZGVmaW5lZC1lbnRpdGllcy54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYXV0aG9yaW5nL2VkaXQvcmVwbGFjZS1wcmVkZWZpbmVkLWVudGl0aWVzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlNWFiZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvYXV0aG9yaW5nL2VkaXQvcmVwbGFjZS1wcmVkZWZpbmVkLWVudGl0aWVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotPgotCi08eHNsOm91dHB1dCBpbmRlbnQ9Im5vIi8+Ci0KLTwhLS0gRklYTUU6IENEQVRBIGlzIGFsc28gYmVpbmcgbW9kaWZpZWQgYnkgcmVwbGFjZS1wcmVkZWZpbmVkLWVudGl0aWVzLnhzbCwgd2hpY2ggYWN0dWFsbHkgc2hvdWxkbid0IC0tPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSI+Ci0gIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPgotICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iLiIvPgotICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJub2RlKCl8QCoiIHByaW9yaXR5PSItMSI+Ci0gIDx4c2w6Y29weT4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im5vZGUoKXxAKiIvPgotICA8L3hzbDpjb3B5PgotPC94c2w6dGVtcGxhdGU+Ci0KLQotCi0KLTx4c2w6dGVtcGxhdGUgbmFtZT0ic2VhcmNoLWFuZC1yZXBsYWNlIj4KLTx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+Ci0KLTx4c2w6Y2hvb3NlPgotPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCRzdHJpbmcsICcmbHQ7JykiPgotICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VhcmNoLWFuZC1yZXBsYWNlIj48eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHN0cmluZywgJyZsdDsnKSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+JmFtcDtsdDs8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VhcmNoLWFuZC1yZXBsYWNlIj48eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nLCAnJmx0OycpIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KLTwveHNsOndoZW4+Ci08eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHN0cmluZywgJyZndDsnKSI+Ci0gIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkc3RyaW5nLCAnJmd0OycpIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4mYW1wO2d0Ozx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRzdHJpbmcsICcmZ3Q7JykiLz48L3hzbDpjYWxsLXRlbXBsYXRlPgotPC94c2w6d2hlbj4KLTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucygkc3RyaW5nLCAnJmFtcDsnKSI+Ci0gIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWFyY2gtYW5kLXJlcGxhY2UiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkc3RyaW5nLCAnJmFtcDsnKSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+JmFtcDthbXA7PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlYXJjaC1hbmQtcmVwbGFjZSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHN0cmluZywgJyZhbXA7JykiLz48L3hzbDpjYWxsLXRlbXBsYXRlPgotPC94c2w6d2hlbj4KLTwhLS0gRklYTUU6ICZxdW90OyBhbmQgJmFwb3M7IC0tPgotPHhzbDpvdGhlcndpc2U+Ci0gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RyaW5nIi8+Ci08L3hzbDpvdGhlcndpc2U+Ci08L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4gCi0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvY2Zvcm1zL2FkZC14aHRtbC1uYW1lc3BhY2UueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2Nmb3Jtcy9hZGQteGh0bWwtbmFtZXNwYWNlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MDY2Yy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvY2Zvcm1zL2FkZC14aHRtbC1uYW1lc3BhY2UueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IipbbmFtZXNwYWNlLXVyaSgpPScnXSI+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Intsb2NhbC1uYW1lKCl9IiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCl8dGV4dCgpIi8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAgIDwhLS0KLSAgICBXb3JrYXJvdW5kIHRvIHByZXZlbnQgdGhlIHNlcmlhbGl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZXNlCi0gICAgZWxlbWVudHMsIHNpbmNlIGJyb3dzZXJzIGN1cnJlbnRseSBjYW4gbm90IGhhbmRsZSB0aGluZ3MgbGlrZQotICAgICAgPHRleHRhcmVhLz4KLSAgICBUaGUgWEhUTUwgc2VyaWFsaXplciBjdXJyZW50bHkgdXNlZCBieSBMZW55YSBjYW4gbm90IGJlCi0gICAgY29uZmlndXJlZCB0byBhdm9pZCB0aGlzIGNvbGxhcHNpbmc7IGFzIGxvbmcgYXMgdGhhdCBpcyB0aGUgY2FzZQotICAgIHRoaXMgd29ya2Fyb3VuZCBpcyBuZWVkZWQuCi0gICAgLS0+ICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm9kZSgpW2xvY2FsLW5hbWUoKSA9ICd0ZXh0YXJlYScgb3IgbG9jYWwtbmFtZSgpID0gJ3NjcmlwdCcgb3IgbG9jYWwtbmFtZSgpID0gJ3N0eWxlJ10iPgotICAgPHhzbDplbGVtZW50IG5hbWU9Intsb2NhbC1uYW1lKCl9IiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCoiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQkgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguKSA9IDAiPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48L3hzbDppZj4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvY2Zvcm1zL2Zvcm1zLWRvam9hcmVhLXN0eWxpbmcueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2Nmb3Jtcy9mb3Jtcy1kb2pvYXJlYS1zdHlsaW5nLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNTc5OS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvY2Zvcm1zL2Zvcm1zLWRvam9hcmVhLXN0eWxpbmcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHhtbG5zOmZpPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vZm9ybXMvMS4wI2luc3RhbmNlIgotICAgICAgICAgICAgICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJmaSI+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaGVhZCIgbW9kZT0iZm9ybXMtZG9qb2FyZWEiPgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5FZGl0b3IiKTsKLSAgICA8L3NjcmlwdD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYm9keSIgbW9kZT0iZm9ybXMtZG9qb2FyZWEiLz4KLQotICA8IS0tKwotICAgICAgfCBmaTpmaWVsZCB3aXRoIEB0eXBlICdkb2pvYXJlYScKLSAgICAgICstLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZmk6ZmllbGRbZmk6c3R5bGluZ1tAdHlwZT0nZG9qb2FyZWEnXV0iPgotICAgIDx0ZXh0YXJlYSBkb2pvVHlwZT0iRWRpdG9yIiBpZD0ie0BpZH0iIG5hbWU9IntAaWR9IiB0aXRsZT0ie2ZpOmhpbnR9IgotICAgICAgaXRlbXM9ImJvbGQ7aXRhbGljO3VuZGVybGluZTtzdHJpa2V0aHJvdWdoOyI+Ci0gICAgICA8IS0tIHJlbW92ZSBjYXJyaWFnZS1yZXR1cm5zIChvY2N1cnMgb24gY2VydGFpbiB2ZXJzaW9ucyBvZiBJRSBhbmQgZG91YmxlcyBsaW5lYnJlYWtzIGF0IGVhY2ggc3VibWl0KSAtLT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmk6dmFsdWUvbm9kZSgpIiBtb2RlPSJkb2pvYXJlYS1jb3B5Ii8+Ci0gICAgPC90ZXh0YXJlYT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8KiIgbW9kZT0iZG9qb2FyZWEtY29weSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiIG1vZGU9ImRvam9hcmVhLWNvcHkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXh0KCkiIG1vZGU9ImRvam9hcmVhLWNvcHkiPgotICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSguLCAnJiMxMzsnLCAnJykiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvY2Zvcm1zL2Zvcm1zLXNhbXBsZXMtc3R5bGluZy54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvY2Zvcm1zL2Zvcm1zLXNhbXBsZXMtc3R5bGluZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTJhNzIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2Nmb3Jtcy9mb3Jtcy1zYW1wbGVzLXN0eWxpbmcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6Zmk9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9mb3Jtcy8xLjAjaW5zdGFuY2UiPgotCi0gIDwhLS0rIEluY2x1ZGUgc3R5bGluZyBzdHlsZXNoZWV0cywgb25lIGZvciB0aGUgd2lkZ2V0cywgdGhlIG90aGVyIG9uZSBmb3IgdGhlCi0gICAgICB8IHBhZ2UuIEFzICdmb3Jtcy1hZHZhbmNlZC1maWVsZC1zdHlsaW5nLnhzbCcgaXMgYSBzcGVjaWFsaXphdGlvbiBvZgotICAgICAgfCAnZm9ybXMtZmllbGQtc3R5bGluZy54c2wnIHRoZSBsYXR0ZXIgb25lIGlzIGltcG9ydGVkIHRoZXJlLiBJZiB5b3UgZG9uJ3QKLSAgICAgIHwgd2FudCBhZHZhbmNlZCBzdHlsaW5nIG9mIHdpZGdldHMsIGNoYW5nZSBpdCBoZXJlIQotICAgICAgfCBTZWUgeHNsOmluY2x1ZGUgYXMgY29tcG9zaXRpb24gYW5kIHhzbDppbXBvcnQgYXMgZXh0ZW5zaW9uL2luaGVyaXRhbmNlLgotICAgICAgKy0tPgotICA8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2U6Ly9vcmcvYXBhY2hlL2NvY29vbi9mb3Jtcy9yZXNvdXJjZXMvZm9ybXMtcGFnZS1zdHlsaW5nLnhzbCIvPgotICA8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2U6Ly9vcmcvYXBhY2hlL2NvY29vbi9mb3Jtcy9yZXNvdXJjZXMvZm9ybXMtYWR2YW5jZWQtZmllbGQtc3R5bGluZy54c2wiLz4KLSAgPHhzbDppbmNsdWRlIGhyZWY9ImZhbGxiYWNrOi8vbGVueWEveHNsdC9jZm9ybXMvZm9ybXMtZG9qb2FyZWEtc3R5bGluZy54c2wiLz4KLQotICA8IS0tIExvY2F0aW9uIG9mIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5LCB3aGVyZSBKUyBsaWJzIGFuZCBpY29ucyBhcmUgc3RvcmVkIC0tPgotICA8eHNsOnBhcmFtIG5hbWU9InJlc291cmNlcy11cmkiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJoZWFkWy8vZmk6Kl0iPgotICAgIDxoZWFkPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJmb3Jtcy1wYWdlIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImZvcm1zLWZpZWxkIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImZvcm1zLWRvam9hcmVhIi8+Ci0gICAgPC9oZWFkPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJib2R5Wy8vZmk6Kl0iPgotICAgIDxib2R5PgotICAgICAgPCEtLSsgISEhIElmIHRlbXBsYXRlIHdpdGggbW9kZSAnZm9ybXMtcGFnZScgYWRkcyB0ZXh0IG9yIGVsZW1lbnRzCi0gICAgICAgICAgfCAgICAgICAgdGVtcGxhdGUgd2l0aCBtb2RlICdmb3Jtcy1maWVsZCcgY2FuIG5vIGxvbmdlciBhZGQgYXR0cmlidXRlcyEhIQotICAgICAgICAgICstLT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iZm9ybXMtcGFnZSIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJmb3Jtcy1maWVsZCIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwvYm9keT4KLSAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2Nmb3Jtcy9zdHJpcC14aHRtbC1uYW1lc3BhY2UueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2Nmb3Jtcy9zdHJpcC14aHRtbC1uYW1lc3BhY2UueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGZhMzgxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9jZm9ybXMvc3RyaXAteGh0bWwtbmFtZXNwYWNlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDoqIj4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ie2xvY2FsLW5hbWUoKX0iPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCl8dGV4dCgpIi8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9leGNlcHRpb24vZG9jdW1lbnQtZG9lcy1ub3QtZXhpc3QueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2V4Y2VwdGlvbi9kb2N1bWVudC1kb2VzLW5vdC1leGlzdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWNmMDcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2V4Y2VwdGlvbi9kb2N1bWVudC1kb2VzLW5vdC1leGlzdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICA+Ci0gIAotICA8eHNsOmltcG9ydCBocmVmPSIuLi91dGlsL3BhZ2UtdXRpbC54c2wiLz4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0icHViIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iYXJlYSIvPgotICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJyZXF1ZXN0VXJsIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iY29udGV4dFBhdGgiLz4KLSAgCi0gIDx4c2w6dmFyaWFibGUgbmFtZT0ibGFuZ3VhZ2UiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvbWlzc2luZy1sYW5ndWFnZS9jdXJyZW50LWxhbmd1YWdlIi8+PC94c2w6dmFyaWFibGU+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0icHJlZml4IiBzZWxlY3Q9ImNvbmNhdCgkY29udGV4dFBhdGgsICcvJywgJHB1YiwgJy8nLCAkYXJlYSkiLz4KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkb2N1bWVudFVybCIgc2VsZWN0PSJzdWJzdHJpbmcoJHJlcXVlc3RVcmwsIHN0cmluZy1sZW5ndGgoJHByZWZpeCkgKyAxKSIvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgCi0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPgotICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im1pc3NpbmctbGFuZ3VhZ2UvYXZhaWxhYmxlLWxhbmd1YWdlcy9hdmFpbGFibGUtbGFuZ3VhZ2UiPgotICAgICAgICAgICAgICA8aTE4bjp0ZXh0PkRvY3VtZW50IG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgbGFuZ3VhZ2U8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgPGkxOG46dGV4dD5lcnJvci00MDQ8L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwvdGl0bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgPGRpdiBpZD0iYm9keSI+Ci0gICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibWlzc2luZy1sYW5ndWFnZS9hdmFpbGFibGUtbGFuZ3VhZ2VzL2F2YWlsYWJsZS1sYW5ndWFnZSI+Ci0gICAgICAgICAgICAgIDxoMT4KLSAgICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0IGkxOG46a2V5PSJlcnJvci1taXNzaW5nLWxhbmd1YWdlIiAvPgotICAgICAgICAgICAgICAgICAgPGkxOG46cGFyYW0+Jzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGFuZ3VhZ2UiLz4nPC9pMThuOnBhcmFtPgotICAgICAgICAgICAgICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgIDwvaDE+Ci0gICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQgaTE4bjprZXk9ImVycm9yLW1pc3NpbmctbGFuZ3VhZ2UiIC8+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT4nPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsYW5ndWFnZSIvPic8L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PlRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzIGFyZSBhdmFpbGFibGU6PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWlzc2luZy1sYW5ndWFnZS9hdmFpbGFibGUtbGFuZ3VhZ2VzL2F2YWlsYWJsZS1sYW5ndWFnZSIvPgotICAgICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8aDE+PGkxOG46dGV4dD5lcnJvci1kb2N1bWVudC1leGlzdGFuY2Utc2hvcnQ8L2kxOG46dGV4dD48L2gxPgotICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICA8aTE4bjp0cmFuc2xhdGU+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0IGkxOG46a2V5PSJlcnJvci1kb2N1bWVudC1leGlzdGFuY2UiIC8+Ci0gICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT4nPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb2N1bWVudFVybCIvPic8L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhcmVhID0gJ2F1dGhvcmluZyciPgotICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iP2xlbnlhLnVzZWNhc2U9c2l0ZW1hbmFnZW1lbnQuY3JlYXRlJmFtcDtwYXRoPXskcGF0aH0iPjxpMThuOnRleHQ+Y3JlYXRlLWRvY3VtZW50PC9pMThuOnRleHQ+PC9hPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+Y29uZmlndXJlLWNvbnRlbnQtcmVwb3NpdG9yeTwvaTE4bjp0ZXh0PgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L2Rpdj4KLSAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYXZhaWxhYmxlLWxhbmd1YWdlcy9hdmFpbGFibGUtbGFuZ3VhZ2UiPgotICAgIDxsaT4KLSAgICAgIDxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ1cmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Imxhbmd1YWdlIi8+PC9hPgotICAgIDwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvZXhjZXB0aW9uL2ZvcmJpZGRlbi54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvZXhjZXB0aW9uL2ZvcmJpZGRlbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMGE4Y2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2V4Y2VwdGlvbi9mb3JiaWRkZW4ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6cGFnZT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL2Ntcy1wYWdlLzEuMCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIiAgICAKLSAgPgotICAKLSAgPHhzbDpwYXJhbSBuYW1lPSJkb2N1bWVudGlkIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iZG9jdW1lbnR1cmwiLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICAKLSAgICA8cGFnZTpwYWdlPgotICAgICAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5mb3JiaWRkZW4tNDAxPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICAgICAgPHBhZ2U6Ym9keT4KLQk8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotCSAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj48aTE4bjp0ZXh0PmVycm9yLWRvY3VtZW50LWZvcmJpZGRlbi1zaG9ydDwvaTE4bjp0ZXh0PjwvZGl2PgotCSAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotCSAgICA8cD4KLSAgICAgIDxpMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgPGkxOG46dGV4dCBpMThuOmtleT0iZXJyb3ItZG9jdW1lbnQtZm9yYmlkZGVuIiAvPgotICAgICAgICA8aTE4bjpwYXJhbT4nPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb2N1bWVudHVybCIvPic8L2kxOG46cGFyYW0+Ci0gICAgICAgIDxpMThuOnBhcmFtPic8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRvY3VtZW50aWQiLz4nPC9pMThuOnBhcmFtPgotICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLQkgICAgPC9wPgotCSAgPC9kaXY+Ci0JPC9kaXY+Ci0gICAgICA8L3BhZ2U6Ym9keT4KLSAgICA8L3BhZ2U6cGFnZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9leGNlcHRpb24vZ2VuZXJpYy54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvZXhjZXB0aW9uL2dlbmVyaWMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmVhNjI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9leGNlcHRpb24vZ2VuZXJpYy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zOmVycm9yPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vZXJyb3IvMi4xIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIj4KLSAgCi0gIDx4c2w6aW1wb3J0IGhyZWY9ImZhbGxiYWNrOi8vbGVueWEveHNsdC91dGlsL3BhZ2UtdXRpbC54c2wiLz4KLSAgPHhzbDppbXBvcnQgaHJlZj0iZmFsbGJhY2s6Ly9sZW55YS94c2x0L3V0aWwvdG9nZ2xlLnhzbCIvPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVycm9yOm5vdGlmeSI+Ci0gICAgCi0gICAgPHBhZ2U6cGFnZT4KLSAgICAgIDxwYWdlOnRpdGxlPkFwYWNoZSBMZW55YTogPGkxOG46dGV4dCBpMThuOmtleT0iZXJyb3ItZ2VuZXJpYyIgLz48L3BhZ2U6dGl0bGU+Ci0gICAgICA8cGFnZTpoZWFkPgotICAgICAgICA8c3R5bGU+Ci0gICAgICAgICAgaDEgeyBjb2xvcjogIzMzNjY5OTsgdGV4dC1hbGlnbjogbGVmdDsgbWFyZ2luOiAwcHggMHB4IDMwcHggMHB4OyBwYWRkaW5nOiAwcHg7IGJvcmRlci13aWR0aDogMHB4IDBweCAxcHggMHB4OyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItY29sb3I6ICMzMzY2OTk7fQotICAgICAgICAgIHAubWVzc2FnZSB7IHBhZGRpbmc6IDEwcHggMzBweCAxMHB4IDMwcHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDEzMCU7IGJvcmRlci13aWR0aDogMXB4OyBib3JkZXItc3R5bGU6IGRhc2hlZDsgYm9yZGVyLWNvbG9yOiAjMzM2Njk5OyB9Ci0gICAgICAgICAgcC5kZXNjcmlwdGlvbiB7IHBhZGRpbmc6IDEwcHggMzBweCAyMHB4IDMwcHg7IGJvcmRlci13aWR0aDogMHB4IDBweCAxcHggMHB4OyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItY29sb3I6ICMzMzY2OTk7fQotICAgICAgICAgIHAudG9wcGVkIHsgcGFkZGluZy10b3A6IDEwcHg7IGJvcmRlci13aWR0aDogMXB4IDBweCAwcHggMHB4OyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItY29sb3I6ICMzMzY2OTk7IH0KLSAgICAgICAgICBwcmUgeyBmb250LXNpemU6IDEyMCU7IH0KLSAgICAgICAgICBzcGFuLmRlc2NyaXB0aW9uIHsgY29sb3I6ICMzMzY2OTk7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gICAgICAgICAgc3Bhbi5zd2l0Y2ggeyBjdXJzb3I6IHBvaW50ZXI7IG1hcmdpbi1sZWZ0OiA1cHg7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0gICAgICAgIDwvc3R5bGU+Ci0gICAgICA8L3BhZ2U6aGVhZD4KLSAgICAgIDxwYWdlOmJvZHk+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib25sb2FkIi8+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0b2dnbGUtc2NyaXB0Ii8+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj48aTE4bjp0ZXh0IGkxOG46a2V5PSJlcnJvci1nZW5lcmljIiAvPjwvZGl2PgotICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJlcnJvcjptZXNzYWdlIi8+Ci0gICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXJyb3I6ZGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlcnJvcjpleHRyYSIvPgotICAgICAgICAgIDwvZGl2PgotICAgICAgICA8L2Rpdj4KLSAgICAgIDwvcGFnZTpib2R5PgotICAgIDwvcGFnZTpwYWdlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJlcnJvcjpleHRyYSI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhAZXJyb3I6ZGVzY3JpcHRpb24sJ3N0YWNrdHJhY2UnKSI+Ci0gICAgICA8cCBjbGFzcz0ic3RhY2t0cmFjZSI+Ci0gICAgICAgPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGVycm9yOmRlc2NyaXB0aW9uIi8+PC9zcGFuPgotICAgICAgIDxzcGFuIGNsYXNzPSJzd2l0Y2giIGlkPSJ7QGVycm9yOmRlc2NyaXB0aW9ufS1zd2l0Y2giIG9uY2xpY2s9InRvZ2dsZSgne0BlcnJvcjpkZXNjcmlwdGlvbn0nKSI+WzxpMThuOnRleHQgaTE4bjprZXk9ImhpZGUiIC8+XTwvc3Bhbj4KLSAgICAgICA8cHJlIGlkPSJ7QGVycm9yOmRlc2NyaXB0aW9ufSI+Ci0gICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKC4sJyYjMTM7JywnJykiLz4KLSAgICAgICA8L3ByZT4KLSAgICAgIDwvcD4KLSAgICAgPC94c2w6d2hlbj4KLSAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICA8cCBjbGFzcz0iZXh0cmEiPgotICAgICAgIDxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlcnJvcjpkZXNjcmlwdGlvbiIvPjomIzE2MDs8L3NwYW4+Ci0gICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgIDwvcD4KLSAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3I6bm90aWZ5IiBtb2RlPSJvbmxvYWQiPgotICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZXJyb3I6ZXh0cmFbY29udGFpbnMoQGVycm9yOmRlc2NyaXB0aW9uLCdzdGFja3RyYWNlJyldIj4KLSAgICAgICAgPHhzbDp0ZXh0PnRvZ2dsZSgnPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlcnJvcjpkZXNjcmlwdGlvbiIvPgotICAgICAgICA8eHNsOnRleHQ+Jyk7PC94c2w6dGV4dD4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9leGNlcHRpb24vbm90LXB1Ymxpc2hlZC15ZXQueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2V4Y2VwdGlvbi9ub3QtcHVibGlzaGVkLXlldC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjYzNDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L2V4Y2VwdGlvbi9ub3QtcHVibGlzaGVkLXlldC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDx4c2w6aW1wb3J0IGhyZWY9Ii4uL3V0aWwvcGFnZS11dGlsLnhzbCIvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgCi0gICAgPHBhZ2U6cGFnZT4KLSAgICAgIDxwYWdlOnRpdGxlPjxpMThuOnRleHQ+UGFnZSBub3QgcHVibGlzaGVkIHlldDwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgICAgIDxwYWdlOmJvZHk+Ci0JPGRpdiBjbGFzcz0ibGVueWEtYm94Ij4KLQkgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC10aXRsZSI+PGkxOG46dGV4dD5QYWdlIG5vdCBwdWJsaXNoZWQgeWV0PC9pMThuOnRleHQ+PC9kaXY+Ci0JICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0JICAgIDxwPgotCSAgICAgIDxpMThuOnRleHQ+QW4gZXJyb3Igb2NjdXJlZC4gTW9zdCBsaWtlbHkgeW91IGFyZSB0cnlpbmcgYWNjZXNzIGEKLQkgICAgICBwYWdlIHdoaWNoIGhhcyBub3QgYmVlbiBwdWJsaXNoZWQgeWV0LjwvaTE4bjp0ZXh0PjwvcD4KLQkgICAgICAKLQkgICAgPHA+PGkxOG46dGV4dD5UbyBwdWJsaXNoIHRoaXMgcGFnZSBjbGljayBvbiB0aGUgPHN0cm9uZz5GaWxlPC9zdHJvbmc+IG1lbnUKLQkgICAgICB3aXRoaW4gdGhlIEF1dGhvcmluZyBhcmVhIGFuZCB0aGVuIGNsaWNrIG9uIHRoZQotCSAgICAgIDxzdHJvbmc+UHVibGlzaDwvc3Ryb25nPiBtZW51IGl0ZW0uPC9pMThuOnRleHQ+PC9wPgotCSAgPC9kaXY+Ci0JPC9kaXY+Ci0gICAgICA8L3BhZ2U6Ym9keT4KLSAgICA8L3BhZ2U6cGFnZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9leGNlcHRpb24vcGFyZW50LW5vZGUtbm90LWZvdW5kLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9leGNlcHRpb24vcGFyZW50LW5vZGUtbm90LWZvdW5kLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmMGVmNS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvZXhjZXB0aW9uL3BhcmVudC1ub2RlLW5vdC1mb3VuZC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gID4KLSAgCi0gIDx4c2w6aW1wb3J0IGhyZWY9Ii4uL3V0aWwvcGFnZS11dGlsLnhzbCIvPgotICAKLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXBhcmF0b3IiIHNlbGVjdD0iJywnIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICAKLSAgICA8cGFnZTpwYWdlPgotICAgICAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5QYXJlbnQgZG9jdW1lbnQgbm90IGZvdW5kPC9pMThuOnRleHQ+PC9wYWdlOnRpdGxlPgotICAgICAgPHBhZ2U6Ym9keT4KLQk8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotCSAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj48aTE4bjp0ZXh0PkVycm9yIHdoaWxlIHB1Ymxpc2hpbmc8L2kxOG46dGV4dD48L2Rpdj4KLQkgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLQkgICAgPHA+Ci0JICAgICAgPGkxOG46dGV4dD5BbiBlcnJvciBvY2N1cmVkIHdoaWxlIHB1Ymxpc2hpbmcuIE1vc3QgbGlrZWx5IHlvdSBhcmUgdHJ5aW5nCi0JICAgICAgdG8gcHVibGlzaCBhIGRvY3VtZW50IHdob3NlIHBhcmVudCBkb2N1bWVudCBoYXNuJ3QgYmVlbgotCSAgICAgIHB1Ymxpc2hlZCB5ZXQuPC9pMThuOnRleHQ+PC9wPgotCSAgICA8cD48aTE4bjp0ZXh0PlRyeSB0byBwdWJsaXNoIHRoZSBwYXJlbnQgZG9jdW1lbnQgZmlyc3QuPC9pMThuOnRleHQ+PC9wPgotCSAgPC9kaXY+Ci0JPC9kaXY+Ci0gICAgICA8L3BhZ2U6Ym9keT4KLSAgICA8L3BhZ2U6cGFnZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9tZW51L2ZpbHRlci1tZW51LnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9tZW51L2ZpbHRlci1tZW51LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyZmIxNC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbWVudS9maWx0ZXItbWVudS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotICBSZW1vdmVzIGJsb2NrcyBhbmQgaXRlbXMgd2hpY2ggd2lsbCBub3QgYmUgZGlzcGxheWVkIGluIHRoZSBjdXJyZW50IHZpZXcuCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB4bWxuczptZW51PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiPgotCi0gIDx4c2w6cGFyYW0gbmFtZT0idGFiR3JvdXAiLz4KLQotICA8eHNsOnZhcmlhYmxlIG5hbWU9ImN1cnJlbnRUYWIiPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0YWJHcm91cCAhPSAnJyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YWJHcm91cCIvPjwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT5hdXRob3Jpbmc8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp2YXJpYWJsZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6YmxvY2siPgotICAgIDx4c2w6aWYgdGVzdD0ibm90KEBhcmVhcykgb3IgY29udGFpbnMoQGFyZWFzLCAkY3VycmVudFRhYikiPgotICAgICAgPHhzbDpjb3B5PgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgPC94c2w6Y29weT4KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L21lbnUvbWVudTJ4aHRtbC54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbWVudS9tZW51MnhodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0ZDNhZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbWVudS9tZW51MnhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICB4bWxuczp1Yz0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3VzZWNhc2UvMS4wIgotICB4bWxuczptZW51PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICA+Ci0gIAotPHhzbDpwYXJhbSBuYW1lPSJjb250ZXh0cHJlZml4Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InVzZWNhc2UiLz4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0icG9zaXRpb24iPjwveHNsOnBhcmFtPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9tZW51Om1lbnUiPgotICAgIDx1bCBpZD0ibWVudXskcG9zaXRpb259Ij4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWVudTptZW51cy9tZW51Om1lbnUvbWVudTpibG9jayIvPgotICAgIDwvdWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZW51OmJsb2NrIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1lbnU6dGl0bGUiLz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1lbnU6bWVudSB8IG1lbnU6aXRlbSIvPgotCQkKLSAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgIT0gbGFzdCgpIj4KLSAgICAgIDxsaSBjbGFzcz0ibGVueWEtbWVudS1zZXBhcmF0b3IiPjwvbGk+Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6dGl0bGUiPgotICAgIDxsaSBjbGFzcz0ibGVueWEtbWVudS10aXRsZSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im5vZGUoKSIvPgotICAgIDwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iY2hlY2tJdGVtIj4KLSAgICA8eHNsOmlmIHRlc3Q9IkBjaGVja2VkIj4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2UiPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGNoZWNrZWQgPSAndHJ1ZSciPgotICAgICAgICAgICAgPHhzbDp0ZXh0PmNoZWNrZWQucG5nPC94c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAY2hlY2tlZCA9ICdmYWxzZSciPgotICAgICAgICAgICAgPHhzbDp0ZXh0PnVuY2hlY2tlZC5wbmc8L3hzbDp0ZXh0PgotICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3R5bGUiPgotICAgICAgICA8eHNsOnRleHQ+YmFja2dyb3VuZDogdXJsKCc8L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRleHRwcmVmaXgiLz48eHNsOnRleHQ+L2xlbnlhL21lbnUvaW1hZ2VzLzwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2UiLz4KLSAgICAgICAgPHhzbDp0ZXh0PicpIGxlZnQgMnB4IG5vLXJlcGVhdDs8L3hzbDp0ZXh0PgotICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgIDwveHNsOmlmPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAkKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudTppdGVtIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaHJlZiI+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2hlY2tJdGVtIi8+Ci0gICAgICAgICAgPGE+Ci0gICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiLz4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCpbbG9jYWwtbmFtZSgpICE9ICdocmVmJ10iLz4KLSAgICAgICAgICAgIDx4c2w6dGV4dC8+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjdXJyZW50VGFiID0gJ3NpdGUnIj4KLSAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKEBocmVmLCAnPycpIj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4mYW1wOzwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4/PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgIDxzcGFuPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaTE4bjoqfHRleHQoKSIvPjwvc3Bhbj4KLSAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgIDxsaSBjbGFzcz0iZGlzYWJsZWQiPgotICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjaGVja0l0ZW0iLz4KLSAgICAgICAgICA8YT4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZW51Om1lc3NhZ2UiPgotICAgICAgICAgICAgICA8eHNsOmNvcHk+Ci0gICAgICAgICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWVudTpwYXJhbWV0ZXIiPgotICAgICAgICAgICAgICAgICAgICA8aTE4bjpwYXJhbT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9ybWFsaXplLXNwYWNlKHRleHQoKSkiLz48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICA8L2kxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICA8L3hzbDpjb3B5PgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8c3Bhbj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImkxOG46Knx0ZXh0KCkiLz48L3NwYW4+Ci0gICAgICAgICAgPC9hPgotICAgICAgICA8L2xpPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudTppdGVtL3RleHQoKSI+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vcm1hbGl6ZS1zcGFjZSguKSIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZW51Oml0ZW0vaTE4bjoqIj4KLSAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIuIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6aXRlbS9AdWM6dXNlY2FzZSI+Ci0gICAgPHhzbDp0ZXh0Lz4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyguLi9AaHJlZiwgJz8nKSI+JmFtcDs8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+PzwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPHhzbDp0ZXh0Lz5sZW55YS51c2VjYXNlPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub3JtYWxpemUtc3BhY2UoLikiLz48eHNsOnRleHQvPgotICAgIDx4c2w6aWYgdGVzdD0iJHVzZWNhc2UgIT0gJyciPgotICAgICAgPHhzbDp0ZXh0PiZhbXA7bGVueWEuZXhpdFVzZWNhc2U9PC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzZWNhc2UiLz48eHNsOnRleHQvPgotICAgIDwveHNsOmlmPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6aXRlbS9AdWM6c3RlcCI+Ci0gICAgPHhzbDp0ZXh0Lz4mYW1wO2xlbnlhLnN0ZXA9PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vcm1hbGl6ZS1zcGFjZSguKSIvPjx4c2w6dGV4dC8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudTppdGVtL0AqW25vdChuYW1lc3BhY2UtdXJpKCkgPSAnaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3VzZWNhc2UvMS4wJyldIj48eHNsOmNvcHktb2Ygc2VsZWN0PSIuIi8+PC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbWVudS9tZW51MnhzbHQueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L21lbnUvbWVudTJ4c2x0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkOWFlNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbWVudS9tZW51MnhzbHQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgeG1sbnM6eHNvPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEveHNsdC8xLjAiCi0gIHhtbG5zOm1lbnU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLSAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9Im1lbnUiCi0gID4KLSAgCi0gIDx4c2w6cGFyYW0gbmFtZT0iY29udGV4dHByZWZpeCIvPgotICA8eHNsOnBhcmFtIG5hbWU9InB1YmxpY2F0aW9uaWQiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJhcmVhIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iZG9jdW1lbnR1cmwiLz4KLSAgCi0gIDx4c2w6bmFtZXNwYWNlLWFsaWFzIHN0eWxlc2hlZXQtcHJlZml4PSJ4c28iIHJlc3VsdC1wcmVmaXg9InhzbCIvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgCi0gICAgPHhzbzpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhodG1sIj4KLSAgICAgIAotICAgICAgPHhzbzpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+Ci0gICAgICAKLSAgICAgIDx4c2w6aWYgdGVzdD0iJGFyZWEgIT0gJ2xpdmUnIj4KLSAgICAgICAgCi0gICAgICAgIDx4c286dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgICAgICAgIDxodG1sPgotICAgICAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICAgIDx4c286Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0aXRsZSIvPgotICAgICAgICAgICAgICA8c2NyaXB0IHNyYz0ieyRjb250ZXh0cHJlZml4fS9sZW55YS9tZW51L21lbnUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+JiMxNjA7PC9zY3JpcHQ+Ci0gICAgICAgICAgICAgIDxsaW5rIGhyZWY9InskY29udGV4dHByZWZpeH0vbGVueWEvY3NzL21lbnUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+Ci0gICAgICAgICAgICAgIDxsaW5rIHJlbD0iaWNvbiIgaHJlZj0ieyRjb250ZXh0cHJlZml4fS9mYXZpY29uLmljbyIgdHlwZT0iaW1hZ2UvaWNvIi8+Ci0gICAgICAgICAgICAgIDx4c286YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6aHRtbC94aHRtbDpoZWFkLypbbG9jYWwtbmFtZSgpICE9ICd0aXRsZSddIi8+Ci0gICAgICAgICAgICAgICA8IS0tIGludGVybmV0IGV4cGxvcmVyIDYgc3dpdGNoZXMgdG8gcXVpcmtzIG1vZGUgd2l0aCB0aGUgeG1sIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgdGhlIHF1aXJrcyBsYXlvdXQgaW5jb25zaXN0ZW5jaWVzIGFyZSBmaXhlZCBpbiBhIGllNiBvbmx5IHN0eWxlc2hlZXQgLS0+Ci0gICAgICAgICAgICAgIDx4c286dmFyaWFibGUgbmFtZT0iY29udGV4dHByZWZpeCI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250ZXh0cHJlZml4Ii8+Ci0gICAgICAgICAgICAgIDwveHNvOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNvOmNvbW1lbnQ+W2lmIElFIDZdPCFbQ0RBVEFbPl1dPiZsdDtsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ijx4c286dmFsdWUtb2Ygc2VsZWN0PSIkY29udGV4dHByZWZpeCIvPi9sZW55YS9jc3MvaWU2aGFja3Nvbmx5LmNzcyIgLz48IVtDREFUQVs8IVtlbmRpZl1dXT48L3hzbzpjb21tZW50PgotICAgICAgICAgICAgPC9oZWFkPgotICAgICAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICAgIDx4c286YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6aHRtbC94aHRtbDpib2R5L0AqIi8+Ci0gICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6ZGl2L3hodG1sOmRpdltAaWQgPSAnbGVueWEtbG9nbyddIi8+Ci0gICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ieGh0bWw6ZGl2L3hodG1sOmRpdltAaWQgPSAnbGVueWEtbWVudXMnXSIvPgotICAgICAgICAgICAgICA8ZGl2IGlkPSJsZW55YS1jbXNib2R5Ij4KLSAgICAgICAgICAgICAgICA8eHNvOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOmh0bWwveGh0bWw6Ym9keS9ub2RlKCkiLz4KLSAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4gaW5pdGlhbGl6ZSgpOyA8L3NjcmlwdD4KLSAgICAgICAgICAgIDwvYm9keT4KLSAgICAgICAgICA8L2h0bWw+Ci0gICAgICAgIDwveHNvOnRlbXBsYXRlPgotICAgICAgICAKLSAgICAgICAgPHhzbzp0ZW1wbGF0ZSBuYW1lPSJ0aXRsZSI+Ci0gICAgICAgICAgPHRpdGxlPgotICAgICAgICAgICAgQXBhY2hlIExlbnlhIHwKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHVibGljYXRpb25pZCIvPiB8Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFyZWEiLz4gfAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb2N1bWVudHVybCIvPiB8Ci0gICAgICAgICAgICA8eHNvOnZhbHVlLW9mIHNlbGVjdD0ieGh0bWw6aHRtbC94aHRtbDpoZWFkL3hodG1sOnRpdGxlIi8+Ci0gICAgICAgICAgPC90aXRsZT4KLSAgICAgICAgPC94c286dGVtcGxhdGU+Ci0gICAgICAgIAotICAgICAgPC94c2w6aWY+Ci0gICAgICAKLSAgICAgIDx4c286dGVtcGxhdGUgbWF0Y2g9InhodG1sOnNjcmlwdCI+Ci0gICAgICAgIDx4c286Y29weT4KLSAgICAgICAgICA8eHNvOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgICAgIDx4c286aWYgdGVzdD0ibm90KC4vL3RleHQoKSkiPjx4c286dGV4dD4mIzE2MDs8L3hzbzp0ZXh0PjwveHNvOmlmPgotICAgICAgICA8L3hzbzpjb3B5PgotICAgICAgPC94c286dGVtcGxhdGU+Ci0gICAgICAKLSAgICAgIDx4c286dGVtcGxhdGUgbWF0Y2g9InhodG1sOioiPgotICAgICAgICA8eHNvOmVsZW1lbnQgbmFtZT0ie3N0cmluZygne2xvY2FsLW5hbWUoKX0nKX0iPgotICAgICAgICAgIDx4c286YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgICAgIDwveHNvOmVsZW1lbnQ+Ci0gICAgICA8L3hzbzp0ZW1wbGF0ZT4KLSAgICAgIAotICAgICAgCi0gICAgICA8eHNvOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICAgICAgICA8eHNvOmNvcHk+Ci0gICAgICAgICAgPHhzbzphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICAgICAgPC94c286Y29weT4KLSAgICAgIDwveHNvOnRlbXBsYXRlPgotICAgICAgCi0gICAgPC94c286c3R5bGVzaGVldD4KLSAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6KiI+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Intsb2NhbC1uYW1lKCl9Ij4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPCEtLSBhZGQgb25seSBmaXJzdCBtZXNzYWdlIGFzIHRpdGxlIGF0dHJpYnV0ZSAtLT4gCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6bWVzc2FnZVtwcmVjZWRpbmctc2libGluZzo6bWVudTptZXNzYWdlXSIvPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudTptZXNzYWdlIj4KLSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L21lbnUvbWVudWJhcjJ4aHRtbC54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbWVudS9tZW51YmFyMnhodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2MzgxNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbWVudS9tZW51YmFyMnhodG1sLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IG1lbnUyeGh0bWwueHNsIDU2ODYzNiAyMDA3LTA4LTIyIDE0OjU0OjQwWiBhbmRyZWFzICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zOnVjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvdXNlY2FzZS8xLjAiCi0gIHhtbG5zOm1lbnU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gID4KLQotICA8eHNsOmltcG9ydCBocmVmPSJtZW51MnhodG1sLnhzbCIvPgotICAgICAgCi08eHNsOnBhcmFtIG5hbWU9ImNvbnRleHRwcmVmaXgiLz4KLTx4c2w6cGFyYW0gbmFtZT0icHVibGljYXRpb25pZCIvPgotPHhzbDpwYXJhbSBuYW1lPSJhcmVhIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImRvY3VtZW50dXJsIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImRvY3VtZW50aWQiLz4KLTx4c2w6cGFyYW0gbmFtZT0idXNlcmlkIi8+Ci08eHNsOnBhcmFtIG5hbWU9InNlcnZlcnRpbWUiLz4KLTx4c2w6cGFyYW0gbmFtZT0id29ya2Zsb3dzdGF0ZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJpc2xpdmUiLz4KLTx4c2w6cGFyYW0gbmFtZT0idXNlY2FzZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0YWJHcm91cCIvPgotPHhzbDpwYXJhbSBuYW1lPSJuZXdNZXNzYWdlcyIvPgotICAKLTx4c2w6dmFyaWFibGUgbmFtZT0iY3VycmVudFRhYiI+Ci0gIDx4c2w6Y2hvb3NlPgotICAgIDx4c2w6d2hlbiB0ZXN0PSIkdGFiR3JvdXAgIT0gJyciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFiR3JvdXAiLz48L3hzbDp3aGVuPgotICAgIDx4c2w6b3RoZXJ3aXNlPmF1dGhvcmluZzwveHNsOm90aGVyd2lzZT4KLSAgPC94c2w6Y2hvb3NlPgotPC94c2w6dmFyaWFibGU+Ci0KLTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2UtcHJlZml4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRleHRwcmVmaXgiLz4vbGVueWEvbWVudS9pbWFnZXM8L3hzbDp2YXJpYWJsZT4KLSAKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9tZW51Om1lbnUiPgotICAKLSAgPGRpdj4KLSAgICAKLSAgPCEtLSBMZW55YSBncmFwaGljIC0tPgotICA8ZGl2IGlkPSJsZW55YS1sb2dvIj4KLSAgICA8aW1nIHNyYz0ieyRpbWFnZS1wcmVmaXh9L2xlbnlhLWxvZ28uZ2lmIiBhbHQ9IkxlbnlhIiAvPgotICA8L2Rpdj4KLQotICA8ZGl2IGlkPSJsZW55YS1tZW51cyI+Ci0KLSAgICA8IS0tIFRoZSBtYWluIHRhYnMgZm9yIHRoZSBkaWZmZXJlbnQgYXJlYXMgb2YgTGVueWEgLS0+Ci0gICAgPGRpdiBpZD0ibGVueWEtYXJlYXMiPgotICAgICAgPHVsPgotICAgICAgICAKLSAgICAgICAgPCEtLSBBRE1JTiBUQUIgLS0+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KG1lbnU6dGFicy9tZW51OnRhYltAbGFiZWwgPSAnYWRtaW4nXS9Ac2hvdyA9ICdmYWxzZScpIj4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXJlYS10YWIiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRhYi1hcmVhIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFyZWEiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRhYk5hbWUiPmFkbWluPC94c2w6d2l0aC1wYXJhbT4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJxdWVyeVN0cmluZyI+P2xlbnlhLnVzZWNhc2U9YWRtaW4udXNlcnM8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIAotICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChtZW51OnRhYnMvbWVudTp0YWJbQGxhYmVsID0gJ2luZm8nXS9Ac2hvdyA9ICdmYWxzZScpIj4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXJlYS10YWIiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRhYi1hcmVhIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFyZWEiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InF1ZXJ5U3RyaW5nIj4/bGVueWEudXNlY2FzZT10YWIub3ZlcnZpZXc8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRhYk5hbWUiPnNpdGU8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIAotICAgICAgICA8IS0tIEFVVEhPUklORyBUQUIgLS0+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcmVhLXRhYiI+Ci0gICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRhYi1hcmVhIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFyZWEiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0YWJOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFyZWEiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICAgIAotICAgICAgICA8IS0tIFNUQUdJTkcgVEFCIC0tPgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im1lbnU6dGFicy9tZW51OnRhYltAbGFiZWwgPSAnc3RhZ2luZyddL0BzaG93ID0gJ3RydWUnIj4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXJlYS10YWIiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRhYi1hcmVhIj5zdGFnaW5nPC94c2w6d2l0aC1wYXJhbT4KLSAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAKLSAgICAgICAgPCEtLSBMSVZFIFRBQiAtLT4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QobWVudTp0YWJzL21lbnU6dGFiW0BsYWJlbCA9ICdsaXZlJ10vQHNob3cgPSAnZmFsc2UnKSI+Ci0gICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFyZWEtdGFiIj4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0YWItYXJlYSI+bGl2ZTwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGFyZ2V0Ij5fYmxhbms8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRhYk5hbWUiPmxpdmU8L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIAotICAgICAgPC91bD4KLSAgICA8L2Rpdj4KLSAKLSAgICA8IS0tIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlICBvZiB0aGUgcGFnZSwgZXRjLiAtLT4KLSAgICA8ZGl2IGlkPSJsZW55YS1pbmZvIj4KLSAgICAgIDx1bD4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkd29ya2Zsb3dzdGF0ZSAhPSAnJyI+Ci0gICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtmbG93Ii8+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8bGkgaWQ9ImluZm8tdXNlciI+PGkxOG46dGV4dD5Vc2VyPC9pMThuOnRleHQ+OiA8c3BhbiBpZD0ibG9nZ2VkLXVzZXIiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNlcmlkIi8+PC9zcGFuPjwvbGk+Ci0gICAgICAgIDxsaSBpZD0iaW5mby1tZXNzYWdlcyI+Ci0gICAgICAgICAgPGEgaHJlZj0iP2xlbnlhLnVzZWNhc2U9bm90aWZpY2F0aW9uLmluYm94Ij4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5ld01lc3NhZ2VzID0gJzAnIj4KLSAgICAgICAgICAgICAgICA8aTE4bjp0ZXh0PkluYm94PC9pMThuOnRleHQ+Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmV3TWVzc2FnZXMgPSAnMSciPgotICAgICAgICAgICAgICAgIDxpMThuOnRleHQ+dW5yZWFkLW1lc3NhZ2U8L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgICAgICAgICAgICAgPGkxOG46dGV4dD51bnJlYWQtbWVzc2FnZXM8L2kxOG46dGV4dD4KLSAgICAgICAgICAgICAgICAgIDxpMThuOnBhcmFtPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmV3TWVzc2FnZXMiLz48L2kxOG46cGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9pMThuOnRyYW5zbGF0ZT4KLSAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgIDwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpIGlkPSJpbmZvLXRpbWUiPjxpMThuOnRleHQ+U2VydmVyIFRpbWU8L2kxOG46dGV4dD46IDxzcGFuIGlkPSJzZXJ2ZXItdGltZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2ZXJ0aW1lIi8+PC9zcGFuPjwvbGk+Ci0gICAgICA8L3VsPgotICAgIDwvZGl2PgotCi0gICAgPCEtLSBkcm9wIGRvd24gbWVudXMgZm9yIGFyZWEgb3B0aW9ucyAtLT4KLSAgICA8ZGl2IGlkPSJsZW55YS1vcHRpb25zIj4KLSAgICAgIDx1bD4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtZW51Om1lbnVzL21lbnU6bWVudSIgbW9kZT0ibmF2Ii8+Ci0gICAgICA8L3VsPgotICAgIDwvZGl2PgotICAgIAotICA8L2Rpdj4KLQotICA8L2Rpdj4KLQotPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhcmVhLXRhYiI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ0YWItYXJlYSIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idGFiLWFyZWEtcHJlZml4IiBzZWxlY3Q9IiR0YWItYXJlYSIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idGFyZ2V0IiBzZWxlY3Q9Iidfc2VsZiciLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InF1ZXJ5U3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ0YWJOYW1lIi8+Ci0gICAgCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWItZG9jdW1lbnR1cmwiPgotICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDwhLS0gCi0gICAgICAgICAgIERvY3VtZW50IFVSTHMgYXJlIG5vdCBtZWFuaW5nZnVsIGluIHNvbWUgYXJlYXMuIEluIHRoYXQgY2FzZSwgc2V0IHRoZSBVUkwgdG8KLSAgICAgICAgICAgIi8iLiBUaGUgcHVibGljYXRpb24gc2l0ZW1hcCBjdXJyZW50bHkgdGFrZXMgY2FyZSBvZiBtYXBwaW5nIHRoYXQgdG8gYSBkZWZhdWx0IHBhZ2UgKGluZGV4Lmh0bWwpLgotICAgICAgICAgICBGSVhNRTogdGhhdCBzb2x1dGlvbiBpcyBzdWItb3B0aW1hbCwgYmVjYXVzZSBpdCBicmVha3Mgd2hlbiBhIHVzZXIgZGVsZXRlcyB0aGUgL2luZGV4IHBhZ2UuCi0gICAgICAgICAgIFRoZXJlIHNob3VsZCBiZSBhIG1hcHBlciBmcm9tICIvIiB0byAiZmlyc3QgZW50cnkgaW4gc2l0ZXRyZWUiLCBhbmQgaWYgdGhhdCBkb2VzIG5vdCBleGlzdCwgdG8gYSAKLSAgICAgICAgICAgImNyZWF0ZSBkb2N1bWVudD8iIG1lc3NhZ2UuCi0gICAgICAgIC0tPgotICAgICAgICA8IS0tIGZyb20gb3IgdG8gdGhlIGFkbWluIGFyZWEsIHRoZXJlJ3Mgbm8gY29uY2VwdCBvZiAiZG9jdW1lbnQiIChpdCdzIGFsbCB1c2VjYXNlcykgLS0+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdGFiLWFyZWEgPSAnYWRtaW4nIG9yICRhcmVhID0gJ2FkbWluJyI+LzwveHNsOndoZW4+Ci0gICAgICAgIDwhLS0gRklYTUU6IHdoYXQgaXMgZG9jdW1lbnRpZD8gLS0+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJGN1cnJlbnRUYWIgPSAnc2l0ZScpIGFuZCAkZG9jdW1lbnRpZCA9ICcvJyI+LzwveHNsOndoZW4+Ci0gICAgICAgIDwhLS0gY2F0Y2ggbWlzc2luZyB0cmFpbGluZyBzbGFzaCBpbiB1cmxzIHdpdGgganVzdCB0aGUgYXJlYTogLS0+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoJGRvY3VtZW50dXJsKSI+LzwveHNsOndoZW4+Ci0gICAgICAgIDwhLS0gdGhlIGRlZmF1bHQgY2FzZSBpczogdXNlIHRoZSBjdXJyZW50ICRkb2N1bWVudHVybCBmb3IgdGhlIG5ldyB0YWIgbGluay4gLS0+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZG9jdW1lbnR1cmwiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdGFiTmFtZSA9ICRjdXJyZW50VGFiIj4KLSAgICAgICAgPCEtLSAKLSAgICAgICAgICAgRklYTUU6IHdoeSBkbyB3ZSBub3JtYWxpemUtc3BhY2UgaGVyZT8gZmlkZGxpbmcgd2l0aCB1cmlzIGlzIG5vbmUgb2Ygb3VyIGJ1c2luZXNzLiAKLSAgICAgICAgICAgTG9va3MgbGlrZSBhIHdvcmthcm91bmQgZm9yIGEgcmVhbCBidWcgdGhhdCBzaG91bGQgYmUgZml4ZWQuIFN1cmUsIHdlIGRvbid0IGFsbG93IHNwYWNlcwotICAgICAgICAgICBpbiBkb2N1bWVudCBVUkxzLCBidXQgdGhhdCBwb2xpY3kgZGVjaXNpb24gaXMgbWFkZSBlbHNld2hlcmUuCi0gICAgICAgIC0tPgotICAgICAgICA8bGkgaWQ9ImFyZWEteyR0YWItYXJlYX0tYWN0aXZlIiBjbGFzcz0iYXJlYS1hY3RpdmUiPjxhIGhyZWY9Ii97JHB1YmxpY2F0aW9uaWR9L3skdGFiLWFyZWF9e25vcm1hbGl6ZS1zcGFjZSgkdGFiLWRvY3VtZW50dXJsKX17JHF1ZXJ5U3RyaW5nfSIgdGFyZ2V0PSJ7JHRhcmdldH0iPjxzcGFuPjxpMThuOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YWJOYW1lIi8+PC9pMThuOnRleHQ+PC9zcGFuPjwvYT48L2xpPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8bGkgaWQ9ImFyZWEteyR0YWItYXJlYX0iIGNsYXNzPSJhcmVhLWluYWN0aXZlIj48YSBocmVmPSIveyRwdWJsaWNhdGlvbmlkfS97JHRhYi1hcmVhfXtub3JtYWxpemUtc3BhY2UoJHRhYi1kb2N1bWVudHVybCl9eyRxdWVyeVN0cmluZ30iIHRhcmdldD0ieyR0YXJnZXR9Ij48c3Bhbj48aTE4bjp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFiTmFtZSIvPjwvaTE4bjp0ZXh0Pjwvc3Bhbj48L2E+PC9saT4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0id29ya2Zsb3ciPgotICAgIDxsaSBpZD0iaW5mby1zdGF0ZSI+PGkxOG46dGV4dD5Xb3JrZmxvdyBTdGF0ZTwvaTE4bjp0ZXh0PjogPHNwYW4gbmFtZT0id29ya2Zsb3ctc3RhdGUiIGlkPSJ3b3JrZmxvdy1zdGF0ZSI+PGkxOG46dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtmbG93c3RhdGUiLz48L2kxOG46dGV4dD48L3NwYW4+PC9saT4KLSAgICA8bGkgaWQ9ImluZm8tbGl2ZSI+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc2xpdmUgPSAnZmFsc2UnIj4KLSAgICAgICAgICA8aTE4bjp0ZXh0Pm5vdCBsaXZlPC9pMThuOnRleHQ+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgIDxpMThuOnRleHQ+bGl2ZTwvaTE4bjp0ZXh0PgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC9saT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6bWVudS8vbWVudTptZW51Ij4KLSAgICA8bGkgY2xhc3M9ImxlbnlhLW1lbnUtdGl0bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvbGk+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIqIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAtLT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6bWVudSIgbW9kZT0ibmF2Ij4KLSAgICA8bGk+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IioiPgotICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj5uYXY8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmRpc2FibGVkPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICA8aTE4bjp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvaTE4bjp0ZXh0PgotICAgICAgPHhzbDppZiB0ZXN0PSIqIj4KLSAgICAgICAgPHVsIGlkPSJtZW51e3Bvc2l0aW9uKCl9Ij4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1lbnU6YmxvY2siLz4KLSAgICAgICAgPC91bD4KLSAgICAgIDwveHNsOmlmPgotICAgIDwvbGk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L21lbnUvbWVyZ2UtbWVudXMueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L21lbnUvbWVyZ2UtbWVudXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjBiYTAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9tZW51L21lcmdlLW1lbnVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogbWVudTJ4aHRtbC54c2wgMTc4Mjg5IDIwMDUtMDUtMjQgMjE6MzA6MDFaIGFuZHJlYXMgJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOm1lbnU9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9tZW51YmFyLzEuMCIKLSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gID4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9tZW51Om1lbnUiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKiIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDwhLS0KLSAgICBBcHBseSB0aGUgZmlyc3QgPG1lbnVzPi4KLSAgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnU6bWVudXNbbm90KHByZWNlZGluZy1zaWJsaW5nOjptZW51Om1lbnVzKV0iPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWVudTptZW51Ii8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPCEtLQotICAgIEFwcGx5IHRoZSA8bWVudT4gY2hpbGRyZW4gb2YgdGhlIGZpcnN0IDxtZW51cz4uCi0gICAgSW5zZXJ0IGl0ZW1zIG9mIG1vZHVsZSBtZW51cyAod2hpY2ggaGF2ZSBwcmVjZWRpbmcgc2libGluZ3MpCi0gICAgYmVmb3JlIHRoZSBpdGVtcyBvZiB0aGlzIG1lbnUuCi0gIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvbWVudTptZW51L21lbnU6bWVudXNbMV0vbWVudTptZW51Ij4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii9tZW51Om1lbnUvbWVudTptZW51c1twcmVjZWRpbmctc2libGluZzo6bWVudTptZW51c10vbWVudTptZW51W0BuYW1lID0gY3VycmVudCgpL0BuYW1lXS8qIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IioiLz4KLSAgICA8L3hzbDpjb3B5PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZW51Om1lbnVzW3ByZWNlZGluZy1zaWJsaW5nOjptZW51Om1lbnVzXSIvPgotICAKLSAgCi0gIDwhLS0KLSAgICBEb24ndCBhcHBseSB0aGUgPG1lbnU+IGNoaWxkcmVuIG9mIHRoZSBzdWJzZXF1ZW50IDxibG9jaz5zIHdpdGggYSBjZXJ0YWluIElELgotICAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudTpibG9jayI+Ci0gICAgPHhzbDppZiB0ZXN0PSJub3QocHJlY2VkaW5nOjptZW51OmJsb2NrW0BpZCA9IGN1cnJlbnQoKS9AaWRdKSI+Ci0gICAgICA8eHNsOmNvcHk+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bWVudTppdGVtIi8+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZm9sbG93aW5nOjptZW51OmJsb2NrW0BpZCA9IGN1cnJlbnQoKS9AaWRdL21lbnU6aXRlbSIvPgotICAgICAgPC94c2w6Y29weT4KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbW9kdWxlcy9tb2R1bGVzMnhpbmNsdWRlLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9tb2R1bGVzL21vZHVsZXMyeGluY2x1ZGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTA0MDM2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9tb2R1bGVzL21vZHVsZXMyeGluY2x1ZGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08IS0tICRJZDogeGluY2x1ZGUueHNsIDEyMzQxNCAyMDA0LTEyLTI3IDE0OjUyOjI0WiBncmVnb3IgJCAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIg0KLSAgICB4bWxuczpsZW55YT0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2xlbnlhL3B1YmxpY2F0aW9uLzEuMSIKLSAgICB4bWxuczptZW51PSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvbWVudWJhci8xLjAiDQotICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIg0KLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSINCi0+DQotDQotICA8eHNsOnBhcmFtIG5hbWU9ImFyZWEiLz4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxlbnlhOnB1YmxpY2F0aW9uIj4KLSAgICA8bWVudTptZW51PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJsZW55YTptb2R1bGVzL2xlbnlhOm1vZHVsZSIvPgotICAgIDwvbWVudTptZW51PgotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxlbnlhOm1vZHVsZSI+Ci0gICAgPHhzbDppZiB0ZXN0PSJub3QocHJlY2VkaW5nLXNpYmxpbmc6OmxlbnlhOm1vZHVsZVtAbmFtZSA9IGN1cnJlbnQoKS9AbmFtZV0pIj4KLSAgICAgIDx4aTppbmNsdWRlIGhyZWY9ImNvY29vbjovbWVudS14bWwvbW9kdWxlL3skYXJlYX0ve0BuYW1lfS54bWwiIHhwb2ludGVyPSJ4cG9pbnRlcigvKi8qKSIvPg0KLSAgICA8L3hzbDppZj4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLTwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L25vdGlmaWNhdGlvbi9tZXNzYWdlMnhzbHQueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L25vdGlmaWNhdGlvbi9tZXNzYWdlMnhzbHQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI4NDgzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9ub3RpZmljYXRpb24vbWVzc2FnZTJ4c2x0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPCEtLQotCVRoaXMgc3R5bGVzaGVldCBjb252ZXJ0cyBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlIHRvIGEgbmFtZWQgc3R5bGVzaGVldC4KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHhtbG5zOnhzbHQ9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS94c2x0LzEuMCIKLSAgICB4bWxuczpub3Q9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9ub3RpZmljYXRpb24vMS4wIgotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgID4KLSAgICAKLTx4c2w6cGFyYW0gbmFtZT0ic2VydmVyLXVyaSIvPgotPHhzbDpwYXJhbSBuYW1lPSJkb2N1bWVudC11cmwiLz4KLSAgICAKLTx4c2w6bmFtZXNwYWNlLWFsaWFzIHN0eWxlc2hlZXQtcHJlZml4PSJ4c2x0IiByZXN1bHQtcHJlZml4PSJ4c2wiLz4KLSAgICAKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotCTx4c2x0OnN0eWxlc2hlZXQgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9Im5vdCIgdmVyc2lvbj0iMS4wIj4KLQkJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotCTwveHNsdDpzdHlsZXNoZWV0PgotPC94c2w6dGVtcGxhdGU+Ci0JCQotCQkKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9ub3Q6bm90aWZpY2F0aW9uW25vdChAZW5hYmxlZCA9ICd0cnVlJyldIj4KLQkKLQk8eHNsdDp0ZW1wbGF0ZSBtYXRjaD0ibm90Om5vdGlmaWNhdGlvbiIvPgotCTx4c2x0OnRlbXBsYXRlIG1hdGNoPSJub3Q6bm90aWZpY2F0aW9uLXN1YmplY3QiLz4KLQk8eHNsdDp0ZW1wbGF0ZSBtYXRjaD0ibm90Om5vdGlmaWNhdGlvbi1jb21tZW50Ii8+Ci0JCQotCTx4c2x0OnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotCQk8eHNsdDpjb3B5Pjx4c2x0OmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPjwveHNsdDpjb3B5PgotCTwveHNsdDp0ZW1wbGF0ZT4KLSAKLTwveHNsOnRlbXBsYXRlPgotCQotCQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL25vdDpub3RpZmljYXRpb25bQGVuYWJsZWQgPSAndHJ1ZSddIj4KLQkKLQk8eHNsdDp0ZW1wbGF0ZSBtYXRjaD0ibm90Om5vdGlmaWNhdGlvbiI+Ci0JCTxpbnB1dCBpZD0ibm90aWZpY2F0aW9uLnN1YmplY3QiIHR5cGU9ImhpZGRlbiIgbmFtZT0ibm90aWZpY2F0aW9uLnN1YmplY3QiCi0JCQl2YWx1ZT0ie25vdDptZXNzYWdlL25vdDpzdWJqZWN0fSIvPgotCQk8ZGl2IGNsYXNzPSJsZW55YS1ib3giPgotCQkJPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj5Ob3RpZmljYXRpb248L2Rpdj4KLQkJCTxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLQkJCTx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbm9ib3JkZXIiPgotCQkJCTx0cj4KLQkJCQkJPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj5SZWNpcGllbnQocyk6PC90ZD4KLQkJCQkJPHRkPgotCQkJCQkJPHhzbHQ6YXBwbHktdGVtcGxhdGVzLz4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJCTx0cj4KLQkJCQkJPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj5Db21tZW50OjwvdGQ+Ci0JCQkJCTx0ZD4KLQkJCQkJCTx0ZXh0YXJlYSBpZD0ibm90aWZpY2F0aW9uLm1lc3NhZ2UiIG5hbWU9Im5vdGlmaWNhdGlvbi5tZXNzYWdlIiBjbGFzcz0ibGVueWEtZm9ybS1lbGVtZW50Ij4KLQkJCQkJCQk8eHNsOnRleHQvPgotCQkJCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibm90Om1lc3NhZ2Uvbm90OmJvZHkiLz4KLQkJCQkJCQk8eHNsOnRleHQ+JiMxNjA7PC94c2w6dGV4dD4KLQkJCQkJCTwvdGV4dGFyZWE+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwvdGFibGU+CQotCQkJPC9kaXY+Ci0JCTwvZGl2PgotCTwveHNsdDp0ZW1wbGF0ZT4KLQkKLQkKLQk8eHNsdDp0ZW1wbGF0ZSBtYXRjaD0ibm90OnNlbGVjdCI+Ci0JCTxzZWxlY3QgbmFtZT0ibm90aWZpY2F0aW9uLnRvbGlzdCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCI+Ci0JCSAgPG9wdGlvbiB2YWx1ZT0iIj5bbm8gbm90aWZpY2F0aW9uXTwvb3B0aW9uPgotCQkJPHhzbHQ6Zm9yLWVhY2ggc2VsZWN0PSJub3Q6dXNlcnMvbm90OnVzZXIiPgotCQkJCTxvcHRpb24+Ci0JCQkJCTx4c2x0OmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PHhzbHQ6dmFsdWUtb2Ygc2VsZWN0PSJAZW1haWwiLz48L3hzbHQ6YXR0cmlidXRlPgotCQkJCQk8eHNsdDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPgotCQkJCQk8eHNsdDppZiB0ZXN0PSJAbmFtZSAhPSAnJyI+JiMxNjA7KDx4c2x0OnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pPC94c2x0OmlmPgotCQkJCTwvb3B0aW9uPgotCQkJPC94c2x0OmZvci1lYWNoPgotCQk8L3NlbGVjdD4KLQk8L3hzbHQ6dGVtcGxhdGU+Ci0JCi0JCi0JPHhzbHQ6dGVtcGxhdGUgbWF0Y2g9Im5vdDp0ZXh0YXJlYSI+Ci0JCTx0ZXh0YXJlYSBpZD0ibm90aWZpY2F0aW9uLnRvbGlzdCIgbmFtZT0ibm90aWZpY2F0aW9uLnRvbGlzdCIgY2xhc3M9ImxlbnlhLWZvcm0tZWxlbWVudCI+JiMxNjA7PC90ZXh0YXJlYT4KLQk8L3hzbHQ6dGVtcGxhdGU+Ci0JCi0JCi0JPHhzbHQ6dGVtcGxhdGUgbWF0Y2g9Im5vdDpwcmVzZXQiPgotCQk8eHNsdDp2YXJpYWJsZSBuYW1lPSJ1c2VyIiBzZWxlY3Q9Im5vdDp1c2Vycy9ub3Q6dXNlciIvPgotCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJub3RpZmljYXRpb24udG9saXN0Ij4KLQkJCTx4c2x0OmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PHhzbHQ6dmFsdWUtb2Ygc2VsZWN0PSIkdXNlci9AZW1haWwiLz48L3hzbHQ6YXR0cmlidXRlPgotCQk8L2lucHV0PiAKLQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub2JyZWFrIj4KLQkJCTx4c2x0OnZhbHVlLW9mIHNlbGVjdD0iJHVzZXIvQGlkIi8+Ci0JCQk8eHNsdDppZiB0ZXN0PSJAbmFtZSAhPSAnJyI+JiMxNjA7KDx4c2x0OnZhbHVlLW9mIHNlbGVjdD0iJHVzZXIvQG5hbWUiLz4pPC94c2x0OmlmPgotCQk8L3NwYW4+Ci0JPC94c2x0OnRlbXBsYXRlPgotCQotCQotCTx4c2x0OnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotCQk8eHNsdDpjb3B5Pjx4c2x0OmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPjwveHNsdDpjb3B5PgotCTwveHNsdDp0ZW1wbGF0ZT4KLSAKLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5vdDpib2R5Ij4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im5vZGUoKSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5vdDpib2R5L3RleHQoKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm90OmRvY3VtZW50LXVybCI+Ci0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2ZXItdXJpIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb2N1bWVudC11cmwiLz4KLTwveHNsOnRlbXBsYXRlPgotCQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24ybWVzc2FnZS54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbjJtZXNzYWdlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzNmZmYy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbjJtZXNzYWdlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08IS0tCi0JVGhpcyBzdHlsZXNoZWV0IGZpbHRlcnMgdGhlIG1lc3NhZ2VzIGluIG5vdGlmaWNhdGlvbi54Y29uZi4KLQlPbmx5IHRoZSBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQgdXNlY2FzZSBpcyBmb3J3YXJkZWQuCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB4bWxuczpub3Q9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9ub3RpZmljYXRpb24vMS4wIgotICAgID4KLSAgICAKLTx4c2w6cGFyYW0gbmFtZT0idXNlY2FzZSIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJub3Q6bWVzc2FnZVtAdXNlY2FzZSAhPSAkdXNlY2FzZV0iLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLQk8eHNsOmNvcHk+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz48L3hzbDpjb3B5PgotPC94c2w6dGVtcGxhdGU+Ci0gCi08L3hzbDpzdHlsZXNoZWV0PiAgCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvcmMvcmNvLWV4Y2VwdGlvbi54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvcmMvcmNvLWV4Y2VwdGlvbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTUyZGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3JjL3Jjby1leGNlcHRpb24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gIHhtbG5zOnJjPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcmMvMS4wIgotICB4bWxuczpwYWdlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICA+Ci0gIAotICA8eHNsOmltcG9ydCBocmVmPSIuLi91dGlsL3BhZ2UtdXRpbC54c2wiLz4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyYzpleGNlcHRpb24iPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJyYzpmaWxlLXJlc2VydmVkLWNoZWNrb3V0LWV4Y2VwdGlvbiI+Ci0gICAgPHBhZ2U6cGFnZT4KLSAgICAgIDxwYWdlOnRpdGxlPjxpMThuOnRleHQ+bGVueWEucmMubm9jaGVja291dDwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgICAgIDxwYWdlOmJvZHk+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj48aTE4bjp0ZXh0PmxlbnlhLnJjLm5vY2hlY2tvdXQ8L2kxOG46dGV4dD48L2Rpdj4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm9keSI+Ci0gICAgICAgICAgICA8cD48aTE4bjp0ZXh0PmxlbnlhLnJjLmNoZWNrZWRvdXRhbHJlYWR5PC9pMThuOnRleHQ+PC9wPgotICAgICAgICAgICAgPHRhYmxlPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PlVzZXI8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJjOnVzZXIiLz48L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PkRhdGU8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJjOmRhdGUiLz48L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1lbnRyeS1jYXB0aW9uIj48aTE4bjp0ZXh0PkZpbGVuYW1lPC9pMThuOnRleHQ+OjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyYzpmaWxlbmFtZSIvPjwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgPGZvcm0gaWQ9ImZvcm0tYmFjayI+Ci0gICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgb25DbGljaz0iaGlzdG9yeS5nbygtMSkiIG5hbWU9ImlucHV0LW9rIi8+Ci0gICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgIDwvZm9ybT4JCQotICAgICAgICAgIDwvZGl2PgotICAgICAgICA8L2Rpdj4KLSAgICAgIDwvcGFnZTpib2R5PgotICAgIDwvcGFnZTpwYWdlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJjOmZpbGUtcmVzZXJ2ZWQtY2hlY2tpbi1leGNlcHRpb24iPgotICAgIDxwYWdlOnBhZ2U+Ci0gICAgICA8cGFnZTp0aXRsZT48aTE4bjp0ZXh0PmxlbnlhLnJjLm5vY2hlY2tpbjwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgICAgIDxwYWdlOmJvZHk+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj48aTE4bjp0ZXh0PmxlbnlhLnJjLm5vY2hlY2tpbjwvaTE4bjp0ZXh0PjwvZGl2PgotICAgICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib2R5Ij4KLSAgICAgICAgICAgIDxwPjxpMThuOnRleHQ+bGVueWEucmMuY2hlY2tlZG91dGFscmVhZHk8L2kxOG46dGV4dD48L3A+Ci0gICAgICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+VXNlcjwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icmM6dXNlciIvPjwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+RGF0ZTwvaTE4bjp0ZXh0Pjo8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icmM6ZGF0ZSIvPjwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLWVudHJ5LWNhcHRpb24iPjxpMThuOnRleHQ+RmlsZW5hbWU8L2kxOG46dGV4dD46PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJjOmZpbGVuYW1lIi8+PC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICA8Zm9ybSBpZD0iZm9ybS1iYWNrIj4KLSAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBvbkNsaWNrPSJoaXN0b3J5LmdvKC0xKSIgbmFtZT0iaW5wdXQtb2siLz4KLSAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgPC9mb3JtPgkJCi0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgIDwvZGl2PgotICAgICAgPC9wYWdlOmJvZHk+Ci0gICAgPC9wYWdlOnBhZ2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJjOmdlbmVyaWMtZXhjZXB0aW9uIj4KLSAgICA8cGFnZTpwYWdlPgotICAgICAgPHBhZ2U6dGl0bGU+PGkxOG46dGV4dD5HZW5lcmljIEV4Y2VwdGlvbjwvaTE4bjp0ZXh0PjwvcGFnZTp0aXRsZT4KLSAgICAgIDxwYWdlOmJvZHk+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LXRpdGxlIj48aTE4bjp0ZXh0PkdlbmVyaWMgRXhjZXB0aW9uPC9pMThuOnRleHQ+PC9kaXY+Ci0gICAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvZHkiPgotICAgICAgICAgICAgPHA+PGkxOG46dGV4dD5SZWFzb248L2kxOG46dGV4dD46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyYzptZXNzYWdlIi8+PGJyIC8+Ci0gICAgICAgICAgICAgIDxpMThuOnRleHQ+Q2hlY2sgdGhlIGxvZyBmaWxlcy48L2kxOG46dGV4dD4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgIDx0YWJsZT4KLSAgICAgICAgICAgICAgPHRyPjx0ZD48aTE4bjp0ZXh0PkZpbGVuYW1lPC9pMThuOnRleHQ+OjwvdGQ+PHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyYzpmaWxlbmFtZSIvPjwvdGQ+PC90cj4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICA8Zm9ybSBpZD0iZm9ybS1iYWNrIj4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBvbkNsaWNrPSJoaXN0b3J5LmdvKC0xKSIgbmFtZT0iaW5wdXQtb2siLz4KLSAgICAgICAgICAgIDwvZm9ybT4JCQotICAgICAgICAgIDwvZGl2PgotICAgICAgICA8L2Rpdj4KLSAgICAgIDwvcGFnZTpib2R5PgotICAgIDwvcGFnZTpwYWdlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3Jlc291cmNlcy90cmFuc2xhdGUtcm5nLWluY2x1ZGVzLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC9yZXNvdXJjZXMvdHJhbnNsYXRlLXJuZy1pbmNsdWRlcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWJkOTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3Jlc291cmNlcy90cmFuc2xhdGUtcm5nLWluY2x1ZGVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTwhLS0gRklYTUU6IHRoaXMgZmlsZSBzaG91bGQgYmUga2lsbGVkIHRoZSBzb29uZXIgdGhlIGJldHRlci4KLSAgICAgVGhlcmUgaXMgcmVhbGx5IG5vIGV4Y3VzZSB0byByZS1pbnZlbnQgYSBmYWxsYmFjayBzb3VyY2UgcmVzb2x2ZXIgd2l0aCBzdWJzdHJpbmcgZ3Vlc3NpbmcuCi0tLT4KLQotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgID4KLQotICA8eHNsOnBhcmFtIG5hbWU9InB1YmxpY2F0aW9uaWQiIC8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAaHJlZltzdGFydHMtd2l0aCguLCdmYWxsYmFjazovL2xlbnlhL3Jlc291cmNlcy8nKV0iIHByaW9yaXR5PSIxMCI+Ci0gICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlciguLCAnZmFsbGJhY2s6Ly9sZW55YS9yZXNvdXJjZXMvJykiLz4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJy9sZW55YS8nLCAkcmVzb3VyY2UgKSIvPgotICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQGhyZWZbc3RhcnRzLXdpdGgoLiwnZmFsbGJhY2snKV0iIHByaW9yaXR5PSI1Ij4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5vZmFsbGJhY2siIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKC4sJ2ZhbGxiYWNrOi8vbGVueWEvbW9kdWxlcy8nKSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVzdHlwZSIgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRub2ZhbGxiYWNrLCcvcmVzb3VyY2VzJykiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkbm9mYWxsYmFjaywncmVzb3VyY2VzLycpIi8+Ci0gICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCcvJyAsICRwdWJsaWNhdGlvbmlkLCAnL21vZHVsZXMvJyAsICRyZXN0eXBlLCAnLycsICRyZXNvdXJjZSkiLz4KLSAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+IApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvYWdncmVnYXRlLXB1YmxpY2F0aW9ucy54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC9hZ2dyZWdhdGUtcHVibGljYXRpb25zLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjYWYzZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC9hZ2dyZWdhdGUtcHVibGljYXRpb25zLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQ6IHhpbmNsdWRlLnhzbCA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6bGVueWE9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9wdWJsaWNhdGlvbi8xLjEiCi0gICAgeG1sbnM6ZGlyPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vZGlyZWN0b3J5LzIuMCIKLSAgICA+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImRpcjpkaXJlY3RvcnkiLz4KLTwveHNsOnRlbXBsYXRlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRpcjpkaXJlY3RvcnkiPgotICA8bGVueWE6cHVibGljYXRpb25zPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJkaXI6ZGlyZWN0b3J5Ij4KLSAgICAgIDxsZW55YTpwdWJsaWNhdGlvbiBkaXJuYW1lPSJ7QG5hbWV9Ij4KLSAgICAgICAgPHhpOmluY2x1ZGUgCi0gICAgICAgICAgaHJlZj0ibGVueWEvcHVicy97QG5hbWV9L2NvbmZpZy9wdWJsaWNhdGlvbi54bWwiCi0gICAgICAgICAgeHBvaW50ZXI9Inhwb2ludGVyKC8qLyopIgotICAgICAgICA+Ci0gICAgICAgICAgPHhpOmZhbGxiYWNrPgotICAgICAgICAgICAgPGxlbnlhOm5hbWUgbmFtZT0ie0BuYW1lfSIvPgotICAgICAgICAgIDwveGk6ZmFsbGJhY2s+Ci0gICAgICAgIDwveGk6aW5jbHVkZT4KLSAgICAgIDwvbGVueWE6cHVibGljYXRpb24+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwvbGVueWE6cHVibGljYXRpb25zPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC9pZGVudGl0eS54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC9pZGVudGl0eS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjgzYjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvaWRlbnRpdHkueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotSWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL2ludHJvZHVjdGlvbi54c2wgYi90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC9pbnRyb2R1Y3Rpb24ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdiZmEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL2ludHJvZHVjdGlvbi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gJElkOiBwdWJsaWNhdGlvbi54c2wgNDczODYxIDIwMDYtMTEtMTIgMDM6NTE6MTRaIGdyZWdvciAkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQKLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcHVibGljYXRpb24vMS4xIgotICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotPgotCi0KLTx4c2w6a2V5IG5hbWU9IndvcmtmbG93cyIgbWF0Y2g9ImxlbnlhOnJlc291cmNlLXR5cGUiIHVzZT0iQHdvcmtmbG93Ii8+ICAgCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8qIj4KLTxwYWdlOnBhZ2U+Ci0gIDxwYWdlOnRpdGxlPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFwYWNoZSBMZW55YTwvYT4gJiMxODc7Ci0gICAgPGkxOG46dHJhbnNsYXRlPgotICAgICAgPGkxOG46dGV4dD4uLi4gUHVibGljYXRpb248L2kxOG46dGV4dD4KLSAgICAgIDxpMThuOnBhcmFtPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsZW55YTpwdWJsaWNhdGlvbi9sZW55YTpuYW1lIi8+PC9pMThuOnBhcmFtPgotICAgIDwvaTE4bjp0cmFuc2xhdGU+Ci0gIDwvcGFnZTp0aXRsZT4KLSAgPHBhZ2U6aGVhZC8+Ci0gIDxwYWdlOmJvZHk+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtc2lkZWJhciI+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1zaWRlYmFyLWhlYWRpbmciPjxpMThuOnRleHQ+VGhpcyBQdWJsaWNhdGlvbjwvaTE4bjp0ZXh0PjwvZGl2PgotICAgICAgPHVsPgotICAgICAgICA8bGk+PGEgaHJlZj0iYXV0aG9yaW5nLyI+PGkxOG46dGV4dD5Mb2dpbiBhcyBFZGl0b3I8L2kxOG46dGV4dD48L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9ImxpdmUvIj48aTE4bjp0ZXh0PkxpdmUgVmlldzwvaTE4bjp0ZXh0PjwvYT48L2xpPgotICAgICAgPC91bD4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLXB1YmxpY2F0aW9uLWl0ZW0iPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpMThuOnRleHQ+T3RoZXIgUHVibGljYXRpb25zPC9pMThuOnRleHQ+PC9hPjwvZGl2PgotICAgICAgPGRpdiBjbGFzcz0ibGVueWEtcHVibGljYXRpb24taXRlbSI+PGEgaHJlZj0iaHR0cDovL2xlbnlhLmFwYWNoZS5vcmcvZG9jcy9pbmRleC5odG1sIj48aTE4bjp0ZXh0PkRvY3VtZW50YXRpb248L2kxOG46dGV4dD48L2E+PC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1wdWJsaWNhdGlvbi1pdGVtIj48YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2xlbnlhIj5XaWtpPC9hPjwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPGRpdiBjbGFzcz0ibGVueWEtZnJvbnRwYWdlIj4KLSAgICAgIDxoMj48aTE4bjp0ZXh0PlB1YmxpY2F0aW9uIHByb3BlcnRpZXM8L2kxOG46dGV4dD46PC9oMj4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibGVueWE6cHVibGljYXRpb24iLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icGFnZTpwYWdlIi8+Ci0gICAgICAKLSAgICA8L2Rpdj4KLSAgPC9wYWdlOmJvZHk+Ci08L3BhZ2U6cGFnZT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJsZW55YTpwdWJsaWNhdGlvbiI+Ci0gIDx0YWJsZSBjbGFzcz0ibGVueWEtdGFibGUtbGlzdC1ub2JvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+PGkxOG46dGV4dD5OYW1lPC9pMThuOnRleHQ+PC90aD4KLSAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibGVueWE6bmFtZSIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGggc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij48aTE4bjp0ZXh0PlJldmlzaW9uPC9pMThuOnRleHQ+PC90aD4KLSAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibGVueWE6dmVyc2lvbiIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGggc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij48aTE4bjp0ZXh0PkRlc2NyaXB0aW9uPC9pMThuOnRleHQ+PC90aD4KLSAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibGVueWE6ZGVzY3JpcHRpb24iLz48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+PGkxOG46dGV4dD5BdmFpbGFibGUgbGFuZ3VhZ2VzPC9pMThuOnRleHQ+PC90aD4KLSAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyIj4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImxlbnlhOmxhbmd1YWdlcy9sZW55YTpsYW5ndWFnZSI+Ci0gICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGRlZmF1bHQiPgotICAgICAgICAgICAgICA8c3Ryb25nPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9zdHJvbmc+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSBsYXN0KCkiPgotICAgICAgICAgICAgPHhzbDp0ZXh0PiwgPC94c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+PGkxOG46dGV4dD5BdmFpbGFibGUgcmVzb3VyY2UgdHlwZXM8L2kxOG46dGV4dD48L3RoPgotICAgICAgPHRkIGNsYXNzPSJib3JkZXIiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImxlbnlhOnRlbXBsYXRlcy9sZW55YTp0ZW1wbGF0ZSI+Ci0gICAgICAgICAgPGkxOG46dGV4dD5Jbmhlcml0ZWQ6IHNlZSB0ZW1wbGF0ZSBwdWJsaWNhdGlvbjwvaTE4bjp0ZXh0Pjxici8+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmZvci1lYWNoIAotICAgICAgICAgIHNlbGVjdD0ibGVueWE6cmVzb3VyY2UtdHlwZXMvbGVueWE6cmVzb3VyY2UtdHlwZVtnZW5lcmF0ZS1pZCguKT1nZW5lcmF0ZS1pZChrZXkoJ3dvcmtmbG93cycsIEB3b3JrZmxvdylbMV0pXSIKLSAgICAgICAgPgotICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkB3b3JrZmxvdyIvPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJrZXkoJ3dvcmtmbG93cycsIEB3b3JrZmxvdykiPgotICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9IGxhc3QoKSI+Ci0gICAgICAgICAgICAgIDx4c2w6dGV4dD4sIDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8eHNsOnRleHQ+IChXb3JrZmxvdzogPC94c2w6dGV4dD4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHdvcmtmbG93Ii8+Ci0gICAgICAgICAgPHhzbDp0ZXh0Pik8L3hzbDp0ZXh0PgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSBsYXN0KCkiPgotICAgICAgICAgICAgPHhzbDp0ZXh0Pjs8L3hzbDp0ZXh0PjxiciAvPgotICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGggc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij48aTE4bjp0ZXh0PlJlcXVpcmVkIExlbnlhIHZlcnNpb248L2kxOG46dGV4dD48L3RoPgotICAgICAgPHRkIGNsYXNzPSJib3JkZXIiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsZW55YTpsZW55YS12ZXJzaW9uIi8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0aCBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPjxpMThuOnRleHQ+UmVxdWlyZWQgTGVueWEgcmV2aXNpb248L2kxOG46dGV4dD48L3RoPgotICAgICAgPHRkIGNsYXNzPSJib3JkZXIiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsZW55YTpsZW55YS1yZXZpc2lvbiIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGggc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij48aTE4bjp0ZXh0PlJlcXVpcmVkIENvY29vbiB2ZXJzaW9uPC9pMThuOnRleHQ+PC90aD4KLSAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibGVueWE6Y29jb29uLXZlcnNpb24iLz48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+PGkxOG46dGV4dD5Nb2R1bGVzIHVzZWQ8L2kxOG46dGV4dD48L3RoPgotICAgICAgPHRkIGNsYXNzPSJib3JkZXIiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImxlbnlhOnRlbXBsYXRlcy9sZW55YTp0ZW1wbGF0ZSI+Ci0gICAgICAgICAgPGkxOG46dGV4dD5Jbmhlcml0ZWQ6IHNlZSB0ZW1wbGF0ZSBwdWJsaWNhdGlvbjwvaTE4bjp0ZXh0Pjxici8+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibGVueWE6bW9kdWxlcy9sZW55YTptb2R1bGUiPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSBsYXN0KCkiPgotICAgICAgICAgICAgPHhzbDp0ZXh0PiwgPC94c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+PGkxOG46dGV4dD5UZW1wbGF0ZSB1c2VkPC9pMThuOnRleHQ+PC90aD4KLSAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyIj4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImxlbnlhOnRlbXBsYXRlIj4KLSAgICAgICAgICAgIDxhIGhyZWY9Ii4uL3tsZW55YTp0ZW1wbGF0ZS9AaWR9L2ludHJvZHVjdGlvbi5odG1sIj4KLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxlbnlhOnRlbXBsYXRlL0BpZCIvPgotICAgICAgICAgICAgPC9hPgotICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8aTE4bjp0ZXh0Pm5vbmU8L2kxOG46dGV4dD4KLSAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWdlOnBhZ2UiPgotPCEtLSBGSVhNRTogYWdncmVnYXRlLWZhbGxiYWNrIHNlZW1zIHRvIHJldHVybiB0aGUgbGFzdCBkb2N1bWVudCB0d2ljZS4KLSAgICAgVGhlIHBvc2l0aW9uIHByZWRpY2F0ZSBpcyBqdXN0IGEgcXVpY2sgd29ya2Fyb3VuZCBhbmQgbmVlZHMgdG8gYmUgZml4ZWQhIC0tPgotICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFnZTpib2R5W3Bvc2l0aW9uKCkgJmx0OyBsYXN0KCldIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IioiLz4KLSAgPC94c2w6Zm9yLWVhY2g+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSB3ZSBhcmUgYWdncmV0YXRpbmcgaW50byBhIG5ldyBjb250ZXh0OiAKLSAgICAgKGFub3RoZXIgZ29vZCByZWFzb24gdG8gbW92ZSB0byB4aHRtbDIpIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aDEiPgotICA8aDI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz48L2gyPgotPC94c2w6dGVtcGxhdGU+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpoMiI+Ci0gIDxoMz48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPjwvaDM+Ci08L3hzbDp0ZW1wbGF0ZT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmgzIj4KLSAgPGg0Pjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+PC9oND4KLTwveHNsOnRlbXBsYXRlPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aDQiPgotICA8aDU+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz48L2g1PgotPC94c2w6dGVtcGxhdGU+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpoNXx4aHRtbDpoNiI+Ci0gIDxoNj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPjwvaDY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgPHhzbDpjb3B5Pjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+PC94c2w6Y29weT4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvcGFnZS11dGlsLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL3BhZ2UtdXRpbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTcxOGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvcGFnZS11dGlsLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICA+Ci0gIAotICAKLSAgPCEtLSBpbmNsdWRlcyB0aGUgZGVmYXVsdCBDU1Mgc3R5bGVzaGVldCAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmNsdWRlLWNzcyI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJjb250ZXh0cHJlZml4Ii8+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ieyRjb250ZXh0cHJlZml4fS9sZW55YS9jc3MvZGVmYXVsdC5jc3MiIG1lZGlhPSJzY3JlZW4iLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIHByaW50cyBhIGxpc3Qgb2YgJHNlcGFyYXRvci1zZXBhcmF0ZWQgc3RyaW5ncyAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcmludC1saXN0Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imxpc3Qtc3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJzZXBhcmF0b3IiIHNlbGVjdD0iJywnIi8+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJGxpc3Qtc3RyaW5nLCAkc2VwYXJhdG9yKSI+Ci0gICAgICAgIDxsaT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkbGlzdC1zdHJpbmcsICRzZXBhcmF0b3IpIi8+PC9saT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByaW50LWxpc3QiPgotICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJsaXN0LXN0cmluZyIgc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJGxpc3Qtc3RyaW5nLCAkc2VwYXJhdG9yKSIvPgotICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzZXBhcmF0b3IiIHNlbGVjdD0iJHNlcGFyYXRvciIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8bGk+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0LXN0cmluZyIvPjwvbGk+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gcHJpbnRzIGEgbGlzdCBvZiAkc2VwYXJhdG9yLXNlcGFyYXRlZCBzdHJpbmdzIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9InByaW50LWxpc3Qtc2ltcGxlIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imxpc3Qtc3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJzZXBhcmF0b3IiIHNlbGVjdD0iJywnIi8+Ci0gICAgCi0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJGxpc3Qtc3RyaW5nLCAkc2VwYXJhdG9yKSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRsaXN0LXN0cmluZywgJHNlcGFyYXRvcikiLz48YnIgLz4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByaW50LWxpc3Qtc2ltcGxlIj4KLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGlzdC1zdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRsaXN0LXN0cmluZywgJHNlcGFyYXRvcikiLz4KLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2VwYXJhdG9yIiBzZWxlY3Q9IiRzZXBhcmF0b3IiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0LXN0cmluZyIvPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC9wYWdlMnhodG1sLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL3BhZ2UyeGh0bWwueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTI3YTE3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL3BhZ2UyeGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZCQgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSIgICAgCi0gIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJwYWdlIHhodG1sIGkxOG4iCi0gID4KLSAgCi0gIDx4c2w6aW5jbHVkZSBocmVmPSJmYWxsYmFjazovL2xlbnlhL3hzbHQvdXRpbC90b2dnbGUueHNsIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWdlOnBhZ2UiPgotICAgIDxodG1sPgotICAgICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InBhZ2U6dGl0bGUvbm9kZSgpIiBtb2RlPSJodG1sVGl0bGUiLz48L3RpdGxlPgotICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvbGVueWEvY3NzL2RlZmF1bHQuY3NzIiB0aXRsZT0iZGVmYXVsdCBjc3MiLz4KLSAgICAgICAgPHhzbDpjb21tZW50PltpZiBJRSA2XTwhW0NEQVRBWz5dXT4mbHQ7bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvbGVueWEvY3NzL2llNmhhY2tzb25seS5jc3MiIC8+PCFbQ0RBVEFbPCFbZW5kaWZdXV0+PC94c2w6Y29tbWVudD4KLSAgICAgICAgPGxpbmsgcmVsPSJpY29uIiBocmVmPSIvZmF2aWNvbi5pY28iIHR5cGU9ImltYWdlL2ljbyIvPgotICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImFwcGxpY2F0aW9uL3hodG1sK3htbDsgY2hhcnNldD1VVEYtOCIvPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InhodG1sOnNjcmlwdCIvPgotICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJwYWdlOmhlYWQvKiIvPgotICAgICAgPC9oZWFkPgotICAgICAgPGJvZHk+Ci0gICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9InBhZ2U6Ym9keS9AKiIvPgotICAgICAgICA8eHNsOmlmIHRlc3Q9InBhZ2U6Ym9keS8veGh0bWw6ZGl2W0BjbGFzcyA9ICdsZW55YS1ib3gtdG9nZ2xlZCddIj4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idG9nZ2xlLXNjcmlwdCIvPgotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgCi0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icGFnZTp0aXRsZSIvPgotICAgICAgICA8dGFibGUgY2xhc3M9ImxlbnlhLWJvZHkiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii8veGh0bWw6ZGl2W0BjbGFzcyA9ICdsZW55YS1zaWRlYmFyJ10iPgotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLXNpZGViYXIiPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLy94aHRtbDpkaXZbQGNsYXNzID0gJ2xlbnlhLXNpZGViYXInXS9ub2RlKCkiLz4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsZW55YS1jb250ZW50Ij4KLSAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwYWdlOmJvZHkvbm9kZSgpW2xvY2FsLW5hbWUoKSAhPSAnZGl2JyBvciBub3QoQGNsYXNzID0gJ2xlbnlhLXNpZGViYXInKV0iLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImkxOG46KiIgbW9kZT0iaHRtbFRpdGxlIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAKiIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCkiIG1vZGU9Imh0bWxUaXRsZSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im5vZGUoKSIgbW9kZT0iaHRtbFRpdGxlIj4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWdlOnRpdGxlIj4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGVueWEtaGVhZGVyIj4KLSAgICAgICAgICA8aDE+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCkiLz48L2gxPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImxlbnlhLXByb2plY3QtbG9nbyI+Ci0gICAgICAgICAgPGltZyBzcmM9Ii9sZW55YS9pbWFnZXMvcHJvamVjdC1sb2dvLXNtYWxsLnBuZyIgYWx0PSJBcGFjaGUgTGVueWEgUHJvamVjdCBMb2dvIi8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtcGFnZS1zdWJ0aXRsZSI+Ci0gICAgICBPcGVuIFNvdXJjZSBDb250ZW50IE1hbmFnZW1lbnQgU3lzdGVtCi0gICAgPC9kaXY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmRpdltAY2xhc3MgPSAnbGVueWEtYm94J10iPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm90dG9tIj4KLSAgICAgICAgPGRpdiBjbGFzcz0ibGVueWEtYm94LWJvdHRvbS1jb250ZW50Ij4mIzE2MDs8L2Rpdj4KLSAgICAgIDwvZGl2PgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmRpdltAY2xhc3MgPSAnbGVueWEtYm94LXRvZ2dsZWQnXSI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJudW1iZXIiIHNlbGVjdD0iY291bnQocHJlY2VkaW5nOjp4aHRtbDpkaXZbQGNsYXNzID0gJ2xlbnlhLWJveC10b2dnbGVkJ10pICsgMSIvPgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqW2xvY2FsLW5hbWUoKSAhPSAnY2xhc3MnXXxub2RlKCkiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibnVtYmVyIiBzZWxlY3Q9IiRudW1iZXIiLz4KLSAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1ib3R0b20iPgotICAgICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtYm90dG9tLWNvbnRlbnQiPiYjMTYwOzwvZGl2PgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmRpdltAY2xhc3MgPSAnbGVueWEtYm94LXRvZ2dsZWQnXS94aHRtbDpkaXZbQGNsYXNzID0gJ2xlbnlhLWJveC10aXRsZSddIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im51bWJlciIvPgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveCI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgPHNwYW4gY2xhc3M9InN3aXRjaCIgb25jbGljaz0idG9nZ2xlKCd7JG51bWJlcn0nKSIgaWQ9InskbnVtYmVyfS1zd2l0Y2giPjxpMThuOnRleHQgaTE4bjprZXk9InNob3ciLz48L3NwYW4+Ci0gICAgPC9kaXY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmRpdltAY2xhc3MgPSAnbGVueWEtYm94LXRvZ2dsZWQnXS94aHRtbDpkaXZbQGNsYXNzID0gJ2xlbnlhLWJveC1ib2R5J10iPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ibnVtYmVyIi8+Ci0gICAgPGRpdiBpZD0ieyRudW1iZXJ9IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZW55YS1ib3gtY29udGVudCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibm9kZSgpIi8+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6ZGl2W0BjbGFzcyA9ICdsZW55YS1ib3gnXS94aHRtbDpkaXZbQGNsYXNzID0gJ2xlbnlhLWJveC1ib2R5J10iPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4KLSAgICAgIDxkaXYgY2xhc3M9ImxlbnlhLWJveC1jb250ZW50Ij4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCkiLz4KLSAgICAgIDwvZGl2PgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSIgcHJpb3JpdHk9Ii0yIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi08L3hzbDpzdHlsZXNoZWV0PiAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL3N0cmluZy1mdW5jdGlvbnMueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvc3RyaW5nLWZ1bmN0aW9ucy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDY4ZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvc3RyaW5nLWZ1bmN0aW9ucy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotCi08IS0tIHNlYXJjaCBhbmQgcmVwbGFjZSBmcm9tIFhTTFQgY29va2Jvb2sgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InNlYXJjaC1hbmQtcmVwbGFjZSI+Ci0gIDx4c2w6cGFyYW0gbmFtZT0iaW5wdXQiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2gtc3RyaW5nIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icmVwbGFjZS1zdHJpbmciLz4KLSAgCi0gIDx4c2w6Y2hvb3NlPgotICAgIDwhLS0gU2VlIGlmIHRoZSBpbnB1dCBjb250YWlucyB0aGUgc2VhcmNoIHN0cmluZyAtLT4KLSAgICA8eHNsOndoZW4gdGVzdD0iJHNlYXJjaC1zdHJpbmcgYW5kIGNvbnRhaW5zKCRpbnB1dCwgJHNlYXJjaC1zdHJpbmcpIj4KLSAgICAgIDwhLS0gSWYgc28sIHRoZW4gY29uY2F0ZW5hdGUgdGhlIHN1YnN0cmluZyBiZWZvcmUgdGhlIHNlYXJjaAotICAgICAgc3RyaW5nIHRvIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgYW5kIHRvIHRoZSByZXN1bHQgb2YKLSAgICAgIHJlY3Vyc2l2ZWx5IGFwcGx5aW5nIHRoaXMgdGVtcGxhdGUgdG8gdGhlIHJlbWFpbmluZyBzdWJzdHJpbmcuCi0gICAgICAtLT4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dCwgJHNlYXJjaC1zdHJpbmcpIi8+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2Utc3RyaW5nIi8+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VhcmNoLWFuZC1yZXBsYWNlIj4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImlucHV0IiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkaW5wdXQsICRzZWFyY2gtc3RyaW5nKSIvPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2VhcmNoLXN0cmluZyIgc2VsZWN0PSIkc2VhcmNoLXN0cmluZyIvPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwbGFjZS1zdHJpbmciIHNlbGVjdD0iJHJlcGxhY2Utc3RyaW5nIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOndoZW4+Ci0gICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICA8IS0tIFRoZXJlIGFyZSBubyBtb3JlIG9jY3VyZW5jZXMgb2YgdGhlIHNlYXJjaCBzdHJpbmcgc28KLSAgICAgIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZyAtLT4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXQiLz4KLSAgICA8L3hzbDpvdGhlcndpc2U+Ci0gIDwveHNsOmNob29zZT4KLSAgCi08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC9zdHJpcF9uYW1lc3BhY2VzLnhzbCBiL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTBiZTFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL3N0cmlwX25hbWVzcGFjZXMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotVGhlIFhIVE1MIG5hbWVzcGFjZSBpcyBkZWNsYXJlZCBhcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLXRvIGNhdXNlIHRoZSBzdHlsZXNoZWV0IHRvIG91dHB1dCBYSFRNTCB1c2luZyB0aGUgZW1wdHkgc3RyaW5nCi1hcyBuYW1lc3BhY2UgcHJlZml4ICg8aHRtbD4gaW5zdGVhZCBvZiA8eGh0bWw6aHRtbD4pLgotLS0+Ci0KLTwhLS0gJElkJCAtLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIAotICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIGluZGVudD0ieWVzIi8+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIqIj4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ie2xvY2FsLW5hbWUoKX0iIG5hbWVzcGFjZT0ie25hbWVzcGFjZS11cmkoKX0iPgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCoiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tIGZpeG1lOiB0aGlzIG1pZ2h0IGJlIGdlbmVyYWxpemVkIHRvIGFsc28gcGFzcyBvbiBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBldGMuLi4tLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tbWVudCgpIj4KLSAgICA8eHNsOmNvcHkvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICA8IS0tCi0gICAgV29ya2Fyb3VuZCB0byBwcmV2ZW50IHRoZSBzZXJpYWxpemVyIGZyb20gY29sbGFwc2luZyB0aGVzZQotICAgIGVsZW1lbnRzLCBzaW5jZSBicm93c2VycyBjdXJyZW50bHkgY2FuIG5vdCBoYW5kbGUgdGhpbmdzIGxpa2UKLSAgICAgIDx0ZXh0YXJlYS8+Ci0gICAgVGhlIFhIVE1MIHNlcmlhbGl6ZXIgY3VycmVudGx5IHVzZWQgYnkgTGVueWEgY2FuIG5vdCBiZQotICAgIGNvbmZpZ3VyZWQgdG8gYXZvaWQgdGhpcyBjb2xsYXBzaW5nOyBhcyBsb25nIGFzIHRoYXQgaXMgdGhlIGNhc2UKLSAgICB0aGlzIHdvcmthcm91bmQgaXMgbmVlZGVkLgotICAgIC0tPiAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHRhcmVhfHNjcmlwdHxzdHlsZSI+Ci0gICA8eHNsOmVsZW1lbnQgbmFtZT0ie2xvY2FsLW5hbWUoKX0iPgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCoiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQkgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguKSA9IDAiPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48L3hzbDppZj4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC90b2dnbGUueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvdG9nZ2xlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2ZDg1ZS4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvd2ViYXBwL2xlbnlhL3hzbHQvdXRpbC90b2dnbGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gJElkOiBwYWdlLXV0aWwueHNsIDQyNzAzIDIwMDQtMDMtMTMgMTI6NTc6NTNaIGdyZWdvciAkIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiDQotICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSINCi0gIHhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMSINCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0b2dnbGUtc2NyaXB0Ij4NCi0gICAgPHNjcmlwdD4NCi0gICAgICBmdW5jdGlvbiB0b2dnbGUoaWQpIHsNCi0gICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7DQotICAgICAgICAgIHdpdGggKGVsZW1lbnQuc3R5bGUpIHsNCi0gICAgICAgICAgICAgIGlmICggZGlzcGxheSA9PSAibm9uZSIgKXsNCi0gICAgICAgICAgICAgICAgICBkaXNwbGF5ID0gIiINCi0gICAgICAgICAgICAgIH0gZWxzZXsNCi0gICAgICAgICAgICAgICAgICBkaXNwbGF5ID0gIm5vbmUiDQotICAgICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdmFyIHRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICItc3dpdGNoIikuZmlyc3RDaGlsZDsNCi0gICAgICAgICAgaWYgKHRleHQubm9kZVZhbHVlID09ICI8aTE4bjp0ZXh0IGkxOG46a2V5PSJzaG93IiAvPiIpIHsNCi0gICAgICAgICAgICAgIHRleHQubm9kZVZhbHVlID0gIjxpMThuOnRleHQgaTE4bjprZXk9ImhpZGUiIC8+IjsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIHRleHQubm9kZVZhbHVlID0gIjxpMThuOnRleHQgaTE4bjprZXk9InNob3ciIC8+IjsNCi0gICAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgPC9zY3JpcHQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi08L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy93ZWJhcHAvbGVueWEveHNsdC91dGlsL3dlbGNvbWUueHNsIGIvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvd2VsY29tZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzhhZDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9sZW55YS94c2x0L3V0aWwvd2VsY29tZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSAkSWQkIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOmxlbnlhPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcHVibGljYXRpb24vMS4xIgotICAgIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgeG1sbnM6aTE4bj0iaHR0cDovL2FwYWNoZS5vcmcvY29jb29uL2kxOG4vMi4xIgotPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvKiI+Ci0gIDxwYWdlOnBhZ2U+Ci0gICAgPHBhZ2U6dGl0bGU+QXBhY2hlIExlbnlhIC0gQ29udGVudCBNYW5hZ2VtZW50IFN5c3RlbTwvcGFnZTp0aXRsZT4KLSAgICA8cGFnZTpoZWFkPgotICAgICAgPHhodG1sOm1ldGEgaHR0cC1lcXVpdj0iY2FjaGUtY29udHJvbCIgY29udGVudD0ibm8tY2FjaGUiLz4KLSAgICAgIDx4aHRtbDptZXRhIGh0dHAtZXF1aXY9InByYWdtYSIgY29udGVudD0ibm8tY2FjaGUiLz4KLSAgICA8L3BhZ2U6aGVhZD4gIAotICAgIDxwYWdlOmJvZHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImxlbnlhOnB1YmxpY2F0aW9ucyIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwYWdlOnBhZ2UiLz4KLSAgICA8L3BhZ2U6Ym9keT4KLSAgPC9wYWdlOnBhZ2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibGVueWE6cHVibGljYXRpb25zIj4KLSAgPGRpdiBjbGFzcz0ibGVueWEtc2lkZWJhciI+Ci0gICAgPGRpdiBjbGFzcz0ibGVueWEtc2lkZWJhci1oZWFkaW5nIj48aTE4bjp0ZXh0PlB1YmxpY2F0aW9uczwvaTE4bjp0ZXh0PjwvZGl2PgotICA8ZGl2IGNsYXNzPSJsZW55YS1wdWJsaWNhdGlvbi1pdGVtLWNyZWF0ZXB1YmxpY2F0aW9uIj4KLSAgICA8YSBocmVmPSJpbmRleC5odG1sP2xlbnlhLnVzZWNhc2U9dGVtcGxhdGluZy5jcmVhdGVQdWJsaWNhdGlvbkZyb21UZW1wbGF0ZSI+Ci0gICAgICA8aTE4bjp0ZXh0PmNyZWF0ZS1wdWJsaWNhdGlvbjwvaTE4bjp0ZXh0PiAmIzE4NzsKLSAgICA8L2E+Ci0gIDwvZGl2PgotICA8IS0tIGRvIG5vdCBsaXN0IHB1YmxpY2F0aW9ucyB3aXRoIEBzaG93PSJmYWxzZSIgCi0gICAgIChjYW4gYmUgdXNlZCB0byBoaWRlIHRlbXBsYXRlIHB1YmxpY2F0aW9ucyAtLT4KLSAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImxlbnlhOnB1YmxpY2F0aW9uW25vdChAc2hvdykgb3IgQHNob3cgIT0gJ2ZhbHNlJ10iPgotICAgIDxkaXYgY2xhc3M9ImxlbnlhLXB1YmxpY2F0aW9uLWl0ZW0iPgotICAgICAgPGE+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGlybmFtZSIvPjx4c2w6dGV4dD4vaW50cm9kdWN0aW9uLmh0bWw8L3hzbDp0ZXh0PjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idGl0bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsZW55YTpkZXNjcmlwdGlvbiIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxlbnlhOm5hbWUiLz4KLSAgICAgIDwvYT4KLSAgICA8L2Rpdj4KLSAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwvZGl2PgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhZ2U6cGFnZSI+Ci0gICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InBhZ2U6Ym9keS8qIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSB3ZSBhcmUgYWdncmV0YXRpbmcgaW50byBhIG5ldyBjb250ZXh0OiAKLSAgICAgKGFub3RoZXIgZ29vZCByZWFzb24gdG8gbW92ZSB0byB4aHRtbDIpIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aDEiPgotICA8aDI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz48L2gyPgotPC94c2w6dGVtcGxhdGU+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpoMiI+Ci0gIDxoMz48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPjwvaDM+Ci08L3hzbDp0ZW1wbGF0ZT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InhodG1sOmgzIj4KLSAgPGg0Pjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+PC9oND4KLTwveHNsOnRlbXBsYXRlPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ieGh0bWw6aDQiPgotICA8aDU+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz48L2g1PgotPC94c2w6dGVtcGxhdGU+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ4aHRtbDpoNXx4aHRtbDpoNiI+Ci0gIDxoNj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPjwvaDY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICA8eHNsOmNvcHk+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz48L3hzbDpjb3B5PgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvd2ViYXBwL3JlYWRtZS54bWwgYi90cnVuay9zcmMvd2ViYXBwL3JlYWRtZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OGFmMTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3dlYmFwcC9yZWFkbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tICRJZDogaW50cm9kdWN0aW9uLnhtbCA0NzM4NjEgMjAwNi0xMS0xMiAwMzo1MToxNFogZ3JlZ29yICQgLS0+Ci0KLTxwYWdlOnBhZ2UgCi0gIHhtbG5zOnBhZ2U9Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9sZW55YS9jbXMtcGFnZS8xLjAiCi0gIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotPgotICA8cGFnZTpoZWFkLz4KLSAgPHBhZ2U6Ym9keT4KLSAgICA8aDE+UkVBRE1FOiBBcGFjaGUgTGVueWE8L2gxPgotPCEtLQotICAgIDxoMj5Ob3RlIHRvIGRldmVsb3BlcnM8L2gyPgotICAgIDxwPgotICAgICAgUGxlYXNlIHVzZSB0aGlzIG5ldyBSRUFETUUgdG8gaW5mb3JtIHVzZXJzCi0gICAgICBhYm91dCBjaGFuZ2VzIGluIHRoZSBjb2RlIG9yIGJlaGF2aW91ciBvZiBMZW55YSwgcGFydGljdWxhcmx5IHRob3NlCi0gICAgICB0aGF0IHJlcXVpcmUgY3VzdG9tIGNvZGUgb3IgcHVibGljYXRpb25zIHRvIGJlIG1vZGlmaWVkLiBUaGlzIGZpbGUgaXMgbG9jYXRlZCB1bmRlcgotICAgICAgPGNvZGU+c3JjL3dlYmFwcC9yZWFkbWUueG1sPC9jb2RlPi4gSXRzIGNvbnRlbnRzIHdpbGwgYmUgc2hvd24gb24gdGhlIGdsb2JhbCAKLSAgICAgIHdlbGNvbWUgcGFnZSwgYW5kIGFsc28gb24gdGhlIGludHJvZHVjdGlvbiBwYWdlIG9mIGV2ZXJ5IHB1YmxpY2F0aW9uLgotICAgIDwvcD4KLS0tPgotICAgIAotICAgIDxoMj5JbXBvcnRhbnQgbm90ZXMgZm9yIGJldGEgdGVzdGVycyBvZiBMZW55YSAyLjA8L2gyPgotCi0gICAgPGgzPjIwMDctMTEtMDg6IFJlZGlyZWN0aW9uIGNoYW5nZXM8L2gzPgotICAgIDxwPgotICAgICAgTW9zdCBvZiBvdXIgc2l0ZW1hcCByZWRpcmVjdHMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gbWFrZSB0aGVtIHdvcmsgd2l0aAotICAgICAgcHJveHkgZW52aXJvbm1lbnRzLiBJZiB5b3Ugbm90aWNlIGFueSByZWdyZXNzaW9ucywgcGxlYXNlIGNvbXBsYWluIHRvCi0gICAgICB0aGUgZGV2IGxpc3QgaW1tZWRpYXRlbHkuCi0gICAgPC9wPgotICAgIDxoMz4yMDA3LTExLTA4OiBOZXcgUHJveHkgdGVzdCBzY2FmZm9sZDwvaDM+Ci0gICAgPHA+Ci0gICAgICBJZiB5b3UgYXJlIGEgZGV2ZWxvcGVyIG9yIGEgdXNlciBpbnRlcmVzdGVkIGluIHByb3h5aW5nLCBwbGVhc2UgdGFrZSBhCi0gICAgICBsb29rIGF0IHRoZSBwcm94eSB0ZXN0IHNjYWZmb2xkIGluIHRvb2xzL3Byb3h5dGVzdCBhbmQgcmVhZCB0aGUKLSAgICAgIFJFQURNRS4gSXQncyBpbXBvcnRhbnQgdG8gcmVndWxhcmx5IHRlc3QgbmV3IGNvZGUgaW4gcHJveGllZAotICAgICAgZW52aXJvbm1lbnRzIGFuZCBub24tcm9vdCBjb250ZXh0cy4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGgzPjIwMDctMDgtMjI6IFVzZXIgbmFtZXMgYXJlIG5vdyBjYXNlIGluc2Vuc2l0aXZlPC9oMz4KLSAgICA8cD4KLSAgICAgIFVzZXIgbmFtZXMgYXJlIG5vdyBjYXNlIGluc2Vuc2l0aXZlIHRvIGJldHRlciBzdXBwb3J0IFdpbmRvd3MsIHVzZXIgYXNzdW1wdGlvbnMsIGF1dG8gZm9ybSAKLSAgICAgIGNvbXBsZXRpb24sIGFuZCBzdXBwb3J0LiBUaGlzIGlzIGRvbmUgYnkgY29udmVydGluZyBhbGwgdXNlciBuYW1lcyB0byBsb3dlciBjYXNlLiBBbnkKLSAgICAgIHByZXZpb3VzbHkgY3JlYXRlZCBhY2NvdW50cyB3aXRoIHVwcGVyIGNhc2UgY2hhcmFjdGVycyB3aWxsIG5vIGxvbmdlciB3b3JrLiBUbyBmaXgKLSAgICAgIGRlbGV0ZSBhbmQgcmVjcmVhdGUgdGhlIGFjY291bnQgdXNpbmcgdGhlIGJ1aWx0IGluIHRvb2xzLiBPciBvcHRpb25hbGx5LCByZW5hbWUgYW55Ci0gICAgICAqLmltbCBmaWxlcyBpbiB5b3VyIHB1YmxpY2F0aW9uJ3MgPGNvZGU+Y29uZmlnL2FjY2Vzcy1jb250cm9sL3Bhc3N3ZDwvY29kZT4gZGlyZWN0b3J5Ci0gICAgICBzbyB0aGF0IHRoZSBmaWxlIG5hbWVzIGFyZSBhbGwgbG93ZXIgY2FzZS4gWW91IHdpbGwgYWxzbyBoYXZlIHRvIGVkaXQgdGhlIDxjb2RlPmlkPC9jb2RlPiAKLSAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+aWRlbnRpdHk8L2NvZGU+IGVsZW1lbnQgdG8gbWFrZSBpdCBsb3dlciBjYXNlIGluIHRob3NlIGZpbGVzIGFzIHdlbGwuCi0gICAgPC9wPgotCi0gICAgPGgzPjIwMDctMDgtMTM6IFdvcmtmbG93IHNjaGVtYSB2YWxpZGF0aW9uIGZpeGVkPC9oMz4KLSAgICA8cD4KLSAgICAgIFRoZSBvbGQgWFNELWJhc2VkIHNjaGVtYSB2YWxpZGF0aW9uIGluIDxjb2RlPndvcmtmbG93LnhtbDwvY29kZT4gd2FzCi0gICAgbmV2ZXIgdXNlZC4gSXQgaGFzIG5vdyBiZWVuIHBvcnRlZCB0byBSTkcgZm9yIGNvbnNpc3RlbmN5IGFuZCBpcyBhcHBsaWVkIHRvIHlvdXIgY3VzdG9tCi0gICAgICB3b3JrZmxvd3MgZHVyaW5nIGRlcGxveW1lbnQuIFlvdSB3aWxsIG5lZWQgdG8gcmVtb3ZlIHRoZQotICAgIDxjb2RlPnhzaTpzY2hlbWFMb2NhdGlvbjwvY29kZT4gYXR0cmlidXRlIChhbmQgeW91IGNhbiB0aGVuIGFsc28gcmVtb3ZlCi0gICAgICB0aGUgPGNvZGU+eG1sbnM6eHNpPC9jb2RlPiBkZWNsYXJhdGlvbikgZnJvbSB5b3VyIGN1c3RvbSBwdWJsaWNhdGlvbnMnCi0gICAgICA8Y29kZT5jb25maWcvd29ya2Zsb3cvd29ya2Zsb3cueG1sPC9jb2RlPiBpZiB5b3UgaGF2ZSBkZWZpbmVkIG9uZS4KLSAgICA8L3A+ICAgIAotICAgIAotICAgIDxoMz4yMDA3LTA4LTEyOiBSZXNvdXJjZSB0eXBlIGNvbmZpZ3VyYXRpb24gY2hhbmdlZDwvaDM+Ci0gICAgPHA+Ci0gICAgICBUaGUgY29uZmlndXJhdGlvbiBzeW50YXggb2YgcmVzb3VyY2UgdHlwZXMgaGFzIGJlZW4gY2hhbmdlZCBmb3IgY29uc2lzdGVuY3kuIAotICAgICAgUGxlYXNlIGFwcGx5IHRoZSBmb2xsb3dpbmcgY2hhbmdlcyB0byB5b3VyIGN1c3RvbSByZXNvdXJjZSB0eXBlIGNvbmZpZ3VyYXRpb25zOgotICAgIDwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxjb2RlPiZsdDtzYW1wbGUtbmFtZSBtaW1lLXR5cGU9ImJheiIgbmFtZT0iYmFyIiZndDtmYWxsYmFjazovL2ZvbyZsdDsvc2FtcGxlLW5hbWUmZ3Q7PC9jb2RlPgotICAgICAgICBiZWNvbWVzCi0gICAgICAgIDxjb2RlPiZsdDtzYW1wbGUgbWltZS10eXBlPSJiYXoiIG5hbWU9ImJhciIgdXJpPSJmYWxsYmFjazovL2ZvbyIvJmd0OzwvY29kZT4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxjb2RlPiZsdDtzY2hlbWEgc3JjPSJmYWxsYmFjazovL2Zvby5ybmciIGxhbmd1YWdlPSJodHRwOi8vcmVsYXhuZy5vcmcvbnMvc3RydWN0dXJlLzAuOSIvJmd0OzwvY29kZT4KLSAgICAgICAgYmVjb21lcwotICAgICAgICA8Y29kZT4mbHQ7c2NoZW1hIHVyaT0iZmFsbGJhY2s6Ly9mb28ucm5nIiBuYW1lc3BhY2U9Imh0dHA6Ly9yZWxheG5nLm9yZy9ucy9zdHJ1Y3R1cmUvMC45Ii8mZ3Q7PC9jb2RlPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICAgIDxwPgotICAgICAgQWZ0ZXIgdGhhdCwgeW91IG5lZWQgdG8gZGVsZXRlCi0gICAgPGNvZGU+YnVpbGQvbGVueWEvd2ViYXBwL1dFQi1JTkYvY29jb29uLnhjb25mPC9jb2RlPiBhbmQgcmVidWlsZCBMZW55YQotICAgICAgdG8gZGVwbG95IHRoZSBjaGFuZ2VzLgotICAgIDwvcD4KLSAgICAKLSAgICA8aDM+MjAwNy0wNy0yNzogUG9saWN5QXV0aG9yaXplciByZW1vdmVkPC9oMz4KLSAgICA8cD4KLSAgICAgIFRoZSBhY2Nlc3MgY29udHJvbCBmb3IgTGVueWEgZG9jdW1lbnRzIGlzIG5vdyBhbHNvIGhhbmRsZWQgYnkgdGhlCi0gICAgVXNlY2FzZUF1dGhvcml6ZXIgdmlhIGEgbmV3bHkgaW50cm9kdWNlZCB1c2VjYXNlICJhYy52aXNpdCIuIEZvciB5b3VyCi0gICAgICBjdXN0b20gcHVibGljYXRpb25zLCB5b3Ugd2lsbCBuZWVkIHRvIGdpdmUgeW91ciB1c2VycyB0aGUgYXBwcm9wcmlhdGUKLSAgICBwZXJtaXNzaW9ucy4gV2Ugc3VnZ2VzdCBjb3B5aW5nIHRoZSA8Y29kZT52aXNpdC5ybWw8L2NvZGU+IHJvbGUgZnJvbSB0aGUgZGVmYXVsdAotICAgICAgcHVibGljYXRpb24uPGJyIC8+Ci0gICAgICBNb3Jlb3ZlciwgYmUgc3VyZSB0byByZW1vdmUgdGhlIDxjb2RlPiZsdDthdXRob3JpemVyCi0gICAgICB0eXBlPSJwb2xpY3kiLyZndDs8L2NvZGU+IGxpbmUgZnJvbSB5b3VyIHB1YmxpY2F0aW9ucycKLSAgICA8Y29kZT5jb25maWcvYWNjZXNzLWNvbnRyb2wvYWNjZXNzLWNvbnRyb2wueG1sPC9jb2RlPi4KLSAgICA8L3A+Ci0gICAgPGgzPjIwMDctMDctMjc6IG5ldyBnZW5lcmljIGVkaXRvciB1c2VjYXNlczwvaDM+Ci0gICAgPHA+Ci0gICAgICBBIG5ldyBnZW5lcmljIHNldCBvZiBlZGl0b3IgaGVscGVyIHVzZWNhc2VzIGhhcyBiZWVuIGludHJvZHVjZWQ6Ci0gICAgPC9wPgotICAgIDx1bD4KLSAgICAgIDxsaT5lZGl0b3JzLmluc2VydExpbms8L2xpPgotICAgICAgPGxpPmVkaXRvcnMuaW5zZXJ0SW1hZ2U8L2xpPgotICAgICAgPGxpPmVkaXRvcnMuaW5zZXJ0QXNzZXQ8L2xpPgotICAgICAgPGxpPmVkaXRvcnMuY3JlYXRlUmVzb3VyY2U8L2xpPgotICAgIDwvdWw+Ci0gICAgPHA+Ci0gICAgICBUaGVzZSBhcmUgbm93IHJlLXVzZWQgYnkgYWxsIGVkaXRvcnMsIHdoaWNoIGdvdCB1cyByaWQgb2YgYSBsb3Qgb2YKLSAgICAgIGNvZGUgZHVwbGljYXRpb24uIEludGVybmV0IEV4cGxvcmVyIHVzZXJzIHdhdGNoIG91dDogaWYgeW91IGhhdmUKLSAgICAgIHByb2JsZW1zIHdpdGggc2VsZWN0aW9ucyBub3Qgd29ya2luZyBwcm9wZXJseSB3aGVuIHVzaW5nIHRob3NlIG5ldwotICAgICAgdXNlY2FzZXMsIHBsZWFzZSBjb21wbGFpbiBvbiB0aGUgZGV2IGxpc3QuCi0gICAgPC9wPgotICAgIAotICAgIDxoMz4yMDA3LTA3LTE5OiA8Y29kZT5taW1lLXR5cGU8L2NvZGU+IGF0dHJpYnV0ZSBmb3IgcmVzb3VyY2UgdHlwZSBzYW1wbGVzPC9oMz4KLSAgICA8cD4KLSAgICAgIFRoZSA8Y29kZT4mbHQ7c2FtcGxlLW5hbWUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiB0aGUgcmVzb3VyY2UgdHlwZSBkZWNsYXJhdGlvbgotICAgICAgbXVzdCBoYXZlIGEgPGNvZGU+bWltZS10eXBlPC9jb2RlPiBhdHRyaWJ1dGUuIFRoaXMgYWxsb3dzIHRoZSBDcmVhdGUgdXNlY2FzZSB0byBpbml0aWFsaXplCi0gICAgICB0aGUgTUlNRSB0eXBlIG9mIHRoZSBkb2N1bWVudCBjb3JyZWN0bHkuCi0gICAgPC9wPgotICAgIAotICAgIDxoMz4yMDA3LTA3LTEyOiA8Y29kZT5wdWJsaWNhdGlvbi54bWwvcHJveGllczwvY29kZT4gd3JhcHBlciBlbGVtZW50IHJlLWludHJvZHVjZWQ8L2gzPgotICAgIDxwPgotICAgICAgVGhlIDxjb2RlPiZsdDtwcm94aWVzJmd0OzwvY29kZT4gd3JhcHBlciBlbGVtZW50IGlzIG5vdyByZXF1aXJlZCBhZ2FpbiBmb3IgY29uc2lzdGVuY3kgcmVhc29ucy4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGgzPgotICAgICAgMjAwNy0wNy0wMzogPGNvZGU+cHVibGljYXRpb24ueG1sL3Byb3hpZXM8L2NvZGU+IHJlcGxhY2VkIGJ5IDxjb2RlPmNvY29vbi54Y29uZi9HbG9iYWxQcm94aWVzPC9jb2RlPgotICAgIDwvaDM+Ci0gICAgPHA+Ci0gICAgICBUaGUgPGNvZGU+Jmx0O3Byb3hpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIDxjb2RlPnB1YmxpY2F0aW9uLnhtbDwvY29kZT4gaXMgbm90Ci0gICAgICBzdXBwb3J0ZWQgYW55bW9yZS4gSW5zdGVhZCwgeW91IGhhdmUgdG8gY29uZmlndXJlIHRoZSA8Y29kZT5HbG9iYWxQcm94aWVzPC9jb2RlPgotICAgICAgc2VydmljZSBlbnRyeSBpbiA8Y29kZT5jb2Nvb24ueGNvbmY8L2NvZGU+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCi0gICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm5hYmJsZS5jb20vLTEuNC0tLVByb3Bvc2FsLS1HbG9iYWwtcHJveHktY29uZmlndXJhdGlvbi10ZjM5OTk0MTEuaHRtbCI+W1Byb3Bvc2FsXSBHbG9iYWwgcHJveHkgY29uZmlndXJhdGlvbjwvYT4uCi0gICAgPC9wPgotICAgIAotICAgIDxoMz4KLSAgICAgIDIwMDctMDYtMjY6IDxjb2RlPmJhc2UtdXJsPC9jb2RlPiBhbmQgPGNvZGU+cHJveHktdXJsPC9jb2RlPiBpbnB1dCBtb2R1bGVzCi0gICAgICByZXBsYWNlZCBieSA8Y29kZT5wcm94eTwvY29kZT4gbW9kdWxlCi0gICAgPC9oMz4KLSAgICA8cD4KLSAgICAgIFRoZSA8Y29kZT5iYXNlLXVybDwvY29kZT4gYW5kIDxjb2RlPnByb3h5LXVybDwvY29kZT4gaW5wdXQgbW9kdWxlcyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgdGhlCi0gICAgICA8Y29kZT5wcm94eTwvY29kZT4gbW9kdWxlLiBUaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIG1vZHVsZSBjb3JyZXNwb25kcyB0byB0aGUgUHJveHlUcmFuc2Zvcm1lcgotICAgICAgd2l0aCBvbmUgZXhjZXB0aW9uOiBJZiB0aGUgPGVtPndlYmFwcFVybDwvZW0+IHBhcmFtZXRlciBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSByb290Ci0gICAgICBwcm94eSBVUkwgKG9yIHRoZSBjb250ZXh0IHByZWZpeCwgcmVzcC4pIGlzIHJldHVybmVkLgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIFVzYWdlOiA8Y29kZT57cHJveHk6e3dlYmFwcFVybH19PC9jb2RlPi4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGgzPjIwMDctMDYtMTM6IEFwcGx5IFByb3h5VHJhbnNmb3JtZXIgYWZ0ZXIgVXVpZFRvVXJsVHJhbnNmb3JtZXI8L2gzPgotICAgIDxwPgotICAgICAgVGhlIHV1aWQydXJsIGFuZCBwcm94eSB0cmFuc2Zvcm1lcnMgbm93IGNvbXBsZW1lbnQgZWFjaCBvdGhlci4gWW91IGhhdmUKLSAgICAgIHRvIGFwcGx5IHRoZSBwcm94eSB0cmFuc2Zvcm1lciByaWdodCBhZnRlciB0aGUgdXVpZDJ1cmwgdHJhbnNmb3JtZXI6Ci0gICAgPC9wPgotICAgIDxwPjxjb2RlPjwhW0NEQVRBWzxtYXA6dHJhbnNmb3JtIHR5cGU9InV1aWQydXJsIi8+Ci08bWFwOnRyYW5zZm9ybSB0eXBlPSJwcm94eSIvPgotLi4uXV0+PC9jb2RlPjwvcD4KLSAgICA8cD4KLSAgICAgIEludGVybmFsIGxpbmtzICh0byBkb2N1bWVudHMsIENTUywgZXRjLikgZG9uJ3QgbmVlZCB0byBjb250YWluIHRoZSBjb250ZXh0IHBhdGgKLSAgICAgIGFueW1vcmUsIHRoaXMgaXMgbm93IGhhbmRsZWQgYnkgdGhlIHByb3h5IHRyYW5zZm9ybWVyLgotICAgIDwvcD4KLSAgICAKLSAgICA8aDM+MjAwNy0wNS0yOTogVXNpbmcgVVVJRC1iYXNlZCBVUkxzIGZvciBuYXZpZ2F0aW9uIGVsZW1lbnRzPC9oMz4KLSAgICA8cD4KLSAgICAgIE5vdyB0aGUgc2l0ZXRyZWUgbW9kdWxlIHVzZXMgPGNvZGU+bGVueWEtZG9jdW1lbnQ6e3V1aWR9PC9jb2RlPiBVUkxzIGZvciBuYXZpZ2F0aW9uIGVsZW1lbnRzLgotICAgICAgQmVjYXVzZSBubyBIVFRQIFVSTHMgYXJlIGV2YWx1YXRlZCBhbnltb3JlLCB5b3UgbmVlZCB0byBwYXNzIHRoZSBkb2N1bWVudCdzIHBhdGggaW5zdGVhZAotICAgICAgb2YgVVJMIHRvIHRoZSBuYXZpZ2F0aW9uIGVsZW1lbnQgY2FsbHMsIGkuZS4gdGhlIHN0ZXAgPGNvZGU+L3s2fTwvY29kZT4gaW4gdGhlIGZvbGxvd2luZyBjYWxsCi0gICAgICBoYXMgdG8gYmUgdGhlIGRvY3VtZW50J3MgcGF0aCBpbiB0aGUgc2l0ZSBzdHJ1Y3R1cmU6IAotICAgIDwvcD4KLSAgICA8cD48Y29kZT48IVtDREFUQVs8bWFwOmdlbmVyYXRlIHNyYz0iY29jb29uOi8vbW9kdWxlcy9zaXRldHJlZS97MX0vezJ9L3szfS97NH0vezV9L3s2fS54bWw+XV0+PC9jb2RlPjwvcD4KLSAgICAKLSAgICA8aDM+MjAwNy0wNS0yNTogQ29udmVydGVkICJBYm91dCBMZW55YSIgcGFnZSB0byB1c2VjYXNlPC9oMz4KLSAgICA8cD4KLSAgICAgIFRvIGVuYWJsZSB0aGUgIkFib3V0IExlbnlhIiB1c2VjYXNlLCBwbGVhc2Ugc2V0IHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIDxjb2RlPmFkbWluLmFib3V0TGVueWE8L2NvZGU+Ci0gICAgICB1c2VjYXNlIGluIHlvdXIgPGNvZGU+Y29uZmlnL2FjY2Vzcy1jb250cm9sL3VzZWNhc2UtcG9saWNpZXMueG1sPC9jb2RlPiBmaWxlLCBvciB1c2UgdGhlCi0gICAgICB0YWIgIlVzZWNhc2VzIiBpbiB0aGUgYWRtaW5pc3RyYXRpb24gR1VJLgotICAgIDwvcD4KLSAgICAKLSAgICA8aDM+MjAwNy0wNS0wODogRml4ZWQgPGNvZGU+Y3JlYXRlLXVzZS1jYXNlPC9jb2RlPiBhdHRyaWJ1dGU8L2gzPgotICAgIDxwPgotICAgICAgVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5jcmVhdGUtdXNlLWNhc2U8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+dXNlci10eXBlPC9jb2RlPgotICAgICAgZWxlbWVudCBpbiA8Y29kZT5hY2Nlc3MtY29udHJvbC54bWw8L2NvZGU+IHdhcyBpbnZhbGlkLiBUaGUgYWRtaW4gYXJlYSBkaWRuJ3QgdXNlCi0gICAgICB0aGlzIGF0dHJpYnV0ZSB5ZXQuIFNpbmNlIHRoaXMgaGFzIGJlZW4gZml4ZWQsIHlvdSBoYXZlIHRvIHVwZGF0ZSB5b3VyCi0gICAgICA8Y29kZT4kUFVCX0hPTUUvY29uZmlnL2FjY2Vzcy1jb250cm9sL2FjY2Vzcy1jb250cm9sLnhtbDwvY29kZT4gZmlsZXM6Ci0gICAgPC9wPgotICAgIDxwPjxjb2RlPjwhW0NEQVRBWzx1c2VyLXR5cGUgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuYWMuZmlsZS5GaWxlVXNlciIKLSAgICBjcmVhdGUtdXNlLWNhc2U9ImFkbWluLmFkZFVzZXIiPkxvY2FsIFVzZXI8L3VzZXItdHlwZT5dXT48L2NvZGU+PC9wPgotICAgIAotICAgIDxoMz4yMDA3LTA1LTA1OiBJbnRyb2R1Y2VkIDxjb2RlPndvcmtmbG93Lm11bHRpV29ya2Zsb3dJbnZva2U8L2NvZGU+IHVzZWNhc2U8L2gzPgotICAgIDxwPgotICAgICAgUGxlYXNlIGFkZCB0aGUgcGVybWlzc2lvbnMgZm9yIHRoaXMgdXNlY2FzZSB0byB5b3VyCi0gICAgICA8Y29kZT5jb25maWcvYWNjZXNzLWNvbnRyb2wvdXNlY2FzZS1wb2xpY2llcy54bWw8L2NvZGU+IGZpbGUsIG9yIHVzZSB0aGUKLSAgICAgIHRhYiAiVXNlY2FzZXMiIGluIHRoZSBhZG1pbmlzdHJhdGlvbiBHVUkuCi0gICAgPC9wPgotICAgIAotICAgIDxoMz4yMDA3LTA0LTMwOiBSZW5hbWVkCi0gICAgICA8Y29kZT4kUFVCX0hPTUUvY29uZmlnL3B1YmxpY2F0aW9uLnhjb25mPC9jb2RlPiB0byA8Y29kZT5wdWJsaWNhdGlvbi54bWw8L2NvZGU+PC9oMz4KLSAgICAKLSAgICA8cD4KLSAgICAgIFBsZWFzZSByZW5hbWUgeW91ciA8Y29kZT4kUFVCX0hPTUUvY29uZmlnL3B1YmxpY2F0aW9uLnhjb25mPC9jb2RlPiBmaWxlIHRvCi0gICAgICA8Y29kZT4kUFVCX0hPTUUvY29uZmlnL3B1YmxpY2F0aW9uLnhtbDwvY29kZT4uCi0gICAgICBUaGlzIGNoYW5nZSB3YXMgZG9uZSB0byBwcmVzZXJ2ZSBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBjb25maWd1cmF0aW9uIGZpbGUgbmFtZXMuCi0gICAgPC9wPgotICAgIAotICAgIDxoMz4yMDA3LTA0LTIzOiBNb3ZlZCBhbmQgcmVuYW1lZAotICAgIDxjb2RlPiRQVUJfSE9NRS9jb25maWcvbHVjZW5lX2luZGV4Lnhjb25mPC9jb2RlPjwvaDM+Ci0gICAgCi0gICAgPHA+Ci0gICAgICBQbGVhc2UgbW92ZSBhbmQgcmVuYW1lIHlvdXIgPGNvZGU+JFBVQl9IT01FL2NvbmZpZy9sdWNlbmVfaW5kZXgueGNvbmY8L2NvZGU+IGZpbGUgdG8KLSAgICAgIDxjb2RlPiRQVUJfSE9NRS9jb25maWcvc2VhcmNoL2x1Y2VuZV9pbmRleC54bWw8L2NvZGU+LgotICAgICAgVGhpcyBjaGFuZ2Ugd2FzIGRvbmUgdG8gcHJlc2VydmUgY29uc2lzdGVuY3kgd2l0aCB0aGUgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlIG5hbWVzIGFuZCBsb2NhdGlvbnMuCi0gICAgPC9wPgotICAgIAotICAgIDxoMz4yMDA3LTA0LTIzOiBNb3ZlZCA8Y29kZT4kTU9EVUxFX0hPTUUvbW9kdWxlLnhtbDwvY29kZT48L2gzPgotICAgIAotICAgIDxwPgotICAgICAgSWYgeW91IGFyZSB1c2luZyBjdXN0b20gbW9kdWxlcywgcGxlYXNlIG1vdmUgeW91ciA8Y29kZT5tb2R1bGUueG1sPC9jb2RlPiBmaWxlIGludG8gdGhlCi0gICAgICA8Y29kZT5jb25maWcvPC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhlIG1vZHVsZSAoY3JlYXRlIG9uZSBpZiBuZWNlc3NhcnkpLgotICAgICAgVGhpcyBjaGFuZ2Ugd2FzIGRvbmUgdG8gcHJlc2VydmUgY29uc2lzdGVuY3kgd2l0aCB0aGUgPGNvZGU+cHVibGljYXRpb24ueG1sPC9jb2RlPiBsb2NhdGlvbi4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGgzPjIwMDctMDQtMTg6IDxjb2RlPmFjLzwvY29kZT4gaXMgbm93IDxjb2RlPmFjY2Vzcy1jb250cm9sLzwvY29kZT48L2gzPgotICAgIDxwPgotICAgICAgSW4gb3JkZXIgdG8gbWFrZSB0aGUgTGVueWEgcHVibGljYXRpb24gY29uZmlndXJhdGlvbiBtb3JlCi0gICAgICBzZWxmLWV4cGxhbmF0b3J5LCB0aGUgZGlyZWN0b3J5IDxjb2RlPiRQVUJfSE9NRS9jb25maWcvYWM8L2NvZGU+IGhhcwotICAgICAgYmVlbiByZW5hbWVkIHRvIDxjb2RlPiRQVUJfSE9NRS9jb25maWcvYWNjZXNzLWNvbnRyb2w8L2NvZGU+LgotICAgICAgQWRkaXRpb25hbGx5LCB0aGUgYWNjZXNzIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmaWxlIGhhcyBiZWVuIHJlbmFtZWQKLSAgICAgIGZyb20gPGNvZGU+YWMueGNvbmY8L2NvZGU+IHRvIDxjb2RlPmFjY2Vzcy1jb250cm9sLnhtbDwvY29kZT4uPGJyIC8+Ci0gICAgICBZb3Ugd2lsbCBoYXZlIHRvIGNoYW5nZSB5b3VyIGN1c3RvbSBwdWJsaWNhdGlvbnMgYWNjb3JkaW5nbHkuIERvbid0Ci0gICAgICBmb3JnZXQgdG8gY2hhbmdlIHRoZSBwYXRoIHNldHRpbmdzIGluIDxjb2RlPmFjY2Vzcy1jb250cm9sLnhtbDwvY29kZT4gYXMgd2VsbCEKLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICA8ZW0+Tm90ZSB0aGUgbmV3IHN1ZmZpeCEgRnJvbSBub3cgb24sICJ4Y29uZiIgd2lsbCBvbmx5IGJlIHVzZWQgZm9yIHBhdGNoZmlsZXMKLSAgICAgIHRoYXQgYXJlIGludGVncmF0ZWQgaW50byBjb2Nvb24ueGNvbmYgYXQgYnVpbGQgdGltZS4gQWxsIG90aGVyCi0gICAgICBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgYXJlIHBhcnNlZCBkaXJlY3RseSBzaG91bGQgZW5kIGluIC54bWwuPC9lbT4KLSAgICA8L3A+Ci0gICAgCi0gICAgPGgzPjIwMDctMDQtMTM6IFlvdSBuZWVkIHRvIHVwZGF0ZSB5b3VyIGN1c3RvbSA8Y29kZT5wdWJsaWNhdGlvbi54Y29uZjwvY29kZT4gZmlsZXMhPC9oMz4KLSAgICA8cD4KLSAgICAgIEFzIG9mIHJldmlzaW9uIDUyODQ5MCwgdGhlIGZpbGUgPGNvZGU+JFBVQl9IT01FL3B1YmxpY2F0aW9uLnhtbDwvY29kZT4KLSAgICAgIGlzIG5vIGxvbmdlciB1c2VkLiBJdHMgY29udGVudHMgc2hvdWxkIGJlIG1lcmdlZCBpbnRvIDxjb2RlPiRQVUJfSE9NRS9jb25maWcvcHVibGljYXRpb24ueGNvbmYuPC9jb2RlPgotICAgICAgVG8gYWNjb21vZGF0ZSB0aGlzLCB0aGUgZm9ybWF0IG9mIDxjb2RlPnB1YmxpY2F0aW9uLnhjb25mPC9jb2RlPiBoYXMgY2hhbmdlZCBhIGJpdCAoc2VlCi0gICAgICBiZWxvdykuPGJyIC8+Ci0gICAgICBTb3JyeSBmb3IgdGhlIGJyZWFrYWdlLCBidXQgd2Ugd2VyZSBhYmxlIHRvIGVsaW1pbmF0ZSBhIGxvdCBvZiBvbGQgYWQtaG9jIGNvZGUKLSAgICAgIGFuZCBkdXBsaWNhdGlvbiB3aXRoIHRoaXMgY2hhbmdlLCBhbmQgdGhlIG5ldyB4Y29uZiBmaWxlIGxvb2tzIGEgbG90IG5pY2VyIGFuZCBtb3JlIGludHVpdGl2ZS4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICA8ZW0+TW9zdCBpbXBvcnRhbnQgY2hhbmdlczo8L2VtPiBBbGwgZWxlbWVudHMgaW4gPGNvZGU+cHVibGljYXRpb24ueGNvbmY8L2NvZGU+IAotICAgICAgbXVzdCBub3cgYmUgaW4gdGhlIG5hbWVzcGFjZSA8Y29kZT5odHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvcHVibGljYXRpb24vMS4xPC9jb2RlPiwKLSAgICAgIGFuZCA8Y29kZT4mbHQ7bW9kdWxlLyZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7cHJveHkvJmd0OzwvY29kZT4sIGFuZCAKLSAgICAgIDxjb2RlPiZsdDtyZXNvdXJjZS10eXBlJmd0OzwvY29kZT4gZWxlbWVudHMgbXVzdCBub3cgYmUgZ3JvdXBlZCAKLSAgICAgIGluIDxjb2RlPiZsdDttb2R1bGVzLyZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7cHJveGllcy8mZ3Q7PC9jb2RlPiwgCi0gICAgICBhbmQgPGNvZGU+Jmx0O3Jlc291cmNlLXR5cGVzLyZndDs8L2NvZGU+LiBTZWUgdGhlIGRlZmF1bHQgcHVibGljYXRpb24KLSAgICAgIGZvciBhbiBleGFtcGxlLjxiciAvPgotICAgICAgWW91IGNhbiB1c2UgdGhlIFJORyBzY2hlbWEgYXQgPGNvZGU+c3JjL3Jlc291cmNlcy9idWlsZC9wdWJsaWNhdGlvbi5ybmc8L2NvZGU+Ci0gICAgICB0byB2ZXJpZnkgdGhhdCB5b3VyIGZpbGUgaXMgY29ycmVjdDoKLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICA8Y29kZT4KLSAgICAgICAgY2QgJExFTllBX0hPTUU8YnIgLz4KLSAgICAgICAgamF2YSAtamFyIGxpYi9qaW5nLTIwMDMwNjE5LmphciBcPGJyIC8+Ci0gICAgICAgICYjMTYwOyYjMTYwO3NyYy9yZXNvdXJjZXMvYnVpbGQvcHVibGljYXRpb24ucm5nIFw8YnIgLz4KLSAgICAgICAgJiMxNjA7JiMxNjA7JFlPVVJQVUIvY29uZmlnL3B1YmxpY2F0aW9uLnhjb25mCi0gICAgICA8L2NvZGU+Ci0gICAgPC9wPgotICAgIDxoMz5OZXcgcGVyLXB1YmxpY2F0aW9uIDxjb2RlPnJlYWRtZS54bWw8L2NvZGU+PC9oMz4KLSAgICA8cD4KLSAgICAgIElmIHlvdSB3YW50IHRvIHByb3ZpZGUgYSBjdXN0b20gUkVBRE1FIGZvciB5b3VyIHB1YmxpY2F0aW9uIChtYXliZSB5b3UKLSAgICAgIGhhdmUgdXNlZCB0aGUgb2xkICZsdDtsZW55YTpyZWFkbWUvJmd0OyBpbiB0aGUgbm93IGdvbmUKLSAgICAgIHB1YmxpY2F0aW9uLnhjb25mKSwgeW91IGNhbiBwdXQgaXQgaW4gPGNvZGU+JFlPVVJQVUIvcmVhZG1lLnhtbDwvY29kZT4uIAotICAgICAgSXQgaXMgbm93IGEgc3RhbmRhcmQgTGVueWEgQ01TIHBhZ2UgaW4gdGhlCi0gICAgICA8Y29kZT5odHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vbGVueWEvY21zLXBhZ2UvMS4wPC9jb2RlPiBuYW1lc3BhY2UuCi0gICAgPC9wPiAgCi0gIDwvcGFnZTpib2R5PgotPC9wYWdlOnBhZ2U+CmRpZmYgLS1naXQgYS90cnVuay90b29scy9hbnR0YXNrcy9SRUFETUUudHh0IGIvdHJ1bmsvdG9vbHMvYW50dGFza3MvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3NWQ5OS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9hbnR0YXNrcy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0YXNrcyB3aGljaCBhcmUgbmVlZGVkIGZvciB0aGUgYnVpbGQgcHJvY2Vzcy4KLQotQnVpbGQgdGhlc2UgdGFza3MgKGluIGNhc2Ugb2YgYW4gdXBkYXRlKSB3aXRoCi0KLS4vYnVpbGQuc2ggY29tcGlsZS1idWlsZC10YXNrcwotCi1SZWxhdGVkOgotCi0gIGh0dHA6Ly9hbnRpbnN0YWxsZXIuc291cmNlZm9yZ2UubmV0LwpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYW50dGFza3MvYnVpbGQvY2xhc3Nlcy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hbnQvQnVsa0NvcHlUYXNrLmNsYXNzIGIvdHJ1bmsvdG9vbHMvYW50dGFza3MvYnVpbGQvY2xhc3Nlcy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hbnQvQnVsa0NvcHlUYXNrLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjNhNjA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0J1bGtDb3B5VGFzay5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0NvcHlKYXZhU291cmNlc1Rhc2suY2xhc3MgYi90cnVuay90b29scy9hbnR0YXNrcy9idWlsZC9jbGFzc2VzL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9Db3B5SmF2YVNvdXJjZXNUYXNrLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGViNTJkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0NvcHlKYXZhU291cmNlc1Rhc2suY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9hbnR0YXNrcy9idWlsZC9jbGFzc2VzL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9Db3B5UHVibGljYXRpb25zVGFzay5jbGFzcyBiL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0NvcHlQdWJsaWNhdGlvbnNUYXNrLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2NlMWZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0NvcHlQdWJsaWNhdGlvbnNUYXNrLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYW50dGFza3MvYnVpbGQvY2xhc3Nlcy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hbnQvR2VuZXJhdGVNb2R1bGVMaXN0LmNsYXNzIGIvdHJ1bmsvdG9vbHMvYW50dGFza3MvYnVpbGQvY2xhc3Nlcy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hbnQvR2VuZXJhdGVNb2R1bGVMaXN0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNhMDkwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0dlbmVyYXRlTW9kdWxlTGlzdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0phdmFGaWxlbmFtZUZpbHRlci5jbGFzcyBiL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0phdmFGaWxlbmFtZUZpbHRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlOTk3Ni4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9hbnR0YXNrcy9idWlsZC9jbGFzc2VzL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9KYXZhRmlsZW5hbWVGaWx0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9hbnR0YXNrcy9idWlsZC9jbGFzc2VzL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9TQ01GaWxlbmFtZUZpbHRlci5jbGFzcyBiL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L1NDTUZpbGVuYW1lRmlsdGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzNlZTBjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L1NDTUZpbGVuYW1lRmlsdGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYW50dGFza3MvYnVpbGQvY2xhc3Nlcy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hbnQvVHdvVHVwbGUuY2xhc3MgYi90cnVuay90b29scy9hbnR0YXNrcy9idWlsZC9jbGFzc2VzL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9Ud29UdXBsZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5OWY1Yi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9hbnR0YXNrcy9idWlsZC9jbGFzc2VzL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9Ud29UdXBsZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS94bWwvQW50RG9jdW1lbnRIZWxwZXIuY2xhc3MgYi90cnVuay90b29scy9hbnR0YXNrcy9idWlsZC9jbGFzc2VzL29yZy9hcGFjaGUvbGVueWEveG1sL0FudERvY3VtZW50SGVscGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzg2OGMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL2J1aWxkL2NsYXNzZXMvb3JnL2FwYWNoZS9sZW55YS94bWwvQW50RG9jdW1lbnRIZWxwZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0J1bGtDb3B5VGFzay5qYXZhIGIvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9CdWxrQ29weVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2NWMyZi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0J1bGtDb3B5VGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZDogQnVsa0NvcHlUYXNrLmphdmEgNDE2MDU4IDIwMDYtMDYtMjEgMTg6MjQ6MDVaIGFuZHJlYXMgJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi0vKioKLSAqIENvcGllcyBhbGwgZmlsZXMgbWF0Y2hpbmcgZmlsZW5hbWUgb3IgYSBhbGwgc3BlY2lmaWZlZCBmaWxlc2V0cyBmcm9tIGVhY2ggc291cmNlIGRpcmVjdG9yeS4KLSAqIDxici8+PGJyLz4KLSAqIFVzYWdlOgotICogJmx0O2J1bGtDb3B5IAotICogICAgIHNvdXJjZWRpcnM9ImRpck9uZTpkaXJUd28iIAotICogICAgIHRvZGlyPSJXRUItSU5GLyIgCi0gKiAgICAgZmxhdHRlbj0idHJ1ZSI+Ci0gKiAgICAgJmx0O2ZpbGVzZXQgaW5jbHVkZXM9ImphdmEvbGliLyoiLyZndDsKLSAqICZsdDsvYnVsa0NvcHkmZ3Q7Ci0gKiA8YnIvPjxici8+Ci0gKiBUaGUgYWJvdmUgc2FtcGxlIGNvcGllcyA8ZW0+ZGlyT25lL2phdmEvbGliLyo8L2VtPiBhbmQgPGVtPmRpclR3by9qYXZhL2xpYi8qPC9lbT4KLSAqIHRvIDxlbT5XRUItSU5GL2xpYjwvZW0+LiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWxrQ29weVRhc2sgZXh0ZW5kcyBDb3B5IHsKLSAgICAKLSAgICBwcml2YXRlIFBhdGggc291cmNlRGlyczsKLSAgICAKLSAgICAvKiogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db3B5I2V4ZWN1dGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgc291cmNlRGlyVG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcih0aGlzLnNvdXJjZURpcnMudG9TdHJpbmcoKSwgRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIAotICAgICAgICB3aGlsZSAoc291cmNlRGlyVG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZURpciA9IHNvdXJjZURpclRva2Vucy5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8Z2V0RmlsZVNldHMoKS5zaXplKCk7IGkrKykKLSAgICAgICAgICAgICAgICAoKEZpbGVTZXQpIGdldEZpbGVTZXRzKCkuZ2V0KGkpKS5zZXREaXIobmV3IEZpbGUoc291cmNlRGlyKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBfc291cmNlRGlycyBDb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBzb3VyY2UgZGlyZWN0b3JpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VEaXJzKFBhdGggX3NvdXJjZURpcnMpIHsKLSAgICAgICAgdGhpcy5zb3VyY2VEaXJzID0gX3NvdXJjZURpcnM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlsZVNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgZ2V0RmlsZVNldHMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5maWxlc2V0czsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9Db3B5SmF2YVNvdXJjZXNUYXNrLmphdmEgYi90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0NvcHlKYXZhU291cmNlc1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0YjJkMi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0NvcHlKYXZhU291cmNlc1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkOiBDb3B5SmF2YVNvdXJjZXNUYXNrLmphdmEgNDE2MDU5IDIwMDYtMDYtMjEgMTg6Mjc6MjdaIGFuZHJlYXMgJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi0vKioKLSAqIFRhc2sgdG8gY29weSBqYXZhIHNvdXJjZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5SmF2YVNvdXJjZXNUYXNrIGV4dGVuZHMgVGFzayB7Ci0KLSAgICBwcml2YXRlIFBhdGggcHVic1Jvb3REaXJzOwotICAgIHByaXZhdGUgU3RyaW5nIGphdmFEaXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBudW1iZXJPZkRpcmVjdG9yaWVzQ3JlYXRlZCA9IDA7Ci0gICAgICAgIGludCBudW1iZXJPZkZpbGVzQ29waWVkID0gMDsKLSAgICAgICAgVHdvVHVwbGUgdHdvVHVwbGUgPSBuZXcgVHdvVHVwbGUobnVtYmVyT2ZEaXJlY3Rvcmllc0NyZWF0ZWQsIG51bWJlck9mRmlsZXNDb3BpZWQpOwotCi0gICAgICAgIFN0cmluZyB0cmFuc2xhdGVkQnVpbGREaXIgPSBQcm9qZWN0LnRyYW5zbGF0ZVBhdGgodGhpcy5idWlsZERpcik7Ci0gICAgICAgIEZpbGUgYWJzb2x1dGVCdWlsZERpciA9IG51bGw7Ci0gICAgICAgIGlmICh0cmFuc2xhdGVkQnVpbGREaXIgIT0gbnVsbCAmJiB0cmFuc2xhdGVkQnVpbGREaXIuc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgIGFic29sdXRlQnVpbGREaXIgPSBuZXcgRmlsZSh0cmFuc2xhdGVkQnVpbGREaXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWJzb2x1dGVCdWlsZERpciA9IG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHRyYW5zbGF0ZWRCdWlsZERpcik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRoaXMucHVic1Jvb3REaXJzLnRvU3RyaW5nKCksIEZpbGUucGF0aFNlcGFyYXRvcik7Ci0KLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHB1YnNSb290RGlyID0gc3QubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIEZpbGUgcGF0aCA9IG5ldyBGaWxlKHB1YnNSb290RGlyKTsKLQotICAgICAgICAgICAgaWYgKHBhdGguaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgcHVibGljYXRpb24KLSAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUocGF0aCwgIi9jb25maWcvcHVibGljYXRpb24ueG1sIikuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29weUNvbnRlbnRPZkRpcihuZXcgRmlsZShwYXRoLCB0aGlzLmphdmFEaXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlQnVpbGREaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvVHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFGaWxlbmFtZUZpbHRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIG1vZHVsZQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3IEZpbGUocGF0aCwgIi9jb25maWcvbW9kdWxlLnhtbCIpLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlDb250ZW50T2ZEaXIobmV3IEZpbGUocGF0aCwgdGhpcy5qYXZhRGlyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJ1aWxkRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3b1R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKYXZhRmlsZW5hbWVGaWx0ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogTG9vayBmb3IgcHVibGljYXRpb25zIGRlZmluZWQgYnkgdGhlIGZpbGUgInB1YmxpY2F0aW9uLnhtbCIgb3IgbW9kdWxlcwotICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIGJ5IHRoZSBmaWxlICJtb2R1bGUueG1sIgotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwdWJzID0gcGF0aC5saXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwdWJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVicy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcHViSmF2YURpciA9IG5ldyBGaWxlKHBhdGgsIG5ldyBGaWxlKHB1YnNbaV0sIHRoaXMuamF2YURpcikudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5Q29udGVudE9mRGlyKHB1YkphdmFEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJ1aWxkRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvVHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YUZpbGVuYW1lRmlsdGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBzdWNoIGRpcmVjdG9yeTogIiArIHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbnVtYmVyT2ZEaXJlY3Rvcmllc0NyZWF0ZWQgPSB0d29UdXBsZS54OwotICAgICAgICBudW1iZXJPZkZpbGVzQ29waWVkID0gdHdvVHVwbGUueTsKLSAgICAgICAgbG9nKCJDb3B5aW5nICIgKyBudW1iZXJPZkRpcmVjdG9yaWVzQ3JlYXRlZCArICIgZGlyZWN0b3JpZXMgdG8gIiArIGFic29sdXRlQnVpbGREaXIsCi0gICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgIGxvZygiQ29weWluZyAiICsgbnVtYmVyT2ZGaWxlc0NvcGllZCArICIgZmlsZXMgdG8gIiArIGFic29sdXRlQnVpbGREaXIsIFByb2plY3QuTVNHX0lORk8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgZGlyZWN0b3J5ICJzb3VyY2UiIGludG8gdGhlIGRpcmVjdG9yeSAiZGVzdGluYXRpb24iCi0gICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5Ci0gICAgICogQHBhcmFtIHR3b1R1cGxlIFRoZSB0d29UdXBsZSB0byB1c2UKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWVGaWx0ZXIgVGhlIGZpbGVuYW1lIGZpbHRlciB0byBhcHBseQotICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0YXNrCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdGluYXRpb24sIFR3b1R1cGxlIHR3b1R1cGxlLAotICAgICAgICAgICAgRmlsZW5hbWVGaWx0ZXIgZmlsZW5hbWVGaWx0ZXIsIFRhc2sgY2xpZW50KSB7Ci0gICAgICAgIEZpbGUgYWN0dWFsRGVzdGluYXRpb24gPSBuZXcgRmlsZShkZXN0aW5hdGlvbiwgc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgIGFjdHVhbERlc3RpbmF0aW9uLm1rZGlycygpOwotICAgICAgICBjb3B5Q29udGVudE9mRGlyKHNvdXJjZSwgYWN0dWFsRGVzdGluYXRpb24sIHR3b1R1cGxlLCBmaWxlbmFtZUZpbHRlciwgY2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgaW50byBhbm90aGVyIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSB0d29UdXBsZSBUaGUgdHdvVHVwbGUgdG8gdXNlCi0gICAgICogQHBhcmFtIGZpbGVuYW1lRmlsdGVyIFRoZSBmaWxlbmFtZSBmaWx0ZXIgdG8gdXNlCi0gICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRhc2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUNvbnRlbnRPZkRpcihGaWxlIHNvdXJjZSwgRmlsZSBkZXN0aW5hdGlvbiwgVHdvVHVwbGUgdHdvVHVwbGUsCi0gICAgICAgICAgICBGaWxlbmFtZUZpbHRlciBmaWxlbmFtZUZpbHRlciwgVGFzayBjbGllbnQpIHsKLSAgICAgICAgaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlczsKLQotICAgICAgICAgICAgaWYgKGZpbGVuYW1lRmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaWxlcyA9IHNvdXJjZS5saXN0KGZpbGVuYW1lRmlsdGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmlsZXMgPSBzb3VyY2UubGlzdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc291cmNlLCBmaWxlc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjb3B5RmlsZShmaWxlLCBuZXcgRmlsZShkZXN0aW5hdGlvbiwgZmlsZXNbaV0pLCB0d29UdXBsZSwgY2xpZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29weUNvbnRlbnRPZkRpcihmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRlc3RpbmF0aW9uLCBmaWxlc1tpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvVHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjbGllbnQubG9nKCJDb3B5SmF2YVNvdXJjZXNUYXNrLmNvcHlDb250ZW50T2ZEaXIoKTogTmVpdGhlciBmaWxlIG5vciBkaXJlY3Rvcnk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGludG8gYW5vdGhlciBmaWxlCi0gICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGZpbGUgKG5vdCBhIGRpcmVjdG9yeSEpCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIEZpbGUgKG5vdCBhIGRpcmVjdG9yeSEpCi0gICAgICogQHBhcmFtIHR3b1R1cGxlIFRoZSB0d29UdXBsZSB0byB1c2UKLSAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgdGFzawotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RmlsZShGaWxlIHNvdXJjZSwgRmlsZSBkZXN0aW5hdGlvbiwgVHdvVHVwbGUgdHdvVHVwbGUsIFRhc2sgY2xpZW50LAotICAgICAgICAgICAgYm9vbGVhbiBmb3JjZSkgewotICAgICAgICBpZiAoc291cmNlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICBGaWxlIHBhcmVudERlc3QgPSBuZXcgRmlsZShkZXN0aW5hdGlvbi5nZXRQYXJlbnQoKSk7Ci0KLSAgICAgICAgICAgIGlmICghcGFyZW50RGVzdC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHBhcmVudERlc3QubWtkaXJzKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZEaXJlY3Rvcmllc0NyZWF0ZWQgPSB0d29UdXBsZS54OwotICAgICAgICAgICAgICAgIG51bWJlck9mRGlyZWN0b3JpZXNDcmVhdGVkKys7Ci0gICAgICAgICAgICAgICAgdHdvVHVwbGUueCA9IG51bWJlck9mRGlyZWN0b3JpZXNDcmVhdGVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVzdGluYXRpb24uaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb24ubGFzdE1vZGlmaWVkKCkgPiBzb3VyY2UubGFzdE1vZGlmaWVkKCkgJiYgIWZvcmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSAtMTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gaW4ucmVhZChidWZmZXIpKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcih3cml0ZXIpKTsKLSAgICAgICAgICAgICAgICBjbGllbnQubG9nKCJFeGNlcHRpb24gY2F1Z2h0OiAiICsgd3JpdGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHdyaXRlcikpOwotICAgICAgICAgICAgICAgIGNsaWVudC5sb2coIkV4Y2VwdGlvbiBjYXVnaHQ6ICIgKyB3cml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHdyaXRlcikpOwotICAgICAgICAgICAgICAgICAgICBjbGllbnQubG9nKCJFeGNlcHRpb24gY2xvc2luZyBzdHJlYW06ICIgKyB3cml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgbnVtYmVyT2ZGaWxlc0NvcGllZCA9IHR3b1R1cGxlLnk7Ci0gICAgICAgICAgICBudW1iZXJPZkZpbGVzQ29waWVkKys7Ci0gICAgICAgICAgICB0d29UdXBsZS55ID0gbnVtYmVyT2ZGaWxlc0NvcGllZDsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xpZW50LmxvZygiTm8gc3VjaCBmaWxlOiAiICsgc291cmNlLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSByb290IHB1YmxpY2F0aW9uIHJvb3QgZGlyZWN0b3JpZXMKLSAgICAgKiBAcGFyYW0gX3B1YnNSb290RGlycyBUaGUgcm9vdCBkaXJlY3RvcmllcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFB1YnNSb290RGlycyhQYXRoIF9wdWJzUm9vdERpcnMpIHsKLSAgICAgICAgdGhpcy5wdWJzUm9vdERpcnMgPSBfcHVic1Jvb3REaXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgamF2YSBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gX2phdmFEaXIgVGhlIGphdmEgZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YURpcihTdHJpbmcgX2phdmFEaXIpIHsKLSAgICAgICAgdGhpcy5qYXZhRGlyID0gX2phdmFEaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBidWlsZCBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gX2J1aWxkRGlyIFRoZSBidWlsZCBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZERpcihTdHJpbmcgX2J1aWxkRGlyKSB7Ci0gICAgICAgIHRoaXMuYnVpbGREaXIgPSBfYnVpbGREaXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9Db3B5UHVibGljYXRpb25zVGFzay5qYXZhIGIvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9Db3B5UHVibGljYXRpb25zVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWFmMzg3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL3NyYy9vcmcvYXBhY2hlL2xlbnlhL2Ntcy9hbnQvQ29weVB1YmxpY2F0aW9uc1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyogJElkOiBDb3B5UHVibGljYXRpb25zVGFzay5qYXZhIDQxNjA1OCAyMDA2LTA2LTIxIDE4OjI0OjA1WiBhbmRyZWFzICQgICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jbXMuYW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotCi0vKioKLSAqIFRhc2sgdG8gY29weSBmaWxlcyBvZiBwdWJsaWNhdGlvbnMgYW5kIG1vZHVsZXMKLSAqLwotcHVibGljIGNsYXNzIENvcHlQdWJsaWNhdGlvbnNUYXNrIGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBQYXRoIHB1YnNSb290RGlyczsKLSAgICBwcml2YXRlIFBhdGggdG9EaXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXhjbHVkZXM7Ci0KLSAgICAvKiogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IG51bWJlck9mRGlyZWN0b3JpZXNDcmVhdGVkID0gMDsKLSAgICAgICAgaW50IG51bWJlck9mRmlsZXNDb3BpZWQgPSAwOwotICAgICAgICBUd29UdXBsZSB0d29UdXBsZSA9IG5ldyBUd29UdXBsZShudW1iZXJPZkRpcmVjdG9yaWVzQ3JlYXRlZCwgbnVtYmVyT2ZGaWxlc0NvcGllZCk7Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0aGlzLnB1YnNSb290RGlycy50b1N0cmluZygpLCBGaWxlLnBhdGhTZXBhcmF0b3IpOwotCi0gICAgICAgIGxvZygiRXhjbHVkZXMgIiArIHRoaXMuZXhjbHVkZXMpOwotICAgICAgICBGaWxlbmFtZUZpbHRlciBmaWx0ZXIgPSBuZXcgU0NNRmlsZW5hbWVGaWx0ZXIodGhpcy5leGNsdWRlcyk7Ci0KLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHB1YnNSb290RGlyID0gc3QubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIGNvcHkocHVic1Jvb3REaXIsIGZpbHRlciwgdHdvVHVwbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbnVtYmVyT2ZEaXJlY3Rvcmllc0NyZWF0ZWQgPSB0d29UdXBsZS54OwotICAgICAgICBudW1iZXJPZkZpbGVzQ29waWVkID0gdHdvVHVwbGUueTsKLSAgICAgICAgbG9nKCJDb3B5aW5nICIgKyBudW1iZXJPZkRpcmVjdG9yaWVzQ3JlYXRlZCArICIgZGlyZWN0b3JpZXMgdG8gIiArIHRoaXMudG9EaXIpOwotICAgICAgICBsb2coIkNvcHlpbmcgIiArIG51bWJlck9mRmlsZXNDb3BpZWQgKyAiIGZpbGVzIHRvICIgKyB0aGlzLnRvRGlyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHkoU3RyaW5nIHB1YnNSb290RGlyLCBGaWxlbmFtZUZpbHRlciBmaWx0ZXIsIFR3b1R1cGxlIHR3b1R1cGxlKSB7Ci0gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGUgcHVic1Jvb3REaXIgaXMgcHVibGljYXRpb24gZGlyCi0gICAgICAgICAgICBpZiAobmV3IEZpbGUocHVic1Jvb3REaXIsICIvY29uZmlnL3B1YmxpY2F0aW9uLnhtbCIpLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBwdWJEaXIgPSBuZXcgRmlsZShwdWJzUm9vdERpcik7Ci0gICAgICAgICAgICAgICAgbG9nKCJDb3B5IHB1YmxpY2F0aW9uOiAiICsgcHViRGlyKTsKLSAgICAgICAgICAgICAgICBDb3B5SmF2YVNvdXJjZXNUYXNrLmNvcHlEaXIocHViRGlyLCBuZXcgRmlsZSh0aGlzLnRvRGlyLnRvU3RyaW5nKCkpLCB0d29UdXBsZSwgZmlsdGVyLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBGaWxlIGxvY2FsUHVibGljYXRpb25YQ29uZiA9IG5ldyBGaWxlKHB1YkRpciwgIi9jb25maWcvbG9jYWwucHVibGljYXRpb24ueG1sIik7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsUHVibGljYXRpb25YQ29uZi5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIHB1YmxpY2F0aW9uWENvbmYgPSBuZXcgRmlsZSh0aGlzLnRvRGlyLnRvU3RyaW5nKCkgKyAiLyIgKyBwdWJEaXIuZ2V0TmFtZSgpICsgIi9jb25maWcvcHVibGljYXRpb24ueG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiUGF0Y2ggY29uZmlnIGZpbGUgd2l0aCBsb2NhbCB2ZXJzaW9uOiAiICsgbG9jYWxQdWJsaWNhdGlvblhDb25mICsgIiAiICsgcHVibGljYXRpb25YQ29uZik7Ci0gICAgICAgICAgICAgICAgICAgIENvcHlKYXZhU291cmNlc1Rhc2suY29weUZpbGUobG9jYWxQdWJsaWNhdGlvblhDb25mLCBwdWJsaWNhdGlvblhDb25mLCB0d29UdXBsZSwgdGhpcywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRmlsZSBsb2NhbEFjY2Vzc0NvbnRyb2xYQ29uZiA9IG5ldyBGaWxlKHB1YkRpciwgIi9jb25maWcvYWNjZXNzLWNvbnRyb2wvbG9jYWwuYWNjZXNzLWNvbnRyb2wueG1sIik7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsQWNjZXNzQ29udHJvbFhDb25mLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgYWNjZXNzQ29udHJvbFhDb25mID0gbmV3IEZpbGUodGhpcy50b0Rpci50b1N0cmluZygpICsgIi8iICsgcHViRGlyLmdldE5hbWUoKSArICIvY29uZmlnL2FjY2Vzcy1jb250cm9sL2FjY2Vzcy1jb250cm9sLnhtbCIpOwotICAgICAgICAgICAgICAgICAgICBsb2coIlBhdGNoIGFjY2VzcyBjb250cm9sIGNvbmZpZyBmaWxlIHdpdGggbG9jYWwgdmVyc2lvbjogIiArIGxvY2FsQWNjZXNzQ29udHJvbFhDb25mICsgIiAiICsgYWNjZXNzQ29udHJvbFhDb25mKTsKLSAgICAgICAgICAgICAgICAgICAgQ29weUphdmFTb3VyY2VzVGFzay5jb3B5RmlsZShsb2NhbEFjY2Vzc0NvbnRyb2xYQ29uZiwgYWNjZXNzQ29udHJvbFhDb25mLCB0d29UdXBsZSwgdGhpcywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGUgcHVic1Jvb3REaXIgaXMgbW9kdWxlIGRpcgotCSAgICB9IGVsc2UgaWYgKG5ldyBGaWxlKHB1YnNSb290RGlyLCAiL2NvbmZpZy9tb2R1bGUueG1sIikuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkNvcHkgbW9kdWxlOiAiICsgcHVic1Jvb3REaXIpOwotICAgICAgICAgICAgICAgIENvcHlKYXZhU291cmNlc1Rhc2suY29weURpcihuZXcgRmlsZShwdWJzUm9vdERpciksIG5ldyBGaWxlKHRoaXMudG9EaXIudG9TdHJpbmcoKSksIHR3b1R1cGxlLCBmaWx0ZXIsIHRoaXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZShwdWJzUm9vdERpcikubGlzdEZpbGVzKGZpbHRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29weShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSwgZmlsdGVyLCB0d29UdXBsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBsb2coIkVSUk9SOiBObyBjaGlsZHJlbjogIiArIHB1YnNSb290RGlyKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVyZSB0aGUgcHVibGljYXRpb25zIGFyZSBsb2NhdGVkCi0gICAgICogCi0gICAgICogQHBhcmFtIF9wdWJzUm9vdERpcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQdWJzUm9vdERpcnMoUGF0aCBfcHVic1Jvb3REaXJzKSB7Ci0gICAgICAgIHRoaXMucHVic1Jvb3REaXJzID0gX3B1YnNSb290RGlyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVyZSB0aGUgcHVibGljYXRpb25zIHNoYWxsIGJlIGNvcGllZCB0bwotICAgICAqIAotICAgICAqIEBwYXJhbSBfdG9EaXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0RpcihQYXRoIF90b0RpcikgewotICAgICAgICB0aGlzLnRvRGlyID0gX3RvRGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoaWNoIGZpbGVuYW1lcyBzaGFsbCBiZSBleGNsdWRlZAotICAgICAqCi0gICAgICogQHBhcmFtIF9leGNsdWRlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzKFN0cmluZyBfZXhjbHVkZXMpIHsKLSAgICAgICAgdGhpcy5leGNsdWRlcyA9IF9leGNsdWRlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0dlbmVyYXRlTW9kdWxlTGlzdC5qYXZhIGIvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9HZW5lcmF0ZU1vZHVsZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhOWM3ZC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0dlbmVyYXRlTW9kdWxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKiAkSWQ6IEJ1bGtDb3B5VGFzay5qYXZhIDM4MzIxOSAyMDA2LTAzLTA0IDIzOjA0OjU1WiBtaWNoaSAkICAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS54bWwuQW50RG9jdW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogR2VuZXJhdGUgYW4gWE1MIGNvbnRhaW5pbmcgbW9kdWxlcy4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlTW9kdWxlTGlzdCBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBQYXRoIG1vZHVsZURpcmVjdG9yaWVzOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlRmlsZTsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGhpcy5tb2R1bGVEaXJlY3RvcmllcwotICAgICAgICAgICAgICAgIC50b1N0cmluZygpLCBGaWxlLnBhdGhTZXBhcmF0b3IpOwotCi0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVEaXIgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIEZpbGUgcGF0aCA9IG5ldyBGaWxlKG1vZHVsZURpcik7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNNb2R1bGVEaXJlY3RvcnkocGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMuYWRkKHBhdGgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRpcnMgPSBwYXRoLmxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBtb2R1bGVTdWJEaXIgPSBuZXcgRmlsZShwYXRoLCBkaXJzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01vZHVsZURpcmVjdG9yeShtb2R1bGVTdWJEaXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMuYWRkKG1vZHVsZVN1YkRpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIk5vIG1vZHVsZShzKSBmb3VuZCBpbiBkaXJlY3RvcnkgWyIgKyBwYXRoICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBzdWNoIGRpcmVjdG9yeTogIiArIHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IEFudERvY3VtZW50SGVscGVyLmNyZWF0ZURvY3VtZW50KE5BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgIm1vZHVsZXMiLCBudWxsKTsKLSAgICAgICAgICAgIEZpbGVbXSBtb2R1bGVzID0gKEZpbGVbXSkgZGVzY3JpcHRvcnMudG9BcnJheShuZXcgRmlsZVtkZXNjcmlwdG9ycwotICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpXSk7Ci0gICAgICAgICAgICBIYXNoTWFwIGtleXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhOQU1FU1BBQ0UsICJtb2R1bGUiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWJzb2x1dGVQYXRoID0gbW9kdWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gYWJzb2x1dGVQYXRoLnN1YnN0cmluZyhhYnNvbHV0ZVBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0SW5kZXhPZigiLyIpICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGtleXMuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSAiXG5UaGUgbW9kdWxlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXRoIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXlzLmdldChrZXkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSFcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJZb3UgYXJlIHRyeWluZyB0byByZXVzZSB0aGUga2V5IGZvciB0aGUgcGF0aCBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWJzb2x1dGVQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXVxuUGxlYXNlIG1ha2Ugc3VyZSB5b3UgYXJlIHVzaW5nIHVuaXF1ZSBuYW1pbmcgZm9yIG1vZHVsZXMuIjsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga2V5cy5wdXQoa2V5LCBhYnNvbHV0ZVBhdGgpOwotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJzcmMiLCBhYnNvbHV0ZVBhdGgpOwotICAgICAgICAgICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMubW9kdWxlRmlsZS5yZXBsYWNlKCcvJywKLSAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0gICAgICAgICAgICBBbnREb2N1bWVudEhlbHBlci53cml0ZURvY3VtZW50KGRvYywgZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJodHRwOi8vYXBhY2hlLm9yZy9sZW55YS9tb2R1bGUtbGlzdC8xLjAiOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNb2R1bGVEaXJlY3RvcnkoRmlsZSBwYXRoKSB7Ci0gICAgICAgIEZpbGUgbW9kdWxlRmlsZSA9IG5ldyBGaWxlKHBhdGgsICJjb25maWciICsgRmlsZS5zZXBhcmF0b3IgKyAibW9kdWxlLnhtbCIpOwotICAgICAgICByZXR1cm4gbW9kdWxlRmlsZS5pc0ZpbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1vZHVsZSBzb3VyY2UgZGlyZWN0b3JpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpcnMKLSAgICAgKiAgICAgICAgICAgIFRoZSBtb2R1bGUgZGlyZWN0b3JpZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlRGlycyhQYXRoIGRpcnMpIHsKLSAgICAgICAgdGhpcy5tb2R1bGVEaXJlY3RvcmllcyA9IGRpcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmaWxlIHRvIGdlbmVyYXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICBUaGUgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVGaWxlKFN0cmluZyBmaWxlKSB7Ci0gICAgICAgIHRoaXMubW9kdWxlRmlsZSA9IGZpbGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0phdmFGaWxlbmFtZUZpbHRlci5qYXZhIGIvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9KYXZhRmlsZW5hbWVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4ODYyOS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L0phdmFGaWxlbmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZDogSmF2YUZpbGVuYW1lRmlsdGVyLmphdmEgNDE2MDU4IDIwMDYtMDYtMjEgMTg6MjQ6MDVaIGFuZHJlYXMgJCAgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNtcy5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQSBmaWxlbmFtZSBmaWx0ZXIgZm9yIC5qYXZhLCAucHJvcGVydGllcywgLnhtbCBhbmQgLnhzbCBmaWxlcwotICogRklYTUUgdGhpcyBjbGFzcyBpcyBuYW1lZCBiYWRseQotICovCi1wdWJsaWMgY2xhc3MgSmF2YUZpbGVuYW1lRmlsdGVyIGltcGxlbWVudHMgRmlsZW5hbWVGaWx0ZXIgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVRkZJWEVTID0geyAiamF2YSIsICJwcm9wZXJ0aWVzIiwgInhtbCIsICJ4c2wiIH07Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIjYWNjZXB0KGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGJvb2xlYW4gYWNjZXB0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG5ldyBGaWxlKGRpciwgbmFtZSkuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdWZmaXggPSBnZXRFeHRlbnNpb24obmFtZSk7Ci0gICAgICAgICAgICBpZiAoIUFycmF5cy5hc0xpc3QoU1VGRklYRVMpLmNvbnRhaW5zKHN1ZmZpeCkpIHsKLSAgICAgICAgICAgICAgICBhY2NlcHQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWNjZXB0OwotICAgIH0KLQotCS8qKgotCSAqIEdldCB0aGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIG5hbWUgZnJvbSB3aGljaCB0aGUgZXh0ZW5zaW9uIGlzIGV4dHJhY3RlZAotCSAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbgotCSAqLwotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihmaWxlbmFtZSwgIi4iKTsKLSAgICAgICAgc3QubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9ICIiOwotCi0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIGV4dGVuc2lvbiA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L1NDTUZpbGVuYW1lRmlsdGVyLmphdmEgYi90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L1NDTUZpbGVuYW1lRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTcyMmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9TQ01GaWxlbmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZDogU0NNRmlsZW5hbWVGaWx0ZXIuamF2YSA0MTYwNTggMjAwNi0wNi0yMSAxODoyNDowNVogYW5kcmVhcyAkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFudDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRmlsdGVyIHRvIGV4Y2x1ZGUgU0NNIGZpbGVzLCBzdWNoIGFzIENWUyBhbmQgLnN2bi4KLSAqIEEgc2V0IG9mIGZpbGVuYW1lcyAocHJvdmlkZWQgYXMgY29tbWEtc2VwYXJhdGVkIGxpc3QpIGlzIGV4Y2x1ZGVkLgotICovCi1wdWJsaWMgY2xhc3MgU0NNRmlsZW5hbWVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGV4Y2x1ZGVzOwotCi0gICAgLyoqCi0gICAgICogQ3Rvci4KLSAgICAgKiBAcGFyYW0gX2V4Y2x1ZGVzIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBuYW1lcywgZS5nLiBDVlMsLnN2bgotICAgICAqLwotICAgIHB1YmxpYyBTQ01GaWxlbmFtZUZpbHRlcihTdHJpbmcgX2V4Y2x1ZGVzKSB7Ci0gICAgICAgIHRoaXMuZXhjbHVkZXMgPSBBcnJheXMuYXNMaXN0KF9leGNsdWRlcy5zcGxpdCgiLCIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIjYWNjZXB0KGphdmEuaW8uRmlsZSwgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAhdGhpcy5leGNsdWRlcy5jb250YWlucyhuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L1R3b1R1cGxlLmphdmEgYi90cnVuay90b29scy9hbnR0YXNrcy9zcmMvb3JnL2FwYWNoZS9sZW55YS9jbXMvYW50L1R3b1R1cGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWViMjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEvY21zL2FudC9Ud29UdXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qICRJZDogVHdvVHVwbGUuamF2YSA0MTYwNTggMjAwNi0wNi0yMSAxODoyNDowNVogYW5kcmVhcyAkICAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY21zLmFudDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaG9sZCB0d28gdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgVHdvVHVwbGUgewotICAgIC8qKgotICAgICAqIDxjb2RlPng8L2NvZGU+IFRoZSB4IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGludCB4OwotICAgIC8qKgotICAgICAqIDxjb2RlPnk8L2NvZGU+IFRoZSB5IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGludCB5OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gX3ggVGhlIHggdmFsdWUKLSAgICAgKiBAcGFyYW0gX3kgVGhlIHkgdmFsdWUKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgVHdvVHVwbGUoaW50IF94LCBpbnQgX3kpIHsKLSAgICAgICAgdGhpcy54ID0gX3g7Ci0gICAgICAgIHRoaXMueSA9IF95OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2FudHRhc2tzL3NyYy9vcmcvYXBhY2hlL2xlbnlhL3htbC9BbnREb2N1bWVudEhlbHBlci5qYXZhIGIvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEveG1sL0FudERvY3VtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTA4NzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvYW50dGFza3Mvc3JjL29yZy9hcGFjaGUvbGVueWEveG1sL0FudERvY3VtZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIExlbnlhJ3MgRG9jdW1lbnRCdWlsZGVyIHRvIGJlIHVzZWQgaW4gQW50IHRhc2tzLgotICovCi1wdWJsaWMgY2xhc3MgQW50RG9jdW1lbnRIZWxwZXIgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5vbi12YWxpZGF0aW5nIGFuZCBuYW1lc3BhY2UtYXdhcmUgRG9jdW1lbnRCdWlsZGVyLgotICAgICAqIEByZXR1cm4gQSBuZXcgRG9jdW1lbnRCdWlsZGVyIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgY3JlYXRlQnVpbGRlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkb2N1bWVudC4gQSB4bWxuczpwcmVmaXg9Im5hbWVzcGFjZVVyaSIgYXR0cmlidXRlIGlzIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVcmkgVGhlIG5hbWVzcGFjZSBVUkwgb2YgdGhlIHJvb3QgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gZG9jdW1lbnRUeXBlIFRoZSB0eXBlIG9mIGRvY3VtZW50IHRvIGJlIGNyZWF0ZWQgb3IgbnVsbC4gV2hlbiBkb2N0eXBlIGlzIG5vdCBudWxsLCBpdHMKLSAgICAgKiAgICAgICAgICAgIE5vZGUub3duZXJEb2N1bWVudCBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRoZSBkb2N1bWVudCBiZWluZyBjcmVhdGVkLgotICAgICAqIEByZXR1cm4gQSBuZXcgRG9jdW1lbnQgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uI2NyZWF0ZURvY3VtZW50KFN0cmluZywgU3RyaW5nLCBEb2N1bWVudFR5cGUpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwKLSAgICAgICAgICAgIERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUpIHRocm93cyBET01FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQobmFtZXNwYWNlVXJpLAotICAgICAgICAgICAgICAgIHF1YWxpZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgZG9jdW1lbnRUeXBlKTsKLQotICAgICAgICAvLyBhZGQgeG1sbnM6cHJlZml4IGF0dHJpYnV0ZQotICAgICAgICBTdHJpbmcgbmFtZSA9ICJ4bWxucyI7Ci0gICAgICAgIGludCBpbmRleCA9IHF1YWxpZmllZE5hbWUuaW5kZXhPZigiOiIpOwotCi0gICAgICAgIGlmIChpbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICBuYW1lICs9ICgiOiIgKyBxdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwKLSAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVyaSk7Ci0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGRvY3VtZW50IHRvIGEgZmlsZS4gQSBuZXcgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgICAqIEBwYXJhbSBkb2N1bWVudCBUaGUgZG9jdW1lbnQgdG8gc2F2ZS4KLSAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBzYXZlIHRoZSBkb2N1bWVudCB0by4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIEZpbGUgZmlsZSkKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNhbml0eSBjaGVja3MKLSAgICAgICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIHVzYWdlLCBwYXJhbWV0ZXIgZG9jdW1lbnQgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIHVzYWdlLCBwYXJhbWV0ZXIgZmlsZSBtYXkgbm90IGJlIG51bGwiKTsKLQotICAgICAgICBmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLSAgICAgICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXQpOwotICAgICAgICBnZXRUcmFuc2Zvcm1lcihkb2N1bWVudC5nZXREb2N0eXBlKCkpLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHJhbnNmb3JtZXIuCi0gICAgICogQHBhcmFtIGRvY3VtZW50VHlwZSB0aGUgZG9jdW1lbnQgdHlwZQotICAgICAqIEByZXR1cm4gYSB0cmFuc2Zvcm1lcgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgVHJhbnNmb3JtZXIgZ2V0VHJhbnNmb3JtZXIoRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSkKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLQotICAgICAgICBpZiAoZG9jdW1lbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudFR5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGRvY3VtZW50VHlwZS5nZXRQdWJsaWNJZCgpKTsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudFR5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0sIGRvY3VtZW50VHlwZS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBhIGRvY3VtZW50IGZyb20gYSBmaWxlLgotICAgICAqIEByZXR1cm4gQSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBsb2FkIHRoZSBkb2N1bWVudCBmcm9tLgotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcmVhZERvY3VtZW50KEZpbGUgZmlsZSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKCk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnBhcnNlKGZpbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNoaWxkIGVsZW1lbnRzIG9mIGFuIGVsZW1lbnQgdGhhdCBiZWxvbmcgdG8gYSBjZXJ0YWluCi0gICAgICogbmFtZXNwYWNlIGFuZCBoYXZlIGEgY2VydGFpbiBsb2NhbCBuYW1lLgotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBwYXJlbnQgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgdGhhdCB0aGUgY2hpbGRlbiBtdXN0IGJlbG9uZyB0by4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBjaGlsZHJlbi4KLSAgICAgKiBAcmV0dXJuIFRoZSBjaGlsZCBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnRbXSBnZXRDaGlsZHJlbihFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2VVcmksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgTGlzdCBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhuYW1lc3BhY2VVcmksIGxvY2FsTmFtZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXRQYXJlbnROb2RlKCkgPT0gZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKGNoaWxkcmVuLml0ZW0oaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChFbGVtZW50W10pIGNoaWxkRWxlbWVudHMudG9BcnJheShuZXcgRWxlbWVudFtjaGlsZEVsZW1lbnRzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRleHQgaW5zaWRlIGFuIGVsZW1lbnQuIE9ubHkgdGhlIGNoaWxkIHRleHQgbm9kZXMgb2YgdGhpcwotICAgICAqIGVsZW1lbnQgYXJlIGNvbGxlY3RlZC4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIFRoZSB0ZXh0IGluc2lkZSB0aGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVFbGVtZW50VGV4dChFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCi0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9iaW4vYW50IGIvdHJ1bmsvdG9vbHMvYmluL2FudApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGUzMWJiZS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9iaW4vYW50CisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgRXh0cmFjdCBsYXVuY2ggYW5kIGFudCBhcmd1bWVudHMsIChzZWUgZGV0YWlscyBiZWxvdykuCi1hbnRfZXhlY19hcmdzPQotbm9fY29uZmlnPXRydWUKLXVzZV9qaWtlc19kZWZhdWx0PWZhbHNlCi1hbnRfZXhlY19kZWJ1Zz1mYWxzZQotc2hvd19oZWxwPWZhbHNlCi1mb3IgYXJnIGluICIkQCIgOyBkbwotICBpZiBbICIkYXJnIiA9ICItLW5vY29uZmlnIiBdIDsgdGhlbgotICAgIG5vX2NvbmZpZz10cnVlCi0gIGVsaWYgWyAiJGFyZyIgPSAiLS11c2VqaWtlcyIgXSA7IHRoZW4KLSAgICB1c2VfamlrZXNfZGVmYXVsdD10cnVlCi0gIGVsaWYgWyAiJGFyZyIgPSAiLS1leGVjZGVidWciIF0gOyB0aGVuCi0gICAgYW50X2V4ZWNfZGVidWc9dHJ1ZQotICBlbGlmIFsgbXkiJGFyZyIgPSBteSItLWgiICAtbyBteSIkYXJnIiA9IG15Ii0taGVscCIgIF0gOyB0aGVuCi0gICAgc2hvd19oZWxwPXRydWUKLSAgICBhbnRfZXhlY19hcmdzPSIkYW50X2V4ZWNfYXJncyAtaCIKLSAgZWxzZQotICAgIGlmIFsgIG15IiRhcmciID0gbXkiLWgiICAtbyAgbXkiJGFyZyIgPSBteSItaGVscCIgXSA7IHRoZW4KLSAgICAgIHNob3dfaGVscD10cnVlCi0gICAgZmkKLSAgICBhbnRfZXhlY19hcmdzPSIkYW50X2V4ZWNfYXJncyBcIiRhcmdcIiIKLSAgZmkKLWRvbmUKLQotIyBTb3VyY2UvZGVmYXVsdCBhbnQgY29uZmlndXJhdGlvbgotaWYgJG5vX2NvbmZpZyA7IHRoZW4KLSAgcnBtX21vZGU9ZmFsc2UKLSAgdXNlamlrZXM9JHVzZV9qaWtlc19kZWZhdWx0Ci1lbHNlCi0gICMgbG9hZCBzeXN0ZW0td2lkZSBhbnQgY29uZmlndXJhdGlvbgotICBpZiBbIC1mICIvZXRjL2FudC5jb25mIiBdIDsgdGhlbgotICAgIC4gL2V0Yy9hbnQuY29uZgotICBmaQotCi0gICMgbG9hZCB1c2VyIGFudCBjb25maWd1cmF0aW9uCi0gIGlmIFsgLWYgIiRIT01FLy5hbnQvYW50LmNvbmYiIF0gOyB0aGVuCi0gICAgLiAkSE9NRS8uYW50L2FudC5jb25mCi0gIGZpCi0gIGlmIFsgLWYgIiRIT01FLy5hbnRyYyIgXSA7IHRoZW4KLSAgICAuICIkSE9NRS8uYW50cmMiCi0gIGZpCi0KLSAgIyBwcm92aWRlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB2YWx1ZXMKLSAgaWYgWyAteiAiJHJwbV9tb2RlIiBdIDsgdGhlbgotICAgIHJwbV9tb2RlPWZhbHNlCi0gIGZpCi0gIGlmIFsgLXogIiR1c2VqaWtlcyIgXSA7IHRoZW4KLSAgICB1c2VqaWtlcz0kdXNlX2ppa2VzX2RlZmF1bHQKLSAgZmkKLWZpCi0KLSMgU2V0dXAgSmF2YSBlbnZpcm9ubWVudCBpbiBycG0gbW9kZQotaWYgJHJwbV9tb2RlIDsgdGhlbgotICBpZiBbIC1mIC91c3Ivc2hhcmUvamF2YS11dGlscy9qYXZhLWZ1bmN0aW9ucyBdIDsgdGhlbgotICAgIC4gL3Vzci9zaGFyZS9qYXZhLXV0aWxzL2phdmEtZnVuY3Rpb25zCi0gICAgc2V0X2p2bQotICAgIHNldF9qYXZhY21kCi0gIGZpCi1maQotCi0jIE9TIHNwZWNpZmljIHN1cHBvcnQuICAkdmFyIF9tdXN0XyBiZSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuCi1jeWd3aW49ZmFsc2U7Ci1kYXJ3aW49ZmFsc2U7Ci1jYXNlICJgdW5hbWVgIiBpbgotICBDWUdXSU4qKSBjeWd3aW49dHJ1ZSA7OwotICBEYXJ3aW4qKSBkYXJ3aW49dHJ1ZQotICAgICAgICAgICBpZiBbIC16ICIkSkFWQV9IT01FIiBdIDsgdGhlbgotICAgICAgICAgICAgIEpBVkFfSE9NRT0vU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL0hvbWUKLSAgICAgICAgICAgZmkKLSAgICAgICAgICAgOzsKLWVzYWMKLQotaWYgWyAteiAiJEFOVF9IT01FIiAtbyAhIC1kICIkQU5UX0hPTUUiIF0gOyB0aGVuCi0gICMjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBsaW5rIHRvIGFudCdzIGhvbWUKLSAgUFJHPSIkMCIKLSAgcHJvZ25hbWU9YGJhc2VuYW1lICIkMCJgCi0KLSAgIyBuZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzCi0gIHdoaWxlIFsgLWggIiRQUkciIF0gOyBkbwotICAgIGxzPWBscyAtbGQgIiRQUkciYAotICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKLSAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIFBSRz0iJGxpbmsiCi0gICAgZWxzZQotICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKLSAgICBmaQotICBkb25lCi0KLSAgQU5UX0hPTUU9YGRpcm5hbWUgIiRQUkciYC8uLgotCi0gICMgbWFrZSBpdCBmdWxseSBxdWFsaWZpZWQKLSAgQU5UX0hPTUU9YGNkICIkQU5UX0hPTUUiICYmIHB3ZGAKLWZpCi0KLSMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAotaWYgJGN5Z3dpbiA7IHRoZW4KLSAgWyAtbiAiJEFOVF9IT01FIiBdICYmCi0gICAgQU5UX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkQU5UX0hPTUUiYAotICBbIC1uICIkSkFWQV9IT01FIiBdICYmCi0gICAgSkFWQV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFfSE9NRSJgCi1maQotCi0jIHNldCBBTlRfTElCIGxvY2F0aW9uCi1BTlRfTElCPSIke0FOVF9IT01FfS9saWIiCi0KLWlmIFsgLXogIiRKQVZBQ01EIiBdIDsgdGhlbgotICBpZiBbIC1uICIkSkFWQV9IT01FIiAgXSA7IHRoZW4KLSAgICBpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIiBdIDsgdGhlbgotICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcwotICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIKLSAgICBlbHNlCi0gICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgotICAgIGZpCi0gIGVsc2UKLSAgICBKQVZBQ01EPWB3aGljaCBqYXZhIDI+IC9kZXYvbnVsbCBgCi0gICAgaWYgWyAteiAiJEpBVkFDTUQiIF0gOyB0aGVuCi0gICAgICAgIEpBVkFDTUQ9amF2YQotICAgIGZpCi0gIGZpCi1maQotCi1pZiBbICEgLXggIiRKQVZBQ01EIiBdIDsgdGhlbgotICBlY2hvICJFcnJvcjogSkFWQV9IT01FIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseS4iCi0gIGVjaG8gIiAgV2UgY2Fubm90IGV4ZWN1dGUgJEpBVkFDTUQiCi0gIGV4aXQgMQotZmkKLQotIyBCdWlsZCBsb2NhbCBjbGFzc3BhdGggdXNpbmcganVzdCB0aGUgbGF1bmNoZXIgaW4gbm9uLXJwbSBtb2RlIG9yCi0jIHVzZSB0aGUgSnBhY2thZ2UgaGVscGVyIGluIHJwbSBtb2RlIHdpdGggYmFzaWMgYW5kIGRlZmF1bHQgamFycwotIyBzcGVjaWZpZWQgaW4gdGhlIGFudC5jb25mIGNvbmZpZ3VyYXRpb24uIEJlY2F1c2UgdGhlIGxhdW5jaGVyIGlzCi0jIHVzZWQsIGxpYnJhcmllcyBsaW5rZWQgaW4gQU5UX0hPTUUgd2lsbCBhbHNvIGJlIGluY2x1ZGUsIGJ1dCB0aGlzCi0jIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IGlzIG5vdCBqYXZhLXZlcnNpb24gc2FmZS4gQSB1c2VyIHNob3VsZAotIyByZXF1ZXN0IG9wdGlvbmFsIGphcnMgYW5kIHRoZWlyIGRlcGVuZGVuY2llcyB2aWEgdGhlIE9QVF9KQVJfTElTVAotIyB2YXJpYWJsZQotaWYgJHJwbV9tb2RlICYmIFsgLWYgL3Vzci9iaW4vYnVpbGQtY2xhc3NwYXRoIF0gOyB0aGVuCi0gIExPQ0FMQ0xBU1NQQVRIPSIkKC91c3IvYmluL2J1aWxkLWNsYXNzcGF0aCBhbnQgYW50LWxhdW5jaGVyIGpheHBfcGFyc2VyX2ltcGwgeG1sLWNvbW1vbnMtYXBpcykiCi0gICMgSWYgdGhlIHVzZXIgcmVxdWVzdGVkIHRvIHRyeSB0byBhZGQgc29tZSBvdGhlciBqYXJzIHRvIHRoZSBjbGFzc3BhdGgKLSAgaWYgWyAtbiAiJE9QVF9KQVJfTElTVCIgXSA7IHRoZW4KLSAgICBfT1BUQ0xBU1NQQVRIPSIkKC91c3IvYmluL2J1aWxkLWNsYXNzcGF0aCAkT1BUX0pBUl9MSVNUIDI+IC9kZXYvbnVsbCkiCi0gICAgaWYgWyAtbiAiJF9PUFRDTEFTU1BBVEgiIF0gOyB0aGVuIAotICAgICAgTE9DQUxDTEFTU1BBVEg9IiRMT0NBTENMQVNTUEFUSDokX09QVENMQVNTUEFUSCIKLSAgICBmaQotICBmaQotCi0gICMgRXhwbGljaXRseSBhZGQgamF2YWMgcGF0aCB0byBjbGFzc3BhdGgsIGFzc3VtZSBKQVZBX0hPTUUgc2V0Ci0gICMgcHJvcGVybHkgaW4gcnBtIG1vZGUKLSAgaWYgWyAtZiAiJEpBVkFfSE9NRS9saWIvdG9vbHMuamFyIiBdIDsgdGhlbgotICAgIExPQ0FMQ0xBU1NQQVRIPSIkTE9DQUxDTEFTU1BBVEg6JEpBVkFfSE9NRS9saWIvdG9vbHMuamFyIgotICBmaQotICBpZiBbIC1mICIkSkFWQV9IT01FL2xpYi9jbGFzc2VzLnppcCIgXSA7IHRoZW4KLSAgICBMT0NBTENMQVNTUEFUSD0iJExPQ0FMQ0xBU1NQQVRIOiRKQVZBX0hPTUUvbGliL2NsYXNzZXMuemlwIgotICBmaQotCi0gICMgaWYgQ0xBU1NQQVRIX09WRVJSSURFIGVudiB2YXIgaXMgc2V0LCBMT0NBTENMQVNTUEFUSCB3aWxsIGJlCi0gICMgdXNlciBDTEFTU1BBVEggZmlyc3QgYW5kIGFudC1mb3VuZCBqYXJzIGFmdGVyLgotICAjIEluIHRoYXQgY2FzZSwgdGhlIHVzZXIgQ0xBU1NQQVRIIHdpbGwgb3ZlcnJpZGUgYW50LWZvdW5kIGphcnMKLSAgIwotICAjIGlmIENMQVNTUEFUSF9PVkVSUklERSBpcyBub3Qgc2V0LCB3ZSdsbCBoYXZlIHRoZSBub3JtYWwgYmVoYXZpb3VyCi0gICMgd2l0aCBhbnQtZm91bmQgamFycyBmaXJzdCBhbmQgdXNlciBDTEFTU1BBVEggYWZ0ZXIKLSAgaWYgWyAtbiAiJENMQVNTUEFUSCIgXSA7IHRoZW4KLSAgICAjIG1lcmdlIGxvY2FsIGFuZCBzcGVjaWZpZWQgY2xhc3NwYXRoIAotICAgIGlmIFsgLXogIiRMT0NBTENMQVNTUEFUSCIgXSA7IHRoZW4gCi0gICAgICBMT0NBTENMQVNTUEFUSD0iJENMQVNTUEFUSCIKLSAgICBlbGlmIFsgLW4gIiRDTEFTU1BBVEhfT1ZFUlJJREUiIF0gOyB0aGVuCi0gICAgICBMT0NBTENMQVNTUEFUSD0iJENMQVNTUEFUSDokTE9DQUxDTEFTU1BBVEgiCi0gICAgZWxzZQotICAgICAgTE9DQUxDTEFTU1BBVEg9IiRMT0NBTENMQVNTUEFUSDokQ0xBU1NQQVRIIgotICAgIGZpCi0KLSAgICAjIHJlbW92ZSBjbGFzcyBwYXRoIGZyb20gbGF1bmNoZXIgLWNwIG9wdGlvbgotICAgIENMQVNTUEFUSD0iIgotICBmaQotZWxzZQotICAjIG5vdCB1c2luZyBycG1fbW9kZTsgdXNlIGxhdW5jaGVyIHRvIGRldGVybWluZSBjbGFzc3BhdGhzCi0gIGlmIFsgLXogIiRMT0NBTENMQVNTUEFUSCIgXSA7IHRoZW4KLSAgICAgIExPQ0FMQ0xBU1NQQVRIPSRBTlRfTElCL2FudC1sYXVuY2hlci5qYXIKLSAgZWxzZQotICAgICAgTE9DQUxDTEFTU1BBVEg9JEFOVF9MSUIvYW50LWxhdW5jaGVyLmphcjokTE9DQUxDTEFTU1BBVEgKLSAgZmkKLWZpCi0KLWlmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCi0gICMgT1NYIGhhY2sgdG8gbWFrZSBBbnQgd29yayB3aXRoIGppa2VzCi0gIGlmICRkYXJ3aW4gOyB0aGVuCi0gICAgT1NYSEFDSz0iJHtKQVZBX0hPTUV9Ly4uL0NsYXNzZXMiCi0gICAgaWYgWyAtZCAiJHtPU1hIQUNLfSIgXSA7IHRoZW4KLSAgICAgIGZvciBpIGluICIke09TWEhBQ0t9Ii8qLmphcgotICAgICAgZG8KLSAgICAgICAgSklLRVNQQVRIPSIkSklLRVNQQVRIOiRpIgotICAgICAgZG9uZQotICAgIGZpCi0gIGZpCi1maQotCi0jIEFsbG93IEppa2VzIHN1cHBvcnQgKG9mZiBieSBkZWZhdWx0KQotaWYgJHVzZWppa2VzOyB0aGVuCi0gIEFOVF9PUFRTPSIkQU5UX09QVFMgLURidWlsZC5jb21waWxlcj1qaWtlcyIKLWZpCi0KLSMgRm9yIEN5Z3dpbiwgc3dpdGNoIHBhdGhzIHRvIGFwcHJvcHJpYXRlIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCi0jIEZvciBQQVRIcyBjb252ZXJ0IHRvIHVuaXggZm9ybWF0IGZpcnN0LCB0aGVuIHRvIHdpbmRvd3MgZm9ybWF0IHRvIGVuc3VyZQotIyBib3RoIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4gUHJvYmFibHkgdGhpcyB3aWxsIGZhaWwgb24gZGlyZWN0b3JpZXMgd2l0aCA7Ci0jIGluIHRoZSBuYW1lIGluIHRoZSBwYXRoLiBMZXQncyBhc3N1bWUgdGhhdCBwYXRocyBjb250YWluaW5nIDsgYXJlIG1vcmUKLSMgcmFyZSB0aGFuIHdpbmRvd3Mgc3R5bGUgcGF0aHMgb24gY3lnd2luLgotaWYgJGN5Z3dpbjsgdGhlbgotICBpZiBbICIkT1MiID0gIldpbmRvd3NfTlQiIF0gJiYgY3lncGF0aCAtbSAuPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA7IHRoZW4KLSAgICBmb3JtYXQ9bWl4ZWQKLSAgZWxzZQotICAgIGZvcm1hdD13aW5kb3dzCi0gIGZpCi0gIEFOVF9IT01FPWBjeWdwYXRoIC0tJGZvcm1hdCAiJEFOVF9IT01FImAKLSAgQU5UX0xJQj1gY3lncGF0aCAtLSRmb3JtYXQgIiRBTlRfTElCImAKLSAgSkFWQV9IT01FPWBjeWdwYXRoIC0tJGZvcm1hdCAiJEpBVkFfSE9NRSJgCi0gIExDUF9URU1QPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRMT0NBTENMQVNTUEFUSCJgCi0gIExPQ0FMQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLSRmb3JtYXQgIiRMQ1BfVEVNUCJgCi0gIGlmIFsgLW4gIiRDTEFTU1BBVEgiIF0gOyB0aGVuCi0gICAgQ1BfVEVNUD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ0xBU1NQQVRIImAKLSAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tJGZvcm1hdCAiJENQX1RFTVAiYAotICBmaQotICBDWUdIT01FPWBjeWdwYXRoIC0tJGZvcm1hdCAiJEhPTUUiYAotZmkKLQotIyBTaG93IHNjcmlwdCBoZWxwIGlmIHJlcXVlc3RlZAotaWYgJHNob3dfaGVscCA7IHRoZW4KLSAgZWNobyAkMCAnW3NjcmlwdCBvcHRpb25zXSBbb3B0aW9uc10gW3RhcmdldCBbdGFyZ2V0MiBbdGFyZ2V0M10gLi5dXScKLSAgZWNobyAnU2NyaXB0IE9wdGlvbnM6JwotICBlY2hvICcgIC0taGVscCwgLS1oICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIGFuZCBhbnQgaGVscCcKLSAgZWNobyAnICAtLW5vY29uZmlnICAgICAgICAgICAgIHN1cHByZXNzIHNvdXJjaW5nIG9mIC9ldGMvYW50LmNvbmYsJwotICBlY2hvICcgICAgICAgICAgICAgICAgICAgICAgICAgJEhPTUUvLmFudC9hbnQuY29uZiwgYW5kICRIT01FLy5hbnRyYycKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMnCi0gIGVjaG8gJyAgLS11c2VqaWtlcyAgICAgICAgICAgICBlbmFibGUgdXNlIG9mIGppa2VzIGJ5IGRlZmF1bHQsIHVubGVzcycKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBleHBsaWNpdGx5IGluIGNvbmZpZ3VyYXRpb24gZmlsZXMnCi0gIGVjaG8gJyAgLS1leGVjZGVidWcgICAgICAgICAgICBwcmludCBhbnQgZXhlYyBsaW5lIGdlbmVyYXRlZCBieSB0aGlzJwotICBlY2hvICcgICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoIHNjcmlwdCcKLSAgZWNobyAnICAnCi1maQotIyBhZGQgYSBzZWNvbmQgYmFja3NsYXNoIHRvIHZhcmlhYmxlcyB0ZXJtaW5hdGVkIGJ5IGEgYmFja3NsYXNoIHVuZGVyIGN5Z3dpbgotaWYgJGN5Z3dpbjsgdGhlbgotICBjYXNlICIkQU5UX0hPTUUiIGluCi0gICAgKlxcICkKLSAgICBBTlRfSE9NRT0iJEFOVF9IT01FXFwiCi0gICAgOzsKLSAgZXNhYwotICBjYXNlICIkQ1lHSE9NRSIgaW4KLSAgICAqXFwgKQotICAgIENZR0hPTUU9IiRDWUdIT01FXFwiCi0gICAgOzsKLSAgZXNhYwotICBjYXNlICIkSklLRVNQQVRIIiBpbgotICAgICpcXCApCi0gICAgSklLRVNQQVRIPSIkSklLRVNQQVRIXFwiCi0gICAgOzsKLSAgZXNhYwotICBjYXNlICIkTE9DQUxDTEFTU1BBVEgiIGluCi0gICAgKlxcICkKLSAgICBMT0NBTENMQVNTUEFUSD0iJExPQ0FMQ0xBU1NQQVRIXFwiCi0gICAgOzsKLSAgZXNhYwotICBjYXNlICIkQ0xBU1NQQVRIIiBpbgotICAgICpcXCApCi0gICAgQ0xBU1NQQVRIPSIkQ0xBU1NQQVRIXFwiCi0gICAgOzsKLSAgZXNhYwotZmkKLSMgRXhlY3V0ZSBhbnQgdXNpbmcgZXZhbC9leGVjIHRvIHByZXNlcnZlIHNwYWNlcyBpbiBwYXRocywKLSMgamF2YSBvcHRpb25zLCBhbmQgYW50IGFyZ3MKLWFudF9zeXNfb3B0cz0KLWlmIFsgLW4gIiRDWUdIT01FIiBdOyB0aGVuCi0gIGlmIFsgLW4gIiRKSUtFU1BBVEgiIF07IHRoZW4KLSAgICBhbnRfc3lzX29wdHM9Ii1EamlrZXMuY2xhc3MucGF0aD1cIiRKSUtFU1BBVEhcIiAtRGN5Z3dpbi51c2VyLmhvbWU9XCIkQ1lHSE9NRVwiIgotICBlbHNlCi0gICAgYW50X3N5c19vcHRzPSItRGN5Z3dpbi51c2VyLmhvbWU9XCIkQ1lHSE9NRVwiIgotICBmaQotZWxzZQotICBpZiBbIC1uICIkSklLRVNQQVRIIiBdOyB0aGVuCi0gICAgYW50X3N5c19vcHRzPSItRGppa2VzLmNsYXNzLnBhdGg9XCIkSklLRVNQQVRIXCIiCi0gIGZpCi1maQotYW50X2V4ZWNfY29tbWFuZD0iZXhlYyBcIiRKQVZBQ01EXCIgJEFOVF9PUFRTIC1jbGFzc3BhdGggXCIkTE9DQUxDTEFTU1BBVEhcIiAtRGFudC5ob21lPVwiJEFOVF9IT01FXCIgLURhbnQubGlicmFyeS5kaXI9XCIkQU5UX0xJQlwiICRhbnRfc3lzX29wdHMgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyICRBTlRfQVJHUyAtY3AgXCIkQ0xBU1NQQVRIXCIgJGFudF9leGVjX2FyZ3MiCi1pZiAkYW50X2V4ZWNfZGVidWcgOyB0aGVuCi0gICAgZWNobyAkYW50X2V4ZWNfY29tbWFuZAotZmkKLWV2YWwgJGFudF9leGVjX2NvbW1hbmQKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2Jpbi9hbnQuYmF0IGIvdHJ1bmsvdG9vbHMvYmluL2FudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDAzNTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvYmluL2FudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotcmVtICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1yZW0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXJlbSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLXJlbSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi1yZW0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotcmVtICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLXJlbQ0KLXJlbSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLXJlbQ0KLXJlbSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLXJlbSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1yZW0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLXJlbSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLXJlbSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotaWYgZXhpc3QgIiVIT01FJVxhbnRyY19wcmUuYmF0IiBjYWxsICIlSE9NRSVcYW50cmNfcHJlLmJhdCINCi0NCi1pZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBAc2V0bG9jYWwNCi1pZiAiJU9TJSI9PSJXSU5OVCIgQHNldGxvY2FsDQotDQotcmVtICV+ZHAwIGlzIGV4cGFuZGVkIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHNjcmlwdCB1bmRlciBOVA0KLXNldCBERUZBVUxUX0FOVF9IT01FPSV+ZHAwLi4NCi0NCi1pZiAiJUFOVF9IT01FJSI9PSIiIHNldCBBTlRfSE9NRT0lREVGQVVMVF9BTlRfSE9NRSUNCi1zZXQgREVGQVVMVF9BTlRfSE9NRT0NCi0NCi1zZXQgX1VTRV9DTEFTU1BBVEg9eWVzDQotDQotcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBUaGlzIGxvb3AgYWxsb3dzIGZvciBhbiB1bmxpbWl0ZWQgbnVtYmVyDQotcmVtIG9mIGFyZ3VtZW50cyAodXAgdG8gdGhlIGNvbW1hbmQgbGluZSBsaW1pdCwgYW55d2F5KS4NCi1zZXQgQU5UX0NNRF9MSU5FX0FSR1M9JTENCi1pZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU3RhcnQNCi1zaGlmdA0KLTpzZXR1cEFyZ3MNCi1pZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU3RhcnQNCi1pZiAiIiUxIiI9PSIiLW5vY2xhc3NwYXRoIiIgZ290byBjbGVhcmNsYXNzcGF0aA0KLXNldCBBTlRfQ01EX0xJTkVfQVJHUz0lQU5UX0NNRF9MSU5FX0FSR1MlICUxDQotc2hpZnQNCi1nb3RvIHNldHVwQXJncw0KLQ0KLXJlbSBoZXJlIGlzIHRoZXJlIGlzIGEgLW5vY2xhc3NwYXRoIGluIHRoZSBvcHRpb25zDQotOmNsZWFyY2xhc3NwYXRoDQotc2V0IF9VU0VfQ0xBU1NQQVRIPW5vDQotc2hpZnQNCi1nb3RvIHNldHVwQXJncw0KLQ0KLXJlbSBUaGlzIGxhYmVsIHByb3ZpZGVzIGEgcGxhY2UgZm9yIHRoZSBhcmd1bWVudCBsaXN0IGxvb3AgdG8gYnJlYWsgb3V0DQotcmVtIGFuZCBmb3IgTlQgaGFuZGxpbmcgdG8gc2tpcCB0by4NCi0NCi06ZG9uZVN0YXJ0DQotcmVtIGZpbmQgQU5UX0hPTUUgaWYgaXQgZG9lcyBub3QgZXhpc3QgZHVlIHRvIGVpdGhlciBhbiBpbnZhbGlkIHZhbHVlIHBhc3NlZA0KLXJlbSBieSB0aGUgdXNlciBvciB0aGUgJTAgcHJvYmxlbSBvbiBXaW5kb3dzIDl4DQotaWYgZXhpc3QgIiVBTlRfSE9NRSVcbGliXGFudC5qYXIiIGdvdG8gY2hlY2tKYXZhDQotDQotcmVtIGNoZWNrIGZvciBhbnQgaW4gUHJvZ3JhbSBGaWxlcw0KLWlmIG5vdCBleGlzdCAiJVByb2dyYW1GaWxlcyVcYW50IiBnb3RvIGNoZWNrU3lzdGVtRHJpdmUNCi1zZXQgQU5UX0hPTUU9JVByb2dyYW1GaWxlcyVcYW50DQotZ290byBjaGVja0phdmENCi0NCi06Y2hlY2tTeXN0ZW1Ecml2ZQ0KLXJlbSBjaGVjayBmb3IgYW50IGluIHJvb3QgZGlyZWN0b3J5IG9mIHN5c3RlbSBkcml2ZQ0KLWlmIG5vdCBleGlzdCAlU3lzdGVtRHJpdmUlXGFudFxsaWJcYW50LmphciBnb3RvIGNoZWNrQ0RyaXZlDQotc2V0IEFOVF9IT01FPSVTeXN0ZW1Ecml2ZSVcYW50DQotZ290byBjaGVja0phdmENCi0NCi06Y2hlY2tDRHJpdmUNCi1yZW0gY2hlY2sgZm9yIGFudCBpbiBDOlxhbnQgZm9yIFdpbjlYIHVzZXJzDQotaWYgbm90IGV4aXN0IEM6XGFudFxsaWJcYW50LmphciBnb3RvIG5vQW50SG9tZQ0KLXNldCBBTlRfSE9NRT1DOlxhbnQNCi1nb3RvIGNoZWNrSmF2YQ0KLQ0KLTpub0FudEhvbWUNCi1lY2hvIEFOVF9IT01FIGlzIHNldCBpbmNvcnJlY3RseSBvciBhbnQgY291bGQgbm90IGJlIGxvY2F0ZWQuIFBsZWFzZSBzZXQgQU5UX0hPTUUuDQotZ290byBlbmQNCi0NCi06Y2hlY2tKYXZhDQotc2V0IF9KQVZBQ01EPSVKQVZBQ01EJQ0KLQ0KLWlmICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBub0phdmFIb21lDQotaWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIGdvdG8gbm9KYXZhSG9tZQ0KLWlmICIlX0pBVkFDTUQlIiA9PSAiIiBzZXQgX0pBVkFDTUQ9JUpBVkFfSE9NRSVcYmluXGphdmEuZXhlDQotZ290byBjaGVja0ppa2VzDQotDQotOm5vSmF2YUhvbWUNCi1pZiAiJV9KQVZBQ01EJSIgPT0gIiIgc2V0IF9KQVZBQ01EPWphdmEuZXhlDQotDQotOmNoZWNrSmlrZXMNCi1pZiBub3QgIiVKSUtFU1BBVEglIj09IiIgZ290byBydW5BbnRXaXRoSmlrZXMNCi0NCi06cnVuQW50DQotaWYgIiVfVVNFX0NMQVNTUEFUSCUiPT0ibm8iIGdvdG8gcnVuQW50Tm9DbGFzc3BhdGgNCi1pZiBub3QgIiVDTEFTU1BBVEglIj09IiIgZ290byBydW5BbnRXaXRoQ2xhc3NwYXRoDQotIiVfSkFWQUNNRCUiICVBTlRfT1BUUyUgLWNsYXNzcGF0aCAiJUFOVF9IT01FJVxsaWJcYW50LWxhdW5jaGVyLmphciIgIi1EYW50LmhvbWU9JUFOVF9IT01FJSIgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyICVBTlRfQVJHUyUgJUFOVF9DTURfTElORV9BUkdTJQ0KLWdvdG8gZW5kDQotDQotOnJ1bkFudE5vQ2xhc3NwYXRoDQotIiVfSkFWQUNNRCUiICVBTlRfT1BUUyUgLWNsYXNzcGF0aCAiJUFOVF9IT01FJVxsaWJcYW50LWxhdW5jaGVyLmphciIgIi1EYW50LmhvbWU9JUFOVF9IT01FJSIgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyICVBTlRfQVJHUyUgJUFOVF9DTURfTElORV9BUkdTJQ0KLWdvdG8gZW5kDQotDQotOnJ1bkFudFdpdGhDbGFzc3BhdGgNCi0iJV9KQVZBQ01EJSIgJUFOVF9PUFRTJSAtY2xhc3NwYXRoICIlQU5UX0hPTUUlXGxpYlxhbnQtbGF1bmNoZXIuamFyIiAiLURhbnQuaG9tZT0lQU5UX0hPTUUlIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIgJUFOVF9BUkdTJSAtY3AgIiVDTEFTU1BBVEglIiAlQU5UX0NNRF9MSU5FX0FSR1MlDQotZ290byBlbmQNCi0NCi06cnVuQW50V2l0aEppa2VzDQotaWYgIiVfVVNFX0NMQVNTUEFUSCUiPT0ibm8iIGdvdG8gcnVuQW50V2l0aEppa2VzTm9DbGFzc3BhdGgNCi1pZiBub3QgIiVDTEFTU1BBVEglIj09IiIgZ290byBydW5BbnRXaXRoSmlrZXNBbmRDbGFzc3BhdGgNCi0NCi06cnVuQW50V2l0aEppa2VzTm9DbGFzc3BhdGgNCi0iJV9KQVZBQ01EJSIgJUFOVF9PUFRTJSAtY2xhc3NwYXRoICIlQU5UX0hPTUUlXGxpYlxhbnQtbGF1bmNoZXIuamFyIiAiLURhbnQuaG9tZT0lQU5UX0hPTUUlIiAiLURqaWtlcy5jbGFzcy5wYXRoPSVKSUtFU1BBVEglIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIgJUFOVF9BUkdTJSAlQU5UX0NNRF9MSU5FX0FSR1MlDQotZ290byBlbmQNCi0NCi06cnVuQW50V2l0aEppa2VzQW5kQ2xhc3NwYXRoDQotIiVfSkFWQUNNRCUiICVBTlRfT1BUUyUgLWNsYXNzcGF0aCAiJUFOVF9IT01FJVxsaWJcYW50LWxhdW5jaGVyLmphciIgIi1EYW50LmhvbWU9JUFOVF9IT01FJSIgIi1EamlrZXMuY2xhc3MucGF0aD0lSklLRVNQQVRIJSIgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyICVBTlRfQVJHUyUgIC1jcCAiJUNMQVNTUEFUSCUiICVBTlRfQ01EX0xJTkVfQVJHUyUNCi1nb3RvIGVuZA0KLQ0KLTplbmQNCi1zZXQgX0pBVkFDTUQ9DQotc2V0IEFOVF9DTURfTElORV9BUkdTPQ0KLQ0KLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIEBlbmRsb2NhbA0KLWlmICIlT1MlIj09IldJTk5UIiBAZW5kbG9jYWwNCi0NCi06bWFpbkVuZA0KLWlmIGV4aXN0ICIlSE9NRSVcYW50cmNfcG9zdC5iYXQiIGNhbGwgIiVIT01FJVxhbnRyY19wb3N0LmJhdCINCi0NCmRpZmYgLS1naXQgYS90cnVuay90b29scy9iaW4vYW50LmNtZCBiL3RydW5rL3Rvb2xzL2Jpbi9hbnQuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGU1Y2M5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2Jpbi9hbnQuY21kCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyogDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIA0KLSAgICBSdW4gYW50DQotKi8NCi0NCi0nQGVjaG8gb2ZmJw0KLXBhcnNlIGFyZyBtb2RlIGVudmFyZyAnOjonIGFudGFyZw0KLQ0KLWlmIG1vZGVcPScuJyAmIG1vZGVcPScuLicgJiBtb2RlXD0nLycgdGhlbiBkbw0KLSAgZW52YXJnID0gbW9kZSBlbnZhcmcNCi0gIG1vZGUgPSAnJw0KLWVuZA0KLQ0KLWlmIGFudGFyZyA9ICcnIHRoZW4gZG8NCi0gIGFudGFyZyA9IGVudmFyZw0KLSAgZW52YXJnID0gJycNCi1lbmQNCi0NCi14ID0gc2V0bG9jYWwoKQ0KLQ0KLWVudj0iT1MyRU5WSVJPTk1FTlQiDQotYW50ZW52ID0gX2dldGVudl8oJ2FudGVudicpDQotaWYgX3Rlc3RlbnZfKCkgPSAwIHRoZW4gaW50ZXJwcmV0ICdjYWxsICInIHx8IGFudGVudiB8fCAnIicgJyInIHx8IGVudmFyZyB8fCAnIicNCi0NCi1pZiBtb2RlID0gJycgdGhlbiBtb2RlID0gX2dldGVudl8oJ0FOVF9NT0RFJyAnLi4nKQ0KLWlmIG1vZGUgXD0gJy8nIHRoZW4gZG8NCi0gIHJ1bnJjID0gX2dldGVudl8oJ3J1bnJjJykNCi0gIGFudHJjID0gX2dldGVudl8oJ2FudHJjJyAnYW50cmMuY21kJykNCi0gIGlmIG1vZGUgPSAnLi4nIHRoZW4gbW9kZSA9ICctcicNCi0gIGVsc2UgbW9kZSA9ICcnDQotICBpbnRlcnByZXQgJ2NhbGwgIicgfHwgcnVucmMgfHwgJyInIGFudHJjICciJyB8fCBtb2RlIHx8ICciJw0KLWVuZA0KLQ0KLWlmIF90ZXN0ZW52XygpID0gMCB0aGVuIGRvDQotICBzYXkgJ0FudCBlbnZpcm9ubWVudCBpcyBub3Qgc2V0IHByb3Blcmx5Jw0KLSAgeCA9IGVuZGxvY2FsKCkNCi0gIGV4aXQgMTYNCi1lbmQNCi0NCi1zZXR0aW5ncyA9ICctRGFudC5ob21lPScgfHwgQU5UX0hPTUUgJy1EamF2YS5ob21lPScgfHwgSkFWQV9IT01FDQotDQotamF2YSA9IF9nZXRlbnZfKCdqYXZhY21kJyAnamF2YScpDQotb3B0cyA9IHZhbHVlKCdBTlRfT1BUUycsLGVudikNCi1hcmdzID0gdmFsdWUoJ0FOVF9BUkdTJywsZW52KQ0KLWxjcCA9IHZhbHVlKCdMT0NBTENMQVNTUEFUSCcsLGVudikNCi1jcCA9IHZhbHVlKCdDTEFTU1BBVEgnLCxlbnYpDQotaWYgdmFsdWUoJ0FOVF9VU0VfQ1AnLCxlbnYpIFw9ICcnIHRoZW4gZG8NCi0gIGlmIGxjcCBcPSAnJyAmIHJpZ2h0KGxjcCwgMSkgXD0gJzsnIHRoZW4gbGNwID0gbGNwIHx8ICc7Jw0KLSAgbGNwID0gbGNwIHx8IGNwDQotICAnU0VUIENMQVNTUEFUSD0nDQotZW5kDQotaWYgbGNwXD0nJyB0aGVuIGxjcCA9ICctY2xhc3NwYXRoJyBsY3ANCi0NCi1jbWQgPSBqYXZhIG9wdHMgbGNwICctamFyJyBBTlRfSE9NRSB8fCdcbGliXGFudC1sYXVuY2hlci5qYXInIHNldHRpbmdzIGFyZ3MgYW50YXJnDQotbGF1bmNoZXIgPSBzdHJlYW0oQU5UX0hPTUUgfHwnXGxpYlxhbnQtbGF1bmNoZXIuamFyJywgJ0MnLCAncXVlcnkgZXhpc3RzJykNCi1pZiBsYXVuY2hlciA9ICcnIHRoZW4gZW50cnkgPSAnb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbicNCi1lbHNlIGVudHJ5ID0gJ29yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlcicNCi1qYXZhIG9wdHMgbGNwIGVudHJ5IHNldHRpbmdzIGFyZ3MgYW50YXJnDQotDQoteCA9IGVuZGxvY2FsKCkNCi0NCi1yZXR1cm4gcmMNCi0NCi1fdGVzdGVudl86IHByb2NlZHVyZSBleHBvc2UgZW52IEFOVF9IT01FIEpBVkFfSE9NRQ0KLUFOVF9IT01FID0gdmFsdWUoJ0FOVF9IT01FJywsZW52KQ0KLWlmIEFOVF9IT01FID0gJycgdGhlbiByZXR1cm4gMA0KLUpBVkFfSE9NRSA9IHZhbHVlKCdKQVZBX0hPTUUnLCxlbnYpDQotaWYgSkFWQV9IT01FID0gJycgdGhlbiByZXR1cm4gMA0KLWNwID0gdHJhbnNsYXRlKHZhbHVlKCdDTEFTU1BBVEgnLCxlbnYpKQ0KLWlmIHBvcyh0cmFuc2xhdGUoQU5UX0hPTUUpLCBjcCkgPSAwIHRoZW4gcmV0dXJuIDANCi1pZiBwb3ModHJhbnNsYXRlKEpBVkFfSE9NRSksIGNwKSA9IDAgdGhlbiByZXR1cm4gMA0KLXJldHVybiAxDQotDQotX2dldGVudl86IHByb2NlZHVyZSBleHBvc2UgZW52DQotcGFyc2UgYXJnIGVudmFyIGRlZmF1bHQNCi1pZiBkZWZhdWx0ID0gJycgdGhlbiBkZWZhdWx0ID0gZW52YXINCi12YXIgPSB2YWx1ZSh0cmFuc2xhdGUoZW52YXIpLCxlbnYpDQotaWYgdmFyID0gJycgdGhlbiB2YXIgPSBkZWZhdWx0DQotcmV0dXJuIHZhcg0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2Jpbi9hbnRSdW4gYi90cnVuay90b29scy9iaW4vYW50UnVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmI0MWQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2Jpbi9hbnRSdW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgQXJnczogRElSIGNvbW1hbmQKLWNkICIkMSIKLUNNRD0iJDIiCi1zaGlmdAotc2hpZnQKLQotZXhlYyAiJENNRCIgIiRAIgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYmluL2FudFJ1bi5iYXQgYi90cnVuay90b29scy9iaW4vYW50UnVuLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0ZjA2NS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9iaW4vYW50UnVuLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLXJlbSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotcmVtICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi1yZW0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1yZW0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotcmVtICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXJlbSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi1yZW0NCi1yZW0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1yZW0NCi1yZW0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1yZW0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotcmVtICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1yZW0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1yZW0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIEBzZXRsb2NhbA0KLWlmICIlT1MlIj09IldJTk5UIiBAc2V0bG9jYWwNCi0NCi1pZiAiIiUxIiI9PSIiIiIgZ290byBydW5Db21tYW5kDQotDQotcmVtIENoYW5nZSBkcml2ZSBhbmQgZGlyZWN0b3J5IHRvICUxDQotaWYgIiVPUyUiPT0iV2luZG93c19OVCIgY2QgL2QgIiIlMSIiDQotaWYgbm90ICIlT1MlIj09IldpbmRvd3NfTlQiIGNkICIiJTEiIg0KLXNoaWZ0DQotDQotcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBUaGlzIGxvb3AgYWxsb3dzIGZvciBhbiB1bmxpbWl0ZWQgbnVtYmVyDQotcmVtIG9mIGFncnVtZW50cyAodXAgdG8gdGhlIGNvbW1hbmQgbGluZSBsaW1pdCwgYW55d2F5KS4NCi1zZXQgQU5UX1JVTl9DTUQ9JTENCi1pZiAiIiUxIiI9PSIiIiIgZ290byBydW5Db21tYW5kDQotc2hpZnQNCi06bG9vcA0KLWlmICIiJTEiIj09IiIiIiBnb3RvIHJ1bkNvbW1hbmQNCi1zZXQgQU5UX1JVTl9DTUQ9JUFOVF9SVU5fQ01EJSAlMQ0KLXNoaWZ0DQotZ290byBsb29wDQotDQotOnJ1bkNvbW1hbmQNCi1yZW0gZWNobyAlQU5UX1JVTl9DTUQlDQotJUFOVF9SVU5fQ01EJQ0KLQ0KLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIEBlbmRsb2NhbA0KLWlmICIlT1MlIj09IldJTk5UIiBAZW5kbG9jYWwNCi0NCmRpZmYgLS1naXQgYS90cnVuay90b29scy9iaW4vYW50UnVuLnBsIGIvdHJ1bmsvdG9vbHMvYmluL2FudFJ1bi5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlYTEwZi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9iaW4vYW50UnVuLnBsCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGFudFJ1bi5wbAotIwotIyB3cmFwcGVyIHNjcmlwdCBmb3IgaW52b2tpbmcgY29tbWFuZHMgb24gYSBwbGF0Zm9ybSB3aXRoIFBlcmwgaW5zdGFsbGVkCi0jIHRoaXMgaXMgYWtpbiB0byBhbnRSdW4uYmF0LCBhbmQgYW50UnVuIHRoZSBTSCBzY3JpcHQgCi0jCi0jIGNyZWF0ZWQ6ICAgICAgICAgMjAwMS0xMC0xOAotIyBhdXRob3I6ICAgICAgICAgIEplZmYgVHVsbGV5IGp0dWxsZXlAbm92ZWxsLmNvbSAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jYmUgZnVzc3kgYWJvdXQgdmFyaWFibGVzCi11c2Ugc3RyaWN0OwotCi0jdHVybiB3YXJuaW5ncyBvbiBkdXJpbmcgZGV2OyBnZW5lcmF0ZXMgYSBmZXcgc3B1cmlvdXMgdW5pbml0aWFsaXNlZCB2YXIgYWNjZXNzIHdhcm5pbmdzCi0jdXNlIHdhcm5pbmdzOwotCi0jYW5kIHNldCAkZGVidWcgdG8gMSB0byB0dXJuIG9uIHRyYWNlIGluZm8gKGN1cnJlbnRseSB1bnVzZWQpCi1teSAkZGVidWc9MTsKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgY2hhbmdlIGRyaXZlIGFuZCBkaXJlY3RvcnkgdG8gIiUxIgotbXkgJEFOVF9SVU5fQ01EID0gQEFSR1ZbMF07Ci0KLSMgYXNzaWduIGN1cnJlbnQgcnVuIGNvbW1hbmQgdG8gIiUyIgotY2hkaXIgKEBBUkdWWzBdKSB8fCBkaWUgIkNhbid0IGNkIHRvICRBUkdWWzBdOiAkIVxuIjsKLWlmICgkXk8gZXEgIk5ldFdhcmUiKSB7Ci0gICAgIyBUaGVyZSBpcyBhIGJ1ZyBpbiBQZXJsIDUgb24gTmV0V2FyZSwgd2hlcmUgY2hkaXIgZG9lcyBub3QKLSAgICAjIGRvIGFueXRoaW5nLiAgT24gTmV0V2FyZSwgdGhlIGZvbGxvd2luZyBwYXRoLXByZWZpeGVkIGZvcm0gc2hvdWxkIAotICAgICMgYWx3YXlzIHdvcmsuIChhZmFpY3QpCi0gICAgJEFOVF9SVU5fQ01EIC49ICIvIi5AQVJHVlsxXTsKLX0KLWVsc2UgewotICAgICRBTlRfUlVOX0NNRCA9IEBBUkdWWzFdOwotfQotCi0jIGRpc3Bvc2Ugb2YgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMsIGxlYXZpbmcgb25seSB0aGUgY29tbWFuZCdzIGFyZ3MuCi1zaGlmdDsKLXNoaWZ0OwotCi0jIHJ1biB0aGUgY29tbWFuZAotbXkgJHJldHVyblZhbHVlID0gc3lzdGVtICRBTlRfUlVOX0NNRCwgQEFSR1Y7Ci1pZiAoJHJldHVyblZhbHVlIGVxIDApIHsKLSAgICBleGl0IDA7Ci19Ci1lbHNlIHsKLSAgICAjIG9ubHkgMCBhbmQgMSBhcmUgd2lkZWx5IHJlY29nbml6ZWQgYXMgZXhpdCB2YWx1ZXMKLSAgICAjIHNvIGNoYW5nZSB0aGUgZXhpdCB2YWx1ZSB0byAxCi0gICAgZXhpdCAxOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYmluL2FudGVudi5jbWQgYi90cnVuay90b29scy9iaW4vYW50ZW52LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMTMwOC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9iaW4vYW50ZW52LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKiANCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0gICAgQW50IGVudmlyb25tZW50DQotKi8NCi0NCi0nQGVjaG8gb2ZmJw0KLWNhbGwgUnhGdW5jQWRkICJTeXNMb2FkRnVuY3MiLCAiUmV4eFV0aWwiLCAiU3lzTG9hZEZ1bmNzIg0KLWNhbGwgU3lzTG9hZEZ1bmNzDQotDQotLyogUHJlcGFyZSB0aGUgcGFyYW1ldGVycyBmb3IgbGF0ZXIgdXNlICovDQotcGFyc2UgYXJnIGFyZ3YNCi1tb2RlID0gJycNCi1hcmdzID0gJycNCi1vcHRzID0gJycNCi1jcCA9ICcnDQotbGNwID0gJycNCi0NCi1kbyBpID0gMSB0byB3b3Jkcyhhcmd2KQ0KLSAgcGFyYW0gPSB3b3JkKGFyZ3YsIGkpDQotICBzZWxlY3QNCi0gICAgd2hlbiBwYXJhbT0nLWxjcCcgdGhlbiBtb2RlID0gJ2wnDQotICAgIHdoZW4gcGFyYW09Jy1jcCcgfCBwYXJhbT0nLWNsYXNzcGF0aCcgdGhlbiBtb2RlID0gJ2MnDQotICAgIHdoZW4gYWJicmV2KCctb3B0cycsIHBhcmFtLCA0KSB0aGVuIG1vZGUgPSAnbycNCi0gICAgd2hlbiBhYmJyZXYoJy1hcmdzJywgcGFyYW0sIDQpIHRoZW4gbW9kZSA9ICdhJw0KLSAgb3RoZXJ3aXNlDQotICAgIHNlbGVjdA0KLSAgICAgIHdoZW4gbW9kZSA9ICdhJyB0aGVuIGFyZ3MgPSBzcGFjZShhcmdzIHBhcmFtLCAxKQ0KLSAgICAgIHdoZW4gbW9kZSA9ICdjJyB0aGVuIGNwID0gc3BhY2UoY3AgcGFyYW0sIDEpDQotICAgICAgd2hlbiBtb2RlID0gJ2wnIHRoZW4gbGNwID0gc3BhY2UobGNwIHBhcmFtLCAxKQ0KLSAgICAgIHdoZW4gbW9kZSA9ICdvJyB0aGVuIG9wdHMgPSBzcGFjZShvcHRzIHBhcmFtLCAxKQ0KLSAgICBvdGhlcndpc2UNCi0gICAgICBzYXkgJ09wdGlvbicgcGFyYW0gJ2lnbm9yZWQnDQotICAgIGVuZA0KLSAgZW5kDQotZW5kDQotDQotZW52PSJPUzJFTlZJUk9OTUVOVCINCi1hbnRjb25mID0gX2dldGVudl8oJ2FudGNvbmYnICdhbnRjb25mLmNtZCcpDQotcnVucmMgPSBfZ2V0ZW52XygncnVucmMnKQ0KLWludGVycHJldCAnY2FsbCAiJyB8fCBydW5yYyB8fCAnIicgJyInIHx8IGFudGNvbmYgfHwgJyInICdFVEMnDQotQU5UX0hPTUUgPSB2YWx1ZSgnQU5UX0hPTUUnLCxlbnYpDQotSkFWQV9IT01FID0gdmFsdWUoJ0pBVkFfSE9NRScsLGVudikNCi1jbGFzc3BhdGggPSB2YWx1ZSgnQ0xBU1NQQVRIJywsZW52KQ0KLWNsYXNzZXMgPSBzdHJlYW0oSkFWQV9IT01FIHx8ICJcbGliXGNsYXNzZXMuemlwIiwgIkMiLCAiUVVFUlkgRVhJU1RTIikNCi1pZiBjbGFzc2VzIFw9ICcnIHRoZW4gY2xhc3NwYXRoID0gcHJlcGVuZChjbGFzc3BhdGggY2xhc3NlcykNCi1jbGFzc2VzID0gc3RyZWFtKEpBVkFfSE9NRSB8fCAiXGxpYlx0b29scy5qYXIiLCAiQyIsICJRVUVSWSBFWElTVFMiKQ0KLWlmIGNsYXNzZXMgXD0gJycgdGhlbiBjbGFzc3BhdGggPSBwcmVwZW5kKGNsYXNzcGF0aCBjbGFzc2VzKQ0KLQ0KLWNsYXNzcGF0aCA9IHByZXBlbmQoY2xhc3NwYXRoIEFOVF9IT01FIHx8ICdcbGliXGFudC1sYXVuY2hlci5qYXInKQ0KLSdTRVQgQ0xBU1NQQVRIPScgfHwgY2xhc3NwYXRoDQotDQotLyogU2V0dGluZyBjbGFzc3BhdGhlcywgb3B0aW9ucyBhbmQgYXJndW1lbnRzICovDQotZW52c2V0ID0gX2dldGVudl8oJ2VudnNldCcpDQotaWYgY3BcPScnICAgdGhlbiBpbnRlcnByZXQgJ2NhbGwgIicgfHwgZW52c2V0IHx8ICciJyAnIjsgQ0xBU1NQQVRIIicgJyInIHx8IGNwIHx8ICciJw0KLWlmIGxjcFw9JycgIHRoZW4gaW50ZXJwcmV0ICdjYWxsICInIHx8IGVudnNldCB8fCAnIicgJyI7IExPQ0FMQ0xBU1NQQVRIIicgJyInIHx8IGxjcCB8fCAnIicNCi1pZiBvcHRzXD0nJyB0aGVuIGludGVycHJldCAnY2FsbCAiJyB8fCBlbnZzZXQgfHwgJyInICciLUQgQU5UX09QVFMiJyAnIicgfHwgb3B0cyB8fCAnIicNCi1pZiBhcmdzXD0nJyB0aGVuIGludGVycHJldCAnY2FsbCAiJyB8fCBlbnZzZXQgfHwgJyInICciQU5UX0FSR1MiJyAnIicgfHwgYXJncyB8fCAnIicNCi0NCi1leGl0IDANCi0NCi1hZGRwYXRoOiBwcm9jZWR1cmUNCi1wYXJzZSBhcmcgcGF0aCBlbGVtDQotaWYgZWxlbSA9ICcnIHRoZW4gZG8NCi0gIGlmIHBhdGhcPScnICYgcmlnaHQocGF0aCwgMSlcPSc7JyB0aGVuIHBhdGggPSBwYXRoIHx8ICc7Jw0KLSAgcmV0dXJuIHBhdGgNCi1lbmQNCi1pZiBzdWJzdHIocGF0aCwgbGVuZ3RoKHBhdGgpKSA9ICc7JyB0aGVuIGdsdWUgPSAnJw0KLWVsc2UgZ2x1ZSA9ICc7Jw0KLWlmIHBvcyh0cmFuc2xhdGUoZWxlbSksIHRyYW5zbGF0ZShwYXRoKSkgPSAwIHRoZW4gcGF0aCA9IHBhdGggfHwgZ2x1ZSB8fCBlbGVtIHx8ICc7Jw0KLXJldHVybiBwYXRoDQotDQotcHJlcGVuZDogcHJvY2VkdXJlDQotcGFyc2UgYXJnIHBhdGggZWxlbQ0KLWlmIGVsZW0gPSAnJyB0aGVuIGRvDQotICBpZiBwYXRoXD0nJyAmIHJpZ2h0KHBhdGgsIDEpXD0nOycgdGhlbiBwYXRoID0gcGF0aCB8fCAnOycNCi0gIHJldHVybiBwYXRoDQotZW5kDQotaWYgcG9zKHRyYW5zbGF0ZShlbGVtKSwgdHJhbnNsYXRlKHBhdGgpKSA9IDAgdGhlbiBwYXRoID0gZWxlbSB8fCAnOycgfHwgcGF0aA0KLXJldHVybiBwYXRoDQotDQotX2dldGVudl86IHByb2NlZHVyZSBleHBvc2UgZW52DQotcGFyc2UgYXJnIGVudmFyIGRlZmF1bHQNCi1pZiBkZWZhdWx0ID0gJycgdGhlbiBkZWZhdWx0ID0gZW52YXINCi12YXIgPSB2YWx1ZSh0cmFuc2xhdGUoZW52YXIpLCxlbnYpDQotaWYgdmFyID0gJycgdGhlbiB2YXIgPSBkZWZhdWx0DQotcmV0dXJuIHZhcg0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2Jpbi9hcHBlbmRjcC5iYXQgYi90cnVuay90b29scy9iaW4vYXBwZW5kY3AuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODZmZWZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2Jpbi9hcHBlbmRjcC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1AZWNobyBvZmYNCi1yZW0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLXJlbSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotcmVtICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotcmVtICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLXJlbSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi1yZW0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotcmVtDQotcmVtICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotcmVtDQotcmVtICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotcmVtICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLXJlbSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotcmVtICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotcmVtICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOyUxDQotDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYmluL2NvbXBsZXRlLWFudC1jbWQucGwgYi90cnVuay90b29scy9iaW4vY29tcGxldGUtYW50LWNtZC5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2MjJlMC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9iaW4vY29tcGxldGUtYW50LWNtZC5wbAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0jIS91c3IvYmluL3BlcmwKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyBBIHNjcmlwdCB0byBhbGxvdyBCYXNoIG9yIFotU2hlbGwgdG8gY29tcGxldGUgYW4gQW50IGNvbW1hbmQtbGluZS4gIAotIwotIyBUbyBpbnN0YWxsIGZvciBCYXNoIDIuMCBvciBiZXR0ZXIsIGFkZCB0aGUgZm9sbG93aW5nIHRvIH4vLmJhc2hyYzoKLSMgCi0jICAgICAkIGNvbXBsZXRlIC1DIGNvbXBsZXRlLWFudC1jbWQgYW50IGJ1aWxkLnNoCi0jCi0jIFRvIGluc3RhbGwgZm9yIFotU2hlbGwgMi41IG9yIGJldHRlciwgYWRkIHRoZSBmb2xsb3dpbmcgdG8gfi8uenNocmM6Ci0jCi0jICAgICBmdW5jdGlvbiBhbnRfY29tcGxldGUgKCkgewotIyAgICAgICAgIGxvY2FsIGFyZ3NfbGluZSBhcmdzCi0jICAgICAgICAgcmVhZCAtbCBhcmdzX2xpbmUKLSMgICAgICAgICBzZXQgLUEgYXJncyAkYXJnc19saW5lCi0jICAgICAgICAgc2V0IC1BIHJlcGx5ICQoQ09NUF9MSU5FPSRhcmdzX2xpbmUgY29tcGxldGUtYW50LWNtZCAke2FyZ3NbMV19ICQxKQotIyAgICAgfQotIyAgICAgY29tcGN0bCAtSyBhbnRfY29tcGxldGUgYW50IGJ1aWxkLnNoCi0jICAgICAKLSMgQGF1dGhvciBNaWtlIFdpbGxpYW1zIDxtaWtld0Bjb3J0ZXhlYnVzaW5lc3MuY29tLmF1PgotCi1teSAkY21kTGluZSA9ICRFTlZ7J0NPTVBfTElORSd9OwotbXkgJGFudENtZCA9ICRBUkdWWzBdOwotbXkgJHdvcmQgPSAkQVJHVlsxXTsKLQotbXkgQGNvbXBsZXRpb25zOwotaWYgKCR3b3JkID1+IC9eLS8pIHsKLSAgICBsaXN0KCByZXN0cmljdCggJHdvcmQsIGdldEFyZ3VtZW50cygpICkpOwotfSBlbHNpZiAoJGNtZExpbmUgPX4gLy0oZnxidWlsZGZpbGUpXHMrXFMqJC8pIHsKLSAgICBsaXN0KCBnZXRCdWlsZEZpbGVzKCR3b3JkKSApOwotfSBlbHNlIHsKLSAgICBsaXN0KCByZXN0cmljdCggJHdvcmQsIGdldFRhcmdldHMoKSApKTsKLX0KLQotZXhpdCgwKTsKLQotc3ViIGxpc3QgewotICAgIGZvciAoQF8pIHsKLSAgICAgICAgcHJpbnQgIiRfXG4iOwotICAgIH0KLX0KLQotc3ViIHJlc3RyaWN0IHsKLSAgICBteSAoJHdvcmQsIEBjb21wbGV0aW9ucykgPSBAXzsKLSAgICBncmVwKCAvXlxRJHdvcmRcRS8sIEBjb21wbGV0aW9ucyApOwotfQotCi1zdWIgZ2V0QXJndW1lbnRzIHsKLSAgICBxdygtYnVpbGRmaWxlIC1kZWJ1ZyAtZW1hY3MgLWYgLWZpbmQgLWhlbHAgLWxpc3RlbmVyIC1sb2dmaWxlIAotICAgICAgIC1sb2dnZXIgLXByb2plY3RoZWxwIC1xdWlldCAtdmVyYm9zZSAtdmVyc2lvbik7IAotfQotCi0KLXN1YiBnZXRCdWlsZEZpbGVzIHsKLSAgICBteSAoJHdvcmQpID0gQF87Ci0gICAgZ3JlcCggL1wueG1sJC8sIGdsb2IoICIkd29yZCoiICkpOwotfQotCi1zdWIgZ2V0VGFyZ2V0cyB7Ci0KLSAgICAjIExvb2sgZm9yIGJ1aWxkLWZpbGUKLSAgICBteSAkYnVpbGRGaWxlID0gJ2J1aWxkLnhtbCc7Ci0gICAgaWYgKCRjbWRMaW5lID1+IC8tKGZ8YnVpbGRmaWxlKVxzKyhcUyspLykgewotICAgICAgICAkYnVpbGRGaWxlID0gJDI7Ci0gICAgfQotICAgIHJldHVybiAoKSB1bmxlc3MgKC1mICRidWlsZEZpbGUpOwotCi0gICAgIyBSdW4gImFudCAtcHJvamVjdGhlbHAiIHRvIGxpc3QgdGFyZ2V0cy4gIEtlZXAgYSBjYWNoZSBvZiByZXN1bHRzIGluIGEKLSAgICAjIGNhY2hlLWZpbGUuCi0gICAgbXkgJGNhY2hlRmlsZSA9ICRidWlsZEZpbGU7Ci0gICAgJGNhY2hlRmlsZSA9fiBzfCguKi8pPyguKil8JHsxfS5hbnQtdGFyZ2V0cy0kezJ9fDsKLSAgICBpZiAoKCEtZSAkY2FjaGVGaWxlKSB8fCAoLU0gJGJ1aWxkRmlsZSkgPCAoLU0gJGNhY2hlRmlsZSkpIHsKLSAgICAgICAgb3BlbiggQ0FDSEUsICc+Jy4kY2FjaGVGaWxlICkgfHwgZGllICJjYW5cJ3Qgd3JpdGUgJGNhY2hlRmlsZTogJCFcbiI7Ci0gICAgICAgIG9wZW4oIEhFTFAsICIkYW50Q21kIC1wcm9qZWN0aGVscCAtZiAnJGJ1aWxkRmlsZSd8IiApIHx8IHJldHVybigpOyAKLSAgICAgICAgbXkgJXRhcmdldHM7Ci0gICAgICAgIHdoaWxlKCA8SEVMUD4gKSB7Ci0gICAgICAgICAgICBpZiAoL15ccysoXFMrKS8pIHsKLSAgICAgICAgICAgICAgICAkdGFyZ2V0c3skMX0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBteSBAdGFyZ2V0cyA9IHNvcnQga2V5cyAldGFyZ2V0czsKLSAgICAgICAgZm9yIChAdGFyZ2V0cykgeyBwcmludCBDQUNIRSAiJF9cbiI7IH0KLSAgICAgICAgcmV0dXJuIEB0YXJnZXRzOwotICAgIH0KLSAgICAKLSAgICAjIFJlYWQgdGhlIHRhcmdldC1jYWNoZQotICAgIG9wZW4oIENBQ0hFLCAkY2FjaGVGaWxlICkgfHwgZGllICJjYW5cJ3QgcmVhZCAkY2FjaGVGaWxlOiAkIVxuIjsKLSAgICBteSBAdGFyZ2V0czsKLSAgICB3aGlsZSAoPENBQ0hFPikgewotICAgICAgICBjaG9wOwotICAgICAgICBzL1xyJC8vOyAgIyBmb3IgQ3lnd2luCi0gICAgICAgIHB1c2goIEB0YXJnZXRzLCAkXyApOwotICAgIH0KLSAgICBjbG9zZSggQ0FDSEUgKTsKLSAgICBAdGFyZ2V0czsKLQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvYmluL2VudnNldC5jbWQgYi90cnVuay90b29scy9iaW4vZW52c2V0LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmYTgwNi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9iaW4vZW52c2V0LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKg0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLVNFVCBlbnZpcm9ubWVudCB2YXJpYWJsZXMNCi1GaXJzdCBvcHRpb25hbCBwYXJhbWV0ZXI6DQotICAgOyAgICAgcGFyYW1ldGVycyBhcmUgY29uc2lkZXJlZCBwYXJ0cyBvZiBhIHBhdGggdmFyaWFibGUsIHNlbWljb2xvbnMgYXJlDQotICAgICAgICAgYXBwZW5kZWQgdG8gZWFjaCBlbGVtZW50IGlmIG5vdCBhbHJlYWR5IHByZXNlbnQNCi0gICAtRCAgICBwYXJhbWV0ZXJzIGFyZSBwcm9wZXJ0aWVzIGZvciBKYXZhIG9yIE1ha2VmaWxlIGV0Yy4sIC1EIHdpbGwgYmUNCi0gICAgICAgICBwcmVwZW5kZWQgYW5kIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgc2VwYXJhdGVkIGJ5IGEgc3BhY2UNCi0gICA9RCAgICB0aGUgc2FtZSBhcyBhYm92ZSBidXQgZXF1YWwgc2lnbiBpcyBub3QgcmVxdWlyZWQNCi0gICAsICAgICBwYXJhbWV0ZXJzIHNob3VsZCBiZSBjb21tYSBzZXBhcmF0ZWQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlDQotICAgLSAgICAgcGFyYW1ldGVycyBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5IHRoZSBuZXh0IHBhcmFtZXRlcg0KLSAgIE90aGVyIHZhbHVlcyBtZWFuIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBtaXNzaW5nIGFuZCB0aGUgZW52aXJvbm1lbnQNCi0gICB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byB0aGUgc3BhY2Ugc2VwYXJhdGVkIHBhcmFtZXRlcnMNCi0NCi1TZWNvbmQgcGFyYW1ldGVyOiBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KLQ0KLU5leHQgcGFyYW1ldGVyczogdmFsdWVzDQotOyBpbXBsaWVzIHRoYXQgdGhlIGVxdWFsIHNpZ24gaXMgY29uc2lkZXJlZCBhIHBhcnQgb2YgdGhlIHBhcmFtZXRlciBhbmQgaXMNCi1ub3QgaW50ZXJwcmV0ZWQNCi0NCi0tRCByZXF1aXJlcyBwYXJhbWV0ZXJzIGluIHRoZSBmb3JtIG5hbWU9dmFsdWUuIElmIHRoZSBlcXVhbCBzaWduIGlzIG5vdCBmb3VuZCwNCi10aGUgcGFyYW1ldGVycyBhcmUgY2hhbmdlZCB0byBuYW1lPWV4cGFuZGVkX25hbWUNCi0NCi1PdGhlciBvcHRpb25zIGhhdmUgb3B0aW9uYWwgZXF1YWwgc2lnbi4gSWYgaXQgaXMgZm91bmQsIG9ubHkgdGhlIHBhcnQgYWZ0ZXINCi10aGUgZXF1YWwgc2lnbiB3aWxsIGJlIG9wcmlvbmFsbHkgZXhwYW5kZWQuDQotDQotSWYgdGhlIHBhcmFtZXRlciBpcyB0aGUgbWludXMgc2lnbiwgdGhlIG5leHQgcGFyYW1ldGVyIHdpbGwgbm90IGJlIGV4cGFuZGVkLg0KLUlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBzaW5nbGUgZG90LCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIG9mIHRoZQ0KLWVudmlyb25tZW50IHZhcmlhYmxlIGFzIGl0IGV4aXN0ZWQgYmVmb3JlIGVudnNldCB3YXMgaW52b2tlZC4NCi0NCi1Gb3Igb3RoZXIgcGFyYW1ldGVycyB0aGUgYmF0Y2ggbG9va3MgZm9yIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZQ0KLXNhbWUgbmFtZSAoaW4gdXBwZXJjYXNlKS4gSWYgaXQgaXMgZm91bmQsIGl0IGZvcm1zIHRoZSBleHBhbmRlZF9uYW1lLiBJZg0KLXRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHN1Y2ggYSBuYW1lIGRvZXMgbm90IGV4aXN0LCB0aGUgZXhwYW5kZWRfbmFtZQ0KLXdpbGwgaG9sZCB0aGUgcGFyYW1ldGVyIG5hbWUgd2l0aG91dCBjYXNlIGNvbnZlcnNpb24uDQotKi8NCi0NCi1wYXJzZSBhcmcgbW9kZSBlbnZhciBhcmdzDQotDQotZXF1YWwgPSAwDQotc2VwID0gJyAnDQotDQotLyogUGFyc2UgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKi8NCi1zZWxlY3QNCi0gIHdoZW4gbW9kZT0nLScgdGhlbiBkbw0KLSAgICBzZXAgPSBlbnZhcg0KLSAgICBwYXJzZSB2YXIgYXJncyBlbnZhciBhcmdzDQotICBlbmQNCi0gIHdoZW4gbW9kZT0nOycgdGhlbiBkbw0KLSAgICBzZXAgPSAnJw0KLSAgICBlcXVhbCA9IC0xDQotICBlbmQNCi0gIHdoZW4gbW9kZT0nLUQnIHRoZW4gZXF1YWwgPSAxDQotICB3aGVuIG1vZGU9Jz1EJyB0aGVuIG1vZGUgPSAnLUQnDQotICB3aGVuIG1vZGU9JywnIHRoZW4gc2VwID0gJywnDQotb3RoZXJ3aXNlDQotICBhcmdzID0gZW52YXIgYXJncw0KLSAgZW52YXIgPSBtb2RlDQotICBtb2RlID0gJycNCi1lbmQNCi0NCi1lbnYgPSAnT1MyRU5WSVJPTk1FTlQnDQotZW52YXIgPSB0cmFuc2xhdGUoZW52YXIpDQotb3JpZyA9IHZhbHVlKGVudmFyLCxlbnYpDQotbmV3dmFsID0gJycNCi1leHBhbmQgPSAxDQotDQotLyogZm9yIGVhY2ggcGFyYW1ldGVyLi4uICovDQotZG8gaSA9IDEgdG8gd29yZHMoYXJncykNCi0gIGlmIGV4cGFuZCA+IDAgJiB3b3JkKGFyZ3MsIGkpID0gJy0nIHRoZW4gZXhwYW5kID0gMA0KLSAgZWxzZSBjYWxsIGFkZHZhbCB3b3JkKGFyZ3MsIGkpDQotZW5kDQotDQotLyogT3B0aW9uYWxseSBlbmNsb3NlIHBhdGggdmFyaWFibGUgYnkgcXVvdGVzICovDQotaWYgbW9kZSA9ICc7JyAmIHBvcygnICcsIG5ld3ZhbCkgPiAwIHRoZW4gbmV3dmFsID0gJyInIHx8IG5ld3ZhbCB8fCAnIicNCi0NCi0vKiBTZXQgdGhlIG5ldyB2YWx1ZSwgJ1NFVCcgY2Fubm90IGJlIHVzZWQgc2luY2UgaXQgZG9lcyBub3QgYWxsb3cgJz0nICovDQoteCA9IHZhbHVlKGVudmFyLCBuZXd2YWwsIGVudikNCi1leGl0IDANCi0NCi1hZGR2YWw6IHByb2NlZHVyZSBleHBvc2Ugc2VwIGVxdWFsIG9yaWcgZXhwYW5kIG5ld3ZhbCBtb2RlIGVudg0KLXBhcnNlIGFyZyB2YXINCi0NCi1pZiB2YXIgPSAnLicgdGhlbiBleHB2YXIgPSBvcmlnDQotZWxzZSBkbw0KLSAgaWYgZXF1YWwgPj0gMCB0aGVuIGRvDQotICAgIHBhcnNlIHZhciB2YXIgbmFtZSAnPScgdmFsDQotICAgIGlmIHZhbCA9ICcnIHRoZW4gdmFyID0gbmFtZQ0KLSAgICBlbHNlIHZhciA9IHZhbA0KLSAgZW5kDQotICBpZiBleHBhbmQgPSAwIHRoZW4gZXhwdmFyID0gdmFyDQotICBlbHNlIGV4cHZhciA9IHZhbHVlKHRyYW5zbGF0ZSh2YXIpLCxlbnYpDQotICBpZiBleHB2YXIgPSAnJyB0aGVuIGV4cHZhciA9IHZhcg0KLSAgaWYgZXF1YWwgPj0gMCB0aGVuIGRvDQotICAgIGlmIHZhbCA9ICcnIHRoZW4gZG8NCi0gICAgICBwYXJzZSB2YXIgZXhwdmFyIGtleSAnPScgdmFsDQotICAgICAgaWYgdmFsIDw+ICcnIHRoZW4gbmFtZSA9IGtleQ0KLSAgICAgIGVsc2UgZG8NCi0gICAgICAgIGlmIGVxdWFsID4gMCB0aGVuIHZhbCA9IGtleQ0KLSAgICAgICAgZWxzZSBuYW1lID0ga2V5DQotICAgICAgZW5kDQotICAgIGVuZA0KLSAgICBlbHNlIHZhbCA9IGV4cHZhcg0KLSAgICBpZiBwb3MoJyAnLCB2YWwpID4gMCB8IHBvcygnPScsIHZhbCkgPiAwIHRoZW4gdmFsID0gJyInIHx8IHZhbCB8fCAnIicNCi0gICAgaWYgdmFsID0gJycgdGhlbiBleHB2YXIgPSBuYW1lDQotICAgIGVsc2UgZXhwdmFyID0gbmFtZSB8fCAnPScgfHwgdmFsDQotICBlbmQNCi0gIGlmIG1vZGUgPSAnLUQnIHRoZW4gZXhwdmFyID0gJy1EJyB8fCBleHB2YXINCi0gIGlmIG1vZGUgPSAnOycgdGhlbiBkbw0KLSAgICBpZiByaWdodChleHB2YXIsIDEpIDw+ICc7JyB0aGVuIGV4cHZhciA9IGV4cHZhciB8fCAnOycNCi0gIGVuZA0KLWVuZA0KLQ0KLWlmIG5ld3ZhbCA9ICcnIHRoZW4gbmV3dmFsID0gZXhwdmFyDQotZWxzZSBuZXd2YWwgPSBuZXd2YWwgfHwgc2VwIHx8IGV4cHZhcg0KLWV4cGFuZCA9IDENCi1yZXR1cm4NCmRpZmYgLS1naXQgYS90cnVuay90b29scy9iaW4vbGNwLmJhdCBiL3RydW5rL3Rvb2xzL2Jpbi9sY3AuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTIyMDRjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2Jpbi9sY3AuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcmVtICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1yZW0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXJlbSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLXJlbSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi1yZW0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotcmVtICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLXJlbQ0KLXJlbSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLXJlbQ0KLXJlbSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLXJlbSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1yZW0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLXJlbSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLXJlbSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotc2V0IF9DTEFTU1BBVEhDT01QT05FTlQ9JTENCi1pZiAiIiUxIiI9PSIiIiIgZ290byBnb3RBbGxBcmdzDQotc2hpZnQNCi0NCi06YXJnQ2hlY2sNCi1pZiAiIiUxIiI9PSIiIiIgZ290byBnb3RBbGxBcmdzDQotc2V0IF9DTEFTU1BBVEhDT01QT05FTlQ9JV9DTEFTU1BBVEhDT01QT05FTlQlICUxDQotc2hpZnQNCi1nb3RvIGFyZ0NoZWNrDQotDQotOmdvdEFsbEFyZ3MNCi1zZXQgTE9DQUxDTEFTU1BBVEg9JV9DTEFTU1BBVEhDT01QT05FTlQlOyVMT0NBTENMQVNTUEFUSCUNCi0NCmRpZmYgLS1naXQgYS90cnVuay90b29scy9iaW4vcnVuYW50LnBsIGIvdHJ1bmsvdG9vbHMvYmluL3J1bmFudC5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4MzA3YS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9iaW4vcnVuYW50LnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBydW5hbnQucGwKLSMKLSMgd3JhcHBlciBzY3JpcHQgZm9yIGludm9raW5nIGFudCBpbiBhIHBsYXRmb3JtIHdpdGggUGVybCBpbnN0YWxsZWQKLSMgdGhpcyBtYXkgaW5jbHVkZSBjZ2ktYmluIGludm9jYXRpb24sIHdoaWNoIGlzIGNvbnNpZGVyZWQgc29tZXdoYXQgZGFmdC4KLSMgKHNsbzogdGhhdCBzaG91bGQgYmUgYSBzZXBhcmF0ZSBmaWxlIHdoaWNoIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhpcwotIyBhbmQgcmV0dXJucyB0aGUgWE1MIGZvcm1hdHRlZCBvdXRwdXQpCi0jCi0jIHRoZSBjb2RlIGlzIG5vdCB0b3RhbGx5IHBvcnRhYmxlIGR1ZSB0byBjbGFzc3BhdGggYW5kIGRpcmVjdG9yeSBzcGxpdHRpbmcKLSMgaXNzdWVzLiBvb3BzLiAoTkIsIHVzZSBGaWxlOjpTcGVjOjpGdW5jdGlvbnMgIHdpbGwgaGVscCBhbmQgdGhlIGNvZGUgaXMKLSMgc3RydWN0dXJlZCBmb3IgdGhlIGNhdGZpbGUoKSBjYWxsLCBidXQgYmVjYXVzZSBvZiBwZXJsIHZlcnNpb24gZnVubmllcwotIyB0aGUgY29kZSBpcyBub3QgaW5jbHVkZWQuIAotIwotIyBjcmVhdGVkOiAgICAgICAgIDIwMDAtOC0yNAotIyBhdXRob3I6ICAgICAgICAgIFN0ZXZlIExvdWdocmFuIHN0ZXZlX2xAc291cmNlZm9yZ2UubmV0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBBc3N1bXB0aW9uczoKLSMKLSMgLSB0aGUgImphdmEiIGV4ZWN1dGFibGUvc2NyaXB0IGlzIG9uIHRoZSBjb21tYW5kIHBhdGgKLSMgLSBBTlRfSE9NRSBoYXMgYmVlbiBzZXQKLSMgLSB0YXJnZXQgcGxhdGZvcm0gdXNlcyAiOiIgYXMgY2xhc3NwYXRoIHNlcGFyYXRvciBvciBwZXJsIGluZGljYXRlcyBpdCBpcyBkb3Mvd2luMzIKLSMgLSB0YXJnZXQgcGxhdGZvcm0gdXNlcyAiLyIgYXMgZGlyZWN0b3J5IHNlcGFyYXRvci4KLQotI2JlIGZ1c3N5IGFib3V0IHZhcmlhYmxlcwotdXNlIHN0cmljdDsKLQotI3BsYXRmb3JtIHNwZWNpZmljcyAoZGlzYWJsZWQpCi0jdXNlIEZpbGU6OlNwZWM6OkZ1bmN0aW9uczsKLQotI3R1cm4gd2FybmluZ3Mgb24gZHVyaW5nIGRldjsgZ2VuZXJhdGVzIGEgZmV3IHNwdXJpb3VzIHVuaW5pdGlhbGlzZWQgdmFyIGFjY2VzcyB3YXJuaW5ncwotI3VzZSB3YXJuaW5nczsKLQotI2FuZCBzZXQgJGRlYnVnIHRvIDEgdG8gdHVybiBvbiB0cmFjZSBpbmZvCi1teSAkZGVidWc9MTsKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgY2hlY2sgdG8gbWFrZSBzdXJlIGVudmlyb25tZW50IGlzIHNldHVwCi0jCi0KLW15ICRIT01FID0gJEVOVntBTlRfSE9NRX07Ci1pZiAoJEhPTUUgZXEgIiIpCi0gICAgICAgIHsKLSAgICBkaWUgIlxuXG5BTlRfSE9NRSAqTVVTVCogYmUgc2V0IVxuXG4iOwotICAgICAgICB9Ci0KLW15ICRKQVZBQ01EID0gJEVOVntKQVZBQ01EfTsKLSRKQVZBQ01EID0gImphdmEiIGlmICRKQVZBQ01EIGVxICIiOwotCi1teSAkb25uZXR3YXJlID0gMDsKLWlmICgkXk8gZXEgIk5ldFdhcmUiKQotewotICAkb25uZXR3YXJlID0gMTsKLX0KLQotbXkgJG9uY3lnd2luID0gKCReTyBlcSAiY3lnd2luIik7Ci0KLSNJU1NVRTogd2hhdCBqYXZhIHdhbnRzIHRvIHNwbGl0IHVwIGNsYXNzcGF0aCB2YXJpZXMgZnJvbSBwbGF0Zm9ybSB0byBwbGF0Zm9ybSAKLSNhbmQgcGVybCBpcyBub3QgdG9vIGhvdCBhdCBoaW50aW5nIHdoaWNoIGJveCBpdCBpcyBvbi4KLSNoZXJlIEkgYXNzdW1lICI6IiAnY2VwdCBvbiB3aW4zMiwgZG9zLCBhbmQgbmV0d2FyZS4gQWRkIGV4dHJhIHRlc3RzIGhlcmUgYXMgbmVlZGVkLgotbXkgJHM9IjoiOwotaWYoKCReTyBlcSAiTVNXaW4zMiIpIHx8ICgkXk8gZXEgImRvcyIpIHx8ICgkXk8gZXEgImN5Z3dpbiIpIHx8Ci0gICAoJG9ubmV0d2FyZSA9PSAxKSkKLSAgICAgICAgewotICAgICAgICAkcz0iOyI7Ci0gICAgICAgIH0KLQotI2J1aWxkIHVwIHN0YW5kYXJkIGNsYXNzcGF0aAotbXkgJGxvY2FscGF0aCA9ICIkSE9NRS9saWIvYW50LWxhdW5jaGVyLmphciI7Ci0jc2V0IEpWTSBvcHRpb25zIGFuZCBBbnQgYXJndW1lbnRzLCBpZiBhbnkKLW15IEBBTlRfT1BUUz1zcGxpdCgiICIsICRFTlZ7QU5UX09QVFN9KTsKLW15IEBBTlRfQVJHUz1zcGxpdCgiICIsICRFTlZ7QU5UX0FSR1N9KTsKLQotI2ppa2VzCi1pZigkRU5We0pJS0VTUEFUSH0gbmUgIiIpCi0gICAgICAgIHsKLSAgICAgICAgcHVzaCBAQU5UX09QVFMsICItRGppa2VzLmNsYXNzLnBhdGg9JEVOVntKSUtFU1BBVEh9IjsKLSAgICAgICAgfQotCi0jY29uc3RydWN0IGFyZ3VtZW50cyB0byBqYXZhCi1teSBAQVJHUzsKLXB1c2ggQEFSR1MsIEBBTlRfT1BUUzsKLQotbXkgJENZR0hPTUUgPSAiIjsKLQotbXkgJGNsYXNzcGF0aD0kRU5We0NMQVNTUEFUSH07Ci1pZiAoJG9uY3lnd2luID09IDEpIHsKLSAgJGxvY2FscGF0aCA9IGBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgJGxvY2FscGF0aGA7Ci0gIGNob21wICgkbG9jYWxwYXRoKTsKLSAgaWYgKCEgJGNsYXNzcGF0aCBlcSAiIikKLSAgewotICAgICRjbGFzc3BhdGggPSBgY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkY2xhc3NwYXRoImA7Ci0gICAgY2hvbXAgKCRjbGFzc3BhdGgpOwotICB9Ci0gICRIT01FID0gYGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAkSE9NRWA7Ci0gIGNob21wICgkSE9NRSk7Ci0gICRDWUdIT01FID0gYGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAkRU5We0hPTUV9YDsKLSAgY2hvbXAgKCRDWUdIT01FKTsKLX0KLXB1c2ggQEFSR1MsICItY2xhc3NwYXRoIiwgIiRsb2NhbHBhdGgiOwotcHVzaCBAQVJHUywgIi1EYW50LmhvbWU9JEhPTUUiOwotaWYgKCAhICRDWUdIT01FIGVxICIiICkKLXsKLSAgcHVzaCBAQVJHUywgIi1EY3lnd2luLnVzZXIuaG9tZT1cIiRDWUdIT01FXCIiCi19Ci1wdXNoIEBBUkdTLCAib3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyIiwgQEFOVF9BUkdTOwotcHVzaCBAQVJHUywgQEFSR1Y7Ci1pZiAoISAkY2xhc3NwYXRoIGVxICIiKQotewotICBpZiAoJG9ubmV0d2FyZSA9PSAxKQotICB7Ci0gICAgIyBtYWtlIGNsYXNzcGF0aCBsaXRlcmFsbHkgJENMQVNTUEFUSAotICAgICMgdGhpcyBpcyB0byBhdm9pZCBwdXNoaW5nIHVzIG92ZXIgdGhlIDUxMiBjaGFyYWN0ZXIgbGltaXQKLSAgICAjIGV2ZW4gc2tpcCB0aGUgOyAtIHRoYXQgaXMgYWxyZWFkeSBpbiAkbG9jYWxwYXRoCi0gICAgcHVzaCBAQVJHUywgIi1saWIiLCAiXCRDTEFTU1BBVEgiOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHB1c2ggQEFSR1MsICItbGliIiwgIiRjbGFzc3BhdGgiOwotICB9Ci19Ci1wcmludCAiXG4gJEpBVkFDTUQgQEFSR1NcblxuIiBpZiAoJGRlYnVnKTsKLQotbXkgJHJldHVyblZhbHVlID0gc3lzdGVtICRKQVZBQ01ELCBAQVJHUzsKLWlmICgkcmV0dXJuVmFsdWUgZXEgMCkKLSAgICAgICAgewotICAgICAgICBleGl0IDA7Ci0gICAgICAgIH0KLWVsc2UKLSAgICAgICAgewotICAgICAgICAjIG9ubHkgMCBhbmQgMSBhcmUgd2lkZWx5IHJlY29nbml6ZWQgYXMgZXhpdCB2YWx1ZXMKLSAgICAgICAgIyBzbyBjaGFuZ2UgdGhlIGV4aXQgdmFsdWUgdG8gMQotICAgICAgICBleGl0IDE7Ci0gICAgICAgIH0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2Jpbi9ydW5hbnQucHkgYi90cnVuay90b29scy9iaW4vcnVuYW50LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjRlZThjLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2Jpbi9ydW5hbnQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0iIiIKLQotIHJ1bmFudC5weQotCi0gICAgVGhpcyBzY3JpcHQgaXMgYSB0cmFuc2xhdGlvbiBvZiB0aGUgcnVuYW50LnBsIHdyaXR0ZW4gYnkgU3RldmUgTG91Z2hyYW4uCi0gICAgSXQgcnVucyBhbnQgd2l0aC9vdXQgYXJndW1lbnRzLCBpdCBzaG91bGQgYmUgcXVpdGUgcG9ydGFibGUgKHRoYW5rcyB0bwotICAgIHRoZSBweXRob24gb3MgbGlicmFyeSkKLSAgICBUaGlzIHNjcmlwdCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBQeXRob24yLjAvV2luMksKLQotIGNyZWF0ZWQ6ICAgICAgICAgMjAwMS0wNC0xMQotIGF1dGhvcjogICAgICAgICAgUGllcnJlIERpdHRnZW4gcGllcnJlLmRpdHRnZW5AY3JpbHRlbGVjb20uY29tCi0KLSBBc3N1bXB0aW9uczoKLQotIC0gdGhlICJqYXZhIiBleGVjdXRhYmxlL3NjcmlwdCBpcyBvbiB0aGUgY29tbWFuZCBwYXRoCi0iIiIKLWltcG9ydCBvcywgb3MucGF0aCwgc3RyaW5nLCBzeXMKLQotIyBDaGFuZ2UgaXQgdG8gMSB0byBnZXQgZXh0cmEgZGVidWcgaW5mb3JtYXRpb24KLWRlYnVnID0gMAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIElmIEFOVF9IT01FIGlzIG5vdCBzZXQgZGVmYXVsdCB0byBzY3JpcHQncyBwYXJlbnQgZGlyZWN0b3J5Ci1pZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0FOVF9IT01FJyk6Ci0gICAgQU5UX0hPTUUgPSBvcy5lbnZpcm9uWydBTlRfSE9NRSddCi1lbHNlOgotICAgIEFOVF9IT01FID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMF0pKSkKLQotIyBzZXQgQU5UX0xJQiBsb2NhdGlvbgotQU5UX0xJQiA9IG9zLnBhdGguam9pbihBTlRfSE9NRSwgJ2xpYicpCi0KLSMgc2V0IEpBVkFDTUQgKGNoZWNrIHZhcmlhYmxlcyBKQVZBQ01EIGFuZCBKQVZBX0hPTUUpCi1KQVZBQ01EID0gTm9uZQotaWYgbm90IG9zLmVudmlyb24uaGFzX2tleSgnSkFWQUNNRCcpOgotICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgnSkFWQV9IT01FJyk6Ci0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5lbnZpcm9uWydKQVZBX0hPTUUnXSk6Ci0gICAgICAgICAgICBwcmludCAiV2FybmluZzogSkFWQV9IT01FIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseS4iCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBKQVZBQ01EID0gb3MucGF0aC5qb2luKG9zLmVudmlyb25bJ0pBVkFfSE9NRSddLCAnYmluJywgJ2phdmEnKQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICJXYXJuaW5nOiBKQVZBX0hPTUUgbm90IHNldC4iCi1lbHNlOgotICAgIEpBVkFDTUQgPSBvcy5lbnZpcm9uWydKQVZBQ01EJ10KLWlmIG5vdCBKQVZBQ01EOgotICAgIEpBVkFDTUQgPSAnamF2YScKLQotbGF1bmNoZXJfamFyID0gb3MucGF0aC5qb2luKEFOVF9MSUIsICdhbnQtbGF1bmNoZXIuamFyJykKLWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhsYXVuY2hlcl9qYXIpOgotICAgIHByaW50ICdVbmFibGUgdG8gbG9jYXRlIGFudC1sYXVuY2hlci5qYXIuIEV4cGVjdGVkIHRvIGZpbmQgaXQgaW4gJXMnICUgXAotICAgICAgICBBTlRfTElCCi0KLSMgQnVpbGQgdXAgc3RhbmRhcmQgY2xhc3NwYXRoIChMT0NBTENMQVNTUEFUSCkKLUxPQ0FMQ0xBU1NQQVRIID0gbGF1bmNoZXJfamFyCi1pZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0xPQ0FMQ0xBU1NQQVRIJyk6Ci0gICAgTE9DQUxDTEFTU1BBVEggKz0gb3MucGF0aHNlcCArIG9zLmVudmlyb25bJ0xPQ0FMQ0xBU1NQQVRIJ10KLQotQU5UX09QVFMgPSAiIgotaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdBTlRfT1BUUycpOgotICAgIEFOVF9PUFRTID0gb3MuZW52aXJvblsnQU5UX09QVFMnXQotCi1PUFRTID0gIiIKLWlmIG9zLmVudmlyb24uaGFzX2tleSgnSklLRVNQQVRIJyk6Ci0gICAgT1BUUyA9ICctRGppa2VzLmNsYXNzLnBhdGg9XCIlc1wiJyAlIG9zLmVudmlyb25bJ0pJS0VTUEFUSCddCi0KLUFOVF9BUkdTID0gIiIKLWlmIG9zLmVudmlyb24uaGFzX2tleSgnQU5UX0FSR1MnKToKLSAgICBBTlRfQVJHUyA9IG9zLmVudmlyb25bJ0FOVF9BUkdTJ10KLQotQ0xBU1NQQVRIID0gIiIKLWlmIG9zLmVudmlyb24uaGFzX2tleSgnQ0xBU1NQQVRIJyk6Ci0gICAgQ0xBU1NQQVRIID0gb3MuZW52aXJvblsnQ0xBU1NQQVRIJ10KLQotIyBCdWlsZHMgdGhlIGNvbW1hbmRsaW5lCi1jbWRsaW5lID0gKCclcyAlcyAtY2xhc3NwYXRoICVzIC1EYW50LmhvbWU9JXMgJXMgJyArIFwKLSAgICAnb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyICVzIC1saWIgJXMgJXMnKSBcCi0gICAgICUgKEpBVkFDTUQsIEFOVF9PUFRTLCBMT0NBTENMQVNTUEFUSCwgQU5UX0hPTUUsIE9QVFMsIEFOVF9BUkdTLCBcCi0gICAgICAgIENMQVNTUEFUSCwgc3RyaW5nLmpvaW4oc3lzLmFyZ3ZbMTpdLCAnICcpKQotCi1pZiBkZWJ1ZzoKLSAgICBwcmludCAnXG4lc1xuXG4nICUgKGNtZGxpbmUpCi0KLSMgUnVuIHRoZSBiaW5pb3UhCi1vcy5zeXN0ZW0oY21kbGluZSkKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2Jpbi9ydW5yYy5jbWQgYi90cnVuay90b29scy9iaW4vcnVucmMuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ2MjY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2Jpbi9ydW5yYy5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiANCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0gICAgUnVuIFJDIGZpbGUsIG5hbWUgaXMgaW4gdGhlIGZpcnN0IGFyZywgc2Vjb25kIGFyZyBpcyBlaXRoZXIgUEFUSA0KLSAgICBFTlYgIG9yIC1yIG9yIG5vdGhpbmcgDQotKi8NCi0NCi1wYXJzZSBhcmcgbmFtZSBwYXRoIHJlc3QNCi0NCi1pZiBuYW1lID0gJycgdGhlbiBkbw0KLSAgc2F5ICdSQyBmaWxlIG5hbWUgaXMgbWlzc2luZycNCi0gIGV4aXQgMQ0KLWVuZA0KLQ0KLWlmIHJlc3QgXD0gJycgdGhlbiBkbw0KLSAgc2F5ICdUb28gbWFueSBwYXJhbWV0ZXJzJw0KLSAgZXhpdCAxDQotZW5kDQotDQotY2FsbCBydW5pdCBuYW1lIHBhdGgNCi1leGl0IDANCi0NCi1ydW5pdDogcHJvY2VkdXJlDQotcGFyc2UgYXJnIG5hbWUgcGF0aCBkaXINCi0NCi1pZiBwYXRoIFw9ICcnICYgcGF0aCBcPSAnLXInIHRoZW4gZG8NCi0gIGRpciA9IHZhbHVlKHRyYW5zbGF0ZShwYXRoKSwsJ09TMkVOVklST05NRU5UJykNCi0gIGlmIGRpciA9ICcnIHRoZW4gcmV0dXJuDQotICBkaXIgPSB0cmFuc2xhdGUoZGlyLCAnXCcsICcvJykgLyogY2hhbmdlIFVOSVgtbGlrZSBwYXRoIHRvIE9TLzIgKi8NCi1lbmQNCi0NCi1pZiBkaXIgPSAnJyB0aGVuIGRpciA9IGRpcmVjdG9yeSgpDQotDQotaWYgcGF0aCA9ICctcicgdGhlbiBkbyAvKiByZWN1cnNpdmUgY2FsbCAqLw0KLSAgc3ViZGlyID0gZmlsZXNwZWMoJ3BhdGgnLCBkaXIpDQotICBpZiBzdWJkaXIgXD0gJ1wnIHRoZW4gZG8NCi0gICAgc3ViZGlyID0gbGVmdChzdWJkaXIsIGxlbmd0aChzdWJkaXIpLTEpDQotICAgIGNhbGwgcnVuaXQgbmFtZSBwYXRoIGZpbGVzcGVjKCdkcml2ZScsIGRpcikgfHwgc3ViZGlyDQotICBlbmQNCi1lbmQNCi0NCi0vKiBMb29rIGZvciB0aGUgZmlsZSBhbmQgcnVuIGl0ICovDQotaWYgcmlnaHQoZGlyLCAxKSBcPSAnXCcgdGhlbiBkaXIgPSBkaXIgfHwgJ1wnDQotcmNmaWxlID0gc3RyZWFtKGRpciB8fCBuYW1lLCAnYycsICdxdWVyeSBleGlzdHMnKQ0KLWlmIHJjZmlsZSBcPSAnJyB0aGVuIGludGVycHJldCAnY2FsbCAiJyB8fCByY2ZpbGUgfHwgJyInDQotDQotcmV0dXJuDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvY29uZmlndXJlL1JFQURNRS50eHQgYi90cnVuay90b29scy9jb25maWd1cmUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1ZDhhYS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9jb25maWd1cmUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgY2xhc3NlcyB3aGljaCBhcmUgY2FsbGVkIGJ5IHRoZSBjb25maWd1cmUgcHJvY2VzcwotCi1CdWlsZCB0aGVzZSBjbGFzc2VzIChpbiBjYXNlIG9mIGFuIHVwZGF0ZSkgd2l0aAotCi0uL2J1aWxkLnNoIGNvbXBpbGUtY29uZmlndXJlCmRpZmYgLS1naXQgYS90cnVuay90b29scy9jb25maWd1cmUvYnVpbGQueG1sIGIvdHJ1bmsvdG9vbHMvY29uZmlndXJlL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjZDQwYS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9jb25maWd1cmUvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgZGVmYXVsdD0iY29tcGlsZSIgbmFtZT0ibGVueWEtY29uZmlndXJlIj4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlIGphdmEgY2xhc3NlcyBhbmQgY3JlYXRlIGxpYnMiPgotICAgIDxlY2hvPkhlbGxvIENvbmZpZ3VyZSBCdWlsZCBUb29sLiBTZWUgUkVBRE1FLnR4dDwvZWNobz4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay90b29scy9jb25maWd1cmUvbGliL2FwYWNoZS1sZW55YS1jb25maWd1cmUtY29yZS0xLjQtZGV2LXI0MTQ1NzkuamFyIGIvdHJ1bmsvdG9vbHMvY29uZmlndXJlL2xpYi9hcGFjaGUtbGVueWEtY29uZmlndXJlLWNvcmUtMS40LWRldi1yNDE0NTc5LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4NWRhNS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9jb25maWd1cmUvbGliL2FwYWNoZS1sZW55YS1jb25maWd1cmUtY29yZS0xLjQtZGV2LXI0MTQ1NzkuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvY29uZmlndXJlL2xpYi9hcGFjaGUtbGVueWEtY29uZmlndXJlLWltcGwtMS40LWRldi1yNDE0NTc5LmphciBiL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9saWIvYXBhY2hlLWxlbnlhLWNvbmZpZ3VyZS1pbXBsLTEuNC1kZXYtcjQxNDU3OS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDRjZTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvY29uZmlndXJlL2xpYi9hcGFjaGUtbGVueWEtY29uZmlndXJlLWltcGwtMS40LWRldi1yNDE0NTc5LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9jb3JlL0NvbmZpZ3VyYXRpb24uamF2YSBiL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9jb3JlL0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUwYWUzZC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS9Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5jb3JlOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24KLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb24gewotCi0gICAgcHJvdGVjdGVkIFBhcmFtZXRlcltdIHBhcmFtczsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHVibGljIFBhcmFtZXRlcltdIGdldFBhcmFtZXRlcnMoKTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHVibGljIFBhcmFtZXRlcltdIGdldENvbmZpZ3VyYWJsZVBhcmFtZXRlcnMoKTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYocGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhwYXJhbXNbaV0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IHBhcmFtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYobmFtZS5lcXVhbHMocGFyYW1zW2ldLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcmVhZERlZmF1bHQoKTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcmVhZExvY2FsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIGRlZmF1bHQgYW5kIGxvY2FsIGFuZCBjb21iaW5lIHRoZSB0d28gb2YgdGhlbQotICAgICAqLwotICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHJlYWQoKTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uRGVmYXVsdCgpOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25Mb2NhbCgpOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCB3cml0ZUxvY2FsKCk7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGxvY2FsQ29uZmlnRXhpc3RzKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS9Db25maWd1cmVDb21tYW5kTGluZS5qYXZhIGIvdHJ1bmsvdG9vbHMvY29uZmlndXJlL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY29uZmlnL2NvcmUvQ29uZmlndXJlQ29tbWFuZExpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1ZmNlMi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS9Db25maWd1cmVDb21tYW5kTGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmNvcmUuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5jb3JlLkZpbGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmNvcmUuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmltcGwuQnVpbGRQcm9wZXJ0aWVzQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBIGNvbW1hbmQgbGluZSB0b29sIHRvIGNvbmZpZ3VyZSBMZW55YSBidWlsZAotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ29uZmlndXJlQ29tbWFuZExpbmUgewotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIHZvaWQgY2hhbmdlQ29uZmlndXJhdGlvbnMoVmVjdG9yIGNvbmZpZ3MpIHsKLQotICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IChDb25maWd1cmF0aW9uKSBjb25maWdzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGNvbmZpZy5yZWFkKCk7Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IGNvbmZpZy5nZXRDb25maWd1cmFibGVQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICByZWFkUGFyYW1ldGVycyhwYXJhbXMsIGNvbmZpZyk7Ci0KLSAgICAgICAgICAgIGlmIChjb25maWcubG9jYWxDb25maWdFeGlzdHMoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5XQVJOSU5HOiBMb2NhbCBjb25maWd1cmF0aW9uIGFscmVhZHkgZXhpc3RzISIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIkRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSAoeS9OKT8gIik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscygieSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud3JpdGVMb2NhbCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbCBjb25maWd1cmF0aW9uIGhhcyBOT1QgYmVlbiBvdmVyd3JpdHRlbi4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb25maWcud3JpdGVMb2NhbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwdWJsaWMgVmVjdG9yIHNldENvbmZpZ3VyYXRpb25zKFN0cmluZyByb290RGlyKTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIHJlYWRQYXJhbWV0ZXJzKFBhcmFtZXRlcltdIHBhcmFtcywgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwotCSAgICBmb3IgKGludCBrID0gMDsgayA8IHBhcmFtcy5sZW5ndGg7IGsrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbm90T0sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm90T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5QYXJhbWV0ZXIgIiArIHBhcmFtc1trXS5nZXROYW1lKCkgKyAiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIERlZmF1bHQgVmFsdWUgICAgICAgIDogIiArIHBhcmFtc1trXS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgTG9jYWwgVmFsdWUgICAgICAgICAgOiAiICsgcGFyYW1zW2tdLmdldExvY2FsVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ICAoIiAgTmV3IExvY2FsIFZhbHVlIChkL0wpOiAiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCBuZXcgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUuZXF1YWxzKCJkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHBhcmFtc1trXS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUuZXF1YWxzKCJMIikgfHwgbmV3VmFsdWUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gcGFyYW1zW2tdLmdldExvY2FsVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBlbnRlcmVkIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zW2tdLnRlc3QobmV3VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2tdLnNldExvY2FsVmFsdWUobmV3VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdE9LID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICBXQVJOSU5HOiBObyBzdWNoIHZhbHVlIGF2YWlsYWJsZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhVmFsdWVzID0gcGFyYW1zW2tdLmdldEF2YWlsYWJsZVZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIiAgICAgICAgICAgQXZhaWxhYmxlIHZhbHVlczogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhVmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoYVZhbHVlc1tqXSArICIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgICAgICAgIFJlLWVudGVyIHZhbHVlIC4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFZhbHVlIGVudGVyZWQgICAgICAgIDogIiArIHBhcmFtc1trXS5nZXRMb2NhbFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJbXSBzdWJQYXJhbXMgPSBwYXJhbXNba10uZ2V0U3Vic2VxdWVudFBhcmFtZXRlcnMocGFyYW1zW2tdLmdldExvY2FsVmFsdWUoKSwgY29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3AgPSAiIjsKLQkgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdWJQYXJhbXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcCA9IHNwICsgc3ViUGFyYW1zW2pdLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSBzdWJQYXJhbXMubGVuZ3RoIC0xKSBzcCA9IHNwICsgIiwgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAiICsgc3ViUGFyYW1zLmxlbmd0aCArICIgU3Vic2VxdWVudCBQYXJhbXMgIDogIiArIHNwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRQYXJhbWV0ZXJzKHN1YlBhcmFtcywgY29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRQYXJhbWV0ZXIocGFyYW1zW2tdKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS9Db250ZXh0RXZlbnRRdWV1ZS5qYXZhIGIvdHJ1bmsvdG9vbHMvY29uZmlndXJlL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY29uZmlnL2NvcmUvQ29udGV4dEV2ZW50UXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxNWQyNC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS9Db250ZXh0RXZlbnRRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLWltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OwotaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5EYXRhRmxhdm9yOwotaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5UcmFuc2ZlcmFibGU7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQb3B1cE1lbnU7Ci1pbXBvcnQgamF2YXguc3dpbmcuTWVudVNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5KVGV4dENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIENvbnRleHRFdmVudFF1ZXVlIGV4dGVuZHMgRXZlbnRRdWV1ZSB7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hFdmVudChBV1RFdmVudCBldmVudCkgewotICAgICAgICBzdXBlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKLSAgICAgICAgCi0gICAgICAgIGlmICghKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBNb3VzZUV2ZW50IG1lID0gKE1vdXNlRXZlbnQpIGV2ZW50OwotICAgICAgICAKLSAgICAgICAgaWYgKCFtZS5pc1BvcHVwVHJpZ2dlcigpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgQ29tcG9uZW50IGNvbXAgPSBTd2luZ1V0aWxpdGllcy5nZXREZWVwZXN0Q29tcG9uZW50QXQoCi0gICAgICAgICAgICAgICAgbWUuZ2V0Q29tcG9uZW50KCksIG1lLmdldFgoKSwgbWUuZ2V0WSgpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghKGNvbXAgaW5zdGFuY2VvZiBKVGV4dENvbXBvbmVudCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBpZiAoTWVudVNlbGVjdGlvbk1hbmFnZXIuZGVmYXVsdE1hbmFnZXIoKS5nZXRTZWxlY3RlZFBhdGgoKS5sZW5ndGggPiAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgSlRleHRDb21wb25lbnQgdGMgPSAoSlRleHRDb21wb25lbnQpIGNvbXA7Ci0gICAgICAgIEpQb3B1cE1lbnUgbWVudSA9IG5ldyBKUG9wdXBNZW51KCk7Ci0gICAgICAgIAotICAgICAgICBtZW51LmFkZChuZXcgQ29weUFjdGlvbih0YykpOwotICAgICAgICBtZW51LmFkZChuZXcgQ3V0QWN0aW9uKHRjKSk7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBQYXN0ZUFjdGlvbih0YykpOwotICAgICAgICBtZW51LmFkZFNlcGFyYXRvcigpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VsZWN0QWxsQWN0aW9uKHRjKSk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgUG9pbnQgcHQgPSBTd2luZ1V0aWxpdGllcy5jb252ZXJ0UG9pbnQobWUuZ2V0Q29tcG9uZW50KCksCi0gICAgICAgICAgICAgICAgbWUuZ2V0UG9pbnQoKSwgdGMpOwotICAgICAgICBtZW51LnNob3codGMsIHB0LngsIHB0LnkpOwotICAgIH0KLX0KLQotY2xhc3MgQ3V0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gewotICAgIEpUZXh0Q29tcG9uZW50IGNvbXA7Ci0gICAgCi0gICAgcHVibGljIEN1dEFjdGlvbihKVGV4dENvbXBvbmVudCBjb21wKSB7Ci0gICAgICAgIHN1cGVyKCJDdXQiKTsKLSAgICAgICAgdGhpcy5jb21wID0gY29tcDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgY29tcC5jdXQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gY29tcC5pc0VkaXRhYmxlKCkgJiYgY29tcC5pc0VuYWJsZWQoKQotICAgICAgICAmJiBjb21wLmdldFNlbGVjdGVkVGV4dCgpICE9IG51bGw7Ci0gICAgfQotfQotCi1jbGFzcyBQYXN0ZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKLSAgICBKVGV4dENvbXBvbmVudCBjb21wOwotICAgIAotICAgIHB1YmxpYyBQYXN0ZUFjdGlvbihKVGV4dENvbXBvbmVudCBjb21wKSB7Ci0gICAgICAgIHN1cGVyKCJQYXN0ZSIpOwotICAgICAgICB0aGlzLmNvbXAgPSBjb21wOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBjb21wLnBhc3RlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKGNvbXAuaXNFZGl0YWJsZSgpICYmIGNvbXAuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIFRyYW5zZmVyYWJsZSBjb250ZW50cyA9IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKQotICAgICAgICAgICAgLmdldFN5c3RlbUNsaXBib2FyZCgpLmdldENvbnRlbnRzKHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRzLmlzRGF0YUZsYXZvclN1cHBvcnRlZChEYXRhRmxhdm9yLnN0cmluZ0ZsYXZvcik7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gewotICAgIEpUZXh0Q29tcG9uZW50IGNvbXA7Ci0gICAgCi0gICAgcHVibGljIERlbGV0ZUFjdGlvbihKVGV4dENvbXBvbmVudCBjb21wKSB7Ci0gICAgICAgIHN1cGVyKCJEZWxldGUiKTsKLSAgICAgICAgdGhpcy5jb21wID0gY29tcDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgY29tcC5yZXBsYWNlU2VsZWN0aW9uKG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBjb21wLmlzRWRpdGFibGUoKSAmJiBjb21wLmlzRW5hYmxlZCgpCi0gICAgICAgICYmIGNvbXAuZ2V0U2VsZWN0ZWRUZXh0KCkgIT0gbnVsbDsKLSAgICB9Ci19Ci0KLWNsYXNzIENvcHlBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7Ci0gICAgSlRleHRDb21wb25lbnQgY29tcDsKLSAgICAKLSAgICBwdWJsaWMgQ29weUFjdGlvbihKVGV4dENvbXBvbmVudCBjb21wKSB7Ci0gICAgICAgIHN1cGVyKCJDb3B5Iik7Ci0gICAgICAgIHRoaXMuY29tcCA9IGNvbXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIGNvbXAuY29weSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBjb21wLmlzRW5hYmxlZCgpICYmIGNvbXAuZ2V0U2VsZWN0ZWRUZXh0KCkgIT0gbnVsbDsKLSAgICB9Ci19Ci0KLWNsYXNzIFNlbGVjdEFsbEFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKLSAgICBKVGV4dENvbXBvbmVudCBjb21wOwotICAgIAotICAgIHB1YmxpYyBTZWxlY3RBbGxBY3Rpb24oSlRleHRDb21wb25lbnQgY29tcCkgewotICAgICAgICBzdXBlcigiU2VsZWN0IEFsbCIpOwotICAgICAgICB0aGlzLmNvbXAgPSBjb21wOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBjb21wLnNlbGVjdEFsbCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBjb21wLmlzRW5hYmxlZCgpICYmIGNvbXAuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS9GaWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvdHJ1bmsvdG9vbHMvY29uZmlndXJlL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY29uZmlnL2NvcmUvRmlsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxODUzNy4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS9GaWxlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBGaWxlIENvbmZpZ3VyYXRpb24KLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbGVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29uZmlndXJhdGlvbiB7Ci0KLSAgICBwcml2YXRlIEZpbGUgZmlsZW5hbWVEZWZhdWx0OwotICAgIHByaXZhdGUgRmlsZSBmaWxlbmFtZUxvY2FsOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRGaWxlbmFtZURlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlbmFtZURlZmF1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRGaWxlbmFtZUxvY2FsKCkgewotICAgICAgICByZXR1cm4gZmlsZW5hbWVMb2NhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lRGVmYXVsdChTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgdGhpcy5maWxlbmFtZURlZmF1bHQgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIFN0cmluZyBGaWxlbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lTG9jYWwoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlsZW5hbWVMb2NhbCA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGxvY2FsQ29uZmlnRXhpc3RzKCkgewotICAgICAgICBpZiAoZ2V0RmlsZW5hbWVMb2NhbCgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9jb3JlL1BhcmFtZXRlci5qYXZhIGIvdHJ1bmsvdG9vbHMvY29uZmlndXJlL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY29uZmlnL2NvcmUvUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMzBmOTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvY29uZmlndXJlL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY29uZmlnL2NvcmUvUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZTsKLQotLyoqCi0gKiBQYXJhbWV0ZXIKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtZXRlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbFZhbHVlOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7IAotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgdmFsdWUpIHsgCi0gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsgCi0gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFZhbHVlKFN0cmluZyB2YWx1ZSkgeyAKLSAgICAgICAgdGhpcy5sb2NhbFZhbHVlID0gdmFsdWUudHJpbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFZhbHVlKCkgeyAKLSAgICAgICAgcmV0dXJuIGxvY2FsVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0KFN0cmluZyB2YWx1ZSkgewotICAgICAgICAvLyBObyB0ZXN0cyBhcmUgYmVpbmcgZXhlY3V0ZWQhCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZVZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyW10gZ2V0U3Vic2VxdWVudFBhcmFtZXRlcnMoU3RyaW5nIHZhbHVlLCBDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IAotICAgICAgICByZXR1cm4gbmFtZSArICI6OjoiICsgZGVmYXVsdFZhbHVlICsgIjo6OiIgKyBsb2NhbFZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9jb3JlL1Byb3BlcnRpZXNDb25maWd1cmF0aW9uLmphdmEgYi90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvY29yZS9Qcm9wZXJ0aWVzQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWUyMGQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9jb3JlL1Byb3BlcnRpZXNDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFByb3BlcnRpZXMgQ29uZmlndXJhdGlvbgotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgUHJvcGVydGllc0NvbmZpZ3VyYXRpb24gZXh0ZW5kcyBGaWxlQ29uZmlndXJhdGlvbiB7Ci0KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgZGVmYXVsdFByb3BzOwotICAgIHByaXZhdGUgUHJvcGVydGllcyBsb2NhbFByb3BzOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkRGVmYXVsdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgZGVmYXVsdFByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShnZXRGaWxlbmFtZURlZmF1bHQoKSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZExvY2FsKCkgewotICAgICAgICB0cnkgewotICAgICAgICBsb2NhbFByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgbG9jYWxQcm9wcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RmlsZW5hbWVMb2NhbCgpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxvY2FsKCkgewotICAgICAgICBTdHJpbmcgaGVhZGVyID0gIkNyZWF0ZWQgYnkgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuUHJvcGVydGllc0NvbmZpZ3VyYXRpb24iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShnZXRGaWxlbmFtZUxvY2FsKCkpKTsKLSAgICAgICAgb3V0LnByaW50bG4oIiMiICsgaGVhZGVyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCJcbiMiKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKHBhcmFtc1tpXS5nZXROYW1lKCkgKyAiPSIgKyBwYXJhbXNbaV0uZ2V0TG9jYWxWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0vKgotICAgICAgICBQcm9wZXJ0aWVzIG5ld0xvY2FsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBuZXdMb2NhbFByb3BlcnRpZXMuc2V0UHJvcGVydHkocGFyYW1zW2ldLmdldE5hbWUoKSwgcGFyYW1zW2ldLmdldExvY2FsVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3TG9jYWxQcm9wZXJ0aWVzLnN0b3JlKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGdldEZpbGVuYW1lTG9jYWwoKSksIGhlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSovCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKCkgewotICAgICAgICByZWFkRGVmYXVsdCgpOwotICAgICAgICByZWFkTG9jYWwoKTsKLQotICAgICAgICBWZWN0b3IgcCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgRW51bWVyYXRpb24gbmFtZXMgPSBkZWZhdWx0UHJvcHMucHJvcGVydHlOYW1lcygpOwotICAgICAgICB3aGlsZSAobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHBhcmFtLnNldE5hbWUobmFtZSk7Ci0gICAgICAgICAgICBwYXJhbS5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFByb3BzLmdldFByb3BlcnR5KG5hbWUpKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbFZhbHVlID0gbG9jYWxQcm9wcy5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgICAgIGlmIChsb2NhbFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5zZXRMb2NhbFZhbHVlKGxvY2FsUHJvcHMuZ2V0UHJvcGVydHkobmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5zZXRMb2NhbFZhbHVlKGRlZmF1bHRQcm9wcy5nZXRQcm9wZXJ0eShuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwLmFkZEVsZW1lbnQocGFyYW0pOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbcC5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcGFyYW1zW2ldID0gKFBhcmFtZXRlcikgcC5lbGVtZW50QXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXJbXSBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL0J1aWxkUHJvcGVydGllc0NvbmZpZ3VyYXRpb24uamF2YSBiL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL0J1aWxkUHJvcGVydGllc0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4YjM5ZS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvaW1wbC9CdWlsZFByb3BlcnRpZXNDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5jb3JlLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZS5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZS5Qcm9wZXJ0aWVzQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBCdWlsZCBQcm9wZXJ0aWVzIENvbmZpZ3VyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkUHJvcGVydGllc0NvbmZpZ3VyYXRpb24gZXh0ZW5kcyBQcm9wZXJ0aWVzQ29uZmlndXJhdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkRlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXIoImJ1aWxkLnByb3BlcnRpZXMudmVyc2lvbiIpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTG9jYWwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXIoImJ1aWxkLnByb3BlcnRpZXMudmVyc2lvbiIpLmdldExvY2FsVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXJbXSBnZXRDb25maWd1cmFibGVQYXJhbWV0ZXJzKCkgewotICAgICAgICBQYXJhbWV0ZXJbXSBwID0gbmV3IFBhcmFtZXRlcls2XTsKLQotICAgICAgICBwWzBdID0gZ2V0UGFyYW1ldGVyKCJjb2Nvb24uc3JjLmRpciIpOwotICAgICAgICBwWzFdID0gZ2V0UGFyYW1ldGVyKCJwdWJzLnJvb3QuZGlycyIpOwotICAgICAgICBwWzJdID0gZ2V0UGFyYW1ldGVyKCJtb2R1bGVzLnJvb3QuZGlycyIpOwotCi0gICAgICAgIHBbM10gPSBuZXcgU2VydmVyUGFyYW1ldGVyKCk7Ci0JcFszXS5zZXROYW1lKGdldFBhcmFtZXRlcigid2ViLmFwcC5zZXJ2ZXIiKS5nZXROYW1lKCkpOwotCXBbM10uc2V0RGVmYXVsdFZhbHVlKGdldFBhcmFtZXRlcigid2ViLmFwcC5zZXJ2ZXIiKS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JcFszXS5zZXRMb2NhbFZhbHVlKGdldFBhcmFtZXRlcigid2ViLmFwcC5zZXJ2ZXIiKS5nZXRMb2NhbFZhbHVlKCkpOwotCi0gICAgICAgIHBbNF0gPSBnZXRQYXJhbWV0ZXIoImVuYWJsZS51cGxvYWRzIik7Ci0gICAgICAgIHBbNV0gPSBnZXRQYXJhbWV0ZXIoImxlbnlhLnJldmlzaW9uIik7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL0NvbmZpZ3VyZUNvbW1hbmRMaW5lLmphdmEgYi90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvaW1wbC9Db25maWd1cmVDb21tYW5kTGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGNlYTVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL0NvbmZpZ3VyZUNvbW1hbmRMaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5jb3JlLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZS5GaWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5jb3JlLlBhcmFtZXRlcjsKLQotLyoqCi0gKiBBIGNvbW1hbmQgbGluZSB0b29sIHRvIGNvbmZpZ3VyZSB0aGUgTGVueWEgYnVpbGQKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyZUNvbW1hbmRMaW5lIGV4dGVuZHMgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZS5Db25maWd1cmVDb21tYW5kTGluZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXJncyBDb21tYW5kIGxpbmUgYXJncwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbldlbGNvbWUgdG8gdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgdG8gY29uZmlndXJlIHRoZSBidWlsZGluZyBwcm9jZXNzIG9mIEFwYWNoZSBMZW55YSIpOwotCi0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHJvb3QgZGlyIHNwZWNpZmllZCAoZS5nLiAvaG9tZS9VU0VSTkFNRS9zcmMvbGVueWEvdHJ1bmspISIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByb290RGlyID0gYXJnc1swXTsKLQotICAgICAgICBDb25maWd1cmVDb21tYW5kTGluZSBjY2wgPSBuZXcgQ29uZmlndXJlQ29tbWFuZExpbmUoKTsKLSAgICAgICAgVmVjdG9yIGNvbmZpZ3MgPSBjY2wuc2V0Q29uZmlndXJhdGlvbnMocm9vdERpcik7Ci0gICAgICAgIGNjbC5jaGFuZ2VDb25maWd1cmF0aW9ucyhjb25maWdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3Igc2V0Q29uZmlndXJhdGlvbnMoU3RyaW5nIHJvb3REaXIpIHsKLSAgICAgICAgLy8gRGVmaW5lIGFsbCBjb25maWd1cmF0aW9uIGZpbGVzCi0gICAgICAgIEZpbGVDb25maWd1cmF0aW9uIGJ1aWxkUHJvcGVydGllcyA9IG5ldyBCdWlsZFByb3BlcnRpZXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGJ1aWxkUHJvcGVydGllcy5zZXRGaWxlbmFtZURlZmF1bHQocm9vdERpciArICIvYnVpbGQucHJvcGVydGllcyIpOwotICAgICAgICBidWlsZFByb3BlcnRpZXMuc2V0RmlsZW5hbWVMb2NhbChyb290RGlyICsgIi9sb2NhbC5idWlsZC5wcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgRmlsZUNvbmZpZ3VyYXRpb24gZGVmYXVsdFB1YiA9IG5ldyBQdWJsaWNhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgZGVmYXVsdFB1Yi5zZXRGaWxlbmFtZURlZmF1bHQocm9vdERpciArICJzcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9wdWJsaWNhdGlvbi54bWwiKTsKLSAgICAgICAgZGVmYXVsdFB1Yi5zZXRGaWxlbmFtZUxvY2FsKHJvb3REaXIgKyAic3JjL3B1YnMvZGVmYXVsdC9jb25maWcvbG9jYWwucHVibGljYXRpb24ueG1sIik7Ci0gICAgICAgICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgRmlsZUNvbmZpZ3VyYXRpb24gbG9nNGogPSBuZXcgTG9nNGpDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIC8vIHNyYy9jb25mcGF0Y2gvbG9nNGotKgotICAgICAgICBsb2c0ai5zZXRGaWxlbmFtZURlZmF1bHQocm9vdERpciArICJzcmMvd2ViYXBwL1dFQi1JTkYvbG9nNGoueGNvbmYiKTsKLSAgICAgICAgbG9nNGouc2V0RmlsZW5hbWVMb2NhbChyb290RGlyICsgInNyYy93ZWJhcHAvV0VCLUlORi9sb2NhbC5sb2c0ai54Y29uZiIpOwotICAgICAgICAqLwotCi0JVmVjdG9yIGNvbmZpZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGNvbmZpZ3MuYWRkRWxlbWVudChidWlsZFByb3BlcnRpZXMpOwotICAgICAgICAvL2NvbmZpZ3MuYWRkRWxlbWVudChkZWZhdWx0UHViKTsKLQotICAgICAgICByZXR1cm4gY29uZmlnczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvaW1wbC9Db25maWd1cmVHVUkuamF2YSBiL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL0NvbmZpZ3VyZUdVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIyYWU0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL0NvbmZpZ3VyZUdVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICoNCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmltcGw7DQotDQotaW1wb3J0IGphdmEuYXd0LkNvbnRhaW5lcjsNCi1pbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsNCi1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOw0KLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnTGF5b3V0Ow0KLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7DQotaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7DQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50Ow0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsNCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsNCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0Ow0KLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Hcm91cDsNCi1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsNCi1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94Ow0KLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7DQotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsNCi1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOw0KLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsNCi1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOw0KLWltcG9ydCBqYXZheC5zd2luZy5KUmFkaW9CdXR0b247DQotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7DQotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZS5GaWxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZS5Db250ZXh0RXZlbnRRdWV1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZS5QYXJhbWV0ZXI7DQotDQotLyoqDQotICogQSBHVUkgdG9vbCB0byBjb25maWd1cmUgdGhlIExlbnlhIGJ1aWxkDQotICovDQotcHVibGljIGNsYXNzIENvbmZpZ3VyZUdVSSB7DQotDQotICAgIHByb3RlY3RlZCBKRnJhbWUgZnJhbWU7DQotICAgIHByaXZhdGUgSlBhbmVsIGNvbnRlbnRQYW5lbDsNCi0gICAgcHJpdmF0ZSBKUGFuZWwgY2hlY2tCb3hQYW5lbDsNCi0gICAgcHJpdmF0ZSBKUGFuZWwgYnV0dG9uUGFuZWw7DQotICAgIHByaXZhdGUgSkNoZWNrQm94W10gY2hlY2tCb3hlczsNCi0gICAgcHJpdmF0ZSBKTGFiZWwgZGVmYXVsdFZhbHVlTGFiZWw7DQotICAgIHByaXZhdGUgSkxhYmVsIGxvY2FsVmFsdWVMYWJlbDsNCi0gICAgcHJpdmF0ZSBKTGFiZWwgbmV3TG9jYWxWYWx1ZUxhYmVsOw0KLSAgICBwcml2YXRlIEpMYWJlbCBzdGVwc0xhYmVsOw0KLSAgICBwcml2YXRlIEpMYWJlbCBwYXJhVmFsdWVMYWJlbDsNCi0gICAgcHJpdmF0ZSBKTGFiZWwgd2FybmluZzE7DQotICAgIHByaXZhdGUgSkxhYmVsIHdhcm5pbmcyOw0KLSAgICBwcml2YXRlIEpMYWJlbCBzYXZlTWVzc2FnZTsNCi0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gcmFkaW9CdXR0b25EZWZhdWx0Ow0KLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbkxvY2FsOw0KLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbk5ld0xvY2FsOw0KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgbG9jYWxWYWx1ZVRleHRGaWVsZDsNCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGRlZmF1bHRWYWx1ZVRleHRGaWVsZDsNCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIG5ld0xvY2FsVmFsdWVUZXh0RmllbGQ7DQotICAgIHByaXZhdGUgSlRleHRGaWVsZCBkZWZhdWx0VmFsdWVDVGV4dEZpZWxkOw0KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgbG9jYWxWYWx1ZUNUZXh0RmllbGQ7DQotICAgIHByaXZhdGUgSkNvbWJvQm94IG5ld0xvY2FsVmFsdWVDb21ib0JveDsNCi0gICAgcHJpdmF0ZSBKQnV0dG9uIGNhbmNlbEJ1dHRvbjsNCi0gICAgcHJvdGVjdGVkIEpCdXR0b24gYmFja0J1dHRvbjsNCi0gICAgcHJvdGVjdGVkIEpCdXR0b24gbmV4dEJ1dHRvbjsNCi0gICAgcHJpdmF0ZSBKQnV0dG9uIHNhdmVCdXR0b247DQotICAgIHByaXZhdGUgSkJ1dHRvbiB5ZXNCdXR0b247DQotICAgIHByaXZhdGUgSkJ1dHRvbiBub0J1dHRvbjsNCi0gICAgcHJpdmF0ZSBKQnV0dG9uIGV4aXRCdXR0b247DQotICAgIHByaXZhdGUgUGFyYW1ldGVyW10gcGFyYW1zOw0KLSAgICBwcml2YXRlIFBhcmFtZXRlcltdIHRtcFBhcmFtczsNCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJbXSB0bXBTdWJQYXJhbXM7DQotICAgIHByb3RlY3RlZCBQYXJhbWV0ZXJbXSBzdWJQYXJhbXM7DQotICAgIHByaXZhdGUgaW50IHN0ZXBzID0gMDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9vdERpcjsNCi0gICAgcHJpdmF0ZSBTdWJQYXJhbXNHVUkgc3BHdWk7DQotICAgIHByaXZhdGUgRmlsZUNvbmZpZ3VyYXRpb24gYnVpbGRQcm9wZXJ0aWVzOw0KLSAgICBwcm90ZWN0ZWQgRmlsZUNvbmZpZ3VyYXRpb24gdG1wQnVpbGRQcm9wZXJ0aWVzOw0KLQ0KLSAgICAvKioNCi0gICAgICogTWFpbiBtZXRob2Qgd2hpY2ggY3JlYXRlcyB0aGUgR1VJDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJncw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KLQ0KLSAgICAgICAgU3lzdGVtLm91dA0KLSAgICAgICAgICAgICAgICAucHJpbnRsbigiXG5XZWxjb21lIHRvIHRoZSBHVUkgdG8gY29uZmlndXJlIHRoZSBidWlsZGluZyBwcm9jZXNzIG9mIEFwYWNoZSBMZW55YSIpOw0KLQ0KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsNCi0NCi0gICAgICAgICAgICBTeXN0ZW0uZXJyDQotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiTm8gcm9vdCBkaXIgc3BlY2lmaWVkIChlLmcuIC9ob21lL1VTRVJOQU1FL3NyYy9sZW55YS90cnVuaykhIik7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHJvb3REaXIgPSBhcmdzWzBdOw0KLQ0KLSAgICAgICAgbmV3IENvbmZpZ3VyZUdVSShyb290RGlyKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogLmN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSByb290RGlyDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29uZmlndXJlR1VJKFN0cmluZyByb290RGlyKSB7DQotDQotICAgICAgICAvLyBwdXNoZXMgdGhlIGV2ZW50UXVldWUgd2hpY2ggd2lsbCB0YWtlIGNhcmUgb2YgY29weS9wYXN0ZSBvcGVyYXRpb25zDQotICAgICAgICBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U3lzdGVtRXZlbnRRdWV1ZSgpLnB1c2goDQotICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0RXZlbnRRdWV1ZSgpKTsNCi0NCi0gICAgICAgIHRoaXMucm9vdERpciA9IHJvb3REaXI7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIEdVSSAuLi4iKTsNCi0NCi0gICAgICAgIGJ1aWxkUHJvcGVydGllcyA9IG5ldyBCdWlsZFByb3BlcnRpZXNDb25maWd1cmF0aW9uKCk7DQotICAgICAgICBidWlsZFByb3BlcnRpZXMuc2V0RmlsZW5hbWVEZWZhdWx0KHJvb3REaXIgKyAiL2J1aWxkLnByb3BlcnRpZXMiKTsNCi0gICAgICAgIGJ1aWxkUHJvcGVydGllcy5zZXRGaWxlbmFtZUxvY2FsKHJvb3REaXIgKyAiL2xvY2FsLmJ1aWxkLnByb3BlcnRpZXMiKTsNCi0NCi0gICAgICAgIGJ1aWxkUHJvcGVydGllcy5yZWFkKCk7DQotICAgICAgICBwYXJhbXMgPSBidWlsZFByb3BlcnRpZXMuZ2V0Q29uZmlndXJhYmxlUGFyYW1ldGVycygpOw0KLQ0KLSAgICAgICAgdG1wQnVpbGRQcm9wZXJ0aWVzID0gbmV3IEJ1aWxkUHJvcGVydGllc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIHRtcEJ1aWxkUHJvcGVydGllcy5zZXRGaWxlbmFtZURlZmF1bHQocm9vdERpciArICIvYnVpbGQucHJvcGVydGllcyIpOw0KLSAgICAgICAgdG1wQnVpbGRQcm9wZXJ0aWVzDQotICAgICAgICAgICAgICAgIC5zZXRGaWxlbmFtZUxvY2FsKHJvb3REaXIgKyAiL2xvY2FsLmJ1aWxkLnByb3BlcnRpZXMiKTsNCi0gICAgICAgIHRtcEJ1aWxkUHJvcGVydGllcy5yZWFkKCk7DQotICAgICAgICB0bXBQYXJhbXMgPSB0bXBCdWlsZFByb3BlcnRpZXMuZ2V0Q29uZmlndXJhYmxlUGFyYW1ldGVycygpOw0KLSAgICAgICAgLy8gRW1wdHkgdGVtcG9yYXJ5IGxvY2FsIGZpZWxkcyBvZiB0ZW1wb3JhcnkgcGFyYW1ldGVycw0KLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0bXBQYXJhbXMubGVuZ3RoOyBrKyspIHsNCi0gICAgICAgICAgICB0bXBQYXJhbXNba10uc2V0TG9jYWxWYWx1ZSgiIik7DQotICAgICAgICB9ICAgICAgIA0KLQ0KLSAgICAgICAgSkZyYW1lLnNldERlZmF1bHRMb29rQW5kRmVlbERlY29yYXRlZCh0cnVlKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlcg0KLSAgICAgICAgICAgICAgICAgICAgLmdldENyb3NzUGxhdGZvcm1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBmcmFtZSA9IG5ldyBKRnJhbWUoIkFwYWNoZSBMZW55YSBDb25maWd1cmF0aW9uIik7DQotICAgICAgICBmcmFtZS5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oSkZyYW1lLkVYSVRfT05fQ0xPU0UpOw0KLSAgICAgICAgZnJhbWUuZ2V0Q29udGVudFBhbmUoKS5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7DQotDQotICAgICAgICBjb250ZW50UGFuZWwgPSBuZXcgSlBhbmVsKCk7DQotICAgICAgICBjaGVja0JveFBhbmVsID0gbmV3IEpQYW5lbCgpOw0KLSAgICAgICAgYnV0dG9uUGFuZWwgPSBuZXcgSlBhbmVsKCk7DQotDQotICAgICAgICBkZWZhdWx0VmFsdWVMYWJlbCA9IG5ldyBKTGFiZWwoKTsNCi0gICAgICAgIGxvY2FsVmFsdWVMYWJlbCA9IG5ldyBKTGFiZWwoKTsNCi0gICAgICAgIG5ld0xvY2FsVmFsdWVMYWJlbCA9IG5ldyBKTGFiZWwoKTsNCi0NCi0gICAgICAgIGRlZmF1bHRWYWx1ZVRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDIwKTsNCi0gICAgICAgIGxvY2FsVmFsdWVUZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCgyMCk7DQotICAgICAgICBuZXdMb2NhbFZhbHVlVGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoMjApOw0KLQ0KLSAgICAgICAgZGVmYXVsdFZhbHVlQ1RleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7DQotICAgICAgICBsb2NhbFZhbHVlQ1RleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7DQotICAgICAgICBuZXdMb2NhbFZhbHVlQ29tYm9Cb3ggPSBuZXcgSkNvbWJvQm94KCk7DQotDQotICAgICAgICByYWRpb0J1dHRvbkRlZmF1bHQgPSBuZXcgSlJhZGlvQnV0dG9uKCk7DQotICAgICAgICByYWRpb0J1dHRvbkxvY2FsID0gbmV3IEpSYWRpb0J1dHRvbigpOw0KLSAgICAgICAgcmFkaW9CdXR0b25OZXdMb2NhbCA9IG5ldyBKUmFkaW9CdXR0b24oKTsNCi0gICAgICAgIEJ1dHRvbkdyb3VwIGcgPSBuZXcgQnV0dG9uR3JvdXAoKTsNCi0NCi0gICAgICAgIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7DQotICAgICAgICBiYWNrQnV0dG9uID0gbmV3IEpCdXR0b24oKTsNCi0gICAgICAgIG5leHRCdXR0b24gPSBuZXcgSkJ1dHRvbigpOw0KLSAgICAgICAgc2F2ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7DQotICAgICAgICBub0J1dHRvbiA9IG5ldyBKQnV0dG9uKCk7DQotICAgICAgICB5ZXNCdXR0b24gPSBuZXcgSkJ1dHRvbigpOw0KLSAgICAgICAgZXhpdEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7DQotDQotICAgICAgICB3YXJuaW5nMSA9IG5ldyBKTGFiZWwoKTsNCi0gICAgICAgIHdhcm5pbmcyID0gbmV3IEpMYWJlbCgpOw0KLQ0KLSAgICAgICAgc2F2ZU1lc3NhZ2UgPSBuZXcgSkxhYmVsKCk7DQotDQotICAgICAgICBDb250YWluZXIgY29udGVudFBhbmUgPSBmcmFtZS5nZXRDb250ZW50UGFuZSgpOw0KLSAgICAgICAgY29udGVudFBhbmUuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuTEVGVCkpOw0KLQ0KLSAgICAgICAgY29udGVudFBhbmVsLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsNCi0gICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBjID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOw0KLQ0KLSAgICAgICAgc3RlcHNMYWJlbCA9IG5ldyBKTGFiZWwoKTsNCi0gICAgICAgIHN0ZXBzTGFiZWwuc2V0VGV4dCgiUGFyYW1ldGVycyIpOw0KLSAgICAgICAgYy5ncmlkeCA9IDA7DQotICAgICAgICBjLmdyaWR5ID0gMDsNCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQoc3RlcHNMYWJlbCwgYyk7DQotDQotICAgICAgICBjaGVja0JveFBhbmVsID0gbmV3IEpQYW5lbCgpOw0KLSAgICAgICAgY2hlY2tCb3hQYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dChjaGVja0JveFBhbmVsLCBCb3hMYXlvdXQuWV9BWElTKSk7DQotICAgICAgICBjLmdyaWR4ID0gMDsNCi0gICAgICAgIGMuZ3JpZHkgPSAxOw0KLSAgICAgICAgYy5ncmlkaGVpZ2h0ID0gNDsNCi0gICAgICAgIGMuaXBhZHggPSAyMDsNCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQoY2hlY2tCb3hQYW5lbCwgYyk7DQotDQotICAgICAgICBjaGVja0JveGVzID0gbmV3IEpDaGVja0JveFtwYXJhbXMubGVuZ3RoXTsNCi0NCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7DQotICAgICAgICAgICAgY2hlY2tCb3hlc1tpXSA9IG5ldyBKQ2hlY2tCb3goKTsNCi0gICAgICAgICAgICBjaGVja0JveGVzW2ldLnNldEVuYWJsZWQoZmFsc2UpOw0KLSAgICAgICAgICAgIGNoZWNrQm94ZXNbaV0uc2V0VGV4dChwYXJhbXNbaV0uZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBjaGVja0JveGVzWzBdLnNldFNlbGVjdGVkKHRydWUpOw0KLSAgICAgICAgICAgIGNoZWNrQm94UGFuZWwuYWRkKGNoZWNrQm94ZXNbaV0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYy5ncmlkeCA9IDE7DQotICAgICAgICBjLmdyaWR5ID0gMDsNCi0gICAgICAgIGMuZ3JpZHdpZHRoID0gMTsNCi0gICAgICAgIGMuZ3JpZGhlaWdodCA9IDE7DQotICAgICAgICBwYXJhVmFsdWVMYWJlbCA9IG5ldyBKTGFiZWwocGFyYW1zWzBdLmdldE5hbWUoKSk7DQotICAgICAgICBjb250ZW50UGFuZWwuYWRkKHBhcmFWYWx1ZUxhYmVsLCBjKTsNCi0NCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxhYmVsLnNldFRleHQoIkRlZmF1bHQgVmFsdWU6Iik7DQotICAgICAgICBjb250ZW50UGFuZWwuYWRkKGRlZmF1bHRWYWx1ZUxhYmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIDEsIDEsDQotICAgICAgICAgICAgICAgIDAuMCwgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwNCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOw0KLSAgICAgICAgY29udGVudFBhbmVsLmFkZChkZWZhdWx0VmFsdWVUZXh0RmllbGQsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMSwgMSwNCi0gICAgICAgICAgICAgICAgMSwgMC4wLCAwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIsDQotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5CT1RILCBuZXcgSW5zZXRzKDAsIDAsIDAsIDApLCAwLCAwKSk7DQotICAgICAgICBkZWZhdWx0VmFsdWVUZXh0RmllbGQuc2V0VGV4dChwYXJhbXNbMF0uZ2V0RGVmYXVsdFZhbHVlKCkpOw0KLSAgICAgICAgZGVmYXVsdFZhbHVlVGV4dEZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsNCi0gICAgICAgIGRlZmF1bHRWYWx1ZVRleHRGaWVsZC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9uRGVmYXVsdC5zZXRTZWxlY3RlZCh0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQocmFkaW9CdXR0b25EZWZhdWx0LCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDMsIDEsIDEsIDEsDQotICAgICAgICAgICAgICAgIDAuMCwgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwNCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOw0KLSAgICAgICAgZy5hZGQocmFkaW9CdXR0b25EZWZhdWx0KTsNCi0NCi0gICAgICAgIGxvY2FsVmFsdWVMYWJlbC5zZXRUZXh0KCJMb2NhbCBWYWx1ZToiKTsNCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQobG9jYWxWYWx1ZUxhYmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDIsIDEsIDEsDQotICAgICAgICAgICAgICAgIDAuMCwgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwNCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOw0KLSAgICAgICAgY29udGVudFBhbmVsLmFkZChsb2NhbFZhbHVlVGV4dEZpZWxkLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDIsIDIsIDEsDQotICAgICAgICAgICAgICAgIDEsIDAuMCwgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLA0KLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOw0KLSAgICAgICAgbG9jYWxWYWx1ZVRleHRGaWVsZC5zZXRUZXh0KHBhcmFtc1swXS5nZXRMb2NhbFZhbHVlKCkpOw0KLSAgICAgICAgbG9jYWxWYWx1ZVRleHRGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7DQotICAgICAgICBsb2NhbFZhbHVlVGV4dEZpZWxkLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VDbGlja2VkKE1vdXNlRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgICAgICAgICAgcmFkaW9CdXR0b25Mb2NhbC5zZXRTZWxlY3RlZCh0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQocmFkaW9CdXR0b25Mb2NhbCwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygzLCAyLCAxLCAxLA0KLSAgICAgICAgICAgICAgICAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsDQotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsNCi0gICAgICAgIGcuYWRkKHJhZGlvQnV0dG9uTG9jYWwpOw0KLSAgICAgICAgcmFkaW9CdXR0b25Mb2NhbC5zZXRTZWxlY3RlZCh0cnVlKTsNCi0NCi0gICAgICAgIG5ld0xvY2FsVmFsdWVMYWJlbC5zZXRUZXh0KCJOZXcgTG9jYWwgVmFsdWU6Iik7DQotICAgICAgICBjb250ZW50UGFuZWwuYWRkKG5ld0xvY2FsVmFsdWVMYWJlbCwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAzLCAxLCAxLA0KLSAgICAgICAgICAgICAgICAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsDQotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsNCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQobmV3TG9jYWxWYWx1ZVRleHRGaWVsZCwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAzLA0KLSAgICAgICAgICAgICAgICAxLCAxLCAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwNCi0gICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsNCi0gICAgICAgIG5ld0xvY2FsVmFsdWVUZXh0RmllbGQuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VMaXN0ZW5lcigpIHsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICByYWRpb0J1dHRvbk5ld0xvY2FsLnNldFNlbGVjdGVkKHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUVudGVyZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUV4aXRlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgY29udGVudFBhbmVsLmFkZChyYWRpb0J1dHRvbk5ld0xvY2FsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDMsIDMsIDEsDQotICAgICAgICAgICAgICAgIDEsIDAuMCwgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLA0KLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOw0KLSAgICAgICAgZy5hZGQocmFkaW9CdXR0b25OZXdMb2NhbCk7DQotDQotICAgICAgICBidXR0b25QYW5lbCA9IG5ldyBKUGFuZWwoKTsNCi0gICAgICAgIGJ1dHRvblBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGJ1dHRvblBhbmVsLCBCb3hMYXlvdXQuWF9BWElTKSk7DQotDQotICAgICAgICBjYW5jZWxCdXR0b24uc2V0VGV4dCgiQ2FuY2VsIik7DQotICAgICAgICBjYW5jZWxCdXR0b24uc2V0UHJlZmVycmVkU2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDc0LCAyMikpOw0KLSAgICAgICAgY2FuY2VsQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZ0KSB7DQotDQotICAgICAgICAgICAgICAgIGludCBuID0gSk9wdGlvblBhbmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2hvd0NvbmZpcm1EaWFsb2coY29udGVudFBhbmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvIHlvdSB3YW50IHRvIEV4aXQ/IiwgIkV4aXQuLi4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuWUVTX05PX09QVElPTiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLlFVRVNUSU9OX01FU1NBR0UpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobiA9PSBKT3B0aW9uUGFuZS5ZRVNfT1BUSU9OKSB7DQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgYmFja0J1dHRvbi5zZXRUZXh0KCI8QmFjayIpOw0KLSAgICAgICAgYmFja0J1dHRvbi5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNzQsIDIyKSk7DQotICAgICAgICBiYWNrQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7DQotICAgICAgICAgICAgICAgIGlmIChjb250ZW50UGFuZWwuaXNWaXNpYmxlKCkpDQotICAgICAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7DQotICAgICAgICAgICAgICAgIGlmIChnZXRTdGVwKCkgIT0gcGFyYW1zLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgc2F2ZUJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtb3ZlQmFjaygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsNCi0NCi0gICAgICAgIG5leHRCdXR0b24uc2V0VGV4dCgiTmV4dD4iKTsNCi0gICAgICAgIG5leHRCdXR0b24uc2V0UHJlZmVycmVkU2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDc0LCAyMikpOw0KLSAgICAgICAgbmV4dEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOw0KLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFBhbmVsLmlzVmlzaWJsZSgpKQ0KLSAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOw0KLSAgICAgICAgICAgICAgICBtb3ZlTmV4dCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgYnV0dG9uUGFuZWwuYWRkKGNhbmNlbEJ1dHRvbik7DQotICAgICAgICBidXR0b25QYW5lbC5hZGQoYmFja0J1dHRvbik7DQotICAgICAgICBidXR0b25QYW5lbC5hZGQobmV4dEJ1dHRvbik7DQotDQotICAgICAgICBjb250ZW50UGFuZWwuYWRkKGJ1dHRvblBhbmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDQsIDYsIDAsIDAuMCwNCi0gICAgICAgICAgICAgICAgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwNCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOw0KLSAgICAgICAgY29udGVudFBhbmUuYWRkKGNvbnRlbnRQYW5lbCk7DQotICAgICAgICBjb250ZW50UGFuZWwucmV2YWxpZGF0ZSgpOw0KLSAgICAgICAgZnJhbWUucGFjaygpOw0KLSAgICAgICAgZnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29udHJvbHMgYmVoYXZpb3IgaWYgYmFjayBidXR0b24gaXMgcHJlc3NlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbW92ZUJhY2soKSB7DQotICAgICAgICBzdGVwcy0tOw0KLSAgICAgICAgZnJhbWUucmVwYWludCgpOw0KLSAgICAgICAgbmV4dEJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOw0KLSAgICAgICAgY2hlY2tGaXJzdCgpOw0KLSAgICAgICAgY3VycmVudFN0ZXAoImRvd24iKTsNCi0gICAgICAgIHNob3dOb3JtYWxPcHRpb25zKCk7DQotICAgICAgICBjb21ib0JveCgpOw0KLSAgICAgICAgY2hlY2tMYXN0KCk7DQotICAgICAgICBuZXdMb2NhbFZhbHVlVGV4dEZpZWxkLnNldFRleHQodG1wUGFyYW1zW2dldFN0ZXAoKV0uZ2V0TG9jYWxWYWx1ZSgpKTsNCi0gICAgICAgIHNldFJhZGlvQnV0dG9uKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnRyb2xzIGJlaGF2aW9yIGlmIG5leHQgYnV0dG9uIGlzIHByZXNzZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIG1vdmVOZXh0KCkgew0KLQ0KLSAgICAgICAgc2V0TG9jYWxWYWx1ZSgpOw0KLSAgICAgICAgU3RyaW5nW10gYXYgPSBwYXJhbXNbZ2V0U3RlcCgpXS5nZXRBdmFpbGFibGVWYWx1ZXMoKTsNCi0NCi0gICAgICAgIGlmIChhdiAhPSBudWxsKSB7DQotDQotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGVkQ29tYm9Cb3hWYWx1ZSA9ICIiOw0KLSAgICAgICAgICAgIC8vIEdyYWIgdGhlIGNvcnJlY3QgdmFsdWUgb3V0IG9mIHRoZSBjb21ib2JveA0KLSAgICAgICAgICAgIGlmIChyYWRpb0J1dHRvbkRlZmF1bHQuaXNTZWxlY3RlZCgpKQ0KLSAgICAgICAgICAgICAgICBzZWxlY3RlZENvbWJvQm94VmFsdWUgPSBkZWZhdWx0VmFsdWVDVGV4dEZpZWxkLmdldFRleHQoKTsNCi0gICAgICAgICAgICBpZiAocmFkaW9CdXR0b25Mb2NhbC5pc1NlbGVjdGVkKCkpDQotICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29tYm9Cb3hWYWx1ZSA9IGxvY2FsVmFsdWVDVGV4dEZpZWxkLmdldFRleHQoKTsNCi0gICAgICAgICAgICBpZiAocmFkaW9CdXR0b25OZXdMb2NhbC5pc1NlbGVjdGVkKCkpDQotICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29tYm9Cb3hWYWx1ZSA9IG5ld0xvY2FsVmFsdWVDb21ib0JveC5nZXRTZWxlY3RlZEl0ZW0oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIHN1YlBhcmFtcyA9IHBhcmFtc1tnZXRTdGVwKCldLmdldFN1YnNlcXVlbnRQYXJhbWV0ZXJzKA0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21ib0JveFZhbHVlLCBidWlsZFByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgIHRtcFN1YlBhcmFtcyA9IHBhcmFtc1tnZXRTdGVwKCldLmdldFN1YnNlcXVlbnRQYXJhbWV0ZXJzKA0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21ib0JveFZhbHVlLCB0bXBCdWlsZFByb3BlcnRpZXMpOw0KLQ0KLSAgICAgICAgICAgIHNwR3VpID0gbmV3IFN1YlBhcmFtc0dVSSh0aGlzLCB0bXBTdWJQYXJhbXMsIHN1YlBhcmFtcywNCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29tYm9Cb3hWYWx1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzdGVwcysrOw0KLSAgICAgICAgZnJhbWUucmVwYWludCgpOw0KLSAgICAgICAgY2hlY2tGaXJzdCgpOw0KLSAgICAgICAgY3VycmVudFN0ZXAoInVwIik7DQotICAgICAgICBzaG93Tm9ybWFsT3B0aW9ucygpOw0KLSAgICAgICAgY29tYm9Cb3goKTsNCi0gICAgICAgIGNoZWNrTGFzdCgpOw0KLSAgICAgICAgbmV3TG9jYWxWYWx1ZVRleHRGaWVsZC5zZXRUZXh0KHRtcFBhcmFtc1tnZXRTdGVwKCldLmdldExvY2FsVmFsdWUoKSk7DQotICAgICAgICBzZXRSYWRpb0J1dHRvbigpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXQgcmFkaW8gYnV0dG9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRSYWRpb0J1dHRvbigpIHsNCi0gICAgICAgIGlmICh0bXBQYXJhbXNbZ2V0U3RlcCgpXS5nZXRMb2NhbFZhbHVlKCkgIT0gIiIpIHsNCi0gICAgICAgICAgICByYWRpb0J1dHRvbk5ld0xvY2FsLnNldFNlbGVjdGVkKHRydWUpOw0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJhbXNbZ2V0U3RlcCgpXS5nZXRMb2NhbFZhbHVlKCkgIT0gIiIpIHsNCi0gICAgICAgICAgICByYWRpb0J1dHRvbkxvY2FsLnNldFNlbGVjdGVkKHRydWUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByYWRpb0J1dHRvbkRlZmF1bHQuc2V0U2VsZWN0ZWQodHJ1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldCBsb2NhbCB2YWx1ZSBkZXBlbmRpbmcgb24gY2hvc2VuIHZhbHVlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFZhbHVlKCkgew0KLSAgICAgICAgU3RyaW5nW10gYXYgPSBwYXJhbXNbZ2V0U3RlcCgpXS5nZXRBdmFpbGFibGVWYWx1ZXMoKTsNCi0NCi0gICAgICAgIGlmIChhdiA9PSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKHJhZGlvQnV0dG9uRGVmYXVsdC5pc1NlbGVjdGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgdG1wUGFyYW1zW2dldFN0ZXAoKV0uc2V0TG9jYWxWYWx1ZShkZWZhdWx0VmFsdWVUZXh0RmllbGQNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGV4dCgpKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHJhZGlvQnV0dG9uTG9jYWwuaXNTZWxlY3RlZCgpKSB7DQotICAgICAgICAgICAgICAgIHRtcFBhcmFtc1tnZXRTdGVwKCldLnNldExvY2FsVmFsdWUobG9jYWxWYWx1ZVRleHRGaWVsZA0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmFkaW9CdXR0b25OZXdMb2NhbC5pc1NlbGVjdGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgdG1wUGFyYW1zW2dldFN0ZXAoKV0uc2V0TG9jYWxWYWx1ZShuZXdMb2NhbFZhbHVlVGV4dEZpZWxkDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGYXRhbCBFcnJvciAwMTIzNDU2Nzg5ISIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGFrZXMgY2FyZSBhYm91dCB0aGUgc3RlcHMgcHJvZ3Jlc3MgKGxpc3Qgb24gbGVmdCBzaWRlKQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRpcmVjdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY3VycmVudFN0ZXAoU3RyaW5nIGRpcmVjdGlvbikgew0KLSAgICAgICAgaWYgKGRpcmVjdGlvbi5lcXVhbHMoInVwIikpIHsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBnZXRTdGVwKCk7ICsraSkgew0KLSAgICAgICAgICAgICAgICBjaGVja0JveGVzW2ldLnNldFNlbGVjdGVkKHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChkaXJlY3Rpb24uZXF1YWxzKCJkb3duIikpIHsNCi0gICAgICAgICAgICBjaGVja0JveGVzW2dldFN0ZXAoKSArIDFdLnNldFNlbGVjdGVkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2hlY2tzIGlmIGl0cyBmaXJzdCBzdGVwIGFuZCBkaXNhYmxlcyB0aGUgYmFjayBidXR0b24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNoZWNrRmlyc3QoKSB7DQotDQotICAgICAgICBpZiAoZ2V0U3RlcCgpID09IDApIHsNCi0gICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENoZWNrcyBpZiBpdHMgbGFzdCBzdGVwIGFuZCBkaXNhYmxlcyBuZXh0IGJ1dHRvbiBidXQgYWRkaW5nIGEgc2F2ZSBidXR0b24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNoZWNrTGFzdCgpIHsNCi0gICAgICAgIHNhdmVCdXR0b24gPSBuZXcgSkJ1dHRvbigiU2F2ZSIpOw0KLQ0KLSAgICAgICAgd2FybmluZzEgPSBuZXcgSkxhYmVsKCJXQVJOSU5HOiBMb2NhbCBjb25maWd1cmF0aW9uIGFscmVhZHkgZXhpc3RzISIpOw0KLSAgICAgICAgd2FybmluZzIgPSBuZXcgSkxhYmVsKCJEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGU/Iik7DQotICAgICAgICBpZiAoZ2V0U3RlcCgpID09IHBhcmFtcy5sZW5ndGggLSAxKSB7DQotICAgICAgICAgICAgbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsNCi0gICAgICAgICAgICBuZXh0QnV0dG9uLnNldFZpc2libGUoZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIGJ1dHRvblBhbmVsLmFkZChzYXZlQnV0dG9uKTsNCi0gICAgICAgICAgICBjb250ZW50UGFuZWwucmV2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgICAgIHNhdmVCdXR0b24uc2V0UHJlZmVycmVkU2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDc0LCAyMikpOw0KLSAgICAgICAgICAgIHNhdmVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICAgICAgc2V0TG9jYWxWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVTY3JlZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgIHNob3dXYXJuaW5nU2NyZWVuKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOw0KLSAgICAgICAgICAgIHdhcm5pbmcxLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgICAgIHdhcm5pbmcyLnNldFZpc2libGUoZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzcEd1aSAhPSBudWxsICYmIHNwR3VpLnN1YkZyYW1lLmlzVmlzaWJsZSgpKSB7DQotICAgICAgICAgICAgICAgIGZyYW1lLnNldEVuYWJsZWQoZmFsc2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2hvd3MgdGhlIG5vcm1hbCBvcHRpb25zIChwYXJhbWF0ZXJzKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2hvd05vcm1hbE9wdGlvbnMoKSB7DQotDQotICAgICAgICBpZiAoZ2V0U3RlcCgpIDwgcGFyYW1zLmxlbmd0aCkgew0KLSAgICAgICAgICAgIGRlZmF1bHRWYWx1ZVRleHRGaWVsZC5zZXRUZXh0KHBhcmFtc1tnZXRTdGVwKCldLmdldERlZmF1bHRWYWx1ZSgpKTsNCi0gICAgICAgICAgICBsb2NhbFZhbHVlVGV4dEZpZWxkLnNldFRleHQocGFyYW1zW2dldFN0ZXAoKV0uZ2V0TG9jYWxWYWx1ZSgpKTsNCi0gICAgICAgICAgICBwYXJhVmFsdWVMYWJlbC5zZXRUZXh0KHBhcmFtc1tnZXRTdGVwKCldLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgZnJhbWUucGFjaygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTaG93cyB0aGUgc2F2ZSBzY3JlZW4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBzaG93U2F2ZVNjcmVlbigpIHsNCi0NCi0gICAgICAgIHBhcmFWYWx1ZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7DQotICAgICAgICBsb2NhbFZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7DQotICAgICAgICBuZXdMb2NhbFZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7DQotDQotICAgICAgICBkZWZhdWx0VmFsdWVUZXh0RmllbGQuc2V0VmlzaWJsZShmYWxzZSk7DQotICAgICAgICBsb2NhbFZhbHVlVGV4dEZpZWxkLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgbmV3TG9jYWxWYWx1ZVRleHRGaWVsZC5zZXRWaXNpYmxlKGZhbHNlKTsNCi0NCi0gICAgICAgIHJhZGlvQnV0dG9uRGVmYXVsdC5zZXRWaXNpYmxlKGZhbHNlKTsNCi0gICAgICAgIHJhZGlvQnV0dG9uTG9jYWwuc2V0VmlzaWJsZShmYWxzZSk7DQotICAgICAgICByYWRpb0J1dHRvbk5ld0xvY2FsLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgY2FuY2VsQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgbmV4dEJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsNCi0gICAgICAgIGJhY2tCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7DQotICAgICAgICBzYXZlQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOw0KLQ0KLSAgICAgICAgeWVzQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7DQotICAgICAgICBub0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpOw0KLQ0KLSAgICAgICAgd2FybmluZzEuc2V0VmlzaWJsZSh0cnVlKTsNCi0gICAgICAgIHdhcm5pbmcyLnNldFZpc2libGUodHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNob3dzIHRoZSBXYXJuaW5nIHNjcmVlbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dXYXJuaW5nU2NyZWVuKCkgew0KLSAgICAgICAgY29udGVudFBhbmVsLmFkZCh3YXJuaW5nMSwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAxLCAxLCAxLCAwLjAsIDAuMCwNCi0gICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIG5ldyBJbnNldHMoDQotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCksIDAsIDApKTsNCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQod2FybmluZzIsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMiwgMSwgMSwgMC4wLCAwLjAsDQotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RILCBuZXcgSW5zZXRzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDApLCAwLCAwKSk7DQotICAgICAgICB5ZXNCdXR0b24uc2V0VGV4dCgieWVzIik7DQotICAgICAgICBidXR0b25QYW5lbC5hZGQoeWVzQnV0dG9uKTsNCi0gICAgICAgIHllc0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsNCi0NCi0gICAgICAgICAgICAgICAgc2hvd1llc1NjcmVlbigpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgbm9CdXR0b24uc2V0VGV4dCgibm8iKTsNCi0gICAgICAgIGJ1dHRvblBhbmVsLmFkZChub0J1dHRvbik7DQotICAgICAgICBub0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsNCi0NCi0gICAgICAgICAgICAgICAgc2hvd05vU2NyZWVuKCk7DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNjcmVlbiBpZiBZZXMgaXMgcHJlc3NlZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dZZXNTY3JlZW4oKSB7DQotDQotICAgICAgICAvLyBUT0RPOiBXaHkgZG9lc24ndCBpdCB3b3JrIHdpdGggdGhlIHJlZmVyZW5jZSBvbmx5Pw0KLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0bXBQYXJhbXMubGVuZ3RoOyBrKyspIHsNCi0gICAgICAgICAgICB0bXBCdWlsZFByb3BlcnRpZXMuc2V0UGFyYW1ldGVyKHRtcFBhcmFtc1trXSk7DQotICAgICAgICB9DQotICAgICAgICB0bXBCdWlsZFByb3BlcnRpZXMud3JpdGVMb2NhbCgpOw0KLQ0KLSAgICAgICAgc2F2ZU1lc3NhZ2Uuc2V0VGV4dCgiU3VjY2Vzc2Z1bCBzYXZlZCB0bzogIiArIHJvb3REaXINCi0gICAgICAgICAgICAgICAgKyAiL2xvY2FsLmJ1aWxkLnByb3BlcnRpZXMiKTsNCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQoc2F2ZU1lc3NhZ2UsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMiwgMSwgMSwgMC4wLA0KLSAgICAgICAgICAgICAgICAwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5TT1VUSCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlBBR0VfRU5ELA0KLSAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDAsIDAsIDAsIDApLCAwLCAwKSk7DQotICAgICAgICBzYXZlTWVzc2FnZS5zZXRWaXNpYmxlKHRydWUpOw0KLQ0KLSAgICAgICAgeWVzQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgbm9CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7DQotICAgICAgICB3YXJuaW5nMS5zZXRWaXNpYmxlKGZhbHNlKTsNCi0gICAgICAgIHdhcm5pbmcyLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgZXhpdEJ1dHRvbi5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNzQsIDIyKSk7DQotICAgICAgICBleGl0QnV0dG9uLnNldFRleHQoIkV4aXQiKTsNCi0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQoZXhpdEJ1dHRvbiwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAzLCAxLCAxLCAwLjAsDQotICAgICAgICAgICAgICAgIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlNPVVRILCBHcmlkQmFnQ29uc3RyYWludHMuUEFHRV9FTkQsDQotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsNCi0gICAgICAgIGV4aXRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpIHsNCi0NCi0gICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBjb250ZW50UGFuZWwucmV2YWxpZGF0ZSgpOw0KLSAgICAgICAgY29udGVudFBhbmVsLnJlcGFpbnQoKTsNCi0gICAgICAgIGZyYW1lLnBhY2soKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2NyZWVuIGlmIE5vIGlzIHByZXNzZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBzaG93Tm9TY3JlZW4oKSB7DQotDQotICAgICAgICBzYXZlTWVzc2FnZS5zZXRWaXNpYmxlKGZhbHNlKTsNCi0gICAgICAgIHBhcmFWYWx1ZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7DQotICAgICAgICBkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOw0KLSAgICAgICAgbG9jYWxWYWx1ZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7DQotICAgICAgICBuZXdMb2NhbFZhbHVlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsNCi0gICAgICAgIGRlZmF1bHRWYWx1ZVRleHRGaWVsZC5zZXRWaXNpYmxlKHRydWUpOw0KLSAgICAgICAgbG9jYWxWYWx1ZVRleHRGaWVsZC5zZXRWaXNpYmxlKHRydWUpOw0KLSAgICAgICAgbmV3TG9jYWxWYWx1ZVRleHRGaWVsZC5zZXRWaXNpYmxlKHRydWUpOw0KLQ0KLSAgICAgICAgcmFkaW9CdXR0b25EZWZhdWx0LnNldFZpc2libGUodHJ1ZSk7DQotICAgICAgICByYWRpb0J1dHRvbkxvY2FsLnNldFZpc2libGUodHJ1ZSk7DQotICAgICAgICByYWRpb0J1dHRvbk5ld0xvY2FsLnNldFZpc2libGUodHJ1ZSk7DQotICAgICAgICBjYW5jZWxCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsNCi0gICAgICAgIG5leHRCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7DQotDQotICAgICAgICBiYWNrQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7DQotICAgICAgICBzYXZlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7DQotDQotICAgICAgICB5ZXNCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7DQotICAgICAgICBub0J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsNCi0NCi0gICAgICAgIHNhdmVNZXNzYWdlLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgZnJhbWUucGFjaygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNZXRob2QgdG8gY3JlYXRlIHRoZSBDb21ib2JveGVzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjb21ib0JveCgpIHsNCi0gICAgICAgIFN0cmluZ1tdIGF2YWlsYWJsZVZhbHVlcyA9IHBhcmFtc1tnZXRTdGVwKCldLmdldEF2YWlsYWJsZVZhbHVlcygpOw0KLQ0KLSAgICAgICAgaWYgKGF2YWlsYWJsZVZhbHVlcyAhPSBudWxsICYmIGF2YWlsYWJsZVZhbHVlcy5sZW5ndGggPiAwKSB7DQotDQotICAgICAgICAgICAgZGVmYXVsdFZhbHVlVGV4dEZpZWxkLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgICAgIGxvY2FsVmFsdWVUZXh0RmllbGQuc2V0VmlzaWJsZShmYWxzZSk7DQotICAgICAgICAgICAgbmV3TG9jYWxWYWx1ZVRleHRGaWVsZC5zZXRWaXNpYmxlKGZhbHNlKTsNCi0NCi0gICAgICAgICAgICAvLyBUT0RPOiBub3QgbmljZSBzb2x2ZWQsIHdlIG5lZWQgdG8gZXhjbHVkZSBzdWJQYXJhbXMgd2l0aG91dA0KLSAgICAgICAgICAgIC8vIFZhbHVlcyBsaWtlIFdMUw0KLSAgICAgICAgICAgIFN0cmluZ1tdIGxhYmVscyA9IG5ldyBTdHJpbmdbYXZhaWxhYmxlVmFsdWVzLmxlbmd0aCAtIDFdOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXZhaWxhYmxlVmFsdWVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVWYWx1ZXNbaV0uZXF1YWxzKCJXTFMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbGFiZWxzW2ldID0gYXZhaWxhYmxlVmFsdWVzW2ldOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBkZWZhdWx0VmFsdWVDVGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQocGFyYW1zW2dldFN0ZXAoKV0NCi0gICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKSk7DQotICAgICAgICAgICAgZGVmYXVsdFZhbHVlQ1RleHRGaWVsZC5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oMjA0LA0KLSAgICAgICAgICAgICAgICAgICAgMjIpKTsNCi0gICAgICAgICAgICBkZWZhdWx0VmFsdWVDVGV4dEZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsNCi0NCi0gICAgICAgICAgICAvLyBNb3VzZUxpc3RlbmVyIHRha2VzIGNhcmUgdG8gcGxhY2UgcmFkaW8gYnV0dG9uDQotICAgICAgICAgICAgZGVmYXVsdFZhbHVlQ1RleHRGaWVsZC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmFkaW9CdXR0b25EZWZhdWx0LnNldFNlbGVjdGVkKHRydWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKE1vdXNlRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUV4aXRlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAvLyBBY3Rpb25MaXN0ZW5lciB3aGljaCBsb29rcyB3aGF0IGlzIHNlbGVjdGVkIGluIHRoZSBEcm9wZG93biBsaXN0DQotICAgICAgICAgICAgZGVmYXVsdFZhbHVlQ1RleHRGaWVsZC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgSkNvbWJvQm94IGNiID0gKEpDb21ib0JveCkgZXZlbnQuZ2V0U291cmNlKCk7DQotICAgICAgICAgICAgICAgICAgICB0bXBQYXJhbXNbZ2V0U3RlcCgpXS5zZXRMb2NhbFZhbHVlKGNiLmdldFNlbGVjdGVkSXRlbSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgIHN1YlBhcmFtcyA9IHBhcmFtc1tnZXRTdGVwKCldLmdldFN1YnNlcXVlbnRQYXJhbWV0ZXJzKGNiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpLCB0bXBCdWlsZFByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgY29udGVudFBhbmVsLmFkZChkZWZhdWx0VmFsdWVDVGV4dEZpZWxkLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDIsDQotICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwNCi0gICAgICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5CT1RILCBuZXcgSW5zZXRzKDAsIDAsIDAsIDApLCAwLCAwKSk7DQotDQotICAgICAgICAgICAgbG9jYWxWYWx1ZUNUZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZChwYXJhbXNbZ2V0U3RlcCgpXQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsVmFsdWUoKSk7DQotICAgICAgICAgICAgbG9jYWxWYWx1ZUNUZXh0RmllbGQuc2V0UHJlZmVycmVkU2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDIwNCwNCi0gICAgICAgICAgICAgICAgICAgIDIyKSk7DQotICAgICAgICAgICAgbG9jYWxWYWx1ZUNUZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIGxvY2FsVmFsdWVDVGV4dEZpZWxkLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgICAgICByYWRpb0J1dHRvbkxvY2FsLnNldFNlbGVjdGVkKHRydWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKE1vdXNlRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUV4aXRlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAvLyBBY3Rpb25MaXN0ZW5lciB3aGljaCBsb29rcyB3aGF0IGlzIHNlbGVjdGVkIGluIHRoZSBEcm9wZG93biBsaXN0DQotICAgICAgICAgICAgbG9jYWxWYWx1ZUNUZXh0RmllbGQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIEpDb21ib0JveCBjYiA9IChKQ29tYm9Cb3gpIGV2ZW50LmdldFNvdXJjZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgdG1wUGFyYW1zW2dldFN0ZXAoKV0uc2V0TG9jYWxWYWx1ZShjYi5nZXRTZWxlY3RlZEl0ZW0oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICBzdWJQYXJhbXMgPSBwYXJhbXNbZ2V0U3RlcCgpXS5nZXRTdWJzZXF1ZW50UGFyYW1ldGVycyhjYg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSwgdG1wQnVpbGRQcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIGNvbnRlbnRQYW5lbC5hZGQobG9jYWxWYWx1ZUNUZXh0RmllbGQsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMiwNCi0gICAgICAgICAgICAgICAgICAgIDEsIDEsIDAuMCwgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLA0KLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsNCi0NCi0gICAgICAgICAgICBuZXdMb2NhbFZhbHVlQ29tYm9Cb3ggPSBuZXcgSkNvbWJvQm94KGxhYmVscyk7DQotICAgICAgICAgICAgbmV3TG9jYWxWYWx1ZUNvbWJvQm94LnNldFNlbGVjdGVkSXRlbSh0bXBQYXJhbXNbZ2V0U3RlcCgpXS5nZXRMb2NhbFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgICAgIG5ld0xvY2FsVmFsdWVDb21ib0JveC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmFkaW9CdXR0b25OZXdMb2NhbC5zZXRTZWxlY3RlZCh0cnVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGV2ZW50KSB7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgLy8gQWN0aW9uTGlzdGVuZXIgd2hpY2ggbG9va3Mgd2hhdCBpcyBzZWxlY3RlZCBpbiB0aGUgRHJvcGRvd24gbGlzdA0KLSAgICAgICAgICAgIG5ld0xvY2FsVmFsdWVDb21ib0JveC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgSkNvbWJvQm94IGNiID0gKEpDb21ib0JveCkgZXZlbnQuZ2V0U291cmNlKCk7DQotICAgICAgICAgICAgICAgICAgICB0bXBQYXJhbXNbZ2V0U3RlcCgpXS5zZXRMb2NhbFZhbHVlKGNiLmdldFNlbGVjdGVkSXRlbSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgIHN1YlBhcmFtcyA9IHBhcmFtc1tnZXRTdGVwKCldLmdldFN1YnNlcXVlbnRQYXJhbWV0ZXJzKGNiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpLCB0bXBCdWlsZFByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgbmV3TG9jYWxWYWx1ZUNvbWJvQm94LnNldE1heGltdW1Sb3dDb3VudChhdmFpbGFibGVWYWx1ZXMubGVuZ3RoKTsNCi0gICAgICAgICAgICBuZXdMb2NhbFZhbHVlQ29tYm9Cb3guc2V0UHJlZmVycmVkU2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDIwNCwNCi0gICAgICAgICAgICAgICAgICAgIDIyKSk7DQotICAgICAgICAgICAgY29udGVudFBhbmVsLmFkZChuZXdMb2NhbFZhbHVlQ29tYm9Cb3gsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwNCi0gICAgICAgICAgICAgICAgICAgIDMsIDEsIDEsIDAuMCwgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLA0KLSAgICAgICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsNCi0NCi0gICAgICAgICAgICBjb250ZW50UGFuZWwucmV2YWxpZGF0ZSgpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBkZWZhdWx0VmFsdWVDVGV4dEZpZWxkLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgICAgIGxvY2FsVmFsdWVDVGV4dEZpZWxkLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgICAgIG5ld0xvY2FsVmFsdWVDb21ib0JveC5zZXRWaXNpYmxlKGZhbHNlKTsNCi0gICAgICAgICAgICBkZWZhdWx0VmFsdWVUZXh0RmllbGQuc2V0VmlzaWJsZSh0cnVlKTsNCi0gICAgICAgICAgICBsb2NhbFZhbHVlVGV4dEZpZWxkLnNldFZpc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgbmV3TG9jYWxWYWx1ZVRleHRGaWVsZC5zZXRWaXNpYmxlKHRydWUpOw0KLQ0KLSAgICAgICAgICAgIHdhcm5pbmcxLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgICAgIHdhcm5pbmcyLnNldFZpc2libGUoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZnJhbWUucGFjaygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0ZXANCi0gICAgICogDQotICAgICAqIEByZXR1cm4gc3RlcHMNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgZ2V0U3RlcCgpIHsNCi0gICAgICAgIHJldHVybiBzdGVwczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay90b29scy9jb25maWd1cmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sZW55YS9jb25maWcvaW1wbC9TZXJ2ZXJQYXJhbWV0ZXIuamF2YSBiL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL1NlcnZlclBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ2MGUyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL1NlcnZlclBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sZW55YS5jb25maWcuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubGVueWEuY29uZmlnLmNvcmUuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5jb3JlLlBhcmFtZXRlcjsKLQotLyoqCi0gKiBTZXJ2ZXIgUGFyYW1ldGVyIHdlYi5hcHAuc2VydmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIgewotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUuZXF1YWxzKCJKZXR0eSIpIHx8IHZhbHVlLmVxdWFscygiVG9tY2F0IikgfHwgdmFsdWUuZXF1YWxzKCJXTFMiKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZVZhbHVlcygpIHsKLSAgICAgICAgU3RyaW5nW10gYVZhbHVlcyA9IG5ldyBTdHJpbmdbM107Ci0gICAgICAgIGFWYWx1ZXNbMF0gPSAiSmV0dHkiOwotICAgICAgICBhVmFsdWVzWzFdID0gIlRvbWNhdCI7Ci0gICAgICAgIGFWYWx1ZXNbMl0gPSAiV0xTIjsKLSAgICAgICAgcmV0dXJuIGFWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyW10gZ2V0U3Vic2VxdWVudFBhcmFtZXRlcnMoU3RyaW5nIHZhbHVlLCBDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBpZiAodmFsdWUuZXF1YWxzKCJKZXR0eSIpKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJbXSBwID0gbmV3IFBhcmFtZXRlclsyXTsKLSAgICAgICAgICAgIHBbMF0gPSBjb25maWcuZ2V0UGFyYW1ldGVyKCJ3ZWIuYXBwLnNlcnZlci5qZXR0eS5wb3J0Iik7Ci0gICAgICAgICAgICBwWzFdID0gY29uZmlnLmdldFBhcmFtZXRlcigid2ViLmFwcC5zZXJ2ZXIuamV0dHkuYWRtaW4ucG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJUb21jYXQiKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyW10gcCA9IG5ldyBQYXJhbWV0ZXJbNF07Ci0gICAgICAgICAgICBwWzBdID0gY29uZmlnLmdldFBhcmFtZXRlcigidG9tY2F0LmhvbWUuZGlyIik7Ci0gICAgICAgICAgICBwWzFdID0gY29uZmlnLmdldFBhcmFtZXRlcigidG9tY2F0LndlYmFwcHMuZGlyIik7Ci0gICAgICAgICAgICBwWzJdID0gY29uZmlnLmdldFBhcmFtZXRlcigidG9tY2F0LmNhY2hlLmRpciIpOwotICAgICAgICAgICAgcFszXSA9IGNvbmZpZy5nZXRQYXJhbWV0ZXIoInRvbWNhdC5lbmRvcnNlZC5kaXIiKTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2NvbmZpZ3VyZS9zcmMvamF2YS9vcmcvYXBhY2hlL2xlbnlhL2NvbmZpZy9pbXBsL1N1YlBhcmFtc0dVSS5qYXZhIGIvdHJ1bmsvdG9vbHMvY29uZmlndXJlL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY29uZmlnL2ltcGwvU3ViUGFyYW1zR1VJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOGU4MGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvY29uZmlndXJlL3NyYy9qYXZhL29yZy9hcGFjaGUvbGVueWEvY29uZmlnL2ltcGwvU3ViUGFyYW1zR1VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgamF2YS5hd3QuQ29udGFpbmVyOwotaW1wb3J0IGphdmEuYXd0LkZsb3dMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuSW5zZXRzOwotaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpSYWRpb0J1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sZW55YS5jb25maWcuY29yZS5Db250ZXh0RXZlbnRRdWV1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxlbnlhLmNvbmZpZy5jb3JlLlBhcmFtZXRlcjsKLQotcHVibGljIGNsYXNzIFN1YlBhcmFtc0dVSSB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyZUdVSSBjR3VpOwotICAgIHByb3RlY3RlZCBKQnV0dG9uIG5leHRTdWJCdXR0b247Ci0gICAgcHJvdGVjdGVkIEpGcmFtZSBzdWJGcmFtZTsKLSAgICBwcml2YXRlIEpQYW5lbCBjb250ZW50UGFuZWw7Ci0gICAgcHJpdmF0ZSBKUGFuZWwgY2hlY2tCb3hQYW5lbDsKLSAgICBwcml2YXRlIEpQYW5lbCBidXR0b25QYW5lbDsKLSAgICBwcml2YXRlIEpMYWJlbCBkZWZhdWx0VmFsdWVMYWJlbDsKLSAgICBwcml2YXRlIEpMYWJlbCBsb2NhbFZhbHVlTGFiZWw7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgbmV3TG9jYWxWYWx1ZUxhYmVsOwotICAgIHByaXZhdGUgSkxhYmVsIHN0ZXBzTGFiZWw7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGRlZmF1bHRWYWx1ZVRleHRGaWVsZDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgbG9jYWxWYWx1ZVRleHRGaWVsZDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgbmV3TG9jYWxWYWx1ZVRleHRGaWVsZDsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbkRlZmF1bHQ7Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gcmFkaW9CdXR0b25Mb2NhbDsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbk5ld0xvY2FsOwotICAgIHByaXZhdGUgSkJ1dHRvbiBjbG9zZUJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gYmFja0J1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gbmV4dEJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gZG9uZUJ1dHRvbjsKLSAgICBwcm90ZWN0ZWQgSkNoZWNrQm94W10gY2hlY2tCb3hlczsKLSAgICBwcml2YXRlIEpMYWJlbCBwYXJhVmFsdWVMYWJlbDsKLSAgICBwcml2YXRlIFBhcmFtZXRlcltdIHN1YlBhcmFtczsKLSAgICBwcml2YXRlIFBhcmFtZXRlcltdIHRtcFN1YlBhcmFtczsKLSAgICBwcml2YXRlIFN0cmluZyBzZWxlY3RlZENvbWJvQm94VmFsdWU7Ci0gICAgaW50IHN0ZXBzID0gMDsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBjR3VpCi0gICAgICogQHBhcmFtIHRtcFN1YlBhcmFtcwotICAgICAqIEBwYXJhbSBzdWJQYXJhbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3ViUGFyYW1zR1VJKENvbmZpZ3VyZUdVSSBjR3VpLCBQYXJhbWV0ZXJbXSB0bXBTdWJQYXJhbXMsCi0gICAgICAgICAgICBQYXJhbWV0ZXJbXSBzdWJQYXJhbXMsIFN0cmluZyBzZWxlY3RlZENvbWJvQm94VmFsdWUpIHsKLQotICAgICAgICB0aGlzLmNHdWkgPSBjR3VpOwotICAgICAgICB0aGlzLnN1YlBhcmFtcyA9IHN1YlBhcmFtczsKLSAgICAgICAgdGhpcy50bXBTdWJQYXJhbXMgPSB0bXBTdWJQYXJhbXM7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWRDb21ib0JveFZhbHVlID0gc2VsZWN0ZWRDb21ib0JveFZhbHVlOwotICAgICAgICAKLSAgICAgICAgLy8gY2xlYXJpbmcgdGhlIHNlY29uZCB0ZW1wb3JhcnkgYXJyYXkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBTdWJQYXJhbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRtcFN1YlBhcmFtc1tpXS5zZXRMb2NhbFZhbHVlKCIiKTsKLSAgICAgICAgfQotICAgICAgICBjcmVhdGVTdWJQYXJhbXNHdWkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTdWJQYXJhbXNHdWkoKSB7Ci0KLSAgICAgICAgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFN5c3RlbUV2ZW50UXVldWUoKS5wdXNoKAotICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0RXZlbnRRdWV1ZSgpKTsKLQotICAgICAgICBzdWJGcmFtZSA9IG5ldyBKRnJhbWUoIkFwYWNoZSBTdWJwYXJhbWV0ZXIgXCIiICsgc2VsZWN0ZWRDb21ib0JveFZhbHVlCi0gICAgICAgICAgICAgICAgKyAiXCIgQ29uZmlndXJhdGlvbiIpOwotICAgICAgICBzdWJGcmFtZS5zZXRMb2NhdGlvbihjR3VpLmZyYW1lLmdldFgoKSArIDAsIGNHdWkuZnJhbWUuZ2V0WSgpICsgMCk7Ci0KLSAgICAgICAgY29udGVudFBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBjaGVja0JveFBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBidXR0b25QYW5lbCA9IG5ldyBKUGFuZWwoKTsKLQotICAgICAgICBkZWZhdWx0VmFsdWVMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgbG9jYWxWYWx1ZUxhYmVsID0gbmV3IEpMYWJlbCgpOwotICAgICAgICBuZXdMb2NhbFZhbHVlTGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0KLSAgICAgICAgZGVmYXVsdFZhbHVlVGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoMjApOwotICAgICAgICBsb2NhbFZhbHVlVGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoMjApOwotICAgICAgICBuZXdMb2NhbFZhbHVlVGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoMjApOwotCi0gICAgICAgIHJhZGlvQnV0dG9uRGVmYXVsdCA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLSAgICAgICAgcmFkaW9CdXR0b25Mb2NhbCA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLSAgICAgICAgcmFkaW9CdXR0b25OZXdMb2NhbCA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLSAgICAgICAgQnV0dG9uR3JvdXAgZyA9IG5ldyBCdXR0b25Hcm91cCgpOwotCi0gICAgICAgIGNsb3NlQnV0dG9uID0gbmV3IEpCdXR0b24oKTsKLSAgICAgICAgYmFja0J1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIG5leHRCdXR0b24gPSBuZXcgSkJ1dHRvbigpOwotICAgICAgICBkb25lQnV0dG9uID0gbmV3IEpCdXR0b24oKTsKLQotICAgICAgICBDb250YWluZXIgY29udGVudFBhbmUgPSBzdWJGcmFtZS5nZXRDb250ZW50UGFuZSgpOwotICAgICAgICBjb250ZW50UGFuZS5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7Ci0KLSAgICAgICAgY29udGVudFBhbmVsLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0KLSAgICAgICAgc3RlcHNMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgc3RlcHNMYWJlbC5zZXRUZXh0KCJQYXJhbWV0ZXJzICAiKTsKLSAgICAgICAgYy5ncmlkeCA9IDA7Ci0gICAgICAgIGMuZ3JpZHkgPSAwOwotICAgICAgICBjb250ZW50UGFuZWwuYWRkKHN0ZXBzTGFiZWwsIGMpOwotCi0gICAgICAgIGNoZWNrQm94UGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIGNoZWNrQm94UGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQoY2hlY2tCb3hQYW5lbCwgQm94TGF5b3V0LllfQVhJUykpOwotICAgICAgICBjLmdyaWR4ID0gMDsKLSAgICAgICAgYy5ncmlkeSA9IDE7Ci0gICAgICAgIGMuZ3JpZGhlaWdodCA9IDQ7Ci0gICAgICAgIGMuaXBhZHggPSAyMDsKLSAgICAgICAgY29udGVudFBhbmVsLmFkZChjaGVja0JveFBhbmVsLCBjKTsKLQotICAgICAgICBjaGVja0JveGVzID0gbmV3IEpDaGVja0JveFtzdWJQYXJhbXMubGVuZ3RoXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YlBhcmFtcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgY2hlY2tCb3hlc1tpXSA9IG5ldyBKQ2hlY2tCb3goKTsKLSAgICAgICAgICAgIGNoZWNrQm94ZXNbaV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjaGVja0JveGVzW2ldLnNldFRleHQoc3ViUGFyYW1zW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjaGVja0JveGVzWzBdLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgY2hlY2tCb3hQYW5lbC5hZGQoY2hlY2tCb3hlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjLmdyaWR4ID0gMTsKLSAgICAgICAgYy5ncmlkeSA9IDA7Ci0gICAgICAgIGMuZ3JpZHdpZHRoID0gMTsKLSAgICAgICAgYy5ncmlkaGVpZ2h0ID0gMTsKLSAgICAgICAgcGFyYVZhbHVlTGFiZWwgPSBuZXcgSkxhYmVsKHN1YlBhcmFtc1swXS5nZXROYW1lKCkpOwotICAgICAgICBwYXJhVmFsdWVMYWJlbC5yZXBhaW50KCk7Ci0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQocGFyYVZhbHVlTGFiZWwsIGMpOwotCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxhYmVsLnNldFRleHQoIkRlZmF1bHQgVmFsdWU6Iik7Ci0gICAgICAgIGNvbnRlbnRQYW5lbC5hZGQoZGVmYXVsdFZhbHVlTGFiZWwsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMSwgMSwgMSwKLSAgICAgICAgICAgICAgICAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICBjb250ZW50UGFuZWwuYWRkKGRlZmF1bHRWYWx1ZVRleHRGaWVsZCwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAxLCAxLAotICAgICAgICAgICAgICAgIDEsIDAuMCwgMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLAotICAgICAgICAgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cy5CT1RILCBuZXcgSW5zZXRzKDAsIDAsIDAsIDApLCAwLCAwKSk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZVRleHRGaWVsZC5zZXRUZXh0KHN1YlBhcmFtc1swXS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZVRleHRGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZVRleHRGaWVsZC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9uRGVmYXVsdC5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29udGVudFBhbmVsLmFkZChyYWRpb0J1dHRvbkRlZmF1bHQsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMywgMSwgMSwgMSwKLSAgICAgICAgICAgICAgICAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICBnLmFkZChyYWRpb0J1dHRvbkRlZmF1bHQpOwotCi0gICAgICAgIGxvY2FsVmFsdWVMYWJlbC5zZXRUZXh0KCJMb2NhbCBWYWx1ZToiKTsKLSAgICAgICAgY29udGVudFBhbmVsLmFkZChsb2NhbFZhbHVlTGFiZWwsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMiwgMSwgMSwKLSAgICAgICAgICAgICAgICAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICBjb250ZW50UGFuZWwuYWRkKGxvY2FsVmFsdWVUZXh0RmllbGQsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMiwgMSwKLSAgICAgICAgICAgICAgICAxLCAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICBsb2NhbFZhbHVlVGV4dEZpZWxkLnNldFRleHQoc3ViUGFyYW1zWzBdLmdldExvY2FsVmFsdWUoKSk7Ci0gICAgICAgIGxvY2FsVmFsdWVUZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBsb2NhbFZhbHVlVGV4dEZpZWxkLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgcmFkaW9CdXR0b25Mb2NhbC5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29udGVudFBhbmVsLmFkZChyYWRpb0J1dHRvbkxvY2FsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDMsIDIsIDEsIDEsCi0gICAgICAgICAgICAgICAgMC4wLCAwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RILAotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsKLSAgICAgICAgZy5hZGQocmFkaW9CdXR0b25Mb2NhbCk7Ci0gICAgICAgIHJhZGlvQnV0dG9uTG9jYWwuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0KLSAgICAgICAgbmV3TG9jYWxWYWx1ZUxhYmVsLnNldFRleHQoIk5ldyBMb2NhbCBWYWx1ZToiKTsKLSAgICAgICAgY29udGVudFBhbmVsLmFkZChuZXdMb2NhbFZhbHVlTGFiZWwsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMywgMSwgMSwKLSAgICAgICAgICAgICAgICAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICBjb250ZW50UGFuZWwuYWRkKG5ld0xvY2FsVmFsdWVUZXh0RmllbGQsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMywKLSAgICAgICAgICAgICAgICAxLCAxLCAwLjAsIDAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwKLSAgICAgICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotICAgICAgICBuZXdMb2NhbFZhbHVlVGV4dEZpZWxkLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgcmFkaW9CdXR0b25OZXdMb2NhbC5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2VkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29udGVudFBhbmVsLmFkZChyYWRpb0J1dHRvbk5ld0xvY2FsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDMsIDMsIDEsCi0gICAgICAgICAgICAgICAgMSwgMC4wLCAwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIsCi0gICAgICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsKLSAgICAgICAgZy5hZGQocmFkaW9CdXR0b25OZXdMb2NhbCk7Ci0KLSAgICAgICAgYnV0dG9uUGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIGJ1dHRvblBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGJ1dHRvblBhbmVsLCBCb3hMYXlvdXQuWF9BWElTKSk7Ci0KLSAgICAgICAgY2xvc2VCdXR0b24uc2V0VGV4dCgiQ2xvc2UiKTsKLSAgICAgICAgY2xvc2VCdXR0b24uc2V0UHJlZmVycmVkU2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDc0LCAyMikpOwotICAgICAgICBjbG9zZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgICAgICAgICBzdWJGcmFtZS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjR3VpLmZyYW1lLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgY0d1aS5mcmFtZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBiYWNrQnV0dG9uLnNldFRleHQoIjxCYWNrIik7Ci0gICAgICAgIGJhY2tCdXR0b24uc2V0UHJlZmVycmVkU2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDc0LCAyMikpOwotICAgICAgICBiYWNrQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb3ZlQmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIG5leHRCdXR0b24uc2V0VGV4dCgiTmV4dD4iKTsKLSAgICAgICAgbmV4dEJ1dHRvbi5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNzQsIDIyKSk7Ci0gICAgICAgIG5leHRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCi0gICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50UGFuZWwuaXNWaXNpYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtb3ZlTmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBidXR0b25QYW5lbC5hZGQoY2xvc2VCdXR0b24pOwotICAgICAgICBidXR0b25QYW5lbC5hZGQoYmFja0J1dHRvbik7Ci0gICAgICAgIGJ1dHRvblBhbmVsLmFkZChuZXh0QnV0dG9uKTsKLQotICAgICAgICBjb250ZW50UGFuZWwuYWRkKGJ1dHRvblBhbmVsLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDQsIDYsIDAsIDAuMCwKLSAgICAgICAgICAgICAgICAwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RILAotICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMCwgMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICBzdWJGcmFtZS5hZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNHdWkuZnJhbWUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKFdpbmRvd0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjR3VpLmZyYW1lLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0ljb25pZmllZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0RlaWNvbmlmaWVkKFdpbmRvd0V2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKFdpbmRvd0V2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoV2luZG93RXZlbnQgZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjb250ZW50UGFuZS5hZGQoY29udGVudFBhbmVsKTsKLSAgICAgICAgY29udGVudFBhbmVsLnJldmFsaWRhdGUoKTsKLSAgICAgICAgc3ViRnJhbWUucGFjaygpOwotICAgICAgICBzdWJGcmFtZS5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRyb2xzIGJlaGF2aW9yIGlmIGJhY2sgYnV0dG9uIGlzIHByZXNzZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb3ZlQmFjaygpIHsKLSAgICAgICAgc3RlcHMtLTsKLSAgICAgICAgc3ViRnJhbWUucmVwYWludCgpOwotICAgICAgICBuZXh0QnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIGRvbmVCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIGNoZWNrRmlyc3QoKTsKLSAgICAgICAgY3VycmVudFN0ZXAoImRvd24iKTsKLSAgICAgICAgc2hvd05vcm1hbE9wdGlvbnMoKTsKLSAgICAgICAgY2hlY2tMYXN0KCk7Ci0gICAgICAgIG5ld0xvY2FsVmFsdWVUZXh0RmllbGQuc2V0VGV4dCh0bXBTdWJQYXJhbXNbZ2V0U3RlcCgpXS5nZXRMb2NhbFZhbHVlKCkpOwotICAgICAgICBzZXRSYWRpb0J1dHRvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRyb2xzIGJlaGF2aW9yIGlmIG5leHQgYnV0dG9uIGlzIHByZXNzZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb3ZlTmV4dCgpIHsKLSAgICAgICAgc2V0TG9jYWxWYWx1ZSgpOwotICAgICAgICBzdGVwcysrOwotICAgICAgICBzdWJGcmFtZS5yZXBhaW50KCk7Ci0gICAgICAgIGNoZWNrRmlyc3QoKTsKLSAgICAgICAgY3VycmVudFN0ZXAoInVwIik7Ci0gICAgICAgIHNob3dOb3JtYWxPcHRpb25zKCk7Ci0gICAgICAgIGNoZWNrTGFzdCgpOwotICAgICAgICBuZXdMb2NhbFZhbHVlVGV4dEZpZWxkLnNldFRleHQodG1wU3ViUGFyYW1zW2dldFN0ZXAoKV0uZ2V0TG9jYWxWYWx1ZSgpKTsKLSAgICAgICAgc2V0UmFkaW9CdXR0b24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgcmFkaW8gYnV0dG9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmFkaW9CdXR0b24oKSB7Ci0gICAgICAgIGlmICh0bXBTdWJQYXJhbXNbZ2V0U3RlcCgpXS5nZXRMb2NhbFZhbHVlKCkgIT0gIiIpIHsKLSAgICAgICAgICAgIHJhZGlvQnV0dG9uTmV3TG9jYWwuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3ViUGFyYW1zW2dldFN0ZXAoKV0uZ2V0TG9jYWxWYWx1ZSgpICE9ICIiKSB7Ci0gICAgICAgICAgICByYWRpb0J1dHRvbkxvY2FsLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmFkaW9CdXR0b25EZWZhdWx0LnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGxvY2FsIHZhbHVlIGRlcGVuZGluZyBvbiBjaG9zZW4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFZhbHVlKCkgewotCi0gICAgICAgIGlmIChyYWRpb0J1dHRvbkRlZmF1bHQuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICB0bXBTdWJQYXJhbXNbZ2V0U3RlcCgpXS5zZXRMb2NhbFZhbHVlKGRlZmF1bHRWYWx1ZVRleHRGaWVsZAotICAgICAgICAgICAgICAgICAgICAuZ2V0VGV4dCgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChyYWRpb0J1dHRvbkxvY2FsLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgdG1wU3ViUGFyYW1zW2dldFN0ZXAoKV0KLSAgICAgICAgICAgICAgICAgICAgLnNldExvY2FsVmFsdWUobG9jYWxWYWx1ZVRleHRGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICB9IGVsc2UgaWYgKHJhZGlvQnV0dG9uTmV3TG9jYWwuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICB0bXBTdWJQYXJhbXNbZ2V0U3RlcCgpXS5zZXRMb2NhbFZhbHVlKG5ld0xvY2FsVmFsdWVUZXh0RmllbGQKLSAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZhdGFsIEVycm9yIDAxMjM0NTY3ODkhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlcyBjYXJlIGFib3V0IHRoZSBzdGVwcyBwcm9ncmVzcyAobGlzdCBvbiBsZWZ0IHNpZGUpCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpcmVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGN1cnJlbnRTdGVwKFN0cmluZyBkaXJlY3Rpb24pIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbi5lcXVhbHMoInVwIikpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGdldFN0ZXAoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tCb3hlc1tpXS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZGlyZWN0aW9uLmVxdWFscygiZG93biIpKSB7Ci0gICAgICAgICAgICBjaGVja0JveGVzW2dldFN0ZXAoKSArIDFdLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBpdHMgZmlyc3Qgc3RlcCBhbmQgZGlzYWJsZXMgdGhlIGJhY2sgYnV0dG9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hlY2tGaXJzdCgpIHsKLQotICAgICAgICBpZiAoZ2V0U3RlcCgpID09IDApIHsKLSAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgaXRzIGxhc3Qgc3RlcCBhbmQgZGlzYWJsZXMgbmV4dCBidXR0b24gYnV0IGFkZGluZyBhIHNhdmUgYnV0dG9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hlY2tMYXN0KCkgewotICAgICAgICBkb25lQnV0dG9uID0gbmV3IEpCdXR0b24oIkRvbmUiKTsKLQotICAgICAgICBpZiAoZ2V0U3RlcCgpID09IHN1YlBhcmFtcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICBuZXh0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbmV4dEJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQotICAgICAgICAgICAgYnV0dG9uUGFuZWwuYWRkKGRvbmVCdXR0b24pOwotICAgICAgICAgICAgY29udGVudFBhbmVsLnJldmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgZG9uZUJ1dHRvbi5zZXRQcmVmZXJyZWRTaXplKG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNzQsIDIyKSk7Ci0gICAgICAgICAgICBkb25lQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgc3ViRnJhbWUuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNHdWkuZnJhbWUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY0d1aS5mcmFtZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93cyB0aGUgbm9ybWFsIG9wdGlvbnMgKHBhcmFtYXRlcnMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd05vcm1hbE9wdGlvbnMoKSB7Ci0KLSAgICAgICAgaWYgKGdldFN0ZXAoKSA8IHN1YlBhcmFtcy5sZW5ndGgpIHsKLQotICAgICAgICAgICAgZGVmYXVsdFZhbHVlVGV4dEZpZWxkLnNldFRleHQoc3ViUGFyYW1zW2dldFN0ZXAoKV0KLSAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGxvY2FsVmFsdWVUZXh0RmllbGQuc2V0VGV4dChzdWJQYXJhbXNbZ2V0U3RlcCgpXS5nZXRMb2NhbFZhbHVlKCkpOwotICAgICAgICAgICAgcGFyYVZhbHVlTGFiZWwuc2V0VGV4dChzdWJQYXJhbXNbZ2V0U3RlcCgpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc3ViRnJhbWUucGFjaygpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0ZXAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHN0ZXBzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdGVwKCkgewotICAgICAgICByZXR1cm4gc3RlcHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvamV0dHkvY29uZi9hZG1pbi54bWwgYi90cnVuay90b29scy9qZXR0eS9jb25mL2FkbWluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MDQ1OC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9qZXR0eS9jb25mL2FkbWluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IURPQ1RZUEUgQ29uZmlndXJlIFBVQkxJQyAiLS8vTW9ydCBCYXkgQ29uc3VsdGluZy8vRFREIENvbmZpZ3VyZSAxLjIvL0VOIiAiaHR0cDovL2pldHR5Lm1vcnRiYXkub3JnL2NvbmZpZ3VyZV8xXzIuZHRkIj4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIENvbmZpZ3VyZSB0aGUgSmV0dHkgU2VydmVyIGZvciB0aGUgQWRtaW5pc3RyYXRpb24gSW50ZXJmYWNlICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08Q29uZmlndXJlIGNsYXNzPSJvcmcubW9ydGJheS5qZXR0eS5TZXJ2ZXIiPgotCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8IS0tIENvbmZpZ3VyZSB0aGUgUmVxdWVzdCBMaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLSAgPCEtLSBBZGQgYW5kIGNvbmZpZ3VyZSBhIEhUVFAgbGlzdGVuZXIgdG8gcG9ydCA4MDgxICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBUaGUgZGVmYXVsdCBwb3J0IGNhbiBiZSBjaGFuZ2VkIHVzaW5nOiBqYXZhIC1EamV0dHkuYWRtaW4ucG9ydD04MCAtLT4KLSAgPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLSAgPENhbGwgbmFtZT0iYWRkTGlzdGVuZXIiPgotICAgIDxBcmc+Ci0gICAgICA8TmV3IGNsYXNzPSJvcmcubW9ydGJheS5odHRwLlNvY2tldExpc3RlbmVyIj4KLSAgICAgICAgPFNldCBuYW1lPSJIb3N0Ij4xMjcuMC4wLjE8L1NldD4KLSAgICAgICAgPFNldCBuYW1lPSJQb3J0Ij48U3lzdGVtUHJvcGVydHkgbmFtZT0iamV0dHkuYWRtaW4ucG9ydCIgZGVmYXVsdD0iODA4MSIvPjwvU2V0PgotICAgICAgICA8U2V0IG5hbWU9Ik1pblRocmVhZHMiPjU8L1NldD4KLSAgICAgICAgPFNldCBuYW1lPSJNYXhUaHJlYWRzIj4xMDA8L1NldD4KLSAgICAgICAgPFNldCBuYW1lPSJNYXhJZGxlVGltZU1zIj4zMDAwMDwvU2V0PgotICAgICAgICA8U2V0IG5hbWU9Ikxvd1Jlc291cmNlUGVyc2lzdFRpbWVNcyI+NTAwMDwvU2V0PgotICAgICAgPC9OZXc+Ci0gICAgPC9Bcmc+Ci0gIDwvQ2FsbD4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb25maWd1cmUgdGhlIENvbnRleHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDxDYWxsIG5hbWU9ImFkZENvbnRleHQiPgotICAgIDxBcmc+LzwvQXJnPiAgIAotCi0gICAgPENhbGwgbmFtZT0iYWRkU2VydmxldCI+Ci0gICAgICA8QXJnPkFkbWluPC9Bcmc+Ci0gICAgICA8QXJnPi88L0FyZz4KLSAgICAgIDxBcmc+b3JnLm1vcnRiYXkuc2VydmxldC5BZG1pblNlcnZsZXQ8L0FyZz4KLSAgICA8L0NhbGw+Ci0gICAgPENhbGwgbmFtZT0ic2V0QXR0cmlidXRlIj4KLSAgICAgIDxBcmc+b3JnLm1vcnRiYXkuaHR0cC5IdHRwU2VydmVyPC9Bcmc+Ci0gICAgICA8QXJnPjxDYWxsIG5hbWU9ImdldEh0dHBTZXJ2ZXIiLz48L0FyZz4KLSAgICA8L0NhbGw+Ci0gIDwvQ2FsbD4KLQotPC9Db25maWd1cmU+Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2pldHR5L2NvbmYvamFhcy5wb2xpY3kgYi90cnVuay90b29scy9qZXR0eS9jb25mL2phYXMucG9saWN5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDJlNWM4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2NvbmYvamFhcy5wb2xpY3kKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLyBFeGFtcGxlIHBlcm1pc3Npb25zIGZvciBKQUFTIGRlbW8NCi0vLw0KLS8vIEZvciBKU1BzLCB5b3UgbWF5IG5lZWQgdG8gc2V0Og0KLS8vICArIHJlYWQsd3JpdGUsZGVsZXRlIEZpbGVQZXJtaXNzaW9uIGZvciB0aGUgc2NyYXRjaERpciBzZXR0aW5nIGZvciBKQVNQRVINCi0vLw0KLS8vIElmIHlvdSBoYXZlIHNldCB0aGUgImphdmF4LnNlcnZsZXQuY29udGV4dC50ZW1wZGlyIiBhdHRyaWJ1dGUgb2YgdGhlIHdlYmFwcA0KLS8vIGNvbnRleHQsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHJlYWQsd3JpdGUsZGVsZXRlIEZpbGVQZXJtaXNzaW9ucyBmb3IgdGhpcyBkaXJlY3RvcnkuDQotLy8NCi0vLyBUbyBydW4gdGhlIEpBQVMgZGVtbywgY2QgJGpldHR5LmhvbWUvZXh0cmEvcGx1cyBhbmQgdHlwZSBhbnQgcnVuLmphYXMuZGVtbw0KLQ0KLQ0KLWdyYW50IA0KLXsNCi0gIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiKiIsICJyZWFkIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtpbnN0YWxsLmRpcn0vLi4vLi4iLCAicmVhZCI7DQotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7aW5zdGFsbC5kaXJ9Ly4uLy4uL2V0YyIsICJyZWFkIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtpbnN0YWxsLmRpcn0vLi4vLi4vZXRjLy0iLCAicmVhZCI7DQotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7aW5zdGFsbC5kaXJ9Ly4uLy4uL2xpYi8tIiwgInJlYWQiOw0KLSAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2luc3RhbGwuZGlyfS8uLi8uLi9leHQvLSIsICJyZWFkIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtpbnN0YWxsLmRpcn0vLi4vLi4vZXh0IiwgInJlYWQiOw0KLSAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2luc3RhbGwuZGlyfS8uLi8uLi8tIiwgInJlYWQiOw0KLSAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIvdXNyL3NoYXJlL2phdmEvLSIsICJyZWFkIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtqZGsuaG9tZX0key99bGliJHsvfS0iLCAicmVhZCI7DQotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7amRrLmhvbWV9JHsvfWpyZSR7L31saWIkey99LSIsICJyZWFkIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtqYXZhLmlvLnRtcGRpcn0iLCAicmVhZCx3cml0ZSxkZWxldGUiOw0KLSAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2phdmEuaW8udG1wZGlyfSR7L30tIiwgInJlYWQsd3JpdGUsZGVsZXRlIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtqZXR0eS5ob21lfS9sb2dzL2xvZzRqLmxvZyIsICJ3cml0ZSI7DQotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7amV0dHkuaG9tZX0key99d29yayR7L30qIiwgInJlYWQsd3JpdGUsZXhlY3V0ZSI7DQotICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uICJnZXRQb2xpY3kiOw0KLSAgcGVybWlzc2lvbiBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uICJkb0FzUHJpdmlsZWdlZCI7DQotfTsNCi0NCi0NCi1ncmFudCBjb2RlQmFzZSAiZmlsZToke2pldHR5LmhvbWV9L2xpYi8tIiANCi17DQotICBwZXJtaXNzaW9uIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24gImxvY2FsaG9zdDoxLTY1NTM2IiwgImNvbm5lY3QsYWNjZXB0LGxpc3RlbixyZXNvbHZlIjsNCi0gIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiMC4wLjAuMDoxLTY1NTM2IiwgImNvbm5lY3QsYWNjZXB0LGxpc3RlbixyZXNvbHZlIjsNCi0gIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiMTI3LjAuMC4xOjEtNjU1MzYiLCAiY29ubmVjdCxhY2NlcHQscmVzb2x2ZSI7DQotICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAicmVhZCwgd3JpdGUiOw0KLSAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2pldHR5LmhvbWV9JHsvfS0iLCAicmVhZCI7DQotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7amV0dHkuaG9tZX0key99bG9ncyR7L30qIiwgInJlYWQsd3JpdGUsZGVsZXRlIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtqZXR0eS5ob21lfSR7L31jZ2ktYmluJHsvfS0iLCAicmVhZCxleGVjdXRlIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtqYXZhLmlvLnRtcGRpcn0vLSIsICJyZWFkLHdyaXRlLGRlbGV0ZSI7DQotICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uICJwdXRQcm92aWRlclByb3BlcnR5LlN1bkpTU0UiOw0KLSAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiAiaW5zZXJ0UHJvdmlkZXIuU3VuSlNTRSI7DQotICBwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gImNyZWF0ZUxvZ2luQ29udGV4dC5qZGJjIjsNCi0gIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJjcmVhdGVDbGFzc0xvYWRlciI7DQotICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiZ2V0Q2xhc3NMb2FkZXIiOw0KLSAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gInNldENvbnRleHRDbGFzc0xvYWRlciI7DQotICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsNCi0gIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJzaHV0ZG93bkhvb2tzIjsNCi0gIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4udG9vbHMuKiI7DQotICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAic2V0SU8iOw0KLX07DQotDQotZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtqZXR0eS5ob21lfS9leHQvLSIgDQotew0KLSAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gInNldElPIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiL3RtcC8qIiwgInJlYWQsd3JpdGUsZGVsZXRlIjsNCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiL3RtcC8tIiwgInJlYWQsd3JpdGUsZGVsZXRlIjsNCi19Ow0KLQ0KLWdyYW50IGNvZGVCYXNlICJmaWxlOiR7amV0dHkuaG9tZX0vZXh0cmEvbGliL29yZy5tb3J0YmF5LmphYXMuamFyIg0KLXsNCi0gIHBlcm1pc3Npb24gamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbiAiY3JlYXRlTG9naW5Db250ZXh0LmpkYmMiOw0KLSAgcGVybWlzc2lvbiBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uICJtb2RpZnlQcmluY2lwYWxzIjsNCi0gIHBlcm1pc3Npb24gamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbiAibW9kaWZ5UHJpdmF0ZUNyZWRlbnRpYWxzIjsNCi19Ow0KLQ0KLQ0KLS8vIFBlcm1pc3Npb25zIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24NCi1ncmFudCBjb2RlQmFzZSAiZmlsZToke2luc3RhbGwuZGlyfS9kZW1vL3dlYmFwcHMvamFhcyQvV0VCLUlORi9jbGFzc2VzLy0iIA0KLXsgDQotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7aW5zdGFsbC5kaXJ9JHsvfWRlbW8key99d2ViYXBwcyR7L31qYWFzJHsvfS0iLCAicmVhZCI7DQotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7amF2YS5pby50bXBkaXJ9JHsvfS0iLCAicmVhZCx3cml0ZSxkZWxldGUiOw0KLSAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiAiZ2V0UG9saWN5IjsNCi19Ow0KLQ0KLS8vIGZvciB0ZXN0DQotZ3JhbnQgUHJpbmNpcGFsIG9yZy5tb3J0YmF5LmphYXMuSkFBU1ByaW5jaXBhbCAibWUiIHsNCi0gICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uICJteVNlY3VyaXR5UGVybWlzc2lvbiI7DQotfTsNCi0NCmRpZmYgLS1naXQgYS90cnVuay90b29scy9qZXR0eS9jb25mL21haW4ueG1sIGIvdHJ1bmsvdG9vbHMvamV0dHkvY29uZi9tYWluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1N2RhMS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9qZXR0eS9jb25mL21haW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgIGVuY29kaW5nPSJJU08tODg1OS0xIj8+IAotPCFET0NUWVBFIENvbmZpZ3VyZSBQVUJMSUMgIi0vL01vcnQgQmF5IENvbnN1bHRpbmcvL0RURCBDb25maWd1cmUgMS4yLy9FTiIgImh0dHA6Ly9qZXR0eS5tb3J0YmF5Lm9yZy9jb25maWd1cmVfMV8yLmR0ZCI+Ci0KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQ29uZmlndXJlIHRoZSBKZXR0eVBsdXMgU2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08Q29uZmlndXJlIGNsYXNzPSJvcmcubW9ydGJheS5qZXR0eS5wbHVzLlNlcnZlciI+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29uZmlndXJlIExvZ2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi0gIDwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotICA8IS0tIENvbmZpZ3VyZSBKZXR0eSBMb2dnaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0gIDwhLS0gVW5jb21tZW50IGlmIHVzaW5nIGpldHR5IGxvZ2dpbmcuCi0gIDxDYWxsIGNsYXNzPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5IiBuYW1lPSJnZXRGYWN0b3J5Ij4KLSAgICA8Q2FsbCBuYW1lPSJnZXRJbnN0YW5jZSI+Ci0gICAgICA8QXJnLz4KLSAgICAgIDxDYWxsIG5hbWU9InJlc2V0Ii8+Ci0gICAgICA8Q2FsbCBuYW1lPSJhZGQiPgotICAgICAgICA8QXJnPgotICAgICAgICAgIDxOZXcgY2xhc3M9Im9yZy5tb3J0YmF5LmxvZy5PdXRwdXRTdHJlYW1Mb2dTaW5rIj4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0iZmlsZW5hbWUiPjxTeXN0ZW1Qcm9wZXJ0eSBuYW1lPSJqZXR0eS5ob21lIiBkZWZhdWx0PSIuIi8+L2xvZ3MveXl5eV9tbV9kZC5qZXR0eS5sb2c8L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0icmV0YWluRGF5cyI+OTA8L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0iYXBwZW5kIj50cnVlPC9TZXQ+Ci0gICAgICAgICAgICA8U2V0IG5hbWU9ImxvZ0xhYmVscyI+dHJ1ZTwvU2V0PgotICAgICAgICAgICAgPFNldCBuYW1lPSJsb2dTdGFja1NpemUiPnRydWU8L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0ibG9nU3RhY2tUcmFjZSI+ZmFsc2U8L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0ibG9nT25lTGluZSI+ZmFsc2U8L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0ic3VwcHJlc3NTdGFjayI+ZmFsc2U8L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0ibG9nVGltZVpvbmUiPkdNVDwvU2V0PgotICAgICAgICAgIDwvTmV3PgotICAgICAgICA8L0FyZz4KLSAgICAgIDwvQ2FsbD4KLSAgICA8L0NhbGw+Ci0gIDwvQ2FsbD4KLSAgLS0+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29uZmlndXJlIGNvbnRleHQgc3BlY2lmaWMgbG9nNGogbG9nZ2luZyAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBVbmNvbW1lbnQgdG8gZW5hYmxlIHBlci1jb250ZXh0IGxvZ2dpbmcuIFlvdSB3aWxsIGFsc28gbmVlZCB0byAgLS0+Ci0gIDwhLS0gY3JlYXRlIGFuZCByZWdpc3RlciBhICBTZXJ2bGV0Q29udGV4dExpc3RlbmVyIHRoYXQgd2lsbCBjbGVhbiAgIC0tPgotICA8IS0tIHRoZSByZXBvc2l0b3J5IHdoZW4gdGhlIGNvbnRleHQgaXMgc3RvcHBlZCwgYnkgY2FsbGluZyB0aGlzIGxpbmUtLT4KLSAgPCEtLSBpbiB0aGUgY29udGV4dERlc3Ryb3llZCgpIG1ldGhvZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gIG9yZy5tb3J0YmF5LmxvZzRqLkNSUy5yZW1vdmUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSkgLS0+Ci0gIDwhLS0gCi0gIDxDYWxsIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkxvZ01hbmFnZXIiIG5hbWU9InNldFJlcG9zaXRvcnlTZWxlY3RvciI+Ci0gICAgPEFyZz48TmV3IGNsYXNzPSJvcmcubW9ydGJheS5sb2c0ai5DUlMiLz48L0FyZz4KLSAgICA8QXJnPjxOZXcgY2xhc3M9ImphdmEubGFuZy5PYmplY3QiLz48L0FyZz4KLSAgPC9DYWxsPgotICAtLT4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb25maWd1cmUgdGhlIFJlcXVlc3QgTGlzdGVuZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotICA8IS0tIEFkZCBhbmQgY29uZmlndXJlIGEgSFRUUCBsaXN0ZW5lciB0byBwb3J0IDg4ODggICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIFRoZSBkZWZhdWx0IHBvcnQgY2FuIGJlIGNoYW5nZWQgdXNpbmc6IGphdmEgLURqZXR0eS5wb3J0PTgwICAgICAtLT4KLSAgPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0gIDxDYWxsIG5hbWU9ImFkZExpc3RlbmVyIj4KLSAgICA8QXJnPgotICAgICAgPE5ldyBjbGFzcz0ib3JnLm1vcnRiYXkuaHR0cC5Tb2NrZXRMaXN0ZW5lciI+Ci0gICAgICAgIDxTZXQgbmFtZT0iUG9ydCI+PFN5c3RlbVByb3BlcnR5IG5hbWU9ImpldHR5LnBvcnQiIGRlZmF1bHQ9Ijg4ODgiLz48L1NldD4KLSAgICAgICAgPFNldCBuYW1lPSJNaW5UaHJlYWRzIj4xMDwvU2V0PgotICAgICAgICA8U2V0IG5hbWU9Ik1heFRocmVhZHMiPjEwMDwvU2V0PgotICAgICAgICA8U2V0IG5hbWU9Ik1heElkbGVUaW1lTXMiPjMwMDAwPC9TZXQ+Ci0gICAgICAgIDxTZXQgbmFtZT0iTG93UmVzb3VyY2VQZXJzaXN0VGltZU1zIj41MDAwPC9TZXQ+Ci0gICAgICA8L05ldz4KLSAgICA8L0FyZz4KLSAgPC9DYWxsPgotCi0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gU2V0IHRoZSBkZWZhdWx0IHdlYiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIG1lY2hhbmlzbXM6ICAgICAgIC0tPgotICA8IS0tICAgWE1MQ29uZmlndXJhdGlvbiAgICAgICAtIGhhbmRsZXMgV0VCLUlORi93ZWIueG1sICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAgIEpldHR5V2ViQ29uZmlndXJhdGlvbiAgLSBoYW5kbGVzIFdFQi1JTkYvamV0dHktd2ViLnhtbCAgICAgICAgLS0+Ci0gIDwhLS0gICBqc3I3Ny5Db25maWd1cmF0aW9uICAgIC0gQWRkcyBqc3I3NyBzdGF0aXN0aWNzIHRvIHNlcnZsZXRzICAgIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBPcmRlciBvZiB0aGVzZSBjbGFzc2VzIGlzIHNpZ25pZmljYW50LiBUaGUgZGVmYXVsdHMgc2V0IGhlcmUgICAgLS0+Ci0gIDwhLS0gY2FuIGJlIG92ZXJyaWRkZW4gYnkgY2FsbGluZyBzZXRDb25maWd1cmF0aW9uQ2xhc3NOYW1lcygpIG9uICAgIC0tPgotICA8IS0tIHRoZSB3ZWJhcHAgY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBUaGUgVGFnTGliY29uZmlndXJhdGlvbiBzY2FucyBhbnkgdGxkIGZpbGVzIGZvdW5kIGZvciAgICAgICAgICAgLS0+Ci0gIDwhLS0gYWRkaXRpb25hbCBqMmVlIGxpc3RlbmVyIGNsYXNzZXMgLSBuZWVkZWQgZm9yIEpTRiAgICAgICAgICAgICAgIC0tPgotICA8IS0tIFRoZSBqc3I3NyBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGFkZGl0aW9uYWwgamFycyBvbiB0aGUgICAgICAgICAtLT4KLSAgPCEtLSBvbiB0aGUgY2xhc3NwYXRoIGFuZCBpdCBuZWVkcyBqbXggZW5hYmxlZC4gICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotICA8U2V0IG5hbWU9IldlYkFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbkNsYXNzTmFtZXMiPgotICAgIDxBcnJheSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICAgIDxJdGVtPm9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQuWE1MQ29uZmlndXJhdGlvbjwvSXRlbT4KLSAgICAgIDxJdGVtPm9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQuSmV0dHlXZWJDb25maWd1cmF0aW9uPC9JdGVtPgotICAgICAgPEl0ZW0+b3JnLm1vcnRiYXkuamV0dHkuc2VydmxldC5UYWdMaWJDb25maWd1cmF0aW9uPC9JdGVtPgotICAgICAgPCEtLQotICAgICAgPEl0ZW0+b3JnLm1vcnRiYXkuamV0dHkuc2VydmxldC5qc3I3Ny5Db25maWd1cmF0aW9uPC9JdGVtPgotICAgICAgLS0+Ci0gICAgPC9BcnJheT4KLSAgPC9TZXQ+Ci0KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb25maWd1cmUgdGhlIENvbnRleHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLSAgPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0gIDwhLS0gVW5jb21tZW50IHRvIGNvbmZpZ3VyZSBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbnMgdG8gYmUgYXBwbGllZCAgIC0tPgotICA8IS0tIHRvIGVhY2ggd2ViYXBwIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBOb3RlIHRoYXQgb3JkZXIgaXMgc2lnbmlmaWNhbnQuIFRoaXMgY2FuIGJlIGNoYW5nZWQgcGVyIHdlYmFwcCAgLS0+Ci0gIDwhLS0gYnkgY2FsbGluZyBzZXRDb25maWd1cmF0aW9uQ2xhc3NOYW1lcygpIG9uIHRoZSB3ZWJhcHAgY29udGV4dC4gIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBUaGUganNyNzcgY29uZmlndXJhdGlvbiBpcyBvcHRpb25hbCAtIGlmIHNwZWNpZmllZCwganNyNzcgICAgICAgLS0+Ci0gIDwhLS0gc3RhdGlzdGljcyB3aWxsIGJlIGVuYWJsZWQuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBidWlsZCB0aGUgICAgIC0tPgotICA8IS0tIGV4dHJhL2pzcjc3IHBhY2thZ2UsIGluY2x1ZGUgdGhlIGpzcjc3IGphcnMgYW5kIHN0YXJ0IEpldHR5IHdpdGggLS0+Ci0gIDwhLS0gam14IGVuYWJsZWQuIFRvIG1ha2UgdGhpcyBlYXNpZXIsIHRoZSBKZXR0eVBsdXMgc3RhcnQgY29uZmlnICAgICAtLT4KLSAgPCEtLSBmaWxlIHNldHMgdXAgdGhlIGNsYXNzcGF0aCBjb3JyZWN0bHksIHNvIG1ha2Ugc3VyZSB5b3UgdXNlICAgICAgIC0tPgotICA8IS0tIC1EU1RBUlQ9ZXh0cmEvZXRjL3N0YXJ0LXBsdXMuY29uZmlnIGFuZCBzZWUgdGhlIEpldHR5UGx1cyAgICAgICAgLS0+Ci0gIDwhLS0gUkVBRE1FLlRYVCBmaWxlIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHJ1biB3aXRoIEpNWCBlbmFibGVkLiAtLT4KLSAgPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0gIDwhLS0KLSAgPFNldCBuYW1lPSJXZWJBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25DbGFzc05hbWVzIj4KLSAgICA8QXJyYXkgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgICA8SXRlbT5vcmcubW9ydGJheS5qZXR0eS5wbHVzLlBsdXNXZWJBcHBDb250ZXh0JENvbmZpZ3VyYXRpb248L0l0ZW0+Ci0gICAgICA8SXRlbT5vcmcubW9ydGJheS5qZXR0eS5zZXJ2bGV0LkpldHR5V2ViQ29uZmlndXJhdGlvbjwvSXRlbT4KLSAgICAgIDxJdGVtPm9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQuanNyNzcuQ29uZmlndXJhdGlvbjwvSXRlbT4KLSAgICA8L0FycmF5PgotICA8L1NldD4KLSAgLS0+Ci0KLQotICA8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLSAgPCEtLSBBZGQgYW5kIGNvbmZpZ3VyZSBhIHNwZWNpZmljIHdlYiBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gKyBTZXQgVW5wYWNrIFdBUiBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tICsgU2V0IERlZmF1bHQgRGVzY3JpcHRvci4gIFJlc291cmNlLCBmaWxlIG9yIFVSTCAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSArIFNldCBWaXJ0dWFsIEhvc3RzLiBBIE51bGwgaG9zdCBvciBlbXB0eSBhcnJheSBtZWFucyBhbGwgaG9zdHMgLS0+Ci0gIDwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotICA8Q2FsbCBuYW1lPSJhZGRXZWJBcHBsaWNhdGlvbiI+Ci0gICAgPEFyZz4vPC9Bcmc+Ci0gICAgPEFyZz48U3lzdGVtUHJvcGVydHkgbmFtZT0id2ViYXBwIiBkZWZhdWx0PSIuIi8+PC9Bcmc+Ci0gICAgPFNldCBuYW1lPSJkZWZhdWx0c0Rlc2NyaXB0b3IiPjxTeXN0ZW1Qcm9wZXJ0eSBuYW1lPSJob21lIiBkZWZhdWx0PSIuIi8+L3Rvb2xzL2pldHR5L2NvbmYvd2ViZGVmYXVsdHMueG1sPC9TZXQ+Ci0gIDwvQ2FsbD4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPCEtLSBDb25maWd1cmUgdGhlIFJlcXVlc3QgTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8U2V0IG5hbWU9IlJlcXVlc3RMb2ciPgotICAgIDxOZXcgY2xhc3M9Im9yZy5tb3J0YmF5Lmh0dHAuTkNTQVJlcXVlc3RMb2ciPgotICAgICAgPEFyZz48U3lzdGVtUHJvcGVydHkgbmFtZT0id2ViYXBwIiBkZWZhdWx0PSIuIi8+L1dFQi1JTkYvbG9ncy95eXl5X21tX2RkLnJlcXVlc3QubG9nPC9Bcmc+Ci0gICAgICA8U2V0IG5hbWU9InJldGFpbkRheXMiPjkwPC9TZXQ+Ci0gICAgICA8U2V0IG5hbWU9ImFwcGVuZCI+dHJ1ZTwvU2V0PgotICAgICAgPFNldCBuYW1lPSJleHRlbmRlZCI+ZmFsc2U8L1NldD4KLSAgICAgIDxTZXQgbmFtZT0iYnVmZmVyZWQiPmZhbHNlPC9TZXQ+Ci0gICAgICA8U2V0IG5hbWU9IkxvZ1RpbWVab25lIj5HTVQ8L1NldD4KLSAgICA8L05ldz4KLSAgPC9TZXQ+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29uZmlndXJlIHRoZSBPdGhlciBTZXJ2ZXIgT3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPFNldCBuYW1lPSJyZXF1ZXN0c1BlckdDIj4yMDAwPC9TZXQ+Ci0gIDxTZXQgbmFtZT0ic3RhdHNPbiI+ZmFsc2U8L1NldD4KLQotPC9Db25maWd1cmU+CmRpZmYgLS1naXQgYS90cnVuay90b29scy9qZXR0eS9jb25mL3dlYmRlZmF1bHRzLnhtbCBiL3RydW5rL3Rvb2xzL2pldHR5L2NvbmYvd2ViZGVmYXVsdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ0MGU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2NvbmYvd2ViZGVmYXVsdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4gICAKLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08d2ViLWFwcD4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgZmlsZSBpcyBhcHBsaWVkIHRvIGEgV2ViIGFwcGxpY2F0aW9uIGJlZm9yZSBpdCdzIG93biBXRUItSU5GL3dlYi54bWwgZmlsZQotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDwhLS0gQ29udGV4dCBwYXJhbXMgdG8gY29udHJvbCBTZXNzaW9uIENvb2tpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAgLS0+Ci0gIDwhLS0gVU5DT01NRU5UIFRPIEFDVElWQVRFCi0gIDxjb250ZXh0LXBhcmFtPgotICAgIDxwYXJhbS1uYW1lPm9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQuU2Vzc2lvbkRvbWFpbjwvcGFyYW0tbmFtZT4KLSAgICA8cGFyYW0tdmFsdWU+MTI3LjAuMC4xPC9wYXJhbS12YWx1ZT4KLSAgPC9jb250ZXh0LXBhcmFtPgotCi0gIDxjb250ZXh0LXBhcmFtPgotICAgIDxwYXJhbS1uYW1lPm9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQuU2Vzc2lvblBhdGg8L3BhcmFtLW5hbWU+Ci0gICAgPHBhcmFtLXZhbHVlPi88L3BhcmFtLXZhbHVlPgotICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgPGNvbnRleHQtcGFyYW0+Ci0gICAgPHBhcmFtLW5hbWU+b3JnLm1vcnRiYXkuamV0dHkuc2VydmxldC5NYXhBZ2U8L3BhcmFtLW5hbWU+Ci0gICAgPHBhcmFtLXZhbHVlPi0xPC9wYXJhbS12YWx1ZT4KLSAgPC9jb250ZXh0LXBhcmFtPgotICAtLT4KLQotICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICA8c2Vzc2lvbi1jb25maWc+Ci0gICAgPHNlc3Npb24tdGltZW91dD4zMDwvc2Vzc2lvbi10aW1lb3V0PgotICA8L3Nlc3Npb24tY29uZmlnPgotCi08L3dlYi1hcHA+Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dC9jb21tb25zLWxvZ2dpbmcuamFyIGIvdHJ1bmsvdG9vbHMvamV0dHkvZXh0L2NvbW1vbnMtbG9nZ2luZy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlY2MwZDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvamV0dHkvZXh0L2NvbW1vbnMtbG9nZ2luZy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9qZXR0eS9leHRyYS9leHQvY29tbW9ucy1jbGktMS4wLmphciBiL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9jb21tb25zLWNsaS0xLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmEwMDRlLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9jb21tb25zLWNsaS0xLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvZXh0L2hvd2wuamFyIGIvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvZXh0L2hvd2wuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIyZDg4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9ob3dsLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9qb3RtLmphciBiL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9qb3RtLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlYjEwMC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9qZXR0eS9leHRyYS9leHQvam90bS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9qZXR0eS9leHRyYS9leHQvam90bV9paW9wX3N0dWJzLmphciBiL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9qb3RtX2lpb3Bfc3R1YnMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEwYjJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9qb3RtX2lpb3Bfc3R1YnMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvZXh0L2pvdG1fanJtcF9zdHVicy5qYXIgYi90cnVuay90b29scy9qZXR0eS9leHRyYS9leHQvam90bV9qcm1wX3N0dWJzLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmZGM0YS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9qZXR0eS9leHRyYS9leHQvam90bV9qcm1wX3N0dWJzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9sb2c0ai5qYXIgYi90cnVuay90b29scy9qZXR0eS9leHRyYS9leHQvbG9nNGouamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRhOTE3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2V4dC9sb2c0ai5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9qZXR0eS9leHRyYS9saWIvb3JnLm1vcnRiYXkuamFhcy01LjEuNC5qYXIgYi90cnVuay90b29scy9qZXR0eS9leHRyYS9saWIvb3JnLm1vcnRiYXkuamFhcy01LjEuNC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGMyOTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvbGliL29yZy5tb3J0YmF5LmphYXMtNS4xLjQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvbGliL29yZy5tb3J0YmF5LmpldHR5LnBsdXMtNS4xLjQuamFyIGIvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvbGliL29yZy5tb3J0YmF5LmpldHR5LnBsdXMtNS4xLjQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzYxZTc0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL2xpYi9vcmcubW9ydGJheS5qZXR0eS5wbHVzLTUuMS40LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL3Jlc291cmNlcy9jYXJvbC5wcm9wZXJ0aWVzIGIvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvcmVzb3VyY2VzL2Nhcm9sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYWFkOWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvcmVzb3VyY2VzL2Nhcm9sLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwMiAtIElOUklBICh3d3cuaW5yaWEuZnIpCi0jIENvcHlyaWdodCAoQykgMjAwMiAtIElOUklBICh3d3cuaW5yaWEuZnIpCi0jCi0jIENBUk9MOiBDb21tb24gQXJjaGl0ZWN0dXJlIGZvciBSTUkgT2JqZWN0V2ViIExheWVyCi0jCi0jIFRoaXMgbGlicmFyeSBpcyBkZXZlbG9wZWQgaW5zaWRlIHRoZSBPYmplY3RXZWIgQ29uc29ydGl1bSwKLSMgaHR0cDovL3d3dy5vYmplY3R3ZWIub3JnCi0jCi0jIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcKLSMgVVNBCi0jCi0jCi0jIGF1dGhvciAgR3VpbGxhdW1lIFJpdmllcmUgKEd1aWxsYXVtZS5SaXZpZXJlQGlucmlhbHBlcy5mcikKLSMKLSMgJElkOiBjYXJvbC5wcm9wZXJ0aWVzLHYgMS41IDIwMDUvMDMvMjEgMTQ6NDY6MDcgamFuYiBFeHAgJAotIwotI2Nhcm9sLnJtaS5hY3RpdmF0ZWQ9bG1pCi0KLWNhcm9sLnByb3RvY29scz1sbWkKLSNjYXJvbC5wcm90b2NvbHM9anJtcAotY2Fyb2wuc3RhcnQubnM9ZmFsc2UKLWNhcm9sLnN0YXJ0LmpuZGk9ZmFsc2UKLWNhcm9sLnN0YXJ0LnJtaT1mYWxzZQotCi0jIEludGVyY2VwdG9ycyBmb3IgVHJhbnNhY3Rpb25zIGNvbmZpZ3VyYXRpb24KLSMgZm9yIGlpb3AKLSNjYXJvbC5qdm0ub3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yLk9SQkluaXRpYWxpemVyQ2xhc3Mub3JnLm9iamVjdHdlYi5qb3RtLm90cy5PVFNPUkJJbml0aWFsaXplcgotCi0jIGZvciBqcm1wCi0jY2Fyb2wuanZtLm9yZy5vYmplY3R3ZWIuUG9ydGFibGVJbnRlcmNlcHRvci5KUk1QSW5pdGlhbGl6ZXJDbGFzcy5vcmcub2JqZWN0d2ViLmpvdG0uanRhLnJtaS5KVEFJbnRlcmNlcHRvckluaXRpYWxpemVyCi0KLSMgY29uZmlndXJhdGlvbiBmb3Igcm1pIGlpb3Agam5kaQotIyBqYXZhLm5hbWluZy5wcm92aWRlci51cmwgcHJvcGVydHkKLSNjYXJvbC5qbmRpLmlpb3AuamF2YS5uYW1pbmcucHJvdmlkZXIudXJsPWlpb3A6Ly9sb2NhbGhvc3Q6MTk3NTEKLQotI2Nhcm9sLmpuZGkuamF2YS5uYW1pbmcuZmFjdG9yeS51cmwucGtncz1vcmcub2JqZWN0d2ViLmNhcm9sLm5hbWluZwotI2Nhcm9sLmpuZGkuamF2YS5uYW1pbmcuZmFjdG9yeS51cmwucGtncz1vcmcub2JqZWN0d2ViLmNhcm9sLm5hbWluZzpvcmcub2JqZWN0d2ViLmNhcm9sLmpuZGkuZW5jCi0jY2Fyb2wuam5kaS5qYXZhLm5hbWluZy5mYWN0b3J5LnVybC5wa2dzPW9yZy5tb3J0YmF5LmpuZGkKLSMKLSMgQ0FST0w6IENvbW1vbiBBcmNoaXRlY3R1cmUgZm9yIFJNSSBPYmplY3RXZWIgTGF5ZXIKLSMKLSMgVGhpcyBsaWJyYXJ5IGlzIGRldmVsb3BlZCBpbnNpZGUgdGhlIE9iamVjdFdlYiBDb25zb3J0aXVtLAotIyBodHRwOi8vd3d3Lm9iamVjdHdlYi5vcmcKLSMKLSMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNwotIyBVU0EKLSMKLSMKLSMgYXV0aG9yICBHdWlsbGF1bWUgUml2aWVyZSAoR3VpbGxhdW1lLlJpdmllcmVAaW5yaWFscGVzLmZyKQotIwotIyAkSWQ6IGNhcm9sLnByb3BlcnRpZXMsdiAxLjUgMjAwNS8wMy8yMSAxNDo0NjowNyBqYW5iIEV4cCAkCi0jCi0jY2Fyb2wucm1pLmFjdGl2YXRlZD1sbWkKLQotY2Fyb2wucHJvdG9jb2xzPWxtaQotI2Nhcm9sLnByb3RvY29scz1qcm1wCi1jYXJvbC5zdGFydC5ucz1mYWxzZQotY2Fyb2wuc3RhcnQuam5kaT1mYWxzZQotY2Fyb2wuc3RhcnQucm1pPWZhbHNlCi0KLSMgSW50ZXJjZXB0b3JzIGZvciBUcmFuc2FjdGlvbnMgY29uZmlndXJhdGlvbgotIyBmb3IgaWlvcAotI2Nhcm9sLmp2bS5vcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IuT1JCSW5pdGlhbGl6ZXJDbGFzcy5vcmcub2JqZWN0d2ViLmpvdG0ub3RzLk9UU09SQkluaXRpYWxpemVyCi0KLSMgZm9yIGpybXAKLSNjYXJvbC5qdm0ub3JnLm9iamVjdHdlYi5Qb3J0YWJsZUludGVyY2VwdG9yLkpSTVBJbml0aWFsaXplckNsYXNzLm9yZy5vYmplY3R3ZWIuam90bS5qdGEucm1pLkpUQUludGVyY2VwdG9ySW5pdGlhbGl6ZXIKLQotIyBjb25maWd1cmF0aW9uIGZvciBybWkgaWlvcCBqbmRpCi0jIGphdmEubmFtaW5nLnByb3ZpZGVyLnVybCBwcm9wZXJ0eQotI2Nhcm9sLmpuZGkuaWlvcC5qYXZhLm5hbWluZy5wcm92aWRlci51cmw9aWlvcDovL2xvY2FsaG9zdDoxOTc1MQotCi0jY2Fyb2wuam5kaS5qYXZhLm5hbWluZy5mYWN0b3J5LnVybC5wa2dzPW9yZy5vYmplY3R3ZWIuY2Fyb2wubmFtaW5nCi0jY2Fyb2wuam5kaS5qYXZhLm5hbWluZy5mYWN0b3J5LnVybC5wa2dzPW9yZy5vYmplY3R3ZWIuY2Fyb2wubmFtaW5nOm9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5lbmMKLSNjYXJvbC5qbmRpLmphdmEubmFtaW5nLmZhY3RvcnkudXJsLnBrZ3M9b3JnLm1vcnRiYXkuam5kaQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvcmVzb3VyY2VzL2puZGkucHJvcGVydGllcyBiL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL3Jlc291cmNlcy9qbmRpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzQ2YmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvamV0dHkvZXh0cmEvcmVzb3VyY2VzL2puZGkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotamF2YS5uYW1pbmcuZmFjdG9yeS51cmwucGtncz1vcmcubW9ydGJheS5qbmRpCi1qYXZhLm5hbWluZy5mYWN0b3J5LnVybC5wa2dzPW9yZy5tb3J0YmF5LmpuZGkKLWphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbD1vcmcubW9ydGJheS5qbmRpLkluaXRpYWxDb250ZXh0RmFjdG9yeQotamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5tb3J0YmF5LmpuZGkuSW5pdGlhbENvbnRleHRGYWN0b3J5CmRpZmYgLS1naXQgYS90cnVuay90b29scy9qZXR0eS9leHRyYS9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODM5Y2Q1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2V4dHJhL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotCi0KLWxvZzRqLnJvb3RMb2dnZXI9SU5GTywgc3Rkb3V0LCBmaWxlCi0KLWxvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JS00ciBbJXRdICUtNXAgJWMgJXggLSAlbSVuCi0KLWxvZzRqLmFwcGVuZGVyLmZpbGU9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5maWxlLkZpbGU9JHt3ZWJhcHB9L1dFQi1JTkYvbG9ncy9qZXR0eS1sb2c0ai5sb2cKLWxvZzRqLmFwcGVuZGVyLmZpbGUuTWF4RmlsZVNpemU9MTAwS0IKLWxvZzRqLmFwcGVuZGVyLmZpbGUuTWF4QmFja3VwSW5kZXg9MAotbG9nNGouYXBwZW5kZXIuZmlsZS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5maWxlLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lcCAldCAlYyAtICVtJW4KLQotbG9nNGoucm9vdExvZ2dlcj1JTkZPLCBzdGRvdXQsIGZpbGUKLQotbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lLTRyIFsldF0gJS01cCAlYyAleCAtICVtJW4KLQotbG9nNGouYXBwZW5kZXIuZmlsZT1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLmZpbGUuRmlsZT0ke3dlYmFwcH0vV0VCLUlORi9sb2dzL2pldHR5LWxvZzRqLmxvZwotbG9nNGouYXBwZW5kZXIuZmlsZS5NYXhGaWxlU2l6ZT0xMDBLQgotbG9nNGouYXBwZW5kZXIuZmlsZS5NYXhCYWNrdXBJbmRleD0wCi1sb2c0ai5hcHBlbmRlci5maWxlLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLmZpbGUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVwICV0ICVjIC0gJW0lbgotCmRpZmYgLS1naXQgYS90cnVuay90b29scy9qZXR0eS9saWIvb3JnLm1vcnRiYXkuamV0dHktNS4xLjQuamFyIGIvdHJ1bmsvdG9vbHMvamV0dHkvbGliL29yZy5tb3J0YmF5LmpldHR5LTUuMS40LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkYTliMS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9qZXR0eS9saWIvb3JnLm1vcnRiYXkuamV0dHktNS4xLjQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvamV0dHkvbGliL29yZy5tb3J0YmF5LmpteC01LjEuNC5qYXIgYi90cnVuay90b29scy9qZXR0eS9saWIvb3JnLm1vcnRiYXkuam14LTUuMS40LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzNjJjMS4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9qZXR0eS9saWIvb3JnLm1vcnRiYXkuam14LTUuMS40LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2pldHR5L2xpYi9zZXJ2bGV0LTIuNC5qYXIgYi90cnVuay90b29scy9qZXR0eS9saWIvc2VydmxldC0yLjQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGQ3ODY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2pldHR5L2xpYi9zZXJ2bGV0LTIuNC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9saWIvYW50LWNvbnRyaWItMC42LmphciBiL3RydW5rL3Rvb2xzL2xpYi9hbnQtY29udHJpYi0wLjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjkwYjBhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL2xpYi9hbnQtY29udHJpYi0wLjYuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvbGliL2FudC1qdW5pdC5qYXIgYi90cnVuay90b29scy9saWIvYW50LWp1bml0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlNGY3Zi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9saWIvYW50LWp1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2xpYi9hbnQtbGF1bmNoZXIuamFyIGIvdHJ1bmsvdG9vbHMvbGliL2FudC1sYXVuY2hlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzE2MTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvbGliL2FudC1sYXVuY2hlci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9saWIvYW50LXRyYXguamFyIGIvdHJ1bmsvdG9vbHMvbGliL2FudC10cmF4LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlMTU0MC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9saWIvYW50LXRyYXguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvbGliL2FudC5qYXIgYi90cnVuay90b29scy9saWIvYW50LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlYjNiOC4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9saWIvYW50LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL2xvYWRlci9Mb2FkZXIkUmVwb3NpdG9yeUNsYXNzTG9hZGVyLmNsYXNzIGIvdHJ1bmsvdG9vbHMvbG9hZGVyL0xvYWRlciRSZXBvc2l0b3J5Q2xhc3NMb2FkZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTlkNDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvbG9hZGVyL0xvYWRlciRSZXBvc2l0b3J5Q2xhc3NMb2FkZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9sb2FkZXIvTG9hZGVyLmNsYXNzIGIvdHJ1bmsvdG9vbHMvbG9hZGVyL0xvYWRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmZjNlNy4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9sb2FkZXIvTG9hZGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvbWlzYy9jb3B5LXJlY3Vyc2l2ZS5zaCBiL3RydW5rL3Rvb2xzL21pc2MvY29weS1yZWN1cnNpdmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmYTQ3MDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvbWlzYy9jb3B5LXJlY3Vyc2l2ZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIERFRkFVTFQgQ09ORklHVVJBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVNPVVJDRV9ESVJFQ1RPUlk9JEhPTUUvdG1wCi0KLURFU1RJTkFUSU9OX0RJUkVDVE9SWT0kSE9NRS9iYWNrdXAKLQotQkFUQ0hfRklMRV9ESVI9YHB3ZGAKLVBVVF9CQVRDSF9GSUxFPSRCQVRDSF9GSUxFX0RJUi9zZnRwLXB1dC1iYXRjaC50eHQKLU1LRElSX0JBVENIX0ZJTEU9JEJBVENIX0ZJTEVfRElSL3NmdHAtbWtkaXItYmF0Y2gudHh0Ci0KLVVTRVJOQU1FPSRVU0VSCi0KLUhPU1ROQU1FPTEyNy4wLjAuMQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRlVOQ1RJT05TCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi10b1N0cmluZygpewotICBlY2hvICIiCi0gIGVjaG8gIklORk86IC50b1N0cmluZygpOiBTb3VyY2VEaXJlY3Rvcnk6ICRTT1VSQ0VfRElSRUNUT1JZIgotICBlY2hvICJJTkZPOiAudG9TdHJpbmcoKTogRGVzdGluYXRpb25EaXJlY3Rvcnk6ICRERVNUSU5BVElPTl9ESVJFQ1RPUlkiCi0gIGVjaG8gIklORk86IC50b1N0cmluZygpOiBCYXRjaEZpbGVEaXJlY3Rvcnk6ICRCQVRDSF9GSUxFX0RJUiIKLSAgZWNobyAiSU5GTzogLnRvU3RyaW5nKCk6IEJhdGNoRmlsZU1rZGlyOiAkTUtESVJfQkFUQ0hfRklMRSIKLSAgZWNobyAiSU5GTzogLnRvU3RyaW5nKCk6IEJhdGNoRmlsZVB1dDogJFBVVF9CQVRDSF9GSUxFIgotICBlY2hvICJJTkZPOiAudG9TdHJpbmcoKTogUmVtb3RlVXNlcm5hbWU6ICRVU0VSTkFNRSIKLSAgZWNobyAiSU5GTzogLnRvU3RyaW5nKCk6IFJlbW90ZUhvc3RuYW1lOiAkSE9TVE5BTUUiCi0gIGVjaG8gIiIKLSAgZWNobyAiIgotICBlY2hvICIiCi0gIGVjaG8gIiIKLSAgfQotCi1icm93c2VEaXJlY3RvcnkoKXsKLSAgQ1VSUkVOVF9ESVJFQ1RPUlk9JDEKLSAgU09VUkNFX0RJUj0kMgotICBERVNUX0RJUj0kMwotICAjI2VjaG8gIkRFQlVHOiBCcm93c2luZyBEaXJlY3Rvcnk6ICRDVVJSRU5UX0RJUkVDVE9SWSIKLQotICBGSUxFU19BTkRfRElSUz1gbHMgJENVUlJFTlRfRElSRUNUT1JZYAotICBOVU1CRVJfT0ZfRklMRVNfQU5EX0RJUlM9YGxzICRDVVJSRU5UX0RJUkVDVE9SWSB8IHdjIC1sYAotCi0gICMjZWNobyAiREVCVUc6IE51bWJlciBvZiBmaWxlcyBhbmQgZGlyczogJE5VTUJFUl9PRl9GSUxFU19BTkRfRElSUyIKLSAgaWYgWyAkTlVNQkVSX09GX0ZJTEVTX0FORF9ESVJTID0gMCBdO3RoZW4KLSAgICAjI2VjaG8gIkRFQlVHOiBObyBGaWxlcyBvciBEaXJzIHdpdGhpbiBkaXJlY3RvcnkiCi0gICAgcmV0dXJuCi0gIGZpCi0KLSAgZm9yIEZJTEVfT1JfRElSIGluICRGSUxFU19BTkRfRElSUzsgZG8KLSAgICAjI2VjaG8gIkRFQlVHOiBGaWxlIG9yIERpcjogJEZJTEVfT1JfRElSIgotICAgIGlmIFsgLWQgJENVUlJFTlRfRElSRUNUT1JZLyRGSUxFX09SX0RJUiBdOyB0aGVuCi0gICAgICBlY2hvICJJTkZPOiAuYnJvd3NlRGlyZWN0b3J5KCk6IERpcmVjdG9yeTogJENVUlJFTlRfRElSRUNUT1JZLyRGSUxFX09SX0RJUiIKLQotICAgICAgY3JlYXRlRGlyZWN0b3J5ICRTT1VSQ0VfRElSICRERVNUX0RJUiAkQ1VSUkVOVF9ESVJFQ1RPUlkvJEZJTEVfT1JfRElSCi0KLSAgICAgIGJyb3dzZURpcmVjdG9yeSAkQ1VSUkVOVF9ESVJFQ1RPUlkvJEZJTEVfT1JfRElSICRTT1VSQ0VfRElSICRERVNUX0RJUgotICAgICAgQ1VSUkVOVF9ESVJFQ1RPUlk9YGRpcm5hbWUgJENVUlJFTlRfRElSRUNUT1JZYAotICAgIGVsc2UKLSAgICAgIGlmIFsgLWYgJENVUlJFTlRfRElSRUNUT1JZLyRGSUxFX09SX0RJUiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIklORk86IC5icm93c2VEaXJlY3RvcnkoKTogRmlsZTogJENVUlJFTlRfRElSRUNUT1JZLyRGSUxFX09SX0RJUiIKLQotICAgICAgICBjb3B5RmlsZSAkU09VUkNFX0RJUiAkREVTVF9ESVIgJENVUlJFTlRfRElSRUNUT1JZLyRGSUxFX09SX0RJUgotICAgICAgZWxzZQotICAgICAgIGVjaG8gIkV4Y2VwdGlvbjogTmVpdGhlciBGaWxlIG5vciBEaXJlY3Rvcnk6ICRDVVJSRU5UX0RJUkVDVE9SWS8kRklMRV9PUl9ESVIiCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgfQotCi1jcmVhdGVEaXJlY3RvcnkoKXsKLSAgU09VUkNFX0RJUj0kMQotICBERVNUX0RJUj0kMgotICBMRElSRUNUT1JZPSQzCi0KLSAgZWNobyAiSU5GTzogLmNyZWF0ZURpcmVjdG9yeSgpOiAkTERJUkVDVE9SWSIKLSAgI2VjaG8gIklORk86IC5jcmVhdGVEaXJlY3RvcnkoKTogJFNPVVJDRV9ESVIiCi0gICNlY2hvICJJTkZPOiAuY3JlYXRlRGlyZWN0b3J5KCk6ICRERVNUX0RJUiIKLQotICBMUEFSRU5UPWBkaXJuYW1lICRMRElSRUNUT1JZYAotICBOQU1FPWBiYXNlbmFtZSAkTERJUkVDVE9SWWAKLSAgUkVMQVRJVkVfRElSPWBlY2hvICRMRElSRUNUT1JZIHwgc2VkIC1lICJzJSRTT1VSQ0VfRElSJSVnImAKLSAgZWNobyAiREVCVUc6IC5jb3B5RmlsZSgpOiBSZWxhdGl2ZSBEaXJlY3Rvcnk6ICRSRUxBVElWRV9ESVIiCi0gIERQQVJFTlQ9YGRpcm5hbWUgJERFU1RfRElSJFJFTEFUSVZFX0RJUmAKLQotCi0gICNlY2hvICJJTkZPOiAuY3JlYXRlRGlyZWN0b3J5KCk6IGxjZCAkTFBBUkVOVCIKLSAgI2VjaG8gIklORk86IC5jcmVhdGVEaXJlY3RvcnkoKTogY2QgJERQQVJFTlQiCi0gICNlY2hvICJJTkZPOiAuY3JlYXRlRGlyZWN0b3J5KCk6IG1rZGlyICROQU1FIgotICBlY2hvICIiCi0KLSAgZWNobyAicHdkIiA+ICRNS0RJUl9CQVRDSF9GSUxFCi0gIGVjaG8gImxjZCAkTFBBUkVOVCIgPj4gJE1LRElSX0JBVENIX0ZJTEUKLSAgZWNobyAiY2QgJERQQVJFTlQiID4+ICRNS0RJUl9CQVRDSF9GSUxFCi0gIGVjaG8gIm1rZGlyICROQU1FIiA+PiAkTUtESVJfQkFUQ0hfRklMRQotICBlY2hvICJxdWl0IiA+PiAkTUtESVJfQkFUQ0hfRklMRQotCi0gIHNmdHAgLWIgJE1LRElSX0JBVENIX0ZJTEUgJFVTRVJOQU1FQCRIT1NUTkFNRQotICAjI3JtICRNS0RJUl9CQVRDSF9GSUxFCi0gIH0KLQotY29weUZpbGUoKXsKLSAgU09VUkNFX0RJUj0kMQotICBERVNUX0RJUj0kMgotICBMRklMRT0kMwotCi0gIGVjaG8gIklORk86IC5jb3B5RmlsZSgpOiAkTEZJTEUiCi0gICNlY2hvICJJTkZPOiAuY29weUZpbGUoKTogJFNPVVJDRV9ESVIiCi0gICNlY2hvICJJTkZPOiAuY29weUZpbGUoKTogJERFU1RfRElSIgotCi0gIFJFTEFUSVZFX0ZJTEU9YGVjaG8gJExGSUxFIHwgc2VkIC1lICJzJSRTT1VSQ0VfRElSJSVnImAKLSAgZWNobyAiREVCVUc6IC5jb3B5RmlsZSgpOiBSZWxhdGl2ZSBGaWxlOiAkUkVMQVRJVkVfRklMRSIKLSAgREZJTEU9JERFU1RfRElSJFJFTEFUSVZFX0ZJTEUKLSAgTFBBUkVOVD1gZGlybmFtZSAkTEZJTEVgCi0gIERQQVJFTlQ9YGRpcm5hbWUgJERGSUxFYAotICBOQU1FPWBiYXNlbmFtZSAkTEZJTEVgCi0KLSAgI2VjaG8gIklORk86IC5jb3B5RmlsZSgpOiBsY2QgJExQQVJFTlQiCi0gICNlY2hvICJJTkZPOiAuY29weUZpbGUoKTogY2QgJERQQVJFTlQiCi0gICNlY2hvICJJTkZPOiAuY29weUZpbGUoKTogcHV0ICROQU1FIgotICBlY2hvICIiCi0KLSAgZWNobyAibGNkICRMUEFSRU5UIiA+PiAkUFVUX0JBVENIX0ZJTEUKLSAgZWNobyAiY2QgJERQQVJFTlQiID4+ICRQVVRfQkFUQ0hfRklMRQotICBlY2hvICJwdXQgJE5BTUUiID4+ICRQVVRfQkFUQ0hfRklMRQotICB9Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE1BSU4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10b1N0cmluZwotCi1TT1VSQ0VfRElSRUNUT1JZPSQxCi1ERVNUSU5BVElPTl9ESVJFQ1RPUlk9JDIKLUJBVENIX0ZJTEVfRElSPSQzCi1VU0VSTkFNRT0kNAotSE9TVE5BTUU9JDUKLWlmICEgKFsgJFNPVVJDRV9ESVJFQ1RPUlkgXSAmJiBbICRERVNUSU5BVElPTl9ESVJFQ1RPUlkgXSAmJiBbICRCQVRDSF9GSUxFX0RJUiBdICYmIFsgJFVTRVJOQU1FIF0gJiYgWyAkSE9TVE5BTUUgXSk7dGhlbgotICBlY2hvICJVc2FnZTogY29weS1yZWN1cnNpdmUuc2ggXCJTb3VyY2VEaXJlY3RvcnkgRGVzdGluYXRpb25EaXJlY3RvcnkgQmF0Y2hGaWxlRGlyZWN0b3J5IFJlbW90ZVVzZXJuYW1lIFJlbW90ZUhvc3RuYW1lXCIiCi0gIGV4aXQgMAotZmkKLQotUFVUX0JBVENIX0ZJTEU9JEJBVENIX0ZJTEVfRElSL3NmdHAtYmF0Y2gtcHV0LnR4dAotTUtESVJfQkFUQ0hfRklMRT0kQkFUQ0hfRklMRV9ESVIvc2Z0cC1ta2Rpci1iYXRjaC50eHQKLVBVVF9CQVRDSF9GSUxFPSRCQVRDSF9GSUxFX0RJUi9zZnRwLXB1dC1iYXRjaC50eHQKLQotdG9TdHJpbmcKLQotI2V4aXQgMAotCi1lY2hvICJwd2QiID4gJFBVVF9CQVRDSF9GSUxFCi1DVVJSRU5UX0RJUkVDVE9SWT0kU09VUkNFX0RJUkVDVE9SWQotYnJvd3NlRGlyZWN0b3J5ICRDVVJSRU5UX0RJUkVDVE9SWSAkU09VUkNFX0RJUkVDVE9SWSAkREVTVElOQVRJT05fRElSRUNUT1JZCi1lY2hvICJxdWl0IiA+PiAkUFVUX0JBVENIX0ZJTEUKLQotc2Z0cCAtYiAkUFVUX0JBVENIX0ZJTEUgJFVTRVJOQU1FQCRIT1NUTkFNRQotIyNybSAkUFVUX0JBVENIX0ZJTEUKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL21pc2MvcmVwbGljYXRlLnNoIGIvdHJ1bmsvdG9vbHMvbWlzYy9yZXBsaWNhdGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2NmJhM2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvbWlzYy9yZXBsaWNhdGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgICAgICAgIEdFTkVSQUwgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotCi1pZiBbICIkVE9NQ0FUX0hPTUUiID0gIiIgXSA7IHRoZW4KLSAgZWNobyBZb3UgbXVzdCBzZXQgVE9NQ0FUX0hPTUUgdG8gcG9pbnQgYXQgeW91ciBUb21jYXQgaW5zdGFsbGF0aW9uCi0gIGV4aXQgMQotZmkKLQotQ09OVEVYVD0kVE9NQ0FUX0hPTUUvd2ViYXBwcy9sZW55YQotUFVCTElDQVRJT05fRElSPSRDT05URVhUL2xlbnlhL3B1YnMKLQotU0ZUUF9CQVRDSD0kQ09OVEVYVC9sZW55YS9iaW4vY29weS1yZWN1cnNpdmUuc2gKLQotCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgUFVCTElDQVRJT04gQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0KLQotUFVCTElDQVRJT05fSURfMj1kZWZhdWx0Ci1FWFBPUlRfRElSXzI9JFBVQkxJQ0FUSU9OX0RJUi9kZWZhdWx0L3Jlc291cmNlcy9leHBvcnQKLVBFTkRJTkdfRElSXzI9JEVYUE9SVF9ESVJfMi9wZW5kaW5nL2xlbnlhL2RlZmF1bHQKLVJFUExJQ0FUSU9OX0RJUl8yPSRFWFBPUlRfRElSXzIvcmVwbGljYXRpb24KLVJVXzJfMT11c2VybmFtZQotUkhfMl8xPTEyNy4wLjAuMQotUkRPQ1NfMl8xPS91c3IvbG9jYWwvamFrYXJ0YS10b21jYXQtNC4wLjQtYjMvd2ViYXBwcy9ST09UCi1SVV8yXzI9dXNlcm5hbWUKLVJIXzJfMj0xMjcuMC4wLjEKLVJET0NTXzJfMj0vdXNyL2xvY2FsL2FwYWNoZS9odGRvY3NfZGVmYXVsdAotCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgICAgICAgICBNQUlOICAgICAgICAgICAgICAgICAgICAgIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1lY2hvICJTVEFSVCIKLWRhdGUKLQotIyBMb29wIG92ZXIgYWxsIHB1YmxpY2F0aW9ucyAoQkVHSU4pCi0KLQotCi0jIyMjIFBVQkxJQ0FUSU9OIDIKLQotZWNobyAiIgotZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCi1lY2hvICI9IFBVQkxJQ0FUSU9OOiAkUFVCTElDQVRJT05fSURfMiIKLWVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgotZWNobyAiIgotCi1ta2RpciAkUkVQTElDQVRJT05fRElSXzIKLQotaWYgWyAtZCAkUkVQTElDQVRJT05fRElSXzIgXTt0aGVuCi0gIGVjaG8gIkRFQlVHOiBSZXBsaWNhdGlvbiBEaXJlY3Rvcnk6ICRSRVBMSUNBVElPTl9ESVJfMiIKLQotICBQUk9DRVNTX0lEPSQkCi0gIERBVFVNPWBkYXRlICslWS4lbS4lZF8lSC4lTS4lU2AKLSAgVEVNUF9JRD0kREFUVU1cXyRQUk9DRVNTX0lECi0KLSAgVEVNUF9ESVI9JFJFUExJQ0FUSU9OX0RJUl8yL3RlbXBcXyRURU1QX0lECi0gIG1rZGlyIC1wICRURU1QX0RJUgotICBlY2hvICJERUJVRzogVGVtcG9yYXJ5IERpcmVjdG9yeTogJFRFTVBfRElSIgotCi0gIGlmIFsgLWQgJFBFTkRJTkdfRElSXzIgXTt0aGVuCi0gICAgZWNobyAiREVCVUc6IFBlbmRpbmcgRGlyZWN0b3J5OiAkUEVORElOR19ESVJfMiIKLQotICAgIGlmIFsgLWQgJFBFTkRJTkdfRElSXzIgXTt0aGVuCi0gICAgICBtdiAkUEVORElOR19ESVJfMi8qICRURU1QX0RJUi8uCi0gICAgZmkKLQotICAgIGlmIFsgLWQgJFRFTVBfRElSIF07dGhlbgotICAgICAgc2NwIC1yICRURU1QX0RJUi8qICRSVV8yXzFAJFJIXzJfMTokUkRPQ1NfMl8xLy4KLSAgICBmaQotICAgIGlmIFsgLWQgJFRFTVBfRElSIF07dGhlbgotICAgICAgc2NwIC1yICRURU1QX0RJUi8qICRSVV8yXzJAJFJIXzJfMjokUkRPQ1NfMl8yLy4KLSAgICBmaQotCi0KLSAgZWxzZQotICAgIGVjaG8gIldBUk46IE5vIHN1Y2ggZGlyZWN0b3J5OiAkUEVORElOR19ESVJfMiIKLSAgZmkKLSAgcm0gLXIgJFRFTVBfRElSCi1lbHNlCi0gIGVjaG8gIkZBVEFMOiBObyBzdWNoIGRpcmVjdG9yeTogJFJFUExJQ0FUSU9OX0RJUl8yIgotICAjZXhpdCAwCi1maQotCi0jIExvb3Agb3ZlciBhbGwgcHVibGljYXRpb25zIChFTkQpCi0KLWRhdGUKLWVjaG8gIlNUT1AiCmRpZmYgLS1naXQgYS90cnVuay90b29scy9taXNjL3NmdHAtY29weS1jaGlsZHJlbi50eHQgYi90cnVuay90b29scy9taXNjL3NmdHAtY29weS1jaGlsZHJlbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzVjM2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdG9vbHMvbWlzYy9zZnRwLWNvcHktY2hpbGRyZW4udHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1jZCBwdWJsaWNfaHRtbC9jaGlsZHJlbgotbGNkIH4vaHRkb2NzL2NoaWxkcmVuCi1sbHMgLVIKLW1wdXQgKgotcXVpdApkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvbWlzYy9zZnRwLWNvcHktaW5kZXgudHh0IGIvdHJ1bmsvdG9vbHMvbWlzYy9zZnRwLWNvcHktaW5kZXgudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGZjNWZiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL21pc2Mvc2Z0cC1jb3B5LWluZGV4LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotY2QgcHVibGljX2h0bWwKLWxzCi1sY2Qgfi9odGRvY3MKLWxscyAtUgotcHV0IGluZGV4Lmh0bWwKLXF1aXQKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL21pc2Mvc2Z0cC1ta2Rpci1jaGlsZHJlbi50eHQgYi90cnVuay90b29scy9taXNjL3NmdHAtbWtkaXItY2hpbGRyZW4udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQyZTkwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL21pc2Mvc2Z0cC1ta2Rpci1jaGlsZHJlbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWNkIHB1YmxpY19odG1sCi1scwotbWtkaXIgY2hpbGRyZW4KLWNkIGNoaWxkcmVuCi1scwotcXVpdApkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvbWlzYy9zZnRwLnNoIGIvdHJ1bmsvdG9vbHMvbWlzYy9zZnRwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZjM4YjQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL21pc2Mvc2Z0cC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMhL2Jpbi9rc2ggLXAKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLUJBVENIX0ZJTEU9JDEKLWlmICEgWyAkQkFUQ0hfRklMRSBdO3RoZW4KLSAgZWNobyAiVXNhZ2U6IHNmdHAuc2ggXCJiYXRjaC1maWxlLnR4dFwiIgotICBleGl0IDAKLWZpCi0KLWVjaG8gIklORk86IEJhdGNoIEZpbGU6ICRCQVRDSF9GSUxFIgotCi1zZnRwIC1iICQxIHVzZXJAaG9zdC5jb20KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL21pc2MvdG9tY2F0Y3RybCBiL3RydW5rL3Rvb2xzL21pc2MvdG9tY2F0Y3RybApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiODQ5Yi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9taXNjL3RvbWNhdGN0cmwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgU3RhcnQvc3RvcCBzY3JpcHQgZm9yIHRvbWNhdCBsb2NhdGVkIGF0IC9ldGMvaW5pdC5kCi0jCi0jIEF1dGhvcjogQ2hyaXN0aWFuIEVnbGkgPGNocmlzdGlhbi5lZ2xpQHd5b25hLmNvbT4uCi0jIEF1dGhvcjogTWljaGFlbCBXZWNobmVyIDxtaWNoYWVsLndlY2huZXJAd3lvbmEuY29tPi4KLSMKLSMgfHx8fHx8fHx8fHx8fHx8fHx8fHwgU1RBUlQgQ09ORklHVVJBVElPTiBTRUNUSU9OICB8fHx8fHx8fHx8fHx8fHx8fHx8fAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSGFzIHRvIGJlIGRlZmluZWQgZm9yIHRvbWNhdAotVVNFUj0idXNlcm5hbWUiCi0KLSMgSGFzIHRvIGJlIGRlZmluZWQgZm9yIHRvbWNhdAotSkFWQV9IT01FPSIvdXNyL2xvY2FsL2oyc2RrMS40LjFfMDIiCi0KLSMgVGhlIGJpbiBkaXJlY3RvcmllcyBvZiBhbGwgdGhlIHNlcnZlcnMKLURBRU1PTlM9Ii91c3IvbG9jYWwvamFrYXJ0YS10b21jYXQtNC4xLjIxLUxFLWpkazE0L2JpbiIKLQotIyB3aGVyZSB5b3UgY2FuIGFsc28gc2V0IG1vcmUgdGhhbiBvbmUgc2VydmVyLCBlLmcuCi0jREFFTU9OUz0iL3Vzci9sb2NhbC9qYWthcnRhLXRvbWNhdC00LjEuMjEtTEUtamRrMTQvYmluIC9ob21lL3VzZXJuYW1lL2J1aWxkL2pha2FydGEtdG9tY2F0LTQuMS4yMS1MRS1qZGsxNC9iaW4iCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgfHx8fHx8fHx8fHx8fHx8fHx8fHwgICBFTkQgQ09ORklHVVJBVElPTiBTRUNUSU9OICB8fHx8fHx8fHx8fHx8fHx8fHx8fAotCi1OQU1FPSQwCi1ERVNDPSJUb21jYXQgaW4gdmlydHVhbCBob3N0cyIKLQotCi0KLWNhc2UgIiQxIiBpbgotICBzdGFydCkKLQllY2hvICJTdGFydGluZyAkREVTQzogJE5BTUUiCi0JZm9yIGRhZW1vbiBpbiAkREFFTU9OUzsgZG8gCi0JICAgIGVjaG8gIlN0YXJ0aW5nICRkYWVtb24vc3RhcnR1cC5zaCIKLQkgICAgc3UgLSAkVVNFUiAtYyAiZXhwb3J0IEpBVkFfSE9NRT0kSkFWQV9IT01FOyBzaCAkZGFlbW9uL3N0YXJ0dXAuc2giCi0JZG9uZTsKLQk7OwotICBzdG9wKQotCWVjaG8gIlN0b3BwaW5nICRERVNDOiAkTkFNRSAiCi0JZm9yIGRhZW1vbiBpbiAkREFFTU9OUzsgZG8gCi0JICAgIGVjaG8gIlN0b3BwaW5nICRkYWVtb24vc2h1dGRvd24uc2giCi0JICAgIHN1IC0gJFVTRVIgLWMgImV4cG9ydCBKQVZBX0hPTUU9JEpBVkFfSE9NRTsgc2ggJGRhZW1vbi9zaHV0ZG93bi5zaCIKLQlkb25lOwotCTs7Ci0gIHJlc3RhcnR8Zm9yY2UtcmVsb2FkKQotICAgICAgICAjIEZJWE1FOiBUb21jYXQgZG9lcyBub3Qgc2h1dGRvd24gcHJvcGVybHkKLQkjCi0JIwlJZiB0aGUgInJlbG9hZCIgb3B0aW9uIGlzIGltcGxlbWVudGVkLCBtb3ZlIHRoZSAiZm9yY2UtcmVsb2FkIgotCSMJb3B0aW9uIHRvIHRoZSAicmVsb2FkIiBlbnRyeSBhYm92ZS4gSWYgbm90LCAiZm9yY2UtcmVsb2FkIiBpcwotCSMJanVzdCB0aGUgc2FtZSBhcyAicmVzdGFydCIuCi0JIwotCWVjaG8gIkZJWE1FIgotCSNlY2hvICJSZXN0YXJ0aW5nICRERVNDOiAkTkFNRSIKLQkjZm9yIGRhZW1vbiBpbiAkREFFTU9OUzsgZG8gCi0JIyAgICBlY2hvICJTdG9wcGluZyAkZGFlbW9uL3NodXRkb3duLnNoIgotCSMgICAgZXZhbCAkZGFlbW9uL3NodXRkb3duLnNoCi0JI2RvbmU7Ci0gICAgICAgICMKLQkjc2xlZXAgMTAKLQkjZm9yIGRhZW1vbiBpbiAkREFFTU9OUzsgZG8gCi0JIyAgICBlY2hvICJTdGFydGluZyAkZGFlbW9uL3N0YXJ0dXAuc2giCi0JIyAgICBldmFsICRkYWVtb24vc3RhcnR1cC5zaAotCSNkb25lOwotCSMKLQk7OwotICAqKQotCSNlY2hvICJVc2FnZTogJE5BTUUge3N0YXJ0fHN0b3B8cmVzdGFydHxmb3JjZS1yZWxvYWR9IiA+JjIKLQllY2hvICJVc2FnZTogJE5BTUUge3N0YXJ0fHN0b3B9IiA+JjIKLQlleGl0IDEKLQk7OwotZXNhYwotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9SRUFETUUgYi90cnVuay90b29scy9wcm94eXRlc3QvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzUxMWFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotSG93IHRvIHVzZSBKZXR0eSA2Lnggd2l0aCBMZW55YQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3Ugd2FudCB0byBwbGF5IHdpdGggTGVueWEgaW4gSmV0dHkgNi4xLjYsIHBsZWFzZSB0YWtlIGEgbG9vayBhdCBqZXR0eTYueG1sCi1hbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGNvbW1lbnQgaGVhZGVyLiBJbiBhIG51dHNoZWxsOgotCi0gICRMRU5ZQV9IT01FOj4gd2dldCBodHRwOi8vZGlzdC5jb2RlaGF1cy5vcmcvamV0dHkvamV0dHktNi4xLjYvamV0dHktNi4xLjZyYzAuemlwCi0gICRMRU5ZQV9IT01FOj4gY2QgdG9vbHMvCi0gICRMRU5ZQV9IT01FL3Rvb2xzOj4gdW56aXAgLi4vamV0dHktNi4xLjZyYzAuemlwCi0gICRMRU5ZQV9IT01FL3Rvb2xzOj4gY2QgamV0dHktNi4xLjYKLSAgJExFTllBX0hPTUUvdG9vbHMvamV0dHktNi4xLjY6PiBqYXZhIFwKLSAgICAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIuLi8uLi9leHRlcm5hbHMvY29jb29uXzJfMV94L2xpYi9lbmRvcnNlZC8iIFwKLSAgICAgICAgIC1qYXIgc3RhcnQuamFyIC4uL3Byb3h5dGVzdC9qZXR0eTYueG1sCi0KLUl0IHdvdWxkIGJlIG5pY2UgdG8gdXBncmFkZSBvdXIgaW5jbHVkZWQgSmV0dHkgdG8gNi54IHJlYWwgc29vbiBub3csIHNpbmNlCi10aGUgY3VycmVudCB2ZXJzaW9uIGhhcyBhIGJyb2tlbiBBSlAgY29ubmVjdG9yIHRoYXQgbWFrZXMgZWZmZWN0aXZlIHByb3h5Ci10ZXN0aW5nIGltcG9zc2libGUgKGl0IGJhc2ljYWxseSBtZWFucyB5b3UgaGF2ZSB0byBpbnN0YWxsIFRvbWNhdCkuCi0KLU5vdGUgdGhhdCB0ZXN0LWRyaXZpbmcgSmV0dHkgNi4xLjYgaXMgb3J0aG9nb25hbCB0byBwcm94eSB0ZXN0aW5nOyB0aGUgc2VydmVyIAotY29uZmlndXJhdGlvbiBpbmNsdWRlcyBib3RoIGFqcDovL2xvY2FsaG9zdDo4MDA5IGFuZCBodHRwOi8vbG9jYWxob3N0Ojg4ODgsIAotc28geW91IGNhbiBqdXN0IGRyb3AgaXQgaW4sIHJlcGxhY2luZyB0aGUgb2xkIHZlcnNpb24sIHdpdGhvdXQgYm90aGVyaW5nIGFib3V0IHRoZQotcHJveHkgc3R1ZmYuIAotCi1QbGVhc2UgZm9sbG93IHVwIG9uIGJ1ZwotICAgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MzcyOSAKLXdpdGggc3VjY2VzcyBhbmQgcHJvYmxlbSByZXBvcnRzLgotCi0KLQotSG93IHRvIGJ1aWxkIGEgcHJveHkgdGVzdCBzY2FmZm9sZAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgcHJveHkgZXhhbXBsZSBzZXR0aW5nIHNpbXVsYXRlcyB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKLQotKiBBIGN1c3RvbWVyIHdhbnRzIGEgY29tcGFueSBob3N0bmFtZSBhbmQgVVJMcyB3aXRob3V0IExlbnlhLXNwZWNpZmljCi0gIHBhdGggY29tcG9uZW50cyBmb3IgdGhlIGxpdmUgc2l0ZS4KLQotKiBUaGUgc2VydmVyIHVzZXMgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3Rpbmcgd2l0aCBqdXN0IG9uZSBJUCwgaS5lLgotICB0aGVyZSBjYW4gb25seSBiZSBvbmUgU1NMIHZob3N0LCB3aGljaCBpcyBzaGFyZWQgYW1vbmcgc2V2ZXJhbAotICBjdXN0b21lcnMuIFRoaXMgaW1wbGllcyB0aGUgbmVlZCBmb3Igc3ViLWRpcmVjdG9yaWVzIGluIHRoZSBwcm94eQotICBVUkwuCi0KLSogImF1dGhvcmluZyIgc2hvdWxkIGJlIHNzbC1wcm90ZWN0ZWQuIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEKLSAgY3VzdG9tZXIgaG9zdG5hbWUgaGVyZSwgc2luY2UgaXQncyBub3QgcHVibGljbHkgdmlzaWJsZS4KLQotKiBBbnkgU1NMLXByb3RlY3RlZCBkb2N1bWVudHMgaW4gImxpdmUiIGNhbiBiZSBoYW5kbGVkIGJ5IHRoZSBTU0wKLSAgdmhvc3QgKG5vdCB1c2luZyB0aGUgY29tcGFueSBob3N0bmFtZSBpcyBvayBpbiB0aGlzIGNhc2UpLgotCi1UaGUgZGVzaXJlZCBjdXN0b21lciBob3N0bmFtZSBpcyBjdXN0b21lci5leGFtcGxlLmNvbSwgdGhlIGxpdmUgc2l0ZSB3aWxsIGJlCi1hdmFpbGFibGUgYXMgaHR0cDovL2N1c3RvbWVyLmV4YW1wbGUuY29tLgotCi1UaGUgU1NMIHZob3N0IGlzIGNhbGxlZCB3d3cuZXhhbXBsZS5jb20uCi0KLVRoZSBMZW55YSBDTVMgZm9yIG91ciBjdXN0b21lciBpcyByZWFjaGFibGUgYXMKLWh0dHBbc106Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvYXV0aG9yaW5nLy4KLQotVGhlIGdsb2JhbCBwcm94eSBmb3Igbm9uLXB1YmxpY2F0aW9uLXNwZWNpZmljIHJlc291cmNlcyBzaGFsbCBiZQotaHR0cDovL3d3dy5leGFtcGxlLmNvbS9sZW55YS8uCi0KLQotCi1GSVhNRTogVGhlIGluc3RydWN0aW9ucyBiZWxvdyBhcmUgY3VycmVudGx5IExpbnV4LXNwZWNpZmljLiAKLVBsZWFzZSBjb250cmlidXRlIFdpbmRvd3MgYW5kIE1hY09TIGluc3RydWN0aW9ucyEKLQotCi0KLUZpcnN0IG9mIGFsbCwgc3RhcnQgSmV0dHk2IGFzIGRlc2NyaWJlZCBhYm92ZS4KLU5leHQgZ2V0IGFuIEFwYWNoZSBodHRwZCBzZXJ2ZXIgMi4yLnggb3IgbGF0ZXIgaW5zdGFsbGVkICh5b3VyIGRpc3RybydzIAotcGFja2FnZXMgc2hvdWxkIGJlIGZpbmUpLiBUaGVuIGFwcGx5IHRoZSBmb2xsb3dpbmcgdHdlYWtzOgotCi0xLiBJbnN0YWxsIHRoZSBib2d1cyBTU0wga2V5czoKLQotICAgICAgJExFTllBX0hPTUUvdG9vbHMvcHJveHl0ZXN0Oj4gY3AgKi5wZW0gL3RtcCAKLQotICAgKHllcywgL3RtcC4gaXQncyBqdXN0IGZvciB0ZXN0aW5nLCBubyBuZWVkIHRvIGNsdXR0ZXIgdXAgeW91ciBhcGFjaGUgc3NsIAotICAgZGlyZWN0b3J5KQotCi0yLiBDb25maWd1cmUgc29tZSB2aXJ0dWFsIGhvc3RzIGluIHlvdXIgQXBhY2hlIEhUVFBEIHNlcnZlcjoKLSAgIExvY2F0ZSBhbiBhY3RpdmUgY29uZmlndXJhdGlvbiBmaWxlIChkaXN0cmlidXRpb24tZGVwZW5kZW50KSwgYW5kIGFkZCB0aGUgbGluZQotCi0gICAgICAiSW5jbHVkZSAkTEVOWUFfSE9NRS90b29scy9wcm94eXRlc3QvYXBhY2hlX3Zob3N0cy5jb25mIgotCi0gICB0byBpdC4KLQotMy4gQXBwZW5kIHNvbWUgZmFrZSBob3N0IGVudHJpZXMgdG8geW91ciBsb2NhbCByZXNvbHZlcjoKLQotICAgICAgJExFTllBX0hPTUUvdG9vbHMvcHJveHl0ZXN0Oj4gY2F0IGhvc3RzX2Zha2UgPj4gL2V0Yy9ob3N0cwotCi00LiBNYWtlIHN1cmUgYXBhY2hlMiBpcyBjb25maWd1cmVkIHRvIHJ1biBTU0wgYnkgcGFzc2luZyBpdCB0aGUgLURTU0wgZmxhZy4KLSAgIFRoZSBiZXN0IHdheSB0byBkbyBpdCBkZXBlbmRzIG9uIHlvdXIgZGlzdHJpYnV0aW9uLiBJZiBpbiBkb3VidCwgb21pdCBTU0wKLSAgIGZvciBub3cgYW5kIHRyeSB0byBhZGQgaXQgbGF0ZXIuCi0KLTUuIFJlc3RhcnQgYXBhY2hlMjoKLQotICAgICAgJExFTllBX0hPTUU6PiAvZXRjL2luaXQuZC9hcGFjaGUyIHJlc3RhcnQKLQotNi4gVW5jb21tZW50IHRoZSBwcm94eSBzZXR0aW5ncyBpbiB0aGUgZGVmYXVsdCBwdWJsaWNhdGlvbiBjb25maWcKLSAgIChzcmMvcHVicy9kZWZhdWx0L2NvbmZpZy9wdWJsaWNhdGlvbi54bWwpIGFuZCB0aGUgZ2xvYmFsIHByb3h5IHNldHRpbmdzCi0gICAoc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2NvbmZpZy9jb2Nvb24teGNvbmYvZ2xvYmFsLXByb3hpZXMueGNvbmYpLgotICAgWW91IGNhbiB1c2UgdGhlIHBhdGNoIHByb3ZpZGVkIGluIHRoaXMgZGlyZWN0b3J5OgotCi0gICAgICAkTEVOWUFfSE9NRTo+IHBhdGNoIC1wMCA8IHRvb2xzL3Byb3h5dGVzdC9hY3RpdmF0ZV9wcm94eS5kaWZmCi0KLTcuIEJ1aWxkIExlbnlhOgotCi0gICAgICAkTEVOWUFfSE9NRTo+IC4vYnVpbGQuc2ggY2xlYW4gJiYgLi9idWlsZC5zaAotCi04LiBTdXJmIHRvIGh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC93ZWJhcHAgdG8gY2hlY2sgd2hhdCB0aGUgcHJveHkgZG9lcyAobG9vawotICAgYXQgdGhlIHBhZ2Ugc291cmNlIGZyZXF1ZW50bHkpLiBUaGVuIHRyeQotICAgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9sZW55YS9kZWZhdWx0L2F1dGhvcmluZy8gKGF1dGhvcmluZykgYW5kIAotICAgaHR0cDovL2N1c3RvbWVyLmV4YW1wbGUuY29tIChsaXZlKS4KLQotOS4gV2F0Y2ggdGhlIGxvZ3MgaW4gL3RtcC9MZW55YVRlc3RfKi4KLQotVGhpcyBzaG91bGQgZ2l2ZSB5b3UgYSB3b3JraW5nIHByb3h5IHNldHVwLgotCmRpZmYgLS1naXQgYS90cnVuay90b29scy9wcm94eXRlc3QvYWN0aXZhdGVfcHJveHkuZGlmZiBiL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9hY3RpdmF0ZV9wcm94eS5kaWZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjk2YzdiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9hY3RpdmF0ZV9wcm94eS5kaWZmCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotSW5kZXg6IHNyYy9wdWJzL2RlZmF1bHQvY29uZmlnL3B1YmxpY2F0aW9uLnhtbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIHNyYy9wdWJzL2RlZmF1bHQvY29uZmlnL3B1YmxpY2F0aW9uLnhtbAkocmV2aXNpb24gNTk0NjQ0KQotKysrIHNyYy9wdWJzL2RlZmF1bHQvY29uZmlnL3B1YmxpY2F0aW9uLnhtbAkod29ya2luZyBjb3B5KQotQEAgLTEyOCw3ICsxMjgsNyBAQAotICAgICAgICBUaGUgZ2xvYmFsIHByb3h5IGZvciBub24tcHVibGljYXRpb24tc3BlY2lmaWMgcmVzb3VyY2VzIHNoYWxsIGJlCi0gICAgICAgIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEuCi0gICAgICAtLT4KLS08IS0tCi0rCi0gICAgIDxwcm94eSBhcmVhPSJsaXZlIiBzc2w9InRydWUiIHVybD0iaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvbGl2ZSIvPgotICAgICA8cHJveHkgYXJlYT0ibGl2ZSIgc3NsPSJmYWxzZSIgdXJsPSJodHRwOi8vY3VzdG9tZXIuZXhhbXBsZS5jb20iLz4KLSAgICAgPHByb3h5IGFyZWE9ImF1dGhvcmluZyIgc3NsPSJ0cnVlIiB1cmw9Imh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhL2N1c3RvbWVyL2F1dGhvcmluZyIvPgotQEAgLTEzNyw3ICsxMzcsNyBAQAotICAgICA8cHJveHkgYXJlYT0iYXJjaGl2ZSIgc3NsPSJmYWxzZSIgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhL2N1c3RvbWVyL2FyY2hpdmUiLz4KLSAgICAgPHByb3h5IGFyZWE9InRyYXNoIiBzc2w9InRydWUiIHVybD0iaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvdHJhc2giLz4KLSAgICAgPHByb3h5IGFyZWE9InRyYXNoIiBzc2w9ImZhbHNlIiB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIvdHJhc2giLz4KLS0tLT4KLSsKLSAgIDwvcHJveGllcz4KLSAgIAotIDwvcHVibGljYXRpb24+Ci1JbmRleDogc3JjL21vZHVsZXMtY29yZS9saW5raW5nL2NvbmZpZy9jb2Nvb24teGNvbmYvZ2xvYmFscHJveGllcy54Y29uZgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIHNyYy9tb2R1bGVzLWNvcmUvbGlua2luZy9jb25maWcvY29jb29uLXhjb25mL2dsb2JhbHByb3hpZXMueGNvbmYJKHJldmlzaW9uIDU5NDY0NCkKLSsrKyBzcmMvbW9kdWxlcy1jb3JlL2xpbmtpbmcvY29uZmlnL2NvY29vbi14Y29uZi9nbG9iYWxwcm94aWVzLnhjb25mCSh3b3JraW5nIGNvcHkpCi1AQCAtMzEsMTAgKzMxLDEwIEBACi0gICA8Y29tcG9uZW50IGxvZ2dlcj0ibGVueWEucHJveHkiCi0gICAgIHJvbGU9Im9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuR2xvYmFsUHJveGllcyIKLSAgICAgY2xhc3M9Im9yZy5hcGFjaGUubGVueWEuY21zLmxpbmtpbmcuaW1wbC5HbG9iYWxQcm94aWVzSW1wbCI+Ci0tPCEtLQotKwotICAgICA8cHJveHkgc3NsPSJmYWxzZSIgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhIi8+Ci0gICAgIDxwcm94eSBzc2w9InRydWUiIHVybD0iaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEiLz4KLS0tLT4KLSsKLSAgIDwvY29tcG9uZW50PgotICAgCi0gPC94Y29uZj4KZGlmZiAtLWdpdCBhL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9hcGFjaGVfdmhvc3RzLmNvbmYgYi90cnVuay90b29scy9wcm94eXRlc3QvYXBhY2hlX3Zob3N0cy5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2ZkYmMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9hcGFjaGVfdmhvc3RzLmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotIyAgTGVueWEgcHJveHkgdGVzdGluZyBlbnZpcm9ubWVudCBmb3IgQXBhY2hlIEhUVFBEIDIuMi54Ci0KLU5hbWVWaXJ0dWFsSG9zdCAxMjcuMC4wLjE6ODAKLQotTG9hZE1vZHVsZSByZXdyaXRlX21vZHVsZSAvdXNyL2xpYi9hcGFjaGUyL21vZF9yZXdyaXRlLnNvCi1Mb2FkTW9kdWxlIHByb3h5X21vZHVsZSAvdXNyL2xpYi9hcGFjaGUyL21vZF9wcm94eS5zbwotTG9hZE1vZHVsZSBwcm94eV9hanBfbW9kdWxlIC91c3IvbGliL2FwYWNoZTIvbW9kX3Byb3h5X2FqcC5zbwotCi0KLSMKLSMgTk9URTogVGhpcyBhcGFjaGUgY29uZmlnIGZpbGUgc2hvdWxkIGdpdmUgeW91IGEgd29ya2luZyBwcm94eSBzZXR1cC4KLSMgSG93ZXZlciwgaXQgbWF5IG5vdCBiZSB0aGUgbW9zdCBlbGVnYW50L2VmZmVjdGl2ZS9yb2J1c3QuIFBsZWFzZQotIyBjb250cmlidXRlIHlvdXIgb3duIGV4cGVyaWVuY2UsIHNvIHRoYXQgd2UgY2FuIGVzdGFibGlzaCBhIHNldCBvZgotIyBiZXN0IHByYWN0aWNlcyBmb3IgcHJveGllZCBwcm9kdWN0aW9uIHNldHVwcy4KLSMKLQotPFZpcnR1YWxIb3N0IHd3dy5leGFtcGxlLmNvbTo4MD4KLQotICBTZXJ2ZXJBZG1pbiBsZW55YXRlc3RAd3d3LmV4YW1wbGUuY29tCi0gIFNlcnZlckFsaWFzIHd3dy5leGFtcGxlLmNvbSB3d3cKLSAgRG9jdW1lbnRSb290IC9zcnYvd3d3L2h0ZG9jcwotCi0gIEhvc3RuYW1lTG9va3VwcyBPZmYKLSAgVXNlQ2Fub25pY2FsTmFtZSBPZmYKLSAgU2VydmVyU2lnbmF0dXJlIE9uCi0gCi0gIFJld3JpdGVFbmdpbmUgT24KLSAgUHJveHlSZXF1ZXN0cyBPZmYKLQotICAjIGZvcmNlIFNTTCBwcm90ZWN0aW9uIGZvciBhdXRob3Jpbmc6Ci0gICMgYmV0dGVyIHRvIGRpc2FibGUgdGhpcyBkdXJpbmcgdGVzdGluZyBhcyBpdCBjYW4gY3JlYXRlIGNvbmZ1c2lvbiB3cnQgTGVueWEncyBvd24gcmVkaXJlY3RzLgotIyAgUmV3cml0ZVJ1bGUgXi9sZW55YS8oLiopL2F1dGhvcmluZy8oLiopIGh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2xlbnlhLyQxL2F1dGhvcmluZy8kMiBbUl0KLQotCi0gICMgbWFwIG9mZmljaWFsIG5hbWUgImN1c3RvbWVyIiB0byBwdWJsaWNhdGlvbiBpZCAiZGVmYXVsdCIKLSAgPExvY2F0aW9uIC9sZW55YS9jdXN0b21lcj4KLSAgICBQcm94eVBhc3MgYWpwOi8vbG9jYWxob3N0OjgwMDkvd2ViYXBwL2RlZmF1bHQKLSAgICBQcm94eVBhc3NSZXZlcnNlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGVueWEvY3VzdG9tZXIKLSAgICBQcm94eVBhc3NSZXZlcnNlQ29va2llUGF0aCAvd2ViYXBwL2RlZmF1bHQgL2xlbnlhL2N1c3RvbWVyCi0gIDwvTG9jYXRpb24+Ci0KLSAgIyBoYW5kbGUgZ2xvYmFsIExlbnlhIHJlc291cmNlIHJlcXVlc3RzCi0gIDxMb2NhdGlvbiAvbGVueWE+Ci0gICAgUHJveHlQYXNzIGFqcDovL2xvY2FsaG9zdDo4MDA5L3dlYmFwcAotICAgIFByb3h5UGFzc1JldmVyc2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9sZW55YQotICAgIFByb3h5UGFzc1JldmVyc2VDb29raWVQYXRoIC93ZWJhcHAgL2xlbnlhCi0gIDwvTG9jYXRpb24+Ci0KLSAgRXJyb3JMb2cgL3RtcC9MZW55YVRlc3Rfd3d3LmV4YW1wbGUuY29tLWVycm9ycwotICBDdXN0b21Mb2cgL3RtcC9MZW55YVRlc3Rfd3d3LmV4YW1wbGUuY29tLWFjY2VzcyBjb21iaW5lZAotICBSZXdyaXRlTG9nTGV2ZWwgNAotICBSZXdyaXRlTG9nIC90bXAvTGVueWFUZXN0X3d3dy5leGFtcGxlLmNvbS1yZXdyaXRlLmxvZwotCi08L1ZpcnR1YWxIb3N0PgotCi0KLTxJZkRlZmluZSBTU0w+Ci08SWZEZWZpbmUgIU5PU1NMPgotPFZpcnR1YWxIb3N0IHd3dy5leGFtcGxlLmNvbTo0NDM+Ci0KLSAgU1NMRW5naW5lIG9uCi0gIFNTTENpcGhlclN1aXRlIEFMTDohQURIOiFFWFBPUlQ1NjpSQzQrUlNBOitISUdIOitNRURJVU06K0xPVzorU1NMdjI6K0VYUDorZU5VTEwKLSAgU1NMQ2VydGlmaWNhdGVGaWxlIC90bXAvcHJveHktc3NsLWNlcnQucGVtCi0gIFNTTENlcnRpZmljYXRlS2V5RmlsZSAvdG1wL3Byb3h5LXNzbC1rZXkucGVtCi0KLSAgU2VydmVyQWRtaW4gbGVueWF0ZXN0QHd3dy5leGFtcGxlLmNvbQotICBTZXJ2ZXJBbGlhcyB3d3cuZXhhbXBsZS5jb20gd3d3Ci0gIERvY3VtZW50Um9vdCAvc3J2L3d3dy9odGRvY3MKLQotICBIb3N0bmFtZUxvb2t1cHMgT2ZmCi0gIFVzZUNhbm9uaWNhbE5hbWUgT2ZmCi0gIFNlcnZlclNpZ25hdHVyZSBPbgotIAotICBSZXdyaXRlRW5naW5lIE9uCi0gIFByb3h5UmVxdWVzdHMgT2ZmCi0KLQotICAjIG1hcCBvZmZpY2lhbCBuYW1lICJjdXN0b21lciIgdG8gcHVibGljYXRpb24gaWQgImRlZmF1bHQiCi0gIDxMb2NhdGlvbiAvbGVueWEvY3VzdG9tZXI+Ci0gICAgUHJveHlQYXNzIGFqcDovL2xvY2FsaG9zdDo4MDA5L3dlYmFwcC9kZWZhdWx0Ci0gICAgUHJveHlQYXNzUmV2ZXJzZSBodHRwczovL3d3dy5leGFtcGxlLmNvbS9sZW55YS9jdXN0b21lcgotICAgIFByb3h5UGFzc1JldmVyc2VDb29raWVQYXRoIC93ZWJhcHAvZGVmYXVsdCAvbGVueWEvY3VzdG9tZXIKLSAgPC9Mb2NhdGlvbj4KLQotICAjIGhhbmRsZSBnbG9iYWwgTGVueWEgcmVzb3VyY2UgcmVxdWVzdHMKLSAgPExvY2F0aW9uIC9sZW55YT4KLSAgICBQcm94eVBhc3MgYWpwOi8vbG9jYWxob3N0OjgwMDkvd2ViYXBwCi0gICAgUHJveHlQYXNzUmV2ZXJzZSBodHRwczovL3d3dy5leGFtcGxlLmNvbS9sZW55YQotICAgIFByb3h5UGFzc1JldmVyc2VDb29raWVQYXRoIC93ZWJhcHAgL2xlbnlhCi0gIDwvTG9jYXRpb24+Ci0KLSAgRXJyb3JMb2cgL3RtcC9MZW55YVRlc3Rfd3d3LmV4YW1wbGUuY29tLVNTTC1lcnJvcnMKLSAgQ3VzdG9tTG9nIC90bXAvTGVueWFUZXN0X3d3dy5leGFtcGxlLmNvbS1TU0wtYWNjZXNzIGNvbWJpbmVkCi0gIFJld3JpdGVMb2dMZXZlbCA0Ci0gIFJld3JpdGVMb2cgL3RtcC9MZW55YVRlc3Rfd3d3LmV4YW1wbGUuY29tLVNTTC1yZXdyaXRlLmxvZwotCi08L1ZpcnR1YWxIb3N0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLTwvSWZEZWZpbmU+Ci08L0lmRGVmaW5lPgotCi0KLTxWaXJ0dWFsSG9zdCBjdXN0b21lci5leGFtcGxlLmNvbTo4MD4KLQotICBTZXJ2ZXJBZG1pbiB3ZWJtYXN0ZXJAY3VzdG9tZXIuZXhhbXBsZS5jb20KLSAgU2VydmVyQWxpYXMgY3VzdG9tZXIuZXhhbXBsZS5jb20gY3VzdG9tZXIKLSAgRG9jdW1lbnRSb290IC9zcnYvd3d3L2h0ZG9jcwotCi0gIEhvc3RuYW1lTG9va3VwcyBPZmYKLSAgVXNlQ2Fub25pY2FsTmFtZSBPZmYKLSAgU2VydmVyU2lnbmF0dXJlIE9uCi0gCi0gIFJld3JpdGVFbmdpbmUgT24KLSAgUHJveHlSZXF1ZXN0cyBPZmYKLQotICAjIGNhdGNoIGZ1bmt5IGFkZHJlc3NlcyB3aXRoICIvInMgYW5kICIuInMgdG8gbWFrZQotICAjIGNvY29vbiBtYXRjaGluZyBiZWhhdmUgbGlrZSBhcGFjaGUgKHdoZXJlICJmb28vIiBhbmQgImZvbyIgYW5kICIvLi9mb28iIGFsbCBkbyB0aGUgc2FtZSk6Ci0gICMgRklYTUU6IGNvdWxkIHVzZSBzb21lIHJldmlldyBhbmQgYmV0dGVyIGRvY3VtZW50YXRpb24uIERvZXMgdGhpcyBoYXZlIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBhcyB3ZWxsPwotICAjIFJld3JpdGVSdWxlIF4vKFteL1wuXSspJCAkMS8gW1JdCi0KLSAgIyBhbGwgcmVxdWVzdHMgdG8gY3VzdG9tZXIuZXhhbXBsZS5jb20gYXJlIHBhc3NlZCB0byB0aGUgbGl2ZSBhcmVhOgotICA8TG9jYXRpb24gLz4KLSAgICAjIGZpeG1lOiB0aGUgdHJhaWxpbmcgc2xhc2ggc2VlbXMgbmVjZXNzYXJ5IGhlcmUuIGxvb2tzIGxpa2UgYW4gaW5jb25zaXN0ZW5jeSBpbiBvdXIgbWF0Y2hlcnMuLi4KLSAgICBQcm94eVBhc3MgYWpwOi8vbG9jYWxob3N0OjgwMDkvd2ViYXBwL2RlZmF1bHQvbGl2ZS8KLSAgICBQcm94eVBhc3NSZXZlcnNlIGh0dHA6Ly9jdXN0b21lci5leGFtcGxlLmNvbQotICAgIFByb3h5UGFzc1JldmVyc2VDb29raWVQYXRoIC93ZWJhcHAvZGVmYXVsdC9saXZlIC8KLSAgPC9Mb2NhdGlvbj4KLQotICAjIGhhbmRsZSBnbG9iYWwgTGVueWEgcmVzb3VyY2UgcmVxdWVzdHMKLSAgPExvY2F0aW9uIC9sZW55YT4KLSAgICAjIGZpeG1lOiB0aGUgdHJhaWxpbmcgc2xhc2ggc2VlbXMgbmVjZXNzYXJ5IGhlcmUuIGxvb2tzIGxpa2UgYW4gaW5jb25zaXN0ZW5jeSBpbiBvdXIgbWF0Y2hlcnMuLi4KLSAgICBQcm94eVBhc3MgYWpwOi8vbG9jYWxob3N0OjgwMDkvd2ViYXBwLwotICAgIFByb3h5UGFzc1JldmVyc2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9sZW55YQotICAgIFByb3h5UGFzc1JldmVyc2VDb29raWVQYXRoIC93ZWJhcHAgL2xlbnlhCi0gIDwvTG9jYXRpb24+Ci0KLSAgRXJyb3JMb2cgL3RtcC9MZW55YVRlc3RfY3VzdG9tZXIuZXhhbXBsZS5jb20tZXJyb3JzCi0gIEN1c3RvbUxvZyAvdG1wL0xlbnlhVGVzdF9jdXN0b21lci5leGFtcGxlLmNvbS1hY2Nlc3MgY29tYmluZWQKLSAgUmV3cml0ZUxvZ0xldmVsIDQKLSAgUmV3cml0ZUxvZyAvdG1wL0xlbnlhVGVzdF9jdXN0b21lci5leGFtcGxlLmNvbS1yZXdyaXRlLmxvZwotCi08L1ZpcnR1YWxIb3N0PgotCmRpZmYgLS1naXQgYS90cnVuay90b29scy9wcm94eXRlc3QvaG9zdHNfZmFrZSBiL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9ob3N0c19mYWtlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGJhNDliLi4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9ob3N0c19mYWtlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0xMjcuMC4wLjEJd3d3LmV4YW1wbGUuY29tIHd3dwotMTI3LjAuMC4xCWN1c3RvbWVyLmV4YW1wbGUuY29tIGN1c3RvbWVyCmRpZmYgLS1naXQgYS90cnVuay90b29scy9wcm94eXRlc3QvamV0dHk2LnhtbCBiL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9qZXR0eTYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjMzNTA2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9qZXR0eTYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIENvbmZpZ3VyZSBQVUJMSUMgIi0vL01vcnQgQmF5IENvbnN1bHRpbmcvL0RURCBDb25maWd1cmUvL0VOIiAiaHR0cDovL2pldHR5Lm1vcnRiYXkub3JnL2NvbmZpZ3VyZS5kdGQiPgotCi08IS0tCi0gIFRoaXMgZmlsZSBpcyBwcm92aWRlZCBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIExlbnlhIGJldGEgdGVzdGVycyB0byBlYXNlCi0gIHRoZSBzZXR1cCBvZiBhIHByb3hpZWQgZW52aXJvbm1lbnQgaW4gYSBub24tcm9vdCB3ZWJhcHAgY29udGV4dCwgd2hpY2ggCi0gIHdpbGwgaG9wZWZ1bGx5IGhlbHAgY2F0Y2ggYSBsb3Qgb2YgYnVncy4KLSAgVGhlIEpldHR5IHZlcnNpb24gY3VycmVudGx5IHNoaXBwZWQgd2l0aCBMZW55YSBpcyBnZXR0aW5nIG9sZC1pc2ggYW5kIGhhcwotICBhIGtub3duIGJ1ZyBpbiBpdHMgQUpQIGNvbm5lY3Rvciwgd2hpY2ggcHJldmVudHMgdXMgZnJvbSB1c2luZyBpdCB3aXRoCi0gIEFwYWNoZSBIVFRQRCArIG1vZF9wcm94eSArIG1vZF9wcm94eV9hanAgaW4gYSBwcm94aWVkIHNldHVwLiBIZW5jZSwgaXQncwotICBuZWNlc3NhcnkgdG8gdXBncmFkZSB0byBKZXR0eSA2LjEgKHVubGVzcyB5b3Ugd2FudCB0byBpbnN0YWxsIHRvbWNhdCwKLSAgd2hpY2ggaXMgbGlrZWx5IGEgbG90IG1vcmUgZGlmZmljdWx0KS4KLSAgCi0gIFBsZWFzZSBkb3dubG9hZAotICBodHRwOi8vZGlzdC5jb2RlaGF1cy5vcmcvamV0dHkvamV0dHktNi4xLjYvamV0dHktNi4xLjZyYzAuemlwIGFuZCB1bnppcAotICBpdCBpbiAkTEVOWUFfSE9NRS90b29scy4KLSAgCi0gIE5vdyB5b3UgY2FuIHN0YXJ0IExlbnlhIHVzaW5nIEpldHR5IDYuMSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXMgZm9sbG93czoKLSAgCi0gICRMRU5ZQV9IT01FOj4gY2QgdG9vbHMvamV0dHktNi4xLjYgCi0gICRMRU5ZQV9IT01FOj4gamF2YSAtRGphdmEuZW5kb3JzZWQuZGlycz0iLi4vLi4vZXh0ZXJuYWxzL2NvY29vbl8yXzFfeC9saWIvZW5kb3JzZWQvIiBcCi0gICAgICAgICAgICAgICAgICAgICAtamFyIHN0YXJ0LmphciAuLi9wcm94eXRlc3QvamV0dHk2LnhtbAotICAKLSAgVGhlIExlbnlhIHdlYmFwcCBpcyBub3cgYXZhaWxhYmxlIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC93ZWJhcHAvLgotICBUaGVyZSBhcmUgamV0dHkgZXhhbXBsZSB3ZWJhcHBzIGFuZCBzb21lIExlbnlhIGdhcmJhcmdlIGluIHRoZSByb290IGNvbnRleHQgd2hpY2gKLSAgc2hvdWxkIGJlIGZpeGFibGUgYnkgYmVpbmcgbW9yZSBzcGVjaWZpYyB1bmRlciAid2ViYXBwIGRlcGxveWVyIiBiZWxvdywgYnV0IGl0J3MgcXVpdGUgCi0gIGRlc2lyYWJsZSB0byBoYXZlIExlbnlhIGluIGEgbm9uLXJvb3QgY29udGV4dCBmb3IgdGVzdGluZywgdG8gbWFrZSBzdXJlIHdlIGFsd2F5cyB1c2UKLSAgY29ycmVjdCBwYXRocyBhbmQgZG9uJ3Qgd3JvbmdseSBhc3N1bWUgIi8iLgotICAKLS0tPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBDb25maWd1cmUgdGhlIEpldHR5IFNlcnZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gRG9jdW1lbnRhdGlvbiBvZiB0aGlzIGZpbGUgZm9ybWF0IGNhbiBiZSBmb3VuZCBhdDogICAgICAgICAgICAgIC0tPgotPCEtLSBodHRwOi8vZG9jcy5jb2RlaGF1cy5vcmcvZGlzcGxheS9KRVRUWS9qZXR0eS54bWwgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTxDb25maWd1cmUgaWQ9IlNlcnZlciIgY2xhc3M9Im9yZy5tb3J0YmF5LmpldHR5LlNlcnZlciI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gU2VydmVyIFRocmVhZCBQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8U2V0IG5hbWU9IlRocmVhZFBvb2wiPgotICAgICAgPCEtLSBEZWZhdWx0IGJvdW5kZWQgYmxvY2tpbmcgdGhyZWFkcG9vbCAKLSAgICAgIC0tPgotICAgICAgPE5ldyBjbGFzcz0ib3JnLm1vcnRiYXkudGhyZWFkLkJvdW5kZWRUaHJlYWRQb29sIj4KLSAgICAgICAgPFNldCBuYW1lPSJtaW5UaHJlYWRzIj4xMDwvU2V0PgotICAgICAgICA8U2V0IG5hbWU9Im1heFRocmVhZHMiPjI1MDwvU2V0PgotICAgICAgICA8U2V0IG5hbWU9Imxvd1RocmVhZHMiPjI1PC9TZXQ+Ci0gICAgICA8L05ldz4KLQotICAgICAgPCEtLSBPcHRpb25hbCBKYXZhIDUgYm91bmRlZCB0aHJlYWRwb29sIHdpdGggam9iIHF1ZXVlIAotICAgICAgPE5ldyBjbGFzcz0ib3JnLm1vcnRiYXkudGhyZWFkLmNvbmN1cnJlbnQuVGhyZWFkUG9vbCI+Ci0gICAgICAgIDxTZXQgbmFtZT0iY29yZVBvb2xTaXplIj4yNTA8L1NldD4KLSAgICAgICAgPFNldCBuYW1lPSJtYXhpbXVtUG9vbFNpemUiPjI1MDwvU2V0PgotICAgICAgPC9OZXc+Ci0gICAgICAtLT4KLSAgICA8L1NldD4KLQotCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gU2V0IGNvbm5lY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE9uZSBvZiBlYWNoIHR5cGUhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8IS0tIFVzZSB0aGlzIGNvbm5lY3RvciBmb3IgbWFueSBmcmVxdWVudGx5IGlkbGUgY29ubmVjdGlvbnMKLSAgICAgICAgIGFuZCBmb3IgdGhyZWFkbGVzcyBjb250aW51YXRpb25zLgotICAgIC0tPiAgICAKLSAgICA8Q2FsbCBuYW1lPSJhZGRDb25uZWN0b3IiPgotICAgICAgPEFyZz4KLSAgICAgICAgICA8TmV3IGNsYXNzPSJvcmcubW9ydGJheS5qZXR0eS5uaW8uU2VsZWN0Q2hhbm5lbENvbm5lY3RvciI+Ci08IS0tIGNoYW5nZWQgZnJvbSBkZWZhdWx0OiAtLT4gICAgCi0gICAgICAgICAgICA8U2V0IG5hbWU9Imhvc3QiPjxTeXN0ZW1Qcm9wZXJ0eSBuYW1lPSJqZXR0eS5ob3N0IiBkZWZhdWx0PSJsb2NhbGhvc3QiLz48L1NldD4KLTwhLS0gY2hhbmdlZCBmcm9tIGRlZmF1bHQ6IC0tPiAgICAKLSAgICAgICAgICAgIDxTZXQgbmFtZT0icG9ydCI+PFN5c3RlbVByb3BlcnR5IG5hbWU9ImpldHR5LnBvcnQiIGRlZmF1bHQ9Ijg4ODgiLz48L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0ibWF4SWRsZVRpbWUiPjMwMDAwPC9TZXQ+Ci0gICAgICAgICAgICA8U2V0IG5hbWU9IkFjY2VwdG9ycyI+MjwvU2V0PgotICAgICAgICAgICAgPFNldCBuYW1lPSJzdGF0c09uIj5mYWxzZTwvU2V0PgotICAgICAgICAgICAgPFNldCBuYW1lPSJjb25maWRlbnRpYWxQb3J0Ij44NDQzPC9TZXQ+Ci0JICAgIDxTZXQgbmFtZT0ibG93UmVzb3VyY2VzQ29ubmVjdGlvbnMiPjUwMDA8L1NldD4KLQkgICAgPFNldCBuYW1lPSJsb3dSZXNvdXJjZXNNYXhJZGxlVGltZSI+NTAwMDwvU2V0PgotICAgICAgICAgIDwvTmV3PgotICAgICAgPC9Bcmc+Ci0gICAgPC9DYWxsPgotCi0gICAgPCEtLSBVc2UgdGhpcyBjb25uZWN0b3IgaWYgTklPIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgPENhbGwgbmFtZT0iYWRkQ29ubmVjdG9yIj4KLSAgICAgIDxBcmc+Ci0gICAgICAgICAgPE5ldyBjbGFzcz0ib3JnLm1vcnRiYXkuamV0dHkuYmlvLlNvY2tldENvbm5lY3RvciI+Ci0gICAgICAgICAgICA8U2V0IG5hbWU9InBvcnQiPjgwODE8L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0ibWF4SWRsZVRpbWUiPjUwMDAwPC9TZXQ+Ci0gICAgICAgICAgICA8U2V0IG5hbWU9Imxvd1Jlc291cmNlTWF4SWRsZVRpbWUiPjE1MDA8L1NldD4KLSAgICAgICAgICA8L05ldz4KLSAgICAgIDwvQXJnPgotICAgIDwvQ2FsbD4KLSAgICAtLT4KLQotICAgIDwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotICAgIDwhLS0gVG8gYWRkIGEgSFRUUFMgU1NMIGxpc3RlbmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gc2VlIGpldHR5LXNzbC54bWwgdG8gYWRkIGFuIHNzbCBjb25uZWN0b3IuIHVzZSAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gamF2YSAtamFyIHN0YXJ0LmphciBldGMvamV0dHkueG1sIGV0Yy9qZXR0eS1zc2wueG1sICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBTZXQgdXAgZ2xvYmFsIHNlc3Npb24gSUQgbWFuYWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0KLSAgICA8U2V0IG5hbWU9InNlc3Npb25JZE1hbmFnZXIiPgotICAgICAgPE5ldyBjbGFzcz0ib3JnLm1vcnRiYXkuamV0dHkuc2VydmxldC5IYXNoU2Vzc2lvbklkTWFuYWdlciI+Ci0gICAgICAgIDxTZXQgbmFtZT0id29ya2VyTmFtZSI+bm9kZTE8L1NldD4KLSAgICAgIDwvTmV3PgotICAgIDwvU2V0PgotICAgIC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFNldCBoYW5kbGVyIENvbGxlY3Rpb24gU3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPiAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxTZXQgbmFtZT0iaGFuZGxlciI+Ci0gICAgICA8TmV3IGlkPSJIYW5kbGVycyIgY2xhc3M9Im9yZy5tb3J0YmF5LmpldHR5LmhhbmRsZXIuSGFuZGxlckNvbGxlY3Rpb24iPgotICAgICAgICA8U2V0IG5hbWU9ImhhbmRsZXJzIj4KLSAgICAgICAgIDxBcnJheSB0eXBlPSJvcmcubW9ydGJheS5qZXR0eS5IYW5kbGVyIj4KLSAgICAgICAgICAgPEl0ZW0+Ci0gICAgICAgICAgICAgPE5ldyBpZD0iQ29udGV4dHMiIGNsYXNzPSJvcmcubW9ydGJheS5qZXR0eS5oYW5kbGVyLkNvbnRleHRIYW5kbGVyQ29sbGVjdGlvbiIvPgotICAgICAgICAgICA8L0l0ZW0+Ci0gICAgICAgICAgIDxJdGVtPgotICAgICAgICAgICAgIDxOZXcgaWQ9IkRlZmF1bHRIYW5kbGVyIiBjbGFzcz0ib3JnLm1vcnRiYXkuamV0dHkuaGFuZGxlci5EZWZhdWx0SGFuZGxlciIvPgotICAgICAgICAgICA8L0l0ZW0+Ci0gICAgICAgICAgIDxJdGVtPgotICAgICAgICAgICAgIDxOZXcgaWQ9IlJlcXVlc3RMb2ciIGNsYXNzPSJvcmcubW9ydGJheS5qZXR0eS5oYW5kbGVyLlJlcXVlc3RMb2dIYW5kbGVyIi8+Ci0gICAgICAgICAgIDwvSXRlbT4KLSAgICAgICAgIDwvQXJyYXk+Ci0gICAgICAgIDwvU2V0PgotICAgICAgPC9OZXc+Ci0gICAgPC9TZXQ+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbmZpZ3VyZSB0aGUgY29udGV4dCBkZXBsb3llciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gQSBjb250ZXh0IGRlcGxveWVyIHdpbGwgZGVwbG95IGNvbnRleHRzIGRlc2NyaWJlZCBpbiAgICAgICAgLS0+Ci0gICAgPCEtLSBjb25maWd1cmF0aW9uIGZpbGVzIGRpc2NvdmVyZWQgaW4gYSBkaXJlY3RvcnkuICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFRoZSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSBjYW4gYmUgc2Nhbm5lZCBmb3IgaG90ICAgICAgICAgIC0tPgotICAgIDwhLS0gZGVwbG95bWVudHMgYXQgdGhlIGNvbmZpZ3VyZWQgc2NhbkludGVydmFsLiAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFRoaXMgZGVwbG95ZXIgaXMgY29uZmlndXJlZCB0byBkZXBsb3kgY29udGV4dHMgY29uZmlndXJlZCAgIC0tPgotICAgIDwhLS0gaW4gdGhlICRKRVRUWV9IT01FL2NvbnRleHRzIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxDYWxsIG5hbWU9ImFkZExpZmVDeWNsZSI+Ci0gICAgICA8QXJnPgotICAgICAgICA8TmV3IGNsYXNzPSJvcmcubW9ydGJheS5qZXR0eS5kZXBsb3llci5Db250ZXh0RGVwbG95ZXIiPgotICAgICAgICAgIDxTZXQgbmFtZT0iY29udGV4dHMiPjxSZWYgaWQ9IkNvbnRleHRzIi8+PC9TZXQ+Ci0gICAgICAgICAgPFNldCBuYW1lPSJjb25maWd1cmF0aW9uRGlyIj48U3lzdGVtUHJvcGVydHkgbmFtZT0iamV0dHkuaG9tZSIgZGVmYXVsdD0iLiIvPi9jb250ZXh0czwvU2V0PgotICAgICAgICAgIDxTZXQgbmFtZT0ic2NhbkludGVydmFsIj4xPC9TZXQ+Ci0gICAgICAgIDwvTmV3PgotICAgICAgPC9Bcmc+Ci0gICAgPC9DYWxsPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbmZpZ3VyZSB0aGUgd2ViYXBwIGRlcGxveWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gQSB3ZWJhcHAgIGRlcGxveWVyIHdpbGwgZGVwbG95IHN0YW5kYXJkIHdlYmFwcHMgZGlzY292ZXJlZCAgLS0+Ci0gICAgPCEtLSBpbiBhIGRpcmVjdG9yeSBhdCBzdGFydHVwLCB3aXRob3V0IHRoZSBuZWVkIGZvciBhZGRpdGlvbmFsICAtLT4KLSAgICA8IS0tIGNvbmZpZ3VyYXRpb24gZmlsZXMuICAgIEl0IGRvZXMgbm90IHN1cHBvcnQgaG90IGRlcGxveSBvciAgIC0tPgotICAgIDwhLS0gbm9uIHN0YW5kYXJkIGNvbnRleHRzIChzZWUgQ29udGV4dERlcGxveWVyIGFib3ZlKS4gICAgICAgICAgLS0+Ci0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFRoaXMgZGVwbG95ZXIgaXMgY29uZmlndXJlZCB0byBkZXBsb3kgd2ViYXBwcyBmcm9tIHRoZSAgICAgIC0tPgotICAgIDwhLS0gJEpFVFRZX0hPTUUvd2ViYXBwcyBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIE5vcm1hbGx5IG9ubHkgb25lIHR5cGUgb2YgZGVwbG95ZXIgbmVlZCBiZSB1c2VkLiAgICAgICAgICAgIC0tPgotICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8Q2FsbCBuYW1lPSJhZGRMaWZlQ3ljbGUiPgotICAgICAgPEFyZz4KLSAgICAgICAgPE5ldyBjbGFzcz0ib3JnLm1vcnRiYXkuamV0dHkuZGVwbG95ZXIuV2ViQXBwRGVwbG95ZXIiPgotICAgICAgICAgIDxTZXQgbmFtZT0iY29udGV4dHMiPjxSZWYgaWQ9IkNvbnRleHRzIi8+PC9TZXQ+Ci08IS0tIGNoYW5nZWQgZnJvbSBkZWZhdWx0OiAtLT4gICAgCi0gICAgICAgICAgPFNldCBuYW1lPSJ3ZWJBcHBEaXIiPjxTeXN0ZW1Qcm9wZXJ0eSBuYW1lPSJqZXR0eS5ob21lIgotICAgICAgICAgIGRlZmF1bHQ9Ii4iLz4uLi8uLi8uLi9idWlsZC9sZW55YTwvU2V0PgotCSAgPFNldCBuYW1lPSJwYXJlbnRMb2FkZXJQcmlvcml0eSI+ZmFsc2U8L1NldD4KLQkgIDxTZXQgbmFtZT0iZXh0cmFjdCI+dHJ1ZTwvU2V0PgotCSAgPFNldCBuYW1lPSJhbGxvd0R1cGxpY2F0ZXMiPmZhbHNlPC9TZXQ+Ci0gICAgICAgICAgPFNldCBuYW1lPSJkZWZhdWx0c0Rlc2NyaXB0b3IiPjxTeXN0ZW1Qcm9wZXJ0eSBuYW1lPSJqZXR0eS5ob21lIiBkZWZhdWx0PSIuIi8+L2V0Yy93ZWJkZWZhdWx0LnhtbDwvU2V0PgotICAgICAgICA8L05ldz4KLSAgICAgIDwvQXJnPgotICAgIDwvQ2FsbD4KLQotPCEtLSBjaGFuZ2VkIGZyb20gZGVmYXVsdDogYWRkZWQgQUpQIGNvbm5lY3RvciBzZWN0aW9uIGFzIGRvY3VtZW50ZWQgaW4gCi0gICAgIGh0dHA6Ly9kb2NzLmNvZGVoYXVzLm9yZy9kaXNwbGF5L0pFVFRZL0NvbmZpZ3VyaW5nK0FKUDEzK1VzaW5nK21vZF9qawotLS0+ICAgIAotICAgIDxDYWxsIG5hbWU9ImFkZENvbm5lY3RvciI+Ci0gICAgICA8QXJnPgotICAgICAgICA8TmV3IGNsYXNzPSJvcmcubW9ydGJheS5qZXR0eS5hanAuQWpwMTNTb2NrZXRDb25uZWN0b3IiPgotICAgICAgICAgIDxTZXQgbmFtZT0icG9ydCI+ODAwOTwvU2V0PgotICAgICAgICA8L05ldz4KLSAgICAgIDwvQXJnPgotICAgIDwvQ2FsbD4KLSAgICAKLSAgICAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ29uZmlndXJlIEF1dGhlbnRpY2F0aW9uIFJlYWxtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBSZWFsbXMgbWF5IGJlIGNvbmZpZ3VyZWQgZm9yIHRoZSBlbnRpcmUgc2VydmVyIGhlcmUsIG9yICAgICAtLT4KLSAgICA8IS0tIHRoZXkgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGEgc3BlY2lmaWMgd2ViIGFwcCBpbiBhIGNvbnRleHQgIC0tPgotICAgIDwhLS0gY29uZmlndXJhdGlvbiAoc2VlICQoamV0dHkuaG9tZSkvY29udGV4dHMvdGVzdC54bWwgZm9yIGFuICAgLS0+Ci0gICAgPCEtLSBleGFtcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxTZXQgbmFtZT0iVXNlclJlYWxtcyI+Ci0gICAgICA8QXJyYXkgdHlwZT0ib3JnLm1vcnRiYXkuamV0dHkuc2VjdXJpdHkuVXNlclJlYWxtIj4KLSAgICAgICAgPEl0ZW0+Ci0gICAgICAgICAgPE5ldyBjbGFzcz0ib3JnLm1vcnRiYXkuamV0dHkuc2VjdXJpdHkuSGFzaFVzZXJSZWFsbSI+Ci0gICAgICAgICAgICA8U2V0IG5hbWU9Im5hbWUiPlRlc3QgUmVhbG08L1NldD4KLSAgICAgICAgICAgIDxTZXQgbmFtZT0iY29uZmlnIj48U3lzdGVtUHJvcGVydHkgbmFtZT0iamV0dHkuaG9tZSIgZGVmYXVsdD0iLiIvPi9ldGMvcmVhbG0ucHJvcGVydGllczwvU2V0PgotICAgICAgICAgICAgPFNldCBuYW1lPSJyZWZyZXNoSW50ZXJ2YWwiPjA8L1NldD4KLSAgICAgICAgICA8L05ldz4KLSAgICAgICAgPC9JdGVtPgotICAgICAgPC9BcnJheT4KLSAgICA8L1NldD4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb25maWd1cmUgUmVxdWVzdCBMb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFJlcXVlc3QgbG9ncyAgbWF5IGJlIGNvbmZpZ3VyZWQgZm9yIHRoZSBlbnRpcmUgc2VydmVyIGhlcmUsIC0tPgotICAgIDwhLS0gb3IgdGhleSBjYW4gYmUgY29uZmlndXJlZCBmb3IgYSBzcGVjaWZpYyB3ZWIgYXBwIGluIGEgICAgICAgLS0+Ci0gICAgPCEtLSBjb250ZXh0cyBjb25maWd1cmF0aW9uIChzZWUgJChqZXR0eS5ob21lKS9jb250ZXh0cy90ZXN0LnhtbCAtLT4KLSAgICA8IS0tIGZvciBhbiBleGFtcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPFJlZiBpZD0iUmVxdWVzdExvZyI+Ci0gICAgICA8U2V0IG5hbWU9InJlcXVlc3RMb2ciPgotICAgICAgICA8TmV3IGlkPSJSZXF1ZXN0TG9nSW1wbCIgY2xhc3M9Im9yZy5tb3J0YmF5LmpldHR5Lk5DU0FSZXF1ZXN0TG9nIj4KLSAgICAgICAgICA8U2V0IG5hbWU9ImZpbGVuYW1lIj48U3lzdGVtUHJvcGVydHkgbmFtZT0iamV0dHkubG9ncyIgZGVmYXVsdD0iLi9sb2dzIi8+L3l5eXlfbW1fZGQucmVxdWVzdC5sb2c8L1NldD4KLSAgICAgICAgICA8U2V0IG5hbWU9ImZpbGVuYW1lRGF0ZUZvcm1hdCI+eXl5eV9NTV9kZDwvU2V0PgotICAgICAgICAgIDxTZXQgbmFtZT0icmV0YWluRGF5cyI+OTA8L1NldD4KLSAgICAgICAgICA8U2V0IG5hbWU9ImFwcGVuZCI+dHJ1ZTwvU2V0PgotICAgICAgICAgIDxTZXQgbmFtZT0iZXh0ZW5kZWQiPnRydWU8L1NldD4KLSAgICAgICAgICA8U2V0IG5hbWU9ImxvZ0Nvb2tpZXMiPmZhbHNlPC9TZXQ+Ci0gICAgICAgICAgPFNldCBuYW1lPSJMb2dUaW1lWm9uZSI+R01UPC9TZXQ+Ci0gICAgICAgIDwvTmV3PgotICAgICAgPC9TZXQ+Ci0gICAgPC9SZWY+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gZXh0cmEgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8U2V0IG5hbWU9InN0b3BBdFNodXRkb3duIj50cnVlPC9TZXQ+Ci0gICAgPFNldCBuYW1lPSJzZW5kU2VydmVyVmVyc2lvbiI+dHJ1ZTwvU2V0PgotICAgIDxTZXQgbmFtZT0ic2VuZERhdGVIZWFkZXIiPnRydWU8L1NldD4KLSAgICA8U2V0IG5hbWU9ImdyYWNlZnVsU2h1dGRvd24iPjEwMDA8L1NldD4KLQotPC9Db25maWd1cmU+CmRpZmYgLS1naXQgYS90cnVuay90b29scy9wcm94eXRlc3QvcHJveHktc3NsLWNlcnQucGVtIGIvdHJ1bmsvdG9vbHMvcHJveHl0ZXN0L3Byb3h5LXNzbC1jZXJ0LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmYjhkYi4uMDAwMDAwMAotLS0gYS90cnVuay90b29scy9wcm94eXRlc3QvcHJveHktc3NsLWNlcnQucGVtCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlGQlRDQ0ErMmdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmd6RUxNQWtHQTFVRUJoTUNRMGd4Ci1HVEFYQmdOVkJBb1RFR3hsYm5saExtRndZV05vWlM1dmNtY3hOREF5QmdOVkJBTVVLMHhsYm5saElGUmxjM1JwCi1ibWNnUTBFZ0tHUnZiaWQwSUhWelpTQnBiaUJ3Y205a2RXTjBhVzl1SVNreEl6QWhCZ2txaGtpRzl3MEJDUUVXCi1GR1JsZGtCc1pXNTVZUzVoY0dGamFHVXViM0puTUI0WERUQTNNVEF6TURFME16SXhORm9YRFRFM01UQXlOakUwCi1Nekl4TkZvd2dZWXhDekFKQmdOVkJBWVRBa05JTVJrd0Z3WURWUVFLRXhCc1pXNTVZUzVoY0dGamFHVXViM0puCi1NUjh3SFFZRFZRUUxFeFpHWldGeWJHVnpjeUJRY205NGVTQlVaWE4wWlhKek1SWXdGQVlEVlFRREV3MU1aVzU1Ci1ZVk5UVEZCeWIzaDVNU013SVFZSktvWklodmNOQVFrQkZoUmtaWFpBYkdWdWVXRXVZWEJoWTJobExtOXlaekNDCi1BU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxXKzJuNFFWZTNhay9HNm10akJpb2hhCi1VbUdvaWh6MWV6TmE5amJWNjI4akZxUC92VnBhOEdObkJVcWxoall1UmFZa01hUGdIN29wMkNRODVIMUYxWUtMCi1PYW9QUUFqYVVFdC84Z0g2aDFJQmRaWlQvM2Q3QVFUY3MyUDhXdDdUbmRiNTh2NmV5NXZEYUJTb29TUVNXTXZpCi1GV2xmMkNDMGJBdlZOeHMrTDRSRzlTWXBITGFoWDZtSUIyeUZ4c3lKK0YwelUrVzNDYzNSRUdYRXMyOXhoUzJRCi1wa0h2MG10eWowSE5BaHFzYy9XQjYvL2lLb0dnQVhGUnRrMHBML2JvUWNvbEZEQ0FpZUFad0pGbWRrRVVPRVJvCi1RTWtjS0g2SlFFd0lJaWg1Rkx4QlZHd2xuVlhXMnpwZFlGdnB3b01NMzhzUFE5dWw0RW1CN0tDcldPZjBqNmNDCi1Bd0VBQWFPQ0FYMHdnZ0Y1TUFrR0ExVWRFd1FDTUFBd01BWUpZSVpJQVliNFFnRU5CQ01XSVZsaFUxUWdSMlZ1Ci1aWEpoZEdWa0lGTmxjblpsY2lCRFpYSjBhV1pwWTJGMFpUQVJCZ2xnaGtnQmh2aENBUUVFQkFNQ0JrQXdDd1lECi1WUjBQQkFRREFnV2dNQjBHQTFVZERnUVdCQlNoVml1aGlhTVZuWDZWQjUxRkZMUGg3R0lLNFRDQnVBWURWUjBqCi1CSUd3TUlHdGdCUmRISjNNT0l6K3JYRHp1OFB4R2ZlcmhtVTlrYUdCaWFTQmhqQ0JnekVMTUFrR0ExVUVCaE1DCi1RMGd4R1RBWEJnTlZCQW9URUd4bGJubGhMbUZ3WVdOb1pTNXZjbWN4TkRBeUJnTlZCQU1VSzB4bGJubGhJRlJsCi1jM1JwYm1jZ1EwRWdLR1J2YmlkMElIVnpaU0JwYmlCd2NtOWtkV04wYVc5dUlTa3hJekFoQmdrcWhraUc5dzBCCi1DUUVXRkdSbGRrQnNaVzU1WVM1aGNHRmphR1V1YjNKbmdna0FobGF3aHFqZXBZZ3dId1lEVlIwUkJCZ3dGb0VVCi1aR1YyUUd4bGJubGhMbUZ3WVdOb1pTNXZjbWN3SHdZRFZSMFNCQmd3Rm9FVVpHVjJRR3hsYm5saExtRndZV05vCi1aUzV2Y21jd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFNaDV5L1QyNXQxbGlXRThXQzlLTU1GK0lpcWFDN0NYCi1XUUVPaHM4dkRnWHNlWTU1TjdHUndXUDdsaE0vZVppNklPLytPNWYwQzAvU1o3bWFrZVJkaFlBNXJ3Ukhoc084Ci11eU1QU2hZWnU1bUZtTE9hdURPbVJ5clZpS0pVQ251bXdaWDBXVGQySnp6Mk4xL285VVh6RFhHNXM2a0lXNUJoCi0rUENHNHRMUzNKRUpmQm9VejlselZqbFFzb0hCRXJRWmFyU0kySlcvemhRQmlUWFdCY0F5UzNNdXVvWXkzMjB5Ci1Kd2IydW5FYUduR3JLN0JBMkV0ZTlTMTIydFBYaCsxZ2tsb2dHeGpMTERNNEd1RzRCV21lN3I2RTJsZlhraTM0Ci15TmVaQSt4Zm9EOFRpM3B4NUZLOHkzblJaZ2pZdmNkdGl4bCtKR29SLzE4RnRwVWNFUGhkZng4PQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdG9vbHMvcHJveHl0ZXN0L3Byb3h5LXNzbC1rZXkucGVtIGIvdHJ1bmsvdG9vbHMvcHJveHl0ZXN0L3Byb3h5LXNzbC1rZXkucGVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2FiODA0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3Rvb2xzL3Byb3h5dGVzdC9wcm94eS1zc2wta2V5LnBlbQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KLU1JSUVwQUlCQUFLQ0FRRUF0YjdhZmhCVjdkcVQ4YnFhMk1HS2lGcFNZYWlLSFBWN00xcjJOdFhyYnlNV28vKzkKLVdscndZMmNGU3FXR05pNUZwaVF4bytBZnVpbllKRHprZlVYVmdvczVxZzlBQ05wUVMzL3lBZnFIVWdGMWxsUC8KLWQzc0JCTnl6WS94YTN0T2Qxdm55L3A3TG04Tm9GS2loSkJKWXkrSVZhVi9ZSUxSc0M5VTNHejR2aEViMUppa2MKLXRxRmZxWWdIYklYR3pJbjRYVE5UNWJjSnpkRVFaY1N6YjNHRkxaQ21RZS9TYTNLUFFjMENHcXh6OVlIci8rSXEKLWdhQUJjVkcyVFNrdjl1aEJ5aVVVTUlDSjRCbkFrV1oyUVJRNFJHaEF5UndvZm9sQVRBZ2lLSGtVdkVGVWJDV2QKLVZkYmJPbDFnVytuQ2d3emZ5dzlEMjZYZ1NZSHNvS3RZNS9TUHB3SURBUUFCQW9JQkFRQ2NhRE1BYW02STA2S2UKLVZVa05ZUUluZGhPUGw4dkVRRDVXWStHZ0wxajl1K1N3SGxhR2U5eUVyeFFPdVlSVy9GdFVMN0hJcGdpbjNYcjEKLU5MSXVYUHJ4N1g4aXF4MGdnVUM0dU5NOGdLNFVGTTF0SWJ5b3htS0tIS1VGVnhlY3krRDZNUUM5djByYU1jQlEKLWh3Nm1UR08ra2tKNi9OQ3kxSkpuWElhZ0cxUXBNTFJnZWZYeDd4d1NxVE51cW5PNDVKVW9VVmN6UnZCUDIvbWsKLWFLUC9nMzdIUFJ3YzFraVNhRGc3N3hEN2tOZEhlVzBDM0dEZVcxTmd0bE1mVGpCdFJGeE5xMkxEdGVFQU02bmcKLTE2YkFPNklZU2hPWG1NcDAwU2kzbDZZNWdyK1RFMkd2U1hxOTkvQmptWVlSQkxNdUpTSTAxMS9qcFlrN3ByNGYKLWJITE1rT0tCQW9HQkFObnU4UzV5TVcwbzRKbEQ3NEtKR3dnbGd1dkNMd3ArL0JEc3pWaVdJMmpkbjFpQk1XUHYKLVlzejRobENXbStaQ29DTmxEdkFWZFpBamRqY2orcU8rSGxseHBzY0FHL3gwU1h1aWRVMmJaOXdWaWVqd25jNmMKLXBiSXpqelc2djF3RjZTWnBURS95UTVlZEVmWG1mWElOWTQwZ1RJVk51VGUxSDF6ZCt5T1REaDJyQW9HQkFOVjkKLXZubGNjL05kc3FqTm1UdkFUeU5KVHFnc0cvMHJ4WHhpWHFrc1dtUk9najhKcGNtV28yMldjVVBndVlseTVaekIKLXRZSU54WTlRM1JPNWFFaitGakV0cnMvOU9lYVRjZlVaV1BvUEwyK2c1K0FuVHFDenBiREZLN3ZwRXJlclNzdVgKLTVUMWd1eEhRaGJCcnBJR2MvR2MvTzhtTEVVWjFoUllXVGFXMmZZSDFBb0dBRVNZWk9tTm4ra1ArTUhGRkZvdDkKLVlnMjVtSjJtSC9oUUUzRGUwN3EwdkpxNzREWUNVZS9UWVhlbzhneDM1ZzJXRmxMc2N2M3RTMU5QQ1JXK3NrWFMKLWs0MDY1MnZkeCtiS3BYenFLQm96ZVFFRTRoeVUvbDRiTjhPUTRGUjZuRjRtczR3VG9qTFpHTVFXVnJnMVpOVWkKLTRVY0tYbTc0UlNidWVkdEoyTW5Ja1pNQ2dZQnBLRlBmQVh3WG5zcDJ2VGJDS0xxU1hmU0JmNkNWdHE3QzBzMWYKLXRQb2RPRktOYkZvZURyWVhMNmhBei90enlZVnlEalF5aUVnTWpMOG9qUVhpRmsybUVhTnV6WU5zb0tuY0dZMHIKLU5ybWQyWHI5ZlQ4TWh4Q1JIcjJwQkdmMDBrbTRPT3h3ckNuWTM0WktYT3NkOE02ZXFKWHhjeStpTGhiTXgxV2QKLXoyTEkxUUtCZ1FDcWVjMktBZEYzTmlIWW5FWGM4VEluVXZ5ZkJQYnFYWGhDaXI5d3RLbTJHVmJIYS9IYW02SU8KLUJNU1I1ME1xcnAwMUVPaDErYytTZ2JnWm9EV2dqNysyb1pOa0lSNHhGeWRrZGNWcVgyUFVJS3krR1FBMndoSTkKLS9SYk83eHNOb01GdGc2Y3IxYTN2WTBqMWljMHU5UUZLajU4aWRPQU5ZM01CMGljNUJTRkFUQT09Ci0tLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=